From c5a7195017358f5810237217767ece91d4778b68 Mon Sep 17 00:00:00 2001 From: bob Date: Wed, 17 Jun 2026 21:03:47 -0400 Subject: [PATCH] chore(compat): CC 2.1.176-181 survey + lift held subagent-nesting wording MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to PR #81. The held subagent-nesting wording (CHANGELOG vs. live docs contradiction on the CC 2.1.172 nesting capability) is now resolved upstream: - code.claude.com/docs/en/sub-agents line 786 documents nested subagents under min-version 2.1.172. - CC 2.1.181 unifies the foreground+background depth cap at 5 levels: "Fixed foreground subagents spawning unbounded nested chains; they now respect the same 5-level depth limit as background subagents." Three shipped wording sites updated: - docs/04-subagents-mcp-orchestration.md L59 (Context hygiene bullet) - docs/04-subagents-mcp-orchestration.md L140 (Limits bullet) - templates/commands/infinite/SKILL.md L65 (Phase 4 coordination rule) Leaf-design guidance preserved and remains the recommended pattern within the testing envelope (tested_up_to < 2.1.172). The /infinite skill's no-sibling-coordination invariant still holds — subagent contexts don't share regardless of whether nesting is available. 2.1.176-181 survey (verbatim-pull, 2.1.177 + 2.1.180 NOT PRESENT): - No new in-territory settings.json keys. - Out-of-territory by precedent: footerLinksRegexes + language (2.1.176, UI-pref), sandbox.allowAppleEvents (2.1.181, macOS-only). - Future opt-in stub candidate: Tool(param:value) permission-rule syntax with `*` wildcard (2.1.178, e.g. Agent(model:opus)). No shipped template uses the form; SchemaStore acceptance unverified. - Nested .claude/skills collision handling (2.1.178): : namespacing. Reinforces plugin-skill carve-out pattern. No impact. - MCP server-level specs in subagent disallowedTools (mcp__server, mcp__server__*, mcp__*) silently-ignored bug fixed in 2.1.178. No- exposure grep against shipped templates: clean. - Auto-mode classifier (2.1.178) + subagent UX (2.1.179/181): no action. SchemaStore sync gate PR #5723 unchanged — still open/draft, untouched since 2026-05-24 despite dep #5728 merged 2026-06-01. tested_up_to stays pinned at 2.1.150 per the no-lone-bumps rule. Claude Code compat: 2.1.116-2.1.150 (unchanged). Co-authored-by: Claude Opus 4.7 --- CHANGELOG.md | 2 ++ config_schema.py | 49 ++++++++++++++++++++++++++ docs/04-subagents-mcp-orchestration.md | 4 +-- templates/commands/infinite/SKILL.md | 2 +- 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc9a832..4794d8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project. Format: [Keep a Changelog](https://keepacha ## Unreleased +- **chore(compat): CC 2.1.176–2.1.181 survey — held subagent-nesting wording lifted; no `tested_up_to` bump.** SchemaStore sync PR #5723 still open/draft (untouched since 2026-05-24 despite dep #5728 merged 2026-06-01), so `tested_up_to` stays pinned at 2.1.150 per the no-lone-bumps rule. **Held constraint resolved:** v2.7.0's 2.1.172–175 survey held the subagent-nesting wording on a CHANGELOG/docs contradiction (CHANGELOG said subagents can nest ≤5 levels; live docs said they cannot). The contradiction is now reconciled — `code.claude.com/docs/en/sub-agents` documents nested subagents under `min-version: 2.1.172`, and CC 2.1.181 explicitly unifies the foreground+background depth cap at 5 levels (*"Fixed foreground subagents spawning unbounded nested chains; they now respect the same 5-level depth limit as background subagents"*). Three shipped-template wording sites updated: `docs/04-subagents-mcp-orchestration.md` lines 59 + 140 and `templates/commands/infinite/SKILL.md` line 65. Leaf-design guidance preserved and remains the recommended pattern within the testing envelope (`tested_up_to < 2.1.172` means most users on the tested band don't have nesting; the `/infinite` skill's no-sibling-coordination invariant still holds because subagent contexts don't share even when nesting is available). **2.1.176–181 versions surveyed** (2.1.177 + 2.1.180 not present in CHANGELOG — skipped or internal-only per the verbatim-pull discipline): no new in-territory `settings.json` keys; out-of-territory by precedent — `footerLinksRegexes` + `language` (2.1.176, UI-pref tier), `sandbox.allowAppleEvents` (2.1.181, macOS-only opt-in). Future opt-in stub candidate: the new `Tool(param:value)` permission-rule form with `*` wildcard (2.1.178, e.g. `Agent(model:opus)`) — no shipped template uses it yet, SchemaStore acceptance status unverified, parking for the next compat batch. Nested `.claude/skills` collision handling (2.1.178) gains `:` namespacing — reinforces the existing plugin-skill carve-out pattern, no shipped-template impact. MCP server-level specs in subagent `disallowedTools` (`mcp__server`, `mcp__server__*`, `mcp__*`) silently-ignored bug fixed in 2.1.178 — grep against shipped templates clean. Compat comment refreshed in `config_schema.py` with the full survey. + ## [2.7.0] — 2026-06-17 Bundle release spanning 2026-05-24 → 2026-06-17 (PRs #59–#82; release cut 2026-06-12, shipped 2026-06-17): the **AGPL-3.0 relicense** with the discipline-skills MIT carve-out plus the contributor-governance ratchet (branch protection, CLA, AI-review verdict gate); the **discipline-skills module** (curated 7-skill fork of obra/superpowers); the package-availability safety gate + tool-version status-line chip; the adjacent-project dogfood cascade (hook-group union merge, persona-drift `[ NOTICE ]` + `--modules +x/-y`, retrofit-byproduct gitignore, manifest `written_by_sha` + `cc-configure --whats-new`); the `block-dangerous-bash` trailing-slash/`$HOME` hardening; the CC 2.1.155–2.1.175 compat surveys (incl. the `agent` schema-status correction); the doc-cleared hook-payload batch (Stop `background_tasks` guard, slop-scan decision-JSON + OSC 9 ping, block-mode feedback fix); and **Fable 5 as the default model throughout** (scaffolded settings + intake field, test-runner agent; `// model: sonnet` per-machine downgrade stub for CC < 2.1.170 — the own-CI review pin briefly followed, then was walked back to `claude-sonnet-4-6` on cost, #82). Also restores the `## [2.6.0]` section header accidentally deleted in the PR #67 merge — its absence had folded the 2.6.0 entries back into Unreleased, over-reporting in `--whats-new` — and adapts `test-whats-new.sh` case C to the empty-Unreleased state a fresh release produces (first release since the test shipped; it had asserted the live Unreleased section was non-empty). `CC_VERSION` bumped to 2.7.0. diff --git a/config_schema.py b/config_schema.py index ea51646..d6fedf1 100644 --- a/config_schema.py +++ b/config_schema.py @@ -518,6 +518,55 @@ # wildcards, no MultiEdit rules, no [1m]-suffixed # model IDs in shipped templates (2.1.172/173 # fixes). Issue #14920 unchanged. + # 2.1.176-181 survey (2026-06-17): no bump; #5723 + # still open/draft. Surveyed versions present in + # CHANGELOG: 2.1.176, 2.1.178, 2.1.179, 2.1.181 + # (2.1.177 and 2.1.180 NOT PRESENT - skipped or + # internal-only per the verbatim-pull discipline). + # New in-territory settings.json keys: none. Out- + # of-territory by existing precedent: + # footerLinksRegexes + language (2.1.176, user- + # level UI prefs); sandbox.allowAppleEvents + # (2.1.181, macOS-only opt-in). HELD constraint + # RESOLVED: the 2.1.172 sub-agent nesting wording + # held above on a CHANGELOG/docs contradiction is + # now reconciled - the live sub-agents doc at + # code.claude.com/docs/en/sub-agents documents + # nested subagents (min-version 2.1.172), and + # 2.1.181 explicitly unifies the foreground+ + # background depth cap at 5 levels ("Fixed + # foreground subagents spawning unbounded nested + # chains; they now respect the same 5-level depth + # limit as background subagents"). Shipped + # template wording updated in the same PR (docs/ + # 04-subagents-mcp-orchestration.md lines 59 + + # 140, templates/commands/infinite/SKILL.md + # line 65); leaf-design guidance still stands and + # remains the recommended pattern within the + # testing envelope (tested_up_to < 2.1.172 means + # users on the tested band don't have nesting). + # Permission-rule syntax: 2.1.178 adds the + # Tool(param:value) form with `*` wildcard (e.g. + # Agent(model:opus)) - future opt-in stub + # candidate; no shipped template uses the new + # form yet, and SchemaStore acceptance status + # not yet verified. Nested .claude/skills + # collision handling (2.1.178): nested-dir skills + # now load as : on name clash - + # reinforces the plugin-skill carve-out pattern + # documented in the skillOverrides note above; + # no shipped-template impact. MCP server-level + # specs in subagent disallowedTools (mcp__server, + # mcp__server__*, mcp__*) silently-ignored bug + # fixed in 2.1.178; grep against shipped + # templates clean (no MCP server-level patterns + # in disallowedTools). Auto-mode classifier + # gain (2.1.178) and miscellaneous subagent UX + # fixes (2.1.179/181) require no configurator + # action. SchemaStore #5723 unchanged from prior + # survey - still open/draft, untouched since + # 2026-05-24 despite dep #5728 merged + # 2026-06-01. Issue #14920 unchanged. } diff --git a/docs/04-subagents-mcp-orchestration.md b/docs/04-subagents-mcp-orchestration.md index 5156534..d144737 100644 --- a/docs/04-subagents-mcp-orchestration.md +++ b/docs/04-subagents-mcp-orchestration.md @@ -56,7 +56,7 @@ Only `name` and `description` are required. See `templates/agents/` for four rea - Each subagent starts with its own system prompt + minimal env info. **No inherited conversation**. - Only the subagent's final response returns to the parent. Verbose tool output stays in the subagent's transcript. -- **Subagents cannot spawn other subagents.** Design around this — use skills or chain through the main thread. +- **Subagents can spawn other subagents (CC ≥ 2.1.172, capped at 5 nesting levels).** Older CC versions can't. Prefer leaf designs anyway — use skills or chain through the main thread — so the architecture survives older CC and doesn't bury context behind deep subagent transcripts. - Parent `bypassPermissions` or `acceptEdits` **overrides** any `permissionMode` set on the subagent. ### Parallel subagents @@ -137,7 +137,7 @@ Local Claude Code for interactive work; Claude Code Web for long-running cloud j - The main thread's context is still finite. Subagents help with verbosity but not with total information you're holding in your head. - Parallel subagents that return detailed results still fill the parent. Prefer "ship a summary, not a transcript." -- Subagents can't spawn subagents. If you need 3 levels, you're designing wrong. +- Subagent nesting caps at 5 levels (CC ≥ 2.1.172; earlier versions: 0). If you need 3+ levels, the design is usually still wrong — re-shape into a fanout or pipeline through the main thread. ## Recommendations diff --git a/templates/commands/infinite/SKILL.md b/templates/commands/infinite/SKILL.md index 2ea1380..8cab1b1 100644 --- a/templates/commands/infinite/SKILL.md +++ b/templates/commands/infinite/SKILL.md @@ -62,7 +62,7 @@ Dispatch subagents via the Task tool using the `parallel-generator` subagent. Ea 4. **diversification_axis** — the axis this iteration should differ on, named explicitly. e.g. "this iteration must use a dark color palette"; "this iteration must favor imperative style over declarative." 5. **quality_standards** — the must-be-true bullets from Phase 1, verbatim. -**Do not ask subagents to coordinate with each other.** They cannot spawn their own subagents and their contexts don't share. The claimed_slots_manifest + diversification_axis does the coordination for them. +**Do not ask subagents to coordinate with each other.** Their contexts don't share — even with nested-subagent support (CC ≥ 2.1.172, ≤ 5 levels), a child can't reach a sibling's transcript. The claimed_slots_manifest + diversification_axis does the coordination for them. ## After each wave