chore(release): 0.24.0

Version bump across the six files the release gate checks (plugin.json,
package.json, README badge, three SKILL.md frontmatter fields) plus the
CHANGELOG entry, covering the three commits unreleased since v0.23.0:

- 09fd4b7 feat(board): --inbox-plan, a fourth rendering
- 44fb34a fix(hooks): state-line-guard MAX_LINES 60 -> 120
- 19c0c10 feat(coord,board): dead-letter detection (WP1d detection half)

All four selftest suites green at this commit: coord 197/197, board
178/178, route 69/69, state-line-guard 21/21.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Neu6DivA9k5op2rSEvcewn
This commit is contained in:
Kjell Tore Guttormsen 2026-08-14 22:24:28 +02:00
commit 03e36c9499
7 changed files with 57 additions and 6 deletions

View file

@ -5,6 +5,57 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.24.0] - 2026-08-14
### Added
- **`board.sh --inbox-plan`: a fourth rendering, independent of `--plan`'s
admission gate.** 0.22.0 narrowed `--plan` to admit only repos that actually
owe a reply, and morning-driver derives its `--innboks` population from
`--plan` — so 21 mailboxes with unhandled post produced only 3 openable tabs.
The two questions are genuinely different: `--plan` answers "which repos
deserve a tab today" (admission, ranking, a cap), `--inbox-plan` answers
"which repos have unhandled post" (population, no judgement, no cap). It is a
superset of `--plan`'s candidates, not a complement, which is why it is a
separate rendering rather than a flag on the existing one. Emits one block per
mailbox name with `pending>0`, classified against `board.sh`'s own `RECORDS`
scan with no new discovery logic: `class=repo` (STATE.md present), `no-state`
(scanned repo, no STATE.md), `orphan-mailbox` (no matching directory at all).
`pending=`/`owed=` surface `coord-count.sh`'s two counts directly. Accepted
work order: morning-driver 20260814T175317Z, corrected 20260814T180854Z.
`board-selftest.sh` section 15 (6 fixtures, isolated root + mailbox).
- **Dead-letter detection: mailboxes no session has ever read.** `coord-count.sh`
gains a fourth TSV column — `-` when a mailbox has `.origin` (a real session
has read it via SessionStart), otherwise the age in whole days of the oldest
pending message. `.origin` is written only by `coord-inbox.sh`'s non-`--repo`
path, so its absence means the mailbox is never reached by normal injection: a
genuine dead letter, not merely a slow one. `board.sh --brief` surfaces
mailboxes past a 3-day threshold as a new "ALDRI LEST" section, mirroring the
existing orphan-mailbox listing. This is the DETECTION half of `.claude`'s
WP1d order (2026-08-14) only — the action half (report-to-sender / retract)
is a policy change in retract semantics, remains unapproved design, and was
deliberately not built here.
### Fixed
- **`pre-state-line-guard.mjs`: `MAX_LINES` raised 60 -> 120.** Operator
decision 2026-08-14; the global CLAUDE.md's STATE.md convention moved from
`~60` to `~120` and the hook enforced the old number. The ratchet mechanics
are unchanged — only the constant moved, plus every selftest fixture and
boundary value that encoded 60 as a literal. Section 8's ratchet fixtures were
re-based rather than rescaled, so they still exercise the ratchet instead of
degenerating into a flat gate at the new threshold. Re-verified the real-tree
justification at the new limit: 13 STATE.md files over 120, one at 1496 (the
historical 23-over-60 / one-at-1405 figures are left in place as a record of
the tree when the ratchet bug was found). `session-start.mjs`'s 160-line
injection window still covers 120 with room to spare.
### Notes
- Selftest counts this release: coord 197 (was 191), board 178 (was 175),
route 69, state-line-guard 21.
## [0.23.0] - 2026-08-14
### Added