Five spec questions surfaced by the PhotoCleaner conformance sweep of 2026-08-01, raised per AUDIT.md section 9 rather than resolved downstream. Three are hub-side defects that re-vendor fleet-wide, so each wants its own change.
Run stamp: audit run 2026-08-01T15:30:19Z | hub 6501479. The report is refreshed in #508, and PhotoCleaner PRs #26-#31 merged the convergence.
1. .github/copilot-instructions.md still describes the pre-split AGENTS.md
The carried Reviewing Carried Fleet Content section says:
Most of AGENTS.md is universal fleet law: every section that states a rule, as opposed to the two that describe this repository's own directory tree and devcontainer, is byte-locked ...
After the router split that is wrong in both halves. The rule sections live in GOVERNANCE.md, and it is GOVERNANCE.md that holds the two intent sections (Devcontainer, Repository Layout); AGENTS.md carries exactly two verbatim sections and no repo-specific ones.
This is carried at intent, so PhotoCleaner adapted the wording on the way down. Every other repo that carries the section inherits the stale description, and a reviewer following it looks for byte-locked rule text in the wrong file.
2. CODESTYLE.md contradicts .markdownlint-cli2.jsonc on MD033
CODESTYLE.md "Markdown and Spelling" item 1 says:
MD033 inline HTML stays enabled: HTML comments are permitted (markdownlint does not flag them), HTML elements are flagged, and anything with a native markdown equivalent uses the markdown.
The canonical config now sets "MD033": { "allowed_elements": ["details", "summary"] }, so two elements are not flagged. The prose was not swept when the config changed, which is the GOVERNANCE.md rule "when you change a behavior, search for prose that asserts the old one" applied to the hub's own files.
3. spec/readme-structure.md has no behavior for a private repository
shields.io cannot read a private repo, so every GitHub-sourced badge in Build Status and Releases renders broken. The spec states no behavior for that case, and section 2 reads as unconditional.
This is not a corner case: a repo is often private precisely while it is being made presentable, which is exactly when its README is written. PhotoCleaner is private now and goes public later, so its README carries Docker Hub shields only and picks up the GitHub ones at the visibility flip. Worth a sentence in the spec saying whether the GitHub-sourced shields are deferred or written-and-broken, so each repo does not decide separately.
4. The HISTORY.md mirror rule has no carried home
spec/readme-structure.md owns it and spec/audit.py enforces it, but that file is hub-only, so a downstream repo cannot point at the rule it is measured against. PhotoCleaner kept it as repo-local prose in CODESTYLE.md for want of a destination, which is duplication the fleet normally avoids.
Either promote it into a carried section, or state plainly that mechanical-only enforcement is the intent so downstream stops inventing a local copy.
5. WORKFLOW.md D2.2 "skipped on smoke" is ambiguous
D2.2 says the gate "is skipped on smoke". That names the validation, and scenario S1 confirms it: validate-release **skipped (smoke), succeeds**.
A Copilot review on PhotoCleaner#29 read it as the GitHub job status and proposed a job-level if: !inputs.smoke. That would have been a real regression: github-release has validate-release in its needs, and a skipped need skips the dependent, so the release job would have been coupled to smoke through a second path on top of the if: it already carries.
The canonical is right; the wording invites the misreading. Something like "the check exits early on smoke, and the job still reports success" would close it.
Not a spec question
A sixth item was raised with the PhotoCleaner maintainer and is answered: the repo is private deliberately and temporarily, going public once the conformance work settles, so the declared github-release channel becomes satisfiable at that flip rather than being wrong now. Recorded in the registry driftNotes in #508.
Five spec questions surfaced by the PhotoCleaner conformance sweep of 2026-08-01, raised per AUDIT.md section 9 rather than resolved downstream. Three are hub-side defects that re-vendor fleet-wide, so each wants its own change.
Run stamp:
audit run 2026-08-01T15:30:19Z | hub 6501479. The report is refreshed in #508, and PhotoCleaner PRs #26-#31 merged the convergence.1.
.github/copilot-instructions.mdstill describes the pre-splitAGENTS.mdThe carried
Reviewing Carried Fleet Contentsection says:After the router split that is wrong in both halves. The rule sections live in
GOVERNANCE.md, and it isGOVERNANCE.mdthat holds the twointentsections (Devcontainer,Repository Layout);AGENTS.mdcarries exactly two verbatim sections and no repo-specific ones.This is carried at
intent, so PhotoCleaner adapted the wording on the way down. Every other repo that carries the section inherits the stale description, and a reviewer following it looks for byte-locked rule text in the wrong file.2.
CODESTYLE.mdcontradicts.markdownlint-cli2.jsoncon MD033CODESTYLE.md"Markdown and Spelling" item 1 says:The canonical config now sets
"MD033": { "allowed_elements": ["details", "summary"] }, so two elements are not flagged. The prose was not swept when the config changed, which is theGOVERNANCE.mdrule "when you change a behavior, search for prose that asserts the old one" applied to the hub's own files.3.
spec/readme-structure.mdhas no behavior for a private repositoryshields.io cannot read a private repo, so every GitHub-sourced badge in Build Status and Releases renders broken. The spec states no behavior for that case, and section 2 reads as unconditional.
This is not a corner case: a repo is often private precisely while it is being made presentable, which is exactly when its README is written. PhotoCleaner is private now and goes public later, so its README carries Docker Hub shields only and picks up the GitHub ones at the visibility flip. Worth a sentence in the spec saying whether the GitHub-sourced shields are deferred or written-and-broken, so each repo does not decide separately.
4. The
HISTORY.mdmirror rule has no carried homespec/readme-structure.mdowns it andspec/audit.pyenforces it, but that file is hub-only, so a downstream repo cannot point at the rule it is measured against. PhotoCleaner kept it as repo-local prose inCODESTYLE.mdfor want of a destination, which is duplication the fleet normally avoids.Either promote it into a carried section, or state plainly that mechanical-only enforcement is the intent so downstream stops inventing a local copy.
5.
WORKFLOW.mdD2.2 "skipped on smoke" is ambiguousD2.2 says the gate "is skipped on smoke". That names the validation, and scenario S1 confirms it:
validate-release **skipped (smoke), succeeds**.A Copilot review on PhotoCleaner#29 read it as the GitHub job status and proposed a job-level
if: !inputs.smoke. That would have been a real regression:github-releasehasvalidate-releasein itsneeds, and a skipped need skips the dependent, so the release job would have been coupled to smoke through a second path on top of theif:it already carries.The canonical is right; the wording invites the misreading. Something like "the check exits early on smoke, and the job still reports success" would close it.
Not a spec question
A sixth item was raised with the PhotoCleaner maintainer and is answered: the repo is private deliberately and temporarily, going public once the conformance work settles, so the declared
github-releasechannel becomes satisfiable at that flip rather than being wrong now. Recorded in the registrydriftNotesin #508.