fix(claude-ops,review,source-control): work the week-32 platform changes against doctrine and gate the archive source - #2180
Conversation
…ges against doctrine and gate the archive source Week 32 (v2.1.220-v2.1.224) landed after this repo's verification stamps, which cluster 2026-08-03/04/08. Each item was checked against the page's own current wording, fetched 2026-08-10; the ones that moved doctrine are here, and the rest are recorded as checked-no-change in the PR rather than dropped. Auto mode becomes the default permission mode for new sessions on Pro, Max, and Team plans on 2026-08-14. Nothing here assumed `default` mode, but the permission-rule-hygiene convention framed auto mode as a state a session enters, which made its anti-patterns read as latent. They are not: after the switch a grant is suspended on the first run, not a later one, and "run it outside auto mode" now asks an operator to leave the default rather than decline an opt-in. The convention says so, and bounds the claim to the plans it covers - the same page still starts provider-routed sessions in `defaultMode`, Manual by default. The new `archive` marketplace source needed a decision, not just a note. Its platform floor is transport-level only (HTTPS, no loopback/link-local/metadata hosts, on every redirect hop) and the `sha256` digest that pins the bytes is documented as optional - so an unpinned entry lets one URL serve different content on every install with nothing to detect it. That is the mutable-remote-artifact surface the plugin-acceptance security review denies by default, so the review now requires the pin, and `validate-plugin-contracts.mjs` enforces it over the catalog instead of leaving it to a reviewer's eye. No entry uses `archive` today; the rule governs the first that does. The remaining two edits replace an incident with a rule. The worktree skill's pre-compute constraint rested on one observed refusal, which invites a future author to retest it; the isolation checks are documented now, including that a command Claude Code "can't verify stays inside the worktree" is blocked on the same footing as one that would really reach the main checkout - so narrowing the commands cannot make the block safe again. And an in-session `/plugin` install can now activate itself, which reads like `sync`'s closing reload guidance went stale; it did not, because `sync` installs through the shell command, which does not run in a session. Recording why beats leaving the next reader to relax it. Refs #2176 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FdBsorqGjCU4Mg5nrmgz4m
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
|
Claude finished @kyle-sexton's task in 3m 37s —— View job Review complete
FindingsNone. I independently re-fetched all four cited pages today (
Doctrine edits ( Version bumps / changelogs — all three patch bumps ( No architecture, error-handling, or maintainability issues found. No cross-file doctrine conflicts ( Security-scoped concerns (trust/egress implications of the |
|
Claude finished @kyle-sexton's task in 1m 13s —— View job Security review complete
No security issues found. This PR is almost entirely documentation/doctrine updates (permission-mode default, worktree isolation rationale, plugin-activation semantics,
No workflow files ( |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d3fa164a47
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Claude has reviewed this PR 2 times. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
… take the new default Review on #2180 caught an over-generalization one paragraph below the quote that disproves it. The section said a new session on Pro/Max/Team "starts with the broad grant already suspended", but the quoted docs carve out two populations: an operator who set a personal default keeps it unless they accept the one-time switch prompt, and an organization-managed default is unchanged. Those sessions keep the pre-switch behavior, so the anti-patterns stay latent in them and a reader diagnosing a permission failure could be sent looking for a dropped rule that was never dropped. The claim now names the delimiter the quote already draws, and states what the switch actually changes: the population starting in auto mode grows from "whoever opted in" to "the default path plus whoever opted in". That is enough to make authoring for the auto-mode case the only safe posture, which is the section's real point, without asserting that every session on those plans is in auto mode. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FdBsorqGjCU4Mg5nrmgz4m
|
Claude finished @kyle-sexton's task in 2m 27s —— View job Code review complete
FindingsNone. This lane covers correctness, design, conventions, error handling, and maintainability ( Codex's P2 finding is already resolved. The inline comment on
Doctrine edits ( Version bumps / changelogs — No architecture, error-handling, or test-coverage issues — this PR has no executable surface beyond the additive |
|
Claude finished @kyle-sexton's task in 1m 22s —— View job Security review complete
No security issues found. Scope confirmed via
|
…n in sweep-all (#2182) Closes #2176 Follow-on to #2180. #2176 is already closed; this lands the one edit that only became possible after #2169 merged. ## Summary #2169 landed the v2.1.224 subagent-cap removal with an honest in-place marker beside it: `CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY` was "carried forward from the 2026-07-29 read and NOT re-verified … its currency is open, tracked as its own item". #2176 was that item, and #2180 verified it — but the marker was not on `main` when #2180 opened (it lived on #2169's branch), and #2169 merged minutes ahead of it. So `main` now carries a settled claim that advertises itself as open and points at a closed issue. This closes that gap. ## Fix The citation is **current, not drifted**. The row reads exactly as `sweep-all` cites it: > `CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY` | Maximum number of read-only tools and subagents that can execute in parallel (default: 10). Higher values increase parallelism but consume more resources The marker is **replaced, not deleted**, because the route is the load-bearing part. `env-vars` truncated before the `MAX` range for a **third** time — the fetch reached `CLAUDE_CODE_DISABLE_1M_CONTEXT` and the summarizer duly reported no rows beginning `CLAUDE_CODE_MAX`, the exact false negative this repo's method rule exists to catch. The row was read verbatim from a same-day verbatim mirror of these docs (`ericbuess/claude-code-docs`, `docs/env-vars.md`, synced 2026-08-10T21:32:29Z), whose freshness is corroborated by its carrying the v2.1.224 cap removal that #2169 just landed — a fact that cannot appear in a pre-2.1.224 sync. So the new note says what is true and no more: re-verified 2026-08-10, unchanged, **but not from the primary page** — treat it as one rung below a primary read. That neither overclaims a fetch that did not happen nor leaves a closed question looking open. ## Verification - `validate-plugin-contracts.mjs`, `generate-catalog.mjs --check`, `generate-cheatsheet.mjs --check` — pass - `markdownlint-cli2` over both changed files — 0 errors - `discipline` 0.12.1 → 0.12.2 with a matching `## [0.12.2]` CHANGELOG entry - Remaining gates: CI is the authority ## Related - #2180 — the week-32 sweep; item 9's full write-up and both verbatim quotes - #2169 — landed the marker this removes, and the cap removal that corroborates the mirror's freshness - [`env-vars`](https://code.claude.com/docs/en/env-vars) — the primary page, which has now truncated before this range on three independent fetches --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Closes #2176
Summary
Week 32 (v2.1.220–v2.1.224) landed after this repo's verification stamps, which cluster
2026-08-03/04/08. Every checklist item was worked against the source page's own current wording,
all fetched 2026-08-10. Four items moved doctrine; five are checked-no-change; one was verified
through a non-primary route and is flagged as such. Nothing is silently dropped.
Fix
Auto mode becomes the default on 2026-08-14 (item 1, time-sensitive). Nothing in this repo
assumed
defaultpermission mode — the permission-rule-hygiene convention andclaude-config'saudit-permission-grantsalready treat auto mode as live. What was stale is the framing: theconvention described auto mode as a state a session enters, which makes its anti-patterns read
as latent. They are not.
docs/conventions/permission-rule-hygiene/README.mdgains a dated sectionrecording three things — a dropped grant is now the first run's outcome, not a later one;
"run it outside auto mode" is a downgrade rather than a remedy (kept only for the
Agent-rule case,which has no bare-command analog); and neither the drop list nor the project/local
defaultMode: "auto"self-grant block changes. The claim is bounded to the plans the docs bound it to: the samepage still says provider-routed sessions (Bedrock, Google Cloud's Agent Platform, Microsoft Foundry,
gateway) "start in your
defaultMode, which is Manual unless you change it."The
archivemarketplace source gets a decision and a gate (item 2). Its platform floor istransport-level only — HTTPS, no loopback/link-local/cloud-metadata hosts, enforced on every redirect
hop — and the
sha256that pins the bytes is documented as "Optional". Unpinned, one URL canserve different content on every install with nothing to detect it: the mutable-remote-artifact
surface the plugin-acceptance security review denies by default. So the review now requires the
pin (
docs/MIGRATION-PLAYBOOK.md, criterion 6), andscripts/validate-plugin-contracts.mjsenforcesit over
.claude-plugin/marketplace.jsonrather than leaving it to a reviewer's eye. Recorded withit: the digest doubles as the version when none is declared, so a repinned archive still needs a
versionbump; and org distribution via claude.ai admin settings doesn't accept the source at all.No entry uses
archivetoday — the rule governs the first that does.Two edits replace an incident with a rule.
source-control's worktree skill justified moving gitcalls out of pre-compute with one observed refusal from #1619, which invites a future author to
retest and fold them back. v2.1.224 documented the enforcement, so the constraint now cites it —
including that a command Claude Code "can't verify stays inside the worktree" is blocked on the same
footing as one that would really reach the main checkout, which is why narrowing the commands cannot
make the block safe again. And
claude-ops' plugin-sync skill: an in-session/plugininstall cannow activate itself, which reads like the skill's closing reload guidance went stale. It did not —
syncinstalls with theclaude plugin installshell command, which "doesn't run in a session".Recording why beats leaving the next reader to relax it.
Verification
permission-rule-hygienereframed from opt-in to default; scope bounded to Pro/Max/Team. No hook, guardrail, or skill assumeddefaultmode (searched for prompt-guaranteed phrasings; zero hits).archivesourcesha256pin, plus a machine gate invalidate-plugin-contracts.mjs. Gate tested both directions locally (unpinned entry fails, pinned passes, catalog restored).guardrailsships no worktree-boundary guard, so nothing is redundant and nothing assumed the narrower behavior; its hooks gate dangerous git verbs, hook bypass, commit convention, hardcoded paths, and secrets. Thesource-controlworktree skill's constraint is now grounded in the documented three checks.permissionDecision: "allow". The onlypermissionDecisionproducer iscontext-guard/hooks/zone-gate.sh, which emits"deny". Nothing relied on the old bypass./forkuses its own worktreeforkreference in this repo is the Agent-tool subagent fork (session-flow:orchestrate,discipline:sweep-all,session-flow:handoff), not the/forkslash command. No doc states or assumes that/forkshares the original checkout./plugin marketplace add+/plugin install), so nothing was stale there. The substantive point is the opposite of the obvious one and is now recorded inclaude-opscontext/scope-semantics.md: the new in-session activation does not apply toclaude plugin install, sosync's reload guidance stands./reviewaliases/code-reviewplugins/review/README.md. The plugin's own commands are unaffected (0.18.0 already made the namespaced form the only one it registers); the README now names/reviewas a fourth spelling of the bundled reviewer so the plugin isn't abbreviated onto it.docs/topics/context-engineering-claude-5/design/official-corroboration.md:355, is a topic-design doc: a record of what the corroboration sweep found when written, not a live instruction. Editing it would falsify the record rather than correct doctrine, anddocs/topics/is Contract tier where an edit invites the prune gate. Left intact.CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCYsweep-allregion; deliberately untouched here to avoid a conflict. Corroborated independently: thesub-agentspage's concurrency section names only the concurrency and depth limits.Item 9: what could not be verified from the primary source
env-varstruncated for a third time. The fetch reachedCLAUDE_CODE_DISABLE_1M_CONTEXTandstopped — alphabetically well before the
MAXrange — and the summarizer duly reported that "notable rows exist whose variable name begins with
CLAUDE_CODE_MAX". That is the exact false negativethe method rule exists to catch, and it reproduces the earlier failure rather than resolving it.
A different route reached the row.
ericbuess/claude-code-docsis a verbatim mirror of these docswhose
docs/env-vars.mdwas last synced 2026-08-10T21:32:29Z — the same day (commit messageUpdate Claude Code docs - 2026-08-10 | Updated: … env-vars.md …). It carries the row unchanged:That matches
plugins/discipline/skills/sweep-all/SKILL.mdword for word, so the citation iscurrent, not drifted. Two corroborations that the mirror is both faithful and fresh: the same
file carries
CLAUDE_CODE_MAX_SUBAGENTS_PER_SESSIONas "Removed in v2.1.224 and now a no-op" — theweek-32 change #2169 is landing, which could only appear in a post-2.1.224 sync — and its
CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTSrow agrees with thesub-agentspage fetched directly here.Stated plainly: this is a same-day third-party mirror, not
code.claude.com. Strong evidence,one rung below a primary read. No file changes on this item — the
sweep-alltext onmaincarriesno unverified marker (that marker lives in #2169's branch), so there is nothing here to correct. The
finding is posted to #2169 so its author can drop the marker.
Gates run (committed tree, base-ref form)
check-contract-slice-prune.sh --check-diff origin/main— pass ("leaves no path underdocs/topics/")check-changelog-parity.sh --check-bump origin/main— passcheck-skill-portability.sh origin/main— pass (2 skill files)check-shell-portability.sh origin/main— pass (no shell files in scope)check-contract-clause-coverage.py— passvalidate-plugin-contracts.mjs,generate-catalog.mjs --check,generate-cheatsheet.mjs --check— passmarkdownlint-cli2over all 8 changed markdown files — 0 errorscheck-changed-skills.sh origin/main— still running locally when this PR opened; CI is the authorityVersion bumps:
claude-ops0.28.3→0.28.4,review0.18.0→0.18.1,source-control0.51.5→0.51.6.The
docs/andscripts/changes need none.Related
sweep-allfilewhats-new/2026-w32plugin-marketplaces,
worktrees,
discover-plugins,
code-review,
sub-agents