feat(board): give the plan a paste= line the operator can actually use

--plan shipped with dir= and command= as separate fields. That is right for a
driver, which moves the pane itself and then types the command, and unusable
for a person: the first operator to read a block could not act on it at all.

Joining an absolute path from one field with a command from another is not a
saved line of output. It is the step where a session gets started in the wrong
repository - the same failure the absolute dir= exists to prevent, moved from
the machine to the human.

paste= is the two already joined, cd <dir> && <command>, one thing to select.
Both forms stay: the two consumers want the same fact shaped differently, and
neither shape serves both.

Emitted only alongside command=, never once per block. A `paste=cd X && ` with
nothing after it would run the cd and then a bare newline, which fails
SILENTLY - the operator ends up in the right directory with no session started
and no error to notice.

board-selftest: 86 -> 89 checks.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011eKRzhD1RqY2MxvDEkrJAM
This commit is contained in:
Kjell Tore Guttormsen 2026-08-02 07:34:30 +02:00
commit 5bea1f8651
10 changed files with 76 additions and 9 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` (86 checks).
STATE.md and no mailbox. Pinned by `board-selftest.sh` (89 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
@ -105,6 +105,16 @@ marketplace plugin. Three components, one boundary:
route-line grammar, shared with `--brief`, and distinguishes the two causes by
exit code rather than by an empty string.
**`paste=` and `dir=`/`command=` are the same fact for the two consumers, and
neither is redundant.** A driver moves the pane itself and then types the
command, so it needs them apart; a human needs ONE thing to select. Handing
the operator two fields to join by hand is not a saved output line, it is the
step where a session starts in the wrong repo - and it was measured the moment
the feature met its first user, who could not act on the block at all. `paste=`
is emitted only alongside `command=`: `paste=cd X && ` with nothing after it
would run the cd and then a bare newline, which fails SILENTLY by leaving the
operator in the right directory with no session started.
**Driving a terminal from the plan does NOT belong here, and the measurement
in `docs/ghostty-orchestration-measurement.md` is the argument, not taste.**
It is a version-pinned undocumented composition over a preview API whose
@ -241,7 +251,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 (183/183),
`bash scripts/board-selftest.sh` must exit 0 (86/86) and
`bash scripts/board-selftest.sh` must exit 0 (89/89) and
`bash scripts/route-selftest.sh` must exit 0 (73/73).
- English for all code, docs, and commit messages (public repo). Norwegian
trigger aliases in the skill description are deliberate.