chore(release): bump to 0.31.0

Two commits landed after v0.30.0 and neither reaches anyone: every entry
point on this machine runs the version-pinned plugin cache, not the tree.
Measured 2026-08-29 by .claude before this order was written - cache
board.sh 1626 lines against the repo's 1739, md5 differing - so the board
skill was still running pre-4369499 code. A commit is not a delivery.

Minor rather than patch: ee5a86a adds a reading the table did not have
(ORDRE and FLY carry the age of the oldest order), while 4369499 repairs
a consumer that discarded a signal the engine already sent. No new
key=value key, no new exit code, no new env var, no sort-axis change.

Version bumped in all seven files that carry it: .claude-plugin/plugin.json,
package.json, the README badge and the four SKILL.md frontmatters. The
0.30.0 strings remaining in CLAUDE.md, board.sh and board-selftest.sh are
historical prose about what was measured on that release and are correct
as they stand - a blanket sed would have falsified them.

CHANGELOG 0.31.0 written for a reader of the board rather than a reader
of the diff: what the columns now say, and what --brief no longer claims.

Suites under real /bin/bash 3.2 after the bump: coord 242/242, board
325/325, route 69/69, orders 110/110, guard 54/54. npm test 11/11.

No tag and no catalog change, as ordered - release-plugin.mjs lives in
catalog and mints the tag and the ref atomically; a hand-made tag here is
exactly the drift that script exists to prevent.

Order: 20260829T071929Z-786087280-from-.claude

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-08-29 09:29:26 +02:00
commit 0711b4209c
8 changed files with 68 additions and 7 deletions

View file

@ -1,6 +1,6 @@
{
"name": "repo-mailbox",
"version": "0.30.0",
"version": "0.31.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,67 @@ 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.31.0] - 2026-08-29
Two commits landed after `v0.30.0` and, as with that release, neither reaches
anyone until the tag exists: every entry point on this machine runs the
version-pinned plugin cache, not the tree. Minor rather than patch because the
board's table gained a reading it did not have - the age of the oldest queued
order - while the other change repairs a consumer that was ignoring a signal
the engine already sent.
Both are the same class the previous release closed and this one continues: a
failed or missing measurement rendering as a reassuring value.
### Added
- **`ORDRE` and `FLY` now carry the AGE of the oldest order, rendered `N:Md`.**
Reading the board, `ORDRE 2` used to look identical whether both orders
arrived yesterday or both had sat for ten days. The problem was never that
orders wait - that is a prioritisation call owned by humans - it was that no
cross-repo surface showed the wait at all: `coord-order-inbox.sh` reports an
age, but only inside the one repo at SessionStart, so a repo nobody opens
shows nobody anything. Measured across the live mailbox 2026-08-29: 30
pending orders over 22 repos, 5 of them ten days old. The age is the OLDEST
order, never the newest and never a mean - a repo holding one fresh order and
one ten-day-old order has a ten-day-old problem, and the newest reading is
exactly what would hide it. `FLY` carries the same reading, where it matters
at least as much: nothing un-claims an order when the session that took it
dies. An empty queue still prints a bare `0` ("no orders" and "an order that
arrived today" are different facts), and an unreadable mtime prints `?` for
the whole reading rather than silently skipping a file that could have been
the oldest one.
The age is DISPLAY only. It is deliberately not in the sort, and `--plan`'s
`fly=` and every other emitted `key=value` block are untouched, so nothing
that parses this board changes shape.
### Fixed
- **`board.sh` listened to `coord-count.sh`'s output and ignored its exit
status, so the failure signal 0.30.0 had just built stopped at the
producer.** Every call site piped the counter into `awk`, and a pipeline
reports the last stage's status, so exit 3 - "the mailbox root you named is
not there; this is not a count of zero" - was discarded each time. Measured
on the shipped 0.30.0 against a mailbox root that does not exist:
`coord-count.sh` said "not counted, not zero" and exited 3, while
`board.sh --brief` answered "Ingen repo skylder noen et svar i dag." and
`--plan` emitted no warning key at all. For a reader that meant a briefing
confidently reporting that nobody owes anyone a reply, on the basis of a
measurement that never happened.
The board now reports the failure at all five places it speaks, and keeps the
two causes apart - a missing sibling script and a mailbox root that is not
there are different repairs. A partial count captured before a failure is
discarded rather than shown, because a half-count also looks measured. The
table and `--plain` views are unchanged: they never invoked the counter, and
now say so instead of implying a measurement nobody attempted.
Bounded gap, stated rather than closed: the table's own `INN`/`ORDRE`/`FLY`
columns count with `ls` and read 0 for every repo when the mailbox root is
absent. Same shape, one source over, and not a `coord-count.sh` consumer -
named here rather than silently widened into.
## [0.30.0] - 2026-08-26
Two commits landed after `v0.29.0` and neither is reachable: every entry point

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.30.0-blue)
![Version](https://img.shields.io/badge/version-0.31.0-blue)
![Hooks](https://img.shields.io/badge/hooks-1-green)
![Skills](https://img.shields.io/badge/skills-4-orange)
![CLI scripts](https://img.shields.io/badge/CLI_scripts-8-blue)

View file

@ -1,6 +1,6 @@
{
"name": "repo-mailbox",
"version": "0.30.0",
"version": "0.31.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.30.0"
version: "0.31.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.30.0"
version: "0.31.0"
---
# coord-send — natural-language front door for inter-repo messages

View file

@ -17,7 +17,7 @@ description: >-
skill. Not for choosing WHICH repo deserves the next session (that is `board`),
not for scoring model and effort alone (that is `route`), and not for sending a
message to another repo (that is `coord-send`).
version: "0.30.0"
version: "0.31.0"
---
# dispatch — hand a session a task it can actually start on

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.30.0"
version: "0.31.0"
---
# route — what the next session should run with