Trei găuri observate în sesiunea 2026-04-21:
A. _handle_tick nu avea branch pentru reason=opposite_rearm (PRIMED_* ↔
ARMED_opus) sau reason=rearm (PRIMED_* → ARMED_* aceeași direcție). La
17:45 yellow a trecut FSM-ul PRIMED_BUY→ARMED_SELL corect, dar zero alert
pe Telegram. Adaugă helper _emit_arm_alert (DRY cu branch-ul arm existent)
și două branch-uri noi cu kind=opposite_rearm / kind=rearm.
B. Canary drift se curăța doar cu /resume force — user ușor confundă
/set_interval cu „relansare" și rămâne în drift-pause (cazul 18:09 azi).
/resume acum curăță user_paused + canary.resume() într-o singură comandă.
/resume force rămâne alias acceptat (muscle memory legacy).
C. Heartbeat-ul afișa „activ ARMED_SELL" deși detecția era oprită de 3 ore
(state FSM înghețat). Extract _build_heartbeat_alert care arată
„⚠️ pauzat (drift)" + „[drift-pause]" când canary.is_paused.
Guard-uri pentru comenzi când canary e paused:
- /set_interval: refuzat cu warn „Trimite /resume"
- /ss: screenshot trimis + body-ul include „⚠️ DETECȚIE OPRITĂ"
11 teste noi (1 critical regression pentru bug-ul A observat azi), plus
actualizarea test-ului /resume existent care aserta vechiul comportament.
Total: 235 passed + 8 scenarii regresie.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
README gets: operating-hours config + CLI override flags, Telegram command table
with /pause /resume [force] semantics, validate-calibration usage + exit codes,
new audit event reference, phase-skip backstop note, and test count bump.
CLAUDE.md quick reference now lists the new subcommand, CLI flags, and
Telegram commands so future sessions pick them up without re-reading main.py.
TODOS.md marks the 2026-04-17 hang fix, canary drift notification,
phase-skip backstop, operating-hours window, and validate-calibration as
done with commit pointers; adds exchange-calendar holidays as known gap.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>