feat(board): cross-repo attention board as script + skill (0.9.0)

The mailbox answers "who wrote to me"; it never answered "which repo
deserves the next session". board.sh scans every discovered repo and reads
three sources each: the STATE.md next-step block with its optional board
line, git status, and that repo's pending mailbox count. Read-only by
construction, pinned by board-selftest.sh (28 checks).

It ships here rather than as a personal script because the mailbox is one
of its three inputs and the two carry the same axis distinction: a pending
count means others are waiting on that repo, while who a repo waits ON comes
only from its board line, since the message format has no reply-to field.
Splitting the board from the mailbox would put that distinction in two
places. It also lets the skill resolve the engine through CLAUDE_PLUGIN_ROOT
like every other script here, instead of depending on a file that exists
only in ~/.claude/scripts (a directory with no remote and no backup).

The skill is a ranking, not a report: re-runs the board every invocation
because counts drift, ranks by what unblocks the most and what is cheapest
to move, then names one repo, the rule that fired, and the real next action
read from that repo's STATE.md. Never the table. Not wired into session
start, which would spend context on repos the session is not in.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MubwdTi88yu4hVLAFG1LbM
This commit is contained in:
Kjell Tore Guttormsen 2026-07-28 21:15:03 +02:00
commit 61e224ccc3
10 changed files with 691 additions and 13 deletions

View file

@ -5,6 +5,36 @@ 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.9.0] - 2026-07-28
### Added
- **`board.sh` + the `board` skill — the cross-repo attention board.** The
mailbox answers "who wrote to me"; it never answered "which repo deserves the
next session". `board.sh` scans every discovered repo and reads three sources
per repo: the STATE.md next-step block with its optional board line, `git
status`, and that repo's pending mailbox count. Read-only by construction — it
writes to no repo, no STATE.md and no mailbox — and pinned by
`board-selftest.sh` (28 checks against a throwaway repo tree and a throwaway
mailbox).
**Why it ships here rather than as a personal script.** The mailbox is one of
its three inputs, and the two carry the same axis distinction: a repo's pending
count means *others are waiting on it* (an obligation owed outward), while who
a repo waits *on* is only derivable from its own board line, because the
message format has no reply-to or thread field. Splitting the board from the
mailbox would put that distinction in two places, and a rule enforced in one of
two places is not a rule. It also means the engine resolves through
`CLAUDE_PLUGIN_ROOT` like every other script here, instead of existing only on
the author's machine.
The skill is a ranking, not a report: it re-runs the board on every invocation
(counts drift between turns), ranks by what unblocks the most and what is
cheapest to move, then names one repo, the rule that fired, and the real next
action read from that repo's STATE.md — never the table. Deliberately not wired
into session start: injecting the whole board into every session spends context
on repos the session is not in.
## [0.8.0] - 2026-07-27
### Added