Skip to content

Promote Develop to Main: Seat the One-Home Include Mechanism and Finish the WORKFLOW.md Reshape - #1397

Merged
ptr727 merged 16 commits into
mainfrom
develop
Sep 7, 2026
Merged

Promote Develop to Main: Seat the One-Home Include Mechanism and Finish the WORKFLOW.md Reshape#1397
ptr727 merged 16 commits into
mainfrom
develop

Conversation

@ptr727

@ptr727 ptr727 commented Sep 7, 2026

Copy link
Copy Markdown
Owner

Closes #1205.
Closes #1212.
Closes #1240.
Closes #1250.
Closes #1267.
Closes #1268.
Closes #1271.
Closes #1288.
Closes #1305.
Closes #1314.

Sixteen commits, ten issues. Each was driven as its own feature pull request into develop,
reviewed by the PR-hosted reviewers, and merged only with CI green and every finding disposed of
by one of the five outcomes: fixed, declined on evidence, decided by the maintainer, deferred
behind a filed issue, or fixed as a class.

What this promotes

The one-home include mechanism and its first six classes (#1317). scripts/build_dist.py
gained include regions filled from a rule's home and checked by --check (#1378), so a Skill
carries a rule's whole text without a copy that can drift. Classes 2 to 6 then converted the
restatements: agent-conduct's three conduct sections (#1382), pr-review-conduct's five
outcomes into drive-pr with every step-ref renamed to a heading (#1383),
backlog-burndown's two narrowing rows cut to the narrowing with fourteen restatements
pointered (#1384), WORKFLOW.md section 4 into workflow-ci-contract (#1385), and section 2
cut to a pointer at GOVERNANCE.md "Workflow YAML Conventions" (#1388).

The WORKFLOW.md reshape (#1311 step 14's six-pull-request sequence, now finished). The
verdict clause aligned with section 5's Assessment (#1390), sections 3 and 5 carried into
workflow-ci-contract as generated includes (#1392), 5A collapsed to a procedure and an evidence
rule (#1394), and the preamble decisions settled alongside the reshape of section 4, section 6 and
the YAML conventions (#1395). Section 4's two longest items shrank to their outcomes with the
displaced knowledge moved rather than deleted, and section 6 now states only what each type adds,
carrying no N/A list at all.

The review loop's stop rule and disposition policy (#1330), rewriting disposal by deletion and
committing the condition under which a whole-unit loop ends, which #1267 filed as missing.

The Merge Gate's bound on an out-of-diff prose finding, with the reviewer footing recorded
(#1333), and reviewer bots scoped away from the generated Skill mirrors (#1329) so a mirror's diff
is never reviewed in place of its source.

The fleet label set, declared and applied through configure.sh (#1334).

The review ledger and skills digest decoupled from the working tree (#1328), so concurrent
branches no longer conflict in a generated report that cannot be hand-merged.

Plus one grouped Dependabot bump, docker/setup-qemu-action 4.2.0 to 4.3.0 (#1325).

What is deliberately not closed

#1311, #1317, #1206, #1367, #1369, #1370, #1371, #1386 and #1237 each still
hold findings this work did not settle. #1317 stands at class 6 of fourteen, and #1311's step 17
comment records what the reshape filed rather than fixed.

Owed on merge

spec/files.json declares both edited GOVERNANCE.md sections at verbatim fidelity, so every
downstream copy goes stale on this promotion and a fleet resync follows it.

🤖 Generated with Claude Code

dependabot Bot and others added 16 commits September 4, 2026 12:25
… group (#1325)

Bumps the actions-deps group with 1 update:
[docker/setup-qemu-action](https://github.com/docker/setup-qemu-action).

Updates `docker/setup-qemu-action` from 4.2.0 to 4.3.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/docker/setup-qemu-action/releases">docker/setup-qemu-action's
releases</a>.</em></p>
<blockquote>
<h2>v4.3.0</h2>
<ul>
<li>Bump <code>@​docker/actions-toolkit</code> from 0.92.0 to 0.96.0 in
<a
href="https://github.com/docker/setup-qemu-action/pull/336">docker/setup-qemu-action#336</a></li>
<li>Bump <code>@​sigstore/verify</code> from 3.1.0 to 3.1.1 in <a
href="https://github.com/docker/setup-qemu-action/pull/316">docker/setup-qemu-action#316</a></li>
<li>Bump brace-expansion from 1.1.15 to 1.1.18 in <a
href="https://github.com/docker/setup-qemu-action/pull/332">docker/setup-qemu-action#332</a></li>
<li>Bump js-yaml from 4.2.0 to 4.3.1 in <a
href="https://github.com/docker/setup-qemu-action/pull/334">docker/setup-qemu-action#334</a></li>
<li>Bump postcss from 8.5.10 to 8.5.25 in <a
href="https://github.com/docker/setup-qemu-action/pull/331">docker/setup-qemu-action#331</a></li>
<li>Bump sigstore from 4.1.0 to 4.1.1 in <a
href="https://github.com/docker/setup-qemu-action/pull/317">docker/setup-qemu-action#317</a></li>
<li>Bump undici from 6.27.0 to 6.28.0 in <a
href="https://github.com/docker/setup-qemu-action/pull/333">docker/setup-qemu-action#333</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/docker/setup-qemu-action/compare/v4.2.0...v4.3.0">https://github.com/docker/setup-qemu-action/compare/v4.2.0...v4.3.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/docker/setup-qemu-action/commit/1f40c72289eff860ee54a304f1438e3cff362e0a"><code>1f40c72</code></a>
Merge pull request <a
href="https://github.com/docker/setup-qemu-action/issues/336">#336</a>
from docker/dependabot/npm_and_yarn/docker/actions-to...</li>
<li><a
href="https://github.com/docker/setup-qemu-action/commit/932216e29e2417c3aa0bc5aec3c57089030cef2c"><code>932216e</code></a>
[dependabot skip] chore: update generated content</li>
<li><a
href="https://github.com/docker/setup-qemu-action/commit/a39e895360e601ae54e9ac97b8ea3b99e5f40491"><code>a39e895</code></a>
build(deps): bump <code>@​docker/actions-toolkit</code> from 0.92.0 to
0.96.0</li>
<li><a
href="https://github.com/docker/setup-qemu-action/commit/a98ae9ffe777adf16ca44873bab9926427b262fa"><code>a98ae9f</code></a>
Merge pull request <a
href="https://github.com/docker/setup-qemu-action/issues/333">#333</a>
from docker/dependabot/npm_and_yarn/undici-6.28.0</li>
<li><a
href="https://github.com/docker/setup-qemu-action/commit/8ebc9d118344dda0af3e25d2a7330010dd33e951"><code>8ebc9d1</code></a>
[dependabot skip] chore: update generated content</li>
<li><a
href="https://github.com/docker/setup-qemu-action/commit/c41e3fcbc0d6742101e0310c3b008ac3b16a9529"><code>c41e3fc</code></a>
build(deps): bump undici from 6.27.0 to 6.28.0</li>
<li><a
href="https://github.com/docker/setup-qemu-action/commit/5fc60dfac60f723a3386e73530ff8067f2848f60"><code>5fc60df</code></a>
Merge pull request <a
href="https://github.com/docker/setup-qemu-action/issues/332">#332</a>
from docker/dependabot/npm_and_yarn/brace-expansion-1...</li>
<li><a
href="https://github.com/docker/setup-qemu-action/commit/a26e892bb646b50218299a9b391e7a4b0322d96a"><code>a26e892</code></a>
Merge pull request <a
href="https://github.com/docker/setup-qemu-action/issues/328">#328</a>
from docker/dependabot/github_actions/actions/checkou...</li>
<li><a
href="https://github.com/docker/setup-qemu-action/commit/aa6d04232374700651c6e7be400e859600041423"><code>aa6d042</code></a>
Merge pull request <a
href="https://github.com/docker/setup-qemu-action/issues/324">#324</a>
from docker/dependabot/github_actions/actions/setup-n...</li>
<li><a
href="https://github.com/docker/setup-qemu-action/commit/d381ce5c16de15c000da8929fd1fc6e8fdef19e1"><code>d381ce5</code></a>
Merge pull request <a
href="https://github.com/docker/setup-qemu-action/issues/317">#317</a>
from docker/dependabot/npm_and_yarn/sigstore-4.1.1</li>
<li>Additional commits viewable in <a
href="https://github.com/docker/setup-qemu-action/compare/96fe6ef7f33517b61c61be40b68a1882f3264fb8...1f40c72289eff860ee54a304f1438e3cff362e0a">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=docker/setup-qemu-action&package-manager=github_actions&previous-version=4.2.0&new-version=4.3.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
#1328)

Part of #1311, executing #1313 unchanged, per the re-assessment on
#1311.

Two tracked artifacts were renderings rather than state, and both
collided between concurrent branches. This decouples them from the
working tree.

## What changed

- **The burn-down is no longer tracked.** `reports/canonical-review.md`
is removed from the tree. `canonical_review.py report` renders the
burn-down from the JSON ledger to standard output, and
`.github/actions/validate/action.yml` appends that rendering to the
run's job summary on every event. The `report --check` gate is gone with
the file it checked, since a rendering that is never committed has no
state to go stale. The JSON ledger stays tracked, sorted, one entry per
unit.
- **`record` holds a lock** across its read, merge, and replace of the
ledger, reusing `local_review.held_lock`. The lock file lives in the
worktree's own git directory rather than beside the ledger, so a record
killed mid-write leaves nothing untracked in `reports/`.
- **One digest stamp per skill.**
`.claude-plugin/fleet-skills/.source-digest`, one hash over every
skill's bytes, is replaced by
`.claude-plugin/fleet-skills/.source-digests/<name>`, one file per
skill, so two edits to two skills touch two files. `is_stale` compares
source, plugin, and `.github/skills/` per skill and refuses an orphaned,
missing, or hand-edited stamp. The stamps stay under the plugin root,
not under `.github/skills/`, which `spec/files.json` declares a verbatim
tree carried whole.
- **Every surface naming the tracked rendering was swept:**
`scripts/README.md` (where the "a rendering is never committed" rule is
now stated, once), `OPERATIONS.md`, `GOVERNANCE.md` "Verification
Discipline" and the linter section, `AGENTS.md` "Where the Rules Live",
and `local-strict-review` "The Carried-Content Pass", with the generated
skill trees regenerated.

## Tests

- `test_canonical_review.py`: two records applied in either order
produce one ledger, two branches recording different units merge without
a conflict, a held lock refuses the record rather than writing past it,
the lock lives in the git directory, and a record writes the ledger and
nothing else into the tree. The report cases now read the rendering from
standard output.
- `test_build_dist.py`: two skill edits change two disjoint stamp files,
and a hand-edited, missing, or orphaned stamp reports stale.
- Each new case was run against the develop engines first and failed
there: the lock cases error, the report cases fail on the file the old
engine still wrote, and every build_dist case errors on the missing
per-skill directory.

## Verification

Local gate set green from the worktree: ruff format and check, mypy, the
whole self-test surface, `build_dist.py --check`, `canonical_review.py
check` (the three carried units this change moved were each read whole
and recorded), prose lint, `spec/validate.py`, `repo_gate.py`, and
`docker_lint.py`.

## Residual

The JSON ledger is still one tracked file every canonical-content worker
writes. It merges wherever the two passes' entries do not land on the
same line, which is every case but two first-ever entries for units that
sort adjacently with no entry between them. That is the shape #1313
asked to keep, and `backlog-burndown`'s no-shared-file rule still names
no exception for it, which is that skill's own decision under #1323
rather than this change's. The ledger is written in place, as before,
and one docstring clause in `write_ledger` still says "the read this
replaces", meaning supersedes.

## Carried-content passes

The three carried units this change moved were each read whole twice,
since the first read's fixes are themselves edits. Findings in text this
branch wrote were fixed. Findings in text it did not write are listed
here for the maintainer rather than fixed or filed, since each is a
design call in a verbatim fleet-wide unit:

- `AGENTS.md` "Where the Rules Live": the `merge-and-release` sentence
says Skills are refreshed "first", while that skill refreshes them at
its step 7 after the dispatch. The `.husky/pre-push` sentence describes
enforcement a carrier cannot get, since the hook runs hub-hosted scripts
from the repo top level. The Skills paragraph says the Skills are
hub-local while `.github/skills/` is a carried verbatim tree. The lint
row routes a carrier to a hub-only section where its own `OPERATIONS.md`
"Local Verification" holds its invocations.
`carried-instruction-file-guard` is named nowhere in the file.
"canonical content this repository authors and others carry" binds "this
repository" to the carrier in a verbatim unit, where "the hub" is meant.
- `GOVERNANCE.md` "Verification Discipline": "byte for byte wherever the
declared fidelity is verbatim" omits the EOL and action-pin
normalization `spec/section-model.md` applies. "The destination is
declared fleet-wide" names no place the declaration lives. "or carries
no such file" binds to `OPERATIONS.md` rather than to the repository.
"Two Profiles" is quoted where the skill's heading reads "Two profiles",
declined as style consistent with that skill's own cross-references.
- `local-strict-review` "The Carried-Content Pass": the brief's `Paths:`
line never says what a unit key looks like, that `(preamble)` names the
text before the first level-two heading, or where a section ends, so a
subagent inheriting nothing cannot follow it literally. The
cross-checkout sentence never says an engine is pointed by its working
directory. "text the target has since changed" reads as since the fork
point where the mechanism needs since the stale ref's tip.
- `.husky/pre-push`, outside any unit: its dirty-tree remedy line
("commit what is being pushed, then run the pass and record it, then
push") states the receipt's order only, and where the dirty content is
the canonical ledger it points the reader the wrong way round.

Closes #1268, #1290, #1151. Relates #1240, #1295.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Part of #1311, the mechanical half of #1314 per the re-assessment there.
The Merge Gate prose amendment and the required-versus-advisory decision
wait for Step 3, as that comment sequences them.

## What changed

- **`.coderabbit.yaml`**, new: `path_filters` exclude
`.github/skills/**` and `.claude-plugin/fleet-skills/**`. Auto review is
enabled for pull requests into `develop` with no pause after five
reviewed commits. A Markdown path instruction asks for false, stale,
unverifiable, or unfollowable claims only. Sequence diagrams, suggested
labels and reviewers, and the in-progress fortune are off. The
markdownlint, actionlint, shellcheck, and ruff tools are off, since CI
runs the same four.
- **`.pr_agent.toml`**, new: `[ignore] glob` lists the same two trees.
Qodo is asked to reproduce a claimed crash before reporting it, to quote
the rule a compliance finding rests on, to keep a rule against unchanged
text in the summary, to route informational findings to the summary
rather than a thread, and to drop the badge images that hide a finding's
title from a text matcher. Qodo reads this file from the default branch,
so it binds once promoted to `main`.
- **`.github/copilot-instructions.md`** "Reviewing Carried Fleet
Content": one paragraph asks Copilot to post no review comment under
either generated tree and to put a finding on the file the fix belongs
in when the pull request changes it, otherwise in the review summary.
Read whole five times and recorded.
- **`docs/pr-reviewer-evaluation.md`**: "Generated Mirrors" and "Review
Configuration" subsections record every setting with the finding or cost
behind it, and the Status and Plan sections record the current footing:
both trials over, CodeRabbit and Qodo on public repositories only,
CodeRabbit's open-source tier auto-reviewing only at ten stars or more
so a review here is triggered by comment, a private repository
Copilot-only, Copilot's budget, and the Claude GitHub App installed but
unconfigured.

The issue names `.claude-plugin/**`, and the filters take
`.claude-plugin/fleet-skills/**` instead, since
`.claude-plugin/marketplace.json` beside that tree is hand-authored and
the wider glob would take it out of review too. Both files parse to
exactly the intended structures. Neither is declared in
`spec/files.json`, since the two advisory bots run on the hub only.

## Copilot

Content exclusion, the only hard mechanism, is documented for
organizations on a Business or Enterprise plan, and this repository is
under a user account, so it is unavailable. The instructions paragraph
above stands in for it, and GitHub documents such instructions as
non-deterministic, so it is a suggestion where the other two are
filters. That file is carried fleet-wide, so downstream repositories
pick the instruction up on their next resync, which matters because they
carry `.github/skills/` too.

## Carried-content pass

`.github/copilot-instructions.md` "Reviewing Carried Fleet Content" was
read whole twice. Findings in the paragraph this branch wrote were
fixed. Three pre-existing findings in text it did not write are for the
maintainer rather than fixed here: "Follow the fidelity declared for the
file" names a declaration a carrier does not hold, in `spec/files.json`,
at a granularity that is per unit rather than per file. "Canonical
source" and "the hub" resolve only through the preamble's pointer to
`AGENTS.md`, never from the unit alone. "Shared infrastructure" is the
unit's one use of that phrase for what the rest calls the hub.

## Acceptance

The issue's first acceptance test, a skill-editing pull request drawing
bot comments on `.agents/skills/` only, cannot be run on this pull
request, which edits no skill, and for Qodo cannot run before the next
promotion. It is measured on the first skill-editing pull request after
`main` carries this change.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…1330)

Part of #1311, Step 3 of the path re-proposed there, and its deletion
pilot in the same change. Three commits, each carrying its own
measurement in its message.

## What changed

- **`local-strict-review` "Disposing of Findings"**, rewritten by
deletion. The fourteen-sentence paragraph is five rules, each a bold
statement followed by a marked non-normative `Why:` line: every finding
ends in one of `pr-review-conduct`'s five outcomes by pointer, the
disposing agent classes each finding `style`, `introduced`, or
`pre-existing` in that order, another round is owed only while an
`introduced` finding is open, a push allows two rounds of edits across
both passes and then the remainder goes to the maintainer per
`pr-review-conduct` "Escalate to the maintainer when", and the pass is
mandatory while the count it records gates nothing.
- **`local-strict-review` "Running It"**: one sentence seating the
cross-unit sweep with the author assembling the brief. The `Return:`
line does not gain the class, since the disposing agent classes both
passes' findings and the carried-content reviewer reads knowing nothing
about the branch.
- **`GOVERNANCE.md` "Verification Discipline"**: one bullet. Another
round of edits is owed only while a defect this change introduced is
open, never by a finding count, and the class, what it owes, and the
budget are the Skill's.
- **`pr-review-conduct` "Never exit the loop early"**: one clause
scoping it to the PR-hosted loop and naming `local-strict-review` as the
home of the pre-push bound.
- `backlog-burndown` untouched, per the issue. Its "state a number in
the brief" budget and "file the remainder" route now differ from the
Skill's two rounds and escalation, which is #1323's.
- Skill mirrors regenerated with `scripts/build_dist.py`. The ledger
records each unit at the digest its last reviewer read.

## The pilot's measurement

`introduced` findings over total per whole-unit read, classed by the
rule this change writes, which was in every reviewer brief from the
first round. The first commit's rounds are R1 to R4, the second commit
restarted at R1 after answering the four findings the first left open,
and the third commit is one maintainer-granted round past the budget.

| Unit | Commit 1 | Commit 2 | Commit 3 |
| --- | --- | --- | --- |
| local-strict-review > Disposing of Findings | 9, 3, 1, 2 | 3/3, 1/1,
2/2 | 2/2 |
| local-strict-review > Running It | 2, 6, 4, reverted | 1/4, 1/3, 0/3 |
unchanged |
| GOVERNANCE.md > Verification Discipline | 8, 7, 3, 2 | 0/1 | 1/1 |
| pr-review-conduct > Expected review loop | 0 | unchanged | unchanged |

Two results. Units changed lightly converged in one to three reads, the
sweep sentence included once it sat in the author's seat. The unit
carrying the whole rule did not converge in eight whole reads across
three commits, holding at one to three `introduced` findings per round,
nearly every one against a clause the previous round's fix wrote.
Pointer-only fixes lowered the floor and did not reach it.

## Open findings, reported rather than fixed

The issue's pass budget is spent, so these stand, each `introduced`:

- `style` as "a preference between defensible forms" is wider than the
omit-preferences rule it is declined under, so a rule-backed form
classes `style` and is declined citing a rule that does not reach it.
- "editing stops" after the second round says nothing about the push,
while the recorded count admits it at the hook and the escalation rule
stops the unit of work.
- The `GOVERNANCE.md` bullet overlaps "A review flags an instance, so
fix the class" on a local pass with no tiebreak for siblings in text the
change did not touch.
- The lead-in's "a stale rationale is a cleanup rather than a defect"
has no cleanup class to land in, so a finding on a `Why:` line this
change wrote is `introduced` under the class rule and a cleanup under
the lead-in.
- "an `introduced` finding is fixed" unless disproven leaves outcomes 3,
4, and 5 unreachable for an `introduced` finding inside the budget,
against the first rule's "every finding ends in one of the five
outcomes".
- "Escalate to the maintainer when" lists four triggers and an exhausted
budget is not one of them, so only that section's seat-routing paragraph
applies to the pointer.
- `AGENTS.md`'s session-scope bullet, "a round count is not a reason to
leave one open", reads against a two-round stop in a seat that
escalates. My read is that the bullet governs ending a session and an
escalation keeps the session open, so no contradiction, left for the
maintainer to confirm.

## #1327 against "Disposing of Findings", 35 items

26 settled by the rewrite, 7 inherited by the pointer to
`pr-review-conduct`'s enumeration (7, 8, 9, 11, 12, 17, 76), 2 still
present by design (15 and 18). One new pre-existing finding on `Running
It`, the model-tier citation, is posted there.

## Verification

Full local gate set per `OPERATIONS.md` "Local Verification", 1060
tests, all green on each commit. Eleven whole-unit passes and three diff
passes recorded across the three commits.

Closes #1267. Relates #1104, #1283, #1327.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…d the Reviewer Footing (#1333)

Part of #1311, the Merge Gate half of #1314. With #1329's mechanical
half this settles that issue, so the `develop -> main` promotion PR
carries `Closes #1314`.

## What changed

- **`pr-review-conduct` Merge Gate item 2** records the reviewer
footing: the coverage the gate requires is Copilot's, and CodeRabbit and
Qodo are advisory, cited to the hub's `docs/pr-reviewer-evaluation.md`
"Status" rather than restated as a roster. The issue's recommendation
was advisory on prose paths only, and the recorded footing is advisory
on every path, since that doc says no candidate is a required reviewer
anywhere. Maintainer's call, flagged here rather than narrowed on my
own.
- **Merge Gate item 3** bounds what a finding on carried prose owes: a
finding classed `pre-existing` under `local-strict-review`'s classes, on
text inside a canonical Markdown unit, is outcome 4 applied once per
unit, gathered onto the unit's tracker on the hub, an open issue whose
title carries the unit key, and answered with that link. Every other
finding keeps its own outcome. The five outcomes stay the one
enumeration.
- **`GOVERNANCE.md` "Verification Discipline"** binds the sibling sweep
to a finding being fixed and to what the change touched or broke, filing
a pre-existing sibling elsewhere rather than folding it in. This is the
tiebreak the #1330 body listed as open (its third bullet).
`agent-conduct` surfaces the same bound.
- Skill mirrors regenerated. The ledger records each unit at the digest
its last reviewer read.

## Measurement, under the stop rule

`introduced` findings over total per read. Reads 1 to 3 are the
two-round budget, read 4 the maintainer-granted round on 2930660, read 5
the one clause granted on 2f1aaa8.

| Pass | Read 1 | Read 2 | Read 3 | Read 4 | Read 5 |
| --- | --- | --- | --- | --- | --- |
| pr-review-conduct > Merge Gate | 5/8 | 3/5 | 6/8 | 4/6 | 6/10 |
| agent-conduct > When a Failure Surfaces a Lesson | 0/3 | 0/3 | 0/1 |
unchanged | unchanged |
| GOVERNANCE.md > Verification Discipline | 0/9 | 1/3 | 0/5 | unchanged
| unchanged |
| Diff pass | 10/11 | 4/4 | 6/7 | 7/9 | 3/5 |

The two lightly edited units converged in one or two reads. The unit
carrying the new rule did not. Each of the two granted rounds fixed the
false claim it was granted for and drew a narrower one in its place: the
first made an intent unit the carrier's own, the second files every
intent-unit finding at the source, which a per-repo intent section such
as Repository Layout does not have. That is the pilot's curve, and the
next clause would draw the next one.

## Open `introduced` findings, reported rather than fixed

These stand for the maintainer. My recommendation is to merge with them
recorded on #1331 and let #1317's one-home pass, which this rule now
plainly needs, settle the carrier routing in one place.

1. A per-repo intent section (`GOVERNANCE.md` Devcontainer and
Repository Layout, a repo's own `CODESTYLE.md` additions, a "Disproved
Claims" ledger) has no source defect, so "filed there too ... fixed at
the source" files carrier-local noise on a hub tracker. The Verification
Discipline qualifier it drops is "since every other carrier holds it
too".
2. The carrier clause drops the `pre-existing` condition the hub-side
rule carries, so read literally every carrier finding on an intent unit
goes to the tracker, against the closing sentence.
3. The opener "turns on whether it is `pre-existing`" is falsified by
the carrier clause, where fidelity decides.
4. "gathers onto" names no action, and a closed tracker for a defect the
hub already fixed reads as "none is open", so a carrier on stale text
files a new tracker for a settled defect.
5. The fidelity branch names no source for a unit's fidelity,
`spec/files.json`, and covers verbatim and intent while the manifest
also carries `verbatim-tree`, which is how this skill itself reaches a
carrier.
6. The tracker retitle obligation sits only in this merge-time
checklist, and a heading rename happens under skills that never route
here. Copilot's open thread on the head asks the same.
7. A carrier's finding sits on a `.github/skills/` path that no unit key
names, so the text gives it no mirror-to-source mapping to find the unit
or its tracker.
8. The "Markdown" qualifier excludes the non-Markdown units `list` names
without saying why. Deliberate, the issue's own "correct for code".
9. The sweep bound is file-granular where the canonical pass reads by
unit and `backlog-burndown` bounds a change to the units the issue
names. The `backlog-burndown` half is #1323's.
10. "and the finding is being fixed" means a finding deferred under
outcome 4 owes no sibling sweep, so the class is lost on a deferral.
11. The local pass files a `pre-existing` finding "once" with no
tracker, so the same defect gets an issue from the local pass and a
tracker entry from a PR reviewer. A #1317 candidate.
12. A wrong `pre-existing` finding lands on the tracker unjudged. That
is the issue's design, batch and move on, with judgment deferred to the
tracker.
13. Every new sentence exceeds `comment-and-doc-style`'s 25-word cap for
new prose, an opt-in check the tree's existing prose predates.

Recorded as a coupling rather than a defect: item 2 hard-codes a
reviewer footing the evaluation doc marks revisable, and its citation of
a hub-only doc from a carried skill falls under no rule
`carried-doc-references` states, which the diff pass flagged as
uncovered rather than judged.

## Pre-existing findings, filed

- #1331, the Merge Gate unit's tracker, 9 items.
- #1332, the agent-conduct unit's tracker, 4 items.
- #1327 items 88 to 97 for "Verification Discipline", which #1315 will
split into a per-unit tracker whose title carries the key.

## Verification

Full local gate set per `OPERATIONS.md` "Local Verification", 1060
tests, all green. Three whole-unit passes and one diff pass, each read
three times, recorded. Pre-push hook passed both checks.

Relates #1311, #1314, #1315, #1317, #1327.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
repo-config/labels.json declares the fleet label set, the triage kinds gate, script, prose, decision, and chore, the review classes introduced and pre-existing, and the labels every fleet repo already shares. configure.sh apply creates or updates each declared label by name and deletes nothing, and check asserts each on name, color, and description while reporting undeclared labels without judging them. A shared pre-flight validator refuses an empty or out-of-contract payload before any write. The repo-config README, docs/repo-config.md, OPERATIONS.md, STANDUP.md, and AUDIT.md section 6 name the label set where they enumerate what the script applies or checks.

Part of #1315.
Part of #1317, the mechanism pull request its Scope names first. The
inventory it required is posted on the issue in three comments, and the
per-class pull requests follow this one. No live include region lands
here.

## What changes

- **`scripts/build_dist.py` fills include regions.** A skill source may
hold `<!-- include: <path> > <heading> -->` ... `<!-- /include -->`, and
the generator replaces the region's content with the body under that
heading of the named file, one blank line each side. The key is the same
`<path> > <section>` vocabulary `canonical_review.py` keys a unit on,
and that engine now reads the delimiter from `build_dist` rather than
declaring its own. Any heading level from two resolves, matched
case-insensitively the way `spec/audit.py` matches a declared section,
and the region ends at the next heading of the same or a higher level. A
source can be any regular file under the repository root, including a
sibling skill, and a source that carries regions of its own is read as
its filled text. Fence state comes from `spec/audit.py`'s own step
function, so a marker or heading shown inside a code sample is content.
- **The fill lands in `.agents/skills/` itself.** Codex and opencode
read that tree directly, so a region left empty there would hand them a
skill with a hole in it. The mirrors then carry the filled text and the
per-skill digests hash it. A file with no region is never rewritten, and
a CRLF file keeps its endings.
- **`--check` holds every region to its source.** A hand edit inside a
region and a source edit nobody regenerated for both exit 1, naming the
file. A key that no longer resolves, a cycle, a nested or unterminated
region, a path outside the root, through a symlink, or under a generated
tree each exit 2, the same code a symlink under the source tree already
uses, since regenerating cannot repair any of them.
- **The rule has one home.** `AGENTS.md`'s no-restatement sentence now
names the include as the one sanctioned full second statement, and the
`skill-lifecycle` Skill carries the mechanism, the check, and a third
doc-packaging shape, "Included content". `docs/fleet-map.md` and
`scripts/README.md` describe the generator accordingly.

## Verification

- `scripts/tests/test_build_dist.py` gains 17 cases covering the fill,
both generated trees, idempotence, the untouched no-region file, the
hand-edited region, the edited source, the renamed heading (raises
rather than reads stale), the exit codes 1 and 2 through `main()`,
case-folded and nested heading levels, ambiguous headings, markers and
headings inside fences, a source with regions of its own, a cycle, four
malformed shapes, five refused source paths, CRLF preservation, and a
region in a `references/` file. All 83 cases pass.
- Watched failing live against the real tree, with a throwaway skill
including `GOVERNANCE.md > Representative Data in Agent-Authored Text`:
the fill landed the section body, a hand edit inside the region made
`--check` exit 1 naming the file, a regenerate restored it, and
re-casing the heading in the key made `--check` exit 2 with the
unresolved heading named. The probe was then removed and `--check`
reports current.
- The whole `OPERATIONS.md` "Local Verification" gate set was run. Every
gate exits 0 on the final tree, including `build_dist.py --check`,
`canonical_review.py check`, `spec/validate.py`, `docker_lint.py`, and
both `prose_lint.py` invocations.

## Read record

Every pass ran at the strongest tier this session can name, one reviewer
per unit, and every pass is recorded whatever it found. Two rounds of
edits were the budget, one budget across the carried and diff passes,
and the maintainer granted a third, a fourth, and a final code-only
round on this pull request. `introduced` over total per read:

| Unit | R1 | R2 | R3 | R4 (granted) | R5 (granted) | R6 (granted, code
only) |
| --- | --- | --- | --- | --- | --- | --- |
| `skill-lifecycle > (preamble)` | 0/1 | unchanged | unchanged |
unchanged | unchanged | unchanged |
| `skill-lifecycle > The Pipeline` | 6/8 | 4/6 | 0/3 | 2/3 | 3/6 |
unchanged |
| `skill-lifecycle > Changing or Retiring a Skill` | 2/4 | 0/4 |
unchanged | unchanged | unchanged | unchanged |
| `skill-lifecycle > The Doc-Packaging Pattern` | 4/7 | 4/6 | 2/6 | 2/5
| 1/4 | unchanged |
| `copilot-instructions > Reviewing Carried Fleet Content` | not yet
edited | 2/6 | 3/5 | 2/5 | 3/5 | unchanged |
| Diff pass, diligence read before the first commit | 8/10 | | | | | |
| Diff pass, recorded after the first commit | | | 10/10 | | | |
| Diff pass, recorded after the first granted round's commit | | | |
10/10 | | |
| Diff pass, recorded after the second granted round's commit | | | | |
4/4 | |
| Diff pass, recorded after the final round's commit | | | | | | 6/6 |

**Introduced and fixed.** Round one: the audit import is lazy so the
installer's Python floor is unchanged, cycles compare files rather than
spellings, a key must be spelled as the tree spells it, any symlink on
the path is refused, a symlinked skill directory is refused before any
fill, an indented marker or heading is content, an empty body is
refused, mixed line endings in a file holding a region are refused.
Round two: the source-set sentence, the ledger-vocabulary claim, the
retire and rename bullets, the third doc-packaging shape, the runbook's
routing of a defect inside a region. The granted round, commit 9af52db:
the `sys.path` insert is guarded, a source holding text around its own
region renders single blank lines, a region outside the skills tree is
refused when a key reaches it, a missing path is reported as missing, a
lone CR is a third ending, a body leaving a fence open is refused, the
three "one place hand-edited" sentences except regions, the two exit-2
lists match, the doc-packaging shape states the doc side's sentence and
its action, and the runbook names the trees it bans comments on and
routes a downstream include-region defect to the summary.

**Introduced and fixed in the second granted round, commit 9ff4402:**
the blank-line collapse runs outside a fence only, a region in any file
the walk does not visit is refused when a key reaches it, the test
fixture is a mixin so the base cases run once, `AGENTS.md` says "cannot
drift undetected", the scripts README narrows the ledger claim to the
delimiter, the skill says the bytes change on the regenerate and reports
drift as stale rather than as a refusal, the doc-packaging paragraph
tells a disagreement from an edit, the `_exact_case` rationale matches
the code, and the runbook drops its redundant clause and names the
nested-region case.

**Introduced and still open after the second granted round, put here
with counts rather than edited further.** Seven, all prose, none on
code:

1. `The Pipeline`: "a skill file or source that is not UTF-8" exits 2
only for the Markdown files the walk decodes, so a non-UTF-8
`references/*.txt` or `scripts/` file is copied into both distributions
and `--check` exits 0.
2. `The Pipeline`: "exit 2 rather than 1" reads as the unrenderable
region's code alone, where a symlink anywhere under the skills tree and
an unreadable generated file also exit 2, and the unit names neither.
3. `The Pipeline`: a source need not be tracked, so an untracked or
ignored file fills the region locally and exits 2 in CI where the file
is absent.
4. `The Doc-Packaging Pattern`: the "Included content" shape has no
exemplar and no doc-side sentence exists in the tree, and will not until
a per-class pull request lands the first include.
5. `Reviewing Carried Fleet Content`: "that key" has no antecedent,
since the appositive shows the marker text without saying that `<path> >
<heading>` is the key.
6. `Reviewing Carried Fleet Content`: the nested-region sentence names
an inner key no copy shows, because the render drops the source's own
markers, so the object it names exists only in the hub's authored tree.
7. `Reviewing Carried Fleet Content`: "When the pull request changes the
file the fix belongs in" can never be true downstream once the fix is
placed in a hub file, and the unit leaves undecided whether a pull
request touching the local copy of that path qualifies.

The recorded diff pass after the second granted round raised four, down
from ten and ten: three small code items and one design divergence, all
fixed in the final round.

**Fixed in the final round, commit 616d9c0, code only:** a heading is
matched at any indentation, the way `spec/audit.py` and
`canonical_review.py` read one, so the three tools split a document
alike, and a level-one heading ends a body while a key still names level
two down. The blank-line collapse skips an indented code block as it
already skipped a fence. The symlink test's docstring gives the reason
the include walk left it.

The recorded diff pass after the final round raised six, all introduced,
none in the granted scope and none a regression of a fix. Listed here
with the seven prose items above, the thirteen open items on this pull
request, carried by #1380 on the maintainer's decision after the final
round:

8. `scripts/build_dist.py` `heading_body`: a body now ends at a
level-one heading, where `spec/audit.py` and `canonical_review.py` match
only `## ` and run through one, and the heading regex accepts a tab
after the hashes where they do not, so the "split alike" claim in two
comments holds for level-two headings only.
9. `scripts/build_dist.py` `filled_lines`: a marker may sit up to three
spaces indented, but the body is written at column 0 and the closing
marker keeps its indent, so a region opened inside a list item renders
outside it. Either refuse an indented marker or say the allowance covers
the marker, not the region.
10. `scripts/build_dist.py`: a near-miss marker, `<!-- include A.md > B
-->` without the colon or one with trailing text, matches nothing and is
content, so the region is never filled and `--check` exits 0. Worth
refusing any HTML comment line beginning `<!-- include`.
11. `scripts/README.md`: the exit-2 cause list omits a body leaving a
fence open, a region in a file the walk does not visit, and a file that
is not UTF-8, which the skill lists.
12. `AGENTS.md`'s closing paragraph and `docs/fleet-map.md` still say a
skill is "hand-authored" at the skills tree without the include-region
qualifier the two READMEs received.
13. `scripts/build_dist.py` `_unindented`: counts spaces only, so a
tab-indented code block's doubled blank lines collapse. Narrow, since
the Markdown lint keeps hard tabs out of sources.

Copilot's round-3 suppressed finding on the doubled include walk in
`--check` is deferred to #1379.

**Pre-existing, gathered onto the units' trackers** per the Merge Gate's
batch rule: #1373 (preamble), #1374 (The Pipeline), #1375 (Changing or
Retiring), #1376 (Doc-Packaging), #1377 (Reviewing Carried Fleet
Content), 22 lines across the five.

**A design consequence the maintainer may want to decide separately:**
an include region makes every skill unit carrying it change bytes when
its source section changes and the tree is regenerated, so one source
edit retires the source unit's pass and each including unit's pass, and
each is read again in the skill's own context. The skill states this as
the cost. The alternative, excluding a region's bytes from the including
unit's digest, is an engine change this pull request does not make.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
… Include Regions (#1382)

Part of #1317, class 2 of its inventory. Lands the first live include
regions, settles #1380 items 1, 5, and 10, and settles the
`agent-conduct` surface of #1237 and the eleven-of-twenty finding in
#1164.

## What changed

- **`agent-conduct` carries its three `GOVERNANCE.md` sections whole.**
"Verification Discipline", "Communicating with the User", and "Durable
Knowledge and Self-Improvement" are now include regions
`scripts/build_dist.py` fills, replacing the condensed lists the
inventory classed as nineteen drifting rows. The skill keeps its own
text only where the rule has no home in either document (asking when the
user can cheaply confirm, and the irreversible step staying the
maintainer's, both listed under #1317's "no home" set for class 14) and
where it points at a sibling rather than restating it.
- **The doc side states the shape.** Each of the three sections ends
with the one sentence naming the skill that includes it, per
`skill-lifecycle` "Included content", and that bullet now names
`agent-conduct` as its exemplar (#1380 item 10) and states what the
shape requires of a source: it is read outside its own document, so it
names a sibling section by document and heading rather than as above or
below, and links to no file by a relative path. The three sections' two
sibling references and one relative link were fixed to match, since the
include is what made them wrong.
- **A near-miss marker is refused (#1380 item 1).** `build_dist.py` now
refuses any line outside a code block that begins like an include marker
and matches neither form, in a skill or in a source it reads, since read
as content it leaves the region unfilled with `--check` exiting 0. The
test was watched failing before the fix. The exit-2 cause list in
`scripts/README.md` now also carries the open fence, the unwalked file,
and the non-UTF-8 file (#1380 item 5).

## The digest question

#1317's closing comment left one design call for this pull request:
whether a region's bytes should be excluded from the including unit's
digest in `scripts/canonical_review.py`, so a source edit does not
retire the pass on every skill that includes it. Decision: **not
excluded, engine unchanged**, for three reasons. The ledger's claim is
that a reviewer read these bytes, and excluding generated bytes changes
that claim to one about authored bytes only. A source that is not itself
a carried unit (a section of a hub-only doc, or of a skill file the
manifest does not carry) would then be text no pass ever reads whole.
And the cost is unmeasured, since this pull request rewrites every
including unit anyway. The cost shows on the next edit to one of the
three sections, and if it bites, the exclusion is its own engine change,
conditional on the source being a unit. Findings a reviewer raises
inside a region belong to the source unit and are filed there, which is
how the Copilot runbook already routes them.

## Measurement

`introduced` over total per read, `fable` tier, one reviewer per unit,
the whole-unit pass before the commit and the diff pass after it, two
edit rounds as the budget.

| Unit | R1 | R2 | R3 |
| --- | --- | --- | --- |
| agent-conduct > (preamble) | 0/1 | 0/1 | 0/0 |
| agent-conduct > Why This Exists | 0/0 | | |
| agent-conduct > Before Claiming Done | 2/3 | 0/2 | |
| agent-conduct > Before Assuming | 2/3 | 0/0 | |
| agent-conduct > When a Failure Surfaces a Lesson | 1/3 | 0/1 | |
| agent-conduct > Delegation, in One Paragraph | 0/0 | | |
| skill-lifecycle > The Pipeline | 0/1 | | |
| skill-lifecycle > The Doc-Packaging Pattern | 0/1 | | |
| GOVERNANCE.md > Verification Discipline | 0/1 | 0/2 | |
| GOVERNANCE.md > Durable Knowledge and Self-Improvement | 0/3 | 0/5 | |
| GOVERNANCE.md > Communicating with the User | 0/0 | 0/2 | |
| Diff pass | 1/1 | | |

The five introduced findings had three root causes, all in text this
change wrote: the doc-side sentence read "This section" from inside the
skill, where the pronoun binds to the skill's own section, so it now
names its home; my closing sentence counted one review pass where the
section requires two; and a pointer claimed the Boundaries section
answers a past session's grant, which it does not. Every pre-existing
finding is on its unit's tracker: #1361, #1366, #1374, #1376, and the
new #1381 for "Communicating with the User". Two units that read clean
in round 1 raised findings in round 2 (five on "Durable Knowledge"
against three), the non-convergence the pilot measured, all on rule text
this branch did not write.

## Open, past the budget

The diff pass, run after the second edit round, raised one introduced
finding on the new refusal in `scripts/build_dist.py`: `_INCLUDE_LIKE`
matches `<!--` and not the three-dash comment opener, so a region
written as `<!--- include: ... --->` with a matching `<!--- /include
--->` is content on both lines, fills nothing, and passes `--check`, the
hole the refusal exists to close. A three-dash open with a two-dash
close is already caught as an end marker with no region open. The fix is
one regex, `^<!--+\s*/?\s*include\b`, and one test case. The two-round
budget is spent, so per the stop rule I have not made it. **Requesting a
scoped grant: one code-only round for that regex and its test, watched
failing first.** With no grant the branch is mergeable as is, since
`develop` refuses nothing today and the gap is one typo shape narrower
than before.

## Verification

Full local gate set per `OPERATIONS.md` "Local Verification": ruff check
and format, mypy, the unit tests with the three selftests under
coverage, `build_dist.py --check`, `canonical_review.py check`,
`repo_gate.py`, both `prose_lint.py` invocations plus the diff mode,
`spec/validate.py`, and `docker_lint.py`. All green at the head this
description was written for.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
… Siblings by Heading (#1383)

Class 3 of #1317, one pull request under the stop rule. Settles #1288 in
full.

## What changes

- **`drive-pr` "Disposing of Every Finding" carries
`pr-review-conduct`'s five outcomes whole**, as an include region
`scripts/build_dist.py` fills from
`.agents/skills/pr-review-conduct/SKILL.md > Every finding ends in one
of five outcomes`. It is the first include whose source is a sibling
skill rather than a governance document, which "The Pipeline" already
permits. The condensed mapping it replaces had drifted on outcome 2's
scope, outcome 3's trigger and ordering, and a step-ref into its own
loop, the three defects #1288 names.
- **The source section reads whole outside its file.** Its one reference
to "step 1's push" now names `pr-review-conduct` "Expected review loop"
by heading, it ends with the sentence naming `drive-pr` as the skill
that includes it, per `skill-lifecycle` "Included content", and the
dangling "this" in outcome 1 now names the pass it meant.
- **Nineteen step-refs become the sibling's document and heading plus
what is needed from it**, across `drive-pr` (six), `local-strict-review`
(five), and `backlog-burndown` (eight). The five references into
`WORKFLOW.md` D-numbers, the write guard's rule 6, and the agent-safety
README's requirement 6 are not references between skills and stay, per
the issue's own scope line.
- **`drive-pr`'s frontmatter** no longer lists four of five outcomes as
if complete, names the seat that cannot reach the maintainer, and states
the promotion end state as every Merge Gate item except the maintainer's
explicit permission, the one item the drive's seat cannot satisfy. Step
8 of "The Drive Loop" states the same end state, since the diff pass
found the description had been a faithful restatement of that step's
gap.
- **Digest engine unchanged**, per the class 2 decision on #1317. The
region's bytes stay in the including unit's digest.

## Measurement, `introduced` over total per read

Nine units read whole at the `fable` tier, one reviewer per unit, two
rounds as the budget, plus a diff pass each round. HEAD was the merge
base when the ledger was recorded, and the branch carries one commit.

| Read | R1 | R2 | R3 | R4 |
| --- | --- | --- | --- | --- |
| `drive-pr` (preamble) | 2/2 | 0/0 | | |
| `drive-pr` Disposing of Every Finding | 1/3 | 0/2 | 0/2 | |
| `drive-pr` The Drive Loop | | 0/7 | | |
| `pr-review-conduct` Every finding ends in one of five outcomes | 0/4 |
1/5 | 0/4 | |
| `local-strict-review` Disposing of Findings | 1/5 | 0/2 | | |
| `local-strict-review` When to Run It | 0/3 | | | |
| `backlog-burndown` Dispatching a Worker | 0/4 | | | |
| `backlog-burndown` The Promotion Boundary | 0/4 | | 0/5 | 0/8 |
| `backlog-burndown` What Invoking This Skill Authorizes | 0/3 | | | |
| Diff pass | 1/1 | 1/1 | 1/2 | 0/0 |

The four round 1 `introduced` findings had three root causes, all in
framing text this change wrote: a seat with no antecedent, an end state
that dropped the Merge Gate's review-on-head item, and a sibling rule
named without its heading. Round 2 introduced one and the first granted
round's diff pass one more, both fixed under grants below. The
pre-existing findings are gathered on the four file trackers (#1337,
#1343, #1346, #1349), and the `drive-pr` tracker's item 5 is half
settled here.

## The two granted rounds

Two `introduced` findings were open after the second round, both
one-sentence edits and both also raised by Copilot's first round, and
the maintainer granted one round for both. Commit 5865970 makes
`backlog-burndown` "The Promotion Boundary" step 2 state the end state
`drive-pr` step 8 states, and names the `local-strict-review` pass where
outcome 1 said "that pass". Three units were read whole again and
recorded, and neither edit drew a finding.

The diff pass on that commit raised one `introduced` finding, again a
pronoun: the rewritten step 2 said "nothing in it terminates on its own"
with "it" twenty words from "that loop" and two new nouns nearer, and
Copilot's round on the same head raised it as a suppressed finding. The
maintainer granted the one-word fix, commit 52ff72e binds it to "that
loop", the unit was read whole once more and the diff pass on that
commit found nothing. The same passes read the section's opening
sentence, "driven to green and left for the maintainer", as a looser
statement of the end state, pre-existing, filed on #1337 with the
round's other pre-existing findings.

Two style notes are taken as they stand, each on a sentence already
rewritten twice: "the promotion half of `drive-pr` "The Drive Loop""
where `drive-pr` itself says "promotion steps", and the one-word line
the reflow leaves.

One round 2 finding is declined on precedent: the include's closing
sentence reads as a third-person statement about `drive-pr` from inside
`drive-pr`. That is the doc-side sentence the "Included content" shape
places inside the section, the same as `agent-conduct` over its three
`GOVERNANCE.md` sections, and the price of a byte-identical include.

Closes on promotion: #1288

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…r Its Fourteen Restatements (#1384)

Class 4 of #1317, scoped to one file,
`.agents/skills/backlog-burndown/SKILL.md`, plus its two generated
mirrors and digest.

## What changed

- **The two `narrowing` rows are cut to the narrowing itself** (#1305).
"Scope" says the run is narrower than `GOVERNANCE.md` "Repository
Boundaries and Write Safety" requires and no longer repeats what that
section says about reads or about the owner bound. "The Two Seats" had
no narrowing once the restated rule was cut, since a worker is exactly
the dispatched task `AGENTS.md` "Session Scope" describes, so its worker
bullet is a plain pointer.
- **Thirteen of the fourteen other inventory rows become pointers**,
each naming the home by document and heading and keeping only the
skill's own consequence: the question-issue prompt in "Ranking", the
failed-fetch stop in "Grouping and File Claims", the pre-push pass and
the shared-checkout sentence in "Dispatching a Worker", the two tier
bullets in "Choosing the Worker's Model Tier", the wait bound and the
dirty-tree sentence in "Bounding the Wait on a Worker", the escalation
bullet in "Raising a Blocked Question", the operational-model paragraph,
step 3, and step 5's rebase sentence in "The Promotion Boundary", and
the working-notes bullet in "Run State".
- **One row is left as it stands**: the inventory's `AGENTS.md` "Where
the Rules Live" condensation at "Dispatching a Worker" is the skill
stating its own procedure, and the skill is the home of that. The
restatement is `AGENTS.md`'s paragraph about this skill, which is class
8's deletion-and-pointer work.
- **One edit outside the inventory's fourteen rows**, requested on
#1323: the "Bounding a Prose Group" budget bullet is a pointer at
`local-strict-review` "Disposing of Findings", since #1312 landed the
number the bullet used to state a second time.

## What did not change

The eight step-refs in this file were class 3 (#1383). The "grant is
bounded by the session" and "Closing keywords go on the promotion pull
request" statements have no home and stay, per the inventory's class 14
list. The pre-existing findings on #1337 are untouched, this change
fixes none of them and states no new claim in their sentences.

## Verification

- `python3 scripts/build_dist.py --check`, `python3
scripts/prose_lint.py . --diff origin/develop` with the CI check list
plus `sentence-length`, `python3 spec/validate.py`: clean.
- Carried-content pass: ten units of this file read whole at the `fable`
tier, one reviewer per unit, recorded in
`reports/canonical-review.json`. Counts are in the pull request's read
record below.
- Diff pass recorded per `local-strict-review`.

## Read record, `introduced` over total per read

Ten units read whole at the `fable` tier, one reviewer per unit, before
the first commit. Round 2 read only the two units round 1's introduced
findings changed, round 3 read the one unit the first diff pass's
finding changed, round 4, a one-round grant past the budget, read the
one unit the second diff pass's finding changed, and round 5, a second
deletion-only grant, read the two units the third diff pass's findings
changed.

| Read | R1 | R2 | R3 | R4 | R5 |
| --- | --- | --- | --- | --- | --- |
| Scope | 0/0 | | | | |
| The Two Seats | 1/2 | 0/0 | | | |
| Ranking | 0/1 | | | | |
| Grouping and File Claims | 0/3 | | | 0/2 | |
| Bounding a Prose Group | 0/1 | | | | |
| Dispatching a Worker | 0/2 | | | | |
| Bounding the Wait on a Worker | 0/3 | | | | 0/3 |
| Raising a Blocked Question | 0/1 | | | | |
| The Promotion Boundary | 1/7 | 0/6 | 0/4 | | 0/7 |
| Run State | 0/1 | | | | |
| Diff pass | | 1/1 | 1/1 | 2/2 | 0/0 |

The six introduced findings: the worker bullet attributed the
one-worktree rule to `AGENTS.md` "Session Scope", which never mentions
worktrees, the operational paragraph's pointer left "What the model adds
... a direct push" without the clause that anchored it, step 2 of "The
Promotion Boundary" still cited "Bounding a Prose Group" as the
discipline that sets a budget after that section stopped setting one,
the failed-fetch sentence's "pushed since" lost its time anchor when the
restated clause was cut, the operational paragraph's "so confirm" drew a
cadence question from a premise that no longer stated one, and "doing it
by proxy is still doing it" lost its noun when "reaching into a tree"
was cut. The first two were fixed before round 2, the third before round
3, which spent the budget, the fourth under the maintainer's first
one-round grant before round 4, and the last two, both deletions, under
a second grant before round 5. Five of the six are a reference or a
connective left standing when the restated clause beside it was deleted,
the class 3 curve again, and the third diff pass found two of them on
sentences the first two diff passes had read. Every pre-existing finding
is on #1337, items 28 to 46, and the repeats of items 3, 13, 15, 22, and
27 are not listed again.

Closes on promotion: #1305

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…1385)

Class 5 of #1317, the d-guarantees catalog, on the maintainer's call in
this session: include `WORKFLOW.md` section 4 whole, and pointer the
skill's `GOVERNANCE.md` restatements.

## What changed

- **The condensed catalog is retired for a generated include.**
`references/d-guarantees.md` keeps its path and is now a title, one
framing sentence, and one include region filled from `WORKFLOW.md > 4.
Behavioral Contract: Expected Outcomes`, so the skill carries the
contract's own text and the condensation that #1205, #1212, #1250, and
#1240 found drifting no longer exists. The include carries all nine
D-subsections, byte for byte.
- **Section 4 gains the constraints an included source carries.** Its
two cross-section references name the document and heading
(`WORKFLOW.md` section 3's "Output Seam by Destination" bullet,
`WORKFLOW.md` section 5B's S9), the D9 heading's "(See Section 2)"
becomes a sentence naming what section 2 resolves for D9.1 and D9.2, and
the section ends with the one-sentence formula naming its includer that
`GOVERNANCE.md`'s three included sections use. The two
`spec/project-types.json` `workflowRef` anchors that named the D9
heading's old slug name its current one.
- **The eighteen `SKILL.md` rows against `GOVERNANCE.md` homes become
pointers**, each naming the home by document and heading and keeping
only the skill's own consequence: "Why This Exists" no longer restates
the precedence claim, "Outcomes, not bytes" and "Reached, not carried"
point at "Foundational Principles" and "Hub-Hosted Tooling", the nine
style bullets become "Style Rules", a pointer at "Workflow YAML
Conventions" and `WORKFLOW.md` section 2, the three spine rows point at
"Release Model" and "Workflow YAML Conventions", and "After Any Workflow
Edit" points at "Verification Discipline" for the whole-gate rule it
used to contradict, dropping the single-linter invocation.
- **The surfaces that cite the skill as an example say which shape it
now uses.** `skill-lifecycle` "The Doc-Packaging Pattern" names it under
kept authority for `WORKFLOW.md` outside section 4 and under included
content for section 4, and `docs/fleet-map.md`'s G9 resolution and the
skill's overlap line say the same.
- **The ledger drops six entries** for the retired catalog's sections
and the renamed heading, which the engine reports as orphans and leaves
to a reader to prune. The ledger's note says it is never written by
hand, and the engine has no prune verb, which #1387 files.

## What did not change

The spine's condensations of section 4 itself are `SKILL.md`'s summary
under `skill-lifecycle` "Split bulk into `references/`", one read from
the whole text, and section 4 rows were not in the inventory.
`references/test-methodology.md` stays true as written. The skill's
frontmatter description is untouched. `docs/fleet-map.md`'s checked G9
roadmap row still says "guarantee catalog", declined as a record of the
delivery that closed the gap at the time, the way G8's row records its
own history, with the G9 detail block the file's maintenance rule names
updated.

## Verification

- `python3 scripts/build_dist.py --check`, `python3
scripts/prose_lint.py . --diff origin/develop`, `python3
scripts/repo_gate.py --check eol`, `python3 spec/validate.py`, `python3
scripts/tests/test_build_dist.py`, markdownlint and editorconfig-checker
through `scripts/docker_lint.py`: clean. The `sentence-length` check on
the diff flags only the included section 4 text, pre-existing sentences
on touched lines, and the one-sentence include formula, every other
sentence this change wrote is under the cap.
- Carried-content pass: nine units read whole at the `fable` tier, one
reviewer per unit per round, recorded in
`reports/canonical-review.json`. Four diff passes recorded per
`local-strict-review`, one after each commit.

## Read record, `introduced` over total per read

Eight units in round 1, then only the units the previous round's fixes
changed. Rounds 1 and 2 were the budget. Rounds 4, 5, and 6 were three
maintainer grants under the stop rule, each scoped to the items the
preceding diff pass named. The diff pass row sits in the column of the
round it followed.

| Read | R1 | R2 | R3 | R4 | R5 | R6 |
| --- | --- | --- | --- | --- | --- | --- |
| d-guarantees.md (preamble) | 0/0 | | | | | |
| Why This Exists | 0/0 | | | | | |
| How the Contract Is Read | 1/4 | 1/3 | 0/3 | | 0/1 | |
| Style Rules | 3/3 | 1/2 | 0/0 | | | 0/0 |
| The Core Behavioral Spine | 0/2 | | | | | |
| After Any Workflow Edit | 1/1 | 0/0 | | | | |
| WORKFLOW.md section 4 | 1/7 | 1/5 | 0/7 | 0/6 | 0/11 | |
| The Behavioral Contract (include) | 0/8 | 1/6 | 0/7 | 0/3 | 0/4 | |
| skill-lifecycle, The Doc-Packaging Pattern | | | | 1/2 | 0/0 | |
| Diff pass | | | 3/3 | 3/3 | 1/1 | 1/1 |

The round 1 introduced findings: the style heading promised rules its
pointer body no longer named, its line-ending sentence claimed "Workflow
YAML is LF" from a section that does not say so, "the actionlint
wrapper" named a single-linter wrapper the hub-only section never
describes, the D9 sentence "keeps the conventions behind these items"
was false for D9.4, and "section 4" in a rewritten sentence named no
document. Round 2: the pointer's "editing a workflow" missed the
composite actions the skill also fires on, the rewritten hook sentence
had dropped the "for what is its own" clause that made the hook
conditional, and deleting the D9 pointer left D9.2's "the suffix rules"
with no antecedent, one root cause the two section 4 reads both raised.
Round 2 also raised the absence of a summary under the pointer, declined
as a preference against the pointer shape, with the four rules the
description names each present in the include.

The grants. The first diff pass found `skill-lifecycle` still naming
this skill as the kept-authority example, `docs/fleet-map.md` describing
the removed shape, and the ledger's never-by-hand note against the
prune, and the round 4 read of the packaging section found the closing
paragraph in three sentences where that section prescribes one. The
second diff pass found the D9 rename had broken two `workflowRef`
anchors, the example narrowed to section 5 where sections 1, 3, and 6
are summarized the same way, and "Reached, not carried" without the
job-graph qualifier that lets a repo own its release task. The third
found the style pointer naming `GOVERNANCE.md` alone where the LF rule
lives in `WORKFLOW.md` section 2. Every whole-unit read on unchanged
text widened again, section 4 going 7, 5, 7, 6, 11 with nothing
introduced after round 2, and its pre-existing findings are #1369 items
23 to 51, the skill's own are #1386, and the packaging section's is
#1376 item 4.

Copilot ran one round with full coverage on the first head and raised
one thread, a misparse of the D9 sentence, fixed in 2451e2c.

Closes on promotion: #1205, #1212, #1250, #1240

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…1388)

Class 6 of #1317, `WORKFLOW.md` section 2 against `GOVERNANCE.md`
"Workflow YAML Conventions", on the maintainer's call in this session:
pointer, not include, since the include generator walks only
`.agents/skills/` and an include into `WORKFLOW.md` would need an engine
change first.

## What changed

- **Section 2 becomes a pointer.** It keeps its heading and number, so
every "section 2" reference and its slug still resolve, and its eleven
condensed bullets, the twelve inventory rows against the home, become
one paragraph naming `GOVERNANCE.md` "Workflow YAML Conventions" and
nothing of its content. The line-endings bullet had no home in that
section, its home being the `comment-and-doc-style` Skill's policy that
`GOVERNANCE.md` "Documentation Style Conventions" routes to under "Line
Endings", so it becomes a pointer at that route rather than a rule moved
into the YAML section. The row that contradicted D7.3, the both-forms
boolean comparison, goes with the bullets, and the conflict it exposed
is now the home's own, on #1367 item 1 and #1369 item 35.
- **The sentences that cited section 2 for a rule name the home.** The
preamble's opening sentence, its audit verb, and its canonical-scope
note, which used to say section 2 restates the conventions so the file
reads on its own, the D9 preamble inside section 4, the D8/D9
walkthrough in 5A, and the operational bullet in section 6. The
generated include in `references/d-guarantees.md` and the three
distributions regenerate from the D9 sentence.
- **The two homes stop claiming to be two.** `GOVERNANCE.md`'s section
no longer says it and `WORKFLOW.md` keep the full rules with itself
winning on overlap, and the skill's "Style Rules" points at the home and
at the line-ending policy's skill instead of at section 2.
- **The cut line-endings bullet's rule is retired, not moved.**
"Workflow YAML is LF (Actions and Dependabot rewrite it that way)" had
its only home in section 2, since the line-endings policy's operational
section requires a CRLF default in both files and never exempts workflow
YAML. A grant moved it into that policy, and the whole-unit reads the
move owed showed its reason false under the configuration the policy
prescribes: with the paired `* text=auto eol=crlf` git stores LF and
checks out CRLF, so a Dependabot commit of LF bytes leaves nothing
mixed, and Actions never writes a workflow file. On the maintainer's
call the rule is deleted rather than carried without its reason, and the
policy file is back at its `develop` text. The fleet's one CRLF config
repo carries such a pin by hand, with the same reason in its comment,
and that is left to the maintainer.
- **The ledger records a whole-unit pass over each of the eleven units
this moves**, per `local-strict-review` "The Carried-Content Pass".

## What did not change

The "Release Model" overlap in the canonical-scope note stays, since it
is a section 3 row set the inventory lists under that home, not this
class. D9's five style guarantees in section 4 stay as written, since
section 4 rows were not in this class and D9 states outcomes a workflow
must meet rather than the conventions' text. `README.md`'s "Conventions"
list is class 13. Two phrases the condensed bullets carried and the home
does not go with them: "Lowercase, hyphen-separated" on the Filename
bullet, which the inventory row already listed as drift the condensation
added to a suffix-only rule, and "Grant least privilege" on the
permissions bullet, which D7.2 states as the one entry point that needs
the scope. The third diff pass raised the first as a rule retired
without a home, and it is declined on the inventory's evidence rather
than promoted into the home, since adding a case rule to `GOVERNANCE.md`
is class 14's decision list. #1369 items 35 and 50 name "section 2" for
a rule that now lives at the home alone, noted on that tracker rather
than edited.

## Verification

- `python3 scripts/build_dist.py --check`, `python3
scripts/prose_lint.py . --diff origin/develop`, `python3
scripts/repo_gate.py --check eol`, `python3 spec/validate.py`, `python3
scripts/tests/test_build_dist.py`, and markdownlint,
editorconfig-checker, and cspell through `scripts/docker_lint.py`:
clean.
- Carried-content pass: eleven units read whole, one reviewer per unit
per round, at the `fable` tier through round 10 and at the `opus` tier
from round 11, when that tier stopped being reachable mid-drive,
recorded in `reports/canonical-review.json`, two of them the
line-endings policy sections no pass had read before, which the final
diff no longer touches. Three diff passes per `local-strict-review`, one
after each commit, the last recorded as the receipt.

## Read record, `introduced` over total per read

Eight units in round 1, then only the units the previous round's fixes
changed. Rounds 1 and 2 were the edit budget, round 3 is the read the
round 2 fix owed, and rounds 4 to 6 are the maintainer's scoped grants
under the stop rule, the first two answering the diff pass before them,
the third and fourth answering what the grants' own reads found, the
fourth a deletion, rounds 7 and 8 are the reads owed by the fix for
Copilot's first round, the second push's two-round budget, and round 9
is the maintainer's fifth grant, un-enumerating the tie-break after the
round 8 read found the three-section form naming no winner for a
conflict with the Skill text a named section routes to, its Release
Model half being #1206's own loop, and round 10 the sixth, dropping the
line-endings clause the Copilot fix had added to the scope note after
the round 9 read found "live in" false for a section that only routes to
a Skill. The diff pass row sits in the column of the round it followed.

| Read | R1 | R2 | R3 | R4 | R5 | R6 | R7 | R8 | R9 | R10 | R11 | R12 |
R13 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---
| --- | --- |
| WORKFLOW.md (preamble) | 1/5 | 2/4 | 0/4 | 0/2 | | | 1/2 | 1/1 | 1/1 |
0/1 | 0/1 | | |
| WORKFLOW.md section 2 | 0/0 | 0/0 | | | | | | | | | 1/1 | 0/0 | |
| WORKFLOW.md section 4 | 0/2 | | | | | | | | | | | | |
| WORKFLOW.md section 5 | 0/7 | 0/6 | | | 0/2 | | | | | | | | |
| WORKFLOW.md section 6 | 0/3 | | | | | | | | | | | | |
| GOVERNANCE.md Workflow YAML Conventions | 0/1 | | | 0/2 | | | | | | |
0/3 | | |
| Style Rules | 1/1 | 0/0 | | | | | | | | | | | |
| The Behavioral Contract (include) | 0/5 | | | | | | | | | | | | |
| AGENTS.md Where the Rules Live | | | | 0/3 | | | | | | | | | 0/5 |
| line-endings.md Operational (config) repos | | | | | 2/2 | 1/1 | | | |
| | | |
| line-endings.md Scripts and extensionless executables | | | | | 1/5 |
0/1 | | | | | | | |
| Diff pass | | | 2/2 | 2/2 | | 1/1 | | | | 1/1 | | 0/0 | 0/0 |

The introduced findings, all on the pointer prose. Round 1: the Style
Rules sentence said `GOVERNANCE.md` "Line Endings" keeps the line-ending
policy where that subsection only routes to the `comment-and-doc-style`
Skill, the same shape in section 2 and 5A, fixed as one class, and the
preamble still called the document a mixture that includes code style.
Round 2, both on the preamble sentences round 1 rewrote: "the
`GOVERNANCE.md` section it points at" named one section where section 2
routes to two and 5C needs a third, and "pointed at rather than carried"
was false because D9 carries five style guarantees. Round 3 raised four
pre-existing findings and nothing introduced. The first diff pass then
raised two introduced findings on surfaces no whole-unit read holds: the
`AGENTS.md` "Where the Rules Live" row still said this section and
`WORKFLOW.md` keep the full rules, and the two rewritten scope sentences
had dropped the tie-break saying `GOVERNANCE.md` wins wherever the two
overlap, narrowing the release one to section 3 while sections 3 and 4
still restate that section's bullets and D7.3 contradicts one, an added
qualifier where the original had none. Both fixed in the first granted
round, the tie-break restored unscoped. The second diff pass raised two
more: the cut line-endings bullet, "Workflow YAML is LF", had its only
home in section 2, since the line-endings policy's operational section
requires a CRLF default in both files and never exempts workflow YAML
while the fleet's one CRLF config repo pins its workflows to LF by hand,
and the 5A sentence cited D9.5 for `.gitattributes`, which D9.5 does not
name. The second grant moved the rule into that policy, its "Operational
(config) repos" section stating the pin and its reason and "Scripts and
extensionless executables" no longer saying the LF overrides are for
POSIX-executed scripts only, and dropped the qualifier. The reads of the
two policy sections that grant wrote raised three introduced findings on
the granted sentences: the pin was written as a brace glob
`.gitattributes` cannot expand, the operational sentence read as the
only LF carve-out, and the scripts-section pointer claimed its sibling
holds the POSIX-script exception. The third grant rewrote both
sentences, and the re-read then showed the pin's reason itself false
under the paired attribute, which the fourth grant answered by retiring
the rule and returning the policy to its `develop` text, so the two
policy sections are not in the final diff and the ledger's two entries
for them record passes over text this branch held and no longer does.
The granted round's three reads raised seven pre-existing findings and
nothing introduced, the restored tie-break judged right on its own terms
with the D7.3 conflict it overrules left at the home. One of round 3's
four, that "keep workflows legible" mischaracterizes a section that is
mostly safety rules, sits on a sentence this change re-routed, and it is
classed pre-existing because the claim is #1206's own second item, filed
before this change, the edit having touched only the route.

The pre-existing findings, 54 in all, are filed: #1336 items 2 to 9,
#1367 items 9 to 14, #1369 items 52 to 57, #1370 items 20 to 34, #1371
items 2 to 4, #1389, the tracker this class opens for the line-endings
reference, items 1 to 5, and the preamble's on #1206, the open decision
issue that already holds most of them, which gains the six it did not.
Section 5 widened from 7 to 6 new findings on unchanged text across two
reads, and the preamble from 4 to 2 to 4, the pattern #1385 measured.

This pull request closes no issue. It removes two of #1206's preamble
claims, the "restates them" sentence and the undrawn code-style
boundary, and leaves that decision issue open.

Copilot ran four rounds, one per head, with full coverage on each. Its
first round raised two threads: a missing relative pronoun in two
sentences, fixed in 1a8b243, and the opening sentence not naming the
style home's section, answered in 1a8b243 by keeping the opening at the
document rather than one section, since the round 7 read showed one
named section to be one home where section 2 routes to two, and the
scope note's attempt to name both drew a finding on each of the next two
reads, so it names "Workflow YAML Conventions" alone as it did when
rounds 3, 4, and 6 read it clean. Round 10 then raised that one-section
form as omitting the line-endings home, the mirror of round 7, and it is
classed pre-existing because the same sentence shape and omission stood
on `develop` and #1206 already holds section 2's line endings against
the overlap partition. The two readings are each right about the
sentence and cannot both be satisfied by naming sections, which is the
non-convergence #1385 measured, and the home question is #1206's to
settle. Its second round raised two threads and one suppressed finding,
all wording on sentences this change wrote, fixed in 571e504: the
`GOVERNANCE.md` intro sentence split in two, section 2's "every other
file" reworded, and "workflow style rules" in the opening. Round 11 read
the three units those fixes moved and found one more on this change's
own text, section 2's closing clause reworded earlier from a
parenthetical into a "since" clause, which fixed the property its
"necessary but not sufficient" claim is measured against and made the
claim false, so `develop`'s parenthetical is restored verbatim and round
12 read it clean. Its third round raised no thread and two suppressed
findings, both on unchanged text: the rules-map row reading as a
fragment, fixed in 395024c with the reviewer's own connector, and the
canonical-scope note's "(sections 3 to 6)" mislabel, answered in the
pull request as byte-identical on `develop` and already #1206's item.
Round 13 read the map whole and raised five more, none introduced. Its
fourth round raised no thread and re-raised the "(sections 3 to 6)"
mislabel alone, declined a second time on the maintainer's call, since
the clause is `develop`'s own and #1206 holds both halves of it, the
widened labels and the excluded section 1, where this finding would fix
only the first. The fourth diff pass raised the un-enumerated tie-break
as contradicting "authoritative for sections 3 to 6" two sentences
earlier, the pair that stood on `develop` and that #1206 files as one
paragraph giving two answers, so it is pre-existing too, and the second
diff pass had asked for exactly that unscoped form. The pre-existing
findings count is 44, #1206 gaining a fourth.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
First pull request of the #1311 reshape sequence recorded in
[this
comment](#1311 (comment)).
It is one sentence, and the reason it is one sentence is the useful
part.

## The change

The preamble's verdict clause said a scenario's "observed" output, where
5B is headed "No
Execution, Deterministic from the YAML" and tells the reader to "emit
the predicted ... table".
It also dropped the "applicable" qualifier that N/A handling depends on,
omitted the third
conjunct section 5's own Assessment carries, and called a mismatch a
defect "not a style nit"
while D9.1 through D9.5 state style rules as applicable guarantees whose
failure is a defect by
definition.

Conjunct 1 keeps "every *applicable* guarantee holds" rather than
Assessment's "every
*applicable* 5A item passes". Those are not the same set, since a
guarantee can be applicable
while its 5A check is recorded N/A, and section 1 uses the guarantee
form. Left as it was
rather than settled here.

## Four corrections attempted and withdrawn

Review disproved the premise under each, which is worth recording
because three of the four
looked obviously right when written.

- **The line-ending fix acted on a tracker finding that is itself
wrong.** #1206's L10 called
section 2's "same line-ending policy as every other file" a
misstatement. The routed-to rule
puts YAML "workflow and non-workflow alike, no distinction needed" on
the `[*]` default with
no override, and `.editorconfig` names `*.bat`/`*.cmd` as "the one CRLF
exception". Acting on
  L10 deleted a true statement. **L10 should be declined.**
- **Widening the sibling scope to name `.github/workflows/` evidence**
put `pyproject.toml` and
the dependency manifests on this file's side of the WORKFLOW/CODESTYLE
partition, which
  nothing in the tree resolves.
- **Widening it to the composite actions** claimed territory
`CODESTYLE.md` holds:
`.github/actions/prose-gate/prose_lint.py` is the real 78 KB
implementation, with
`scripts/prose_lint.py` a ten-line shim, and it is linted by ruff and on
the mypy path.
- **Rewriting the two preamble framing sentences** drew 7 findings in
one round and 7 in the
next, including a dangerous one: dropping D1.3's layer binding would let
a reader write
`inputs.smoke != 'true'` at the workflow layer, where the operand-type
cast to `NaN` makes
  the smoke gate pass on every smoke run.

## Two decisions this needs from the maintainer

None of #1206's ten structural preamble items are settled, because both
questions under them
have the repository asserting both answers.

**1. Does D9 bind as a MUST?** `GOVERNANCE.md` "Workflow YAML
Conventions" opens "These
conventions describe the target state ... The rest of the repo is
expected to be brought up to
the same standard." Section 4's preamble says "A workflow that violates
any *applicable*
guarantee is **not operational**." An unswept legacy workflow gets
opposite verdicts. Four
findings (P1, P2, L3, L6) are downstream of this.

**2. What is this document authoritative for?** The blanket
"`GOVERNANCE.md` is authoritative
wherever this document overlaps it" decides a live conflict the wrong
way: that file's
boolean-inputs bullet requires comparing against both forms, D7.3 says
the opposite and calls
the second comparison dead, and 5A tells the auditor the both-forms
shape is "redundant rather
than a finding". `GOVERNANCE.md` claims precedence only for its own
section. Six findings (P4,
P5, P10, P11, L8, L9) are downstream of this.

## Verification

Full local gate set from `OPERATIONS.md` "Local Verification":
`build_dist --check`,
`canonical_review check`, `repo_gate` (eol, eol-coverage, sha-pin),
`prose_lint` over 324
files, the JSON parse loop, `spec/validate.py`, and `docker_lint` (7
linters, markdownlint over
178 files). All green. A carried-content pass over the changed unit's
whole text and a local
strict review of the diff are both recorded.

Refs #1206, #1311

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ated Includes (#1392)

Pull request 5 of the #1311 reshape sequence, and what `AGENTS.md`
already requires of these two surfaces: "A Skill that needs a rule's
full text to work in isolation carries it as a generated include from
the rule's home rather than as a copy."

Only `references/d-guarantees.md` complied. `SKILL.md`'s "The Core
Behavioral Spine" restated `WORKFLOW.md` section 3 and parts of section
4 by hand, and `references/test-methodology.md` restated section 5 by
hand while describing itself as "an index into them rather than as the
sweep itself". Both had already drifted, in both directions at once, and
`build_dist.py --check` held neither to its source. The evidence is on
#1386.

## What changed

- `references/architecture.md` is new and carries `WORKFLOW.md` section
3 whole through an include region. `references/test-methodology.md` now
carries section 5 the same way. With the existing `d-guarantees.md` the
skill carries sections 3, 4, and 5, and `SKILL.md` says where sections
1, 2, and 6 stay.
- The spine is replaced by a routing section. `SKILL.md` drops from 8.2
KB to 5.5 KB, which is the direction `docs/token-efficiency-plan.md`
asks for, and the two drifted claims it carried are gone rather than
realigned: "repo-owned" for "repo-owned in shape" (#1386 item 5), and a
hand-written second statement of D6.4 that nothing held to its source.
- Carrying a section moves it outside its own document, so section 3
loses the two reference-style links whose definitions live at the file's
foot, and both sections now name a sibling by document and heading
rather than as "below" or "this document". Each gains the closing
sentence naming the skill that includes it, the shape section 4 already
carries.
- `docs/fleet-map.md` and `skill-lifecycle`'s doc-packaging examples are
swept to match.

This also settles #1336 item 2, where `AGENTS.md` claimed the skill
surfaces the full `WORKFLOW.md` contract while the skill's own scope
said summary plus one include plus an index. The claim is now true, so
the map row needed no weakening.

The spine's citations of `GOVERNANCE.md` "Workflow YAML Conventions" for
the validate-at-entry and consume-then-delete rules go with it, which
settles #1386 item 16.

## Review passes

Four whole-unit carried-content passes over 12 units and two diff
passes, on the strongest tier. They raised roughly 30 findings, 8 of
them introduced by this change and fixed here. The rest are pre-existing
defects in `WORKFLOW.md` sections 3, 5, and 6, which this change
deliberately does not touch, since pull requests 2, 3, and 4 of the
sequence own that text. They will be filed as a follow-up issue rather
than fixed in passing.

Two findings were declined with evidence. `docs/fleet-map.md`'s P2
rollout checkbox still describes the two-split shape G9 actually
delivered, and updating a completed checkbox would misreport what that
phase shipped. And the five ledger entries this change orphans stay,
because `reports/canonical-review.json` says it is "written by
`scripts/canonical_review.py record`, never by hand" and that script has
no prune, so `report` rendering them for a reader is the designed
behavior rather than a defect.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Pull request 3 of the #1311 reshape sequence, and the third to ship
after PR 1 (#1373) and PR 5 (#1392).

## What it does

`WORKFLOW.md` 5A carried nine "Core" bullets restating section 4's
D-guarantees and five per-type addenda, roughly 2400 words of a second
hand-authored wording of the contract. It is now three paragraphs: how a
verdict is recorded, where evidence lives when it is not in the workflow
files, and how to cite it. Section 5 drops from about 3000 words to
1000.

A section that says where to look cannot disagree with the section that
says what must hold, so **32 of #1370's 44 findings are unwritable
rather than fixed**: each quotes 5A text that no longer exists. The two
finding classes step 14 measured, "5A contradicts or misstates the
guarantee it audits" (15 items) and "unsupported check" (8 items), have
no surface left to sit on.

## Also fixed, from #1393

- **Item 15** (also #1370 items 2 and 44). S1 and S4 read
"validate-release **skipped (smoke), succeeds**", one job with two
conclusions. D2.2 makes the check exit early while the job succeeds, and
warns against reading that as a job-level skip, which the old wording
invited.
- **Item 10.** S11 stated merge-bot auto-merge as the required output,
contradicting D8.3's `auto-merge: false` tracker, which prefixes the
head so no merge-bot rule matches.
- **Item 11** (also #1370 item 31). 5C's maintainer-only fence reached
only a probe that dispatches or re-runs, so its first bullet told an
agent to open a pull request on the repository it audits.
- **Items 12 and 13.** The Assessment restated 5A's recording rule more
narrowly than 5A states it, and spelled the N/A token two ways.

Swept to match: section 1's applicability rule and its two-layer bullet,
section 6's three references to the deleted addenda, `AUDIT.md` sections
3 and 5 plus its flowchart node, and the `audit-a-repo` and
`workflow-ci-contract` skills.

## Review

Sixteen whole-unit carried-content passes over ten units and five diff
passes, all on the strongest tier, before this pull request existed.
They raised roughly 70 findings. Every one was on this change's own text
or on a surface this change put in disagreement; none was against the
collapse itself. All ten changed canonical units carry a recorded pass
at their current text, and the local review receipt covers the final
content.

The maintainer settled one design question mid-flight: an interim
revision carried a per-guarantee evidence map, and it was deleted
because a per-guarantee map is itself a hand-authored second surface and
regenerated the same defect class it replaced, at smaller scale. That
decision is what the current three-paragraph shape implements.

## Known and filed, not fixed here

- **D6.2 now stands unqualified.** The deleted 5A text was the sole home
of its publisher exception, and the hub's own publisher stub in
`docs/reusable-workflows.md` reads `github.ref_name` in four places.
Moving the carve-out into D6.2 was attempted twice and withdrawn twice,
each time on verified evidence that the wording was wrong. Section 4 is
pull request 2's, and the evidence is filed for it.
- **5B carries no counterpart to the pinned-SHA read.** `AUDIT.md` and
`audit-a-repo` now tell an auditor to read a called workflow at the SHA
the caller pins, and 5A's citation rule admits that evidence, but 5B,
where the job graph is actually walked, does not say it.
- **Two requirements had no home outside 5A.** The `pypi` environment's
deployment-branch rule, which #1370 item 43 shows would block every
`.dev0` develop publish D3.4 requires, is genuinely lost. The
static-site generator's checksum pin survives as
`spec/project-types.json`'s `hugo.generator.pinned`.

Full disposition, including the section 6 and `AUDIT.md` items this
review surfaced, is on #1370.

Refs #1311, #1370, #1393

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…e YAML Conventions (#1395)

Collapses pull requests 2, 4 and 6 of the #1311 sequence into one
change, which the maintainer
agreed to because the three touch the same surfaces and, run
sequentially, each would re-sweep what
the last swept and pay the seam cost three times.

## What it does

**#1206's two maintainer decisions, applied first**, since sections 4
and 6 and `GOVERNANCE.md` all
depend on them. D9 binds exactly as D1 through D8 do, so a style
violation is a defect and
`GOVERNANCE.md`'s target-state framing settles *when* an unswept
workflow is fixed rather than
*whether* the violation counts. An overlap resolves **by subject**
rather than by blanket
precedence, and every section 1 to 6 now has a named owner.

**Section 4's two longest items shrink to their outcomes**, D1.6 from
about 974 words and D4.5 from
about 602. Nothing is deleted: the Microsoft.Testing.Platform runner,
package floor and its
silently-green failure modes move to `dotnet-codestyle`, the
`pytest-cov` dependency and coverage
selector to `python-codestyle`, and the failed-push recovery routes to
`operational-vs-release-workflow`.

**Section 6 states only what each type adds, and carries no N/A list at
all.** All eight per-type
N/A lists are deleted rather than corrected, because such a list is
right for a single-type
repository and negates a construct a second declared type supplies,
which is the defect #1394
shipped through fifteen clean unit passes. Section 1's applicability
rule derives the N/A set
instead, so no row can take away what another row gives. Rows are added
for the seven registry
types that had none, `upstream-wrapper` is split out of `docker`, and
the construct table keys on
the construct being present rather than on a registry field.

**`GOVERNANCE.md` "Workflow YAML Conventions" is swept** for the items
on #1367.

## What is deliberately not done

- **D6.2's publisher exception stays withdrawn.** A fourth wording was
attempted here and
disproved by `get-version-task.yml`, a called workflow whose branch
classification comes from the
caller's `GITHUB_REF` exactly as D3.1 requires. The item returns to the
text `develop` carries and
  #1369 records all four disproofs.
- **No bullet-to-D-item mapping.** One was added here, proved wrong four
ways, drifted between its
two copies in the round that wrote it, and was deleted on the
maintainer's call.
- **No per-guarantee evidence map**, per the decision recorded on #1311
step 16.
- **The `pypi` environment's deployment-branch rule is not restored**,
per the caveat #1370 records:
its one plausible content would block every `.dev0` publish D3.4
requires.

## Review evidence

21 read-only passes on the strongest tier before this pull request
existed: 11 in round one (10
whole-unit carried-content plus a cross-unit diff pass briefed to hold
`registry/repos.json` open),
9 in round two, and a terminal pair scoped to false claims and
unfollowable instructions. Roughly
220 findings, the large majority introduced by this change and disposed
of in it. The terminal pass
over `GOVERNANCE.md`, `AUDIT.md`, `CODESTYLE.md` and the four skills
returned zero.

The measurement worth recording: **the deletions were right first time
and the reasons drew nearly
everything.** Five claims about GitHub Actions behaviour that this
change introduced were falsified
by the tree and reverted, among them that `always()` and `!failure() &&
!cancelled()` are
interchangeable-with-a-preference (D1.5 *requires* `always()` for the
aggregator), and that the
registry's `releaseTrigger` decides publish-scenario applicability (it
says `two-phase` for this
repository while `publish-release.yml` is `workflow_dispatch:` only).

A carried-content pass is recorded for all 23 canonical units this
change moves.

## Owed on merge

`spec/files.json` declares both edited `GOVERNANCE.md` sections at
`verbatim` fidelity, so every
downstream copy goes stale and a fleet resync follows.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings September 7, 2026 00:07
@qodo-code-review

Copy link
Copy Markdown

ⓘ Qodo reviews are paused because your trial has ended. Ask your workspace admin to add credits to resume reviews. Manage billing

@coderabbitai

coderabbitai Bot commented Sep 7, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Team

Run ID: b52a0590-a9f9-481d-9ac4-62b32dea6cfc


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copilot AI 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.

🔵 Needs a closer look

It promotes a broad cross-cutting set of tooling, workflow-contract, and generated-distribution changes where a final human pass is warranted despite no specific defects found in this review.

Pull request overview

Promotes the current develop state to main, completing the “one-home include” mechanism rollout across the skills/distributions and finishing the WORKFLOW.md reshape, while also extending hub tooling and docs to cover the fleet label set and updating canonical-review reporting.

Changes:

  • Add fleet label management to repo-config/configure.sh (new repo-config/labels.json + apply/check support) and document it across standup/audit/repo-config docs.
  • Make canonical-review burn-down a rendered report (stdout / CI job summary) rather than a tracked file, with corresponding test updates.
  • Refresh skill packaging + distributions (include-mechanism documentation, new per-skill source digests) and bump docker/setup-qemu-action to v4.3.0.
File summaries
File Description
STANDUP.md Standup procedure now includes applying the fleet label set via configure.sh.
spec/project-types.json Update WORKFLOW.md anchor refs to the new D9 slug.
spec/divergences.json Mark repo-config/labels.json as hub-hosted/retired for downstream repos.
scripts/tests/test_canonical_review.py Tests updated/added for ledger-only state + rendered report behavior.
scripts/local_review.py Clarify held_lock() docstring (shared lock behavior).
repo-config/README.md Document new labels.json payload and label behavior.
repo-config/labels.json New fleet label-set payload (name/color/description).
repo-config/configure.sh Apply/check now also manages labels from labels.json.
OPERATIONS.md Update local verification guidance for canonical-review report rendering.
docs/repo-config.md Document that configure.sh apply/check now covers labels.
docs/pr-reviewer-evaluation.md Document reviewer scope/tiers and generated-mirror skipping configuration.
docs/fleet-map.md Update skill packaging descriptions to reflect includes/kept-authority mix.
CODESTYLE.md Expand summaries to mention MTP/coverage obligations moved under codestyle skills.
AUDIT.md Update applicability wording + settings/labels/rulesets verification guidance.
AGENTS.md Update cross-cutting rule-map phrasing for workflow/YAML vs WORKFLOW.md contract ownership.
.pr_agent.toml Configure Qodo to ignore generated skill mirrors and tune review routing/guidelines.
.husky/pre-commit Harden pre-commit with set -u in addition to set -e.
.github/workflows/build-docker-task.yml Bump docker/setup-qemu-action pin to v4.3.0 commit SHA.
.github/skills/skill-lifecycle/SKILL.md Generated mirror update reflecting include mechanism + packaging shapes.
.github/skills/python-codestyle/references/testing.md Generated mirror update for coverage guidance.
.github/skills/pr-review-conduct/SKILL.md Generated mirror update for reviewer footing + loop wording.
.github/skills/operational-vs-release-workflow/SKILL.md Generated mirror update for publish behavior wording.
.github/skills/operational-vs-release-workflow/references/release-publish-mechanics.md Generated mirror adds failed-push recovery mechanics section.
.github/skills/drive-pr/SKILL.md Generated mirror switches to include-based outcome rules.
.github/skills/dotnet-codestyle/SKILL.md Generated mirror updates MTP-based xUnit guidance summary.
.github/skills/dotnet-codestyle/references/testing.md Generated mirror adds MTP runner + coverage specifics.
.github/skills/audit-a-repo/SKILL.md Generated mirror aligns audit wording with updated AUDIT.md.
.github/copilot-instructions.md Add explicit guidance to avoid commenting on generated skill mirrors/include regions.
.github/actions/validate/action.yml Render canonical-review burn-down into CI job summary (no --check).
.github/actions/prose-gate/prose_lint.py Teach prose gate about repo-config/labels.json as a path candidate.
.coderabbit.yaml Configure CodeRabbit to skip generated mirrors and adjust review behavior.
.claude-plugin/fleet-skills/skills/python-codestyle/references/testing.md Plugin distribution mirror update for coverage guidance.
.claude-plugin/fleet-skills/skills/pr-review-conduct/SKILL.md Plugin distribution mirror update for reviewer footing + loop wording.
.claude-plugin/fleet-skills/skills/operational-vs-release-workflow/SKILL.md Plugin distribution mirror update for publish behavior wording.
.claude-plugin/fleet-skills/skills/operational-vs-release-workflow/references/release-publish-mechanics.md Plugin distribution adds failed-push recovery mechanics section.
.claude-plugin/fleet-skills/skills/drive-pr/SKILL.md Plugin distribution switches to include-based outcome rules.
.claude-plugin/fleet-skills/skills/dotnet-codestyle/SKILL.md Plugin distribution updates MTP-based xUnit guidance summary.
.claude-plugin/fleet-skills/skills/dotnet-codestyle/references/testing.md Plugin distribution adds MTP runner + coverage specifics.
.claude-plugin/fleet-skills/skills/audit-a-repo/SKILL.md Plugin distribution aligns audit wording with updated AUDIT.md.
.claude-plugin/fleet-skills/.source-digests/workflow-ci-contract New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/upstream-contribution-workflow New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/standup-a-repo New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/skill-lifecycle New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/shell-codestyle New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/resync-a-repo New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/repo-worktree New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/python-codestyle New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/pr-review-conduct New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/operational-vs-release-workflow New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/merge-and-release New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/local-strict-review New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/git-commit-conventions New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/fleet-conformance-check New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/drive-pr New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/dotnet-codestyle New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/copilot-instructions-keeper New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/comment-and-doc-style New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/code-review New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/carried-instruction-file-guard New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/backlog-burndown New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/audit-a-repo New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/agent-conduct New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digests/add-host-tool New per-skill source digest stamp.
.claude-plugin/fleet-skills/.source-digest Remove old single digest stamp in favor of per-skill digests.
.agents/skills/skill-lifecycle/SKILL.md Source-of-truth update documenting include regions and packaging shapes.
.agents/skills/README.md Clarify authored-vs-included content in the skill source tree.
.agents/skills/python-codestyle/references/testing.md Expand coverage requirements guidance (dependency + selector).
.agents/skills/pr-review-conduct/SKILL.md Update merge-gate/reviewer footing prose and loop wording.
.agents/skills/operational-vs-release-workflow/SKILL.md Clarify publish no-op and add recovery pointer.
.agents/skills/operational-vs-release-workflow/references/release-publish-mechanics.md Add failed registry-push recovery mechanics section.
.agents/skills/drive-pr/SKILL.md Replace restated outcomes with an include from pr-review-conduct.
.agents/skills/dotnet-codestyle/SKILL.md Update MTP-based xUnit guidance summary.
.agents/skills/dotnet-codestyle/references/testing.md Add MTP runner and coverage floor/details + diagnostics guidance.
.agents/skills/audit-a-repo/SKILL.md Align skill summary with updated AUDIT.md language and SHA-pinned read rule.
Review details
  • Files reviewed: 103/104 changed files
  • Comments generated: 0
  • Review effort level: Lite

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@ptr727

ptr727 commented Sep 7, 2026

Copy link
Copy Markdown
Owner Author

Review state at aaaae368, and why this stops here

Recording the gate read on this head so the merge decision does not have to re-derive it.

Copilot, round 1, zero findings. review_on_head=yes at aaaae368, effort=lite
(effort_source=explicit), threads=0 unresolved=0 suppressed=0 (on_head=0 earlier=0), no
refusal, shapes=ok. The review body carries no collapsed low-confidence block. Its verdict is
"Needs a closer look", explicitly on breadth rather than on any defect: "no specific defects found
in this review". Checks 8/8, mergeStateStatus: CLEAN.

Coverage is PARTIAL: 103 of 104 changed files. pr_review.py wait exits 42 on it. A
re-request has never cleared a partial on record, splitting is the remedy where it applies and it
does not apply to a promotion, so this is reported rather than retried into. One file of 104 has
no review, and the review reports zero findings across the 103 it did read.

Merge Gate, per pr-review-conduct: items 1, 3 and 4 hold. Item 2 holds with the partial
recorded above, which is the maintainer's call to take knowingly. Item 5, explicit permission to
merge, is not given and is where this drive stops.

Advisory reviewers are both silent, and neither absence gates this. Item 2 makes Copilot's the
coverage the gate requires. CodeRabbit is star-gated off auto-review at one star, which
docs/pr-reviewer-evaluation.md "Status" already records. Qodo posts a billing block instead of a
review, which that document does not record, filed as #1398.

Not merged, and no release dispatched. merge-and-release holds both, on its own go-ahead.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment