Repository navigation
Conversation
…nes are alarms (Closes #8622) `tri lanes [--repo trios] [--base actors-next-2] [--clone <path>] [--dir <prefix>] [--stale 45]` prints one row per open pull request into the base (merge state, checks green / pending / RED, age in minutes, its local worktree) and one per lane worktree of the clone with no open pull request. RED, CONFLICT and STALE are the night ledger's anomalies (gHashTag/trios#1729) and exit 1; READY, PENDING, BEHIND, BLOCKED, NO PR, MERGED (the branch was merged into the base: a finished lane) and DETACHED (on no branch: not a lane) do not. No PR list from gh exits 2. Every rule is specs/tri/lanes/lanes.t27 (8 tests, 0 FAIL, 0 vacuous; 16 negative controls, each FAILs by name or by the invariant): the defaults (the ledger's 45 minutes), how a check rollup is judged (a cancelled run is red: it did not run on the head), how GitHub's UTC time is read (days_from_civil), how a branch's last commit is found by its whole name, which worktrees are lanes, the verdicts and the exit. The line readers are imported from specs/tri/lab/receipt.t27. gen/rust/tri/lanes/lanes.rs is its t27c gen-rust; cmd_lanes is glue: gh, git, print. On the loop's clone: against --base actors-next, lanes 1-9 read MERGED and the five fresh lanes NO PR, exit 0; against trios main, 3 pull requests read RED and 4 STALE, exit 1. Census moved: fetches, lines naming --limit 76 -> 78, refused as not a fetch 41 -> 43 (re-blessed in tools/census/fetches.txt). The two are cmd_lanes' `gh pr list --limit` calls; the matcher refuses them because the bound is a spec constant (lanes::PR_LIMIT, 200), not a literal. Both ARE bounded: a base with more than 200 merged lanes would show the older ones STALE (noisy, not silent). Hand-written foreign lines: +40 (cli/tri/src/main.rs), -45 (scripts/gen_w320.py, a one-off wave script whose port specs/port/scripts/gen_w320.t27 the lab verifies). Net -5. Closes #8622 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gHashTag
enabled auto-merge (squash)
October 10, 2026 13:55
Contributor
gHashTag
added a commit
that referenced
this pull request
Oct 10, 2026
…phan reaches renum.rs again (Closes #8628) (#8631) #8601, #8614 and #8623 mounted their gen-rust modules on one line each, `#[path = ...] #[allow(...)] mod x; // ...`. rustc reads that. tri mods orphan (modreach.rs edges_from) takes a line starting with `#[path` as an attribute alone and hands the path to the next `mod` line, `mod renum;`, so renum.rs (994 lines, 26 tests) read as orphaned and "Orphaned modules" went red on master (cli/tri: orphaned rose 0 -> 1). The three mounts are now two lines each, as the rest of main.rs writes them; tri mods orphan --gate: ORPHAN CEILING: CLEAN. Joining the last three lines of cmd_lab and of cmd_actors pays for them: main.rs +8 -9. Duplicate bodies (tools/dupe_scan.py): lanes.t27 pr_end was receipt.t27's object_end written again and now calls it (8 tests pass, reseal). receipt.t27 line_end is report.t27's body and stays a ledgered copy (`line_end 2`): importing it makes every importer of receipt.t27 inline report.t27 as well, and their two V_BLOCKED (3 and 2) drop out, so metrics.t27 stops compiling -- a gen closure defect, filed as #8630. The scan's remaining errors, bits and clear, were red before these PRs. Closes #8628 Co-authored-by: Claude <claude@anthropic.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #8622
Night-loop tooling (ledger gHashTag/trios#1729, item 10). Every tick the loop checked its lanes by hand: the open PRs into
actors-next-2, each PR's checks, the worktrees of the shared clone, and how long each lane had been quiet. The ledger names the anomalies to look for: a red PR, a stale agent (no change in 45 min), and a lane that conflicts with its base.What
tri lanes [--repo trios] [--base actors-next-2] [--clone <path>] [--dir <prefix>] [--stale 45]It prints two kinds of row:
pr= branch= draft= merge= checks= age_min= worktree=and a verdict.checksis the PR's statusCheckRollup, read as green, pending or RED.age_mincounts minutes since the later of two times: the PR's updatedAt and its local branch's last commit.worktreeis the lane worktree checked out on the PR's head branch.worktree= branch= age_min=and a verdict.Verdicts:
mergeStateStatusDIRTY--staleminutesExit codes: 0 when nothing raises an alarm, 1 on an alarm, 2 when gh gave no PR list.
Where the rules live
specs/tri/lanes/lanes.t27holds the rules:for-each-ref, and gh's compact list of merged heads;days_from_civil);queen-drainis notqueen-drain-bound;--diris a path prefix;The line readers are imported from
specs/tri/lab/receipt.t27.gen/rust/tri/lanes/lanes.rsis the spec'st27c gen-rustoutput.cmd_lanesis glue: gh, git, print.Evidence
t27c test-report specs/tri/lanes/lanes.t27: 8 tests, 8 pass, 0 vacuous. Seal saved. The test fixtures are gh's real answer for trios PRs Wave Loop 874 — module-scope [567][2]^6 Pt non-power-of-two outer-dimension array-of-struct variable from call with indexed signed writes #1696 and W82 R-PROXY: SSRF, path traversal, data race, duplicated headers (HIGH) #958 (shortened) and the porcelain of the loop's clone. The UTC values were checked against Python'scalendar.timegm.--base actors-next: lanes 1-9 readmerged: a finished lane, its worktree can go, and the five fresh lanes readno PR yet. Exit 0.main(paths shortened):actors-next-2, so only worktree rows print.Negative controls
Each control is one edit to a copy of the spec. Every one fails a test by name, except the last, which fails the invariant:
>for>=)--dirignoredZis readCensus moved
The
fetchescensus moved: lines naming--limitwent from 76 to 78, and lines refused as not a fetch went from 41 to 43. It is re-blessed intools/census/fetches.txt.The two new lines are
cmd_lanes'gh pr list --limitcalls. The matcher refuses them because the bound is a spec constant (lanes::PR_LIMIT, 200), not a literal. Both calls are still bounded: a base with more than 200 merged lanes would show the older ones as STALE. That failure is noisy, not silent.Foreign lines
cli/tri/src/main.rs: +40 lines of glue, at the cap.scripts/gen_w320.py: -45 lines, deleted. It is a one-off wave script that nothing runs, and the lab verifies its portspecs/port/scripts/gen_w320.t27.Net -5.
check_all(--ci) andcheck_budgetpass locally.Known limit
The ledger's rule is "no file change in 45 min", but this command reads commits and pushes, not uncommitted edits in a worktree. A lane that edits for 45 minutes without committing therefore reads as STALE.
🤖 Generated with Claude Code