fix(tri): a budget half the cost, and a fleet defined twice - #3193
Merged
Merged
Conversation
`tri whats-open --all` returned TIMEOUT after 420s for `gates dead`. Measured: that command over its default fleet takes 899 s. The budget was less than half its cost, so --all has never printed this instrument's answer -- and the answer is 15 workflows that have never succeeded across 8875 runs, the top three at 1983, 1980 and 1541 runs apiece. A budget under the measured cost does not make a slow instrument fast. It makes a working instrument unreadable, and it does it in the honest-looking way: TIMEOUT sits where a number belongs and the page reads as complete. Budget set to 1200 from the measurement, with the measurement in the comment. The module docstring said `dead` "takes over four minutes" where it is fifteen; both now carry the measured number and its date. And the fleet was two lists. `gates dead` defaulted to three repositories, `red now` to four, both doc comments calling it "the three/four this fleet uses" -- one word, two sets, and nothing saying which was right. The difference is gHashTag/ghashtag.github.io. Priced before closing: that repository has no workflow with a file and >= 50 runs at a zero success count, and reading it adds 7 seconds. The gap hid nothing today, and it is still a defect -- the next dead workflow there would have been invisible to the command whose subject is dead workflows. One fleet_repos(), both callers on it, for the reason required_contexts gives one screen above: a second caller must not become a second literal of the same query. Three tests: the list holds the repository the two disagreed about, every entry is owner/repo, and no slug appears twice. Census re-blessed, and the move is an address: deleting seven lines of literal took red.rs's runs_url from 159 to 152. Buckets identical at 25 sites, 8 / 0 / 3 / 2. Refs #2994
Contributor
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
Contributor
Contributor
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
Contributor
PR DashboardGenerated at: 2026-09-04 18:50:54 UTC
Summary
Seal Status
|
`tri gates dead` prints workflows with a zero lifetime success count. Two populations were sharing one row. Of this repository's three, TWO never executed at all: auto-merge-ready-prs.yml (1541 runs) and format-check.yml (31), with zero jobs in 8 of 8 sampled runs each. coq-proofs.yml (62 runs) is the control: one job every time, so it really ran and really failed. A run that allocates zero jobs is a startup failure -- invalid YAML, a trigger the file does not declare, a registration for a file that is gone. auto-merge-ready-prs.yml declares workflow_dispatch only and every sampled run has event=push: 1541 registrations, none of which ran a line. The two want opposite repairs -- a broken workflow FILE against a broken CHECK -- and "never succeeded" printed them identically. Now labelled, at 109 s -> 114 s, because the probe runs only for the rows the report prints. never_executed returns None when nothing was sampled: a probe that saw no run must not vote either way. The new fetch site reads as "asks whether the page filled" and is not: classify_fetch matches total_count anywhere in the body, and here that string is a jq path to a job count. What it really is has no bucket -- a declared sample, where the page size is the caller's own parameter. Named in the source rather than special-cased. Census re-blessed: sites 25 -> 26, "asks whether the page filled" 8 -> 9, both from that one site. Refs #2994
Contributor
PR DashboardGenerated at: 2026-09-04 18:55:14 UTC
Summary
Seal Status
|
Contributor
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
Three surfaces claim to gate a commit -- .githooks/pre-commit, scripts/pre-commit and `tri hooks pre-commit` -- and `grep -c conflict` answers 0 on all three. In this worktree core.hooksPath is unset and .git/hooks/pre-commit does not exist, so nothing local ran at all. The only barrier was CI, and that is how it went wrong the same pass: an automated conflict resolver fixed one path and then ran `git add -A`, staging a SECOND conflicted file verbatim. The required Conflict markers context caught it on the pull request, naming tools/census/fetches.txt lines 19 and 35 -- one full CI round after a one-second local check would have refused the commit. A guard that lives in a procedure stops only the person who remembers it. This repository's skill file had recorded the very command and said it "has stopped two commits since"; it was wired nowhere, and mine was not one of the two. Not a sixth reader: tools/check_conflict_markers.py already reads every tracked file from the working tree and honours its own debt baseline, so a re-implementation would be a second vocabulary that drifts. This calls it. A missing script or interpreter exits 2 -- this repository's word for could-not-run -- rather than passing, because a guard that cannot run is not a guard that agreed. Three controls, all run: a planted marker gives exit 1 naming the file and its lines, a moved-aside checker gives exit 2 saying nothing was checked, and a clean tree gives 0. Refs #2994
…a control The first version of the conflict-marker guard used a relative path. A git hook is invoked at the repository root, but a person typing the command often is not, and from cli/tri it refused with exit 2 -- safe and useless. The checker itself needs no help: run from cli/ it still reads all 7870 tracked files, so the only thing that needed fixing was finding it. Now resolved from `git rev-parse --show-toplevel` and run there. Four controls, all run: clean tree from the root 0, clean tree from cli/tri 0, planted marker 1 naming the file and its lines, moved-aside checker 2. A fifth was written and withdrawn rather than claimed. An arm returning exit 2 outside a work tree looked like a good refusal; run from /tmp it returned 1, because now_gate runs `git rev-parse` first and errors there. The arm is unreachable through this command, so it is now ordinary defence and the comment says it is not a control. A guard clause you have not executed is a comment, and a comment claiming to be a control is worse than no comment. Refs #2994
Contributor
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
Contributor
PR DashboardGenerated at: 2026-09-04 19:02:22 UTC
Summary
Seal Status
|
Contributor
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
Contributor
PR DashboardGenerated at: 2026-09-04 19:03:24 UTC
Summary
Seal Status
|
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.
tri whats-open --allreturnedTIMEOUT after 420sforgates dead.Measured: that command over its default fleet takes 899 s. The budget was less than half its cost, so
--allhas never printed this instrument's answer — and the answer is not small: 15 workflows have never succeeded, across 8875 runs, the top three at 1983, 1980 and 1541 runs apiece.A budget under the measured cost does not make a slow instrument fast. It makes a working instrument unreadable — and in the honest-looking way:
TIMEOUTsits where a number belongs, so the page reads as complete and the reading is missing.Budget set to 1200 from the measurement, with the measurement in the comment. The module docstring said
dead"takes over four minutes" where it is fifteen; both now carry the measured number and its date.And the fleet was two lists
gates deadred nowBoth doc comments called it "the three/four this fleet uses" — one word, two sets, nothing saying which was right. The difference is
gHashTag/ghashtag.github.io.Priced before closing: that repository has no workflow with a file and ≥ 50 runs at a zero success count, and reading it adds 7 seconds. So the gap hid nothing today. It is still a defect — the next dead workflow there would have been invisible to the command whose entire subject is dead workflows, and no reader could tell which list to believe.
One
fleet_repos(), both callers on it, for the reasonrequired_contextsgives one screen above in the same file: a second caller must not become a second literal of the same query.Three tests: the list holds the disputed repository, every entry is
owner/repo(a bare name reads as a different repository togh), and no slug appears twice (a duplicate would double that repository's runs in every count).Census
Re-blessed here, and the move is an address: deleting seven lines of literal took
red.rs'sruns_urlfrom 159 to 152. The buckets are identical — 25 sites, 8 / 0 / 3 / 2 — which is the check that says the move is address and not substance.Refs #2994