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:
parent
6d0fe14d0f
commit
5bea1f8651
10 changed files with 76 additions and 9 deletions
|
|
@ -566,6 +566,16 @@ check "repo owing mail but lacking a route line is marked, never guessed at" $?
|
|||
printf '%s' "$PLAN" | grep -q '^neste=.*check-versions'
|
||||
check "plan prints the full NESTE line, not the 38-char table excerpt" $?
|
||||
|
||||
# paste= is the operator's line and command= is the driver's. Both are kept
|
||||
# because they answer different questions: a driver cd's the pane itself and
|
||||
# would choke on a compound line, while the operator needs ONE thing to copy.
|
||||
# Assembling it by hand from two fields is where a tab lands in the wrong repo.
|
||||
printf '%s' "$PLAN" | grep -q "^paste=cd $ROOT/repo-owes && claude --model sonnet --effort high --advisor opus\$"
|
||||
check "paste= is the whole line: cd into the repo, then the startup command" $?
|
||||
|
||||
printf '%s\n' "$PLAN" | grep -A7 '^repo=repo-typo$' | grep -q '^paste='; [ $? -ne 0 ]
|
||||
check "a repo with no usable route line gets no paste line either" $?
|
||||
|
||||
# The driver cds into this, so a relative or missing path lands a session in the
|
||||
# wrong repo - constraint 2 of the Ghostty measurement, in field form.
|
||||
pdir="$(printf '%s\n' "$PLAN" | grep -m1 '^dir=' | cut -d= -f2-)"
|
||||
|
|
@ -587,6 +597,13 @@ n_cms="$(printf '%s\n' "$PLAN" | grep -c '^command_missing=')"
|
|||
&& [ "$n_nes" -eq "$n_tab" ] && [ $(( n_cmd + n_cms )) -eq "$n_tab" ]
|
||||
check "every planned block carries every field exactly once" $?
|
||||
|
||||
# paste= is one per command=, never one per block: a repo with no command has
|
||||
# nothing to paste, and `paste=cd X && ` would run the cd and then a bare
|
||||
# newline - putting the operator in the right repo with no session started.
|
||||
n_pst="$(printf '%s\n' "$PLAN" | grep -c '^paste=')"
|
||||
[ "$n_pst" -eq "$n_cmd" ]
|
||||
check "paste= appears exactly where command= does, never beside command_missing" $?
|
||||
|
||||
# Numbering must be dense: a driver opening tab 4 of 3 is a real failure mode.
|
||||
seq_ok=0
|
||||
printf '%s\n' "$PLAN" | grep '^tab=' | cut -d= -f2 > "$ROOT/tabs.txt"
|
||||
|
|
|
|||
|
|
@ -409,10 +409,18 @@ fi
|
|||
# that dropped them silently would repeat exactly that defect.
|
||||
# Excluded: done, deferred, blocked-without-debt, and repos with no STATE.md and
|
||||
# no debt - a tab that cannot be moved is not a plan entry.
|
||||
# Two lines for two consumers, and they are not redundant. A driver cd's the
|
||||
# pane itself and then types the command, so it needs them apart; the operator
|
||||
# needs ONE thing to select and paste, because assembling `cd <dir>` from one
|
||||
# field and the command from another is precisely where a tab ends up started
|
||||
# in the wrong repo. paste= is emitted only alongside command= - `paste=cd X && `
|
||||
# with nothing after it would run the cd and then a bare newline, leaving the
|
||||
# operator in the right directory with no session and no error.
|
||||
plan_cmd() {
|
||||
if pc_cmd="$(route_cmd_for "$1")"; then
|
||||
if [ -n "$pc_cmd" ]; then
|
||||
printf 'command=%s\n' "$pc_cmd"
|
||||
printf 'paste=cd %s && %s\n' "$1" "$pc_cmd"
|
||||
else
|
||||
printf 'command_missing=route-linjen kunne ikke tolkes (kost: %s)\n' "$2"
|
||||
fi
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue