Skip to content

Promote Develop: Registry Python Profile, Codestyle and PR Review Sentence Length, Handoff Skills, and Blog host-secrets - #3572

Merged
ptr727 merged 7 commits into
mainfrom
develop
Oct 28, 2026
Merged

ptr727 merged 7 commits into
mainfrom
develop

Conversation

@ptr727

@ptr727 ptr727 commented Oct 28, 2026 •

Copy link
Copy Markdown
Owner

Summary

Promotes develop to main, carrying round 4 of the resync-issue burndown:

#3567, #3568, and #3570 merged into develop on attested local passes, after Copilot refusals read as possible quota. The maintainer authorized each, as recorded on those pull requests. The sweep slices continue #3531 and do not close it.

Fixes #3556
Fixes #3563
Fixes #3560

🤖 Generated with Claude Code

ptr727 and others added 5 commits October 28, 2026 08:09
Closes on promotion: #3556

A Python profile belongs to each declared directory, so the registry no
longer declares one.

- `registry/repos.json`: drops `profiles.python` from ProjectTemplate
and ESPHome-Config. ProjectTemplate's `profiles` is now absent, and
ESPHome-Config keeps `cpp: lint-only`.
- `registry/repos.schema.json`: `profiles` refuses a `python` key,
matching the validator.
- `spec/project-types.json`: the python type allows no registry profile.
`profileNote` and `python.profile.detect` say the directory's
`pyproject.toml` shape is the profile. The check now states that a
committed `uv.lock` or any `[project]` table means build.
- `spec/validate.py`: the profile check moves into `profile_errors()`. A
`profiles.python` entry is refused with a message naming
`pythonDirectories` and the `pyproject.toml` shape.
- `spec/type-model.md`: "Profiles: build vs lint-only" says the registry
declares no `python` profile, and why. The false-declaration sentence is
gone.
- `tests/test_spec_validate.py`: constructed fixtures cover the
rejection, other types' profiles, and the shipped registry. One case
runs the rejection through `main()`.

## Local pass findings

- `spec/project-types.json` `python.profile.detect`, `introduced`, fixed
in 42b67fb: a `pyproject.toml` with a `[project]` table but no runtime
dependencies, no `[build-system]`, no `uv.lock`, and no
`requirements*.txt` fitted neither stated shape. Before this change it
was valid only when declared build, so any `[project]` table now means
build.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… Skill Sentences to 25 Words or Fewer (#3567)

## Summary

Names the undeclared-root default in `CODESTYLE.md` "Python", and takes
the next slice of the sentence-length cleanup.

- **#3563.** The Python summary named a uv workspace as the one
declaration exception and left out the undeclared-root default. It now
adds, after that exception, "A repository declaring no Python directory
has its root gated only where it tracks a root `pyproject.toml`, as
`WORKFLOW.md` D1.2 states." The issue proposed "declaring none". Here
the sentence before names only a uv workspace as declared, so "none"
would read as "no uv workspace". Naming the object keeps it matching
D1.2, the python-codestyle Skill, and its profiles reference.
- **#3531 slice.** Every over-cap sentence in four files is split or
restructured to 25 words or fewer, with its meaning unchanged. `python3
scripts/prose_lint.py --check sentence-length` goes from these counts to
0:
  - `CODESTYLE.md`: 17
  - `.agents/skills/python-codestyle/SKILL.md`: 14
  - `.agents/skills/python-codestyle/references/profiles.md`: 12
  - `.agents/skills/shell-codestyle/SKILL.md`: 11
- No heading, anchor, link target, table, code block, inline code span,
or quoted string changes. No sentence inside a generated include region
needed a change, and none was left long.
- The "When shell, not Python" sentence in the shell-codestyle Skill and
the matching one in `CODESTYLE.md` "Shell" are split the same way.
- The python-codestyle and shell-codestyle distributions are regenerated
with `scripts/build_dist.py`, and `--check` is clean.

## Verification

- `prose_lint.py` default rules on each of the four files: clean.
- `uv run --no-project --script scripts/build_dist.py --check`: current.

## Local Review

Two recorded `local-strict-review` passes over the whole branch diff,
raising 4 and 0 findings. All four were `introduced`, and the third
commit fixes them. One was the antecedent of "none" above. One was an
example list in `CODESTYLE.md` "Markdown and Spelling" that a split had
turned into a closed definition. One was an added "Then" that put an
order on the shell shim steps. One was a header-comment reason that a
reorder had turned from a permission into an instruction. The second
pass raised none, so no `introduced` finding is open.

Closes on promotion: #3563
Refs #3531

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…nt and Spent Readings (#3568)

## Summary

- `scripts/pr_review.py` usage text, the `refusal=` paragraph: the `RUN
LOG READING` is transient only while the fetch failure's one re-request
is `owed` or `pending`. Once that re-request is `sent` with no round
answering it, or `spent` by a second error refusal in a row, the reading
is possible quota although the log still names a fetch failure. This
matches `transient_state` and `run_log_reading`.
- #3531 slice: every sentence over 25 words is split or restructured in
`.agents/skills/pr-review-conduct/SKILL.md`,
`.agents/skills/drive-pr/SKILL.md`, and `docs/pr-reviewer-reference.md`.
The one remaining sentence in `.github/copilot-instructions.md`, the
`REQUEST_NOT_RECORDED` one, changes identically in all three of its
copies. Meaning is unchanged.
- drive-pr's include region and the generated `.github/skills/` and
`.claude-plugin/fleet-skills/` copies are regenerated by
`scripts/build_dist.py`, and nothing in them is hand-edited.

## Verification

- `python3 scripts/prose_lint.py --check sentence-length` reports zero
hits on all four files. The counts before were 57 for pr-review-conduct,
34 for drive-pr, 28 for the reference doc, and 1 for
copilot-instructions.
- The default prose gate, the diff-scoped prose gate, and markdownlint
pass on the changed files.
- `uv run --no-project --script scripts/build_dist.py --check` is clean.
- `ruff format --check`, `ruff check`, and `mypy` pass.
`tests/test_pr_review.py` passes, 489 tests, and the full `unittest
discover -s tests` suite passes.

Closes on promotion: #3560
Refs #3531

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
## Summary

Next slice of the sentence-length cleanup. Every sentence over the cap
in the three handoff-family skills, outside their generated include
regions, is split or restructured to 25 words or fewer. Its meaning
stays the same.

- `python3 scripts/prose_lint.py --check sentence-length` per file:
  - `.agents/skills/backlog-burndown/SKILL.md`: 88 hits to 0.
  - `.agents/skills/session-handoff/SKILL.md`: 65 hits to 0.
  - `.agents/skills/unattended-handoff/SKILL.md`: 34 hits to 0.
- The include regions are untouched. backlog-burndown and
unattended-handoff carry `AGENTS.md` "Model Tiers", and session-handoff
carries `GOVERNANCE.md` "Communicating with the User". No hit fell
inside any of them.
- A script compared develop with this branch for each file. It checked
the frontmatter, headings, fenced code blocks, include regions, quoted
strings, and link targets, and all of them match. Every inline code span
is still present. The only additions are a second `git branch -d` in
backlog-burndown and a second `new` in session-handoff, each repeating a
name the sentence already used.
- Some quoted section names were wrapped across a line break, so the
gate counted their words. Those are rewrapped onto one line, and their
text is unchanged.
- No sentence was left long, and none needed a meaning change to fit the
cap.
- The regenerated copies under `.github/skills/` and
`.claude-plugin/fleet-skills/` come from `scripts/build_dist.py`, and
`--check` is clean.

There is one commit per skill and one for the regenerated distributions.
The review fixes follow them.

## Verification

- `prose_lint.py` default rules on each of the three files: clean. Run
with `--diff origin/develop`: clean.
- `uv run --no-project --script scripts/build_dist.py --check`: current.
- `repo_gate.py` and `canonical_review.py status`: clean.
- `docker_lint.py` with markdownlint, editorconfig-checker, and cspell:
0 issues.

## Local Review

Three `local-strict-review` passes were recorded, each over the whole
branch diff, and they raised 10, 2, and 0 findings. Every finding acted
on was `introduced`, where a split had loosened what the old sentence
said:

- a condition stopped reaching the next sentence ("Missing the label",
"when the budget is reached", "Where the round is not narrowed", "Where
the interface has a prompt mechanism")
- a pronoun moved to a new antecedent
- an "only" stopped covering both parking grounds, behind a new "one
other ground" count
- "whose fix changes" became "can change", and "can owe" became "owes"
- a restrictive "where" clause became a separate assertion
- a "means" turned an elaboration into a closed definition
- a step moved after the hand-off it has to precede

The two follow-up commits fix all of them. The last pass raised none, so
no `introduced` finding is open.

Refs #3531

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…#3534)

## Summary

Declares `host-secrets` in Blog's registry `types`, step 1 of
ptr727/Blog#553. Blog's `deploy/make-release.sh` reads a host env file
under `~/.secrets/`, which `GOVERNANCE.md` "Operational Repositories"
routes through the carried readers, and `carry.py apply` carries
`lib/sh` to `lib/fleet/sh` only for a repository whose declared types
select it.

- **`registry/repos.json`**: Blog's `types` gains `host-secrets`.
- **`reports/conformance-matrix.md`**: the `host-secrets` overlay row
named HomeAutomation-Config as the first adopter, while its registry
entry declares only `source-only`. It now names Blog as the first to
declare the type, with the carry tracked in ptr727/Blog#553.

## Expected Drift Until Blog #553 Lands

Between this merge reaching `main` and Blog's carry, an audit of Blog
reports `lib/fleet/sh` missing and `hostsecrets.library.reader` unmet.
Both clear in Blog's own pull request for #553, steps 2 and 3, which
reads this change from hub `main`.

## Takeover

The hub session took this pull request over on 2026-10-28, at the
maintainer's direction, after the Blog session stepped away.

It merged `develop` in with a merge commit, since the branch was already
pushed and is not its own. The merge brought in #3569, which made the
validator refuse a `python` profile. Blog's entry declares no such
profile, and the merge applied without conflict. It also split the
matrix row's added sentence into two, each 25 words or fewer.

## Verification

- `spec/validate.py`: 22 cataloged repos classify cleanly.
- `scripts/prose_lint.py`, whole tree: 0 violations, and the changed row
trips no sentence-length finding.
- Local strict review, frontier tier, three passes. The first raised the
stale matrix row, the second a wording that read as if the carry were
done, and the third found nothing. Recorded.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings October 28, 2026 18:25
@coderabbitai

coderabbitai Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

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

Run configuration
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

🟡 Changes recommended

The change still has an active documentation issue because the full-page check instruction is grammatically incomplete and does not clearly apply to both required reads.

1 open issue
What changed in this PR

This pull request promotes develop to main, updating Python profile validation, documentation sentence length, generated skill mirrors, and Blog’s host-secrets registry declaration.

Changes:

  • Moves Python profile detection to per-directory pyproject.toml shapes and rejects repository-level Python profiles.
  • Shortens code-style, review, handoff, and operational guidance, then refreshes generated skill copies and source digests.
  • Adds Blog as the first host-secrets adopter and updates the conformance matrix.
  • Final review comments request capitalizing Pyright's and restoring the full-page check instruction in the canonical unattended-handoff skill.
File Summary
tests/​test_spec_validate.py Tests profile validation and registry behavior.
spec/​validate.py Centralizes profile validation and rejects Python profiles.
spec/​type-model.md Documents the per-directory Python profile model.
spec/​project-types.json Defines per-directory Python profile detection.
scripts/​pr_review.py Clarifies transient, sent, and spent refusal readings.
reports/​conformance-matrix.md Names Blog as the first host-secrets adopter.
registry/​repos.schema.json Rejects profiles.python entries.
registry/​repos.json Removes Python profiles and adds Blog’s host-secrets type.
docs/​pr-reviewer-reference.md Shortens reviewer operational guidance.
CODESTYLE.md Updates code-style summaries and Python guidance.
.github/​skills/​unattended-handoff/​SKILL.md Regenerated unattended-handoff skill mirror.
.github/​skills/​shell-codestyle/​SKILL.md Regenerated shell-codestyle skill mirror.
.github/​skills/​python-codestyle/​SKILL.md Regenerated Python-codestyle skill mirror.
.github/​skills/​python-codestyle/​references/​profiles.md Regenerated Python profile reference mirror.
.github/​skills/​drive-pr/​SKILL.md Regenerated drive-pr skill mirror.
.github/​copilot-instructions.md Shortens Copilot review guidance.
.claude-plugin/​fleet-skills/​skills/​unattended-handoff/​SKILL.md Regenerated Claude unattended-handoff skill mirror.
.claude-plugin/​fleet-skills/​skills/​shell-codestyle/​SKILL.md Regenerated Claude shell-codestyle skill mirror.
.claude-plugin/​fleet-skills/​skills/​python-codestyle/​SKILL.md Regenerated Claude Python-codestyle skill mirror.
.claude-plugin/​fleet-skills/​skills/​python-codestyle/​references/​profiles.md Regenerated Claude Python profile reference mirror.
.claude-plugin/​fleet-skills/​skills/​drive-pr/​SKILL.md Regenerated Claude drive-pr skill mirror.
.claude-plugin/​fleet-skills/​.source-digests/​unattended-handoff Updates the unattended-handoff source digest.
.claude-plugin/​fleet-skills/​.source-digests/​shell-codestyle Updates the shell-codestyle source digest.
.claude-plugin/​fleet-skills/​.source-digests/​session-handoff Updates the session-handoff source digest.
.claude-plugin/​fleet-skills/​.source-digests/​python-codestyle Updates the Python-codestyle source digest.
.claude-plugin/​fleet-skills/​.source-digests/​pr-review-conduct Updates the review-conduct source digest.
.claude-plugin/​fleet-skills/​.source-digests/​drive-pr Updates the drive-pr source digest.
.claude-plugin/​fleet-skills/​.source-digests/​backlog-burndown Updates the backlog-burndown source digest.
.agents/​skills/​unattended-handoff/​SKILL.md Shortens unattended-handoff guidance.
.agents/​skills/​shell-codestyle/​SKILL.md Shortens shell-codestyle guidance.
.agents/​skills/​python-codestyle/​SKILL.md Shortens Python-codestyle guidance.
.agents/​skills/​python-codestyle/​references/​profiles.md Shortens Python profile reference guidance.
.agents/​skills/​drive-pr/​SKILL.md Shortens pull-request driving guidance.

Review effort: Lite

@codecov

codecov Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 92.85714% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 81.60%. Comparing base (a70a543) to head (b72f50f).
⚠️ Report is 437 commits behind head on main.

Files with missing lines Patch % Lines
spec/validate.py 92.85% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3572      +/-   ##
==========================================
+ Coverage   81.50%   81.60%   +0.10%     
==========================================
  Files          26       26              
  Lines        9066     9070       +4     
==========================================
+ Hits         7389     7402      +13     
+ Misses       1677     1668       -9     
Flag Coverage Δ
python-3.13 81.60% <92.85%> (+0.10%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

…ence Splits (#3573)

Refs #3531

This is a promotion fix for review thread `PRRT_kwDOQ5caqM6xQ88w` on
#3572. That thread is the P1 on `unattended-handoff` picker step 1,
where the full-page check no longer said which reads it applies to.

The #3570 sentence-length sweep split sentences in `unattended-handoff`,
`backlog-burndown`, and `session-handoff`. I compared each split in `git
show 8d390ac` with its original. This change repairs each one that was
ungrammatical or had lost its subject, an antecedent, or the scope of a
qualifier or reason. Each repaired sentence keeps the original meaning
and is 25 words or fewer. Text #3570 did not change is left alone, apart
from line rewrapping.

## Splits repaired

`unattended-handoff`:

- **Picker step 1, the full-page check (the P1).** Picker step 3 and the
worker's `decision` read are the subject again. The bold term is kept,
so step 1's other references still resolve. The check is defined, and
the re-read applies only where a read returns a full page.
- **Auto-resolvable, "Nothing on it waits on the maintainer".** "And no
comment asks..." had come loose after the `canonical-sweep` aside. It is
joined back to the label clause, and the aside now names
`canonical-sweep` rather than "the last".
- **Auto-resolvable, "Nothing has worked it".** The open-handoff and
claim-comment clauses are one sentence again, so "That is because each
marks work that has no pull request yet" covers both of them.
- **Worker step 1.** "Follow it" is back inside the "Where a parking
comment names a decision issue" condition.
- **Worker step 3, narrowed round.** "so each closes" had lost its
antecedent. It now reads "so each issue closes".
- **Worker step 3, unnarrowed round.** The hand-off to
`merge-and-release` is back under "where the round is not narrowed".
- **Parking step 2.** "and the handoff it belongs to" no longer reads as
an object of "would do to". "Comment onto it" is back under the
existing-issue condition ("In that case").

`backlog-burndown`:

- **Dispatching a Worker, "No worker inherits another's worktree".** The
"That is why" reason covers both dispositions again. The third clause
carries it as "for the same reason".
- **Assembling the Promotion Body.** "amend the body when it lands" had
"it" binding to the body. It now reads "when the fix lands".

`session-handoff`:

- **The Attended Session step 6.** Handing the lane back is back under
"Where work remains" ("In that case").
- **Closing a Session step 4.** The elliptical "Never the round's
state..." had come to follow the example sentence. "What goes there is
saved as the session's final act" now comes before it.
- **Running the Chain, unlisted forks.** The example sentence had moved
directly in front of "Missing the label there". That made "there" mean
only upstream-contribution forks, and the `new` clause had lost the
condition. The scope is unlisted forks again, and the read clause and
the `new` clause are one sentence again, as in the original.

## Local review

`local-strict-review` ran three recorded passes at the `frontier` tier.
The first raised 4 findings and the second raised 1, all fixed in the
two edit rounds. The third raised 1, recorded below.

### Open `introduced` findings

- `.agents/skills/unattended-handoff/SKILL.md` worker step 1, class
`introduced`. The rejoined sentence reads "since it unblocked the lane"
where the original read "since it is what unblocked the lane". The
meaning is identical, and the reviewer confirmed that. #3570 split this
sentence, so its second half is #3570's text. Rejoining it at the
original wording runs to 27 words. The reviewer's alternative, "Follow
that answer, since...", would restore the split and leave "Follow"
outside the condition, which is the scope gap this repair closes.
Disposition: declined on that evidence.

### Dropped findings

- `.agents/skills/session-handoff/SKILL.md` "Running the Chain",
unlisted-fork paragraph, class `style`. Copilot's round on `0b58dfed`
raised no thread, but its overview mentions "a minor non-blocking
grammar nit ... regarding the missing-label condition". The nearest
candidate is the participle "Missing the label there, a read prints...".
That phrase is identical in `git show
8d390ac^:.agents/skills/session-handoff/SKILL.md` line 359. Neither
#3570 nor this change altered it beyond rewrapping, so it is out of this
change's scope.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…LE and PR Review Family Sentence Splits (#3574)

## Summary

A promotion fix for #3572's content. PRs #3567 and #3568 merged on local
strict review passes alone. This change compares every split those two
slices made with its original sentence. It repairs each split that lost
an antecedent, left a "since" or "so" reason on one half, let a
condition stop short of a clause it covered, or no longer parsed. Each
repair restores the original meaning, and every sentence stays at 25
words or fewer.

## Splits Repaired

From #3567:

- `.agents/skills/python-codestyle/SKILL.md`, Local development loop:
"It builds its environment" read as the uv-form directory the previous
clause named. It now names "A pip-form directory". Lost antecedent.
- `.agents/skills/python-codestyle/references/profiles.md`, Dependency
declaration: "That is the one group" followed `[dependency-groups]`, the
table rather than the `dev` group. It now names "The `dev` group". Lost
antecedent.

- `CODESTYLE.md`, .NET summary: "With them comes the local
diagnostic..." no longer said the style guide covers it. It now reads
"With them it covers the local diagnostic...". Lost subject and verb.

From #3568:

- `.agents/skills/drive-pr/SKILL.md`, "A brief is never itself the
authorization": "recorded where the skill that carries the grant states
its scope" had become a separate fact ("It is recorded where..."). It
qualifies what authorizes a merge again. Qualifier reach.
- `.agents/skills/drive-pr/SKILL.md`, same bullet: the original's
"since" gave two reasons a brief's approval creates none. The split left
the merge reason as a bare "And a merge is..." sentence. Both reasons
now precede "So writing an approval into a brief creates none." Reason
left on one half.
- `.agents/skills/pr-review-conduct/SKILL.md`, outcome 1 (and drive-pr's
generated include of it): "The fix is the round the pass gets dropped
on, and the churn..." called the fix itself churn. The original's
"which" referred to the unreviewed fix as a whole, now "That is the
round...". Antecedent.
- `.agents/skills/pr-review-conduct/SKILL.md`, Merge Gate item 2: "That
is because the hub's ... Status names Copilot the incumbent" reached
only "CodeRabbit and Qodo are advisory". It reaches the Copilot-coverage
requirement again. Reason left on one half.
- `.agents/skills/pr-review-conduct/SKILL.md`, Merge Gate item 2: "Take
an advisory reviewer carrying the exact head..." turned a description
into an imperative. It is a description again. Description turned into
an instruction.
- `.agents/skills/pr-review-conduct/SKILL.md`, Merge Gate item 3: "The
carrier adapts its own copy meanwhile" stood alone after the intent-unit
sentence and could read as covering a verbatim unit too. It now says
"its own copy of an intent unit". Qualifier reach.
- `.agents/skills/pr-review-conduct/SKILL.md`, Expected review loop
effort paragraph: "Both read `unknown`" followed a sentence naming an
inherited and a chosen setting. It now says "Both fields". Lost
antecedent.
- `.agents/skills/pr-review-conduct/SKILL.md`, same paragraph: "Clear it
only where..." no longer carried the second-timeout condition. It now
opens "In that case", matching `.github/copilot-instructions.md`.
Condition reach.
- `.agents/skills/pr-review-conduct/SKILL.md`, Style or convention:
"Take the rule to the maintainer" no longer carried the "If the rule
contradicts the tree" condition. It now says "Take such a rule".
Condition reach.
- `docs/pr-reviewer-reference.md`, Copilot: "so none of its scope
refusals reaches them" left the owner check by whoever runs the commands
outside the "so". Both consequences sit under it again. Reason left on
one half.
- `docs/pr-reviewer-reference.md`, Copilot: "so it answers whether a
human or a team is requested" left "never whether the reviewer bot is"
outside the "so". Both sit under it again. Reason left on one half.
- `docs/pr-reviewer-reference.md`, Review Configuration: the CodeRabbit
and Qodo bullet leads had lost the colon that introduced their settings
and become verbless fragments. Each now reads "**CodeRabbit** is
configured in ..." or "**Qodo** is configured in ...". Ungrammatical.
- `.agents/skills/drive-pr/SKILL.md`, step 4: "That is because it is run
from inside the task's own worktree" put only the first fact of a
three-sentence explanation under "because". The original had no
connective, and the explanation runs without one again. Reason left on
one half.
- `.agents/skills/pr-review-conduct/SKILL.md`, Expected review loop:
"the receipt being keyed on the branch's net content" was the reason a
re-push needs no second pass. The split made it a separate fact, and
"That is because" restores the reason. Lost reason.

The python-codestyle, pr-review-conduct, and drive-pr distributions are
regenerated with `scripts/build_dist.py`.

## Verification

- `python3 scripts/prose_lint.py --check sentence-length` on the six
source files: 0 hits.
- `python3 scripts/prose_lint.py` default rules on the six source files:
clean.
- `uv run --no-project --script scripts/build_dist.py --check`: current.

## Local Review

Two recorded `local-strict-review` passes over the whole branch diff.
The first raised 7 findings, all against splits the first commit had not
repaired. The second commit fixes four of them, and the second pass
raised none. The other three were judged not to be drift and are
declined:

- `.agents/skills/pr-review-conduct/SKILL.md` outcome 1, "so sweep for
the finding's siblings before replying. Fix each one...": the fix half
keeps its reason in the outcome's own heading, "fix the class rather
than the instance". `style`.
- `.agents/skills/pr-review-conduct/SKILL.md` "Which Reviewers a
Repository Actually Has", "So respond to what the reviewers actually
did... Do not decide from a repository property...": the second sentence
restates the first instruction's own contrast and adds no rule. `style`.
- `.agents/skills/pr-review-conduct/SKILL.md` outcome 3, "never needs
this outcome" without "at all": this is emphasis only, and the meaning
is unchanged. Restoring it puts the sentence at 26 words. `style`.

Refs #3531

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

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.

🟢 Approval recommended

No active blocking issues remain in the supplied review evidence, although minor documentation nits are noted.

No open issues 🎉

1 resolved since last review

Review effort: Lite

@ptr727

ptr727 commented Oct 28, 2026

Copy link
Copy Markdown
Owner Author

Coverage, Merge Gate item 2: no Copilot file table on this pull request names backlog-burndown, pr-review-conduct, or session-handoff, nine files with their generated copies. Round 1 on 130499cf listed 33 of 42 files, and round 2 on b72f50f3 has no table.

Every split in those three files was then compared with its original, and the broken ones were repaired in #3573 and #3574. Copilot's tables on both pull requests named all three files, with no findings. The maintainer decided on 2026-10-28 to accept that as covering those files here.

@ptr727
ptr727 merged commit 1abb46f into main Oct 28, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants