Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions .agents/skills/dotnet-codestyle/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,9 @@ All builds must complete without warnings, enforced three ways:
surfaced as a warning fails the build and must be fixed or deliberately suppressed at the
narrowest scope that fits (see Analyzer suppressions below), never left to accumulate.
- **CI lint backstop.** CI runs the clean-compile checks on every PR as the authoritative gate.
Git hooks are optional, and a repo may wire a local runner (Husky.Net, with `dotnet husky run`
as a style step) for pre-commit enforcement, but CI is the gate that matters.
A working local hook is strongly suggested, not optional: wire Husky.Net from the canonical
`catalog/snippets/husky/` config. See GOVERNANCE.md "Running the Linters Locally" for what the
hook must cover and what its absence means.

**A new port is not a license to silence diagnostics.** Brownfield or just-ported status never
justifies relaxing analyzer severities or muting newly surfaced warnings. Fix them. (The only
Expand Down Expand Up @@ -94,8 +95,8 @@ updates, dependency upgrades, benchmarks) on top:
`dotnet format style --verify-no-changes --severity=info --verbosity=detailed`.
- **`dotnet-outdated-tool`** checks for dependency updates, and Nerdbank.GitVersioning owns
version management.
- CI is the authoritative lint backstop. Local pre-commit hooks are optional, wire Husky.Net (or
another runner) if you want local enforcement.
- CI is the authoritative lint backstop. A local pre-commit hook is strongly suggested: wire
Husky.Net from `catalog/snippets/husky/` for local enforcement, including the shared doc gates.
- **Required VS Code extensions**: CSharpier, markdownlint, CSpell. Use the workspace settings
without overrides.

Expand Down
6 changes: 4 additions & 2 deletions .agents/skills/python-codestyle/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,10 @@ The Python clean-compile is `uv run ruff format` + `uv run ruff check` + the rep
both (see Type checking above). Run it, plus `uv run pytest`, before committing. These are
documented commands, and an optional VS Code tasks mirror (all `type: process`, no `&&` shell
chaining, so it runs the same on any task shell) is in the hub `vscode-tasks-python.json` snippet.
CI runs the same clean-compile commands as the authoritative backstop. Git hooks are opt-in, so
wire `pre-commit` for `ruff` and the type checker yourself if you want local enforcement.
CI runs the same clean-compile commands as the authoritative backstop. A working local hook is
strongly suggested, not opt-in: wire the Python `pre-commit` framework from the canonical
`catalog/snippets/pre-commit/.pre-commit-config.yaml`. See GOVERNANCE.md "Running the Linters
Locally" for what the hook must cover and what its absence means.
Comment thread
coderabbitai[bot] marked this conversation as resolved.

A restricted executor gives each task a cache directory under a writable temporary root. Point
`UV_CACHE_DIR`, `RUFF_CACHE_DIR`, `MYPY_CACHE_DIR`, and `COVERAGE_FILE` into that directory before
Expand Down
6 changes: 3 additions & 3 deletions .agents/skills/repo-worktree/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,9 +185,9 @@ in the new tree.
- **Husky.Net:** When `.husky/pre-commit` sources `.husky/_/husky.sh` and the local .NET tool
manifest declares Husky.Net, run `dotnet tool restore`, then `dotnet husky install` from the
worktree root.
- **Python pre-commit:** When `.pre-commit-config.yaml` exists, install the repository's declared
Python environment, then run `pre-commit install` through that environment. A uv project runs
`uv sync --frozen`, then `uv run pre-commit install`.
- **Python pre-commit:** When `.pre-commit-config.yaml` exists, run `uv tool install pre-commit`
once per host if not already installed, then `pre-commit install` from the worktree root.
`pre-commit` is never a project dependency, so this is the same regardless of profile.
- **Repository override:** Follow a repository's explicit hook-setup instructions when they
differ from these standard cases. Do not infer a replacement command from the language alone.

Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/fleet-skills/.source-digest
Original file line number Diff line number Diff line change
@@ -1 +1 @@
85b7db1858ecd00a
332c16d2c066383b
9 changes: 5 additions & 4 deletions .claude-plugin/fleet-skills/skills/dotnet-codestyle/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,9 @@ All builds must complete without warnings, enforced three ways:
surfaced as a warning fails the build and must be fixed or deliberately suppressed at the
narrowest scope that fits (see Analyzer suppressions below), never left to accumulate.
- **CI lint backstop.** CI runs the clean-compile checks on every PR as the authoritative gate.
Git hooks are optional, and a repo may wire a local runner (Husky.Net, with `dotnet husky run`
as a style step) for pre-commit enforcement, but CI is the gate that matters.
A working local hook is strongly suggested, not optional: wire Husky.Net from the canonical
`catalog/snippets/husky/` config. See GOVERNANCE.md "Running the Linters Locally" for what the
hook must cover and what its absence means.

