From ac79f2106ecf8ecd63e80b08382274668d5f3571 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Wed, 5 Aug 2026 19:50:44 -0700 Subject: [PATCH 1/3] Fold the onboarding-feedback pass into the backlog Two days of onboarding more repositories to the hub produced seventeen recorded observations. Each was checked against `develop` at `b82c1a3`, the committed `TODO.md`, and the eleven open issues before being written down, because the value of the pass is in what is genuinely uncovered rather than in the count. Ten are new entries. Three amend an entry that had already reasoned about the same surface from one example and needed the second. One was already covered and is left alone. Two are rules that already exist and already state the common case, where what recurs is the case the rule leaves unstated. ## The three amendments, each adding the example the entry was missing | Entry | What it gains | | --- | --- | | Reduce the copied surface | The wanted end state, and that the fleet already runs both models without either having been chosen | | Name hub-only machinery | The measured cost, agents rebuilding worse versions of gates that already exist | | The `hugo` type | That the theme carry mechanism is undecided, as a question about the type rather than about one repository | ## Two already-documented rules, where the wording is the defect `Closes #N` is stated and carried, so agents re-deriving it are missing it rather than lacking it. What is genuinely absent is the case that produces the confusion: work complete on `develop` with no promotion imminent, which the current text does not license closing. The clickable-link rule gets the hard part right, that a prompt renders no link, so the reference inside it is bare and the link goes in the message that accompanies it. It says accompanying rather than preceding, and a message emitted after the prompt is not read before the question is answered, which is the whole outcome the rule exists to produce. Reading both recurrences as underspecified wording rather than as the rule being ignored is what makes them fixable. ## One entry records a live defect rather than a preference The README intro spec and the `HISTORY.md` mirror rule together forbid a second paragraph, and `spec/audit.py` measures the first non-empty line, so a legitimate second paragraph is reported. That is the same axis as declaring the description in the registry, so the two are noted as wanting one decision rather than two. Co-authored-by: Claude Opus 5 (1M context) --- TODO.md | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/TODO.md b/TODO.md index 04c96d48..dd62ea6d 100644 --- a/TODO.md +++ b/TODO.md @@ -2,7 +2,7 @@ Running backlog for this repo, kept in a committed file so the guidance survives across environments where agent memory does not. Entries are grouped by the surface they change rather than by priority, since an entry's cost is mostly set by what it touches. Where an open issue covers the same ground it is named on the entry, so the two are read together rather than worked twice. -Every issue claim below was re-checked against `develop` at `1ed0cc8` on 2026-08-03. An issue records the tree as it was on the day it was filed, so a claim in one is a starting point for a check rather than a finding to act on. +Every issue claim below was re-checked against `develop` at `1ed0cc8` on 2026-08-03, and the entries added from the onboarding-feedback pass were checked against `develop` at `b82c1a3` on 2026-08-05. An issue records the tree as it was on the day it was filed, so a claim in one is a starting point for a check rather than a finding to act on. ## Verified Complete, Awaiting Close @@ -24,6 +24,8 @@ The gates in [`scripts/`][scripts] are hub-only and are the fleet's main defense - Teach the `sha-pin` check in [`repo_gate.py`][repo-gate] to verify a pin **resolves**, not merely that it is shaped like a SHA. Forty hex characters is a format any fabricated string satisfies, and an agent hand-writing a plausible SHA into a workflow is a real failure mode rather than a hypothetical one. A resolvability check also catches the neighboring case, a pin whose commit was reachable only from a branch that has since been squashed and deleted, which breaks a downstream gate long after the change that caused it. Scope the network call to same-owner repositories, where the fleet's own actions live, and skip rather than fail when the host is offline so the local gate stays usable. Note that the existing `gh-write-guard` hook cannot cover this, since it watches Bash and an editor tool writing the same string into a file never reaches it. - Add a check that a pull request's **description** does not contradict its own branch. Three stale descriptions in one session generated six review findings between them, each one a reviewer noticing that the body named a commit, a branch, or a behavior the branch no longer carried. The cheap and precise form is to extract SHAs and `uses:` refs quoted in the body and confirm each still appears in the head tree, since those are the claims that go stale silently and the ones a reviewer actually catches. Prose claims are out of scope, and deliberately so: judging those needs a similarity heuristic, which [`spec/section-model.md`][section-model] already rejects for exactly the reason it would fail here. - Reconsider whether the pre-commit hook should run the doc gates now that they are diff-scoped. [`scripts/README.md`][scripts] records the current decision and its reason, that doc linters stay out of the hook so it stays fast, and that reason was sound when the only mode was a whole-tree sweep. A `--diff` run reads the lines one commit touches and finishes in about a second, so the trade has moved. The failure it would prevent is the most repeated one on record: comment sentences wrapped across lines, caught by CI or by a reviewer after the commit rather than before it, over and over within a single session. Weigh it against the standing preference for a fast hook, and against the risk of a hook that runs the gate from the wrong directory, which is its own false clean. +- Audit the fleet's shell surface by size and branching, and decide per script whether Python with unit tests is the cheaper form. The evidence is the review record rather than a language preference: a non-trivial shell script earns findings round after round, while every gate under [`scripts/`][scripts] carries a `test_