Skip to content

bench(lab): report where a campaign stands from its run tree - #275

Closed
luuuc wants to merge 1 commit into
lab/05-03-the-plan-filesfrom
lab/05-04-status
Closed

bench(lab): report where a campaign stands from its run tree#275
luuuc wants to merge 1 commit into
lab/05-03-the-plan-filesfrom
lab/05-04-status

Conversation

@luuuc

@luuuc luuuc commented Aug 16, 2026

Copy link
Copy Markdown
Owner

Problem

A campaign runs unattended for hours and is picked up later, often by a session with no memory of it. "Where does this stand" has to be answerable in one command.

The retired instrument answered it with a page assembled from a results tree, two state files, a banked log and a ledger — plus a hand-maintained resume file. That file goes stale by construction, and a stale resume line is worse than none because it looks current.

Summary

sense-lab status derives the whole page from the run tree. Nothing is hand-maintained, so nothing can disagree with what is on disk.

Changes

  • Position is derived, not recorded. The furthest phase of the latest cycle whose artifact exists, and the first whose artifact does not. It decides nothing: an artifact is there or it is not, and which phase comes next is a fact about the graph.
  • It carries the banner. Position is authoritative in the run tree; this page is a view of it and decides nothing. A regenerated view cannot be quietly edited into a decision, which the previous page held by convention and this one holds by construction.
  • The uncomfortable rows lead. Incomplete cells with their burned and unusable arms named, orphaned run directories that spawned and recorded no terminal state, parked repositories, and spend against the ceiling with its scope stated: per campaign, over its lifetime. A status that shows only progress is a status nobody trusts twice.
  • The resume line cannot go stale. It names the phase, the plan file that says how to run it and the artifact it owes. There is deliberately no command field: no verb drives the loop yet, and a line naming one that does not exist is the stale-resume-file failure in a different shape. With nowhere to put a command, printing a wrong one is unrepresentable rather than avoided by convention. The plan file is guaranteed present — every phase has one, checked mechanically.
  • A parked repository gets no resume line, because resuming it is the deliberate human action the ceiling exists to require.
  • Nothing parses the rendered page. Read returns a struct, Render takes one, and the only consumer of the string is a printer. A test asserts that nothing else in the tree imports the package.
  • No watch mode, no hand-maintained resume file.

Recorded during the build

Indexing is per repository, not per authoring cycle. Found while deriving position: looking for the index under every cycle would report every re-entered repository as waiting on a scan that already happened — a resuming session's worst possible input, and it would have looked plausible on the page. The index artifact sits beside the cycles.

Banked cells report the cycle, not the model or the spread. Nothing on disk carries either yet: a run records its command, its wall and its arm, not its model, and there is no structured harvest record. Those columns land when that record does.

Test Plan

  • make ci green: build, tests, per-file coverage floor with no new exception, zero complexity suppressions, lint clean.
  • 97% line and 100% function coverage on the new package.
  • Position derived from a hand-built tree: the furthest phase reached, the first awaited, the latest cycle winning over an earlier one, a banked cycle, a parked repository, and a directory that is not a cycle being ignored.
  • Every resume line checked to point at a plan file that is on disk and an artifact that matches the phase's declared output.
  • Incomplete cells, burned arms, unusable arms and orphans each asserted present on the rendered page by name.
  • An unstarted campaign reports an empty position rather than an error; an unreadable tree and an unreadable cell record are errors rather than missing rows.
  • Run against a real tree end to end through the binary.

A campaign runs unattended for hours and is picked up later, often by a
session with no memory of it. The retired instrument answered "where does
this stand" with a page assembled from a results tree, two state files, a
banked log and a ledger, plus a hand-maintained resume file that goes
stale by construction. A stale resume line is worse than none, because it
looks current.

sense-lab status derives everything from the run tree. Position is the
furthest phase of the latest cycle whose artifact is on disk and the
first whose artifact is not, so nothing hand-maintained can disagree with
what is there. The page carries the banner saying so.

The uncomfortable rows lead rather than being summarised away: incomplete
cells with their burned and unusable arms named, orphaned run directories
that spawned and recorded no terminal state, parked repositories, and
spend against the ceiling. A status that shows only progress is a status
nobody trusts twice.

Read returns a struct and Render takes one; the only consumer of that
string is a printer, and nothing else in the tree imports the package.
Parsing your own report is how a display format silently becomes a data
contract.

Deriving position found that indexing is per repository rather than per
cycle: looking for the index under every cycle would report every
re-entered repository as waiting on a scan that already happened.
@luuuc
luuuc deleted the branch lab/05-03-the-plan-files August 17, 2026 07:17
@luuuc luuuc closed this Aug 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant