From b3cc42bb5fad1d78b19ccf7c29eb26c9ddbc80f9 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Tue, 27 Oct 2026 15:06:09 -0700 Subject: [PATCH 1/2] Name the Forbidden VS Code Files Without a Path the Dead-Path Gate Reads (#3530) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Answers [#1612](https://github.com/ptr727/ProjectTemplate/issues/1612). The issue closes on the promotion pull request. `GOVERNANCE.md` "Editor and Tasks" named `.vscode/settings.json` and `.vscode/extensions.json` to forbid them. The prose gate's `dead-path` rule reads a backtick span containing a `/` as a path. It reports that path when git once tracked it and the tree no longer holds it. So every carrier that ever deleted `.vscode/settings.json` failed the gate as soon as a re-vendor touched the line. This section is `verbatim`, so the carrier cannot reword it and is held at an old revision. The sentence now names the files by basename "under `.vscode/`". The rule is unchanged. `path_candidate` drops a span with no `/`, and `.vscode/` has no file-shaped last segment, so neither span reaches the deletion check. ## Verification A throwaway repository commits `.vscode/settings.json` and then deletes it. In that repository, `prose_lint.py --check dead-path`: - on the old `GOVERNANCE.md`: `GOVERNANCE.md:354: dead-path: path '.vscode/settings.json' is deleted from this tree`, exit 1 - on the new `GOVERNANCE.md`: no finding, exit 0 The full prose gate on `GOVERNANCE.md` and `spec/validate.py` both pass. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 --- GOVERNANCE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GOVERNANCE.md b/GOVERNANCE.md index c8596b41f..21040ca81 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -351,7 +351,7 @@ Contributors commit to this repo with signed commits. The SSH-signing setup live ## Editor and Tasks - **VS Code is the primary IDE, and the experience favors it.** Prefer VS Code tasks and launch configurations for building, running, and testing over ad-hoc shell scripts. A script is the fallback, not the default. -- The `.code-workspace` file carries the shared editor settings and the recommended-extension set. **All VS Code settings and extension recommendations live only here, never in a standalone `.vscode/settings.json` or `.vscode/extensions.json`** (`.vscode/` holds only `tasks.json` and `launch.json`). A **standard set** of extensions applies to every repo (markdownlint, cspell, editorconfig, markdown-all-in-one, better-todo-tree), kept to extensions that work without a separately installed tool. A repo shipping a language adds that language's **defaults** (.NET: csdevkit, csharpier. Python: python, pylance, ruff, mypy. Docker: the Docker extension). **Any repo can add further extensions** of its own on top of them. +- The `.code-workspace` file carries the shared editor settings and the recommended-extension set. **All VS Code settings and extension recommendations live only here, never in a standalone `settings.json` or `extensions.json` under `.vscode/`** (`.vscode/` holds only `tasks.json` and `launch.json`). A **standard set** of extensions applies to every repo (markdownlint, cspell, editorconfig, markdown-all-in-one, better-todo-tree), kept to extensions that work without a separately installed tool. A repo shipping a language adds that language's **defaults** (.NET: csdevkit, csharpier. Python: python, pylance, ruff, mypy. Docker: the Docker extension). **Any repo can add further extensions** of its own on top of them. - The Table of Contents is maintained by the Markdown All in One extension, and `markdown.extension.toc.levels` in the workspace sets which heading levels it includes (see the Markdown rules for the authoring convention and the `` exclusion marker). - **Agents: editing a `.code-workspace` that a VS Code window has loaded as its workspace can reload that window and drop an agent session running in it.** "Verification Discipline" holds the rule. An agent leaves that edit to the maintainer while it knows a window with the file loaded hosts an agent session, the agent's own included. It treats any window but its own as hosting no session unless it knows otherwise. Where it still cannot tell whether the rule binds it, it asks the maintainer. An agent the rule does not bind edits the file directly. Opening the folder rather than the workspace, in every window holding the checkout, keeps a checkout's own file editable. From d74cf308e1713d350bc1f8e7b38c3dd2abe506b9 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Tue, 27 Oct 2026 15:30:22 -0700 Subject: [PATCH 2/2] Declare Python on HomeAutomation-Config's Registry Entry (#3532) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Applies the maintainer's decision on [#2255](https://github.com/ptr727/ProjectTemplate/issues/2255): HomeAutomation-Config declares `python`. The issue closes on the promotion pull request. The registry entry now carries: - `types`: `source-only` and `python` - `pythonDirectories`: the eight directories both of the repository's workflows pass to the hub validator's `python-directories` input (CloudInit, Cloudflare, MutationSweep, Notify, Trackers, USBDev, VPS, scripts) - `requiredSecrets`: `CODECOV_TOKEN`, which the repository already stores in both the actions and dependabot stores A new driftNote on the entry records the decision. The committed hub audit `reports/homeautomation-config/audit.md` records the earlier decision on HomeAutomation-Config #438 to keep `python` undeclared, and the maintainer reversed it under #2255. `docs/pre-commit-hooks-rollout.md` now gives HomeAutomation-Config's row the `pre-commit` framework half. Before, it read as a doc-gate-only repository, which a resync would tick as complete. Its box is now checked, because the hub audit in `reports/homeautomation-config/audit.md` graded `parity.hooks` passing with the Python gates included, and the tracker's maintenance rule owes the box once that audit exists. A sweep of every row against the registry found that the hub's own row also omitted its `python` type, and that row is corrected too. It also now names #962, rather than "this PR", as where its ruff/mypy half was added. ## Verification - `spec/validate.py` passes. - `uv run --no-project --script spec/audit.py HomeAutomation-Config`, run against this registry, no longer reports the five findings #2255 tracks: the type, the two `python-directories` findings and the two `CODECOV_TOKEN` secret findings. It raises no new python, profile or secrets finding. ## Pre-existing findings, not filed - `spec/divergences.json:24`, a stale rationale: the `accepted` reason for `.github/actions/validate/action.yml` says HomeAutomation-Config's override runs its CloudInit Python project. The downstream file now says it runs no Python step of its own, because all Python goes through the hub validator's `python-directories` input. The disposition itself still holds, since the override remains for Pester and the shell harnesses. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5.5 --- docs/pre-commit-hooks-rollout.md | 7 ++++--- registry/repos.json | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/pre-commit-hooks-rollout.md b/docs/pre-commit-hooks-rollout.md index adc65cb6e..27a00ef6d 100644 --- a/docs/pre-commit-hooks-rollout.md +++ b/docs/pre-commit-hooks-rollout.md @@ -57,8 +57,8 @@ later resync should mistake for unfinished work. Repos and their current `registry/repos.json` `types`, from the hub's own registry as of this doc's authorship. Archived repos are not tracked. -- [x] **ProjectTemplate** (`source-only`, `docs`): the hub itself. Doc gates wired in - `.husky/pre-commit` since PR #642, and the ruff/mypy half added in this PR's own commits, +- [x] **ProjectTemplate** (`source-only`, `docs`, `python`): the hub itself. Doc gates wired in + `.husky/pre-commit` since PR #642. The ruff/mypy half was added in PR #962, once the corpus was confirmed clean (0 ruff errors, 200 files formatted, mypy clean). - [ ] **Utilities** (`csharp`, `nuget`): Husky.Net + doc gates. - [ ] **LanguageTags** (`csharp`, `nuget`, `codegen`): Husky.Net + doc gates. @@ -70,7 +70,8 @@ doc's authorship. Archived repos are not tracked. - [ ] **ESPHome-NonRoot** (`docker`, `upstream-wrapper`): doc-gate half only, no declared language. - [ ] **VSCode-Server-DotNetCore** (`docker`): doc-gate half only, no declared language. - [ ] **NxWitness** (`docker`, `upstream-wrapper`, `codegen`, `csharp`): Husky.Net + doc gates. -- [ ] **HomeAutomation-Config** (`source-only`): doc-gate half only, no declared language. +- [x] **HomeAutomation-Config** (`source-only`, `python`): `pre-commit` framework + doc gates. + The hub audit in `reports/homeautomation-config/audit.md` graded `parity.hooks` passing. - [ ] **KiCadLibrary** (`eda`, `python`): `pre-commit` framework + doc gates. - [ ] **EspDinIoT** (`eda`): doc-gate half only, no fleet-covered language. - [ ] **ESPHome-Config** (`source-only`, `python`, `cpp`): `pre-commit` framework + doc gates for diff --git a/registry/repos.json b/registry/repos.json index b519d58e3..7e7fd7e2e 100644 --- a/registry/repos.json +++ b/registry/repos.json @@ -156,16 +156,17 @@ "name": "HomeAutomation-Config", "url": "https://github.com/ptr727/HomeAutomation-Config", "status": "cataloged", - "types": ["source-only"], + "types": ["source-only", "python"], "groundTruthBranch": "main", "workflowModel": "release", "lineEndings": "lf", "hasDevelop": true, "publish": [{ "target": "github-release", "mechanism": "none" }], - "requiredSecrets": [], + "requiredSecrets": ["CODECOV_TOKEN"], "consumerModel": "pull", "releaseTrigger": "dispatch-only", - "driftNotes": ["Maintainer home-lab code repo (docker-compose stacks, host install and lifecycle scripts, Firewalla configs), installed onto the Proxmox host and the VPS rather than edited in place, so it runs the release model. It is Linux-consumed, so lineEndings lf.", "Reclassified from operational to release on 2026-09-24 (HomeAutomation-Config #425). The -Config suffix in its name predates the reclassification.", "Renamed from HomeAutomation for fleet naming consistency (config repos are *-Config). The Vantage controller config is split out to its own Vantage-Config repo (lf default, only `.dc` pinned CRLF), not carried here, and the legacy Vantage/ subtree is stripped."] + "pythonDirectories": ["CloudInit", "Cloudflare", "MutationSweep", "Notify", "Trackers", "USBDev", "VPS", "scripts"], + "driftNotes": ["Maintainer home-lab code repo (docker-compose stacks, host install and lifecycle scripts, Firewalla configs), installed onto the Proxmox host and the VPS rather than edited in place, so it runs the release model. It is Linux-consumed, so lineEndings lf.", "Reclassified from operational to release on 2026-09-24 (HomeAutomation-Config #425). The -Config suffix in its name predates the reclassification.", "Declares python since 2026-10-27 (ProjectTemplate #2255), after its CI came to gate eight Python directories through the hub validator. The maintainer reversed the earlier decision, on HomeAutomation-Config #438, to keep python undeclared.", "Renamed from HomeAutomation for fleet naming consistency (config repos are *-Config). The Vantage controller config is split out to its own Vantage-Config repo (lf default, only `.dc` pinned CRLF), not carried here, and the legacy Vantage/ subtree is stripped."] }, { "name": "KiCadLibrary",