Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions .agents/skills/fleet-pane/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
64 changes: 52 additions & 12 deletions interface/fleet_queue.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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`/
Expand Down Expand Up @@ -873,20 +881,36 @@ 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,
--- never mapped to a plausible one.
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" },
Expand All @@ -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 },
Expand Down Expand Up @@ -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
Expand Down
8 changes: 8 additions & 0 deletions scripts/lib/pane_harness.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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) },
},
},
},
Expand Down
26 changes: 26 additions & 0 deletions scripts/pane-selftest.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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"