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

@ -1,6 +1,6 @@
{
"name": "repo-mailbox",
"version": "0.23.0",
"version": "0.24.0",
"description": "Local mailbox for coordination between Claude Code sessions in different repositories. Directed messages and broadcasts as plain Markdown files on your own disk, injected as context at session start. Local, private, no network.",
"author": {
"name": "Kjell Tore Guttormsen"

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

View file

@ -10,7 +10,7 @@ Session A in repo X leaves a message for repo Y; the next session in repo Y gets
*AI-generated: all code produced by Claude Code through dialog-driven development.*
![Version](https://img.shields.io/badge/version-0.23.0-blue)
![Version](https://img.shields.io/badge/version-0.24.0-blue)
![Hooks](https://img.shields.io/badge/hooks-1-green)
![Skills](https://img.shields.io/badge/skills-3-orange)
![CLI scripts](https://img.shields.io/badge/CLI_scripts-8-blue)

View file

@ -1,6 +1,6 @@
{
"name": "repo-mailbox",
"version": "0.23.0",
"version": "0.24.0",
"private": true,
"type": "module",
"engines": {

View file

@ -20,7 +20,7 @@ description: >-
user names no repo and no tool — choosing *between* repos is this skill. Not for
"where were we" inside the current repo: that is this repo's own STATE.md,
already injected at session start.
version: "0.23.0"
version: "0.24.0"
---
# board — which repo deserves the next session

View file

@ -15,7 +15,7 @@ description: >-
covers retiring a broadcast that has become wrong or obsolete: "retract that
broadcast", "that announcement is outdated, pull it", "trekk tilbake kringkastingen",
"den broadcasten er utdatert".
version: "0.23.0"
version: "0.24.0"
---
# coord-send — natural-language front door for inter-repo messages

View file

@ -14,7 +14,7 @@ description: >-
the operator names no model and no tool — choosing the model for the next
session IS this skill. Not for choosing which REPO gets the next session:
that is the `board` skill.
version: "0.23.0"
version: "0.24.0"
---
# route — what the next session should run with