diff --git a/TODOS.md b/TODOS.md new file mode 100644 index 0000000..ad6ce7e --- /dev/null +++ b/TODOS.md @@ -0,0 +1,45 @@ +# TODOS + +Post-Faza 1 backlog. Priority tags: **P1** (next sprint), **P2** (after baseline proven), **P3** (nice-to-have). + +--- + +## P2-ack-loop — Discord reaction feedback + +**Deferred from Faza 1.** Operator reacts to alert with emoji (👍 = good call, 👎 = false positive, ⏭️ = phase-skip). Bot reads reactions via Discord Bot API (not webhook), appends to `labels_live.json`. Feeds precision tuning without manual labeling. + +- Requires upgrading Discord integration from webhook to bot (token + gateway). +- Ack loop runs as separate async task; not in hot detection path. +- Start after 5+ sessions of stable Faza 1 baseline. + +## P2-screenshot-dump + +Standalone helper `atm dump --duration 4h --dir samples/` that just captures frames every N seconds to a directory without running detection. Used during early sessions to accumulate labeled corpus. + +- Small module `src/atm/dumper.py` invoked via main.py. +- Separate from `run` so operator can capture raw data even before calibration is dialed in. + +## P2-windows-scheduler-docs + +Expand README with concrete Windows Task Scheduler XML export + import steps, example triggers for 16:30→18:30 and 21:00→23:00, and DST-change checklist reminder. + +## P3-faza2-exec + +Auto-execution on TradeLocker. Blocked on TOS audit (see `docs/phase2-prop-firm-audit.md`). Not started until GO decision + 20+ Faza 1 sessions. + +## P3-multi-symbol + +Monitor DIA and GLD concurrently (two separate charts). Current scope: one at a time, operator switches. Multi-symbol needs per-symbol config, separate state machines, and separate notification threads. + +## P3-web-dashboard + +Read-only web view of today's audit JSONL + recent triggers. Useful for review after a session but not essential. Would share `audit.py` log format. + +--- + +## Quality debt + +- [ ] **Integration test for run_live loop**: currently mocked at module level. Add a short-duration in-memory loop test that threads real detector/state_machine/audit together (no network). +- [ ] **Coverage report**: run `pytest --cov=atm --cov-report=term-missing`, aim for ≥ 85% per module. +- [ ] **Typing strictness**: run `pyright src/` with strict mode, fix reported issues. +- [ ] **Perf baseline**: profile one detection cycle on a representative frame; ensure < 100ms so 5s loop has ample headroom. diff --git a/configs/example.toml b/configs/example.toml new file mode 100644 index 0000000..bce326a --- /dev/null +++ b/configs/example.toml @@ -0,0 +1,82 @@ +# ATM example config — populated by `atm calibrate`. +# Copy to configs/YYYY-MM-DD-HHMM.toml and set configs/current.txt to filename. + +window_title = "TradeStation 10" + +[dot_roi] +x = 800 +y = 920 +w = 320 +h = 40 + +[chart_roi] +x = 80 +y = 100 +w = 1300 +h = 800 + +[colors.turquoise] +rgb = [64, 224, 208] +tolerance = 30.0 + +[colors.yellow] +rgb = [255, 215, 0] +tolerance = 30.0 + +[colors.dark_green] +rgb = [0, 100, 0] +tolerance = 30.0 + +[colors.dark_red] +rgb = [139, 0, 0] +tolerance = 30.0 + +[colors.light_green] +rgb = [0, 230, 118] +tolerance = 30.0 + +[colors.light_red] +rgb = [255, 82, 82] +tolerance = 30.0 + +[colors.gray] +rgb = [128, 128, 128] +tolerance = 25.0 + +[colors.background] +rgb = [18, 18, 18] +tolerance = 15.0 + +[y_axis] +# Two reference (pixel_y, price) pairs from a stable bar close. +p1_y = 150 +p1_price = 485.50 +p2_y = 750 +p2_price = 483.50 + +[canary] +baseline_phash = "0000000000000000000000000000000000000000000000000000000000000000" +drift_threshold = 8 + +[canary.roi] +x = 1450 +y = 100 +w = 100 +h = 50 + +[discord] +webhook_url = "https://discord.com/api/webhooks/REPLACE_ME" + +[telegram] +bot_token = "REPLACE_ME" +chat_id = "REPLACE_ME" + +[options] +debounce_depth = 1 +loop_interval_s = 5.0 +heartbeat_min = 30 +lockout_s = 240 +low_conf_threshold = 0.2 +low_conf_run = 3 +phaseb_timeout_s = 600 +dead_letter_path = "logs/dead_letter.jsonl"