**A new port is not a license to silence diagnostics.** Brownfield or just-ported status never
justifies relaxing analyzer severities or muting newly surfaced warnings. Fix them. (The only
Expand Down Expand Up @@ -94,8 +95,8 @@ updates, dependency upgrades, benchmarks) on top:
`dotnet format style --verify-no-changes --severity=info --verbosity=detailed`.
- **`dotnet-outdated-tool`** checks for dependency updates, and Nerdbank.GitVersioning owns
version management.
- CI is the authoritative lint backstop. Local pre-commit hooks are optional, wire Husky.Net (or
another runner) if you want local enforcement.
- CI is the authoritative lint backstop. A local pre-commit hook is strongly suggested: wire
Husky.Net from `catalog/snippets/husky/` for local enforcement, including the shared doc gates.
- **Required VS Code extensions**: CSharpier, markdownlint, CSpell. Use the workspace settings
without overrides.

Expand Down
6 changes: 4 additions & 2 deletions .claude-plugin/fleet-skills/skills/python-codestyle/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,10 @@ The Python clean-compile is `uv run ruff format` + `uv run ruff check` + the rep
both (see Type checking above). Run it, plus `uv run pytest`, before committing. These are
documented commands, and an optional VS Code tasks mirror (all `type: process`, no `&&` shell
chaining, so it runs the same on any task shell) is in the hub `vscode-tasks-python.json` snippet.
CI runs the same clean-compile commands as the authoritative backstop. Git hooks are opt-in, so
wire `pre-commit` for `ruff` and the type checker yourself if you want local enforcement.
CI runs the same clean-compile commands as the authoritative backstop. A working local hook is
strongly suggested, not opt-in: wire the Python `pre-commit` framework from the canonical
`catalog/snippets/pre-commit/.pre-commit-config.yaml`. See GOVERNANCE.md "Running the Linters
Locally" for what the hook must cover and what its absence means.

A restricted executor gives each task a cache directory under a writable temporary root. Point
`UV_CACHE_DIR`, `RUFF_CACHE_DIR`, `MYPY_CACHE_DIR`, and `COVERAGE_FILE` into that directory before
Expand Down
6 changes: 3 additions & 3 deletions .claude-plugin/fleet-skills/skills/repo-worktree/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,9 +185,9 @@ in the new tree.
- **Husky.Net:** When `.husky/pre-commit` sources `.husky/_/husky.sh` and the local .NET tool
manifest declares Husky.Net, run `dotnet tool restore`, then `dotnet husky install` from the
worktree root.
- **Python pre-commit:** When `.pre-commit-config.yaml` exists, install the repository's declared
Python environment, then run `pre-commit install` through that environment. A uv project runs
`uv sync --frozen`, then `uv run pre-commit install`.
- **Python pre-commit:** When `.pre-commit-config.yaml` exists, run `uv tool install pre-commit`
once per host if not already installed, then `pre-commit install` from the worktree root.
`pre-commit` is never a project dependency, so this is the same regardless of profile.
- **Repository override:** Follow a repository's explicit hook-setup instructions when they
differ from these standard cases. Do not infer a replacement command from the language alone.

Expand Down
9 changes: 5 additions & 4 deletions .github/skills/dotnet-codestyle/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,9 @@ All builds must complete without warnings, enforced three ways:
surfaced as a warning fails the build and must be fixed or deliberately suppressed at the
narrowest scope that fits (see Analyzer suppressions below), never left to accumulate.
- **CI lint backstop.** CI runs the clean-compile checks on every PR as the authoritative gate.
Git hooks are optional, and a repo may wire a local runner (Husky.Net, with `dotnet husky run`
as a style step) for pre-commit enforcement, but CI is the gate that matters.
A working local hook is strongly suggested, not optional: wire Husky.Net from the canonical
`catalog/snippets/husky/` config. See GOVERNANCE.md "Running the Linters Locally" for what the
hook must cover and what its absence means.

**A new port is not a license to silence diagnostics.** Brownfield or just-ported status never
justifies relaxing analyzer severities or muting newly surfaced warnings. Fix them. (The only
Expand Down Expand Up @@ -94,8 +95,8 @@ updates, dependency upgrades, benchmarks) on top:
`dotnet format style --verify-no-changes --severity=info --verbosity=detailed`.
- **`dotnet-outdated-tool`** checks for dependency updates, and Nerdbank.GitVersioning owns
version management.
- CI is the authoritative lint backstop. Local pre-commit hooks are optional, wire Husky.Net (or
another runner) if you want local enforcement.
- CI is the authoritative lint backstop. A local pre-commit hook is strongly suggested: wire
Husky.Net from `catalog/snippets/husky/` for local enforcement, including the shared doc gates.
- **Required VS Code extensions**: CSharpier, markdownlint, CSpell. Use the workspace settings
without overrides.

