3abot — Work Plan
Updated 2026-10-01 21:00 (Tehran) · refreshed daily at 21:00 from the GitHub project, prod logs and prod transactions · DB times below are UTC · prod logs not pulled again (ssh needs approval in the headless run), so this is DB + GitHub only
🐞 Bugs
🛠 Tasks
Plan: C · quick fixes, then Ramzinex
Chosen 2026-09-28. Steps 1–3 are merged, and #5, #2, #6 from step 4 are now live on Wallex, Bitpin and Tabdil. Step 4 continues with the ready P0 #14 and the alert batch.
Step 1 · refine ✓
- #45, #24, #37 refined and built
Step 2 · quick fixes ✓
- #3, #4, #1, #45 merged
Step 3 · Ramzinex ✓
- #37 → PR #72 (all 6 parts)
Rest of the P0s + alerts
- #5, #2, #6 merged and live ✓
- Ready: #14 (P0), #12, #13, then #22, #23, #50
- Still waiting for you: #78, #67, #86 (P0), alert batch #49
Doing now
Nothing is In Progress on the board. Only open PR is #85 (report tooling, waiting for your review).
Done
Finished since the last report, newest first. Each card says what it should fix, what else changes, and how to check it after deploy.
- PR #85 Read-only issues page at report.3abot.ir/issues.htmlWaiting for your review
Fixes: You can read every not-yet-ready issue (full refined plan and estimate) on your phone, next to this report.
Side effects: Report tooling only, no bot code. The page is already uploaded; it lives at
/issues.html, not/issues/(that needs an nginx change).Check: open https://report.3abot.ir/issues.html.
- Yesterday’s merges are live: Wallex (since ~23:54 on 09-30, Tehran), Bitpin (since ~09:43 today), TabdilDeployed
First results (24 h): Wallex losing trades 18 → 0 (#76). Wallex 1006 balance rejections 43/week → 0 today (#5). Tabdil back up: 91 closed, 0 losing, +8.1M. Missed buys now show as
NoFill(148) instead of errors (#7).Watch: Bitpin still has 17 losing trades (−171k), mostly DGAI/ZEC that expected +2–5k and lost 15–25k with a steady dollar rate, so it’s not the #76 case (see Decisions).
Still to check: #12 sell rate is still saved on 0 of 1,140 closed trades (fix is ready, not built yet).
Merged 2026-09-30
- PR #84 Log how old each orderbook is when a trade startsMerged
Fixes: Diagnostics only. It’s what proved #78: 13 of 16 Tabdil signals were priced on a book over 5 s old (worst 21 min).
Side effects: One more log line per trade.
Check after deploy: book-age fields in trade-execution-out logs.
- Closed without code: #25 · #79 · #17 · #48Closed
Why: #25 Tabdil timeouts fixed by client-id recovery (the rest moved to #49). #79 manual-sell rate is fine (your call). #17 is a dup of #15/#5. #48 is a dup of #16.
- PR #72 Ramzinex exchange (#37, #56–#61)Merged
Fixes: Adds Ramzinex as a 5th exchange: REST, WebSocket, plugin, Redis DB 4, Go adapter, pm2/aliases, docs. The review round fixed 4 money-path bugs (DRY_RUN placed real orders; partial fills; cancel; not-found).
Side effects: Adds 20 marketdata + 30 arbitrage processes on a loaded server unless you lower the counts. Rate limits are guesses.
Check after deploy: Checklist on #37: live order status 4, amount/price steps, WS side of
buys, one DRY_RUN day, then a small balance. - PR #76 Re-check profit at the current dollar rate (#6)Merged
Fixes: Stops trades whose profit disappears with one USDT/IRT tick (this afternoon’s Wallex/Tabdil burst). Target: Wallex losing
closed_cleantrades under −5,000 → about 0 (was 21 in 10 days).Side effects: Fewer trades: marginal signals are skipped on purpose. Missing fee keys now skip the trade.
Check after deploy:
[Buy Blocked] … revalidation:lines in trade-execution logs; losing clean trades per day. - PR #74 Wallet poll can’t overwrite a fresh trade (#5)Merged
Fixes: Buys sized from a stale IRT/USDT balance (Wallex 1006, Tabdil 1218). Target: Wallex 1006 buys under 5/week (was 43).
Side effects: New Bun-only Redis key
balance:delta_at; a poll that raced a trade is skipped (next poll 4–12 s later corrects it).Check after deploy: Count of
[Balance mismatch]log lines per day. - PR #75 Resell: price-band 422 blocks that market 60 s (#2)Merged
Fixes: Resell no longer burns all 10 attempts in 3 s on Wallex price-band rejections (ONE). Give-ups are saved as
order-error-giveup/manual_required, not as profit-window sells.Side effects: A rejected market is skipped for 60 s, so a sell may use the other market or wait. New optional field on stored resell entries.
Check after deploy:
select count(*) from resell_entries where close_reason='order-error-giveup'matches the “giving up after” log count. - PR #80 Wallex order recovery via client_id (#34)Merged
Fixes: A Wallex order that times out or gets a 5xx but was actually placed is found again and tracked, instead of leaving coins with no sell.
Side effects: Every Wallex order now carries a
client_id. No change when Wallex answers normally.Check after deploy:
exchange_requestsrows withrecovered: trueafter a timeout. - PR #81 Unfilled buys recorded as NoFill (#7)Merged
Fixes: Missed buys (like today’s 77 on Tabdil) show as
exit_reason='NoFill', separate from real failures; no misleading “executedSum missing” warnings.Side effects: Log line changes from
[Buy Blocked]to[No Fill]for these. Dashboards grouping byexit_reasonsee a new value.Check after deploy:
select exit_reason, count(*) from transactions where status='error' group by 1. - PR #77 DB times = event time, not flush time (#11)Merged
Fixes: Transactions/orders/events get their real timestamps (was one shared time per 750 ms batch).
Side effects: None expected; persistence only.
Check after deploy: Duplicate
(symbol, created_at)groups intransactions→ about 0. - PR #71 RabbitMQ consumers come back after a reconnect (#24)Merged
Fixes: Marketdata stops silently losing orderbook publishes after a RabbitMQ drop.
Side effects: Shutdown is no longer treated as a connection drop.
Check after deploy: After a RabbitMQ restart, orderbooks keep flowing (no gap in trades).
- PR #68 Bitpin listener leak (#45)Merged
Fixes: Stops memory/CPU growth from a new listener on every re-subscribe.
Side effects: None expected.
Check after deploy: No
MaxListenersExceededWarningin Bitpin marketdata logs.
Merged 2026-09-29 (deployed 12:03)
- PR #64 Wallex price-band 422: stop retrying, auto-block (#1)Merged
Fixes: The biggest Wallex error source: same rejected order retried in a loop.
Side effects: Coins with 5 price rejections in 10 min are auto-blocked for 30 min (operator is notified).
Check after deploy: Wallex
[422 Unprocessable]lines per hour. - PR #65 Auto-block for 30 minutes on every exchangeMerged
Fixes: Same block length everywhere.
Side effects: Blocked coins stay out longer on Wallex/Bitpin/Nobitex.
Check after deploy: —
- PR #53 Never send a sell that rounds to 0 (#3)Merged
Fixes: Wallex 422 “quantity required” on dust sells.
Side effects: Dust is handed to resell instead of sent.
Check after deploy: No
quantity422 on Wallex. - PR #54 Resell respects the USDT minimum (#4)Merged
Fixes: Sub-1-USDT resell sells rejected up to 10× per coin.
Side effects: Small remainders sell on the IRT market or close as dust.
Check after deploy: No min-USDT rejections from resell.
Up next
Ready items first, in plan order, then the refined ones waiting for your ready.
- 1#14 Tabdil “order not found” leaves orders liveP0🐞 bug✅ Ready9 of these 404s in 24 h now that Tabdil trades again; coins can end up unsold.½ day
implement #14 - 2#13 Tabdil step sizesP1🐞 bug✅ ReadyWorse: 39 Tabdil precision (1208) rejections in 24 h, now its biggest error.≤ 2h
implement #13 - 3#12 Dollar rate at sell never savedP1🐞 bug✅ ReadyStill 0 of 1,140 closed trades in 24 h have it; profit can’t be audited.≤ 2h
implement #12 - 4#86 Bitpin “market suspended”: pause 5 min and notifyP0🐞 bug🔍 Refinednew630 failed Bitpin buys in 24 h (60% of its signals) on paused markets.½ day
approve #86 - 5#78 Stale orderbooks reach the engineP0🐞 bug🔍 RefinedTabdil’s known root cause; may also explain Bitpin’s DGAI/ZEC losses.1 day
approve #78 - 6#67 stop+start drops resell-serviceP0🐞 bug🔍 RefinedA routine restart can leave an exchange with no resell. Re-estimated to ≤ 2h.≤ 2h
approve #67 - 7#49 Order errors/timeouts: tell the operatorP1🐞 bug🔍 RefinedAlert batch (plan step 4); now all exchanges, re-estimated to 1 day.1 day
approve #49 - 8#15 Sells rejected for balanceP1🐞 bug🔍 RefinedBetter: only 5 Bitpin + 1 Tabdil balance rejections in 24 h after #5.1 day
approve #15 - 9#22 resell re-subscribe (½ day) · #23 WS churn (1 day) · #50 resell min-trade notify (≤ 2h)P2🐞 bug✅ ReadyReady P2s, built after the P0/P1s above.
implement #22 - 10Next to refine: #51 Bitpin 406 reason · then tasks #69 · #70The loop refines bugs automatically; tasks wait until you ask by number.
/refine #51
Decisions for you
Refined since yesterday’s question. 630 Bitpin buys failed in 24 h on paused markets; Bitpin profit fell from 17.3M to 5.4M IRT over the same day.
New: 17 losing Bitpin trades (−171k) today, mostly DGAI and ZEC USDT→IRT, not handed to resell, dollar rate steady. Looks like a stale or thin book, not the #76 dollar case.
Tabdil trades again with 0 losses, but #78 is still the guard against its silent stream. #67 is now ≤ 2h.
PR #72 is merged but not running. It would add 20 marketdata + 30 arbitrage processes. Go-live checklist is on #37.
Changed: Tabdil is back and this is its top error (39 in 24 h). It’s already ready and ≤ 2h.
How to move a task
1Decide
Answer above in plain words, e.g. “restart Tabdil after #76”.
2Refine 🔍
The loop writes a plan and an estimate and marks it refined. You approve it (→ ready) on the review page.
python3 .claude/skills/refine/review.py3Build ✅
Ready issues get a PR on the next run. You review, merge and deploy.
implement #14Everything, by track
Estimates only exist once an issue is refined. 6 bugs are ready; the rest of the refined ones wait for you.
🐞 Bugs track
Keeps trading safe and correct.
- 1#14 Tabdil not-found orders left liveP0✅ ReadyStatus poll races order creation.½ day
- 2#86 Bitpin market suspendedP0🔍 RefinednewPause both directions 5 min and notify.½ day
- 3#78 Stale orderbooks reach the engineP0🔍 RefinedTabdil root cause; age guard + REST re-check.1 day
- 4#67 stop+start drops resellP0🔍 RefinedOps CLI fix.≤ 2h
- 5✅ Ready: #13 Tabdil steps (≤ 2h) · #12 sell rate (≤ 2h)Built next after #14.
- 6🔍 Refined: #49 alerts (1 day) · #15 balance (1 day)Waiting for you.
- 7✅ Ready: #22 resell re-subscribe (½ day) · #23 WS churn (1 day) · #50 resell min-trade notify (≤ 2h)After the P0/P1s.
- 8🔍 Refined: #46 record volume-too-small (≤ 2h) · #16 Tabdil cancel FILLED/expired (½ day) · #21 crash-guard fallback (1 day)Waiting for you.
- 9#51 Bitpin 406 reasonNext in the refine queue.
/refine #51
+ P3 bugs
- P3: #19 Nobitex storm · #26–#30 log noise and size
🛠 Tasks track
New features and planned improvements.
- 1🔍 Refined: #31 Wallex rate limit (≤ 2h) · #63 CI/CD (2–3 days)Waiting for you.
approve #31 - 2#69 balances to Telegram · #70 LBankTasks stay in refine until you ask for them by number.
/refine #69
- 3#33 Wallex WS rules · #36 Bitpin .ir-only · #39 Postgres name · #47 notifications table · #52 monitoring dashboard · #73 Wallex credit accountNot refined.
+ P3 tasks
- #40 Nobitex timeout · #32 · #35 · #38 Abantether · #41 · #42–#44 resell tuning