Skip to content

Declare the Publisher and Validator Workflows at Intent Fidelity - #736

Merged
ptr727 merged 1 commit into
developfrom
spec/declare-publisher-and-validator
Aug 15, 2026
Merged

Declare the Publisher and Validator Workflows at Intent Fidelity#736
ptr727 merged 1 commit into
developfrom
spec/declare-publisher-and-validator

Conversation

@ptr727

Copy link
Copy Markdown
Owner

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

{ "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.yml017
validate-task.yml813
  • 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 The intent staleness advisory has no action-pin normalization, so a Dependabot bump marks every downstream copy as trailing #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.

Replaces the accepted disposition with the one the maintainer chose. The
earlier call ruled out interface fidelity correctly, then wrongly
concluded nothing could be declared, which silenced the finding and
stopped the audit measuring either file again.
intent is the tier that fits: presence asserted, equivalence judged by
hand against the intentRef, and a staleness advisory when the hub's copy
moves past a carrier's. That is what keeps a copy close to the canonical
rather than merely present.
publish-release.yml applies to the three publishing releaseTrigger
values, which is exact: every repo lacking one carries releaseTrigger
none, and all 18 carriers carry a publishing trigger. The earlier claim
that no selector separates them was wrong.
validate-task.yml applies to * by decision, making the reusable
validation task the fleet standard. The 8 repos that inline validation
into test-pull-request.yml now carry a presence finding, which is the
convergence asked for.
Measured over the fleet: 0 false absences for the publisher, 8 absences
for the validator, and 30 staleness advisories. 17 of those are against
a Dependabot pin bump in the hub, a false class filed as #735. Both
ledger rows are deleted, a declared file being no longer a gap.
CopilotAI lite review requested due to automatic review settings August 15, 2026 17:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates the fleet manifest to declare .github/workflows/publish-release.yml and .github/workflows/validate-task.yml at intent fidelity (instead of treating them as accepted gaps), so they remain measured for presence and receive staleness advisories when the hub canonical advances.

Changes:

  • Add intent-fidelity declarations for validate-task.yml (fleet-wide) and publish-release.yml (scoped by releaseTrigger) in spec/files.json.
  • Remove the prior “accepted gap” ledger entries for those workflows from spec/divergences.json and regenerate reports/divergences.md accordingly.
  • Update the PlexCleaner audit report to reflect the new audit run stamps and the resulting advisory interpretation.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
spec/files.jsonDeclares validate-task.yml and publish-release.yml as intent-fidelity baseline files with intent references and scope selectors.
spec/divergences.jsonRemoves the prior gap dispositions for the two workflow files (no longer gaps once declared).
reports/plexcleaner/audit.mdUpdates the narrative and run stamps to reflect the new intent declarations and advisory handling.
reports/divergences.mdRegenerated output reflecting the removal of the two workflow gap entries.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@ptr727
ptr727 merged commit aa7bf78 into developAug 15, 2026
7 checks passed
@ptr727
ptr727 deleted the spec/declare-publisher-and-validator branch August 15, 2026 17:57
ptr727 added a commit that referenced this pull request Aug 15, 2026
…xes (#741)
Promotes `develop` to `main`. Two commits since #734, both governance
rather than tooling, and the trial merge is conflict-free.
Closes#737Closes#738
## #736, the publisher and validator declared at intent fidelity
`spec/files.json` gains `.github/workflows/publish-release.yml` and
`.github/workflows/validate-task.yml`, and the two matching
`investigate` rows leave `spec/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. `interface` genuinely does not fit, since
job keys and triggers are per-repo across every carrier, but `intent`
does: 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 `releaseTrigger` values, which selects exactly the 18
carriers, since every repository lacking one carries `releaseTrigger:
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.md` is 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.
- **#737**: the `GOVENANCE.md` quotation 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.
- **#738**: the `AGENTS.md` sentence 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 `develop` at `7c67328`: 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-tree` of `main` and `develop`
is conflict-free, so there is no EOL-only conflict to resolve on this
promotion.
ptr727 added a commit that referenced this pull request Aug 15, 2026
…nc (#739)
Follow-up to #723 after ptr727/PhotoCleaner#51 promoted `develop` to
`main` (`f56178a`), carrying ptr727/PhotoCleaner#50 and
ptr727/PhotoCleaner#52.
`spec/audit.py PhotoCleaner` at hub `b09078e` reports **clean** at
`main` (`audit run 2026-08-15T18:43:20Z | hub b09078e`) and at
`develop`, including the two hub-only workflow findings that #736
settled. The report moves to **operational**: `readme-structure` and
`agent-instruction-set` to pass, no defects, no drift, nothing in
flight. It records the one-round `dead-path` block on the promotion
(#721, fixed by #731, cleared by a re-run since the gate reads rules
from hub `develop`) and closes both escalations (#721, #722). The
registry entry is unchanged: `status` stays `cataloged` (the schema's
only non-backlog value) and both `driftNotes` still describe reality
(publish shape, private-for-now) and assert no outstanding work.
Report lints clean (markdownlint, prose_lint), and `spec/validate.py`
passes.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ptr727