Expand Down
6 changes: 4 additions & 2 deletions .github/skills/python-codestyle/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,10 @@ The Python clean-compile is `uv run ruff format` + `uv run ruff check` + the rep
both (see Type checking above). Run it, plus `uv run pytest`, before committing. These are
documented commands, and an optional VS Code tasks mirror (all `type: process`, no `&&` shell
chaining, so it runs the same on any task shell) is in the hub `vscode-tasks-python.json` snippet.
CI runs the same clean-compile commands as the authoritative backstop. Git hooks are opt-in, so
wire `pre-commit` for `ruff` and the type checker yourself if you want local enforcement.
CI runs the same clean-compile commands as the authoritative backstop. A working local hook is
strongly suggested, not opt-in: wire the Python `pre-commit` framework from the canonical
`catalog/snippets/pre-commit/.pre-commit-config.yaml`. See GOVERNANCE.md "Running the Linters
Locally" for what the hook must cover and what its absence means.

A restricted executor gives each task a cache directory under a writable temporary root. Point
`UV_CACHE_DIR`, `RUFF_CACHE_DIR`, `MYPY_CACHE_DIR`, and `COVERAGE_FILE` into that directory before
Expand Down
6 changes: 3 additions & 3 deletions .github/skills/repo-worktree/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,9 +185,9 @@ in the new tree.
- **Husky.Net:** When `.husky/pre-commit` sources `.husky/_/husky.sh` and the local .NET tool
manifest declares Husky.Net, run `dotnet tool restore`, then `dotnet husky install` from the
worktree root.
- **Python pre-commit:** When `.pre-commit-config.yaml` exists, install the repository's declared
Python environment, then run `pre-commit install` through that environment. A uv project runs
`uv sync --frozen`, then `uv run pre-commit install`.
- **Python pre-commit:** When `.pre-commit-config.yaml` exists, run `uv tool install pre-commit`
once per host if not already installed, then `pre-commit install` from the worktree root.
`pre-commit` is never a project dependency, so this is the same regardless of profile.
- **Repository override:** Follow a repository's explicit hook-setup instructions when they
differ from these standard cases. Do not infer a replacement command from the language alone.

Expand Down
11 changes: 6 additions & 5 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,7 @@
# Sourcing it would therefore break the hook in a fresh clone.
# The path is kept for the fleet convention the line-ending pins are written against.
#
# The language-formatting half the fleet convention names is absent here, and measured rather than assumed.
# This repository declares ruff in `pyproject.toml`, no workflow runs it, and the tree does not pass it.
# `ruff format --check` reports 13 of 57 files would be reformatted and `ruff check` reports 106 errors.
# A gate failing on the corpus it guards blocks every commit from the moment it lands.
# Converging the Python comes first, and the step is added here after that rather than before it.
# The language-formatting half the fleet convention names runs via uvx, matching CI's own invocation for a repo with no `uv.lock` (the Scripts profile, CODESTYLE.md "Two profiles").
#
# `repo_gate.py --check sha-pin` is absent for a different reason.
# It resolves same-owner pins against the GitHub API, and a hook needing a network fails offline.
Expand All @@ -23,6 +19,11 @@ set -e
# The relative paths below would otherwise resolve against whatever directory the caller was in.
cd "$(git rev-parse --show-toplevel)"

# Ruff and mypy, via uvx per this repo's own CI invocation for a repo with no `uv.lock`.
uvx ruff@latest format --check .
uvx ruff@latest check .
uvx mypy@latest

