docs(changelog): reconstruct the missing 0.15.0 entry

The log jumped straight from 0.16.0 to 0.14.0 even though 0.15.0 shipped
and is tagged - a log gap, not a code gap, but this repo mirrors publicly
and nothing machine-checks changelog prose.

Reconstructed from v0.15.0 alone: the tag points exactly at 9dd24c3
(--brief + brief-nightly.sh). STATE.md's pointer to also use 6de2408
(the malformed-route-line test) was a stale premise - `git merge-base
--is-ancestor 6de2408 v0.15.0` says no, it landed 6 minutes after the tag
and only entered history via v0.16.0. Checked out both tags into scratch
trees and ran board-selftest.sh live to get 36 -> 49 from PASS=, not from
commit-message prose (this repo's README has printed a wrong count
before). Grepped the launchd plist for leaked absolute paths before
repeating the "placeholders only" claim: clean.

Left the published [0.16.0] entry's "51 -> 86" as-is per operator
call - the 49 -> 51 gap (6de2408's two checks, landed untagged between
the tags) is explained in the new entry instead of rewriting an
already-tagged entry.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017orCFDkmp88fLnqDR3chdJ
This commit is contained in:
Kjell Tore Guttormsen 2026-08-02 16:05:53 +02:00
commit 50f6420da5

View file

@ -89,8 +89,62 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
closed as *not planned*, with a blast radius reaching into other repos' live
sessions. The dependency runs one way — the driver consumes the plan, the plan
never knows a terminal exists — so if that API breaks, the plan still prints.
- The `0.15.0` entry is missing from this file; the release itself shipped and is
tagged. This is a gap in the log, not in the code.
## [0.15.0] - 2026-08-01
### Added
- **`board.sh --brief` — the nightly cross-repo briefing, a second RENDERING of
the scan `board.sh` already does, never a second scan.** The operator has
more repos than fits in memory, and the question that actually costs them is
"who is waiting on me, and what does answering cost" — `board.sh` already
scans for it, but nothing rendered it into a form an unattended job could
leave behind. `--brief` prints NESTE **uncut**: the 38-character cut is the
table column's property, not the record's, and the value used to be
truncated at record-build time, leaving the cut string as the only copy.
Each startup command is derived by **calling** `route.sh` with that repo's
own four traits — `next-cost` alone cannot produce it, since the advisor
flag is a property of the ROW and two rows can share a model/effort pair
while differing on it. A repo with no route line is told so rather than
handed a guess.
- **It cross-checks itself against `coord-count.sh`**, and that is the
substance of the change, not a nicety. The repo scan and the mailbox are two
different populations: a mailbox can carry a name no scan will ever produce
— a declared non-git surface (`CLAUDE_COORD_REPO`, e.g. `~/repos`) or a
checkout outside the roots. Measured on the real mailbox: 11 repos / 21
messages in the briefing against `coord-count`'s 12 / 22, the missing one
being the declared surface `repos`. A briefing that only walked the scan
would answer "who is waiting on you" with a number it quietly knew was
short.
- **Zero model calls**, the deciding property. Measured against 2.1.220 under
subscription auth: `--max-budget-usd` does bite (`terminal_reason:
budget_exhausted`, exit 1), but only *after* turn one — floor ~0.25
USD-equivalent per turn on `claude-opus-5[1m]`. It is a runaway brake, not a
pre-flight gate, so a nightly `claude -p` job would draw on the same quota
pool as interactive work every night. Determinism removes the question
entirely.
- **`scripts/brief-nightly.sh`** — the one writer in this path. `board.sh`
stays read-only: `brief-nightly.sh` renders to a temp file and renames it
into place, and treats an empty render as a *failed* one, since `board.sh`
prints nothing when its scan roots don't exist — what a mistyped path or a
moved home directory looks like. A plain `> file` redirect would destroy
yesterday's briefing on a bad launchd environment.
- **`launchd/com.ktg.repo-mailbox-brief.plist`** — a template carrying
placeholders, not absolute paths, since this repo is mirrored publicly. It
points at a checkout rather than the plugin cache, which is version-pinned
and would break silently on the next bump.
- `board-selftest.sh`: 36 -> 49 checks. One check pins a defect caught only by
eye against the real tree: `fold` copies its input's missing trailing
newline, which ran the command onto the tail of the NESTE prose and produced
a briefing whose commands could not be copied. Two more checks landed six
minutes after this tag, in an untagged follow-up commit that shipped no
version bump of its own — `board-selftest.sh` had already reached 51 by the
time `0.16.0`'s own work began, which is why that entry's count starts there.
## [0.14.0] - 2026-08-01