fix(board): --dispatch neste= carried three other record fields

d_neste took the record from field 14 onward - the index from when the
record had 14 fields. ORDRE, FLY and VOY were later inserted before
`neste` and the index never moved, so every dispatch block read
`neste=<claimed>|<claimedage>|<voy>|<prose>` (measured on the shipped
0.34.0: `neste=1|0d|0|NESTE: ...`). Now field 17 onward.

Found while adding a field before `neste`, which would have made the
prefix one field longer. board-selftest pins the exact start of the
fixture's NESTE prose, so the next inserted field turns it red.

board-selftest 427 -> 428; README and CLAUDE.md counts moved with it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-17 15:53:15 +02:00
commit 0008dbbc3a
5 changed files with 25 additions and 5 deletions

View file

@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
### Fixed
- **`board.sh --dispatch` put three other record fields in front of `neste=`.**
The index that takes "the last field onward" was written when the record had
14 fields and was never moved as ORDRE, FLY and VOY were inserted before
`neste`, so a dispatch block read `neste=0|-|0|<the NESTE prose>`. It now
takes field 17 onward, and a selftest check pins the exact start of the
prose so the next inserted field turns it red.
## [0.34.0] - 2026-09-12 ## [0.34.0] - 2026-09-12
### Changed ### Changed

View file