# The interpreter is chosen by running the probes spec/host-tools.json declares, in its order.
# On native Windows the python.org install registers `py` and not `python3`.
# That name resolves to a Microsoft Store alias stub, and Git Bash inherits the Windows PATH.
Expand Down
2 changes: 1 addition & 1 deletion AUDIT.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ A check with `intentRef`/`workflowRef` points at the prose section that owns the
- **carried-scope** - the repo carries no file the hub hosts rather than carries. The set is derived, not listed: the hub's git-tracked paths minus the [`spec/files.json`][files] baseline, so a file dropped from the manifest starts being reported on the next run with no retirement list to remember to edit. The remedy is the opposite of every other file finding, a **deletion**, since the repo reaches the hub's copy per [GOVERNANCE.md "Hub-Hosted Tooling"][governance-hub-hosted-tooling]. The match is on path alone, so a hit is a candidate and not a verdict: a repo's own content at a path the hub also uses matches while carrying nothing of the hub's, which the first fleet run showed twice, a KiCad tooling doc at `scripts/README.md` and per-repo formatting hooks at `.husky/pre-commit`. A [`spec/divergences.json`][divergences] `gaps` disposition decides which case a hit is, so only `retire` asserts a deletion, `accepted` closes a collision or a repo-owned file, and an untriaged hit is read before it is acted on.
- **verbatim-tree** - every applicable `trees[]` declaration in [`spec/files.json`][files] owns its target tree. The audit reports missing files as letter findings, stale or modified bytes as drift, and extra files under a pruned target as drift. An unreadable or truncated repository tree is undecided and produces drift rather than a clean result.
- **repo-setup** - every required secret for the repo's publish mechanisms is configured, and no forbidden secret is present (per [`spec/secrets.json`][secrets]).
- **linter-parity** - one config per linter (`.markdownlint-cli2.jsonc`, `cspell.json`, ruff/pyright, editorconfig/csharpier, actionlint) drives the editor extension, the CLI, and CI, and CI runs each.
- **linter-parity** - one config per linter (`.markdownlint-cli2.jsonc`, `cspell.json`, ruff/pyright, editorconfig/csharpier, actionlint) drives the editor extension, the CLI, and CI, and CI runs each. A local hook exists and runs at minimum the diff-scoped prose gate and the eol check via `hub-fetch-run.py`, or the hub's own local script copies for the hub repo itself (`parity.hooks`, intent). A repo with none wired is a defect, and one mid-convergence on the language-formatting half stays operational.
- **recurring-violations** - comments concise and non-narrative, ASCII only (no em-dash, no smart quotes), US spelling, line endings per `.editorconfig`. These are frequent regressions, so this dimension is high priority and always runs, and each check is grep-able (see below).
- **readme-structure** - the README follows [`spec/readme-structure.md`][readme-structure] (applicable sections, in order). Mechanically checked against the declared model in [`spec/readme-sections.json`][readme-sections]: required sections present, declared sections in their relative order, `License` last, the shields each deliverable implies, the license shield in the closing License section, and the tagline and its mirrors. A heading the model does not name is dropped before the order comparison, so a repo-specific section is never a finding.

Expand Down
2 changes: 1 addition & 1 deletion CODESTYLE.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Each language defines a **clean-compile** verification: the combination of build

- **Run it after every code change, and it is not the whole gate.** The relevant language's clean-compile must pass before you commit. CI runs those same language checks as a backstop **plus everything else its validation workflow runs**, and all of it reports into the one required status, so a green clean-compile does not predict a green CI. That remainder is at least the doc-lint set (markdownlint, cspell, actionlint, `editorconfig-checker`) and whatever spec, config, and script gates the repo carries, so read the workflow for the full list rather than assuming this sentence enumerates it. What has to pass before a push is the repo's **whole** lint gate, per [GOVERNANCE.md "Verification Discipline"][governance-verification-discipline]. Each linter's known-working invocation is in [GOVERNANCE.md "Running the Linters Locally"][governance-running-the-linters-locally].
- **The named task definition is the canonical spec** - its exact command sequence, arguments, and strictness. You may run it through the VS Code task **or** by invoking the equivalent native commands directly, and either is fine **only if the sequence, arguments, and strictness match exactly**. No shortcuts and no more-lenient options (for example, never drop `--verify-no-changes` or loosen a `--severity`).
- **A local commit/pre-commit gate is the repo's choice.** No single hook runner fits every language (a `dotnet`-tool runner like Husky.Net suits .NET but not Python), so none is mandated, but that is **not** a recommendation against commit gates. CI is the authoritative backstop regardless, and a local gate is an additive convenience a repo may wire and keep: Husky.Net (and `dotnet husky run` as a style step) for .NET, `pre-commit` for Python. Keeping a working gate is not drift.
- **A working local commit/pre-commit gate is strongly suggested, not the repo's free choice to skip.** No single hook runner fits every language (a `dotnet`-tool runner like Husky.Net suits .NET but not Python), so the *mechanism* stays the repo's choice: Husky.Net for .NET, `pre-commit` for Python, canonical configs for both in `catalog/snippets/`. What that gate must cover, and what its absence means for the audit, is [GOVERNANCE.md "Running the Linters Locally"][governance-running-the-linters-locally], not restated here. Keeping a working gate is not drift.
Comment thread
qodo-code-review[bot] marked this conversation as resolved.
Comment thread
ptr727 marked this conversation as resolved.

### Analyzer Diagnostics and Suppressions

Expand Down
Loading