From 1992a924dad589a019c67030b8855e93d8c9213e Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Sat, 12 Sep 2026 08:39:46 -0700 Subject: [PATCH 1/2] Regenerate reports/divergences.md Against the Current Fleet The report is generated by `spec/fidelity_honesty.py --report`, which joins `spec/divergences.json` against every cataloged repository's ground-truth branch, so it goes stale as the fleet moves rather than as the hub is edited. Both rows the issue names are settled by the run: the `pyproject.toml` row now renders `ptr727/ProjectTemplate#1553` in place of the closed `#669`, and the `.markdownlint-cli2.jsonc` Financial-Modeling row is no longer a live divergence at all, so it moves to the resolved section instead of gaining the `#1487` tracking value it was owed. The rest of the diff is accumulated fleet drift the run reads for the first time since the last regeneration. The retire rows shrink where a resynced repository deleted its copy of a hub-hosted file, the mechanical re-vendor list grows where a carried section moved on in the hub, and three rows are new: `spec/secrets.json` is now a live manifest gap, `PSScriptAnalyzerSettings.psd1` is untriaged, and `GOVERNANCE.md > Workflow YAML Conventions` is hand-modified in one repository. The report is written by the tool and never hand-edited, per its own header. Fixes #1554 --- reports/divergences.md | 66 ++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/reports/divergences.md b/reports/divergences.md index ca3ab12f..af86de4a 100644 --- a/reports/divergences.md +++ b/reports/divergences.md @@ -6,28 +6,29 @@ Generated by `python3 spec/fidelity_honesty.py --report` - do not hand-edit. Cur ### re-vendor -- **.markdownlint-cli2.jsonc** - AudioCleaner, aiopurpleair _(recorded PhotoCleaner now resolved)_ - Verbatim config held as a hand-modified copy rather than a past hub revision. Restore the current canonical. +- **.markdownlint-cli2.jsonc** - AudioCleaner, PhotoCleaner _(recorded aiopurpleair now resolved)_ - Verbatim config held as a hand-modified copy rather than a past hub revision. Restore the current canonical. ### investigate -- **pyproject.toml** (manifest gap, carried by Financial-Modeling, aiopurpleair, homeassistant-purpleair) (tracking: ptr727/ProjectTemplate#669) - The hub gained a config-only Scripts-profile pyproject.toml in #388. Decide whether to track it (intent, appliesTo python) after confirming the Python repos carry an equivalent. reports/divergences.md already shows the carriers. The decision is tracked in ptr727/ProjectTemplate#669, so the remaining call is the fleet-wide new-findings tradeoff, which stays the maintainer's. +- **pyproject.toml** (manifest gap, carried by Financial-Modeling, aiopurpleair, homeassistant-purpleair) (tracking: ptr727/ProjectTemplate#1553) - The hub gained a config-only Scripts-profile pyproject.toml in #388. Decide whether to track it (intent, appliesTo python) after confirming the Python repos carry an equivalent. reports/divergences.md already shows the carriers. The decision is tracked in ptr727/ProjectTemplate#1553, so the remaining call is the fleet-wide new-findings tradeoff, which stays the maintainer's. ### retire -- **repo-config/configure.sh** (manifest gap, carried by ESPHome-NonRoot, LanguageTags, NxWitness, Utilities, VSCode-Server-DotNetCore, Vantage-Config, aiopurpleair, homeassistant-purpleair) - The hub hosts the repository-configuration script. A downstream repository runs the hub's main copy against its repository name and workflow model. -- **repo-config/develop.json** (manifest gap, carried by MediaTools, PhotoCleaner, PlexCleaner, Utilities) - The hub hosts the release-model develop ruleset payload. A downstream repository is checked against the hub's main payload. -- **repo-config/operational/develop.json** (manifest gap, carried by ESPHome-Config, HomeAssistant-Config, Vantage-Config) - The hub hosts the operational-model develop ruleset payload. A downstream repository is checked against the hub's main payload. -- **repo-config/main.json** (manifest gap, carried by ESPHome-Config, HomeAssistant-Config, MediaTools, PhotoCleaner, PlexCleaner, Utilities, Vantage-Config) - The hub hosts the shared main ruleset payload. A downstream repository is checked against the hub's main payload. -- **repo-config/settings.json** (manifest gap, carried by ESPHome-Config, ESPHome-NonRoot, HomeAssistant-Config, LanguageTags, NxWitness, PhotoCleaner, PlexCleaner, Utilities, VSCode-Server-DotNetCore, Vantage-Config, aiopurpleair, homeassistant-purpleair) - The hub hosts the shared repository settings payload. A downstream repository is checked against the hub's main payload. -- **repo-config/README.md** (manifest gap, carried by ESPHome-Config, ESPHome-NonRoot, HomeAssistant-Config, LanguageTags, NxWitness, PhotoCleaner, PlexCleaner, Utilities, VSCode-Server-DotNetCore, Vantage-Config, aiopurpleair, homeassistant-purpleair) - The hub hosts the repository-configuration reference beside the payloads and script it documents. -- **.github/workflows/build-release-task.yml** (manifest gap, carried by ESPHome-NonRoot, KiCadLibrary, LanguageTags, MediaTools, PlexCleaner, Utilities, VSCode-Server-DotNetCore, aiopurpleair, homeassistant-purpleair) - The release chain is hub-hosted as a workflow_call task, per docs/reusable-workflows.md "Stage 4: The Release Chain and the Docker Core", so a downstream copy of this filename is retired rather than re-vendored: the caller stub a repo carries after adoption is publish-release.yml and test-pull-request.yml calling the hub task by pin, and no adopting repo carries a same-named local file. The ten carriers measured on develop at hub 7c67328 are PhotoCleaner, PlexCleaner, LanguageTags, MediaTools, Utilities, aiopurpleair, ESPHome-NonRoot, VSCode-Server-DotNetCore, KiCadLibrary, and homeassistant-purpleair. Delete the copy as each repo adopts the hub task; adoption is a separate, later change per repo (docs/reusable-workflows.md "Rollout" Stage 4). -- **.github/workflows/build-docker-task.yml** (manifest gap, carried by ESPHome-NonRoot, NxWitness, PlexCleaner, VSCode-Server-DotNetCore) - The Docker core is hub-hosted as its own workflow_call task alongside build-release-task.yml, per docs/reusable-workflows.md "Stage 4: The Release Chain and the Docker Core", so a downstream copy of this filename is retired rather than re-vendored the same way. The five carriers measured on develop at hub 7c67328 are ESPHome-NonRoot, NxWitness, PhotoCleaner, PlexCleaner, and VSCode-Server-DotNetCore. Delete the copy as each repo adopts the hub task; adoption is a separate, later change per repo (docs/reusable-workflows.md "Rollout" Stage 4). -- **.github/workflows/get-version-task.yml** (manifest gap, carried by ESPHome-NonRoot, KiCadLibrary, NxWitness, PlexCleaner, VSCode-Server-DotNetCore, aiopurpleair, homeassistant-purpleair) - The task is hub-hosted rather than carried, per GOVERNANCE.md "Hub-Hosted Tooling", so it is no manifest entry and a downstream copy is retired rather than re-vendored. Every copy is the hub's own NBGV logic with nothing per-repo in it beyond the action pins Dependabot already owns. The carriers, read from the fleet on 2026-08-15, are ESPHome-NonRoot, NxWitness, PhotoCleaner, PlexCleaner, VSCode-Server-DotNetCore, KiCadLibrary, aiopurpleair, and homeassistant-purpleair. Delete the copy and reach the hub task by pin as each repo is next visited, per docs/reusable-workflows.md "Adopting the Pure Functions". -- **.github/workflows/publish-plan-task.yml** (manifest gap, carried by ESPHome-NonRoot, NxWitness, Utilities) - The task is hub-hosted rather than carried, per GOVERNANCE.md "Hub-Hosted Tooling", so it is no manifest entry and a downstream copy is retired rather than re-vendored. The carriers, read from the fleet on 2026-08-15, are ESPHome-NonRoot, NxWitness, and Utilities, and all three carry a strict subset of the canonical, missing the -E in set -Eeuo pipefail and the ::warning:: branch for an unrecognized actor pushing to main (WORKFLOW.md D8.4). Delete the copy and reach the hub task by pin as each repo is next visited, per docs/reusable-workflows.md "Adopting the Pure Functions". -- **.github/workflows/validate-task.yml** (manifest gap, carried by AudioCleaner, ESPHome-NonRoot, LanguageTags, MediaTools, NxWitness, PlexCleaner, Utilities, VSCode-Server-DotNetCore, aiopurpleair) - The file is hub-hosted as a workflow_call task rather than carried, per GOVERNANCE.md "Hub-Hosted Tooling" and docs/reusable-workflows.md "Stage 2: The Gates". The fleet doc-lint block, the language lint, the prose gate, and the repo gate move into the hub task, and a repo's own domain checks move into its own .github/actions/validate/action.yml hook instead, so a downstream copy is retired rather than re-vendored. The thirteen repos carrying a copy as of 2026-08-16 were PhotoCleaner, PlexCleaner, LanguageTags, Utilities, MediaTools, AudioCleaner, aiopurpleair, Financial-Modeling, Blog, ESPHome-NonRoot, NxWitness, VSCode-Server-DotNetCore, and HomeAutomation-Config, and the live current carrier list above may have moved on since. Delete the copy and adopt the caller stub in docs/reusable-workflows.md "Adopting the Gates" as each repo is next visited. +- **repo-config/configure.sh** (manifest gap, carried by ESPHome-NonRoot, VSCode-Server-DotNetCore, Vantage-Config, homeassistant-purpleair) - The hub hosts the repository-configuration script. A downstream repository runs the hub's main copy against its repository name and workflow model. +- **repo-config/develop.json** (manifest gap, carried by MediaTools) - The hub hosts the release-model develop ruleset payload. A downstream repository is checked against the hub's main payload. +- **repo-config/operational/develop.json** (manifest gap, carried by HomeAssistant-Config, Vantage-Config) - The hub hosts the operational-model develop ruleset payload. A downstream repository is checked against the hub's main payload. +- **repo-config/main.json** (manifest gap, carried by HomeAssistant-Config, MediaTools, Vantage-Config) - The hub hosts the shared main ruleset payload. A downstream repository is checked against the hub's main payload. +- **repo-config/settings.json** (manifest gap, carried by ESPHome-NonRoot, HomeAssistant-Config, VSCode-Server-DotNetCore, Vantage-Config, homeassistant-purpleair) - The hub hosts the shared repository settings payload. A downstream repository is checked against the hub's main payload. +- **repo-config/README.md** (manifest gap, carried by ESPHome-NonRoot, HomeAssistant-Config, VSCode-Server-DotNetCore, Vantage-Config, homeassistant-purpleair) - The hub hosts the repository-configuration reference beside the payloads and script it documents. +- **spec/secrets.json** (manifest gap, carried by Blog, HomeAssistant-Config, HomeAutomation-Config, Vantage-Config) - The adapted baseline/mechanisms carry never varied per repo: baseline applies to every fleet repo by definition, and mechanisms/targetMechanisms/typeMechanisms are computed centrally by spec/audit.py from the hub's own spec/secrets.json plus registry/repos.json, which a downstream copy could only restate or let drift. A downstream repository is checked against the hub's copy by running spec/audit.py from a hub checkout instead (ptr727/ProjectTemplate#993). +- **.github/workflows/build-release-task.yml** (manifest gap, carried by ESPHome-NonRoot, KiCadLibrary, MediaTools, VSCode-Server-DotNetCore, homeassistant-purpleair) - The release chain is hub-hosted as a workflow_call task, per docs/reusable-workflows.md "Stage 4: The Release Chain and the Docker Core", so a downstream copy of this filename is retired rather than re-vendored: the caller stub a repo carries after adoption is publish-release.yml and test-pull-request.yml calling the hub task by pin, and no adopting repo carries a same-named local file. The ten carriers measured on develop at hub 7c67328 are PhotoCleaner, PlexCleaner, LanguageTags, MediaTools, Utilities, aiopurpleair, ESPHome-NonRoot, VSCode-Server-DotNetCore, KiCadLibrary, and homeassistant-purpleair. Delete the copy as each repo adopts the hub task; adoption is a separate, later change per repo (docs/reusable-workflows.md "Rollout" Stage 4). +- **.github/workflows/build-docker-task.yml** (manifest gap, carried by ESPHome-NonRoot, NxWitness, VSCode-Server-DotNetCore) - The Docker core is hub-hosted as its own workflow_call task alongside build-release-task.yml, per docs/reusable-workflows.md "Stage 4: The Release Chain and the Docker Core", so a downstream copy of this filename is retired rather than re-vendored the same way. The five carriers measured on develop at hub 7c67328 are ESPHome-NonRoot, NxWitness, PhotoCleaner, PlexCleaner, and VSCode-Server-DotNetCore. Delete the copy as each repo adopts the hub task; adoption is a separate, later change per repo (docs/reusable-workflows.md "Rollout" Stage 4). +- **.github/workflows/get-version-task.yml** (manifest gap, carried by ESPHome-NonRoot, KiCadLibrary, NxWitness, VSCode-Server-DotNetCore, homeassistant-purpleair) - The task is hub-hosted rather than carried, per GOVERNANCE.md "Hub-Hosted Tooling", so it is no manifest entry and a downstream copy is retired rather than re-vendored. Every copy is the hub's own NBGV logic with nothing per-repo in it beyond the action pins Dependabot already owns. The carriers, read from the fleet on 2026-08-15, are ESPHome-NonRoot, NxWitness, PhotoCleaner, PlexCleaner, VSCode-Server-DotNetCore, KiCadLibrary, aiopurpleair, and homeassistant-purpleair. Delete the copy and reach the hub task by pin as each repo is next visited, per docs/reusable-workflows.md "Adopting the Pure Functions". +- **.github/workflows/publish-plan-task.yml** (manifest gap, carried by ESPHome-NonRoot, NxWitness) - The task is hub-hosted rather than carried, per GOVERNANCE.md "Hub-Hosted Tooling", so it is no manifest entry and a downstream copy is retired rather than re-vendored. The carriers, read from the fleet on 2026-08-15, are ESPHome-NonRoot, NxWitness, and Utilities, and all three carry a strict subset of the canonical, missing the -E in set -Eeuo pipefail and the ::warning:: branch for an unrecognized actor pushing to main (WORKFLOW.md D8.4). Delete the copy and reach the hub task by pin as each repo is next visited, per docs/reusable-workflows.md "Adopting the Pure Functions". +- **.github/workflows/validate-task.yml** (manifest gap, carried by AudioCleaner, ESPHome-NonRoot, MediaTools, NxWitness, PlexCleaner, VSCode-Server-DotNetCore) - The file is hub-hosted as a workflow_call task rather than carried, per GOVERNANCE.md "Hub-Hosted Tooling" and docs/reusable-workflows.md "Stage 2: The Gates". The fleet doc-lint block, the language lint, the prose gate, and the repo gate move into the hub task, and a repo's own domain checks move into its own .github/actions/validate/action.yml hook instead, so a downstream copy is retired rather than re-vendored. The thirteen repos carrying a copy as of 2026-08-16 were PhotoCleaner, PlexCleaner, LanguageTags, Utilities, MediaTools, AudioCleaner, aiopurpleair, Financial-Modeling, Blog, ESPHome-NonRoot, NxWitness, VSCode-Server-DotNetCore, and HomeAutomation-Config, and the live current carrier list above may have moved on since. Delete the copy and adopt the caller stub in docs/reusable-workflows.md "Adopting the Gates" as each repo is next visited. - **.github/workflows/publish-docker-readme-task.yml** (manifest gap, carried by VSCode-Server-DotNetCore) - The task is hub-hosted per docs/reusable-workflows.md "The Docker Family", so a downstream copy of the job graph is retired rather than converged. The carrier is VSCode-Server-DotNetCore, whose copy replaces with the caller stub in docs/reusable-workflows.md "Adopting the Type-Specific Tasks" once a release carries the task. - **.github/workflows/check-upstream-version-task.yml** (manifest gap, carried by ESPHome-NonRoot) - The task is hub-hosted per docs/reusable-workflows.md "The Docker Family", so a downstream copy of the job graph is retired rather than converged. The carrier is ESPHome-NonRoot, whose check-upstream-version.yml caller and check-upstream-version-task.yml body both replace with the caller stub once a release carries the task. Its second tracker, check-upstream-dependency.yml, is a candidate to fold into the same hub task with auto-merge false, tracked as an adoption note rather than a gap here since it was never a copy of this snippet. -- **.github/workflows/run-codegen-pull-request-task.yml** (manifest gap, carried by LanguageTags, NxWitness) - The task is hub-hosted per docs/reusable-workflows.md "Adopting the Type-Specific Tasks", so a downstream copy of the job graph is retired rather than converged. The carriers are LanguageTags and NxWitness, each replacing its copy with a codegen hook plus the caller stub once a release carries the task. +- **.github/workflows/run-codegen-pull-request-task.yml** (manifest gap, carried by NxWitness) - The task is hub-hosted per docs/reusable-workflows.md "Adopting the Type-Specific Tasks", so a downstream copy of the job graph is retired rather than converged. The carriers are LanguageTags and NxWitness, each replacing its copy with a codegen hook plus the caller stub once a release carries the task. ### accepted @@ -37,31 +38,40 @@ Generated by `python3 spec/fidelity_honesty.py --report` - do not hand-edit. Cur - **.husky/pre-commit** (manifest gap, carried by AudioCleaner, LanguageTags, MediaTools, NxWitness, PhotoCleaner, PlexCleaner, Utilities) - A path collision rather than a carry. Each repo's hook runs that repo's own language formatters, and the hub's runs the doc gates, so the seven downstream copies share the path and none of the content: LanguageTags and Utilities run language formatting and style with no Docker, PlexCleaner runs CSharpier and dotnet format, and the hub runs prose_lint.py and repo_gate.py. Verified by reading the downstream copies on 2026-08-10. - **scripts/README.md** (manifest gap, carried by KiCadLibrary) - A path collision rather than a carry. KiCadLibrary's copy documents its own KiCad tooling (common.py, verify_library.py, build_library.py) beside the scripts it describes, and shares nothing with the hub's fleet-gate documentation. Verified by reading it on 2026-08-10. scripts/ is a generic path, so a repo with its own tooling directory matches this check without carrying anything of the hub's. - **.github/actionlint.yaml** (manifest gap, carried by HomeAutomation-Config) - A path collision rather than a carry. HomeAutomation-Config's own copy declares self-hosted-runner labels (homelab, ubuntu-24.04) for its self-hosted CI runner, entirely different content from the hub's own file at this path, which configures $/ self-reference ignore rules for the hub's own workflows. Verified by reading both copies on 2026-08-25. -- **.github/actions/validate/action.yml** (manifest gap, carried by Blog, ESPHome-Config, Financial-Modeling, HomeAutomation-Config) - A path collision rather than a carry. HomeAutomation-Config's own copy overrides the interface-workflow validate hook, per RESYNC.md 'Apply, in This Order' item 4, 'Interface workflows': 'Honor the named contract... rather than copying bytes. The body is the repository's own.' It runs its CloudInit/ nested Python project through uv/ruff/pyright/pytest. The hub's own file at this same path is a different override, its own registry/spec self-test suite. A repo declaring its own .github/actions/validate/action.yml is the documented, intended override mechanism, not drift to reconcile. Verified by reading both copies on 2026-08-25. +- **.github/actions/validate/action.yml** (manifest gap, carried by Blog, ESPHome-Config, Financial-Modeling, HomeAutomation-Config, LanguageTags, aiopurpleair) - A path collision rather than a carry. HomeAutomation-Config's own copy overrides the interface-workflow validate hook, per RESYNC.md 'Apply, in This Order' item 4, 'Interface workflows': 'Honor the named contract... rather than copying bytes. The body is the repository's own.' It runs its CloudInit/ nested Python project through uv/ruff/pyright/pytest. The hub's own file at this same path is a different override, its own registry/spec self-test suite. A repo declaring its own .github/actions/validate/action.yml is the documented, intended override mechanism, not drift to reconcile. Verified by reading both copies on 2026-08-25. ## Untriaged - add a disposition to `spec/divergences.json` -- **.markdownlint-cli2.jsonc** - hand-modified in Financial-Modeling (verbatim canonical) -- **AGENTS.md > Fleet Bootstrap** - **not carried** by AudioCleaner, DevKitCIoT, ESPHome-NonRoot, HolidayLights, KiCadLibrary, LanguageTags, MediaTools, NxWitness, Utilities, VSCode-Server-DotNetCore, Vantage-Config, aiopurpleair, homeassistant-purpleair, so the section never arrived rather than being edited (verbatim canonical) -- **AGENTS.md > Context and Delegation Discipline** - **not carried** by AudioCleaner, DevKitCIoT, ESPHome-NonRoot, HolidayLights, KiCadLibrary, LanguageTags, MediaTools, NxWitness, Utilities, VSCode-Server-DotNetCore, Vantage-Config, aiopurpleair, homeassistant-purpleair, so the section never arrived rather than being edited (verbatim canonical) -- **AGENTS.md > Where the Rules Live** - **not carried** by AudioCleaner, DevKitCIoT, ESPHome-NonRoot, HolidayLights, KiCadLibrary, LanguageTags, MediaTools, NxWitness, Utilities, VSCode-Server-DotNetCore, Vantage-Config, aiopurpleair, homeassistant-purpleair, so the section never arrived rather than being edited (verbatim canonical) +- **GOVERNANCE.md > Workflow YAML Conventions** - hand-modified in ESPHome-Config (verbatim canonical) +- **AGENTS.md > Fleet Bootstrap** - **not carried** by AudioCleaner, DevKitCIoT, ESPHome-NonRoot, HolidayLights, KiCadLibrary, MediaTools, VSCode-Server-DotNetCore, Vantage-Config, homeassistant-purpleair, so the section never arrived rather than being edited (verbatim canonical) +- **AGENTS.md > Context and Delegation Discipline** - **not carried** by AudioCleaner, DevKitCIoT, ESPHome-NonRoot, HolidayLights, KiCadLibrary, MediaTools, VSCode-Server-DotNetCore, Vantage-Config, homeassistant-purpleair, so the section never arrived rather than being edited (verbatim canonical) +- **AGENTS.md > Where the Rules Live** - **not carried** by AudioCleaner, DevKitCIoT, ESPHome-NonRoot, HolidayLights, KiCadLibrary, MediaTools, VSCode-Server-DotNetCore, Vantage-Config, homeassistant-purpleair, so the section never arrived rather than being edited (verbatim canonical) +- **PSScriptAnalyzerSettings.psd1** - hub-hosted and undeclared in the manifest, carried by HomeAutomation-Config ## Mechanical re-vendor (verbatim stale copies) A past hub revision, not the current canonical - the audit already flags these as DRIFT. Copy the current file down. No judgment needed. -- **AGENTS.md > Context and Delegation Discipline** (2): PhotoCleaner, PlexCleaner -- **AGENTS.md > Where the Rules Live** (7): Blog, ESPHome-Config, Financial-Modeling, HomeAssistant-Config, HomeAutomation-Config, PhotoCleaner, PlexCleaner -- **GOVERNANCE.md > Repository Boundaries and Write Safety** (2): PhotoCleaner, PlexCleaner -- **GOVERNANCE.md > Operational Repositories** (2): PhotoCleaner, PlexCleaner -- **GOVERNANCE.md > Hub-Hosted Tooling** (2): PhotoCleaner, PlexCleaner -- **GOVERNANCE.md > PR Review Etiquette** (5): ESPHome-Config, Financial-Modeling, HomeAssistant-Config, PhotoCleaner, PlexCleaner -- **GOVERNANCE.md > Workflow YAML Conventions** (7): Blog, ESPHome-Config, Financial-Modeling, HomeAssistant-Config, HomeAutomation-Config, PhotoCleaner, PlexCleaner -- **GOVERNANCE.md > Repository Details** (5): ESPHome-Config, Financial-Modeling, HomeAssistant-Config, PhotoCleaner, PlexCleaner -- **.markdownlint-cli2.jsonc** (11): DevKitCIoT, ESPHome-NonRoot, HolidayLights, KiCadLibrary, LanguageTags, MediaTools, NxWitness, Utilities, VSCode-Server-DotNetCore, Vantage-Config, homeassistant-purpleair +- **AGENTS.md > Context and Delegation Discipline** (10): Blog, ESPHome-Config, Financial-Modeling, HomeAssistant-Config, HomeAutomation-Config, LanguageTags, NxWitness, PhotoCleaner, PlexCleaner, Utilities +- **AGENTS.md > Where the Rules Live** (10): Blog, ESPHome-Config, Financial-Modeling, HomeAssistant-Config, HomeAutomation-Config, LanguageTags, NxWitness, PhotoCleaner, PlexCleaner, Utilities +- **GOVERNANCE.md > Durable Knowledge and Self-Improvement** (9): Blog, ESPHome-Config, HomeAssistant-Config, HomeAutomation-Config, LanguageTags, NxWitness, PhotoCleaner, PlexCleaner, Utilities +- **GOVERNANCE.md > Repository Boundaries and Write Safety** (4): Blog, ESPHome-Config, HomeAssistant-Config, HomeAutomation-Config +- **GOVERNANCE.md > Release Model** (9): Blog, ESPHome-Config, HomeAssistant-Config, HomeAutomation-Config, LanguageTags, NxWitness, PhotoCleaner, PlexCleaner, Utilities +- **GOVERNANCE.md > Operational Repositories** (3): Blog, HomeAssistant-Config, HomeAutomation-Config +- **GOVERNANCE.md > Hub-Hosted Tooling** (10): Blog, ESPHome-Config, Financial-Modeling, HomeAssistant-Config, HomeAutomation-Config, LanguageTags, NxWitness, PhotoCleaner, PlexCleaner, Utilities +- **GOVERNANCE.md > Verification Discipline** (9): Blog, ESPHome-Config, HomeAssistant-Config, HomeAutomation-Config, LanguageTags, NxWitness, PhotoCleaner, PlexCleaner, Utilities +- **GOVERNANCE.md > PR Review Etiquette** (9): Blog, ESPHome-Config, HomeAssistant-Config, HomeAutomation-Config, LanguageTags, NxWitness, PhotoCleaner, PlexCleaner, Utilities +- **GOVERNANCE.md > Communicating with the User** (10): Blog, ESPHome-Config, Financial-Modeling, HomeAssistant-Config, HomeAutomation-Config, LanguageTags, NxWitness, PhotoCleaner, PlexCleaner, Utilities +- **GOVERNANCE.md > Workflow YAML Conventions** (8): Blog, HomeAssistant-Config, HomeAutomation-Config, LanguageTags, NxWitness, PhotoCleaner, PlexCleaner, Utilities +- **GOVERNANCE.md > Repository Details** (1): HomeAssistant-Config +- **.markdownlint-cli2.jsonc** (17): Blog, DevKitCIoT, ESPHome-Config, ESPHome-NonRoot, HolidayLights, HomeAssistant-Config, HomeAutomation-Config, KiCadLibrary, LanguageTags, MediaTools, NxWitness, PhotoCleaner, PlexCleaner, Utilities, VSCode-Server-DotNetCore, Vantage-Config, homeassistant-purpleair ## Promote candidates (intent uniform -> verbatim) _None - no intent unit is currently fleet-uniform with the canonical._ +## Resolved (recorded but no longer live - remove from the ledger) + +- **.markdownlint-cli2.jsonc** - Financial-Modeling (re-vendor) + [ledger]: ../spec/divergences.json From 27fe8e7b4550c61f33f6c4a630b89e82bbb5e638 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Sat, 12 Sep 2026 08:54:07 -0700 Subject: [PATCH 2/2] Drop the Stale Carrier List From the Codegen Task's Retire Reason The `run-codegen-pull-request-task.yml` row restated its carriers in the disposition's own reason text, and the restatement had gone stale: the row header now reads the live carrier as NxWitness alone while the sentence beside it still named LanguageTags too. Every sibling row that enumerates carriers dates the measurement that produced it, so it reads as a snapshot rather than as the current state. This row's did not. The enumeration is dropped rather than dated, since the row already renders the live carrier list two clauses earlier and a second copy can only go stale again. The action the sentence carried stays. Edited in the ledger and regenerated, per the report's generated-file header. --- reports/divergences.md | 2 +- spec/divergences.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reports/divergences.md b/reports/divergences.md index af86de4a..7e6a993f 100644 --- a/reports/divergences.md +++ b/reports/divergences.md @@ -28,7 +28,7 @@ Generated by `python3 spec/fidelity_honesty.py --report` - do not hand-edit. Cur - **.github/workflows/validate-task.yml** (manifest gap, carried by AudioCleaner, ESPHome-NonRoot, MediaTools, NxWitness, PlexCleaner, VSCode-Server-DotNetCore) - The file is hub-hosted as a workflow_call task rather than carried, per GOVERNANCE.md "Hub-Hosted Tooling" and docs/reusable-workflows.md "Stage 2: The Gates". The fleet doc-lint block, the language lint, the prose gate, and the repo gate move into the hub task, and a repo's own domain checks move into its own .github/actions/validate/action.yml hook instead, so a downstream copy is retired rather than re-vendored. The thirteen repos carrying a copy as of 2026-08-16 were PhotoCleaner, PlexCleaner, LanguageTags, Utilities, MediaTools, AudioCleaner, aiopurpleair, Financial-Modeling, Blog, ESPHome-NonRoot, NxWitness, VSCode-Server-DotNetCore, and HomeAutomation-Config, and the live current carrier list above may have moved on since. Delete the copy and adopt the caller stub in docs/reusable-workflows.md "Adopting the Gates" as each repo is next visited. - **.github/workflows/publish-docker-readme-task.yml** (manifest gap, carried by VSCode-Server-DotNetCore) - The task is hub-hosted per docs/reusable-workflows.md "The Docker Family", so a downstream copy of the job graph is retired rather than converged. The carrier is VSCode-Server-DotNetCore, whose copy replaces with the caller stub in docs/reusable-workflows.md "Adopting the Type-Specific Tasks" once a release carries the task. - **.github/workflows/check-upstream-version-task.yml** (manifest gap, carried by ESPHome-NonRoot) - The task is hub-hosted per docs/reusable-workflows.md "The Docker Family", so a downstream copy of the job graph is retired rather than converged. The carrier is ESPHome-NonRoot, whose check-upstream-version.yml caller and check-upstream-version-task.yml body both replace with the caller stub once a release carries the task. Its second tracker, check-upstream-dependency.yml, is a candidate to fold into the same hub task with auto-merge false, tracked as an adoption note rather than a gap here since it was never a copy of this snippet. -- **.github/workflows/run-codegen-pull-request-task.yml** (manifest gap, carried by NxWitness) - The task is hub-hosted per docs/reusable-workflows.md "Adopting the Type-Specific Tasks", so a downstream copy of the job graph is retired rather than converged. The carriers are LanguageTags and NxWitness, each replacing its copy with a codegen hook plus the caller stub once a release carries the task. +- **.github/workflows/run-codegen-pull-request-task.yml** (manifest gap, carried by NxWitness) - The task is hub-hosted per docs/reusable-workflows.md "Adopting the Type-Specific Tasks", so a downstream copy of the job graph is retired rather than converged. A carrier replaces its copy with a codegen hook plus the caller stub once a release carries the task. ### accepted diff --git a/spec/divergences.json b/spec/divergences.json index 0aa02c02..f2bad95e 100644 --- a/spec/divergences.json +++ b/spec/divergences.json @@ -30,7 +30,7 @@ { "path": ".github/workflows/deploy-site-task.yml", "disposition": "retire", "reason": "The task is hub-hosted per docs/reusable-workflows.md \"Adopting the Type-Specific Tasks\", so it is no longer a manifest entry (spec/files.json keeps only the deploy-site.yml caller stub entry for the hugo type) and a downstream copy is retired rather than converged. The carrier is Blog, replacing its copy with the caller stub once a release carries the task.", "tracking": null }, { "path": ".github/workflows/publish-docker-readme-task.yml", "disposition": "retire", "reason": "The task is hub-hosted per docs/reusable-workflows.md \"The Docker Family\", so a downstream copy of the job graph is retired rather than converged. The carrier is VSCode-Server-DotNetCore, whose copy replaces with the caller stub in docs/reusable-workflows.md \"Adopting the Type-Specific Tasks\" once a release carries the task.", "tracking": null }, { "path": ".github/workflows/check-upstream-version-task.yml", "disposition": "retire", "reason": "The task is hub-hosted per docs/reusable-workflows.md \"The Docker Family\", so a downstream copy of the job graph is retired rather than converged. The carrier is ESPHome-NonRoot, whose check-upstream-version.yml caller and check-upstream-version-task.yml body both replace with the caller stub once a release carries the task. Its second tracker, check-upstream-dependency.yml, is a candidate to fold into the same hub task with auto-merge false, tracked as an adoption note rather than a gap here since it was never a copy of this snippet.", "tracking": null }, - { "path": ".github/workflows/run-codegen-pull-request-task.yml", "disposition": "retire", "reason": "The task is hub-hosted per docs/reusable-workflows.md \"Adopting the Type-Specific Tasks\", so a downstream copy of the job graph is retired rather than converged. The carriers are LanguageTags and NxWitness, each replacing its copy with a codegen hook plus the caller stub once a release carries the task.", "tracking": null }, + { "path": ".github/workflows/run-codegen-pull-request-task.yml", "disposition": "retire", "reason": "The task is hub-hosted per docs/reusable-workflows.md \"Adopting the Type-Specific Tasks\", so a downstream copy of the job graph is retired rather than converged. A carrier replaces its copy with a codegen hook plus the caller stub once a release carries the task.", "tracking": null }, { "path": ".github/workflows/build-datebadge-task.yml", "disposition": "retire", "reason": "TODO.md \"Delete the retired byob.yarr.is last-build badge\" already settles that the badge service is deprecated and the badge itself is deleted rather than replaced, so this task is retired outright rather than hosted. The carrier is KiCadLibrary, whose deletion here is the same deletion that TODO.md entry already tracks for its badge job, not a separate migration.", "tracking": null } ] }