feat(claude-config): ship I21 and I22 — the agnostic halves of the ratified Q8 split - #1884
Conversation
… I22 Both source rules were compounds: an agnostic mechanism fused to a consumer-state instance naming this fleet's own machines, files, and dates. Each is split at the mechanism/instance line per the ratified Q8 verdict tables; only the mechanism halves land here. The instance halves — a dated vet, a chezmoi-managed fleet pin — are drafted for the consumer repository and ship nowhere in this plugin, because a catalog row that baked in our date would reproduce, in consumers' repos, the exact drift the campaign exists to detect. I21 (mechanical, ANTHROPIC-DOCS, warning, unscoped) detects a durable effort pin carried across a model change with no re-sweep. The promotion gate is met on the strong form: model configuration states the per-model calibration property with no model qualifier, so that page alone carries the row; the effort page's Opus 5 subsection supplies only the remediation's wording. The model range is a Detect condition, not a Model scope annotation, on I17's reasoning — it is in Detect because the consequence varies, with the first-run default hold making a carried level harmless on Fable 5 / Opus 4.8 / Opus 4.7 while Opus 5 has no such hold. Whether a settings-file effortLevel pin releases that hold is recorded as unresolved rather than inferred: the page names /effort and --effort only as examples. I22 (mechanical, OPINION, info, default off) detects first-party model-routing doctrine stating neither the baseline it was derived from nor an event that re-opens it. Its contribution beyond "attach a trigger" is the delta-not-re-run discipline — a trigger nobody can afford to run is not a control. Non-duplication is argued in the row: I19 covers benchmark figures and says nothing about lanes or about acting on a trigger, and the catalog-wide trigger governs this catalog's staleness against its Sources, not an audited surface's staleness against its own sources. The model-configuration and effort Sources parentheticals now name what I21 depends on, because the catalog's "trigger set is the source set" invariant makes a dependency the entry does not name a dependency nothing watches. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Both were holes a reviewer would have reopened, found by re-reading the committed fence text against the repository's own closest-call surfaces rather than against the reasoning that produced them. I21's config fence did not reach a non-default effort value quoted inside a skill context file's documented JSON sample: that sample is instruction text containing config keys, not a key living in a config file, so the I17 discriminator the fence borrows explicitly routes it back in scope. Rather than stretch that fence, schema documentation and its illustrative samples get their own, on the ground that a sample level demonstrates syntax instead of recording a measured choice — and it ends where the demonstration does, so documenting a field and then telling the reader which level to put there is still prescribing. I22's third-party fence claimed a transcribed practice's staleness "is upstream-sync staleness, which its sync path owns." That is false for a model lane: a sync stamp tracks whether the transcription is current, never whether the transcribed advice still names a live model, so a stale recommendation inside a faithfully synced pack stays stale. The fence's load-bearing half — that there is no vet to point at — carries it alone, and the over-claim is replaced with the residual stated plainly. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 3m 51s —— View job Reviewing PR #1884
SummaryReviewed the two new catalog rows (I21, I22) and the accompanying
No misquotes found. Version bump (0.20.0→0.21.0), FindingI21's own "Detect condition" framing contradicts its own later disclaimer. plugins/claude-config/skills/audit-instructions/reference/criteria.md#L749-L750:
This borrows I17/I20's framing, but in I17 (L536-539) and I20 (L715-716) the model range genuinely gates whether the row fires — it's embedded directly in the I21's own
So the row explicitly says the model range is not part of what gates detection ("severity context, never a fence"), directly contradicting the introductory sentence that calls it "a Detect condition." The substantive rule is unambiguous once you read the whole row (fires regardless of model), so this doesn't change actual audit behavior — but it's a real internal-consistency gap in a catalog whose stated selling point is precisely this kind of self-contradiction-free fencing, and it's the sort of thing the PR's own adversarial-verification pass was aimed at catching. Worth a follow-up tweak to the L749-750 sentence (e.g., "background/severity context" rather than "a Detect condition") so it doesn't imply the model range gates firing when the row says the opposite two paragraphs later. Everything else — I22's non-duplication argument against I19, the schema-doc fence added in the second commit, the SKILL.md range updates, and plugin.json/CHANGELOG bumps — checks out. |
|
Claude finished @kyle-sexton's task in 1m 30s —— View job Security review — PR #1884
Scope reviewed (
FindingsNone. This PR contains no code, no shell/script changes, no GitHub Actions workflow changes, no
I also considered whether the new criteria prose (I21/I22, which future audit-skill runs will load as instruction content) could itself carry a prompt-injection payload for the LLM that later executes Nothing to flag for this PR. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 763f45988b
ℹ️ 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 3 times. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
… restating the --opinion set Both findings are accepted; each is fixed at its class rather than its instance. I21's `high` fence exempted the prescription by its wording, carving back only a surface that said "for Opus 4.7 specifically". That misses the case the carve-out itself names: a broad model-agnostic "always use high" naming no model, written where high was the no-op default, becomes a real step-down once the resolved target is Opus 4.7, whose default is xhigh. That is the sharper instance of this row's own subject, not an excluded one. The exemption now keys to whether high is the resolved target's default, never to the words — and a resolved target always exists, because the skill body aborts rather than run against an unresolved one, so the fence never guesses. The standing gate still passes at every target, including Opus 4.7: the eleven `effort: high` frontmatter hits clear on the config-routing ground and the lane JSON samples on the schema-documentation fence, both target-independent, and no surface in this repository prescribes a durable high pin in instruction text. The --opinion flag description carried its own copy of the OPINION row set, which had gone stale against the catalog. Naming the missing row would leave a second copy to update on every future OPINION row, and a stale copy silently narrows the flag below what the catalog defines. The set is now read from the catalog at run time, where the enablement policy already lives, and the run's tier-transparency line reports the count it found. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 21s —— View job Security review — PR #1884 (re-run at
|
|
Claude finished @kyle-sexton's task in 2m 29s —— View job Reviewing PR #1884 (re-run after new commits)
SummaryNew commit since my last review: Codex P2 ("Keep broad Codex P1 ("Add I22 to the My prior finding (I21's "Detect condition" framing) — still open, untouched by this commit. Everything else — |
Reconciles two out-of-session merges, #1848 and #1865. Conflicts were confined to claude-config's plugin.json and CHANGELOG.md; the audit-instructions surfaces this branch owns merged clean because neither incoming PR touched them. plugin.json takes 0.21.0. Main's 0.20.1 is a patch beneath this branch's minor, so the branch version already subsumes it and no re-bump is owed. CHANGELOG keeps both blocks with [0.21.0] above [0.20.1], preserving newest-first order. Both version literals were asserted by hand after the merge rather than trusted to the resolution: identical strings on either side auto-merge clean and wrong, and criteria.md's frontmatter is exactly that shape — it carries 1.8.0 here against 1.7.0 on main and was never conflicted, so nothing would have reported a silent revert. Confirmed 1.8.0, with both new rows, the target-keyed high fence, and the catalog-read --opinion clause intact. Neither incoming PR interacts semantically with I21 or I22. #1848's claude-config changes are confined to audit-pass (its evals and run contract) and name no I-row, no OPINION enablement, and no criteria surface. #1865 edited the lanes config row this branch's standing gate cites, but only the settings row governing lane-stop-gate arming; the model and effort rows and the sample lane block are unchanged at the same lines, so every standing-gate adjudication still holds and the new row prescribes no effort level or model lane to become a candidate of its own. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 6s —— View job Reviewing PR #1884 (re-run after merge commit
|
|
Claude finished @kyle-sexton's task in 1m 26s —— View job Security review — PR #1884 (re-run at
|
…undary in the docs profile (#1888) Lands two adopted Sitting-2 decisions in the anthropic-docs publisher profile — the campaign's consumer-facing tag-selection doctrine. `knowledge` 0.10.16 -> 0.10.17. ## PA-M — the harness-surface definition New bullet appended to the near-miss rule: **a harness surface is a surface a user can reach**, with three non-falsifying sub-shapes that harness-doc text can take without establishing one. Both the definition sentence and sub-shape (3) carry explicit `[campaign-owned amendment]` labels — the record shows the campaign making the selection-over-support choice, not inheriting an adjudication. Sub-shape (3) rests on its single attested instance (`env-vars.md:394`, a retry/fallback row) and carries its own over-broadening boundary: a doc line describing some *other* model's tier fails the sub-shape's own test. The landing site was derived three independent ways: the profile already uses "harness surface" as its negative-claim term (`:34`, `:54`); the adopted row's own text says "write into the profile"; and the 0.10.16 CHANGELOG deliberately held this exact question (J-12) for the dispositions interview this answers. ## PA-V — the bare-name boundary The `cc-applicable`/`mixed` boundary bullet now carries the fourth API surface (**model ID**) and the negative half the profile never stated: **bare names are not API surfaces** — a product name, display name, or docs-path slug never by itself triggers `mixed`. Ratified from the de facto standard 15+ rows already stood on (cross-vendor retag applied in-slice). Deliberately excluded: a `[campaign-owned amendment]` label (this ratifies an evidence-carried standard, not a campaign-invented definition) and "feature names" (present only in one slice's wording, not the adopted row — widening the enumeration would exceed the adopted authority). ## Verification Both commits independently verified by a second model with the implementer's rationale withheld: the PA-M landing audited across landing-site derivation, amendment fidelity (verbatim vs the adopted blockquote), self-fire (no profile or checklist conflict; no live campaign artifact violates the definition), and mechanics; the PA-V text was *authored* by that verifier from the adopted row and applied verbatim, with the producer re-confirming the authority citations at the bytes before editing. The one enumeration of the API-surface list repo-wide is this bullet — no drift introduced. markdownlint 0 errors; CHANGELOG newest-first, both entries folded into the unreleased 0.10.17. Downstream, already discharged against these rules: the four slice-local `api-only` ratifications (memory-tier) now cite the landed definition and route their three disclosed near-miss hits per these bullets. No linked issue ## Related - Sitting 2 of the doc-corpus decision block, ADOPTED 2026-08-03 after adversarial validation (21/21 CONFIRMED); PA-M ordered first carrying its amendment flags, exactly as the adoption block specifies. - Siblings this session: #1881, #1882, #1884, #1885, #1887 (open); standards#311 + ADR-0002; dotfiles#394, #399 (open). - The J-12 hold this closes: `knowledge` 0.10.16's CHANGELOG (PR #1879). --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…1, effort dial seam (#1887) Ships DOC bundle 2 of the doc-corpus campaign: DOC-6 and DOC-12 (thinking cost doctrine, rewritten against the EC-1 finding), DOC-10 (effort extend-or-cite deltas), DOC-8 (the two-dials seam). `playbooks` 0.6.3 -> 0.6.4. ## The EC-1 rewrite — the load-bearing change The thinking cost doctrine (fable-5 `context-economy.md` + one distilled `SKILL.md` line) states the harness override as **build-pinned behavior**: Claude Code sends `clear_thinking_20251015 keep:"all"` on every thinking-enabled request, on keep-all AND last-turn-only models alike — prior-turn thinking is retained and input-billed everywhere. The per-model keep-all/last-turn split is presented only as what a raw API caller gets, beside the override. The full four-part record ships: claim, basis (wire-captured request bodies, build pinned by byte size), as-of 2026-08-03, recheck trigger (any CC upgrade — the override is a build-time constant, not a documented contract), plus the three gating conditions and both escapes (`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`; a gateway dropping the field) under which per-model defaults resume. Observation and inference kept apart: the wire proves retention; input-billing is upstream's rule applied to it. ## The other rows - **DOC-10:** genuine deltas only — the harness corroboration + confirmation-dialog fact into §Effort tiers (A3/A4 already shipped); `opus-5.md`'s campaign-internal "Phase 6 cross-check" deferral replaced with live Effort/model-config pages that actually own per-model starting levels, preserving the TRUNCATED finding. - **DOC-8:** thinking and effort as two separate dials (`adaptive` is a thinking mode, never an effort value; effort is soft guidance, `max_tokens` the only strict limit) landed in the effort-doctrine owner where the frontmatter `effort` trap is reachable. Pins untouched — they move only through the dotfiles seam, per the row's own text; the consumer-state drafts are in the campaign's memory tier. - **Self-corrections shipped as follow-up commits (append-only):** one retracted drift claim (the corpus sentence survives verbatim at the live page — the original dispute was wrong) and one carry of the build pin onto the always-loaded surface plus removal of a session-residue sentence. ## Verification Independently verified cold by a second model (the implementer's report was lost to a session interruption; the audit ran from the diff and primary bytes alone). Every quoted fragment re-verified verbatim against raw fetches with byte-size pins matching the commits' own records; the build pin re-verified live (same byte count, so the as-of stamp holds); zero surviving unqualified keep-all claims; nothing trips catalog rows I17-I22/I19/I8-b; playbooks 0.6.4 + CHANGELOG parity/order/bump green; markdownlint 0 errors. **Ledger note (immutable commit message):** `00dc30749d` says "DOC-12 supplies the three buckets"; the shipped section carries two of the pricing page's three — ordinary output-token billing is the pointer's job, not restated. Recorded here per the campaign's history-stays-immutable practice. No linked issue ## Related - Phase 3b DOC chapters; bundle 1 merged as #1885; siblings #1881, #1882, #1884; standards#311 + ADR-0002; dotfiles#394, #399 (open — bundle 2's dotfiles Draft 1 now carries an explicit apply-on-top-of-#399 dependency note). - EC-1 empirical record: `EC-1-PROCEDURE-REPAIR-2026-08-02.md` + interview-checklist ratification (memory tier). --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…tion audit with the live prompting guide (#1908) ## Summary Doc-alignment roster row 1: align repo doctrine and the instruction audit with the live **Prompting Claude Fable 5** page (platform.claude.com). The live page was re-fetched and is byte-identical to the repo's 2026-07-29 capture, so this ships what the page implies and the repo lacked — nothing in the repo misstated it. **playbooks 0.6.9** (fable-5 doctrine): - `context-economy.md` — the late-session decay ladder gains a fourth bullet naming a remaining-context number as a NON-signal (the page's "Rare cases of context-budget concern"). Scoped to the model's own initiative; an instructed stop outranks it under meta-rule 1, so sibling plugins that deliberately gate on the window keep working. - `communication.md` — new assessment-versus-change gate ("Assessment is a deliverable; a fix is a different one"): report-and-stop on problem/question framings, evidence bar before state-changing actions. Repairs `opus-4-8.md`'s pre-existing pointer to a section that did not exist. - `orchestration.md` — non-blocking dispatch: keep working while independent workers run; continue an oriented worker rather than respawn. - `execution.md` — bound on defensive over-building: boundary-only validation, no cleanup around a bug fix, no abstraction before the second real caller, no shim where changing the code is available. - `SKILL.md` — core-doctrine lines for all four (they fire before their chapters' load triggers plausibly would). **claude-config 0.21.1** (criteria 1.9.0, IA-2 model-delta cluster): - New row **I8-d** (short-turn assumptions, Model scope fable-5) with three fences keeping it off output-length instructions, surface-owned latency requirements, and documents about the pattern. - I8 base row gains the delegation throttle as a named worked instance, fenced for caps with non-model rationale. - SKILL.md discloses both as lane-only (not scanner-seeded). Deliberately NOT shipped, with verified reasoning: the IA-2(d) context-budget audit row — it fires on nine deliberate in-repo context-gating surfaces (context-guard exists on purpose), and its config half (`totalTokensReminder` / `CLAUDE_CODE_TOTAL_TOKENS_REMINDER`) appears on no official settings/env-var/model-config/context-window page. The finding shipped as the context-economy doctrine bullet instead. ## Test plan - Docs-only (skill prose, criteria, changelogs, version bumps). - Producer verification: both audit-instructions test suites pass (46 + 41 checks), skill-quality gate zero errors with warning counts identical to base, markdownlint clean, zero new I6 bare-prohibition candidates, all cross-references resolve. - Independent fresh-context Fable verifier, rationale withheld, 7 binary criteria — including its own live-page fetch and byte-diff, verbatim-quote checks on criteria sources, independent reproduction of every producer verification claim, both IA-2(d) non-ship legs verified (in-repo deliberate instances enumerated; env vars absent from live official docs), eval-convention check (does not extend to these surfaces — verified against the last five doctrine commits and #1881/#1882/#1884), and merge-readiness vs current main — **7/7 PASS, empty defect list**. ## Related - No linked issue. - Doc-alignment per-document loop, roster row 1 (memory-tier roster; rows 2+ follow). Companion context: #1899, #1906 (drift root-cause fixes that preceded the loop). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_019gaVX25Txd6GXdiu9HEH3X --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…lity, and the re-verification stamp (#1997) No linked issue ## Summary Full conformance pass of this repository against the Opus 5 prompting guide, in two rounds. Round 1: verbatim guide read (byte-identical to the corpus pin, MD5 `8579d63fc9f793784b8c56320fd74e71`), directive inventory D1–D20, provenance check of the prior `opus-5-prompting-interview` operationalization (#1699 + follow-ups), grep-level sweep — repo clean, stamp refreshed. Round 2 (deep dive): a 42-agent workflow — 9 per-section semantic sweep agents over every instruction surface, 3 capability auditors (criteria coverage, chapter fidelity, consumer path), and 30 fresh-context adversarial verifiers briefed to refute. 33 raw candidates → 30 deduped → **6 confirmed, 24 refuted, 0 unverified**. All 6 fixed here, plus the fidelity and precision defects the capability auditors confirmed. ## Fix - **playbooks 0.6.22** — `opus-5.md`: four paraphrases restored to the guide's own strength (hedged "may" restored with the withholding mechanism re-attributed to the Sonnet 5 guide that states it; "often" restored; added "only" removed; scope fence completed with the routine-judgment-calls, request-seems-mistaken, and finish-whole-task clauses); new Vision section carrying the guide's re-validate-workarounds directive + tools-before-thinking lever; tool-heavy locality clause on the tool-call-leak artifact. `boris`: Tip 64's context-rot figure (300–400k on 1M) amended against the Opus 5 guide's consistency-throughout-the-window statement, same dated-blockquote shape as §72; SKILL.md routing row era-scoped. Plus the 0.6.21 re-verification stamp advance (2026-08-08, byte-identical). - **context-guard 0.4.8** — injected zone-crossing guidance no longer asserts degradation as a universal fact: degradation claim model-conditioned, bands named as tunable defaults, compaction-distance rationale kept unconditional. - **planning 0.27.4** — `prd` user-stories template drops "err on completeness over brevity" / "aim for exhaustive coverage" anti-brevity dials; keeps full coverage intent, adds the guide-calibrated no-padding bound. - **discovery 0.10.1** — `explore` sidecar bodies gain length calibration (the one uncalibrated surface in an otherwise tightly calibrated artifact set). - **education 0.5.5** — `quiz-me` report narrative sections gain length calibration. - **claude-config 0.21.10** (criteria 1.16.1) — scan-script header comments match I8-b's unscoped promotion; I8-a's truncated guide quote completed ("…for any non-trivial task"); I8-b's "same three trigger phrases" annotation reconciled with its own Source; SKILL.md documents the normalized version-token grammar (`opus-5` shape) the catalog matches against. - **prompts/loops/loop-lane-prompts.md** — volatile effort-default claim stamped with source, as-of date, and re-resolve trigger (verified live 2026-08-08 against model-config). ## Verification - Workflow: 42 agents, 0 errors; every confirmed finding verified by a fresh-context adversarial verifier with explicit refutation grounds (audience test, staleness-vs-self-check, independence classification, carve-out lanes, non-model rationale, quote accuracy, model-agnosticism); 24 candidates refuted on those grounds. - Fidelity claims verified against both texts verbatim before editing (guide "may follow that instruction literally" vs chapter "makes you report less"; "often longer" vs "run longer"; "step up to" vs "step up only"; full scope-fence diff). - Effort-default claim verified against the live model-config page (fetched 2026-08-08): "The default effort is `high` on every model that supports effort, except Opus 4.7, which defaults to `xhigh`." - Gates: `markdownlint-cli2` — 0 issues across all 15 changed .md; `scripts/check-changed-skills.sh origin/main` — 6 skills checked, 0 failed; `instruction-scan.test.sh` — 46/46; `bash -n` clean on both edited shell scripts. - Guide freshness: today's raw-`.md` fetch byte-identical to the 2026-07-25 corpus capture — no criteria Sources trigger fires; all prior vettings stand. ## Related - Refs #1996 (deferred audit-row + consumer-path design candidates from the capability auditors, recorded in a follow-up comment) - Refs #1699 (original operationalization), #1910, #1913, #1881, #1884 - ADR-0006 / ADR-0007 (model-scoped doctrine + seam address) 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01E5qiaLiGqP6fUTHkRYS19R --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Executes the owner-ratified Q8 SPLIT for the two rules the agnosticism test did not settle by itself: the agnostic-mechanism halves of IA-6 and IA-10-A2 ship here as catalog rows I21 and I22; the consumer-state halves route to the dotfiles seam as drafts (nothing org-specific lands in the catalog — verified by org-term sweep).
claude-config0.20.0 -> 0.21.0;criteria.md1.7.0 -> 1.8.0.The rows
mechanical/ANTHROPIC-DOCS/warning, unscoped). Grounded in the model-agnostic calibration sentence ("the same level name does not represent the same underlying value across models",model-config.md:489, no model qualifier — promotion gate met on the strong form). The model range is a Detect condition because the consequence varies: Fable 5 / Opus 4.8 / Opus 4.7 get a first-run default hold; Opus 5 has no hold — a previously set level carries over, which is where a stale pin actually reaches the request. Whether a settings-fileeffortLevelpin releases the hold is unstated upstream and recorded as unresolved rather than inferred. Four fences: barehigh(with the Opus 4.7xhigh-default carve-out stated), per-task choices, config keys (routes toclaude-config:audit), and schema documentation with illustrative samples — bounded so that documenting a field and then telling the reader which level to use still fires.mechanical/OPINION/info, off by default, I19's exact precedent shape,Source: none). The contribution is the delta-not-re-run discipline: a trigger nobody can afford to re-run is not a control. Carries no baseline of its own by design — naming one would hand every consumer a foreign snapshot. Non-duplication argued in the row: I19 covers restated figures; the catalog-wide trigger governs this catalog's own staleness, not an audited surface's.Verification
Independently verified by a second model with the implementer's rationale withheld; every quoted upstream sentence re-fetched raw and matched byte-exact (
model-config.md83,644 B,effort.md21,744 B).effort: highfrontmatter files, 10model:pins, the claude-ops lanes schema samples, the boris vendor baseline and transcribed-practice lines,PLUGIN-PHILOSOPHY.md's dated-and-triggered lane rules). The verifier's independent hunt found no missed candidate.claude-ops/lanes/context/config.md:26was wrong under the original fences — the fence gap is closed at the fence, not by stretching an existing one.instruction-scan.test.sh46/46; markdownlint 0 errors; changelog parity/bump/order pass;validate-plugins.shpass.Deliberately not shipped here
No linked issue
Related