Skip to content

feat(claude-config): ship I21 and I22 — the agnostic halves of the ratified Q8 split - #1884

Merged
kyle-sexton merged 4 commits into
mainfrom
feat/corpus-ia6-a2-split
Aug 3, 2026
Merged

feat(claude-config): ship I21 and I22 — the agnostic halves of the ratified Q8 split#1884
kyle-sexton merged 4 commits into
mainfrom
feat/corpus-ia6-a2-split

Conversation

@kyle-sexton

Copy link
Copy Markdown
Contributor

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-config 0.20.0 -> 0.21.0; criteria.md 1.7.0 -> 1.8.0.

The rows

  • I21 — effort level pinned across a model change with no re-sweep (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-file effortLevel pin releases the hold is unstated upstream and recorded as unresolved rather than inferred. Four fences: bare high (with the Opus 4.7 xhigh-default carve-out stated), per-task choices, config keys (routes to claude-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.
  • I22 — model-routing doctrine with no baseline named (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.md 83,644 B, effort.md 21,744 B).

  • Standing gate: zero adjudicated findings on this repo, every candidate adjudicated by name (11 effort: high frontmatter files, 10 model: 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.
  • Fence 4 adversarially validated: the verifier's constructed schema-doc-plus-prescription fixture still fires; the bare sample does not. The second commit exists because the first adjudication of claude-ops/lanes/context/config.md:26 was wrong under the original fences — the fence gap is closed at the fence, not by stretching an existing one.
  • Planted positives and negatives: both rows fire on their positives; all ten negative near-miss lines land in distinct fences.
  • The second commit also drops an I22 over-claim (a sync stamp tracks transcription currency, never whether advice still names a live model) — fence now rests on the no-vet ground alone with the residual stated.
  • instruction-scan.test.sh 46/46; markdownlint 0 errors; changelog parity/bump/order pass; validate-plugins.sh pass.

Deliberately not shipped here

  • The consumer-state halves (the dated org vet, the chezmoi fleet-pin coupling) — drafted to the campaign's memory tier for a separate dotfiles PR. The verifier substantiated the draft's own caution: the referenced vet issue (chore: effort judgment recalibration (choosing-a-model routing vet) #1697) closed without an executed-vet record, so the dotfiles sentence will be narrowed or re-cited to the real record before that PR opens.
  • Any fence built on the first-run hold's settings-file behavior — unstated upstream, recorded as unresolved.

No linked issue

Related

kyle-sexton and others added 2 commits August 3, 2026 10:07
… 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

claude Bot commented Aug 3, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 3m 51s —— View job


Reviewing PR #1884

  • Gather context (diff, changed files, CLAUDE.md)
  • Understand the request (code review of I21/I22 catalog rows)
  • Review criteria.md additions (I21, I22)
  • Review SKILL.md, plugin.json, CHANGELOG.md changes
  • Check alignment with CLAUDE.md / fresh-docs mandate
  • Cross-check quoted upstream sentences against currently fetched docs
  • Post final review

Summary

Reviewed the two new catalog rows (I21, I22) and the accompanying SKILL.md/plugin.json/CHANGELOG.md edits. criteria.md is a skill's prose body, so it's outside the fresh-docs mandate's mandatory scope per CLAUDE.md's own carve-out — but I fetched both cited pages anyway (model-config.md, effort.md) to spot-check the row's factual claims, since I21 leans on exact upstream wording. Every quoted sentence I checked is byte-exact against the live pages fetched today (2026-08-03):

  • "The effort scale is calibrated per model, so the same level name does not represent the same underlying value across models." ✓ exact (model-config.md)
  • First-run default hold wording for Fable 5 / Opus 4.8 / Opus 4.7 vs. Opus 5's no-hold carry-over ✓ exact
  • "The default effort is high on every model that supports effort, except Opus 4.7, which defaults to xhigh." ✓ exact
  • "Equivalent to not setting the parameter" (effort.md, high row) ✓ exact
  • "If you carried effort settings over from an earlier model, run a fresh effort sweep on your evals rather than reusing them." ✓ exact

No misquotes found. Version bump (0.20.0→0.21.0), criteria.md front matter (1.7.0→1.8.0), and the SKILL.md I1–I20→I1–I22 range updates are all internally consistent, and the CHANGELOG entry accurately describes the shipped rows.

Finding

I21's own "Detect condition" framing contradicts its own later disclaimer.

plugins/claude-config/skills/audit-instructions/reference/criteria.md#L749-L750:

The model range below is a Detect condition, not a Model scope annotation, for the reason I17 states.

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 Detect: bullet text itself ("on Claude Opus 5 or a later model"), which is exactly why those rows need the "Detect condition, not Model scope" distinction: an exact-match annotation would go inert on the next model generation while the underlying restriction still holds.

I21's own Detect: bullet (L752-756) never mentions a model at all — the model range only shows up in the next bullet (L757-765), which is explicitly about the consequence varying by model (whether the first-run hold masks a stale pin), and that same bullet states plainly:

L764-765:

The row fires on the missing re-derivation regardless of model; the hold is severity context, never a fence.

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.

Fix this →

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

claude Bot commented Aug 3, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 30s —— View job


Security review — PR #1884

  • Gather context (diff, changed files, custom instructions)
  • Review each changed file for security-relevant surfaces
  • Post findings

Scope reviewed (git diff between the branch point and HEAD 763f459, matching the PR's 4 changed files):

  • plugin.json — version bump only (0.20.00.21.0).
  • CHANGELOG.md — new release notes entry (prose).
  • SKILL.md — two range references updated from I1–I20/I6–I20 to I1–I22/I6–I22.
  • criteria.md — version bump, two new Sources parentheticals citing existing platform.claude.com/code.claude.com doc pages, and two new catalog rows (I21, I22) as audit-criteria prose.

Findings

None. This PR contains no code, no shell/script changes, no GitHub Actions workflow changes, no .mcp.json or hook wiring, no permission grants, and no new dependency or action pins. Every changed file is either a version number or Markdown prose (changelog entry, skill-catalog documentation, and two new audit-criteria rows). There is no:

  • injection surface (command, SQL, path, template) — no code executes user- or repo-derived input here,
  • token/secret/credential handling — none touched,
  • authorization or access-control logic — none present,
  • GitHub Actions trigger, permissions, or run:-block change — no workflow files are in this diff,
  • supply-chain change — the only URLs added are citations to existing, already-trusted official Anthropic doc domains (platform.claude.com, code.claude.com), not fetched or executed by any script in this diff.

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 audit-instructions. It doesn't — the added rows are self-consistent audit-criteria text matching the style/structure of the pre-existing I1–I20 rows, with no embedded directives aimed at overriding agent behavior, no obfuscated content, and no untrusted external references.

Nothing to flag for this PR.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread plugins/claude-config/skills/audit-instructions/reference/criteria.md Outdated
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

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

claude Bot commented Aug 3, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 21s —— View job


Security review — PR #1884 (re-run at b57a66b)

  • Gather context (git diff against the PR's actual merge base, d1a83f4, and the incremental diff since the prior security pass at 763f459)
  • Review each changed file for security-relevant surfaces
  • Post findings

Scope reviewed: full PR diff d1a83f4..b57a66b (4 files, +223/-11), with particular attention to what changed since the last security review (commit 763f459b57a66b):

  • plugin.json — version bump only (0.20.00.21.0).
  • CHANGELOG.md — release notes (prose), including a new entry describing the --opinion fix.
  • SKILL.md — range references bumped to I1–I22/I6–I22, and the --opinion flag description changed from a hardcoded row list to "read from the catalog at run time" (L105-113).
  • criteria.md — version bump, Sources parentheticals, and the two new catalog rows I21/I22, plus (in the newest commit) a reworded high-exemption fence keyed to "the resolved target" rather than the literal string high.

Findings

None. Every change in this PR — including the two follow-up commits made since the previous security pass — is a version number or Markdown/YAML-frontmatter prose edit. No shell, script, GitHub Actions workflow, .mcp.json, or hook-wiring file is touched anywhere in this diff. Specifically re-checked for this pass:

  • No injection surface (command, SQL, path, template) — no code executes user- or repo-derived input in any changed file.
  • No token/secret/credential handling touched.
  • No authorization/access-control logic touched.
  • No GitHub Actions trigger, permissions:, or run:-block change — no workflow files are in this diff.
  • No supply-chain change — no new dependency or action pins introduced.
  • The --opinion flag change (SKILL.md) moves from a hardcoded row list to "read from the catalog at run time" — this is an instruction to the LLM executing the skill, not an executable code path, and doesn't change what's readable/writable; it only affects which advisory findings a self-review skill surfaces. No access-control or trust-boundary implication.
  • The new I21/I22 catalog rows remain self-consistent, non-executable audit-criteria prose — reviewed again for embedded directives that could act as a prompt-injection payload against the LLM that later runs audit-instructions; none found, same conclusion as the prior pass.

This PR remains outside this lane's threat surface (no code execution, no CI/workflow changes, no config/permission changes). Nothing to flag.

@claude

claude Bot commented Aug 3, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 29s —— View job


Reviewing PR #1884 (re-run after new commits)

  • Gather context (diff since last review, changed files)
  • Review new commit(s) against prior findings (Codex P1/P2, my own Detect-condition finding)
  • Review alignment with CLAUDE.md
  • Post final review

Summary

New commit since my last review: b57a66b — "key I21's high fence to the resolved target; stop restating the --opinion set". Reviewed it against the two Codex findings and my own prior finding.

Codex P2 ("Keep broad high pins in scope for Opus 4.7") — fixed.
criteria.md#L770-L780 now keys the high exemption to the run's resolved target model rather than to the wording of the pin. A broad, model-agnostic "always use high" now correctly stays in scope once the resolved target is Opus 4.7 (where high is not the default) — exactly the cross-model case Codex flagged. The row also states the resolved target always exists ("the skill body aborts rather than run against an unresolved one"), which matches SKILL.md#L97-L104's fail-loud resolution ladder, so the fence never has to guess.

Codex P1 ("Add I22 to the --opinion check list") — addressed via a stronger fix than the literal request.
Rather than appending I22 to the hardcoded "I16 and I19 today" list in SKILL.md, the commit removes the restated enumeration entirely: SKILL.md#L106-L113 now says the row set is read from the catalog at run time. I checked this is actually mechanical, not hand-wavy: every OPINION-tier check that emits findings (I16 criteria.md:509, I19 criteria.md:685, I22 criteria.md:813) states Default off, enabled by --opinion in the same consistent phrasing, so a run can enumerate them by that marker without a second copy of the list to drift. This removes the whole drift class rather than fixing one instance, consistent with the PR's own framing.

My prior finding (I21's "Detect condition" framing) — still open, untouched by this commit.
criteria.md#L748-L750 still reads "The model range below is a Detect condition, not a Model scope annotation, for the reason I17 states" — but the first-run-hold model range it's introducing still gets its own explicit disclaimer two bullets later (L764-765): "The row fires on the missing re-derivation regardless of model; the hold is severity context, never a fence." In I17 (criteria.md:536-539), the model range is written directly into the Detect: bullet and genuinely gates firing — that's the actual reason the "Detect condition, not Model scope" distinction exists there. I21's hold-related model range does not gate firing (the row says so itself), so borrowing I17's framing for it still reads as internally inconsistent. Note the new high-exemption fence added in this commit (L770-780) does now make a different model range (the per-model high default) function as a genuine gate on whether a prescription fires — so if the intro sentence is meant to point at that fence instead, it would need to say so explicitly, since "the model range below" is now ambiguous between two different model-range mentions in the row. Non-blocking (doesn't change audit behavior, since the substantive rule is unambiguous once the whole row is read), but still worth the wording tweak I suggested in the previous review pass.

Everything else — CHANGELOG.md/criteria.md prose consistency, plugin.json version bump (0.20.0 → 0.21.0), criteria.md front matter (1.7.0 → 1.8.0) — checks out.

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

claude Bot commented Aug 3, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 6s —— View job


Reviewing PR #1884 (re-run after merge commit a12e30c)

  • Gather context (diff since last review, merge commit contents)
  • Check if merge introduced any substantive changes vs. b57a66b
  • Re-check my prior open finding (I21 "Detect condition" wording) status
  • Post final review

Summary

The only new commit since my last pass (b57a66b) is the merge commit a12e30c ("Merge origin/main into feat/corpus-ia6-a2-split"), which brings in two unrelated main-line PRs (#1848, #1865audit-pass lock/suppression fixes and autonomy/claude-ops lane-gate work). No code review action is needed on those files; per this lane's scope, review is limited to this PR's own 4 files.

Checked what the merge actually touched in this PR's scope:

git diff b57a66b a12e30c -- plugins/claude-config/.claude-plugin/plugin.json \
  plugins/claude-config/CHANGELOG.md \
  plugins/claude-config/skills/audit-instructions/SKILL.md \
  plugins/claude-config/skills/audit-instructions/reference/criteria.md

Result: only CHANGELOG.md changed, and only by the clean addition of main's [0.20.1] entry beneath this branch's [0.21.0] entry (correct newest-first order — CHANGELOG.md#L6 is [0.21.0], #L97 is [0.20.1]). SKILL.md and criteria.md are byte-identical to the last-reviewed commit — the merge commit message's own claim that "the audit-instructions surfaces this branch owns merged clean" checks out.

Also spot-checked the two version fields the merge commit message flags as manually re-asserted (since identical-looking version strings can auto-merge clean-but-wrong on a conflict): plugin.json#L4 is 0.21.0, criteria.md#L2 is 1.8.0. Both correct.

My prior finding — still open, unaffected by this merge

criteria.md#L749-L750 still reads "The model range below is a Detect condition, not a Model scope annotation" while L764-765 states "The row fires on the missing re-derivation regardless of model; the hold is severity context, never a fence." As noted in my previous review, this is a real internal-consistency gap (borrowing I17's "Detect condition" framing for a model range that the row itself says doesn't gate firing) but non-blocking — it doesn't change audit behavior since the substantive rule is unambiguous once the whole row is read. Not touched by this merge, so it remains open for a follow-up.

Codex's two findings (P1: --opinion list omitting I22; P2: broad high pins exempted for Opus 4.7) were already fixed in b57a66b, previously verified.

Nothing new to flag from this synchronize event.

@claude

claude Bot commented Aug 3, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 26s —— View job


Security review — PR #1884 (re-run at a12e30c)

  • Gather context (git diff origin/main...HEAD, changed files)
  • Review each changed file for security-relevant surfaces
  • Post findings

Scope reviewed: full PR diff origin/main...HEAD (4 files, +223/-11) — identical file set to the prior security passes:

  • plugin.json — version bump only (0.20.00.21.0).
  • CHANGELOG.md — release notes (prose).
  • SKILL.md — range references to I1–I22/I6–I22, --opinion reads its row set from the catalog at run time.
  • criteria.md — version bump, Sources parentheticals, catalog rows I21/I22.

I diffed the three prior commit b57a66b (the last security-reviewed SHA) against the current HEAD a12e30c directly: plugin.json, SKILL.md, and criteria.md are byte-identical between the two — no content changed in this PR's own files since the last pass. The one difference in CHANGELOG.md is the PR's own [0.21.0] entry landing above a [0.20.1] section that arrived via the intervening "Merge origin/main into feat/corpus-ia6-a2-split" commit (that section belongs to unrelated upstream work already on main, not to this PR — confirmed it falls outside origin/main...HEAD). No new lines are contributed by this PR beyond what was already reviewed.

Findings

None. As in the prior two passes: every changed file here is a version number or Markdown/YAML-frontmatter prose edit (changelog entry, skill-catalog documentation, two audit-criteria rows). No shell/script, GitHub Actions workflow, .mcp.json, or hook-wiring file is touched. Specifically re-confirmed for this pass:

  • No injection surface (command, SQL, path, template) — no code executes user- or repo-derived input in any changed file.
  • No token/secret/credential handling touched.
  • No authorization/access-control logic touched.
  • No GitHub Actions trigger, permissions:, or run:-block change — no workflow files in this diff.
  • No supply-chain change — no new dependency or action pins.
  • The I21/I22 catalog rows remain self-consistent, non-executable audit-criteria prose intended for the LLM that later runs audit-instructions — re-checked again for embedded directives that could act as a prompt-injection payload against that future run; none found.

This PR remains outside this lane's threat surface (no code execution, no CI/workflow changes, no config/permission changes). Nothing to flag.

@kyle-sexton
kyle-sexton merged commit 98d921d into main Aug 3, 2026
32 checks passed
@kyle-sexton
kyle-sexton deleted the feat/corpus-ia6-a2-split branch August 3, 2026 16:19
kyle-sexton added a commit that referenced this pull request Aug 3, 2026
…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>
kyle-sexton added a commit that referenced this pull request Aug 3, 2026
…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>
kyle-sexton added a commit that referenced this pull request Aug 4, 2026
…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>
kyle-sexton added a commit that referenced this pull request Aug 8, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant