Repository navigation
Conversation
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>
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars.
|
There was a problem hiding this comment.
🟡 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.tomlshapes 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-secretsadopter and updates the conformance matrix. - Final review comments request capitalizing
Pyright'sand 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 Report❌ Patch coverage is
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
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
…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>
|
Coverage, Merge Gate item 2: no Copilot file table on this pull request names 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. |

Summary
Promotes
developtomain, carrying round 4 of the resync-issue burndown:pythonprofile. The schema andspec/validate.pyrefuse one, since each declared directory'spyproject.tomlshape states its profile.CODESTYLE.mdPython summary names the undeclared-root default.CODESTYLE.md, python-codestyle, and shell-codestyle reach 25 words or fewer per sentence.pr_review.pyrefusal=usage text names thesentandspentreadings. pr-review-conduct, drive-pr,docs/pr-reviewer-reference.md, and the last Copilot-instructions sentence reach the cap.host-secretsoverlay, and the conformance matrix names it the first adopter. The hub session took this over from the Blog session.#3567, #3568, and #3570 merged into
developon 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