fix(board): --brief's zero-debt branch no longer claims zero pending mail

Found in review of the previous commit, before catalog tags 0.22.0: once
n_owe counts OWED repos rather than raw pending, its ==0 branch could fire
while a repo still held FYI-only mail, making "Ingen repo har uhaandtert
innboks" false at the exact moment it printed. Fixed to state only the
debt claim, and to name any FYI-only mailboxes found instead of letting
their existence go unmentioned. No fixture in the shared test tree ever
reached n_owe==0 (it always carries a debtor), so this needed its own
isolated-root fixture to pin.

Still part of the 0.22.0 release -- amends that changelog entry rather
than bumping again, since no tag exists yet.

board-selftest.sh: 150 -> 152 checks.

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 21:07:39 +02:00
commit 61aebad748
5 changed files with 80 additions and 10 deletions

View file

@ -54,7 +54,7 @@ marketplace plugin. Three components, one boundary:
- **Board (`scripts/board.sh`):** cross-repo attention board. Reads STATE.md
next-step blocks + board lines, `git status`, and mailbox pending counts, and
prints one line per repo. Read-only by construction: it writes to no repo, no
STATE.md and no mailbox. Pinned by `board-selftest.sh` (150 checks).
STATE.md and no mailbox. Pinned by `board-selftest.sh` (152 checks).
**It lives here because the mailbox is one of its three inputs, and it carries
the same axis distinction the mailbox does.** A pending count means *others
@ -147,6 +147,20 @@ marketplace plugin. Three components, one boundary:
of every repo," not "who is waiting on you," and stay on raw pending by
design.
**The same 0.22.0 patch that switched `n_owe` to OWED also had to fix what
`n_owe == 0` claims.** `--brief`'s empty-debt branch said "Ingen repo har
uhaandtert innboks. Ingen skylder noen et svar i dag." (no repo has
unhandled inbox; nobody owes a reply) - two claims in one branch, and only
the second is what `n_owe == 0` actually proves once `n_owe` means OWED. A
repo can hold FYI-only mail with zero debt, which makes the first sentence
false while it fires - caught in review before release, not by any fixture
(the shared test tree never reaches `n_owe == 0`, since it always carries a
debtor). Fixed to state only the debt claim, and to name any FYI-only
mailboxes found rather than let their existence become invisible again -
the same "labelled, not silently dropped" principle `--plan` already
applies to unknown-status repos. Pinned by board-selftest.sh section 14
with its own isolated root (debt-free, one FYI-only repo).
**The `$UNBLOCKS`/`$RECORDS` join used `NR==FNR` through 0.21.0, and that
idiom silently drops the entire plan whenever the FIRST file is empty - fixed
to `FILENAME==` comparison in 0.22.0, found while adding the `$OWED` join
@ -347,7 +361,7 @@ obligations in another repo.
builtins only in hook and tests.
- TDD: no behavior change without a failing selftest check first.
`bash scripts/coord-selftest.sh` must exit 0 (191/191),
`bash scripts/board-selftest.sh` must exit 0 (150/150) and
`bash scripts/board-selftest.sh` must exit 0 (152/152) and
`bash scripts/route-selftest.sh` must exit 0 (69/69).
- English for all code, docs, and commit messages (public repo). Norwegian
trigger aliases in the skill description are deliberate.