test(board): pin the "field inserted before neste" class; 16 of 16 mutants die

An independent review ran 16 mutants of the PLAN column against the 461
board checks and 5 survived:
- --row taking neste from a stale index (neste=5d|...)
- --inbox-plan taking neste from a stale index (neste=5d)
- the no-STATE.md record one field short (plan=(ingen STATE.md))
- Nd measured behind NOW instead of behind the last commit
- the '?' branch (a plan with no commit) rendered as '-'

Section 34 part 8 adds a fixture for each: a NESTE with a '|' inside,
pinned exactly in --row and --inbox-plan; a repo with no STATE.md; a repo
whose last commit is 30 days old, so the two definitions give different
numbers; a repo with a plan and no commit. Rebuilt from this tree and run
against the full suite: 16 of 16 mutants now fail it.

The same fixtures exposed two defects, fixed here:
- --inbox-plan took neste as ONE field and cut the prose at its first '|'
  (also in 0.34.0); it now takes that field onward.
- a symlinked PLAN.md was aged by the link's own mtime; it now uses
  stat -L, so the plan's age is the target's.

Docs: CHANGELOG no longer says "field 17 onward" (the index is 18) and
now records the no-STATE.md record fix and the --inbox-plan fix; README's
requirement says macOS, since board.sh uses BSD stat and renders nothing
under GNU stat.

board-selftest 461 -> 478 (badge 978). Suites: coord 257, board 478,
route 73, orders 116, guard 54; npm test 12/12, run after git add.

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

View file

@ -12,7 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **`PLAN` column in the board table, and `plan=` in `--row`.** A filesystem
reading of the repo root: `-` = no file named exactly `PLAN.md`; `Nd` =
whole days the plan's mtime lies behind the last commit (`0d` when as new or
newer); `?` = a plan with no commit to compare against. The content is never
newer); `?` = a plan with no commit to compare against. A symlinked
`PLAN.md` is aged by its target. The content is never
read, and the column does not judge whether a criterion can be falsified -
the legend says so. The name is matched byte for byte, because APFS's
case-insensitivity makes `[ -f PLAN.md ]` true for `plan.md`. Display only:
@ -25,8 +26,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
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.
takes the field after the last column onward (field 18, since the `PLAN`
column below moved it again), and a selftest check pins the exact start of
the prose so the next inserted field turns it red.
- **`--row` and `--dispatch` for a repo with no STATE.md carried shifted
values.** That record is written by its own printf, which lacked the `VOY`
field, so `--row` read `voy=(ingen STATE.md)` and an empty `neste=`. The
record is now complete; a fixture with no STATE.md pins it.
- **`--inbox-plan` cut NESTE at its first `|`.** It read `neste` as one field
instead of "that field onward"; the whole prose now comes through, as it
already did in `--row` and `--dispatch`.
- **README said "macOS or Linux".** `board.sh` uses BSD `stat` throughout and
renders no rows under GNU `stat`; the requirement now says macOS.
## [0.34.0] - 2026-09-12