@ -467,7 +467,7 @@ marketplace plugin. Three components, one boundary:
- **Board (`scripts/board.sh`):** cross-repo attention board. Reads STATE.md - **Board (`scripts/board.sh`):** cross-repo attention board. Reads STATE.md
next-step blocks + board lines, `git status`, and mailbox pending counts, and 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 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` (427 checks). STATE.md and no mailbox. Pinned by `board-selftest.sh` (428 checks).
**It lives here because the mailbox is one of its three inputs, and it carries **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 the same axis distinction the mailbox does.** A pending count means *others
@ -1502,7 +1502,7 @@ obligations in another repo.
builtins only in hook and tests. builtins only in hook and tests.
- TDD: no behavior change without a failing selftest check first. - TDD: no behavior change without a failing selftest check first.
`bash scripts/coord-selftest.sh` must exit 0 (257/257), `bash scripts/coord-selftest.sh` must exit 0 (257/257),
`bash scripts/board-selftest.sh` must exit 0 (427/427), `bash scripts/board-selftest.sh` must exit 0 (428/428),
`bash scripts/route-selftest.sh` must exit 0 (73/73), `bash scripts/route-selftest.sh` must exit 0 (73/73),
`bash scripts/orders-selftest.sh` must exit 0 (116/116) and `bash scripts/orders-selftest.sh` must exit 0 (116/116) and
`bash scripts/state-line-guard-selftest.sh` must exit 0 (54/54). `bash scripts/state-line-guard-selftest.sh` must exit 0 (54/54).

View file

@ -14,7 +14,7 @@ Session A in repo X leaves a message for repo Y; the next session in repo Y gets
![Hooks](https://img.shields.io/badge/hooks-1-green) ![Hooks](https://img.shields.io/badge/hooks-1-green)
![Skills](https://img.shields.io/badge/skills-4-orange) ![Skills](https://img.shields.io/badge/skills-4-orange)
![CLI scripts](https://img.shields.io/badge/CLI_scripts-8-blue) ![CLI scripts](https://img.shields.io/badge/CLI_scripts-8-blue)
![Selftest checks](https://img.shields.io/badge/selftest_checks-927-blue) ![Selftest checks](https://img.shields.io/badge/selftest_checks-928-blue)
--- ---
@ -199,7 +199,7 @@ Note that raising the inbox's priority (Rule 7) deliberately does **not** widen
## Development ## Development
bash scripts/coord-selftest.sh # 257 checks against a throwaway mailbox bash scripts/coord-selftest.sh # 257 checks against a throwaway mailbox
bash scripts/board-selftest.sh # 427 checks against a throwaway repo tree bash scripts/board-selftest.sh # 428 checks against a throwaway repo tree
bash scripts/route-selftest.sh # 73 checks, incl. the route->board round trip bash scripts/route-selftest.sh # 73 checks, incl. the route->board round trip
bash scripts/orders-selftest.sh # 116 checks, incl. the 20-way barriered claim race bash scripts/orders-selftest.sh # 116 checks, incl. the 20-way barriered claim race
bash scripts/state-line-guard-selftest.sh # 54 checks, incl. the Edit replace_all projection and the ratchet bash scripts/state-line-guard-selftest.sh # 54 checks, incl. the Edit replace_all projection and the ratchet

View file

@ -1788,6 +1788,14 @@ printf '%s\n' "$d8" | grep -q '^tab=1$'; check "dispatch: plan block carries tab
printf '%s\n' "$d8" | grep -q '^repo=repo-a$'; check "dispatch: plan block carries repo=" $? printf '%s\n' "$d8" | grep -q '^repo=repo-a$'; check "dispatch: plan block carries repo=" $?
printf '%s\n' "$d8" | grep -q "^dir=$ROOT/repo-a\$"; check "dispatch: plan block carries dir=" $? printf '%s\n' "$d8" | grep -q "^dir=$ROOT/repo-a\$"; check "dispatch: plan block carries dir=" $?
printf '%s\n' "$d8" | grep -q '^paste=cd '; check "dispatch: plan block carries a paste= that cds first" $? printf '%s\n' "$d8" | grep -q '^paste=cd '; check "dispatch: plan block carries a paste= that cds first" $?
# neste= is the record's LAST field, taken as "field N onward". The index was
# written when the record had 14 fields and never moved as ORDRE, FLY and VOY
# were inserted before it, so the shipped block read `neste=0|-|0|Lukk ...` -
# three other columns glued onto the prose. Pinned on the exact start of
# repo-a's NESTE, so any future field added before `neste` without moving this
# index turns the check red instead of silently growing the prefix.
printf '%s\n' "$d8" | grep -q '^neste=Lukk to MAJOR fra reviewen'
check "dispatch: neste= carries the NESTE prose alone, no other record fields in front of it" $?
# The prompt reaches the session through argv. A bare model+effort command # The prompt reaches the session through argv. A bare model+effort command
# forces the operator to type Go, and the session must then GUESS the task out # forces the operator to type Go, and the session must then GUESS the task out
# of STATE instead of being handed it - measured twice on 2026-08-16. # of STATE instead of being handed it - measured twice on 2026-08-16.

View file

@ -1406,7 +1406,10 @@ dispatch() {
[ -n "$d_rec" ] || { echo "board: no repo named '$D_REPO' in the scanned roots ($ROOTS)" >&2; exit 2; } [ -n "$d_rec" ] || { echo "board: no repo named '$D_REPO' in the scanned roots ($ROOTS)" >&2; exit 2; }
d_status="$(printf '%s' "$d_rec" | cut -d'|' -f4)" d_status="$(printf '%s' "$d_rec" | cut -d'|' -f4)"
d_dir="$(printf '%s' "$d_rec" | cut -d'|' -f10)" d_dir="$(printf '%s' "$d_rec" | cut -d'|' -f10)"
d_neste="$(printf '%s' "$d_rec" | cut -d'|' -f14-)" # `neste` is the LAST record field and is taken as "field N onward". This
# index once read 14 and was never moved as fields were inserted before
# `neste`, gluing three other columns onto the prose - move it with the record.
d_neste="$(printf '%s' "$d_rec" | cut -d'|' -f17-)"
[ -d "$d_dir" ] || { echo "board: the directory for $D_REPO does not exist: $d_dir" >&2; exit 2; } [ -d "$d_dir" ] || { echo "board: the directory for $D_REPO does not exist: $d_dir" >&2; exit 2; }
# Rejected traits REFUSE. Degrading to a command without them is the worst # Rejected traits REFUSE. Degrading to a command without them is the worst