Conversation
Follow-up to #732, which settled `.github/workflows/publish-release.yml` and `.github/workflows/validate-task.yml` as `accepted` gaps. That call was wrong and this reverses it. ## What was wrong `accepted` means "a path collision, the repo's own file", and its effect is to silence the finding and stop the audit measuring either file ever again. The fleet's intent for these two is the opposite: carry the hub's copy as closely as each repository's targets allow, so a diff against the canonical stays small and readable. The reasoning behind #732 tested both files against `interface` fidelity, found correctly that no named contract fits (job keys and triggers are genuinely per-repo), and then concluded that nothing could be declared. That skipped `intent`, which is exactly the tier for this: presence asserted, equivalence judged by hand against the `intentRef`, content never hashed, and a staleness advisory raised when the hub's canonical moves past a carrier's copy. The `appliesTo` claim was also wrong for the publisher. Re-measured: every repository lacking one carries `releaseTrigger: none` (AudioCleaner, HolidayLights, EspDinIoT, DevKitCIoT), and all 18 carriers carry a publishing trigger. That is an exact selector, and it states something true, namely that a repository which publishes a release has a publisher. ## What this does ```json { "path": ".github/workflows/validate-task.yml", "fidelity": "intent", "intentRef": "WORKFLOW.md#d1---pr-fast-feedback-smoke", "appliesTo": "*" }, { "path": ".github/workflows/publish-release.yml", "fidelity": "intent", "intentRef": "WORKFLOW.md#d4---release--publish", "appliesTo": ["two-phase", "dispatch-only", "publish-on-merge"] } ``` Both ledger rows are deleted, since a declared file is no longer a gap and `fidelity_honesty.py` drops such a row from the generated report by construction. The validator is declared fleet-wide **by decision rather than by measurement**: no selector separates its carriers from the repositories that inline validation into `test-pull-request.yml`, and the maintainer's call is that the reusable task is the fleet standard. The skill text already reads that way, naming `publish-release.yml` in the orchestration layer that is "the standardization baseline". ## Measured impact, whole fleet One full audit run at `audit run 2026-08-15T17:35:45Z | hub 0713008`: | | absent (letter) | staleness advisory (drift) | | --- | --- | --- | | `publish-release.yml` | 0 | 17 | | `validate-task.yml` | 8 | 13 | - The publisher's 0 absences confirm the selector is exact. - The validator's 8 absences are the convergence this asks for: homeassistant-purpleair, KiCadLibrary, EspDinIoT, ESPHome-Config, HomeAssistant-Config, DevKitCIoT, Vantage-Config, HolidayLights. - **17 of the 30 advisories are a false class**, and they are not this change's fault so much as this change's discovery: the intent advisory compares dates with no action-pin normalization, and the hub's publisher last changed in a Dependabot pin bump (`1892d6f`), so every carrier trips at once on drift the fidelity model already calls governed and per-repo. Filed as #735 with three options. - The other 13 are against `0d18078`, which added `ruff format --check`. Real content, though a repository that adopted the same step independently still reports as trailing, which is why the tier is an advisory and not a verdict. ## PlexCleaner report `reports/plexcleaner/audit.md` is updated in place, since it is the report this settlement was written into. Its two new advisories are read and retired in Drift Finding 6: the validator copy already runs `ruff format --check` at a pinned version, and the publisher advisory is the pin-bump class above. Verdict is unchanged at operational. Verified: `spec/validate.py`, `spec/audit.py --selftest` (which asserts no declared path leaks into the hub-only set), `scripts/repo_gate.py`, the whole-tree prose gate, markdownlint, and editorconfig-checker all pass.
Closes #737 Closes #738 Two wording defects in `.github/copilot-instructions.md`, both raised by Copilot against the carried copy on ptr727/ESPHome-Config#94. They ship together because they are the same failure: a carried file whose faithful copy makes every carrier re-litigate the same finding, which is exactly what a per-repository Disproved Claims ledger cannot absorb. ## #737, the unmarked quotation `GOVENANCE.md` is quoted as the spelling a review round actually emitted, and it is the evidence for the sentence it sits in: a partial round can name a path no diff carries. Nothing marked it as quoted, and it sits in the same sentence as a correctly spelled `GOVERNANCE.md`, so it reads as an obvious typo. Correcting the spelling would delete the evidence and invert the claim, since the sentence would then say a round named a path that does exist. Each Markdown occurrence now reads "the reviewer's own spelling and a path no diff carries", which is the marker the issue proposed and leaves the misspelling literal: - `.github/copilot-instructions.md`, the `Counts unequal` bullet - `scripts/README.md` - `TODO.md` `scripts/pr_review.py:778` and `scripts/tests/test_pr_review.py:1320` are deliberately unchanged, per the issue's own note that a Python string literal reads less like a path. The `pr_review.py` docstring also calls it "that typo" two sentences later, so the disambiguation is already there in the prose that matters. ## #738, what AGENTS.md actually carries The sentence read "`AGENTS.md` is the thin router and carries three byte-locked sections of its own, with no repository-specific ones". True of the sections, wrong about the file, and wrong in a way that inverts the sentence's purpose: it exists so a reviewer knows what is safe to flag, and it reads as "none of `AGENTS.md` is editable" when every `AGENTS.md` preamble is the repository's own prose. Reworded as the issue proposed, naming the three sections and stating that everything above the first is the repository's own and editable. Verified the three names against `spec/files.json`, which declares exactly `Fleet Bootstrap`, `Context and Delegation Discipline`, and `Where the Rules Live` as the verbatim sections, so the sentence is accurate in every carrier rather than only here. ## Downstream ESPHome-Config already applied the #738 reword locally, which `intent` fidelity permits, and recorded #737 as its first Disproved Claims entry whose "Delete when" names this change. Both retire on that repository's next resync. Verified: whole-tree prose gate, markdownlint on the three files, `repo_gate.py`, `spec/validate.py`, `build_dist.py --check`, editorconfig-checker, and the `test_pr_review` and `test_prose_lint` modules all pass. All three files keep their CRLF endings.
There was a problem hiding this comment.
Pull request overview
This promotion PR updates the fleet’s canonical governance/spec state on main by (1) declaring the publisher and reusable validator workflows at intent fidelity in the manifest, and (2) applying two carried-wording fixes that prevent repeated false “typo” findings across downstream repositories. It also refreshes the PlexCleaner audit report and the generated divergences report to reflect the updated ledger/manifest state.
Changes:
- Declare
.github/workflows/validate-task.ymland.github/workflows/publish-release.ymlinspec/files.jsonat intent fidelity, and remove their prior “gap” dispositions fromspec/divergences.json. - Mark the intentionally quoted misspelling (
GOVENANCE.md) as “the reviewer’s own spelling” in multiple Markdown references to prevent repeated typo reports. - Update
reports/plexcleaner/audit.mdand regeneratereports/divergences.mdto reflect the new manifest/ledger state.
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| TODO.md | Clarifies the quoted misspelling as the reviewer’s spelling in the partial-coverage discussion. |
| spec/files.json | Adds intent-fidelity declarations for validate-task.yml and publish-release.yml. |
| spec/divergences.json | Removes now-declared workflow gaps; keeps pyproject.toml as the remaining investigate gap. |
| scripts/README.md | Clarifies the quoted misspelling as the reviewer’s spelling in the partial-round explanation. |
| reports/plexcleaner/audit.md | Updates run stamps and narrative to reflect the workflows being declared at intent fidelity and advisory handling. |
| reports/divergences.md | Regenerated report reflecting removal of the two workflow gap entries from the ledger. |
| .github/copilot-instructions.md | Fixes carried wording about what AGENTS.md contains, and marks the quoted misspelling as the reviewer’s spelling. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
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.
Promotes
developtomain. Two commits since #734, both governance rather than tooling, and the trial merge is conflict-free.Closes #737
Closes #738
#736, the publisher and validator declared at intent fidelity
spec/files.jsongains.github/workflows/publish-release.ymland.github/workflows/validate-task.yml, and the two matchinginvestigaterows leavespec/divergences.json, a declared file being no longer a gap.This reverses the call #732 shipped. That change settled both as
accepted, which silences the finding and stops the audit measuring either file again, and the maintainer caught that as the opposite of what the fleet wants for them.interfacegenuinely does not fit, since job keys and triggers are per-repo across every carrier, butintentdoes: presence asserted, equivalence judged by hand, and a staleness advisory when the hub's copy moves past a carrier's.Scope is measured rather than assumed. The publisher applies to the three publishing
releaseTriggervalues, which selects exactly the 18 carriers, since every repository lacking one carriesreleaseTrigger: none. The validator applies to*by decision, making the reusable validation task the fleet standard.What promoting this turns on, fleet-wide, measured in one run at
audit run 2026-08-15T17:35:45Z | hub 0713008: 0 absences for the publisher, 8 for the validator (homeassistant-purpleair, KiCadLibrary, EspDinIoT, ESPHome-Config, HomeAssistant-Config, DevKitCIoT, Vantage-Config, HolidayLights), and 30 staleness advisories. 17 of those 30 are a known false class, since the advisory has no action-pin normalization and the hub's publisher last changed in a Dependabot bump, filed as #735.reports/plexcleaner/audit.mdis updated in the same commit, since it is the report the earlier settlement was written into.#740, two carried-wording fixes
Both raised by Copilot against a carried copy on ptr727/ESPHome-Config#94, and both are the same failure: a faithful copy makes every carrier re-litigate one finding.
GOVENANCE.mdquotation now reads as quoted ("the reviewer's own spelling and a path no diff carries") in the three Markdown occurrences. The misspelling stays literal, because it is the evidence for the sentence it sits in.AGENTS.mdsentence named no sections and read as "none of this file is editable". It now names the three byte-locked sections and states that the preamble above them is the repository's own.Verification
Run against
developat7c67328: whole-tree prose gate,repo_gate.py(eol, eol-coverage, sha-pin),spec/validate.py,spec/audit.py --selftest,build_dist.py --check, markdownlint, and editorconfig-checker all pass.git merge-treeofmainanddevelopis conflict-free, so there is no EOL-only conflict to resolve on this promotion.