Repository navigation
Apply the Claude Code 2.1.257 to 2.1.263 changelog decisions: 20 corrections, 1 native nomination, 7 adoptions, 3 declines #4027
Description
Summary
A full /claude-ops:changelog diff over Claude Code 2.1.257 to 2.1.263 (read as raw markdown on
2026-09-08, 233 core items) produced the decisions below about this marketplace's own components.
This issue tracks applying them. It is apply work under the contract in #4024 and does not depend
on that redesign landing first: each decision names its owner surface and the false-versus-true
pair or the problem solved, which is all an apply PR needs.
Every row is a decision, not a changelog item. Item ids are <release>-<ordinal> in that
release's core list and exist so the upstream changelog can be consulted; nothing here restates it.
Fix
Work the decisions one PR per owner plugin, CHANGELOG entry per convention, subjects
chore(<plugin>): address Claude Code v2.1.257..2.1.263 changelog. The ledger seed
(docs/upstream/claude-code.md, shape below) lands as the last PR referencing them and moves each
open record to the PR that closed it. Decisions whose scope exceeds one session become their own
issue with an interview-style gate, per #4024 decision 10.
Corrected
A component stated something the docs or the changelog now contradict.
| Decision | Items | Owner surface | Was stated / is true | Record |
|---|---|---|---|---|
| Model ladder: Fable 5.1 supersedes Fable 5 | 257-001, 257-090, 260-015 | docs/PLUGIN-PHILOSOPHY.md tier table; replicas in boris orchestration, OFFICIAL-DOCS.md, lanes config |
Fable 5 the rung above / fable resolves to Fable 5.1 from 2.1.255, Fable 5 legacy, gateway sessions still resolve to Fable 5 |
open |
| Effort change and the prompt cache | 260-049, 257-005 | docs/PLUGIN-PHILOSOPHY.md effort guidance; replicas in interview session-config, Fable 5.1 chapter |
any effort change invalidates the cache with a dialog / on Fable 5.1 from 2.1.260 it keeps the cache, no dialog (API key or subscription only) | open |
| First-run effort hold | 257-083 | boris autonomy, audit-instructions criteria; replica in lanes config | Opus 5 alone has no hold, release actions unresolved / Opus 5 and Fable 5.1 have none; settings never release it; --effort at launch lifts it per session |
open |
Bundled claude-api skill currency |
260-050 | audit-instructions criteria, prompt-audit spec | unchanged since 2.1.258 / prompt-audit byte-identical through 2.1.263 (stamp refresh), model-migration gained an evals section, samples refreshed |
open |
| 1M auto-compact exception list | 260-047 | context-guard reader contract; replica in its README | Opus and Fable on 1M compact at the limit / from 2.1.260 they compact shortly before it, no published threshold | open |
| Read/Edit deny over Bash | 257-052, 259-007, 260-040 | claude-config audit required-permissions.md, stamp 2026-07-26; replicas in procedures, SKILL, evals |
recognized readers only / also redirect targets from 2.1.257; the 2.1.259 widening was reverted in 2.1.260 and is not to be written in | open |
defaultMode values dead in project scope |
257-089 | audit-permission-state criteria C2 and permission-plane-lint.sh; replicas in permission-rule-hygiene, babysit safety |
only auto ignored / auto and bypassPermissions ignored from 2.1.257; acceptEdits, plan, dontAsk still apply |
open |
Command-line scope under allowManagedPermissionRulesOnly |
257-034 | audit-permission-state criteria; replica permission-merge.sh |
one rank for allowed and disallowed / --allowedTools ignored, --disallowedTools and session deny/ask kept across reloads (2.1.257+) |
open |
| Ask-rule quote attribution and issue status | 257-044 | audit-permission-state criteria | quote on the permissions page, issues contradict wholesale / quote on the auto-mode config page; #42797 closed, #83766 open; 2.1.257 fixed compound and subshell paths only | open |
strictPluginOnlyCustomization is per-surface |
257-031 | claude-config audit required-permissions.md, validation categories; replicas in hook-coverage script, SKILL |
a hook lever / true or a per-surface array; "mcp" blocks user-scope and project MCP servers; 2.1.257 closed the /mcp reconnect bypass |
open |
| Sandbox escape surfaces | 260-057, 257-029 | claude-config audit required-permissions.md; replicas in SKILL, procedures |
four documented surfaces, strict mode closes the unsandboxed path / ! bash-mode runs outside the sandbox by design from 2.1.260 (interactive only) |
open |
| Unparsable settings: refuse to start vs pause the sweep | 259-023 | audit-permission-state SKILL and scripts, audit-permission-grants criteria; replicas in audit-performance, install-state surfaces | unparsable managed source silently unenforced; user settings silently pause the sweep / managed file, drop-in, plist, HKLM refuse start (exit 1, source named) from 2.1.259; the user-settings pause warns in /status |
open |
| Server-managed settings: cache and merge rule | 257-085, 261-001, 257-084 | managed-scope.sh in claude-config and claude-memory, audit-permission-state SKILL |
no local path; arrays concatenated, objects deep-merged / cache at ~/.claude/remote-settings.json; six-rule merge with whole-replacement keys plus the 2.1.257 awsPairs/ripgrep exception; /status Organization policy line is the failure read |
open |
| Connectors lever: which key removes a managed connector | 259-035 | context-budget levers.json |
allowedMcpServers removes managed connectors / only deniedMcpServers does from 2.1.259 (docs page still states the old rule) |
open |
/reload-plugins in headless sessions |
260-003 | lanes refresh.md; replica in plugins scope-semantics |
needs a human to type it / runs in -p and SDK sessions from 2.1.260; reach into an in-context loop unprobed |
open |
| Worktree isolation guard basis | 257-054, 259-029 | worktree gather-block.md, skill-authoring precompute-context.md |
page says unverifiable commands are blocked, so brace groups stay $-free / four named checks, "can't verify" scoped to git; the $-free rule and compose gate hold only for blocks containing git |
open |
/context measurement basis |
261-041, 261-018 | context-budget SKILL | no model API call, always measured / token-counting API or, from 2.1.261, an unmarked local estimate; connectors can arrive mid-session | open |
| CLI instruction-surface table | 261-003 | docs/specs/agent-doc-surfaces.md; replica in write-for-agents |
surfaces end at --append-system-prompt / --append-system-prompt-file and --append-subagent-system-prompt[-file] exist (-p only) |
open |
| Permission-rule lints: tokenizer and C6 table | 260-007, 260-008, 260-046, 260-052 | audit-permission-grants permission-rule-check.sh, audit-permission-state permission-plane-lint.sh, shared permission-patterns.sh, criteria C6 |
encoded: a rule path never contains ); syntax errors are the lint's alone / paths may contain ); Bash(ls) x is mis-tokenized by both lints today (verified); the CLI reports Malformed Tool(content) rule; an uncompilable deny guards the literal path |
open |
| Directory location as a boundary | 257-007 | claude-config audit required-permissions.md; replicas in context-budget README, permission-state lint table |
location is not a boundary / from 2.1.257 auto mode prompts once and permissions.blockReadsOutsideWorkingDirectories fences Read, Grep, Glob, LSP; Bash subprocess reads stay unbounded |
open |
Replaced with native
Nominated into the audit-native-overlap gate; the store verdict is human-written. The ledger row
reads nominated until a person rules.
| Candidate | Items | Component | Native surface | Nominated | Store row |
|---|---|---|---|---|---|
| Stale sandbox mask files | 257-006 | audit-install-state stale-artifact inventory (install_state.py) |
/doctor warning for mask files left by a killed session (2.1.257); location undocumented, so the component routes the class rather than growing a pattern it cannot ground |
2026-09-09, via audit-native-overlap |
pending human verdict |
Adopted
| Decision | Items | Component | Problem solved | Record |
|---|---|---|---|---|
--permission-prompts none for unattended lanes |
259-002 | hop_chain.py, observer launch, lane launcher, autonomy dispatch slice, babysit safety table |
unattended runs chose between dontAsk (denies every uncovered call, no classifier) and bypassPermissions; the flag keeps the mode and classifier and denies only what would have prompted; denials readable from stream-json permission_denials |
open |
claude plugin validate --json |
259-004 | scripts/validate-plugins.sh, plugin-quality auditor, skill-quality check |
CI and the auditor scrape validator text; the JSON report gives per-file errors and warnings behind a >= 2.1.259 guard |
open |
Frontmatter model: on skills |
259-015, 259-010 | skill-quality check, skill-authoring playbook, PLUGIN-PHILOSOPHY.md |
mechanical audit skills could not pin a cheaper model (key inert interactively before 2.1.259); now honored, turn-scoped, safe under auto mode | open |
Route managed-policy and credential diagnosis to /status |
257-074, 260-013, 260-012, 261-001 | audit-pass doctor handoff, audit-permission-state completeness note | the audit cannot observe whether server policy loaded, why a helper refresh failed, or which credential is in use; /status and claude doctor now carry all three (2.1.260, 2.1.261) |
open |
managedMcpServers attribution |
259-001 | context-budget connectors lever, claude-config MCP scope | org-injected servers and their tool schemas were invisible to both; attribute if present, nothing more until precedence and claude mcp list labelling are documented |
open |
bashOutputMaxChars / taskOutputMaxChars as a documented lever |
261-002, 257-002 | claude-config audit checklist, hook-observability convention | skills parsing large tool output hit a fixed inline cap; the keys raise it (clamped 4000 to 128000) and leave the 10,000-char hook cap alone; not raised by default because inline output is context cost | open |
| Prompt-cache miss cause from the native fields | 260-002 | observability output-format, read-routing, data-sources | cache health was routed to DuckDB only with no attribution; /usage and the status line prompt_cache.last_miss_cause name a likely cause |
open |
Declined or deferred
| Capability | Items | Reason | Reopen when |
|---|---|---|---|
CLAUDE_CODE_SUBAGENT_MODEL_FORCE in lanes |
257-004 | overrides every agent-definition model: pin the repo's tier bindings rely on; inherit under FORCE is undocumented; not listed on the env-vars page. Document as a consumer-side override that breaks tier bindings |
env-vars page documents FORCE and the inherit interaction |
/advisor text form in headless lanes |
260-004 | changelog claims headless availability; no doc page states it | a doc page states it, or a probe in a -p session shows it applies |
claude --resume <id> --bg for lanes restart |
257-087 | absent from cli-reference; prompt and --name handling unknown |
cli-reference documents it, or a probe settles prompt and name handling |
Docs lag observed at this read
Upstream pages whose text contradicted the changelog on the read date. Not repo work; a second
basis for any stamp on these pages, and input to /claude-ops:known-issues. Where a correction
above cites one of these pages, it cites the changelog as the newer statement of behavior and names
the disagreement.
| Page | Says | Changelog says | Item |
|---|---|---|---|
| interactive-mode, env-vars | 60-minute cap on subagent background commands (CLAUDE_SUBAGENT_BG_SHELL_MAX_MS) |
cap removed | 260-059 |
| cli-reference and two others | --continue skips background sessions |
--continue opens finished background sessions |
257-035 |
| managed-settings | allowedMcpServers filters managed-mcp.json |
allowlist governs only user-added servers | 259-035 |
| code-review command doc | GitHub only | posts to GitLab MRs via glab mr note |
257-075 |
| ultrareview command doc | waits 30 minutes | waits 45 minutes | 260-048 |
| deploy (self-hosted runner) | --kill-session-after-min terminates any session at the limit |
releases a session waiting on its user | 260-058 |
| skills | /skill-doctor since 2.1.252 |
added in 2.1.261 | 261-004 |
| env-vars | no entry | CLAUDE_CODE_SUBAGENT_MODEL_FORCE added |
257-004 |
Verification
- Each correction PR cites the newer source (changelog or docs page) in the plugin CHANGELOG entry
and updates the owner surface's verification stamp to the read date. - Each adoption PR names the problem solved in its CHANGELOG entry and, where a version guard
applies (claude plugin validate --json,--permission-prompts none), gates on>= 2.1.259. - The native nomination appears as a candidate in the
audit-native-overlapgate; no row is
written todocs/native-surfaces/records.jsonby any PR here. scripts/affected-tests.sh --runpasses on every PR.- The ledger seed's marker line reads
changelog through 2.1.263and nothing item-level persists
in it.
Related
- Redesign /claude-ops:changelog around decisions about our components, not changelog items #4024 (the redesign; this issue is the first apply under its contract).
- Also found by the same read, not from a changelog item, for their owning plugins' trackers:
plugins/session-flow/skills/retro/scripts/parse_transcript.pynever descends into nested
subagent transcripts (verified with a fixture);scripts/gen-hook-event-registry.shtreats
--fetch --checkas--checkbecause its flag loop is last-wins. Both surfaced while checking
259-034 and 259-027.
Ledger seed header (docs/upstream/claude-code.md)
# Upstream source: Claude Code releases
What this marketplace decided about its own components in response to Claude Code releases, and
the problem each decision solves. Nothing here restates a changelog item: upstream owns that text at
`https://code.claude.com/docs/en/changelog.md`, and a copy only drifts. A release that produced no
decision leaves no row. The harness facts a skill restates stay in that skill under the
upstream-drift convention; a correction to one of them is recorded in the owning plugin's
CHANGELOG, and this file points at it rather than repeating it.
**Last audited upstream state:** changelog through `2.1.263` (published 2026-09-06), read as raw
markdown on 2026-09-08. Git history of this file records *when*; this line records only *what was
read*. `/claude-ops:changelog status` reads this line; the default range for `diff` and `apply`
runs from it to the newest published release.
**Recheck trigger:** a new release block appears above the version on the line above. Nothing before
`2.1.257` was read release by release; the fleet's coverage of older releases rests on each skill's
own verification stamps and the docs-conformance rechecks those stamps trigger.
Activity
kyle-sexton commentedon Sep 23, 2026
This was generated by AI during triage.
Blocked by #4024 decision. This item waits on the decision tracked in #4024; resolving it there unblocks this one.
fix(context-budget): keep the connectors-lever edit surgical
chore: apply changelog rows for CLI surfaces and managed connectors (#…
feat: adopt Claude Code 2.1.257–2.1.263 changelog capabilities (#4027) (
fix(autonomy): cite #4027 without naming the org
fix(changelog): cite #4027 without the org token and fix the criteria…
chore: apply more Claude Code 2.1.257–2.1.263 changelog decisions (#4027
fix(claude-config): apply 2.1.257–2.1.263 permission changelog correc…
chore(changelog): close #4027 for Claude Code 2.1.257–2.1.263 (#5162)
25 remaining items
fix(claude-ops): correct doctor claims, changelog, lanes and prerequi…
fix(context-budget): setup passes the reported scope; audit docs and …
fix(source-control): hold a PR whose body says do not merge, declare …
kyle-sexton commentedon Sep 29, 2026
Addendum to the decision packet above. This comes from the 2026-09-29 audit of the unattended Cursor PR run; the questions are the owner's.
Two more open questions
1. Where does ledger row 260-002 ("Prompt-cache miss cause from the native fields") live?
The adoption names observability output-format, read-routing and data-sources as its surfaces. #5161 instead added
plugins/context-guard/scripts/prompt-cache-cause.py(+.test.sh) and a "Prompt-cache miss cause" section inplugins/context-guard/reference/reader-contract.md. On origin/main nothing calls the script:git grepfinds only its test, the reader contract and the CHANGELOG. context-guard's job is per-session context-window zones.Options:
Recommendation: A or B over leaving it (audit recommendation, not an owner decision). Basis: the
git grepresult above. Row 260-002 is not delivered while the script is orphaned. context-guard will do the deletion in C on request.2. Does
docs/upstream/claude-code.mdkeep its Items column?Every row carries changelog item ids (for example 259-035), but this issue's Verification says "nothing item-level persists" in the ledger seed. Options: keep the column, or drop it in the docs/upstream cleanup (core-docs group). context-budget's
levers.jsonstops citing item ids after #5267. Recommendation: none; the owner's call on what the ledger is for.Follow-ups already merged for this campaign
--permission-prompts noneversion gate now lives inplugins/session-flow/scripts/claude_cli.pyand is used by the observer and hop chain (flag kept, gated at Claude Code 2.1.259 or newer). The ledger row 259-002 ("this file") can be re-pointed at fix(session-flow): audit remediation (observer flag gate, export records, unattended parsing) #5239 in the docs/upstream pass.modelvalue grammar accepts:,/and@(Bedrock and Vertex style ids), and the duplicate 0.24.10 changelog claim is removed.Every PR for this issue still uses
Refs #4027. Keepingneeds-human.docs: fix factual and wording defects in top-level docs and the nativ…
fix(source-control): repair audit findings in linkage, worktree, conf…
fix(claude-config): fix audit findings in audit-instructions, unhobbl…
kyle-sexton commentedon Sep 29, 2026
Owner decision (2026-09-29): #4027 is independent of the #4024 redesign. The earlier 'Blocked by #4024 decision' triage comment is stale and no longer applies. Close #4027 once the leftover PRs land.
Next: the leftovers in the audit table are now agent work (core-docs, playbooks, session-flow, source-control and scripts groups, plus PR #5311). Every PR keeps
Refs #4027. The two addendum questions (where ledger row 260-002 lives, and whether the Items column stays in docs/upstream/claude-code.md) are not answered by this decision and stay with the owner.feat(claude-ops): changelog diff emits component decisions by action …
fix(scripts): reject a repeated changelog body and re-point the 259-0…
docs(agents): hold a PR with the do-not-merge label, not body prose (#…
kyle-sexton commentedon Sep 30, 2026
Owner decision (2026-09-29) on #4027: independent of #4024; close once the leftover PRs land. Closing as completed on that basis.
Evidence
Every audit-table leftover is merged on origin/main:
No open PR references #4027. The
needs-humanlabel is gone andagent-readyis present.Scope of this close
It rests on the owner decision comment, not on a row-by-row re-check of every original acceptance criterion. The original 20 corrections, 7 adoptions and 3 declines were applied across many PRs and were not re-verified one by one.
Still with the owner (closing does not decide these)
prompt-cache-cause.pyand its test are still inplugins/context-guard. The ledger's Adopted table says "observability read-routing; context-guard reader". Options: wire the script into the surfaces the row names, move the script, or delete it and re-record the row.docs/upstream/claude-code.mdkeep its Items column? Apply the Claude Code 2.1.257 to 2.1.263 changelog decisions: 20 corrections, 1 native nomination, 7 adoptions, 3 declines #4027's Verification says "nothing item-level persists" in the ledger, but every row carries item ids. Options: keep the column and amend the Verification text, or drop the column.CLAUDE_CODE_SUBAGENT_MODEL_FORCE(row 257-004)? The ledger says the reopen condition is met as of 2026-09-29 and that reopening is the owner's decision. Options: reopen the adoption, or keep the decline.