fix(ci): lint the whole repository in the docs-phase gate - #6
Merged
Conversation
`Refs #1` The pipeline ran `kanon lint --workflow .kanon-ci.toml` and `kanon lint --writing README.md`, which certified this file and the README and nothing else. The gate reported PASS while `kanon lint .` reported violations in AGENTS.md, CLAUDE.md and the gate-attestation workflow — it sampled the files least likely to have drifted and excluded the ones that had, so a green branch was weaker evidence than running the canonical linter by hand. `kanon lint .` replaces the scoped workflow check, which it subsumes. The README writing check stays because `--writing` applies prose rules the default pass does not. Turning the gate on surfaces the four violations it was hiding, fixed here: - AGENTS.md / CLAUDE.md carried no `defers_to` or `tightens` (CONTEXT/preamble-required). Both now use the fleet's prose form, matching dioptron and zetesis. - gate-attestation.yml declared neither `permissions` nor `concurrency` (YAML/missing-permissions, YAML/missing-concurrency). The reusable it calls declares `contents: read` for its own job but no concurrency group, so without the caller's group a rapid re-push left the superseded run to completion. Gate-Passed: kanon 0.1.12 +stages:fmt,check,clippy,nextest,lint sha:b6bf9031c587ac8d593fb4d73da689cc8b4a92bf
forkwright
pushed a commit
that referenced
this pull request
Jul 30, 2026
🤖 I have created a release *beep* *boop* --- ## [0.0.2](v0.0.1...v0.0.2) (2026-07-30) ### Bug Fixes * **ci:** grant reusable workflow permissions to unblock release-please ([#4](#4)) ([52603fc](52603fc)) * **ci:** lint the whole repository in the docs-phase gate ([#6](#6)) ([5349a75](5349a75)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
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.
Refs #1What was wrong
The pipeline ran two scoped commands:
They certify the CI file and the README — the two files least likely to have drifted — and nothing else.
kanon lint .reported four violations the gate never looked at. A required check that samples is not a proof surface.Change
repo-lintrunskanon lint ., which subsumes the scoped workflow check.readme-lintstays, because--writingapplies prose rules the default pass does not; it is additive, not substitutive.Turning the gate on surfaces the four violations it was hiding, all fixed here:
CONTEXT/preamble-requiredAGENTS.md— nodefers_to, notightensCONTEXT/preamble-requiredCLAUDE.md— no preamble at allYAML/missing-permissions.github/workflows/gate-attestation.ymlYAML/missing-concurrency.github/workflows/gate-attestation.ymlThe preambles use the fleet's prose form (
defers_to: kanon standards for universal engineering policy), matching dioptron and zetesis rather than inventing a third shape. The workflow gainspermissions: contents: readand aconcurrencygroup — the reusable it calls declares the former for its own job but no concurrency group at all, so without the caller's group a rapid re-push left the superseded run to run to completion.Verification — the gate was watched going red
A gate that has only ever been green is not evidence. Run on this box with a branch-built
kanon 0.1.12:1. Clean tree —
kanon gate --tier full --force .:2. Preamble stripped from
CLAUDE.md, nothing else changed — the same command:Against the previous pipeline that same tree passed. That difference is the fix.
3. Restored —
kanon lint . --summary:No violations found.Not fixed here, deliberately
The emitted trailer still reads
+stages:fmt,check,clippy,nextest,lint— stage names from config rather than the stages that actually ran, in a repo with no Cargo workspace for four of the five to mean anything. That is a kanon substrate defect (forkwright/kanon#2555), not something this repo can correct, and #1's finding already names it.The scaffold-side half of #1's desired correction — deriving this pipeline from one fleet scaffold with a fitness fixture — also lives in kanon. This PR fixes the instance; the generator that produced two identical copies of the defect is a kanon change and is called out on the issue.