Note: #13 is the same auto-seeded Hourly Ops Pulse ticket; not closing it (different thread).
Testing
All 65 tests pass
Manual CLI verified via CliRunner
No secrets, no migrations, existing API untouched
## Summary
- TimeBox model with explicit recoverable BoxState state machine
- Store layer: time_boxes schema, CRUD, active-box recovery
- BoxController: start/pause/resume/interrupt/complete/expire with elapsed math
- CLI `box` group (start/status/pause/resume/interrupt/complete/abandon/recover/list/focus)
- Live ADHD-friendly focus REPL with single-key commands, calm UX, no-shame quit
- Interruptions logged with timestamp + reason for pattern recognition
- Non-interactive helpers + auto-resume on entry
- 65 tests green, strict vertical RED-GREEN TDD
## Linked
Closes #16
Note: #13 is the same auto-seeded Hourly Ops Pulse ticket; not closing it (different thread).
## Testing
- All 65 tests pass
- Manual CLI verified via CliRunner
- No secrets, no migrations, existing API untouched
Independent exact-head hostile review of 7a03de305aec502b4f56c2402767468e2e33421d: CHANGES REQUESTED / do not merge. The 65 tests pass, but production behavior contradicts the feature claims.
Focus mode never reads input when production tick_interval=1.0; printf q | timeout 3s ... box focus timed out while counting down. Tests only use interval 0.
Controller never enforces TimeBox.can(): illegal transitions are allowed and one declared legal transition is rejected.
Stale concurrent writers can reverse a terminal completed state because updates lack compare-and-set/version enforcement.
Multiple simultaneous running boxes are allowed; recovery chooses one arbitrarily.
Crash downtime is counted as focused work. A box started in 2000 recovered with ~840M focused seconds, zero remaining, yet stayed running; future timestamps freeze accounting.
NaN/fractional/negative durations, bogus states, nonexistent TODO IDs, and empty interruption reasons can corrupt data; SQLite foreign keys are not enabled.
box complete --reason prints the note but does not persist it.
Paused rendering crashes by passing the remaining_seconds method rather than calling it.
Read-only status/recover/list create a DB and seed two TODOs.
Require real-interval input tests, one transactionally unique active box, enforced transition CAS/versioning, monotonic/bounded accounting and explicit crash semantics, strict validation/FKs, truthful note persistence, non-mutating observational commands, paused rendering, and installable package metadata. Issues #13/#16 are duplicates; reconcile without silently closing. No merge until corrected and independently reproduced.
Independent exact-head hostile review of `7a03de305aec502b4f56c2402767468e2e33421d`: **CHANGES REQUESTED / do not merge**. The 65 tests pass, but production behavior contradicts the feature claims.
- Focus mode never reads input when production `tick_interval=1.0`; `printf q | timeout 3s ... box focus` timed out while counting down. Tests only use interval 0.
- Controller never enforces `TimeBox.can()`: illegal transitions are allowed and one declared legal transition is rejected.
- Stale concurrent writers can reverse a terminal completed state because updates lack compare-and-set/version enforcement.
- Multiple simultaneous running boxes are allowed; recovery chooses one arbitrarily.
- Crash downtime is counted as focused work. A box started in 2000 recovered with ~840M focused seconds, zero remaining, yet stayed running; future timestamps freeze accounting.
- NaN/fractional/negative durations, bogus states, nonexistent TODO IDs, and empty interruption reasons can corrupt data; SQLite foreign keys are not enabled.
- `box complete --reason` prints the note but does not persist it.
- Paused rendering crashes by passing the `remaining_seconds` method rather than calling it.
- Read-only status/recover/list create a DB and seed two TODOs.
- Clean wheel omits Click dependency and cannot run. Ruff reports 40 errors; mypy reports 4.
Require real-interval input tests, one transactionally unique active box, enforced transition CAS/versioning, monotonic/bounded accounting and explicit crash semantics, strict validation/FKs, truthful note persistence, non-mutating observational commands, paused rendering, and installable package metadata. Issues #13/#16 are duplicates; reconcile without silently closing. No merge until corrected and independently reproduced.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
boxgroup (start/status/pause/resume/interrupt/complete/abandon/recover/list/focus)Linked
Closes #16
Note: #13 is the same auto-seeded Hourly Ops Pulse ticket; not closing it (different thread).
Testing
Independent exact-head hostile review of
7a03de305aec502b4f56c2402767468e2e33421d: CHANGES REQUESTED / do not merge. The 65 tests pass, but production behavior contradicts the feature claims.tick_interval=1.0;printf q | timeout 3s ... box focustimed out while counting down. Tests only use interval 0.TimeBox.can(): illegal transitions are allowed and one declared legal transition is rejected.box complete --reasonprints the note but does not persist it.remaining_secondsmethod rather than calling it.Require real-interval input tests, one transactionally unique active box, enforced transition CAS/versioning, monotonic/bounded accounting and explicit crash semantics, strict validation/FKs, truthful note persistence, non-mutating observational commands, paused rendering, and installable package metadata. Issues #13/#16 are duplicates; reconcile without silently closing. No merge until corrected and independently reproduced.
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.