You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Filed from ptr727/Blog, audited against hub main3b802b9 and hub develop65287f1 (re-verified immediately before filing; develop moved from 2a1afc0 to 65287f1 during the run and the entry below is unchanged on both).
Blog re-audited itself after #560 landed, applied what the run found in ptr727/Blog#34, and hand-evaluated the nine hugo checks. Eight pass, one is a real drift on Blog's side. In the course of that, three claims in #560's own record do not hold against the tooling.
1. The two hugo driftNotes describe work that was already finished when they were written
registry/repos.json (develop) carries these on the Blog entry:
The vendored theme under themes/ records no upstream repository, ref, or commit, is not a submodule, and no Dependabot ecosystem covers it, so it cannot be moved or diffed against upstream (hugo.vendored.provenance).
The generator version and its checksum are pinned in both validate-task.yml and deploy-site-task.yml with nothing asserting the two copies agree, so a one-sided bump validates and deploys different generators (hugo.generator.pinned).
Both were fixed in ptr727/Blog#30, merged 2026-08-05T02:52Z, about six hours before #560 merged. Measured now:
hugo.vendored.provenance: themes/README.md:12 records the upstream repository, the commit 154d006e…, its upstream commit date, git describe, the license location, and both local edits with the reason each is in a documented extension point.
hugo.generator.pinned: the version and SHA256 are declared once, at .github/actions/install-hugo/action.yml:26, and both workflows consume that composite action rather than carrying a copy.
Recorded as driftNotes naming their check id, so the next audit retires them mechanically.
2. Nothing retires them mechanically, for two independent reasons
The freshness check never runs for Blog.spec/audit.py:826 gates it on if not findings:. Blog carries a standing finding it cannot clear, the carried: AGENTS.md references the template repo one that is #552, so the gate does not open however clean the rest is. Any repo with one unclearable finding has its whole driftNotes list exempted from freshness, which is the inverse of what you want: a repo with outstanding findings is the one whose notes are most likely to be stale.
Neither note would match anyway.spec/audit.py:53 matches PENDING_MARKERS = ["pending", "not yet", "owed", "todo", "still", "behind", "missing", "absent"] as whole words. Run against all six of Blog's notes, none matches. The two hugo notes are written in the present indicative ("records no upstream repository", "with nothing asserting the two copies agree"), which is the house style for a note and carries no marker word.
A note that names a check id is the mechanically checkable case, and it is the one shape the matcher cannot see. Matching \(([a-z]+\.[a-z.]+)\)$ against a note, then reporting when that check's dimension passes, would retire exactly the notes #560 intended to be retired and would not touch a permanent-deviation note.
3. No hugo check is mechanized, so "the next audit" is a hand evaluation
spec/audit.py contains zero references to spec/project-types.json; the only reader is spec/validate.py, which proves the catalog self-consistent rather than measuring a repo. So a clean audit.py run says nothing about any of the nine hugo checks, and the same holds for every other type's checks.
AUDIT.md section 4 is clear that per-dimension checks are judged by hand, so this is not a defect. It is worth naming because #560 introduced nine checks and a retirement path that reads as automatic, and because an agent reading a clean run as evidence about them is the empty-query failure this fleet keeps hitting. Blog's report records each of the nine with the file:line it was judged against, for that reason.
4. One hugo check finds a real drift on Blog, and the check is right
hugo.deploy.retention. Blog's deploy credential is a forced rsync command confined write-only, so the prune belongs to the host, and that ownership is recorded at OPERATIONS.md:176. The count is not: the "Ten releases are kept" above it describes deploy/make-release.sh on the local mirrors, not the containers on the VPS, so the destination the pipeline actually writes to has no declared count. Blog is tracking that in its own TODO.md, since the count is the host's to declare. Reported here as evidence that the corrected check bites where it should, rather than as anything the hub owes.
Suggested resolution
Drop the two hugo driftNotes from Blog's registry entry, since the deviations they record are closed.
Either ungate the freshness check from if not findings: or gate it per dimension, so a repo with an unrelated standing finding still has its notes checked.
Add the check-id form to the freshness matcher, so a note naming a check is retired when that check passes.
Filed from
ptr727/Blog, audited against hubmain3b802b9and hubdevelop65287f1(re-verified immediately before filing;developmoved from2a1afc0to65287f1during the run and the entry below is unchanged on both).Blog re-audited itself after #560 landed, applied what the run found in ptr727/Blog#34, and hand-evaluated the nine
hugochecks. Eight pass, one is a real drift on Blog's side. In the course of that, three claims in #560's own record do not hold against the tooling.1. The two
hugodriftNotes describe work that was already finished when they were writtenregistry/repos.json(develop) carries these on the Blog entry:Both were fixed in ptr727/Blog#30, merged 2026-08-05T02:52Z, about six hours before #560 merged. Measured now:
hugo.vendored.provenance:themes/README.md:12records the upstream repository, the commit154d006e…, its upstream commit date,git describe, the license location, and both local edits with the reason each is in a documented extension point.hugo.generator.pinned: the version and SHA256 are declared once, at.github/actions/install-hugo/action.yml:26, and both workflows consume that composite action rather than carrying a copy.#560's body anticipated this and said so:
2. Nothing retires them mechanically, for two independent reasons
The freshness check never runs for Blog.
spec/audit.py:826gates it onif not findings:. Blog carries a standing finding it cannot clear, thecarried: AGENTS.md references the template repoone that is #552, so the gate does not open however clean the rest is. Any repo with one unclearable finding has its wholedriftNoteslist exempted from freshness, which is the inverse of what you want: a repo with outstanding findings is the one whose notes are most likely to be stale.Neither note would match anyway.
spec/audit.py:53matchesPENDING_MARKERS = ["pending", "not yet", "owed", "todo", "still", "behind", "missing", "absent"]as whole words. Run against all six of Blog's notes, none matches. The twohugonotes are written in the present indicative ("records no upstream repository", "with nothing asserting the two copies agree"), which is the house style for a note and carries no marker word.A note that names a check id is the mechanically checkable case, and it is the one shape the matcher cannot see. Matching
\(([a-z]+\.[a-z.]+)\)$against a note, then reporting when that check's dimension passes, would retire exactly the notes #560 intended to be retired and would not touch a permanent-deviation note.3. No
hugocheck is mechanized, so "the next audit" is a hand evaluationspec/audit.pycontains zero references tospec/project-types.json; the only reader isspec/validate.py, which proves the catalog self-consistent rather than measuring a repo. So a cleanaudit.pyrun says nothing about any of the ninehugochecks, and the same holds for every other type's checks.AUDIT.mdsection 4 is clear that per-dimension checks are judged by hand, so this is not a defect. It is worth naming because #560 introduced nine checks and a retirement path that reads as automatic, and because an agent reading a clean run as evidence about them is the empty-query failure this fleet keeps hitting. Blog's report records each of the nine with thefile:lineit was judged against, for that reason.4. One
hugocheck finds a real drift on Blog, and the check is righthugo.deploy.retention. Blog's deploy credential is a forcedrsynccommand confined write-only, so the prune belongs to the host, and that ownership is recorded atOPERATIONS.md:176. The count is not: the "Ten releases are kept" above it describesdeploy/make-release.shon the local mirrors, not the containers on the VPS, so the destination the pipeline actually writes to has no declared count. Blog is tracking that in its ownTODO.md, since the count is the host's to declare. Reported here as evidence that the corrected check bites where it should, rather than as anything the hub owes.Suggested resolution
hugodriftNotes from Blog's registry entry, since the deviations they record are closed.if not findings:or gate it per dimension, so a repo with an unrelated standing finding still has its notes checked.