3abot — Work Plan
Updated 2026-10-01 22:05 (Tehran) · refreshed daily at 21:00 from the GitHub project, prod logs and prod transactions · DB times below are UTC · prod logs not pulled (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: since 21:00 you approved every refined bug, so all four P0s (#14, #86, #78, #67) and the alert batch (#49, #51) can be built.
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 ✓
- P0: #14, #86, #78, #67
- P1: #13, #12, #49, #51, #15
- Then the P2s
Doing now
Nothing is In Progress on the board. Open PRs: #85 and #87 (report tooling, both 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 #87 Refine review page: bugs/tasks to approve + Ready sectionWaiting for your review
Fixes: The review page splits into Bugs to approve, Tasks to approve and Ready, so you can see what’s already approved.
Side effects: Report tooling only. Approve buttons only work on
127.0.0.1; the report.3abot.ir copy is read-only.Check:
python3 .claude/skills/refine/review.pyshows a Ready section. - Closed without code: #36 Bitpin .ir-onlyClosed
Why: Your call: Bitpin always uses the
.irhosts already in the code, no fallback. Nothing to build. - You approved the refined queueReady
Now ready: P0 #86, #78, #67 · P1 #49, #51, #15 · P2 #16, #21, #46 · tasks #63 (CI/CD, now split into #88–#92), #33, #39, #47. #31 Wallex rate limit is on hold.
- 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
Everything below is ready, in plan order: the four P0s, then P1s, then P2s.
- 1#14 Tabdil “order not found” leaves orders liveP0🐞 bug✅ Ready10 of these 404s in 24 h; coins can end up unsold.½ day
implement #14 - 2#86 Bitpin “market suspended”: pause 5 min and notifyP0🐞 bug✅ ReadyWorse: 728 failed Bitpin buys in 24 h (was 630).½ day
implement #86 - 3#78 Stale orderbooks reach the engineP0🐞 bug✅ ReadyTabdil’s known root cause; may also explain Bitpin’s DGAI/ZEC losses.1 day
implement #78 - 4#67 stop+start drops resell-serviceP0🐞 bug✅ ReadyA routine restart can leave an exchange with no resell.≤ 2h
implement #67 - 5#13 Tabdil step sizesP1🐞 bug✅ Ready39 Tabdil precision (1208) rejections in 24 h, its biggest error.≤ 2h
implement #13 - 6#12 Dollar rate at sell never savedP1🐞 bug✅ ReadyStill 0 of 1,385 closed trades in 24 h have it; profit can’t be audited.≤ 2h
implement #12 - 7#49 Order errors/timeouts: tell the operatorP1🐞 bug✅ ReadyAlert batch (plan step 4), all exchanges.1 day
implement #49 - 8#51 Bitpin cancel 406 reason hiddenP1🐞 bug✅ ReadyAlert batch; logged under the wrong endpoint today.≤ 2h
implement #51 - 9#15 Sells rejected for balanceP1🐞 bug✅ ReadyBetter after #5: 5 Bitpin + 1 Tabdil in 24 h.1 day
implement #15 - 10P2s: #50 (≤ 2h) · #46 (≤ 2h) · #22 (½ day) · #16 (½ day) · #23 (1 day) · #21 (1 day) · tasks #63 CI/CD (#88–#92), #33, #39, #47P2✅ ReadyAfter the P0/P1s. #63 is P1 but a task: build when you say so.
implement #50
Decisions for you
bitpin status nowNew: no Bitpin request or trade in the DB since 17:33 UTC, while Wallex and Tabdil traded minutes ago. Couldn’t check pm2 from this run (ssh needs approval). If it crashed, it’s a P0; if it was a stop+start, that’s #67.
Same 17 losing Bitpin trades (−171k) in 24 h, mostly DGAI and ZEC USDT→IRT, dollar rate steady. Looks like a stale or thin book, not the #76 dollar case.
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. 15 bugs and 4 tasks are ready; only the P3s and a few tasks still need refining.
🐞 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✅ ReadyPause both directions 5 min and notify.½ day
- 3#78 Stale orderbooks reach the engineP0✅ ReadyTabdil root cause; age guard + REST re-check.1 day
- 4#67 stop+start drops resellP0✅ ReadyOps CLI fix.≤ 2h
- 5✅ Ready: #13 Tabdil steps (≤ 2h) · #12 sell rate (≤ 2h) · #51 Bitpin 406 reason (≤ 2h)Built after the P0s.
- 6✅ Ready: #49 alerts (1 day) · #15 balance (1 day)Alert batch and sell-balance fix.
- 7✅ Ready: #50 resell min-trade notify (≤ 2h) · #46 record volume-too-small (≤ 2h) · #22 resell re-subscribe (½ day) · #16 Tabdil cancel FILLED/expired (½ day)After the P0/P1s.
- 8✅ Ready: #23 WS churn (1 day) · #21 crash-guard fallback (1 day)After the P0/P1s.
+ P3 bugs
- P3: #19 Nobitex storm · #26–#30 log noise and size
🛠 Tasks track
New features and planned improvements.
- 1✅ Ready: #63 CI/CD (2–3 days) = #92 build script (≤ 2h) · #88 workflow (½ day) · #89 deploy.sh (1 day) · #90 deployed notice (≤ 2h) · #91 docs (≤ 2h)One branch, one PR for all five parts.
implement #63 - 2🔍 Refined: #69 balances to Telegram (1 day)Waiting for you.
approve #69 - 3⏸ #31 Wallex rate limit (on hold) · #70 LBank (not refined)#70 waits until you ask for it by number.
/refine #70
- 4✅ Ready: #33 Wallex WS rules (≤ 2h) · #39 test-tier docs (≤ 2h) · #47 notifications table (½ day)Small; after the bugs.
- 5#52 monitoring dashboard · #73 Wallex credit accountNot refined.
+ P3 tasks
- #40 Nobitex timeout · #32 · #35 · #38 Abantether · #41 · #42–#44 resell tuning