CC 2.1.227 → 2.1.229 adoption triage

55 changelog bullets checked against real ork surfaces. latest_known 2.1.227 → 2.1.229; floor stays frozen at 2.1.220 (manual_override expires 2026-09-20).

4
Adoptions
Doc layer, no forced code change
2
Floor arguments
Only running >= 2.1.228 fixes these
5
Verified no-ops
Each carries its measurement
1
Opportunity
Recorded, not built
14
Days undetected
Last watch run 2026-07-30
Verdict column is the decision. Evidence column is what makes it checkable.
VerChangeVerdictork surface / evidence
2.1.227All 5 bulletsNo-opCloses the deliberate limit from the 2026-08-11 binary-diff triage, which covered the contract surface only. Feature-flag tier on expired token, claude-code-action allowed_non_write_users, /tui rewind, slash-menu rendering, event-loop stalls. No ork surface.
2.1.228Session cleanup deleted the project memory folderFloorHits ~/.claude/projects/<slug>/memory/, the operator memory store. No ork change makes this safe; only running >= 2.1.228 does.
2.1.228Plugin-cache cleanup deleted symlinked dev checkoutsFloorA plugin whose only version is a symlinked dev checkout lost its cache. That is ork's own dev loop, where CLAUDE_PLUGIN_ROOT points into the cache.
2.1.228Write no longer needs a prior ReadNo-opMeasured: src/hooks/src/pretool/write/ holds architecture-change-detector.ts + security-pattern-validator.ts; neither gates on a prior read. No doc encodes the rule either.
2.1.228Marketplace entries merge as whole entriesNo-op.claude-plugin/marketplace.json declares no custom headers, so no tier bleed to inherit. A consumer redefining the ork entry in user settings is now safe.
2.1.228Synced-skill hardening (no ! exec, no @ expansion)No-opApplies to skills synced from claude.ai. ork skills ship inside the plugin bundle and are never synced.
2.1.229ListAgents marks offline / cloudAdoptThe liveness primitive #3316 was missing. Forced a correction: measured at HEAD 23 of 37 agents grant SendMessage and 19 grant ListAgents, not the "34 of 36 / 0" recorded 2026-08-08. 4 agents send without being able to check liveness: code-quality-reviewer, component-curator, eval-runner, security-auditor.
2.1.229Sandbox domain lists fail closed; IPv6 bracketedAdoptStarter config in doctor/references/sandbox-posture.md is unaffected (4 plain hostnames, no IPv6 literal, no port), but its "no detection API" limit was partly stale: /doctor now flags the ambiguous-spelling class. Strengthens #3322.
2.1.229CLAUDE_CODE_WORKFLOW_PREFIX_STAGGER_MSAdoptSame-prefix siblings stagger so later ones read the cached prefix. Direct token win for audit-full-mapreduce and skill-fitness. dynamic-workflow-patterns.md carried zero concurrency or cost content before this.
2.1.229Workflows honour container CPU limitsAdoptConcurrency was sized from the host core count, over-parallelizing in CI runners and Docker. CI fan-outs now run narrower, which is correct, not a regression.
2.1.229Marketplace command sources, mode: "link"OpportunityRe-resolved each session, applied without a restart. .claude-plugin/marketplace.json ships two git-subdir entries; a command source would give contributors a local-build channel with no reinstall. Recorded, not built.
2.1.229/commit-push-pr stops auto-approving dangerous flagsNo-opConverges with ork's guards but subtracts nothing: ork's guards key off the Bash command string across every command, not one slash command.
pipelineAdoption issue filer died on a bare HTTP 422Fixed hereMilestone lookup used the API defaults (state=open, one page of 30). "CC adoption" is milestone #154, closed with 304 issues, so the probe missed it and the script POSTed a title that already exists. Now queries state=all&per_page=100 --paginate and reopens a closed rolling milestone.
pipelineSOP claimed a daily cron that does not existFixed hereThe schedule: trigger was removed 2026-07-28 under the weekly-quota policy. docs/cc-release-integration-sop.md still described a daily cron, so nobody knew detection had stopped.

Why three releases went undetected

The detect stage has not been automatic since 2026-07-28, when the schedule: trigger was deliberately removed from claude-release-watch.yml. cc-triage.mjs makes real claude -p calls, which cost nothing in dollars on a Max plan but draw on the shared weekly quota, competing with the operator for their own capacity. That trade is defensible. The silence about it was not.

The manual dispatch on 2026-08-13 then failed after extraction succeeded, so the snapshots it had already computed were discarded before the commit step:

watch  LLM-assisted feature extraction   cc-triage: gate RECALL-BOOST 2.1.229/listagents_offline_cloud_labels 5->10
watch  LLM-assisted feature extraction   cc-triage: updated 68 version entries in shared/cc-adoption-gaps.json
watch  File adoption issues              gh: Validation Failed (HTTP 422)
watch  File adoption issues              ##[error]Process completed with exit code 1

One context-free line, because gh api prints the top-level message to stderr and the informative errors[] payload to stdout, where $( ) swallows it. Snapshots for 2.1.227-229 were regenerated locally and committed in this PR.

What this PR changes

Source of truth. shared/cc-support.json latest_known 2.1.227 → 2.1.229 with the full triage recorded in manual_override.reason; propagated by scripts/stamp-cc-support.mjs into cc-version-matrix.ts. Floor, latest, and drop_after are untouched.

Docs. 12 new rows plus one corrected row in doctor/references/version-compatibility.md; a domain-list spelling section in sandbox-posture.md; a fan-out cost and concurrency section in chain-patterns/references/dynamic-workflow-patterns.md.

Pipeline. scripts/cc-file-adoption-issues.sh milestone lookup fixed at root. scripts/cc-consolidate-milestones.sh:57 carries the same latent bug and is not fixed here; it is called out in the code comment so the next person does not have to rediscover it.