feat(board): FLY column and free-capacity lines, no process inspection

ORDRE counted pending orders only, so a repo with one order in flight and a
repo with no orders at all both printed 0 - the same digit for two opposite
facts. Measured 2026-08-23: two panes stood open and idle for 45 hours holding
finished orders, with full quota authorised, and no column on the board
reported it.

FLY counts orders/claimed/ - the same queue in its other state, never summed
with ORDRE and never a fourth axis. It does NOT mean a session is alive:
nothing un-claims an order when the claiming session dies, and one order on
the live mailbox had been claimed for 117 hours. The legend denies the
liveness reading in those words, pinned as a check on the legend text.

--plan now names free capacity as ledig_antall=N plus one ledig=<repo>
(<status>) line per repo with nothing owed, no pending order, nothing in
flight, a clean tree, at done or deferred. All four conditions are required:
measured on the real tree, 4 of 17 done/deferred repos were not free. Lines,
never blocks - the plan's second consumer discards a block with no tab=, so a
block would be visible to the operator and invisible to the driver.

Process inspection was considered and refused; the selftest asserts the
absence of pgrep/pkill/lsof structurally with a known-positive control. The
full argument, and the gap left open, are in
docs/2026-08-23-free-capacity-investigation.md.

board-selftest: 259 -> 281 checks, all green. npm test 11/11.

Order 20260823T162951Z-941745020-from-.claude

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hfbfr8ERC63kuAfWeHYHQb
This commit is contained in:
Kjell Tore Guttormsen 2026-08-23 19:07:00 +02:00
commit 3beef2a603
12 changed files with 532 additions and 25 deletions

View file

@ -5,6 +5,55 @@ 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.29.0] - 2026-08-23
Answers a question the board could not answer before: which repos are finished
and can take more work. Ordered as an investigation, not as a column - the
argument for what was NOT built is in
`docs/2026-08-23-free-capacity-investigation.md`.
### Added
- **`FLY` column: orders in flight (`orders/claimed/`).** `ORDRE` counted
pending orders only, so a repo holding one order in flight and a repo holding
no orders at all both printed `0` - the same digit for two opposite facts.
Measured the day this was ordered: two panes stood open and idle for 45 hours
holding finished orders, with full quota authorised, and no column reported
it. FLY is the same queue in its other state, never summed with ORDRE and
never a fourth axis.
- **`--plan` names free capacity**: `ledig_antall=N` plus one
`ledig=<repo> (<status>)` line per repo with nothing owed, no pending order,
nothing in flight, a clean tree, at `done` or `deferred`. Such a repo has no
next step to open a tab for and used to fall out of the plan silently. All
four conditions are required - measured on the real tree, 4 of 17
done/deferred repos were not free. Emitted as LINES, never blocks: the plan's
second consumer discards a block with no `tab=`, so a block would be visible
to the operator and invisible to the driver. The count prints at 0, so "none
found" and "not computed" cannot render the same.
- **`fly=N` on a tab block** whose repo already holds a claimed order. The
driver types into live panes.
### Unchanged, deliberately
- **No process inspection.** `pgrep`/`ps`/`lsof` were considered and refused,
and the selftest now asserts their absence structurally with a known-positive
control. Every other column is a durable filesystem fact reproducible in a
fixture tree; a process column measures one instant on one machine, needs
`lsof` to map a process to a repo, and rests on a CPU-vs-elapsed THRESHOLD -
which would make the board decide a session is dead, the same thing the order
queue is already forbidden from doing.
- **FLY does not mean a session is alive**, and the on-screen legend says so.
Nothing un-claims an order when the session that claimed it dies: one order on
the live mailbox had been claimed for 117 hours. Selftest section 24 pins the
denial as a check on the legend text.
### Known gap, stated rather than closed
An open, idle pane in a `planned` repo with no claimed order and no queued work
is still invisible, and cannot be seen from the filesystem at all. Closing it
needs a terminal-side measurement supplied inward by the driver that already
probes panes - the same direction `--dispatch --target-pane` already uses.
## [0.28.0] - 2026-08-20
Five fixes were committed and pushed after `v0.27.0` and none of them was