The audit found a missing OPERATIONS.md on ptr727/PhotoCleaner and reported it as a file-presence letter. It did not find that most of the content that file should hold already existed, in .github/copilot-instructions.md. The absent file was the symptom. The misplacement was the cause, and nothing in the audit can see that class.
Raised per AUDIT.md section 9, since it is a spec question rather than a defect in one repo.
What the audit missed
ptr727/PhotoCleaner's .github/copilot-instructions.md carries 311 lines under nine repository-specific level-two headings, on top of the three sections the fleet declares for that file:
## Project Overview
## Architecture & Data Flow -> ARCHITECTURE.md per spec/section-model.md
## Key Patterns & Conventions -> ARCHITECTURE.md
## Development Workflow -> OPERATIONS.md
## Critical Implementation Details -> ARCHITECTURE.md
## File Processing Extensions -> ARCHITECTURE.md
## Command Line Usage -> OPERATIONS.md
## JSON Source Generation -> ARCHITECTURE.md
## Testing Strategy -> ARCHITECTURE.md
spec/section-model.md assigns these destinations explicitly: ARCHITECTURE.md takes "how a code repo is built, its module layout, data flow, and design decisions", and OPERATIONS.md takes "how a repo is run".
The audit reported none of it, because spec/audit.py checks file presence, declared-section presence within a carried file, verbatim content hashes, and workflow interface conformance. A file holding sections that belong to a different declared destination is not any of those.
It is now a duplication rather than only a misplacement
OPERATIONS.md landed on that repo in ptr727/PhotoCleaner#37, and the 311 lines stayed where they were. Both files now describe overlapping ground, Development Workflow against Runbooks being the clearest case, and neither points at the other. That is the state the destinations exist to prevent, and it was reached by an audit reporting clean on the half it can see.
Worth noting how the report was written: the new OPERATIONS.md was authored fresh, against the code, without reconciling it against the description already sitting in copilot-instructions.md. An audit that had flagged the overlap would have made that a migration rather than a second draft.
What a check might do, and why the obvious version is wrong
The shape that fits the existing engine is structural rather than semantic. For a carried file with fidelity: intent, collect its level-two headings, subtract the ones files.json declares for it, and compare the remainder against the headings other destinations declare. A match is a drift finding naming both files.
The tempting version, comparing content for similarity, is explicitly rejected by spec/section-model.md:
A word-overlap or similarity heuristic does not: a repo-specific rule written in ordinary governance vocabulary scores as a reworded duplicate of a rule it has nothing to do with, so the cheap check is confidently wrong in exactly the direction that loses content.
That warning is about migration rather than detection, but it applies here for the same reason, and a detector built on similarity would produce findings whose remedy is to delete content.
Open questions
- Should an undeclared level-two heading in an
intent file be a finding at all? A repo is allowed local additions, and section-model.md says a local addition is promoted or moved rather than dropped. The finding would be "this belongs elsewhere", not "this should not exist", and the two read differently to whoever picks it up.
- Is the destination mapping declarable? Today
section-model.md states it in prose. A check needs it as data, which means a heading-to-destination table in spec/, and that table is a maintenance surface of its own.
- Does this reach
ARCHITECTURE.md, which is declared but advisory? Flagging content that belongs in a file the repo is not required to have needs a stated answer.
- How many repos does this affect? PhotoCleaner is the one repository looked at closely. The pre-split
AGENTS.md shape that produced it was fleet-wide, so the honest expectation is that it is not alone, and that number should be measured before a check is designed rather than after it starts reporting.
The audit found a missing
OPERATIONS.mdon ptr727/PhotoCleaner and reported it as a file-presence letter. It did not find that most of the content that file should hold already existed, in.github/copilot-instructions.md. The absent file was the symptom. The misplacement was the cause, and nothing in the audit can see that class.Raised per AUDIT.md section 9, since it is a spec question rather than a defect in one repo.
What the audit missed
ptr727/PhotoCleaner's.github/copilot-instructions.mdcarries 311 lines under nine repository-specific level-two headings, on top of the three sections the fleet declares for that file:spec/section-model.mdassigns these destinations explicitly:ARCHITECTURE.mdtakes "how a code repo is built, its module layout, data flow, and design decisions", andOPERATIONS.mdtakes "how a repo is run".The audit reported none of it, because
spec/audit.pychecks file presence, declared-section presence within a carried file, verbatim content hashes, and workflow interface conformance. A file holding sections that belong to a different declared destination is not any of those.It is now a duplication rather than only a misplacement
OPERATIONS.mdlanded on that repo in ptr727/PhotoCleaner#37, and the 311 lines stayed where they were. Both files now describe overlapping ground,Development WorkflowagainstRunbooksbeing the clearest case, and neither points at the other. That is the state the destinations exist to prevent, and it was reached by an audit reporting clean on the half it can see.Worth noting how the report was written: the new
OPERATIONS.mdwas authored fresh, against the code, without reconciling it against the description already sitting incopilot-instructions.md. An audit that had flagged the overlap would have made that a migration rather than a second draft.What a check might do, and why the obvious version is wrong
The shape that fits the existing engine is structural rather than semantic. For a carried file with
fidelity: intent, collect its level-two headings, subtract the onesfiles.jsondeclares for it, and compare the remainder against the headings other destinations declare. A match is a drift finding naming both files.The tempting version, comparing content for similarity, is explicitly rejected by
spec/section-model.md:That warning is about migration rather than detection, but it applies here for the same reason, and a detector built on similarity would produce findings whose remedy is to delete content.
Open questions
intentfile be a finding at all? A repo is allowed local additions, andsection-model.mdsays a local addition is promoted or moved rather than dropped. The finding would be "this belongs elsewhere", not "this should not exist", and the two read differently to whoever picks it up.section-model.mdstates it in prose. A check needs it as data, which means a heading-to-destination table inspec/, and that table is a maintenance surface of its own.ARCHITECTURE.md, which is declared but advisory? Flagging content that belongs in a file the repo is not required to have needs a stated answer.AGENTS.mdshape that produced it was fleet-wide, so the honest expectation is that it is not alone, and that number should be measured before a check is designed rather than after it starts reporting.