fix(board): plan/brief use actual debt, not raw pending mail

board.sh --plan group 2 and --brief conflated every unhandled inbox
message with an obligation to reply, including ones the sender
declared reply-expected: no (a notice, not a request). Reported by
morning-driver (2026-08-11), independently reproduced against the live
mailbox on 2026-08-13: 27 of 72 pending messages were notices. Both
paths now join against coord-count.sh's owed column instead, so a
done/deferred/blocked repo whose only mail is FYI no longer gets a
plan tab, and --brief no longer counts a notice as an obligation. The
table's raw INN column is unchanged by design.

While extending that join with a second lookup file, found and fixed
a more severe, independent defect: the existing $UNBLOCKS/$RECORDS
join used the NR==FNR awk idiom, which silently empties the entire
plan whenever the first file is empty -- i.e. whenever the repo tree
has zero blocked repos, a common, ordinary state, not an edge case.
Verified against the shipped 0.21.0 script. Fixed by matching on
FILENAME instead of cumulative line counts, for both lookup files.

Also repoints the README's governance link at repo-standard's
canonical GOVERNANCE.md (was pointing at the marketplace's copy),
per org-ops D11.

board-selftest.sh: 142 -> 150 checks. Version 0.21.0 -> 0.22.0.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WGWMPskXBsTjMrrQ2GofFx
This commit is contained in:
Kjell Tore Guttormsen 2026-08-13 20:54:55 +02:00
commit 03e712a423
10 changed files with 263 additions and 27 deletions

View file

@ -5,6 +5,35 @@ 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.22.0] - 2026-08-13
### Fixed
- **`board.sh --plan` and `--brief` conflated raw pending mail with debt.**
Group 2's `keep`/`mag`/`why=inbox:N` and the whole of `--brief` were computed
from every unhandled message in an inbox, including ones the sender declared
`reply-expected: no` (a notice, not a request). Reported by morning-driver
(2026-08-11), independently reproduced against the live mailbox on
2026-08-13 (27 of 72 pending messages were notices, not requests). Both
paths now join against `coord-count.sh`'s `owed` column instead: a
`done`/`deferred`/`blocked` repo whose only mail is FYI no longer gets a
plan tab, and `--brief` no longer counts a notice as an obligation. The
table's `INN` column is unchanged - it means raw pending by design. See
CLAUDE.md's board.sh section for the full reasoning, including why this
narrows rather than reopens the "debt is never excluded or capped" rule.
- **`board.sh --plan` silently emptied itself whenever the repo tree had zero
`blocked` repos.** The `$UNBLOCKS`/`$RECORDS` join used the `NR==FNR` awk
idiom, which breaks silently when the FIRST file is empty: `FNR` stays equal
to `NR` for the entire NEXT file too, not just its first line, misrouting
every record into the wrong branch and dropping it via `next`. Found while
adding the debt join above (a second lookup file made the same fragility
hit `--brief` too, whenever there was neither chain-root credit nor debt on
a given day). Verified against the shipped 0.21.0 script with a minimal
reproduction. Fixed by matching on `FILENAME` instead of line counts.
`board-selftest.sh`: 142 -> 150 checks (fixtures for FYI-only mail,
mixed owed/pending mail, and the zero-blocked-repos case).
## [0.21.0] - 2026-08-09
### Changed