diff --git a/.agents/skills/fleet-pane/SKILL.md b/.agents/skills/fleet-pane/SKILL.md index 2a7db03..789ae1c 100644 --- a/.agents/skills/fleet-pane/SKILL.md +++ b/.agents/skills/fleet-pane/SKILL.md @@ -89,10 +89,14 @@ became one. Every word on it comes off `task.yaml`'s `publish` block, written by pane calls no `gh` and says nothing `queue.sh show` would not print in the same word. Colour carries the verdict, and **`green` is not the ok colour**: it means every gate the forge knows about holds and nobody vetted it, which is a -different claim from `ready` and is why fleet will not merge it for you. A -narrow column drops the parts in a fixed order — the `— yours to merge` note, -then the method, then the age, then the `#44` — and the link survives losing its -label. +different claim from `ready` and is why fleet will not merge it for you. The +note beside a state is its next move, not its colour — `— yours to merge` on +green, `— review` on `open`, since `open` is a fact `collect` proved, not a +verdict, and gets no colour that would claim one. A narrow column drops the +parts in a fixed order — the method first, then the note, then the age, then +the `#44` — and the link survives losing its label. `interface/fleet_queue.lua` +(`PUBLISH_WORD`, `PUBLISH_LADDER`) is the owner of that order and argues it in +place. **No row is drawn for a task with nothing to report about its publish**: a record from before `publish` existed, or a task whose publish has not started. diff --git a/interface/fleet_queue.lua b/interface/fleet_queue.lua index c53421c..07e2448 100644 --- a/interface/fleet_queue.lua +++ b/interface/fleet_queue.lua @@ -126,6 +126,14 @@ -- A task with an artifact is one row SHORTER than it was before this row -- existed, and no task is taller. -- +-- AND IT SAYS THE NEXT MOVE, NOT ONLY THE STATE. `open` and `green` are facts +-- about a pull request; `review` and `yours to merge` are what the operator +-- does about them, and colour can carry the first but never the second. That +-- word used to be the first thing the row's width ladder dropped, so it was +-- drawn at neither width `scripts/pane-selftest.sh` renders while the publish +-- METHOD — one unchanging word under every task in the queue — was drawn at +-- both. The ladder gives up provenance before it gives up the action now. +-- -- FOLLOW-UP, WRITTEN DOWN RATHER THAN DONE: the probe below should become -- `queue.sh list --tsv`. That would make "this pane cannot disagree with -- `list`" literal instead of argued, and it would drop a dozen `sed`/`awk`/ @@ -873,12 +881,28 @@ local BLOCKER_KIND = { --- here, or by repainting `green` with `theme.ok` because warn "looks like a --- problem" — converts fleet's evidence-over-trust property back into trust, --- silently, and it is the sharpest risk this row's design names. The note ---- beside it says whose job the merge is, and it is the first thing the ladder ---- below drops. +--- beside it says whose job the merge is, which the ladder below now keeps +--- ahead of the method rather than dropping first. --- --- `open` is muted rather than ok on purpose: `collect` proved the pull request --- exists and comes from this task's branch, and nothing has yet looked at its --- checks. That is a fact, not a verdict, so it gets no colour that reads as one. +--- Muted next to a collapsed `n landed` row reads as SETTLED, though, and it is +--- the opposite: `open` is the state every task passes through on its way to a +--- review nobody has done yet. So it carries a NOTE instead of a colour — the +--- one mechanism here that can say what to do without claiming a verdict, and +--- `green` already used it. The note is what `descriptors` says of a `done` +--- task in its own words: the pull request is open and the next move is to +--- review it. One word, because the ladder below keeps a note only while the +--- whole row fits, and thirty columns is the width this pane is usually given: +--- `open — review` clears it and `open — review it` misses it by one column. +--- +--- `green` KEEPS ITS LONGER NOTE AND THEREFORE LOSES IT AT THIRTY. `yours to +--- merge` will not fit beside a reference and an age in a 30-column column, and +--- the obvious shortening — `merge` — puts a word one letter from `merged` in +--- the same column that draws `merged`, which is a worse row than no note. It +--- says whose job the merge is, which is the half `green` itself cannot carry, +--- and that half is worth more at 44 than a hazard is at 30. --- --- A state this table does not know is drawn verbatim and muted — the same rule --- `BLOCKER_KIND` follows, and for the same reason: an unknown word is shown, @@ -886,7 +910,7 @@ local BLOCKER_KIND = { local PUBLISH_WORD = { unverified = { text = "UNVERIFIED", tone = "bad" }, unknown = { text = "unknown", tone = "muted" }, - open = { text = "open", tone = "muted" }, + open = { text = "open", tone = "muted", note = "review" }, pushed = { text = "pushed ✓", tone = "ok" }, draft = { text = "draft", tone = "warn" }, ["checks-running"] = { text = "checks ⟳", tone = "warn" }, @@ -907,17 +931,26 @@ local PUBLISH_GLYPH = "⇡" --- What the publish row gives up as the column narrows, in order. --- --- The same shape `note_spans` uses — drop in a fixed order, truncate last — ---- and the order is what each part is FOR. The NOTE goes first: it is a ---- sentence about whose job a merge is, and the coloured word already carries ---- the fact. The METHOD next, because it is a property of the task that never ---- changes and the pull request page says it anyway, while the STATE is the ---- part an operator acts on. Then the AGE, then the artifact REFERENCE — which ---- is a label for the link this row carries, and the link survives losing its ---- label. Then the glyph. The state word is the last thing standing, and it is ---- truncated only when the column is narrower than the word itself. +--- and the order is what each part is FOR. The METHOD goes first, because it is +--- a property of the task that never changes, the brief that dispatched the task +--- declared it, and the pull request page says it anyway. The NOTE next. Then +--- the AGE, then the artifact REFERENCE — which is a label for the link this row +--- carries, and the link survives losing its label. Then the glyph. The state +--- word is the last thing standing, and it is truncated only when the column is +--- narrower than the word itself. +--- +--- THE NOTE USED TO GO FIRST AND THEREFORE NEVER WENT ANYWHERE. `yours to +--- merge` costs 21 columns beside its word, which put the full rung over budget +--- at 44 and far over it at 30 — the two widths `scripts/pane-selftest.sh` +--- renders, and 30 is what this pane routinely gets. So the one segment that +--- answers "what do I do about this" was drawn at no width an operator has, +--- while `no-mistakes` — the same word under every task in a fleet with one +--- publish method — was drawn at both. The note is the row's ACTION and the +--- method is its provenance; provenance is what a column this narrow can afford +--- to lose. local PUBLISH_LADDER = { { note = true, method = true, ref = true, age = true, glyph = true }, - { method = true, ref = true, age = true, glyph = true }, + { note = true, ref = true, age = true, glyph = true }, { ref = true, age = true, glyph = true }, { ref = true, glyph = true }, { glyph = true }, @@ -1192,6 +1225,13 @@ end --- something about, and muted for a fact with no verdict attached. The table --- above owns which is which, and owns the argument for `green`. --- +--- AND THE NOTE CARRIES THE NEXT MOVE, WHICH COLOUR CANNOT. A tone says how +--- worried to be; it cannot say `review` rather than `merge`, and those are +--- different actions on rows that sit two lines apart. It is also the only way +--- to say anything about a state whose whole point is that it has no verdict: +--- `open` stays muted and still says what to do. The ladder above keeps it +--- ahead of the method for that reason. +--- --- THE AGE IS THE AGE OF THE LOOK, not of the task. The shepherd runs on the --- lead's cadence rather than on a clock, so a `checks ⟳` recorded forty --- minutes ago has to read forty minutes old — a state word with no age diff --git a/scripts/lib/pane_harness.lua b/scripts/lib/pane_harness.lua index 6e3e252..ee0f695 100644 --- a/scripts/lib/pane_harness.lua +++ b/scripts/lib/pane_harness.lua @@ -219,6 +219,12 @@ _G.thurbox = { taken_at_ms = NOW * 1000, sessions = {}, runs = {} } -- a RUNNING topic that also holds a task the forge already merged, a chain of -- blockers of which one is long since cleared, tasks nothing has emitted an -- event for, and one settled topic underneath. +-- +-- It also holds the publish state EVERY task passes through and no fixture used +-- to reach: `open`, on a task `shepherd` linked by head branch before `collect` +-- read the worker's result. That is why the pane's most common publish row went +-- unrendered by anything that could be argued with, and it is the row the +-- operator's next move — review it — hangs off. local function ago(minutes) return NOW - minutes * 60 end @@ -275,7 +281,9 @@ local TOPICS = { }, { id = "03-drop-the-webui-selftest", state = "dispatched", title = "Drop the monitor's selftest and its CI job", + artifact = "https://github.com/Thurbeen/fleet/pull/52", brief = 1, events = 2, result = 1, moved = ago(3), + publish = { "no-mistakes", "open", ago(3) }, }, }, }, diff --git a/scripts/pane-selftest.sh b/scripts/pane-selftest.sh index 5f883f4..7ceb55e 100755 --- a/scripts/pane-selftest.sh +++ b/scripts/pane-selftest.sh @@ -24,6 +24,12 @@ # 4. THE TWO TALLIES AGREE. The counter row counts TASKS by state; a section # heading covers TOPICS. They were both drawn as bare numbers, and # `4 running` above `RUNNING 5` is the pane contradicting itself. +# 5. THE PUBLISH ROW SAYS THE NEXT MOVE, AT BOTH WIDTHS. A state word is a +# fact about the pull request; what the operator does about it is a +# second thing, and the row's `note` is where it lives. The note was the +# FIRST thing the width ladder dropped, so it reached neither width this +# file renders while `no-mistakes` — one word under every task in the +# queue — reached both. These assert the order that fixes it. # # And the rule none of that may cost: it still degrades. The pane routinely # gets thirty columns, so every assertion here runs at 30 as well as at 44. @@ -117,6 +123,23 @@ expect "a result nothing has collected is still said" "uncollected" "$WIDE" expect "the pull request is still named" "#47" "$WIDE" expect "the publish verdict is still drawn" "green" "$WIDE" +# --- 5. the publish row says the next move ---------------------------------- + +# `open` is the state EVERY task passes through — `collect` proved the pull +# request exists and nothing has looked at its checks yet — and it is drawn +# muted, because a fact is not a verdict. Muted beside a collapsed `n landed` +# row reads as settled, which is the opposite of what it means, so the row says +# the move in words instead of borrowing a colour that would claim one. +expect "an open pull request says what to do about it" "open — review" "$WIDE" +expect "and the second pull request is named" "#52" "$WIDE" +expect "a green one still says whose merge it is" "green — yours to merge" "$WIDE" + +# The order the ladder gives things up in, pinned: the METHOD is provenance and +# the NOTE is the action, so a row too narrow for both keeps the action. Before +# this, `no-mistakes · #47 · green` is what 44 columns drew and the note was +# drawn at no width at all. +refute "the method gives way to the note, not the reverse" "no-mistakes · #47" "$WIDE" + # A blocker recorded against a task that is NOT waiting holds nothing — # `queue.py` clears a `queued` task and no other — so drawing it would explain # why a task is stuck about a task that is running. @@ -162,5 +185,8 @@ fi expect "the running work is still named at 30" "Cut the pane back" "$NARROW" expect "the blocker that holds is still there at 30" "↳ 02-shepherd" "$NARROW" refute "and still no cleared blocker" "✓ 01-declare" "$NARROW" +# The width the pane routinely gets, which is the whole reason the note moved +# up the ladder: a next move drawn only at 44 is a next move nobody reads. +expect "the next move survives 30 columns" "open — review" "$NARROW" exit "$failed"