| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-03-24 | 4.4 kB | |
| v0.9.14 source code.tar.gz | 2026-03-24 | 5.2 MB | |
| v0.9.14 source code.zip | 2026-03-24 | 6.1 MB | |
| Totals: 3 Items | 11.3 MB | 2 | |
This release overhauls the plan/execute lifecycle — consolidating phase derivation into a single canonical function, fixing a force-rescan bug that re-queued completed subjective reviews, and simplifying the internal state machine from fine-grained phase names down to just plan and execute. Also fixes stale dashboard counts, graph normalization sampling, and Windows UTF-8 encoding issues.
64 files changed | 11 commits | 5,660 tests passing
Headline Feature
Lifecycle Consolidation
The plan/execute lifecycle — the state machine that decides whether you're planning work or executing it — has been significantly refactored for clarity and correctness:
- Shared phase derivation — both the reconciliation pipeline and the work queue snapshot now delegate to a single
derive_display_phase()pure function with a documented priority chain. Previously, two independent implementations had to be kept manually in sync. - Pure reader —
current_lifecycle_phase()no longer mutates plan data on read. Legacy phase name migration now runs once at plan-load time. - Marker invariants documented — the three scan-count markers that drive lifecycle transitions (
lifecycle_phase,postflight_scan_completed_at_scan_count,subjective_review_completed_at_scan_count) are now documented with valid values, transitions, and single-writer functions. - No more bypass paths — snapshot phase resolution now routes all derivation through the shared function with no short-circuit returns.
This was driven by a recurring class of bugs where lifecycle markers got out of sync — most recently, force-rescan re-queuing completed subjective reviews.
Other Features
Score Checkpoint with Sparkline
plan_checkpoint progression events now include a sparkline showing score trajectory across checkpoints. This makes it easier to see at a glance whether the score is trending up or plateauing.
Simplified User-Facing Lifecycle
Users now see just "plan mode" and "execute mode" instead of internal phase names like workflow_postflight or triage_postflight. The communicate-score workflow step auto-resolves when no prior baseline exists, eliminating a confusing manual step on first use.
Bug Fixes
- Force-rescan no longer resets subjective reviews — When
--force-rescanran during plan mode, the scan count increment causedsubjective_review_completed_at_scan_countto go stale, re-queuing all 20 subjective reviews. The newcarry_forward_subjective_review()promotes the marker when the old review matches the cycle being replaced. - Stale focus counts —
status,next, andscancommands now show current focus counts instead of stale cached values. Closes [#503]. - Graph normalization sampling —
check_all_graph_keysnow inspects all keys for normalization, not just the first 3. Previously, graphs with only late-position abnormal keys could pass validation. Closes [#502]. - UTF-8 encoding for external tool reports —
read_text()calls injscpd_adapter.py,complexity.py, andtest_coverage/io.pynow specifyencoding="utf-8"explicitly. On Windows, the system codepage default (cp1252) would crash when reports contained non-ASCII characters. Closes [#505], reported by @pietrondo. - Tree-sitter CI stability — Spec tests now skip gracefully when grammar files aren't available, instead of failing the entire suite.
Refactoring & Internal
- Single-writer lifecycle enforcement — eliminated side-channel phase writes that could put the lifecycle into inconsistent states.
- Legacy phase name removal — all fine-grained persisted phase names (
review_initial,assessment_postflight,workflow_postflight, etc.) are now migrated to coarseplan/executemodes at load time. - Snapshot signal shaping — mode-aware suppression of postflight signals (assessment/workflow/triage/review) now lives in the caller (
_phase_for_snapshot) rather than inside the shared delegation layer, keeping_derive_display_phaseas a pure items-to-bools mapper.
Community
Thanks to @pietrondo for reporting the Windows UTF-8 encoding issue (#505).