feat(tri): tri fleet — is the hardware this plan assumes actually attached? - #2250
Conversation
PR DashboardGenerated at: 2026-08-19 19:31:27 UTC
Summary
Seal Status
|
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
1 similar comment
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
PR DashboardGenerated at: 2026-08-19 20:04:05 UTC
Summary
Seal Status
|
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
PR DashboardGenerated at: 2026-08-19 20:12:48 UTC
Summary
Seal Status
|
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
PR DashboardGenerated at: 2026-08-19 20:30:03 UTC
Summary
Seal Status
|
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
PR DashboardGenerated at: 2026-08-19 21:24:09 UTC
Summary
Seal Status
|
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
PR DashboardGenerated at: 2026-08-19 21:25:23 UTC
Summary
Seal Status
|
PR DashboardGenerated at: 2026-08-19 21:42:56 UTC
Summary
Seal Status
|
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
PR DashboardGenerated at: 2026-08-19 22:23:51 UTC
Summary
Seal Status
|
…e NOW frame The default branch's HEAD is not the default branch: a check that did not run on HEAD shows neither green nor red there, and reading HEAD alone made a broken master build look green (#2227). pr ready now scores each check by the most recent of the last 15 default-branch commits it actually ran on. tri now prepends the rigid docs/NOW.md entry frame; its own NOW entry was written by the command. Smoke: live verdict against a merged PR is sane. Closes #2235 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tached? Three notes in this project claim hardware capability in the present tense while no board was on the bus: each was true when measured, none was true that day. A measurement stays true because it happened; a capability quietly becomes false when the environment regresses, and nothing announces it. The notes even said 'a configured fleet is a perishable measurement' -- the instinct was recorded and never turned into a check. tri fleet scan reads the USB tree (ioreg) and the serial device nodes, excludes Bluetooth and the debug console, and reports what is actually present. On an empty bus it refuses to be useful in the wrong direction: it prints the sentence to send the owner instead of a problem to code around. --expect N exits non-zero when the fleet is short. On a non-macOS host it says it cannot tell, because 'no boards' and 'cannot tell' are different answers and only one is safe to act on. Smoke-tested against the real bus: 0 bridges, 0 serial nodes, non-zero exit under --expect 3. Closes #2249 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Writing this wave's own NOW entry failed: the bullet describing --expect was read by clap as an argument. allow_hyphen_values, and the entry that found it is the entry this commit adds.
The bus was one environment; a deployed site is another, and both go stale the same way: the note says 'works' because it worked, and nothing announces the regression. asof HEADs each URL the claim depends on, adds the bus under --needs-hardware, and reports whether the capability may be stated in the present tense today -- non-zero exit when it may not. A curl timeout is reported as 'cannot verify', distinct from a site that answers with an error: only one of those is the owner's problem. Verified live: t27.ai and the hiking site reachable, bus empty, exit 1 under --needs-hardware.
…ository Remembering which environments back which claim is the step that gets skipped, so the claims live in .tri/environments.json next to the code they describe. The check answers per claim, not per project: 'is the project fine' has no answer, because claims rest on different environments and those fail independently. Live against this repository's own declaration: three claims SAYABLE (t27.ai, the hiking site, GitHub), two STALE with the reason printed next to each (bus empty), exit 1. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every 'waiting: N of M' line carried no identity, so two gates logging to one file produced a transcript where one PR's 'Merged.' read as the other's verdict — I misread exactly that today. Diagnosing through a channel shared by two sources is the broken-ruler error this project's doctrine is named after; the identity now prints before the wait loop and on every line, which makes the misread impossible rather than unlikely. Closes #2249
'merged' and 'closed' both read as success in a pull-request list. A stack taught this the expensive way: the base squash-merged, its branch was deleted, the pull request stacked on it auto-closed, and four commits reached nothing while the list looked fine. landed fetches the default branch's copy of every file the pull request touched and reports each probe PRESENT or ABSENT. Whitespace is flattened on both sides because prose gets re-wrapped; case stays significant because case is text. Validated against the real case: the orphaned stack-mate reports ABSENT, the merged rescue reports PRESENT. Closes #2249
Sweeping eight merged pull requests with landed found one ABSENT that was the probe's fault again: the string came from a pull request still open, which had rewritten that sentence. All eight had in fact landed. Probe with the wording the pull request introduced, not with today's text.
Every pull request must touch docs/NOW.md and it is prepend-only, so two branches conflict there by construction — seven times in this campaign, each resolved identically by hand: keep both entries. The union driver makes that resolution the rule instead of a habit somebody will skip.
…t conflicts .gitattributes declares `NOW.md merge=theirs`, but the file every branch touches is docs/NOW.md, and `theirs` is not a built-in driver — it needs a per-clone .git/config entry a fresh checkout does not have. Both halves failed silently: docs/NOW.md conflicted on seven branches in this campaign and was resolved identically by hand each time, keeping both entries. `docs/NOW.md merge=union` is built in, needs no setup, and is that resolution. Closes #2249
gh pr merge exiting zero is not the same as the content being on the
branch — it also succeeds when it merely enables auto-merge, and a
squash-merged stack orphans whatever sat on top of it. The gate now
re-asks the API for merged=true, takes the merge commit sha, and confirms
that commit is contained in the default branch before printing anything.
The message names what was verified ('Merged — <sha> is on the default
branch'), and on a mismatch it says plainly not to report the pull
request as merged. This is the same defect the campaign hit twice: a
verdict that reads as success while the work reached nothing.
Closes #2249
.gitattributes declared merge=append-log for the experience JSONL and merge=theirs for the NOW.md symlink. Neither is a built-in driver: both need a merge.<name>.driver entry in .git/config, and nothing in this checkout installs one — so in any clone but the author's, both lines did nothing and the files conflicted normally. Union is built in and is exactly the intended behaviour for append-only files. Same defect as the docs/NOW.md rule fixed alongside it: a rule that needs undocumented local setup works only on the machine that wrote it.
The pre-commit gate tested '^NOW.md$' while every pull request updates docs/NOW.md, so the not-staged warning fired on commits that were doing exactly the right thing. It now accepts either path. Root NOW.md is a regular 390-line file last changed 2026-08-09 -- not the symlink .gitattributes describes -- so the two have been diverging in silence. Whether the root copy becomes a symlink, is deleted, or keeps its own content is the owner's call; filed rather than decided here.
76c258d to
693564b
Compare
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
PR DashboardGenerated at: 2026-08-19 23:07:57 UTC
Summary
Seal Status
|
Carries wave 2 (pr-ready per-check commit-walk baseline +
tri now) which #2223 landed without, plustri fleet scan. Closes #2249🤖 Generated with Claude Code