Skip to content

docs: apply the fleet-wide prompt-audit against Claude Fable 5.1 - #3770

Merged
kyle-sexton merged 90 commits into
mainfrom
docs/prompt-audit-skills
Sep 5, 2026
Merged

docs: apply the fleet-wide prompt-audit against Claude Fable 5.1#3770
kyle-sexton merged 90 commits into
mainfrom
docs/prompt-audit-skills

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

No related issue: fleet-wide docs sweep tracked by the record and ADR 0028, not by an issue.

Summary

Runs the bundled /claude-api prompt-audit over every skill body, context and reference file, and agent definition in the marketplace against Claude Fable 5.1, and applies the high- and medium-confidence findings directly. All 74 plugins are covered: 63 took one commit each (patch bump, CHANGELOG line, evals in step) and 11 were clean. Across 64 auditor reports the lead applied 805 finding ids and withheld 207; the withheld set, the catalog gaps, the check-3 phrases each description dropped, a five-skill behavioral spot-check, and the follow-up inventory live in the record, docs/specs/prompt-audit-skills-2026-09.md. ADR 0028 records the accepted decisions the sweep contradicted (ADR 0004 D-1 and D-3, ADR 0006's applied-set gate); ADR 0005 and ADR 0008 stay accepted pending the operator's call.

Fix

  • One commit per plugin under plugins/<plugin>/, each naming its applied, skipped, and withheld finding ids and the check-3 phrases its descriptions dropped; descriptions name intent categories with a few exact phrases kept, history and incident narration leave skill bodies for the CHANGELOG and ADRs, undated harness claims are either verified and stamped or removed, and mechanism changes the audit exposed are follow-ups, not hunks.
  • skill-quality check 3 (dropped trigger phrases) is advisory instead of failing, so a deliberate consolidation ships with the warning recorded.
  • New path-scoped rule .claude/rules/skill-bodies-state-current-rules.md, indexed in AGENTS.md.
  • One renumber commit lifts 31 plugins' branch-added CHANGELOG headings above origin/main's current versions (main claimed or overtook the numbers the plugin commits carried); the record's Version cells name both numbers.
  • The topic Brief graduated into the record's ## Brief section and docs/topics/prompt-audit-skills/ was pruned.
  • One merge commit brings origin/main in (107 conflicts: 45 CHANGELOG and 45 plugin.json pairs resolved mechanically with the branch's entries above main's; 17 skill bodies resolved with the branch's rewrite as the base and main's later change on top, per the merge commit message).

Verification

  • scripts/check-changelog-parity.sh --check, --check-bump origin/main, --check-preserved origin/main, --check-order: all pass at the branch tip.
  • scripts/check-purged-em-dashes.sh, scripts/check-skill-precompute-compose.sh --all (251 skills, 0 violations), bash plugins/instruction-placement/scripts/render-index.sh check --file AGENTS.md (IN-SYNC), scripts/check-contract-slice-prune.sh --check-diff origin/main: pass.
  • scripts/affected-tests.sh --run over the branch diff was still running on the author's Windows host when this PR opened (its selection step alone takes about fifty minutes there); the suites run individually first all pass (skill-quality/scripts/check-skill.test.sh, docs-hygiene/.../detect.test.sh 197 checks, source-control test_skill_contract.py 25 tests) except the nine planning/tests/interview-defenses.test.sh digest assertions that fail on that host with interview/evals/evals.json byte-identical to origin/main (record follow-up F10). The full result lands as a PR comment; CI runs the whole corpus regardless.
  • Per plugin, before its commit: check-skill.sh on every touched skill (check 3 advisory, dropped phrases recorded), check-skill-precompute-compose.sh --paths, check-evals-quality.sh where evals changed, markdownlint, typos, and the ai-slop detector on every touched file.
  • Behavioral spot-check: five wave-1 skills run blind at the fork point and at the branch tip on one fixture each; no skill lost a step, a gate, or a safety refusal (record, ## Behavioral spot-check).

Related

  • Record: docs/specs/prompt-audit-skills-2026-09.md.
  • ADR: docs/adr/0028-audit-skill-bodies-fleet-wide-against-the-current-model-and-apply-directly.md (supersedes ADR 0004 D-1 and D-3 and ADR 0006's applied-set gate for this lane).
  • Pre-prune commit for the contract slice: f675afa1b2df6ab55036d7be3fff0f9bf97725d9 (gh api "repos/{owner}/{repo}/contents/docs/topics/prompt-audit-skills/PLAN.md?ref=f675afa1b2df6ab55036d7be3fff0f9bf97725d9" --jq .size); the Brief graduated into the record's ## Brief section and the follow-ups are inventoried below.

Follow-ups (verbatim from the record)

Inventoried here as they arise and shipped in the PR body verbatim.

  • F1. Write one superseding ADR covering every accepted ADR decision this audit contradicted (at minimum ADR 0004 D-1 and D-3, ADR 0006's applied-set gate); decide with the operator whether ADR 0005 and ADR 0008 are also retired.
  • F2. Audit the out-of-scope prompt surfaces the same way: hooks prompt text, output styles, .claude/rules, CLAUDE.md, AGENTS.md, and the plugin-level reference/ trees that skills load on invocation (autonomy, architecture, performance, playbooks, rate-limit-guard, context-guard); the performance auditor notes that snapshot and verify both mandate reading plugins/performance/reference/harness-integrity.md, which likely mirrors the archaeology the skill bodies shed.
  • F3. Behavior measurement beyond the wave-1 spot-check: route to claude-config:unhobble.
  • F4. Done before the PR: docs/topics/prompt-audit-skills/PLAN.md graduated into Brief and the slice was pruned (contract-slice prune gate); the PR body names the pre-prune commit.
  • F5. plugins/skill-quality/scripts/check-skill.sh check 3 hard-fails any trigger phrase dropped versus the base ref. That blocks prompt-audit's documented fix for trigger-case enumeration (near-synonym lists become intent categories). Change check 3 to a warning, update its tests, and record the deliberately dropped phrases per skill in this record. Must land before the PR so the skill-quality CI gate passes. Landed in a694011; two out-of-scope surfaces still describe check 3 as a hard-FAIL gate and should follow: the comment at plugins/docs-hygiene/skills/audit-noise/scripts/emit-findings.sh:220 and the eval fixture plugins/docs-hygiene/skills/audit-noise/evals/fixtures/negation-trigger-fence.md:9 (the docs-hygiene commit corrected the same script's header comment and its eval case 12).
  • F6. Verify and stamp the undated harness-behavior claims the audit flagged as I12 items (session-flow: /recap trigger and the Skill-invocable allowlist, the usage-limit reset surface, cleanupPeriodDays default, /clear transcript and scheduled-task behavior). Each becomes a four-part upstream-drift record or a doc pointer. Collected per plugin as the waves run. source-control adds: GitHub mergeStateStatus precedence and baseRefOid staleness (freshness.md), the permission-mode and wrapper-strip claims in safety.md, and the ScheduleWakeup clamp, /loop expiry, Monitor-on-resume, and sandboxed-GraphQL claims across babysit-prs, babysit-loop, pull-request, and worktree. disk-hygiene adds four undated harness-version claims (safety-model.md:262, :313, :315 on 2.1.207 and 2.1.218 pluginConfigs scope and PowerShell hook firing; clean/SKILL.md:382 on the v2.1.211 auto-mode prompt). performance adds the undated benchstat -delta-test claim at snapshot/SKILL.md:94-96, and plugins/performance/reference/harness-integrity.md (out of audit scope, mandated reading for snapshot and verify) likely carries the run archaeology the four skill bodies shed (see F2).
  • F7. pull-request hardcodes one vendor's review bot (login, emoji signalling, timing) in reference/monitor.md gotchas and reference/readiness.md Gate 5, against the file's own "discover actors, don't hardcode them" rule. Parameterize Gate 5 on the discovered reviewer login and move the vendor shapes into a dated reference-shapes note with a recheck trigger.
  • F8. source-control cites sibling-plugin files by relative path (../../../../autonomy/..., ../../../../../prompts/...) in babysit-loop/reference/promotion-evidence-resolution.md and babysit-prs/reference/safety.md. Those resolve only in the marketplace checkout, never in an installed plugin. Convert to the raw-URL form the plugin already uses at babysit-loop/SKILL.md:40. review adds: agents/ecosystem-specialist.md:22, fanout/context/fix-pass-mode.md:7, quality-gate/context/close-out.md (four sites), and quality-gate/context/spec.md (three sites) cite marketplace docs/ paths or sibling-plugin files by relative path. review also adds two undated claims to F6: the bundled /code-review and managed Code Review service tiers in quality-gate/context/pr.md and code.md, and the "built-in /security-review is unusable in CI" claim in security-review/SKILL.md. The autonomy applier converted six of that plugin's own convention and sibling citations to marketplace URLs; those were reverted to the relative form before the PR because scripts/validate-plugin-contracts.mjs forbids the autonomy plugin naming the org or a vendor, so the autonomy sites stay under this follow-up.
  • F9. planning/skills/wayfind/SKILL.md pre-compute silently coerces a non-string container_label to work-map, which context/tracker-mechanics.md says is a configuration error that must never proceed. Make the pre-compute fail loud or surface the raw value, matching the doc.
  • F11. work-items carries the same 60-line lane-telemetry upsert as a fenced shell block in work-loop/reference/telemetry-upsert.md and attend-queue/reference/telemetry-upsert.md, transcribed by the model on every cycle, with a classifier-fallback section asking it to re-derive gate order by hand (prompt-audit Group 4, an LLM executor for a deterministic plan). Extract it into plugins/work-items/scripts/lane-telemetry-upsert.sh with a co-located test, taking lane, instance, repo, issue, and body-file arguments and exiting non-zero on each refusal branch; both references then invoke it. Deferred from the audit because it is a mechanism change, not a prose hunk. work-items also adds six undated harness and gh claims to F6 (classifier refusals of permissions.allow widening and of the reclaim call, the compound-shell block, sandboxed GraphQL 403).
  • F12. shell: bash frontmatter selects the shell for !...`` injections. Skills whose pre-compute block became empty when the git lines moved into body calls still carry the key inert (debugging F5 found one). Sweep every SKILL.md: where no injection remains, drop the key; check-skill.sh check 19 stays green either way.
  • F13. playbooks:boris presents Fable 5 as the current top model and its launch-era classifier behavior as current (skills/boris/SKILL.md:58,133); upstream has not published Fable 5.1 tips. Re-sync through /playbooks:update when it does, and until then qualify the Model row "as of the 2026-07-24 sync".
  • F14. The fable-5 playbook's own regeneration trigger ("a model-version change", skills/update/SKILL.md:39) has fired with Fable 5.1. The audit adds the guide-backed minimum, a fable-5-1.md adaptation chapter; regenerating the whole pack from Fable 5.1 is the maintainers' larger call. playbooks also adds to F8: reference/model-adaptation/opus-5.md:207-208 cites a probe record (thinking-off-probe-2026-07-26.md) that exists nowhere in the repository. And to F6: the cache-pricing stamp at skills/fable-5/context/orchestration.md:97 carries a date but no recheck trigger.
  • F15. The statusline compose transform in unwrap-before-compose.md (synced between context-guard and rate-limit-guard) is a pure function of the effective statusLine string that the model hand-executes over roughly a hundred lines of prose, with eight eval cases checking the arithmetic (prompt-audit Group 4). Extract it into a synced scripts/compose-statusline-wiring.sh with the round-trip check inside, shrink the reference to the contract, and turn those eval cases into script tests. Deferred from the audit as a mechanism change. rate-limit-guard also adds to F6: the undated "Monitors is an experimental Claude Code component" claim in reference/reader-contract.md:206-209.
  • F16. claude-ops/skills/plugins/SKILL.md:268-276 records that its own probe's recheck trigger has fired (the CLI moved from 2.1.218 to 2.1.240 with the claim un-retested). Re-run the probe and refresh the stamp. claude-ops also adds nine undated harness and upstream-issue claims to F6 (bundled doctor gating, audit-native-overlap alias examples, inventory command aliases, the WebFetch truncation window, the CLAUDE_PLUGIN_DATA export claim, the lanes "verified on this machine" lines, the observability session_id and Stop-hook gotchas, upstream issue states in read-routing.md and sync.md, and the triggerless surfaces.md stamp) and two measured figures (backups/ retention, the 97 percent and 50 MB figures in observability). plugins/repo-fleet-hygiene/skills/audit/scripts/audit-fleet.test.sh fails 5 of 180 cases on this host (the worktree-root-unconfigured placement and header cases, the symlink discovery-root case, the intermediate-symlink case, and the unreadable discovery-root case); the scripts are untouched by the repo-fleet-hygiene commit and the finding-kind table assertion passes.
  • F17. context-guard/skills/setup/SKILL.md runs four fixed read-only probes (jq presence, installed shim versus shipped source, session snapshot, zones.json) as model-issued Bash calls where a ## Pre-computed context block would run them before the body loads (prompt-audit Group 4). Adding one is a mechanism change: the block must pass scripts/check-skill-precompute-compose.sh and stay inside the worktree guard's rule that a composed block expands nothing but bare $HOME, so it is deferred from the audit. context-guard also adds to F6: the undated disableAllHooks / allowManagedHooksOnly claims in skills/setup/SKILL.md:93-96 and reference/reader-contract.md:503-507, the undated PowerShell routing note in statusline-edit.md:106-109, and the folklore-number paragraph at reader-contract.md:383-391, which is dated but has no recheck trigger.
  • F18. autonomy/reference/autonomous-pipeline-reminder.md (out of audit scope; cited only by the README and a hook) rewords the vendor's autonomy block under the repo's no-copy rule and omits the Fable 5.1 clause "Do not stop because the context or session is long"; the guide calls the opening sentence load-bearing as written. Weigh the no-copy rule against that claim and add the missing clause in the plugin's own words. autonomy also adds to F6: the undated AGENTS.md-reachability claim stated three times (skills/setup/SKILL.md:267, context/prerequisite-resolution-slice.md:38-39, reference/prerequisite-resolution.md:86-88), the undated empirical telemetry claims in reference/telemetry.md, and the "shipped first-party mechanisms today" claims in reference/runner/escalation.md:140-152.
  • F19. plugin-quality/skills/audit/SKILL.md:58-92 has the model resolve the context zone by hand from inlined band tables, a staleness window, a version floor, and a combination rule that plugins/context-guard/scripts/context-zone.sh already implements (prompt-audit Group 1b and Group 4). Ship a byte-identical synced copy at plugins/plugin-quality/scripts/context-zone.sh with its test, register it in scripts/cross-plugin-source-registry.txt with a sync-context-zone.sh --check entry, and have the gate and setup/SKILL.md:28-30 call it. Deferred from the audit as a mechanism change. plugin-quality also adds to F6: two live doc-page titles quoted undated in agents/auditor.md:117-119, the context: fork and cloud-scoping claims in references/component-types/skill.md:18-24, and six dated stamps with no recheck trigger. skill-quality adds to F6: three undated harness claims outside the dated stamp in check/SKILL.md:160-172, and the setup/SKILL.md:16-20 stamp that has no recheck trigger. instruction-placement adds to F6: the undated "other agents resolve nearest-wins" claim in realign/context/apply-recipes.md:95-97. context-budget adds to F6: the v2.1.232 measurement at audit/SKILL.md:226-228, the /doctor availability and disableModelInvocation claim at audit/SKILL.md:34-36, the cited-but-undated mechanism claims in audit/reference/engine.md:25-30 with the dangling "verified version" referent at :52-53, and the wall-clock range at audit/SKILL.md:93. computer-use adds to F6: the dated surface table in diagnose/SKILL.md:62-63 and the dated basis in diagnose/reference/windows-quirks.md:5-6, both without a recheck trigger. overengineering adds to F6: the undated harness-behavior claim in the gather blocks of all three skills (audit/SKILL.md:20-23, delta/SKILL.md:19-23, realign/SKILL.md:19-22, covered by the one dated record the worktree skill will own) and the undated /loop capability claims in delta/context/recurring-wiring.md:37-38,51-53. improvement adds to F6: four undated GitHub REST and Claude Code CLI claims in find/context/ci-health.md:32-41, find/SKILL.md:235-237, and find/context/unattended.md:74-75. docs-hygiene adds to F6: the bundled /batch skill claim in extract-ssot/actions/batch.md:35,281, four undated external benchmark figures across extract-ssot/SKILL.md:27, context/anti-patterns.md:129, and context/decision-framework.md:27-59, and the undated upstream-publishing claim in audit-encapsulation/context/public-surface-contract.md:5. code-tidying adds to F6: the CodeScene agentic-refactoring figure in tidy/reference/scope-budget.md "Research lineage" has no resolvable source; the audit dropped the number and kept the qualitative claim until a publication URL and read date are recorded. repo-hygiene adds to F6: the sourced-but-undated ${CLAUDE_SKILL_DIR} substitution-scope claim in clean/reference/invocation-forms.md. disk-hygiene adds to F6: four undated harness-version claims across clean/SKILL.md and clean/reference/safety-model.md (report F15). codebase-health adds to F6: the undated harness-capability claim at audit/SKILL.md:25-28, verified true by the auditor on 2026-09-04 and needing only its dated record. architecture adds to F6: the undated pre-compute execution claim at improve/SKILL.md:25-28. mcp-tools adds to F6: three cited-but-undated Claude Code client-behavior values in audit/reference/checklist.md:38,105,106. performance adds to F6: the undated benchstat flag-set claim in snapshot/SKILL.md:94-96.
  • F20. provenance/skills/audit spells one tier two ways: not-found in SKILL.md:2,82,227 and source-not-identified in reference/rubric.md:297, and scripts/emit-findings.sh with its test asserts both. Pick one spelling, change the script and emit-findings.test.sh with it, and align the markdown in the same commit. Deferred from the audit because the fix crosses into a script and its suite.
  • F21. mutation-testing/skills/setup/SKILL.md:80-89 has the model re-derive a suppression entry's finding_id hash from its constituents and check node-kind membership by hand (prompt-audit Group 1b and Group 4, the same shape as F19). Ship plugins/mutation-testing/scripts/suppression-lint.sh with a test implementing the two published derivations and the membership check, have setup call it, and retarget setup eval 5 and audit eval 3 from "the model re-derives" to the script. Deferred from the audit as a mechanism change.
  • F22. plugins/ai-briefing/skills/setup/evals/evals.json:33 prompts /ai-briefing:setup --with-build-deps, but the skill's contract is apply install-build-deps; the case exercises a flag the skill does not accept. Retarget the prompt to the contract form. Observed by the ai-briefing auditor outside the audit's markdown scope.
  • F23. plugins/dometrain/skills/sync/context/update.md documents the maintainer-only --refresh-baseline command through ${CLAUDE_PLUGIN_ROOT}, which resolves to the installed plugin cache in a normal session, while the next paragraph forbids running it anywhere but a working clone; the script writes next to itself either way. Give the command as a clone-relative path, or document that the flag is only safe under --plugin-dir. A script-safety contradiction, not a prose hunk; observed by the dometrain auditor.
  • F24. Add a criteria row to plugins/claude-config/skills/audit-instructions/reference/criteria.md for each recurring shape in Catalog gaps: dated stamps with no recheck trigger, migration-relative phrasing inside reference and context files, routing text that names a skill absent from plugins/, sibling-file meta-commentary, and maintainer rationale inside model-facing YAML comments; the rest are one-offs and stay listed.
  • F10. Not an audit finding, recorded so it is not mistaken for one: .claude/hooks/cloud-bootstrap-plugins.test.sh fails 15 of 32 assertions on this Windows host ("not installed at user scope") with .claude/cloud-bootstrap.sh and the suite byte-identical to origin/main. The failure is environmental or pre-existing; confirm on CI and file separately if it reproduces there. Same status for plugins/docs-hygiene/skills/audit-noise/scripts/emit-findings.test.sh ("tier is looked up as IMPORTANT", "Location is repo-relative") and plugins/provenance/skills/audit/scripts/list-corpus.test.sh and emit-findings.test.sh ("a directory target lists its markdown"), which fail on this host with their scripts and suites byte-identical to origin/main. Same again for plugins/work-items/skills/onboard-adapter/scripts/generate-adapter.test.sh case 116, and for the nine eval-case digest assertions in plugins/planning/tests/interview-defenses.test.sh (interview/evals/evals.json unchanged since the digests were pinned; local jq 1.8.2), and for four Windows temp-path cases in plugins/instruction-placement/scripts/verify-load.test.sh (selected by a basename collision on typescript.md; the probe and suite are unchanged on this branch), and for plugins/claude-ops/skills/audit-install-state/scripts/install_state.test.sh (a Windows filename-syntax error on a fixture path) and plugins/claude-ops/skills/audit-skill-visibility/scripts/audit_skill_visibility.test.sh (no installed_plugins.json in the temp config), both with scripts and suites byte-identical to HEAD, and for plugins/claude-ops/skills/plugins/scripts/fleet-state.test.sh, which fails a varying subset of its 74 cases on this host (six inside a check-skill run, two when run alone) with the scripts byte-identical to origin/main. Same again for plugins/claude-config/skills/audit-instructions/scripts/restatement-scan.test.sh (two I29 fixture cases, script and fixtures byte-identical to origin/main) and the one emit-findings.test.sh case downstream of it ("Action names a body cut"), which reads the same scanner's output. Same again for plugins/claude-config/skills/audit-permission-grants/scripts/permission-rule-check.test.sh case 6b ("vendored copies excluded, exactly one finding"), whose script and suite no branch commit touched (main has since tidied the suite in ac7eeea). The fleet gather block itself ("the harness runs a skill's whole pre-compute block as one shell invocation") is an undated harness claim in about 55 skills; one dated four-part record on the worktree skill, which owns the mechanism, with the copies pointing at it, clears every site at once. discovery adds six undated claim families across thirteen files (silent preload failure, AskUserQuestion and plan-mode tools filtered from non-fork subagents, the Workflow tool absent from subagents, background as the default execution mode, spawns permission-classified before launch); the fix is one dated record per claim in the plugin's reference/parent-contract.md with the skills pointing at it. claude-config adds the undated pre-v2.1.211 boundary at six body sites (the dated owner is audit-permission-state/reference/criteria.md), dated-but-triggerless stamps across eight files, the conflict-scan.sh precision figures in conflict-criteria.md, and the "Fable 5 subpage" pointers in audit-prompting-postures/reference/postures.md that need a Fable 5.1 sibling once it exists. discipline adds five files of undated fork-mode harness claims (sweep-all/SKILL.md, its two references, scrutinize-dont-coast/SKILL.md, use-your-skills/SKILL.md). claude-memory adds the undated upstream-issue state at audit/reference/official-guidance.md:168. testing adds the xUnit v3 and .NET 10 framework-trap claims (diagnose/SKILL.md:68, diagnose/context/investigate.md:16, write/SKILL.md:74) and the playwright-cli version floor in run-e2e/context/e2e.md:12. planning also adds two undated harness claims to F6: the agent-teams "experimental, default-off" status in plan/SKILL.md and the "cannot read effort or advisor state" claim in interview/context/session-config.md. plugins/ai-slop/skills/audit/scripts/detect.test.sh fails its four "git absent" cases (4 of 202) on this Windows host because the test symlinks the shell builtin printf into a fake PATH directory (ln: failed to create symbolic link); the scripts are unchanged by the ai-slop commit. plugins/disk-hygiene/skills/clean/scripts/guard_launch_monitor.test.sh fails its two telemetry-sink cases and hygiene.test.sh fails test_stash_must_exist_in_an_independent_checkout and test_preview_allows_root_children_os_managed_snapshot on this host with the scripts byte-identical to HEAD; neither case reads markdown, and the frontmatter-belt assertions in test_hygiene.py that do read clean/SKILL.md pass after the disk-hygiene commit. plugins/code-tidying/skills/audit-comment-residue/scripts/detect.test.sh fails 4 of 53 cases on this host (embedded quote and backslash unescaping in the preview script, arrow-in-filename, tab-bearing path) with detect.sh and the suite byte-identical to HEAD; the code-tidying commit touches only prose the script does not read. plugins/knowledge/skills/docpage-digest/scripts/check-fences-exact.test.sh fails six cases on this host with a UnicodeEncodeError writing U+2265 to the cp1252 console, script and suite byte-identical to HEAD; the knowledge commit touches no fence, quote payload, or script. plugins/education/skills/teach/scripts/list-workspaces.test.sh fails "worktree lists the MAIN repo's workspace" on this worktree checkout with the script unchanged.
PLAN.md (graduated into the record and pruned; last held at f675afa)

prompt-audit-skills

Brief

TLDR

Run the bundled /claude-api prompt-audit over every skill in this marketplace against Claude Fable 5.1, apply the high and medium confidence findings in waves, and ship one PR with a durable record, per-plugin version bumps, updated evals, and an inventoried follow-up list.

Goal

Every skill body, its context and reference files, and every agent definition has been audited for dated prompting patterns using shared/prompt-audit.md (Groups 1a to 1f, 2, 3, 4 and the keep list), with Claude Fable 5.1 as the target model. Findings at high or medium confidence are applied; low-confidence and flag items are recorded. Findings are mapped to the in-repo catalog row (claude-config:audit-instructions I1 to I29) where one exists so catalog gaps are visible.

Constraints
  • Target model is Claude Fable 5.1. Where the migration guide has Opus 5 guidance and no Fable 5.1 guidance, use the Opus 5 guidance; on conflict Fable 5.1 wins.
  • Existing ADRs, CI gates, check-skill.sh, and repo conventions are not binding on the audit. When one blocks a warranted change it is updated or removed in the same commit, and a superseding ADR is written at the end for every accepted decision the audit contradicted.
  • Scope is plugins/*/skills/**/*.md excluding vendor/ and evals/, plus plugins/*/agents/*.md. Hooks prompt text, output styles, .claude/rules, CLAUDE.md and AGENTS.md are out of audit scope except for edits that codify the Group 2 history rule.
  • Descriptions and trigger text are in scope under prompt-audit's own split: routing text may keep calibrated urgency; enumerated near-synonym trigger lists become intent categories; a dropped phrase that check-skill.sh check 3 rejects means the check is updated, not the phrase restored.
  • Group 2 history narratives are applied as written: incident IDs, PR numbers, past-tense narration, pinned model names, and date-conditional guidance are removed from skill bodies. A dated verification with a recheck trigger is kept; an undated volatile claim is verified or removed.
  • Findings carry a label, fleet or fable-5-1. Both labels are applied at high and medium confidence; the label is recorded so a consumer on another model can read what changed.
  • Every touched plugin gets a patch version bump and a one-line CHANGELOG entry in the same commit as its hunks. One commit per plugin.
  • A skill's evals/evals.json is updated in the same commit whenever its body changes.
  • One worktree, one branch (docs/prompt-audit-skills), one PR.
Acceptance criteria
  • The record docs/specs/prompt-audit-skills-2026-09.md exists with: stated assumptions (scope, target model), corpus, per-wave findings tables (file:line, evidence, pattern, why obsolete, confidence, action, label, catalog row), applied versus withheld, catalog gaps, and a ## Follow-ups section.
  • Every skill in scope has a row in the record: findings applied, findings withheld, or clean.
  • Execution contract, per skill: audit report written to .work/prompt-audit-skills/reports/<plugin>.md; accepted hunks applied; evals in step; bash plugins/skill-quality/scripts/check-skill.sh <skill-dir> passes (or the check was updated and its test updated); plugin commit landed with bump and CHANGELOG entry. Per wave: every plugin closed, record updated, handoff written.
  • Static gates green on the branch: scripts/affected-tests.sh --run, scripts/check-changelog-parity.sh --check, --check-bump origin/main, --check-preserved origin/main, --check-order, scripts/check-purged-em-dashes.sh, markdownlint, scripts/check-skill-precompute-compose.sh --all.
  • Behavioral spot-check recorded for wave 1's five most-used skills (session-flow handoff, orchestrate, keep-going, source-control commit, planning interview): before and after invocation on one fixture by a fresh subagent, difference described in the record.
  • A path-scoped rule under .claude/rules/ states the Group 2 history rule for plugins/*/skills/** and is indexed in AGENTS.md's on-demand table.
  • A superseding ADR records every accepted ADR decision the audit contradicted (at minimum ADR 0004 D-1 and D-3, ADR 0006's applied-set gate).
  • docs/topics/prompt-audit-skills/PLAN.md is graduated into the record and removed before the PR, so the contract-slice prune gate passes.
  • The PR body carries the follow-up inventory verbatim from the record.
Captured assumptions
  • The bundled claude-api skill at Claude Code 2.1.258 is the current authority for prompt-audit; its guide and the Fable 5.1 migration sections are read from the session's bundled-skills directory.
  • Local skillUsage counts from one machine are the usage signal; they rank session-flow, planning, and source-control first.
  • Behavioral A/B across all 241 skills is not affordable; the record says so and routes behavior measurement to claude-config:unhobble.
Out-of-scope
  • Hooks prompt text, output styles, .claude/rules, CLAUDE.md, AGENTS.md as audit targets.
  • Marketplace-level docs under docs/ except the record, the new rule, the ADR, and conventions that tell skill bodies to carry archaeology.
  • Pushing or opening the PR from a subagent.
Deferred questions
  • Q1 (arbiter: USER-RESERVED at PR time): whether the superseding ADR should also retire ADR 0005 and ADR 0008, decided once the audit shows what they blocked.

Plan

(empty; execution runs directly from the Brief's execution contract)

🤖 Generated with Claude Code

https://claude.ai/code/session_01GjdFagSG1CvQop76ZxM28k

kyle-sexton and others added 30 commits September 2, 2026 11:17
…onale

The repository now uses Claude Code's default worktree base ref. A
worktree Claude Code creates, including a subagent worktree, branches
from the repository's default branch on the remote ("fresh"), per the
official worktrees page fetched 2026-09-02.

- .claude/settings.json: remove the `worktree` key.
- docs/conventions/topic-docs/README.md: drop the head-override
  mechanism, its matrix row, its rationale, and the committed-settings
  adoption snippet; the mechanism count is now three and the remaining
  worktree row describes the default base.
- docs/conventions/topic-docs/CHANGELOG.md: add the 3.1.0 entry.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012fUT7zuZ21RT7zfEHi9JhA
Adds the durable record for the 2026-09 prompt-audit sweep
(docs/specs/prompt-audit-skills-2026-09.md) with stated assumptions,
corpus, wave plan, and the follow-up inventory the PR body will carry;
the topic Brief under docs/topics/ (graduated into the record before the
PR); and the path-scoped rule .claude/rules/skill-bodies-state-current-rules.md
codifying prompt-audit Group 2 for skill and agent bodies, indexed in
AGENTS.md through render-index.sh.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012fUT7zuZ21RT7zfEHi9JhA
…ock so worktree-isolated sessions can load the skills

Invoking a skill from a worktree-isolated session failed before the body
loaded: the harness composes every `!` substitution in a SKILL.md
`## Pre-computed context` block into one shell invocation, and the
isolation guard refuses a compound command that contains git. The
`{ git status --porcelain ... } | head -N` line surfaced first in
/planning:interview; the same shape sat in 50 skills.

Each affected skill now carries a "Repository context. Gather first"
body section modeled on the worktree skill's fix in #1619: individual
Bash calls, one command per call, every `| head -N` bound kept inside
its command, a failure read as an unknown value. Non-git pre-compute
lines (date, probe scripts, gh, detectors) stay where they were. Body
references to the moved values now name the gathered ones; the
overengineering lanes read the branch call's exit status instead of a
sentinel string.

Patch bumps with matching CHANGELOG entries for the 22 plugins touched:
ai-slop, architecture, bugs, claude-ops, code-tidying, codebase-health,
coupling, debugging, discovery, docs-hygiene, implementation,
improvement, mutation-testing, overengineering, planning, prototype,
provenance, repo-hygiene, review, testing, toolchain, verification.

scripts/check-skill-precompute-compose.sh --all now reports 0
violations (was 43).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
….39.52)

F1 attend-queue, work-loop, triage, track, work (13 files): issue numbers and incident narration removed
F2 track/SKILL.md, due.md, recheck.md, audit.md, work/SKILL.md, decompose/SKILL.md: role-label defaults silent, reference-aligned
F3 triage/SKILL.md: re-anchor plugin renamed to discipline
F4 track/actions/stats.md: aggregation cap defers to adapter
F5 work-loop/reference/c3-ratification-queue.md, work-loop/AGENTS.md: manual gate check moved out
F6 work/SKILL.md: old implementation compatibility passage deleted
F7 start.md, done.md, audit.md, track/SKILL.md, work/SKILL.md, triage/SKILL.md: migration-relative phrasing states current rule
F8 decompose/SKILL.md, work/SKILL.md: roadmap phrasing replaced with constraints
F9 work/SKILL.md: MUST-follow thoroughness booster made plain
F10 work/SKILL.md, work-loop/SKILL.md: claim-before-dispatch invariant stated once
F11 track, work, decompose, ship SKILL.md: trigger lists became intent categories
F12 track/SKILL.md, add.md: hardcoded group and verb counts removed
F13 onboard-adapter/SKILL.md, live-exploration.md: jira archaeology became present-tense rule
F14 decompose/context/container-lifecycle.md: unnamed upstream analog sentence deleted
F15 track/actions/recheck.md: maintainer aside removed from pointer
F16 track/actions/done.md: section number replaced by gate name
setup-T1 sites 6-11 setup/SKILL.md, autonomous-apply.md, capability-tier-axis-migration.md, capability-tier-backfill.md, overlay-ignore-probes.md, setup evals: ADR and issue numbers removed
setup-T2 setup/SKILL.md: stays-bespoke justification sentence deleted
setup-T4 site 4 setup/SKILL.md: twelve-step count made generic
setup-F2 setup/SKILL.md, providers.md: all five bundled adapters named
setup-F3 setup/SKILL.md: as-before migration phrasing removed
Skipped by lead: F17, F18, F19, F20, F21, F22, F23
Not applied: none

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…(0.34.21)

Applied F1 through F25 of .work/prompt-audit-skills/reports/session-flow.md per the lead's decisions:
F1 find-handoff rung-1 reference: issue number and deferral story removed
F2 workflow continuation: issue numbers removed, reason kept
F3-F8 orchestrate SKILL.md, gotchas, sources: nesting-ceiling version timeline, eleven-worker and 88-agent incidents, superseded cap entry, resolved-drift narration removed; rules restated in the present tense with dated stamps kept
F9 handoff SKILL.md: past-tense gather rationale removed
F10 reconcile: cut-from-V1 phrasing removed
F11-F13 orchestrate sources: re-verify stamp and stale-copy rule stated plainly; failed probe narration removed
F14 orchestrate SKILL.md and gotchas: clean-return rule stated without the incident
F15 handoff Hard rule: caps register lowered, constraint and reason kept
F16 handoff order rule: past-tense observation became mechanism
F17 running-retro: anecdotal percentages removed
F18 show-options buckets: earlier-design measurements removed
F19 show-options SKILL.md and buckets: numeric line budget replaced by the shape; eval id 3 updated
F20 show-options: sibling probe count removed
F21 workflow continuation: I23 reconciliation note replaced by the mechanism paragraph
F22 keep-going description: trigger list consolidated into intent categories (check 3 warned on the dropped phrases)
F23 workflow philosophy: generic virtue removed
F24-F25 find-handoff SKILL.md and rung-3 reference: two directive forms stated as current shapes
Skipped by lead: F26 through F36 (withheld)

Split out of d1426f084, where these files were swept in from the shared index.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…for the prompt-audit sweep

Adds the cross-cutting commits table, the fleet decisions section, and
follow-ups F5 through F18 gathered from the 22 audit reports reviewed
so far.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… (0.11.15)

F1 stateless/SKILL.md, context/purge.md, reference/official-guidance.md: dropped unsourced purge version floor
F2 audit/reference/official-guidance.md: replaced supersession story with recheck trigger
F3 audit/SKILL.md, context/audit.md, context/fix.md, evals/evals.json: removed health rename archaeology
F4 audit/SKILL.md: dropped state-key resolver provenance aside
F5 audit/context/audit.md: discovery comment stated present tense
F6 audit/reference/criteria.md: removed migration-relative "now" from R1
F7 audit/reference/official-guidance.md: pre-2.1.211 branches restated present tense
F8 audit/reference/official-guidance.md: deleted unverified instruction-count figure
F9 audit/context/audit.md: per-check step list collapsed
F10 audit/context/fix.md: C3 fix step list collapsed
F11 stateless/context/purge.md: deleted worked purge-gate anti-pattern
Skipped by lead: F12
Not applied: none

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…1 (0.55.40)

F1 skills/babysit-prs/SKILL.md: pre-compute note drops issue reference
F2 skills/babysit-prs/SKILL.md: autopilot merge tier stated presently
F3 skills/commit/SKILL.md: pipe-bound rule without revision history
F4 skills/commit/SKILL.md: git-lines pre-compute rule restated
F5 skills/commit/SKILL.md: context-clause mandate story removed
F6 skills/commit/SKILL.md: harness trailer example unpins models
F7 skills/commit/SKILL.md: rung-3 omission narrative removed
F8 skills/commit/SKILL.md: key spelling without decision record
F9 skills/commit/reference/exec-bit.md: rename arm without decision record
F10 skills/pull-request/SKILL.md: gather note drops issue reference
F11 skills/pull-request/reference/create.md: section gate scope stated presently
F12 skills/pull-request/reference/create.md: pushed mode drops migration phrasing
F13 skills/pull-request/reference/merge.md: stale-base guard heading unnumbered
F14 skills/pull-request/reference/readiness.md: positional-index incident sentence removed
F15 skills/resolve-conflicts/SKILL.md: two pre-compute notes merged
F16 skills/setup/SKILL.md: committer-date bullet drops parenthetical
F17 skills/setup/reference/apply-convention.md: review-finding ids removed
F18 skills/worktree/SKILL.md: two pre-compute notes merged
F19 skills/worktree/SKILL.md: orchestrator named instead of issue
F20 skills/worktree/SKILL.md: claim sentence drops issue reference
F21 skills/babysit-loop/SKILL.md: budget and knob rules unnumbered
F22 skills/babysit-loop/reference/cycle-shape.md: preset rule stated presently
F23 skills/babysit-loop/reference/promotion-evidence-resolution.md: phase note becomes current rule
F24 skills/babysit-loop/reference/telemetry-upsert.md: marker and read-back unnumbered
F25 skills/babysit-prs/reference/freshness.md: behind-base heading unnumbered
F26 skills/babysit-prs/scripts/tests/guard_contract.py: claim strings edited, markdown regenerated
F27 skills/babysit-prs/reference/independent-resolution.md: structured-marker rule drops issue
F28 skills/babysit-prs/reference/runbook-cycle.md: displacement rule drops tracked fix
F29 skills/babysit-prs/reference/safety.md: false-report incident sentence removed
F30 skills/babysit-prs/reference/safety.md: review race stated generically
F31 skills/babysit-prs/reference/safety.md: extra-bot-logins limitation stated presently
F32 skills/babysit-prs/reference/safety.md: settle-pair consequence restated
F33 skills/babysit-prs/reference/safety.md: tier criteria drop issue number
F34 skills/babysit-prs/reference/safety.md: tracked-fix sentence removed
F35 skills/babysit-prs/reference/safety.md: classifier-denial rule stated presently
F36 skills/babysit-prs/reference/safety.md: reachability prerequisite without ticket adjudication
F37 skills/babysit-prs/reference/safety.md: never-do tier bullet stated presently
F38 skills/babysit-prs/reference/safety.md: enabled-path intro stated presently
F39 skills/babysit-prs/reference/stuck-checks.md: misdiagnosis confession removed
F40 skills/babysit-prs/SKILL.md: gotchas restated as present rules
F41 skills/pull-request/SKILL.md: gotchas intro and verification bullet rewritten
F42 skills/pull-request/SKILL.md: monitor checklists at normal register
F43 skills/pull-request/reference/monitor.md: autonomy statement at normal volume
F44 skills/pull-request/reference/monitor.md: merge-forward rule without narration
F45 skills/pull-request/reference/monitor.md: workflow gate without trait claims
F46 skills/pull-request/reference/monitor.md: observed-failure sentence removed
F47 skills/pull-request/reference/monitor.md: loop fallback stated currently
F48 skills/pull-request/reference/readiness.md: pagination rule made portable
F49 skills/pull-request/reference/readiness.md: gate incident sentence removed
F50 skills/pull-request/reference/readiness.md: anti-patterns become present recap
F51 skills/pull-request/reference/create.md: pre-create gate drops change markers
F52 skills/pull-request/reference/create.md: attribution comment drops changelog phrasing
F53 skills/babysit-prs/reference/cadence.md: fresh-session rule stated presently
F54 skills/babysit-prs/reference/safety.md: readiness terminology sentence restated
F55 skills/babysit-prs/reference/safety.md: denied-gate heading drops now
F56 skills/babysit-prs/reference/independent-resolution.md: callers list drops today
F57 skills/babysit-prs/reference/orchestration.md: worker messaging rule stated positively
F58 skills/commit/SKILL.md: root-substitution rule stated presently
F59 skills/commit/SKILL.md: model placeholder example unpinned
F60 skills/commit/reference/exec-bit.md: advisory-prose comparison sentence removed
F61 skills/worktree/SKILL.md: hook registration note without edit history
F62 skills/worktree/SKILL.md: unset-root rule stated presently
F63 skills/worktree/SKILL.md: reap-record class defined by mechanism
F64 skills/worktree/context/audit.md: orphan-record mechanism without anecdote
F65 skills/worktree/context/cleanup.md: record-reap rule without anecdote
F66 skills/setup/SKILL.md: gotchas session-log intro removed
F67 skills/babysit-loop/SKILL.md: description drops embedded protocol
F68 skills/babysit-prs/SKILL.md: description names intent categories
F69 skills/setup/SKILL.md: description tightened to intent categories
F70 skills/babysit-prs/reference/freshness.md: stale-base gate made portable
F71 skills/pull-request/reference/merge.md: stale-base guard made portable
setup-lane T2 skills/setup/SKILL.md: bespoke-probe justification sentence removed

Skipped by lead: F72 F73 F74 F75 F76 F77 F78 F79 F80 F81
Not applied: none

Also: skills/babysit-prs/scripts/tests/test_skill_contract.py asserts the
replacement prose for F2, F23, F35, F36, and F38 instead of the removed
markers; no behavior assertion changed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
origin/main now carries a different session-flow 0.34.21, so the bump
that 221e8bd introduced moves to 0.34.22 (manifest version and the
changelog heading). Findings F1 to F25 and the setup-lane items
(setup-T4 site 1, setup-F11) are in 221e8bd; skipped by lead: F26 to
F36; not applied: none.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… (0.20.10)

A dropped single-quoted trigger phrase with no sibling host now WARNs,
naming each phrase and asking the reviewer to confirm the description
still names the intent it carried or to restore it, instead of FAILing
the run. The bundled prompt-audit guide's Group 2 "trigger-case
enumeration" fix replaces near-synonym trigger lists with named intent
categories, and a hard failure on every dropped phrase blocked that fix
fleet-wide (record follow-up F5).

scripts/check-skill.sh: check 3 err -> warn; header and inline comments
  state the advisory contract
scripts/check-skill.test.sh: cases 5, 5c, 8, 10, 11 assert a zero exit
  with the warning text; 5b (sibling move) unchanged
skills/check/SKILL.md, README.md: purpose, WARN list, and gotchas state
  the advisory contract
CHANGELOG.md, plugin.json: 0.20.10

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…5.5)

F1-F7 audit-answers, design-handoff, design, devils-advocate, interview, plan, prd SKILL.md: already applied on branch
F8 interview/context/gotchas.md: dropped minute-count incident measurement
F9 interview/context/gotchas.md: dropped wall-time percentage measurement
F10 interview/context/loop.md: round-boundary rule without incident narration
F11 interview/SKILL.md: pointer no longer promises measurement
F12 questionnaire/SKILL.md: hand-off rule without now-that framing
F13 prd/SKILL.md, prd/evals/evals.json: route name is /planning:interview
F14 draft-goal-condition/SKILL.md: dated workflow-row verification record
F15 interview/context/loop.md: dated unattended-detection verification record
F16 wayfind/SKILL.md, wayfind/evals/evals.json: unattended condition declared, never sniffed
F17 draft-goal-condition/SKILL.md: dated routines research-preview label
F18 wayfind/context/tracker-mechanics.md: dated gh flag-shape verification
F19 interview/SKILL.md: handoff on signal, not self-estimate
F20 interview/SKILL.md: outgrew-session cue without context-filling
F21 interview/context/loop.md: handoff bullet fires on signal
F22 interview/templates/checklist.md: persist note without overflow cue
F23 draft-goal-condition/SKILL.md: trigger phrases collapsed to intents
F24 devils-advocate/SKILL.md: trigger phrases collapsed to intents
F25 setup/SKILL.md: migration bullet without retirement justification
F26 plan/SKILL.md: dropped unresolvable lane citation
F27 interview/context/loop.md: free-text flag without changelog aside
F28 interview/context/loop.md: capture rule scoped per mode
F29 plan/SKILL.md: Step 3 gotcha carries one instruction
F35 plan/SKILL.md: karpathy priming replaced by one sentence
L1 setup/SKILL.md: deferred-backend check states the reason

Skipped by lead: F30, F31, F32, F33, F34, F36.

Not applied: none.

Consequential edits: interview/SKILL.md Step 4 renamed its pointer from
"context-pressure-flush discipline" to "handoff discipline" so the reference
F19 emptied does not dangle; tests/interview-defenses.test.sh refreshed the
four section digests covering the sections F11, F15, F19, F27, and F28
changed (Stance, Step 4, open-question register, Unattended path), with the
pinned defenses re-read and unchanged. L1 was applied at the check flow's
step 3 ("vault_backend"), the only deferred-backend step in this file, with
its numbering kept.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…1 (0.16.2)

F1 skills/implement/SKILL.md: replacement already present, unchanged
F2 skills/implement/SKILL.md: drop plugin-split relative phrasing
F3 skills/implement/context/gotchas.md: heading reads Failure patterns
F4 skills/implement/SKILL.md: state scope discipline, drop karpathy
F5 skills/implement/SKILL.md: research before declaring impossible
F6 skills/implement/SKILL.md: lower caps emphasis, four sites
F7 skills/implement-dispatch/SKILL.md: eight MUST markers plain prose
F8 skills/implement-dispatch/SKILL.md: resident default, no context polling
F9 skills/implement-dispatch/SKILL.md: drop convention-registry trigger aside
F10 skills/implement/SKILL.md: keep task granularity, drop mechanics
F11 skills/implement/context/gotchas.md and skills/implement/SKILL.md: remove one-line reminders block
F12 skills/implement/context/gotchas.md and skills/implement/SKILL.md: route new lessons to memory slice
F13 skills/implement/SKILL.md: self-review adds two items
F14 skills/implement-dispatch/SKILL.md: keep working while wave runs
L1 skills/implement/context/bugfix.md and skills/implement/context/refactor.md: drop absent dotnet skill pointers
Eval: skills/implement/evals/evals.json case 4 asserts the new wording
Skipped by lead: F15, F16, F17, F18, F19, F20
not-applied: none (F1 evidence absent because the replacement was already in place)
Setup lane: no entry for implementation

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…13.13)

F1 skills/check/SKILL.md: description now names Go
F2 skills/check/context/dotnet.md: dropped uninstalled dotnet-msbuild skill references
F3 skills/check/SKILL.md, skills/lint/SKILL.md: removed "as before" migration phrasing
F4 skills/check/SKILL.md, skills/lint/SKILL.md: skip cells lose word-count ceiling
F5 skills/check/SKILL.md: dropped settled-not-parked design preface
F6 skills/check/SKILL.md: atomicity gotcha drops maintainer note
F7 skills/lint/SKILL.md: dropped sibling-plugin precedent sentence
F8 skills/check/SKILL.md: convention example cited by URL
F9 skills/check/context/powershell.md: merged duplicate -notlike bullets
F10 skills/check/context/python.md: dropped encoding authoring rule
F11 skills/check/context/typescript.md: dropped bare-npx spawn note
F12 skills/check/context/bash.md: dropped CI-failure diagnosis coaching

Skipped by lead: F13, F14, F15, F16, F17, F18.
Not applied: none.
Setup lane: no entry for toolchain.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
F1 skills/quality-gate/context/close-out.md: rung-1 incident narrative removed
F2 skills/code-review, security-review, quality-gate: eight archaeology sites cleared
F3 skills/code-review, security-review: cross-repository PR number dropped
F4 skills/security-review/SKILL.md: zizmor deferral stated once
F5 skills/fanout/context/fix-pass-mode.md: legacy record keyed on shape
F6 skills/fanout/SKILL.md: coverage clause unpins the model
F7 skills/code-review, security-review: V2 heading marker dropped
F8 skills/fanout/context/findings-normalization.md: stage headings drop model tiers
F9 skills/security-review/SKILL.md: criteria block rewritten
F10 skills/quality-gate/context/spec.md: as-of-this-writing phrasing removed
F11 skills/fanout/context/findings-normalization.md: model assignment stated by role
F12 skills/quality-gate/SKILL.md: allowed-tools grants match body commands
F13 skills/fanout: roster count read from leaf-roster.md
F14 skills/fanout/SKILL.md: description names the intent category
F15 agents/ci-log-auditor.md: report length as audience framing
setup-lane T2 skills/setup/SKILL.md: stays-bespoke justification sentence deleted
Evals: fanout cases 28, 32, 33, 35 describe the legacy record as digest-less

Skipped by lead: F16, F17, F18, F19, F20, F21
Not applied: none

Landed by the lead from the applier's on-disk edit set after the applier
hit a usage limit mid-gate; every gate re-run green by the lead.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…(0.6.4)

F1 skills/confirm/SKILL.md: /verify invocability stated as current rule
F2 skills/confirm/context/refactor.md: diff base named by rule
F3 skills/measure/SKILL.md: plan-artifact tiering as the only rule
F4 skills/measure/context/metrics.md: git show and count as separate calls
F5 skills/measure/context/metrics.md: every count from a command
F7 skills/setup/SKILL.md: deferred-backend step without roadmap promise
F10, L1 skills/measure/context/metrics.md, performance.md: absent dotnet and cloudflare skill sections removed
setup-lane F7 skills/setup/SKILL.md: maintainer HTML comment removed
Evals: confirm case 9 asserts the reworded invocability rule

Skipped by lead: F6 (superseded by L1), F8, F9
Not applied: none

Landed by the lead from the applier's on-disk edit set after the applier
hit a usage limit mid-gate; every gate re-run green by the lead.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ADR for the prompt-audit sweep

Record: Results by wave rows for session-flow, source-control, work-items,
claude-memory, planning, implementation, toolchain, review, and
verification with their commits, applied and withheld ids, and the
check-3 phrases each deliberately dropped; the skill-quality check-3
commit in the cross-cutting table; follow-up F19 (plugin-quality's
hand-computed context zone); F6 and F10 additions from the wave-3b
audits; the method note that subagents ran on Claude Opus 5 once the
Fable model limit refused subagent turns.

ADR 0028 supersedes ADR 0004 D-1 and D-3 for the skill-body audit lane
and the ADR 0006 promotion gate (as retained by ADR 0007) for applied
prompt-audit findings; leaves ADR 0005 and 0008 accepted and names the
operator's PR-time call on them.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…7.4)

F1 debug/SKILL.md: pressure line replaced with effort statement
F2 debug/SKILL.md: priming pass and bullets removed
F5 debug/SKILL.md: inert shell frontmatter key removed
F6 debug/SKILL.md: description trigger list generalized to intents
F7 debug/SKILL.md: duplicated load-bearing artifact paragraph removed
F8 debug/SKILL.md: duplicated hypothesise gate sentence removed
F9 debug/SKILL.md: hypothesis-grounding paragraph stated once
F10 debug/SKILL.md: discovery glob cost paragraph removed
F11 debug/SKILL.md: Boy Scout sentence replaced by focused-diff rule
F12 debug/templates/checklist.md: Phase 6 skip criterion corrected
F14 debug/reference/ecosystem-debugging.md and templates/checklist.md: em dashes replaced
Skipped by lead: F3, F4, F13
Not applied: none

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…19.4)

F1 research/SKILL.md: disciplines stated at normal volume
F2 research/SKILL.md: purpose drops thoroughness booster
F3 explore/SKILL.md: purpose drops read-more-code default
F4 explore/reference/ecosystem-discovery.md: seam replaces hardcoded ecosystem list
F5 agents/researcher.md, agents/intent-tracer.md: inherited pool described not enumerated
F6 agents/explorer.md, agents/researcher.md, agents/intent-tracer.md: nesting history becomes session allowance
F7 research-deep/SKILL.md: nesting history becomes session allowance
F8 explore/reference/dispatch.md, research/context/dispatch.md: payload failure stated present tense
F9 explore/reference/dispatch.md: ladder anecdote removed, rule kept
F10 explore/SKILL.md, explore/reference/dispatch.md, research/context/dispatch.md: migration-relative phrasing removed
F11 trace-intent/SKILL.md: code-shape exclusion states own reason
F12 trace-intent/context/artifact-shape.md: maintainer decision record deleted
F13 trace-intent/context/evidence-categories.md: provenance and future-auditor note deleted
F14 agents/explorer.md, agents/researcher.md, agents/intent-tracer.md: sibling-configuration paragraphs deleted
F15 agents/researcher.md, agents/intent-tracer.md: refused-Write rule carries own reason
F16 research/context/discipline.md, research/context/gotchas.md, research/SKILL.md: model-trait claims replaced by behavior
F17 research/context/discipline.md: Mandate restatements lowered to prose
F18 research/SKILL.md: duplicate small-task principle deleted
F19 explore/SKILL.md, research/SKILL.md: allowed-tools maintainer parenthetical deleted
F20 agents/explorer.md: summary length guidance made qualitative
F21 research-deep/SKILL.md: tier chosen from table not doubt
F22 setup/SKILL.md: skill enumerations now name trace-intent
F23 setup/SKILL.md: apply step stops restating gitbook constraint
L1 setup/SKILL.md: check step drops roadmap phrasing
setup-F7 setup/SKILL.md: maintainer HTML comment deleted
setup-F8 setup/SKILL.md: spawn-depth windows lose history narration

Skipped by the lead: F24, F25, F26 (all flag-only).
Not applied: none.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
F1 write/SKILL.md, context/template.md: corrected stale /bugs self-name
F2 scan/context/findings-report.md: severity-rubric pointer names holder
F3 scan/context/lenses.md, scan/SKILL.md: folded lens 5 into Step 1
F4 scan/context/verification-gate.md: gate requirement at normal volume
F5 write/SKILL.md, context/template.md: lowered caps emphasis six sites
F6 write/context/template.md: deleted negative-constraint reminders list
F7 write/SKILL.md: deleted body trigger-conditions section
F8 write/SKILL.md: deleted duplicate investigation-boundary bullet
F10 scan/SKILL.md: dropped the V1 version markers
F11 write/context/template.md, write/SKILL.md: deleted the worked example
F12 write/SKILL.md: consolidated description triggers into two intents
F13 write/SKILL.md, context/template.md, README.md: work-items hand-off

Skipped by the lead: F9, F14, F15, F16, F17.
Not applied: none.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
F1 write/context/organize.md, write/context/write.md: removed undefined config key references
F2 diagnose/context/loop.md: dropped Boy Scout cleanup invitation
F3 run-e2e/context/e2e.md: GIF recording follows recording key
F4 run-e2e/context/e2e.md: route missing CLI to user
F9 run-e2e/SKILL.md: dropped the /verify release history
F10 run-e2e/context/e2e-config.md: dropped preserves-current-behavior clause
F11 run-e2e/context/e2e.md, run-e2e/SKILL.md: consolidated disagreeing after-testing handoff
F12 run-e2e/SKILL.md, run-e2e/context/non-ui.md: dropped caps route restatements
F13 run-e2e/SKILL.md: semantic-locator gotcha stated positively
F14 run-e2e/context/e2e.md: dropped caps on two instructions
F15 audit/SKILL.md: dropped this-cycle and not-yet
F16 audit/SKILL.md: platform-skip gotcha states its boundary
F17 write/context/write.md: vertical-slice rule leads positive
F18 write/context/write.md: approval gate scoped to material
F19 write/context/write.md: refactor stays inside the slice
F20 write/context/organize.md: deleted hollow Current state section
F21 diagnose/context/loop.md: regression reason stated once only
F22 audit/SKILL.md: description triggers consolidated to intents
F23 run-e2e/SKILL.md: description triggers consolidated to intents
F24 write/SKILL.md: description triggers consolidated to intents
F27 diagnose/context/investigate.md, diagnose/context/loop.md, plan/SKILL.md, run-e2e/context/e2e.md, write/context/organize.md, write/context/write.md: deleted phantom marketplace skill references

Skipped by the lead: F5, F6, F7, F8, F25, F26, F28.
Not applied: none.

Evals: run-e2e case 1 drops the @latest install literal; diagnose case 2 lowercases ALL to all.

Applied from the 2026-09 prompt-audit against Claude Fable 5.1
(docs/specs/prompt-audit-skills-2026-09.md).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
….31.3)

F1 skills/setup/SKILL.md: toggle probe reads manifest defaults
setup-T4-site-2 skills/setup/SKILL.md: dropped hardcoded guard count
setup-T2 skills/setup/SKILL.md: removed bespoke-flow justification sentence
Skipped by lead: none.
Not applied: none.

Version renumbered to 0.31.3 rather than a 0.30.5 patch bump because origin/main
already carries guardrails 0.31.2 and the bump gate requires a strictly higher number.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
….13.2)

T1: use-your-skills, pick-for-the-problem, reason-dont-recite, sweep-all,
    mind-your-maxims, do-your-research, wait-what SKILL.md - removed
    maintainer-facing design and roadmap notes
T2: sweep-all/SKILL.md, reuse-or-replace/SKILL.md,
    sweep-all/reference/inheritance-preflight.md - collapsed rules restated
    several times per file
F1: sweep-all/SKILL.md - dropped the tracker issue number
F2: sweep-all/reference/batched-pass.md, reference/inheritance-preflight.md -
    kept verification record, dropped narration
F3: sweep-all/reference/batched-pass.md - states the current cap rule
F4: sweep-all/SKILL.md - description drops degrade-token protocol detail
F5: do-your-research-deep/SKILL.md - removed unbaselined model-tier routing
    clause (subsumed by F8's span)
F6: point-dont-copy/SKILL.md - threshold two without external figure
F7: sweep-all/reference/batched-pass.md - checkpoint attributed to one tier
F8: new context/fan-out.md, do-your-research-deep/SKILL.md,
    recheck-against-upstream-deep/SKILL.md - shared fan-out contract extracted
F9: do-your-research/SKILL.md, do-your-research-deep/SKILL.md - consolidated
    near-synonym trigger phrases
F10: setup/SKILL.md, setup/evals/evals.json - dropped pre-rename trigger
     phrases
F11: tighten-your-output/SKILL.md - added the readability-over-brevity guard

Skipped by the lead: T3, T4, T5, F12.
Not applied: none.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…9.7)

F1 reference/model-adaptation/fable-5-1.md: new Fable 5.1 adaptation chapter
F1 skills/fable-5/SKILL.md: route and describe the new chapter
F1 skills/fable-5/evals/evals.json: added case trigger-fable-5-1-adaptation-chapter
F2 skills/skill-authoring/reference/precompute-context.md: documented injection failure semantics
F3 skills/fable-5/context/communication.md: unbriefed-decision block in plain clauses
F3 skills/fable-5/SKILL.md: same three-clause decision format
F4 skills/fable-5/context/communication.md: kept search findings that explain the answer
F5 skills/fable-5/context/orchestration.md: dropped the numeric delegation floor
F5 skills/fable-5/SKILL.md: same delegation trigger without the floor
F6 skills/boris/SKILL.md: removed the refactored-form maintainer comment
F7 skills/boris/SKILL.md: removed the redundant when_to_use key
F8 skills/skill-authoring/SKILL.md: trigger synonyms became intent categories
F9 skills/skill-authoring/reference/precompute-context.md: dropped changelog-version archaeology
F10 skills/skill-authoring/reference/verification-loops-in-skills.md: dropped pre-v2.1.216 history
F11 skills/update/SKILL.md: removed the do-not-auto-fire sentence
F12 skills/skill-authoring/reference/precompute-context.md: dropped the re-render version pin

Skipped by the lead: F13, F14, F15, F16.
Not applied: none.

F1 applied as apply-modified: the live Prompting Claude Fable 5.1 page was fetched
2026-09-03 and every section of the new chapter re-verified against it. The two
claims that page does not carry, retaining instructed verification and the
forced tool_choice and thinking-block facts, are kept with the bundled
claude-api migration reference marker the lead specified.

Setup lane: no setup skill in this plugin.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
….41.12)

F1 audit-install-state/reference/scope-and-handoffs.md: deleted stale zero-byte repo example
F2 plugins/context/scope-semantics.md: cite PROJECT_ROOT resolution, not lines
F3 audit-install-state/SKILL.md: four incident narratives become stated mechanisms
F4 audit-install-state/reference/evidence-discipline.md: eight source-audit retellings become present rules
F5 audit-install-state/reference/name-schemes.md: port-lock trap stated structurally, not narrated
F6 audit-install-state/reference/scope-and-handoffs.md: separation and calibration rules lose archaeology
F7 audit-performance/SKILL.md: allowlist explains purpose, not newness
F8 audit-skill-visibility/SKILL.md: four measured counts become stated mechanisms
F9 inventory/SKILL.md and reference/extraction.md: failure shapes stated in present
F10 changelog/SKILL.md: Phase 4 states goal, not steps
F11 changelog/context/classification-rubric.md: pinned model name becomes a placeholder
F12 known-issues/context/action-search.md: gh auth prohibition reframed positively
F13 known-issues/context/action-quality.md: deleted the unintegrated-sources maintainer list
F14 lanes SKILL/config/refresh/restart-consumer, morning-brief/SKILL.md: every tracker reference removed
F15 lanes/SKILL.md and context/config.md: prompt storage stated in present
F16 lanes/SKILL.md: telemetry-upsert summary points at --help
F17 lanes/SKILL.md and context/restart-consumer.md: two migration-relative sentences made current
F18 lanes/context/restart-consumer.md: dropped non-shipping path citation and history
F19 observability/SKILL.md: steps 2-5 name their references
F20 observability/context/operator-setup-collector-daemon.md: duplicate-mechanism prohibition reframed with reason
F21 observability/context/data-sources.md: three roadmap notes become current boundaries
F22 observability collector-daemon and retention: dropped provisioning issue links
F23 plugins/context/converge.md and sync.md: dropped brief-decision citations, kept rules
F24 plugins/context/gotchas.md: dropped incident tallies and issue number
F25 plugins/context/sync.md: three migration-relative diffs made current

Skipped by lead: F26, F27, F28, F29, F30, F31, F32, F33, F34, F35, F36, F37, F38
Not applied: none
Setup lane: no claude-ops items to apply (T5, T6, T9 all withheld)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
F1 skills/principles/SKILL.md: description drops three same-intent phrases

Skipped by lead: none
Not applied: none
Applied by the lead directly (one hunk).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…5.1 (0.7.26)

F1 skills/setup/reference/legacy-statusline-detect.md: drop wrong shim version boundary
F2 reference/reader-contract.md: replace TODO tracker pointer prose
F3 reference/reader-contract.md: defer consumer counts to registry
F6 skills/setup/SKILL.md: fix lowercase sentence start
setup-T2 skills/setup/SKILL.md and both synced references: delete ADR retirement-schema justification sentence
setup-T3 skills/setup/SKILL.md and unwrap-before-compose.md: state failure mode, not incident
setup-T7 skills/setup/SKILL.md and unwrap-before-compose.md: lowercase all-caps emphasis words
Skipped by lead: F4, F5.
Not applied: none.

The two synced reference files were edited at their registered canonical source under
plugins/context-guard and re-synced, per scripts/cross-plugin-source-registry.txt.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… (0.40.31)

F1 audit-instructions/reference/criteria.md: Authority axis admits HOUSE value
F2 audit-instructions/reference/conflict-criteria.md: dropped issue numbers and rewrite narration
F3 audit-instructions/reference/criteria.md: short-orientation fence loses issue citation
F4 audit/reference/audit-checklist.md: dropped stale listing-budget measurement
F5 audit-permission-grants SKILL.md and reference/criteria.md: scope-filter rationale loses trackers
F6 audit-pass/reference/run-state-and-resumability.md: lease bounds use declared thresholds
F7 audit-pass/reference/doctor-handoff.md: skillOverrides stated as documented key
F8 setup/SKILL.md and evals/evals.json: prerequisites name every calling script
F9 audit-instructions/reference/criteria.md: model scope widened to fable-5-1
F10 audit-pass SKILL.md and eight reference files: removed prior-version defect narration
F11 audit-instructions/reference/criteria.md: dropped scope history and ADR
F12 audit-instructions/reference/conflict-criteria.md: dropped prior-edition gap narration
F13 audit-instructions/SKILL.md: sibling caveat loses drift history
F14 audit-instructions, audit-pass, audit-prompting-postures SKILL.md: caps downgraded to prose
F15 audit-instructions/SKILL.md: description triggers become intent categories
F16 audit-permission-state/SKILL.md: description triggers become intent categories
F17 audit-instructions/context/persist-findings.md: dropped as-before and older phrasing
F18 persist-findings.md and reference/criteria.md: gate cited as conditional warning
F19 audit-instructions/context/phase-a-inventory.md: example no longer narrates its motive
F20 audit SKILL.md, procedures.md, validation-categories.md, required-permissions.md: dropped Phase 1.0 before-narration
F21 audit/SKILL.md: removed the observed-false-negative anecdote
F22 audit-automation-gaps/SKILL.md: principles stated as principles
F23 audit-automation-gaps/SKILL.md: delegation guidance no longer contradicts itself
F24 audit-permission-grants/reference/criteria.md: dropped rename rationale and erratum
F25 audit-permission-state SKILL.md and reference/criteria.md: gotchas stated as failure modes
F26 audit-prompting-postures/SKILL.md: removed the inventory-defect anecdote
F27 audit-prompting-postures/SKILL.md: removed the test-suite assertion restatement
F28 draft-auto-mode-rules/SKILL.md: dropped experiment provenance and design record
F29 unhobble/SKILL.md: philosophy rubric cited by URL

Skipped by the lead: F30, F31, F32, F33 (withheld as flags).
Not applied: none. The setup lane records no claude-config item beyond withheld T8.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
F1 skills/reduce/SKILL.md: gotchas intro drops failure-history framing
F2 skills/reduce/SKILL.md: unverified-scan rule without the incident

Skipped by lead: F3 (fleet gather-block wording), F4 (house style)
Not applied: none
Applied by the lead directly (two hunks).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ble 5.1 (0.3.2)

F1 skills/curate-language/SKILL.md, README.md: planning relationship stated currently
F2 skills/curate-language/SKILL.md: ladder deferred to the contract
F3 skills/curate-language/SKILL.md: unreachable fallback paragraph removed

Skipped by lead: F4 (house style)
Not applied: none
Applied by the lead directly.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… (0.7.32)

F1 reference/reader-contract.md: drop issue-number provenance pointer
F2 reference/reader-contract.md: drop three-release hysteresis chronology
F4 reference/reader-contract.md: drop withdrawn-citation editor note
F5 reference/reader-contract.md: restate floor as four-part record
F6 reference/reader-contract.md: merge auto-compaction threshold paragraphs
F7 reference/reader-contract.md: delete percentage-key retirement tripwire
F8 reference/reader-contract.md: drop roadmap apparatus around trigger rule
F9 skills/setup/SKILL.md: state stale-snapshot FAIL branch once
F10 skills/setup/SKILL.md: cite hook-config convention by URL
F11 both synced references: drop sync-script and registry paths
F12 reader-contract.md and skills/setup/SKILL.md: drop v1-schema framing
F13 reference/reader-contract.md: drop duplicated cloud measurement sentence
F14 reference/reader-contract.md: lowercase all-caps emphasis words
setup-T2 skills/setup/SKILL.md: delete ADR retirement-schema justification
setup-T3 skills/setup/SKILL.md, statusline-edit.md: failure mode, not incident
setup-T7 skills/setup/SKILL.md: lowercase all-caps emphasis words
setup-F19 skills/setup/SKILL.md: drop owner-approval parenthetical
Skipped by lead: F15, F16, F17.
Not applied: none.

Already applied by the rate-limit-guard applier in 0763a8c and not repeated
here: F3, and the setup-lane T2, T3, and T7 hunks inside the two synced
reference files.

F7's tripwire is carried into this release's CHANGELOG entry, per the lead's
apply-modified decision. The two synced reference files were edited at their
canonical source under plugins/context-guard and re-synced, so the
rate-limit-guard copies are in this commit's pathspec.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
107 conflicts. CHANGELOG.md (45): both sides kept, the branch's renumbered entries above main's newer ones so every file stays newest-first. plugin.json (45): the branch's higher version. Skill bodies (17): the branch's prompt-audit rewrite is the base and main's later change lands on top: the references/ to reference/ rename (kindle-dedrm, plugin-quality) applied through the branch's edits; machine-health's new argument-hint kept; code-tidying's reworked dissolve-comments gather block and trimmed gotchas taken from main; session-flow's shape-2 handoff text taken from main with the branch's present-tense path-form wording; visualization's code-shape sketches and product-UI guidance added to the branch's description and section; skill-quality's trimmed description taken from main with "advisory" restored on check 3; the planning Stance digest recomputed for the merged section.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GjdFagSG1CvQop76ZxM28k
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 5, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-05T19:10:35.063846Z bbb2249 PR opened
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@claude

claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 8m 58s —— View job


Code review in progress

Running /review:code-review against this PR (100 changed files, docs-only prompt-audit sweep).

  • Gather context (PR body, changed files, skip-gate check)
  • Obtain a scoped diff for the changed files (shallow clone required a workaround; see note below)
  • Review .claude/, AGENTS.md, ADR 0028, and the record doc
  • Review plugin-by-plugin hunks (actionlint, adhd, ai-briefing, ai-slop, architecture, autonomy, bugs, claude-config — this batch)
  • Adversarially verify candidate findings
  • Post inline comments and final summary

Note on tooling: the checkout in this job is shallow and git merge-base origin/main HEAD fails (no common ancestor in fetched history); gh pr diff fails server-side (too_large, the full compare exceeds GitHub's 300-file diff cap). Worked around this by scoping git diff to the closest available common ancestor commit, restricted to exactly the 100 paths GitHub reports as changed for this PR (verified count matches).

Four parallel review passes are running now, split by content: (1) root docs/ADR/record, (2) actionlint→architecture, (3) autonomy (safety-critical guardrail docs), (4) bugs + claude-config audit skills.

@claude

claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

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


Security review complete

  • Gather context (PR body, changed files)
  • Invoke /review:security-review skill and follow its procedure
  • Analyze diff against origin/main for security issues
  • Post findings

No security-relevant surface found. This PR is a fleet-wide documentation/prompt sweep (skill bodies, context/reference files, agent definitions, CHANGELOGs, and plugin.json version bumps across 74 plugins). I reviewed the diff for authorization/access-control gaps, injection surfaces (command, SQL, path, template), and unsafe credential/token/secret handling — none apply here.

The only non-markdown/non-metadata changes are comment-only and test-assertion edits:

  • plugins/skill-quality/scripts/check-skill.sh — check 3 (dropped trigger-phrase detection) changed from a hard failure (err) to an advisory warning (warn); this is a documented, intentional behavior change (record F5), not a logic flaw. Matching test updates in check-skill.test.sh.
  • plugins/docs-hygiene/skills/audit-noise/scripts/emit-findings.sh and detect.test.sh — comment/sed-pattern updates tracking the check-3 change above; the pre-existing eval "git status --porcelain ... | $skill_grep" pattern is unchanged by this PR and operates only on repo-authored SKILL.md content, not attacker-controlled input.
  • plugins/source-control/skills/babysit-prs/scripts/tests/{guard_contract.py,test_skill_contract.py} and plugins/planning/tests/interview-defenses.test.sh — prose/assertion updates (removing incident/issue-number narration, updating byte-pin hashes) with no logic change.
  • .claude/settings.json — a worktree.baseRef config key introduced by origin/main after this branch diverged is dropped by the merge; it's a local dev-worktree setting, not a permission or hook change.

GitHub Actions/workflow hardening is out of scope for this lane (zizmor's advisory lane per the skill's own instructions); I did not see any workflow file changes in this diff regardless.

No findings to report.

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Last security-reviewed head: bbb22490dd8393d7d5686e0ecd9bcfca34418813. On the next push, the relevance gate compares only the commits since this SHA; delete this comment to force a full re-review.

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude has reviewed this PR 1 time. The lane skips further automatic reviews after 5; deleting this comment resets the count.

@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: bbb22490dd

ℹ️ 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/code-tidying/skills/dissolve-comments/SKILL.md
Comment thread plugins/ai-briefing/skills/generate/reference/slide-generation.md Outdated
Comment thread plugins/machine-health/skills/audit/scripts/linux/NOT_IMPLEMENTED.md Outdated
kyle-sexton and others added 4 commits September 5, 2026 15:27
…nomy's relative citations

CI lint: the mechanical merge resolution joined the branch's last CHANGELOG entry to main's next heading with no blank line in 45 files (MD022, MD032); each heading now has its blank line. CI test-linux: scripts/validate-plugin-contracts.mjs forbids the autonomy plugin naming the org or a vendor, and the audit applier had converted six convention and sibling citations in reference/guardrails.md, reference/prerequisite-resolution.md, and skills/setup/context/prerequisite-resolution-slice.md to marketplace URLs; they return to the relative form. The record's follow-up F8 notes the revert, so those sites stay under that follow-up.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GjdFagSG1CvQop76ZxM28k
…seRef rule

Codex on PR #3770: code-tidying dissolve-comments still ran `git branch` in its pre-computed block after the audit moved that read into a body Bash call (the block, taken from main in the merge, tripped the #1619 composition check), so the pre-compute line goes; ai-briefing's slide-generation.md pointed at `references/audience-defaults.md` and machine-health's two porting stubs at `references/windows/check-catalog.md`, both directories that do not exist, so all three now name `reference/`.

New path-scoped rule `.claude/rules/worktree-base-ref.md`, indexed in AGENTS.md: this repository sets no `worktree.baseRef` (withdrawn in topic-docs convention 3.1.0 so worktrees branch from the remote default branch), and a review comment that reads the removal as a merge regression is not grounds to restore it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GjdFagSG1CvQop76ZxM28k
…reword a prose line the portability lint reads as GNU date

CI on d2ca729: docs/CATALOG.md was stale against the merged plugin descriptions (regenerated with scripts/generate-catalog.mjs); scripts/skill-count-claim-exemptions.txt still exempted "the other three skills still run" in claude-config's setup skill, a sentence the audit reworded, and the gate fails on a stale row; and scripts/check-shell-portability.sh matched "commit date falls after the requested `--since`" in improvement's hotspots.md as a `date -d` invocation, so the line now says "is dated after".

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GjdFagSG1CvQop76ZxM28k
…ted sed pattern

CI shellcheck (SC2016) on the sed pattern the audit-noise detect test uses to lift the grep segment out of the skill's gather bullet: the pattern carried literal backticks inside single quotes. The anchor on ` | grep ... | head` is enough on its own, so the pattern drops the backtick matches; it still extracts `grep -E '\.md"?$'` from the current SKILL.md line.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GjdFagSG1CvQop76ZxM28k
@kyle-sexton
kyle-sexton merged commit f62c1b3 into main Sep 5, 2026
14 checks passed
@kyle-sexton
kyle-sexton deleted the docs/prompt-audit-skills branch September 5, 2026 21:30
@claude claude Bot mentioned this pull request Sep 5, 2026
kyle-sexton pushed a commit that referenced this pull request Sep 5, 2026
…e sibling bumps

Main's fleet-wide prompt audit (#3770) rewrote descriptions and changelog text
across the plugins this branch also touches, and #3771/#3773 moved their
versions past the numbers taken here.

Every conflict was in a version line, a changelog heading, or prose the audit
rewrote. The manifests take main's descriptions whole, since this branch
changed only their version fields, and each version is renumbered strictly
above main's: claude-ops 0.42.10, mutation-testing 0.3.16, verification 0.6.5.
The changelogs keep both sides in order, with this branch's entry under its new
number.

The testing plugin's change is dropped rather than merged. Its one edit added a
presence gate and a code-metrics fallback to the marketplace-skill section in
`write/context/organize.md`, and the audit deleted that whole section as naming
plugins no installed marketplace carries. There is nothing left to gate, so
testing returns to main's content, version, and changelog exactly. The
cross-plugin pointer this branch adds now lives only in `verification:measure`
and `mutation-testing:principles`.

The `verification:measure` metrics bullet takes both sides: main's worktree-safe
`git show` sequence stays as the manual fallback, under this branch's
`/code-metrics:audit-<measure>` pointer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DVwWe4VVyx57dQ1AL7m35p
kyle-sexton added a commit that referenced this pull request Sep 5, 2026
… predicate per extension (#3762)

Closes #3751

## Summary

The guardrails PostToolUse `Write|Edit` row spawned its dispatcher,
loaded the library and parsed the payload on every write, and all three
verifiers early-exited unless the file carried one of five extensions.
The row now spawns only for those files. Guardrails 0.32.4 to 0.32.5.

## Fix

- `hooks.json`: the `Write|Edit` PostToolUse row carries one handler per
extension the verifiers accept (`.md`, `.sh`, `.bash`, `.ps1`, `.psm1`),
each with an `if: Edit(*.<ext>)` predicate. The `if` field holds exactly
one rule, so one row per extension is the documented shape, the same one
the six formatter plugins already use. Command, timeout and
`statusMessage` are identical across rows.
- `run-guards.test.sh`: pins the predicate set to the union of the three
verifiers' own `case "$FILE"` gates, read from their source, in both
directions. An extension added to a gate without an `if` row, or an `if`
row with no gate, fails the suite.
- README budget entry, CHANGELOG entry, patch bump.

**The issue's other two rows take no predicate, and the README entry
records why.** `typos-format` scans every file type including
extensionless ones, and its README already records the absence of an
extension gate as deliberate; `eol-normalizer` resolves every path
through the consuming repository's `.gitattributes` with no extension
list. Their cost on a `.txt` is work they are meant to do, not a spawn
that early-exits, so the issue's "nothing to say about" premise holds
only for the trio.

## Verification

- `scripts/affected-tests.sh --run`: `run-guards.test.sh` PASS=77
FAIL=0. Against the un-gated `hooks.json` the new cases fail (5 FAILs,
checked by stashing the file), so the pin is live.
- Measured on this host, N = 15, spawn floor 3.2 ms, real file text in
every payload:

| Per tool call | before | after |
|---|---|---|
| PostToolUse `Write` of an in-repo `.txt` | 86.1 ms (26.9 S) | 0
processes |
| PostToolUse `Write` of an in-repo `.md` | 95.8 ms (29.9 S) | unchanged
|

The after figure is not a faster process: the predicate is evaluated
before the spawn ("The hook command only runs if the tool call matches
the pattern", hooks reference `if` field, raw `hooks.md` fetched
2026-09-05). The issue's acceptance asked for a PATH-shim spawn counter
per hook; a shell suite cannot observe Claude Code's pre-spawn
evaluation, so the pin is on the predicate set instead, and the no-spawn
rests on the quoted documented semantics and the fleet's existing
measured use of the same shape.
- `scripts/check-changelog-parity.sh --check-bump origin/main`,
`scripts/check-killswitch-hoist.sh`, `scripts/check-hook-exec-form.sh`,
`scripts/check-hook-userconfig-argv.sh`, `scripts/validate-plugins.sh`:
all pass. shellcheck, shfmt, markdownlint, typos clean on the changed
files.

### Renumbered 0.32.4 to 0.32.5

#3770 landed a fleet-wide prompt audit that bumped 64 plugins, taking
guardrails 0.32.4 for itself. `main` was merged in, this change
renumbered above it, and the CHANGELOG conflict resolved so #3770's
released 0.32.4 entry stays intact with this change's entry above it.
The README budget heading moved with it. All gates re-run on the merged
head.

## Related

- Refs #3685 (the trio's remaining cost once gated), #3749 and #3750
(where the audit figures were taken), #3770 (took 0.32.4).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_019DaWEB8Daq1xAXy2Xj1Pme

---
_Generated by [Claude
Code](https://claude.ai/code/session_019DaWEB8Daq1xAXy2Xj1Pme)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
kyle-sexton added a commit that referenced this pull request Sep 5, 2026
… fills (#3765)

Closes #3755

## Summary

The per-session observability report's "Rewrote" block reads a `changed`
boolean that the reference sink already copies from `data.changed`, and
no producer sent it, so the block rendered the no-data line in every
report. The eight rewriting formatters now send it.

## Fix

- **`lib/rewrite-guard.sh`** (synced into its six carriers): the take
records a byte verdict in `HOOK_REWRITE_CHANGED`: `true` when the file
differs from the snapshot, `false` when identical or when no rewrite was
attempted (begin never ran), and empty when begin could not snapshot.
The first take's verdict survives a later take, so a producer that emits
after its take still reads it. Five new cases in
`lib/rewrite-guard.test.sh` (22/22).
- **Six carriers** (`bash-format`, `biome-format`, `eol-normalizer`,
`go-format`, `powershell-format`, `ruff-format`): `build_data_json` adds
`changed` from the verdict and omits the key when it is unknown, never
guessing. Every arm that emitted telemetry before taking the disclosure
(biome, go and ruff clean arms; go, powershell and ruff findings and
tool-break arms) now takes first, with stdout unchanged. `bash-format`
takes unconditionally before its emit so a run where shfmt never ran (no
`.editorconfig` opt-in) reports `false` rather than nothing.
- **`markdown-format`** derives it from the same "Attempted: N fixes"
count line that drives its user-channel disclosure; **`typos-format`**
from whether `applied` is non-empty, and its clean arm sends `false`.
Both omit the key on skip arms where the tool never ran.
- **Eight `docs/conventions/hook-telemetry/data/*.schema.json`** gain
the optional `changed` boolean (additive rule).
- **`claude-ops`**: the observability context now renders a row per
`changed == true` envelope, `_nothing rewritten_` when rows carry the
key and every value is false, and the no-data line only when no row
carries it; the suite fixture carries one `changed: true` and one
`changed: false` row, and the case that asserted the block empty now
asserts the file is named (60/60).
- Nine patch bumps with CHANGELOG entries: bash-format 0.7.37,
biome-format 0.6.35, eol-normalizer 0.6.36, go-format 0.3.39,
powershell-format 0.7.38, ruff-format 0.6.36, markdown-format 0.11.45,
typos-format 0.6.43, claude-ops 0.42.10.

`actionlint` is named in the issue but does not rewrite files, so it is
left alone.

## Fix (2): a description regression on `main`

Merging `main` after #3770 surfaced a defect that is not this change's.
#3770 reverted `plugins/claude-ops/.claude-plugin/plugin.json`'s
`description` to a pre-#3750 state, dropping 730 characters: the
per-session hook event log, the setup action's log-root and
self-ignoring-guard wording, the sink's per-session routing, and
`audit-performance`'s Windows kernel-object census. Sentence-level
comparison of the pre-#3770 and post-#3770 descriptions shows #3770
contributed **no new wording** to this field, so it is a clobber rather
than an edit.

The conflict resolution restores the full text and regenerates
`docs/CATALOG.md` from it, since the catalog is generated from plugin
descriptions and would otherwise fail `scripts/validate-plugins.sh`.

## Verification

- `scripts/affected-tests.sh --run`: all 14 selected suites passed or
were skipped. Suites run with their tool on this host: bash-format
54/54, eol-normalizer 54/54, ruff-format 63/63, typos-format 148/148,
markdown-format 174/174, rewrite-guard 22/22, claude-observability
60/60. Each pins `changed` on a rewriting run and a no-op run.
- Re-run on the merged head after the #3770 renumber: rewrite-guard
22/22, claude-observability 60/60, typos-format 148/148.
- Not verified on this host: biome-format and go-format skip (no
`biome`, no `goimports`), and powershell-format's behavioral cases skip
(no PSScriptAnalyzer). Their new cases assert `false` on the existing
lint-finding fixtures (already-formatted input) and `true` on a new
unformatted fixture for biome and go; powershell asserts the key is a
boolean, since its formatter settings decide the value. The `test-linux`
lane is where those run.
- `scripts/sync-rewrite-guard.sh --check`,
`scripts/check-changelog-parity.sh --check-bump origin/main`, `--check`
, `scripts/check-shell-portability.sh origin/main`,
`scripts/validate-plugins.sh`: all pass on the merged head. shellcheck,
shfmt, markdownlint, typos clean on the changed files (the one shfmt
note in `markdown-format.test.sh` is a pre-existing line this PR does
not touch).

### Renumbered 0.42.9 to 0.42.10

#3770 bumped 64 plugins and took claude-ops 0.42.9. `main` was merged
in, this change renumbered above it, and the CHANGELOG conflict resolved
so #3770's released 0.42.9 entry stays intact with this change's entry
above it. None of the eight formatter plugins were touched by #3770, so
their numbers are unchanged.

## Related

- Refs #3750 (the report and the `changed` route), #3408 (the formatter
prologue where this emission would otherwise be repeated; landing it in
the shared rewrite guard is the same consolidation for the six
carriers), #3410 (the schema additions are hand-maintained until that
lands), #3770 (took 0.42.9 and dropped the description restored here).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_019DaWEB8Daq1xAXy2Xj1Pme

---------

Co-authored-by: Claude <noreply@anthropic.com>
kyle-sexton added a commit that referenced this pull request Sep 5, 2026
…e at 1.1 (#3769)

Closes #3758

Its two bases (#3765, #3762) have merged, `main` is merged in, and the
diff is reduced to this change alone.

## Summary

The reference sink files an envelope per session only when the envelope
carries a session id, and only the nine claude-ops audit hooks sent one,
so the per-session report's "hooks fired" table never listed the
formatters or the guards. The library now puts the payload's correlation
keys on the envelope spine for every producer, at contract 1.1.

## Fix

- **`lib/hook-utils.sh`** (synced into its 17 carriers):
`hook::emit_telemetry` reads the payload the producer buffered
(`HOOK_TELEMETRY_PAYLOAD` when set, else `INPUT`, the variable every
fleet hook assigns from `hook::buffer_stdin`) and copies `session_id`,
`prompt_id`, `tool_use_id` and `agent_id` onto the envelope between
`duration_ms` and `data`, each only when present as a plain id
(`[A-Za-z0-9._-]+`), on both the builtin and the jq path. No jq, no
subprocess, no producer change. `schema_version` reads `1.1`.
- **`docs/conventions/hook-telemetry`**: `envelope.schema.json` gains
the four optional properties; the README gains a "Correlation keys"
section and rewrites the sink-routing note; the contract CHANGELOG
records 1.1 as an additive minor.
- **Sink** (`plugins/claude-ops/hooks/hook-telemetry-sink.sh` and the
repo-local `.claude/hooks/` copy): routes on the spine `session_id`
first and falls back to `data.session_id`, so envelopes from 1.0
producers keep their route.
- **Seventeen carrier bumps** with CHANGELOG entries: actionlint 0.8.37,
autonomy 0.22.28, bash-format 0.7.38, biome-format 0.6.36, claude-ops
0.42.11, context-guard 0.7.44, desktop-notification 0.6.31,
eol-normalizer 0.6.37, go-format 0.3.40, guardrails 0.32.7,
instruction-placement 0.11.28, markdown-format 0.11.46,
powershell-format 0.7.39, rate-limit-guard 0.7.35, ruff-format 0.6.37,
source-control 0.55.54, typos-format 0.6.44.

## The keys are selected by depth

Review found that searching the raw payload takes the leftmost match
anywhere in it. Two failures, both reproduced against the first version
of this branch:

-
`{"session_id":"sess-real","tool_input":{"options":{"prompt_id":"NESTED-WRONG"}}}`
emitted `"prompt_id":"NESTED-WRONG"`.
-
`{"tool_input":{"n":{"session_id":"NESTED-WRONG"}},"session_id":"sess-real"}`
emitted `"session_id":"NESTED-WRONG"` — not a mis-join, the row lands in
**another session's** `sessions/<id>.jsonl`.

Cutting the search at the first nested container fixed those and broke
something else: the documented payload places `tool_use_id` **after**
`tool_input` (`session-event-log.sh` says so in its early-stop note,
"tool_input closed, tool_use_id still to come"), so the cut dropped it
on every tool event, and the fixture added alongside listed the four ids
up front so it passed anyway.

So the keys are selected by depth instead. Escapes are neutralized, the
payload is split on the quote character, and the alternating fields are
walked — even fields structure, odd fields string bodies. A string body
is kept only at depth 1, so nested objects collapse to brace-and-colon
rubble carrying no quotes and no nested key can match, while a root key
after a container is still reached. The walk costs one step per string,
not one per byte, and what it renders is short, so the four searches run
over a small string whatever the payload size.

## Bounded, and the gap is filed

The neutralizing passes are superlinear in escape count. Per emit,
escape-bearing payload, this container:

| payload | ungated walk | shipped |
|---|---|---|
| 16 KiB | 4 ms | 4 ms |
| 64 KiB | 13 ms | 4 ms |
| 128 KiB | 38 ms | 6 ms |
| 512 KiB | **486 ms** | **22 ms** |

The walk is gated at 65536 bytes; past it the payload takes the head
cut. That stays safe at any size — nothing nested is reachable — but it
is not complete: a root key after the first container is omitted above
the gate, so `tool_use_id` is dropped on payloads over 64 KiB.
`session_id` and `prompt_id` lead the payload, so routing is unaffected.
**#3784** carries that gap with these measurements and two candidate
approaches, and the code comment points at it.

## Verification

- `lib/hook-utils.test.sh` **303/303**. The suite discriminates against
both wrong versions: **3 failures against the un-anchored original** and
**3 against the truncating fix**. New cases cover the documented key
order (`tool_use_id` after `tool_input`), a nested decoy with no root
key, a nested key ahead of the root one, decoys inside a root array, a
multi-megabyte payload, and the size-gate boundary.
- `hook-telemetry-sink.test.sh` 41/41, `api-error-audit.test.sh` 11/11,
`run-guards.test.sh` 99/99, `claude-observability.test.sh` 60/60,
`lib/rewrite-guard.test.sh` 22/22.
- `scripts/affected-tests.sh --run`: one failure, not this PR's —
`block-hook-bypass.test.sh`, "symlink: a genuine temp write in the same
root stays allowed". Reproduced identically on unmodified `main` at
`73eb4d98` in a clean worktree (PASS=601 FAIL=1).
- `scripts/sync-hook-utils.sh --check`, `scripts/sync-rewrite-guard.sh
--check`, `scripts/check-changelog-parity.sh --check-bump origin/main`,
`--check`, `--check-preserved origin/main`,
`scripts/validate-plugins.sh`, `scripts/check-shell-portability.sh
origin/main`, `scripts/check-killswitch-hoist.sh`: all pass. shellcheck
clean; the one shfmt hunk is pre-existing (`main` carries 49, this
branch 1, and it is not in the changed region).

## Renumbered three times

#3770 (fleet-wide prompt audit) bumped 64 plugins and took eight of the
numbers this branch claimed; #3762 and #3765 then took guardrails 0.32.5
and claude-ops 0.42.10; #3781 then took guardrails 0.32.6. Every one of
the seventeen was re-derived as the next patch above `origin/main` and
verified against `git show
origin/main:plugins/<p>/.claude-plugin/plugin.json` after each move.
Each CHANGELOG conflict was resolved by keeping the released entry at
its own heading and lifting this change's entry above it;
`--check-preserved origin/main` passing is what proves no released entry
was dropped.

## Related

- Refs #930 (closed, the thread this finishes), #3750 (the nine-hook
step and the sink route), #3765 and #3762 (the bases, now merged), #3770
/ #3781 (took claimed numbers), #3784 (the size-gate gap), #3410, #3408.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_019DaWEB8Daq1xAXy2Xj1Pme

---------

Co-authored-by: Claude <noreply@anthropic.com>
kyle-sexton added a commit that referenced this pull request Sep 5, 2026
…1218 pointers

Two lint-lane failures, both in prose this branch wrote.

check-purged-em-dashes.sh declares plugins/rate-limit-guard/README.md a purged
surface, and the rewritten multi-account paragraph reintroduced two em dashes.
Restructured into sentences: the four absence cases are now an explicit list
introduced by a colon, and the "no consuming lane acts on it yet" clause is its
own sentence. No parentheses, en dashes, or spaced hyphens substituted, as the
gate's own text forbids.

Three TODO(#1218) pointers are replaced with present-tense statements of what is
not built, in docs/conventions/loop-lane/README.md, the reader contract's
invariants bullet, and the unreleased 0.8.0 changelog entry. Issue #1218 is
closed as not planned, so a TODO aimed at it is a stale pointer rather than
lineage, and #3770's audit had already replaced the reader contract's original
pointer for that reason. The single (Refs #1218) lineage mention in the 0.8.0
entry stays; older entries and main's own text are untouched.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QKU99jG34EDYBz1y2g5vVF
kyle-sexton added a commit that referenced this pull request Sep 6, 2026
…1218 pointers

Two lint-lane failures, both in prose this branch wrote.

check-purged-em-dashes.sh declares plugins/rate-limit-guard/README.md a purged
surface, and the rewritten multi-account paragraph reintroduced two em dashes.
Restructured into sentences: the four absence cases are now an explicit list
introduced by a colon, and the "no consuming lane acts on it yet" clause is its
own sentence. No parentheses, en dashes, or spaced hyphens substituted, as the
gate's own text forbids.

Three TODO(#1218) pointers are replaced with present-tense statements of what is
not built, in docs/conventions/loop-lane/README.md, the reader contract's
invariants bullet, and the unreleased 0.8.0 changelog entry. Issue #1218 is
closed as not planned, so a TODO aimed at it is a stale pointer rather than
lineage, and #3770's audit had already replaced the reader contract's original
pointer for that reason. The single (Refs #1218) lineage mention in the 0.8.0
entry stays; older entries and main's own text are untouched.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QKU99jG34EDYBz1y2g5vVF
kyle-sexton pushed a commit that referenced this pull request Sep 6, 2026
…ting-budget-fraction

Conflict: .claude/settings.json. main removed the `worktree.baseRef` block in
#3770's fleet-wide prompt audit; this branch added `skillListingBudgetFraction`.
Both intents kept: the block stays removed, the new key stays.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VPLatLkg4329L8eyfxhuMa
kyle-sexton pushed a commit that referenced this pull request Sep 6, 2026
…-floor-work-class

Three conflicts, all from main advancing under the branch:

- plugins/work-items/.claude-plugin/plugin.json: main shipped 0.39.64 and
  0.39.65 while this branch held 0.39.63. Renumbered to 0.39.66.
- plugins/work-items/CHANGELOG.md: this branch's entry moved to [0.39.66] and
  main's [0.39.65] / [0.39.64] entries kept beneath it, unchanged.
- skills/triage/context/apply-outcome.md: this branch rewrote the work-class
  pairing rule to admit C1-C3 only; #3770's prompt audit rewrote the same
  paragraph solely to strip bare issue references. Kept this branch's rule and
  applied main's editorial rule to it, dropping the `(medley#1677)` reference.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VPLatLkg4329L8eyfxhuMa
kyle-sexton added a commit that referenced this pull request Sep 7, 2026
…3939)

No related issue: the follow-up ledger of the prompt-audit sweep is
tracked by the record `docs/specs/prompt-audit-skills-2026-09.md`, not
by an issue.

## Summary

Closes the follow-up ledger of the 2026-09 prompt-audit sweep (#3770):
every item F2 to F24 in `docs/specs/prompt-audit-skills-2026-09.md` `##
Follow-ups` now names its closing commit (20 lines prefixed "Closed"),
F3 and F14 are recorded as not PR deliverables with owners, and F25 is
inventoried. 43 plugins change across 121 commits plus 4 merge commits
from `origin/main`. The small defects are fixed directly, the mechanism
changes ship as scripts with tests, the verification debt is stamped
with dates and recheck triggers, and the surfaces the sweep did not
audit (plugin-level `reference/` trees, hooks prompt text, the output
style, `.claude/rules`, `CLAUDE.md`, `AGENTS.md`) were audited with the
same method and applied the same way. Reports and decisions per
follow-up are under the author's `.work/prompt-audit-follow-ups/` and
are summarized in the record's `## Follow-up PR` section.

## Fix

- One commit per plugin per follow-up, subjects naming the follow-up id;
each carries a patch bump and a CHANGELOG bullet ending in
`(prompt-audit follow-up F<n>)`.
- Mechanism scripts with co-located tests:
`work-items/scripts/lane-telemetry-upsert.sh` (F11), the synced
`compose-statusline-wiring.sh` in context-guard and rate-limit-guard
(F15), context-guard setup's pre-computed probes (F17), the synced
`plugin-quality/scripts/context-zone.sh` with `sync-context-zone.sh
--check` and `--check-bump` wired into CI's plugin-gate job (F19),
`mutation-testing/scripts/suppression-lint.sh` (F21), pull-request Gate
5 parameterized on the discovered reviewer (F7), raw-URL cross-plugin
citations and a link-free convention name in autonomy (F8).
- F6: every undated harness or upstream claim the record listed is
stamped with a date and a recheck trigger, pointed at a dated owner
record, or removed (122 rows: 80 stamped, 32 corrected, 9 removed, 1 no
edit); the fleet gather-block claim has one dated record on the worktree
skill.
- F10: every suite the record listed as failing on the author's Windows
host now passes there after a portable fix, in five clusters; three
recorded symptoms were real cross-platform defects (provenance
`list-corpus`, knowledge's fence gate console encoding, education's
teach workspace across worktrees) and several Windows-only test vacuums
(a CRLF from jq that made checks pass without inspecting anything). One
residual is verified on CI's Linux lane: repo-fleet-hygiene
`audit-fleet`'s 33 load-sensitive GitHub-evidence cases.
- F2: `.claude/rules`, the rendered `AGENTS.md` rules table, the one
output style, and the user-facing strings of 70 hook scripts audited and
applied; no `hooks.json` declares a prompt-type hook.
- The topic Brief graduated into the record as `## Follow-up PR` and
`docs/topics/prompt-audit-follow-ups/` was pruned.
- One renumber pass lifts every branch-added CHANGELOG heading above
`origin/main`'s current version for the plugins main overtook; merge
commits compose both sides of every content conflict (named in each
merge commit message).

## Verification

- The four `scripts/check-changelog-parity.sh` modes (`--check`,
`--check-bump origin/main`, `--check-preserved origin/main`,
`--check-order`): pass at the branch tip.
- `check-purged-em-dashes.sh`, `check-skill-precompute-compose.sh
--all`, `render-index.sh check --file AGENTS.md`,
`validate-plugin-contracts.mjs`, `sync-context-zone.sh --check` and
`--check-bump origin/main`, `check-shell-portability.sh origin/main`,
`check-docs-only-gate.sh --check`, `check-skill-count-claims.sh
--check`, `check-contract-slice-prune.sh --check-diff origin/main`,
`typos`, repo-wide markdownlint: pass.
- `check-cross-plugin-source-drift.sh --check` reports the same 20
unregistered clusters on a clean `origin/main` checkout on the author's
Windows host, so that gate's verdict is CI's Linux lane.
- `scripts/affected-tests.sh --run` could not finish on the author's
host under load; every suite each follow-up touched was run directly and
is green there, and each dispatched change was checked by a
fresh-context verifier against the diff and the run before commit
(per-cluster reports name the counts). CI runs the whole corpus.
- Per plugin, before its commit: `check-skill.sh` on every touched
skill, `check-skill-precompute-compose.sh --paths`,
`check-evals-quality.sh` where evals changed, shellcheck and the
portability check on every script, markdownlint, typos, and the
`ai-slop` detector on every touched file.

## Related

- Record: `docs/specs/prompt-audit-skills-2026-09.md` (`## Follow-ups`,
`## Follow-up PR`).
- Sweep PR: #3770 (merged as f62c1b3, this branch's fork point).
- ADR 0005 and ADR 0008 stay accepted; nothing here retires them.
- Pre-prune commit for the contract slice:
`fe3ada293f429da5416d89aa11555f4082222416` (`gh api
"repos/{owner}/{repo}/contents/docs/topics/prompt-audit-follow-ups/PLAN.md?ref=fe3ada293f429da5416d89aa11555f4082222416"
--jq .size`).
- Not filed: two playbooks work items the F2 audit surfaced ("Explore a
deliberate thinking-off lane on Opus 5" and "Revisit push-down routing
lanes when Opus 5 injection data lands") sit under "Not filed" in the
author's
`.work/prompt-audit-follow-ups/reports/F2-playbooks-reference-applied.md`
for the playbooks maintainers to file through `/playbooks:update`;
filing public issues was outside this PR's ask.
- F25 (`babysit-readiness-gate.sh` badge grammar) is inventoried in the
record, not delivered here.
- Not applied here: the F2 root-surfaces finding that
`.claude/rules/pr-body-contract.md` is the one rule with no YAML
frontmatter. That file is sync-manifest-managed by
`melodic-software/standards` (CI's managed-files-guard refuses direct
edits), so the frontmatter belongs in that repository and lands through
standards-sync.

## Follow-ups (verbatim from the record)

Inventoried here as they arise and shipped in the PR body verbatim.

- F1. Write one superseding ADR covering every accepted ADR decision
this audit contradicted (at minimum ADR 0004 D-1 and D-3, ADR 0006's
applied-set gate); decide with the operator whether ADR 0005 and ADR
0008 are also retired.

<!-- spellchecker:off -->

- F2. Closed in 3cf0d69 (`.claude/rules` and the `AGENTS.md` row they
render), b618ed3 (the one output style), c93b18c, 2ba9047, and
fc0d3b7 (hooks prompt text in guardrails, disk-hygiene, and autonomy);
no `hooks.json` declares a prompt-type hook, so the hooks surface was
the user-facing strings of 70 hook scripts, 65 of them clean. Reports
and decisions for both surfaces sit under
`.work/prompt-audit-follow-ups/` beside the six reference-tree ones. In
progress: the six plugin-level reference trees are audited and applied
(performance 61d3eb9 and d0ce988; autonomy 67e8244; architecture
1ca9d3c; coupling cdcee0e and review 075fc0a for the same
topic-docs pointer regression; playbooks 4e2a0f4; context-guard
4906eed and 3452edf; rate-limit-guard b4264ea), with reports and
decisions under `.work/prompt-audit-follow-ups/`; hooks prompt text,
output styles, `.claude/rules`, `CLAUDE.md`, and `AGENTS.md` are still
to audit. Audit the out-of-scope prompt surfaces the same way: hooks
prompt text, output styles, `.claude/rules`, `CLAUDE.md`, `AGENTS.md`,
and the plugin-level `reference/` trees that skills load on invocation
(`autonomy`, `architecture`, `performance`, `playbooks`,
`rate-limit-guard`, `context-guard`); the performance auditor notes that
`snapshot` and `verify` both mandate reading
`plugins/performance/reference/harness-integrity.md`, which likely
mirrors the archaeology the skill bodies shed.

<!-- spellchecker:on -->

- F3. Not a PR deliverable: the measurement runs through
`claude-config:unhobble` on demand, and the operator owns when to run
it. Behavior measurement beyond the wave-1 spot-check: route to
`claude-config:unhobble`.
- F4. Done before the PR: `docs/topics/prompt-audit-skills/PLAN.md`
graduated into [Brief](#brief) and the slice was pruned (contract-slice
prune gate); the PR body names the pre-prune commit.
- F5. Closed in b8225f2 (the two residual surfaces).
`plugins/skill-quality/scripts/check-skill.sh` check 3 hard-fails any
trigger phrase dropped versus the base ref. That blocks prompt-audit's
documented fix for trigger-case enumeration (near-synonym lists become
intent categories). Change check 3 to a warning, update its tests, and
record the deliberately dropped phrases per skill in this record. Must
land before the PR so the skill-quality CI gate passes. Landed in
a694011; two out-of-scope surfaces still describe check 3 as a
hard-FAIL gate and should follow: the comment at
`plugins/docs-hygiene/skills/audit-noise/scripts/emit-findings.sh:220`
and the eval fixture
`plugins/docs-hygiene/skills/audit-noise/evals/fixtures/negation-trigger-fence.md:9`
(the docs-hygiene commit corrected the same script's header comment and
its eval case 12).
<!-- spellchecker:off -->

- F6. Closed in six verifier groups, one commit per plugin: G1 446c276
(session-flow) and 47bace6 (source-control, which also owns the fleet
gather-block record at `skills/worktree/reference/gather-block.md`, "The
pre-compute block runs as one shell invocation"); G2 e564b9b
(disk-hygiene), bf70d79 (performance), 4e0e4d8 (rate-limit-guard),
3ee8271 (work-items); G3 203fb36 (claude-memory), c0275b4
(claude-config, which owns the `pre-v2.1.211` record), 7659e32
(claude-ops); G4 5404ba7 (context-budget), 4c792b9 (context-guard),
4532e37 (plugin-quality), 177b179 (skill-quality), 993ce43
(instruction-placement); G5 0d49296 (computer-use), f344689
(overengineering), 875b8da (improvement), 70dfe3e (code-tidying),
69a8819 (codebase-health), 1aa1dcf (architecture), caaa69c
(mcp-tools), 22d20a4 (docs-hygiene), 1fd6561 (repo-hygiene); G6
da9b14a (autonomy, basis by class), 809617c and 32ebdee (discovery,
six records in `reference/parent-contract.md`), 0bb93b9 (discipline),
577c359 (testing), 16a2604 (playbooks), 634ef1b (review), 69913c1
(planning). Across 122 claim rows: 80 stamped, 32 corrected and stamped,
9 removed as unverifiable from any reachable source, 1 needing no edit;
36 skill sites outside source-control now point at the gather-block
record. Reports `F6-G1.md` to `F6-G6.md` under
`.work/prompt-audit-follow-ups/reports/` carry the per-claim basis and
recheck trigger. Verify and stamp the undated harness-behavior claims
the audit flagged as `I12` items (session-flow: `/recap` trigger and the
Skill-invocable allowlist, the usage-limit reset surface,
`cleanupPeriodDays` default, `/clear` transcript and scheduled-task
behavior). Each becomes a four-part upstream-drift record or a doc
pointer. Collected per plugin as the waves run. source-control adds:
GitHub `mergeStateStatus` precedence and `baseRefOid` staleness
(freshness.md), the permission-mode and wrapper-strip claims in
safety.md, and the ScheduleWakeup clamp, `/loop` expiry,
Monitor-on-resume, and sandboxed-GraphQL claims across babysit-prs,
babysit-loop, pull-request, and worktree. disk-hygiene adds four undated
harness-version claims (`safety-model.md:262`, `:313`, `:315` on 2.1.207
and 2.1.218 `pluginConfigs` scope and PowerShell hook firing;
`clean/SKILL.md:382` on the v2.1.211 auto-mode prompt). performance adds
the undated benchstat `-delta-test` claim at `snapshot/SKILL.md:94-96`,
and `plugins/performance/reference/harness-integrity.md` (out of audit
scope, mandated reading for `snapshot` and `verify`) likely carries the
run archaeology the four skill bodies shed (see F2).

<!-- spellchecker:on -->

- F7. Closed in b37b769 and e8f2f90 (Gate 5 keys on discovered
reviewer logins; vendor shapes live in `reference/reviewer-shapes.md` as
dated records; `scripts/babysit-readiness-gate.sh` still couples to one
vendor's badge grammar and is its own follow-up). `pull-request`
hardcodes one vendor's review bot (login, emoji signalling, timing) in
`reference/monitor.md` gotchas and `reference/readiness.md` Gate 5,
against the file's own "discover actors, don't hardcode them" rule.
Parameterize Gate 5 on the discovered reviewer login and move the vendor
shapes into a dated reference-shapes note with a recheck trigger.
- F8. Closed in f5d41ed (source-control), 2bd0a7c (review),
2173f85 (playbooks), and 38025be (autonomy, link-free by class).
`source-control` cites sibling-plugin files by relative path
(`../../../../autonomy/...`, `../../../../../prompts/...`) in
`babysit-loop/reference/promotion-evidence-resolution.md` and
`babysit-prs/reference/safety.md`. Those resolve only in the marketplace
checkout, never in an installed plugin. Convert to the raw-URL form the
plugin already uses at `babysit-loop/SKILL.md:40`. review adds:
`agents/ecosystem-specialist.md:22`,
`fanout/context/fix-pass-mode.md:7`, `quality-gate/context/close-out.md`
(four sites), and `quality-gate/context/spec.md` (three sites) cite
marketplace `docs/` paths or sibling-plugin files by relative path.
review also adds two undated claims to F6: the bundled `/code-review`
and managed Code Review service tiers in `quality-gate/context/pr.md`
and `code.md`, and the "built-in `/security-review` is unusable in CI"
claim in `security-review/SKILL.md`. The autonomy applier converted six
of that plugin's own convention and sibling citations to marketplace
URLs; those were reverted to the relative form before the PR because
`scripts/validate-plugin-contracts.mjs` forbids the autonomy plugin
naming the org or a vendor, so the autonomy sites stay under this
follow-up.
- F9. Closed in e6fe01a. `planning/skills/wayfind/SKILL.md`
pre-compute silently coerces a non-string `container_label` to
`work-map`, which `context/tracker-mechanics.md` says is a configuration
error that must never proceed. Make the pre-compute fail loud or surface
the raw value, matching the doc.
- F11. Closed in 9dcae99 and d670543. `work-items` carries the same
60-line lane-telemetry upsert as a fenced shell block in
`work-loop/reference/telemetry-upsert.md` and
`attend-queue/reference/telemetry-upsert.md`, transcribed by the model
on every cycle, with a classifier-fallback section asking it to
re-derive gate order by hand (prompt-audit Group 4, an LLM executor for
a deterministic plan). Extract it into
`plugins/work-items/scripts/lane-telemetry-upsert.sh` with a co-located
test, taking lane, instance, repo, issue, and body-file arguments and
exiting non-zero on each refusal branch; both references then invoke it.
Deferred from the audit because it is a mechanism change, not a prose
hunk. work-items also adds six undated harness and `gh` claims to F6
(classifier refusals of `permissions.allow` widening and of the
`reclaim` call, the compound-shell block, sandboxed GraphQL 403).
- F12. Closed in the 22 plugin commits of 2026-09-05 that name F12 (51
skills; claude-memory stateless keeps the key because it injects through
a fenced block). `shell: bash` frontmatter selects the shell for
`!`...`` injections. Skills whose pre-compute block became empty when
the git lines moved into body calls still carry the key inert (debugging
F5 found one). Sweep every SKILL.md: where no injection remains, drop
the key; `check-skill.sh` check 19 stays green either way.
- F13. Closed in 2846cd1. `playbooks:boris` presents Fable 5 as the
current top model and its launch-era classifier behavior as current
(`skills/boris/SKILL.md:58,133`); upstream has not published Fable 5.1
tips. Re-sync through `/playbooks:update` when it does, and until then
qualify the Model row "as of the 2026-07-24 sync".
- F14. Not a PR deliverable: the whole-pack regeneration is the
playbooks maintainers' separate run through `/playbooks:update`; the
`fable-5-1.md` chapter exists, the F8 tail closed under F8, and the F6
tail closes under F6. The `fable-5` playbook's own regeneration trigger
("a model-version change", `skills/update/SKILL.md:39`) has fired with
Fable 5.1. The audit adds the guide-backed minimum, a `fable-5-1.md`
adaptation chapter; regenerating the whole pack from Fable 5.1 is the
maintainers' larger call. playbooks also adds to F8:
`reference/model-adaptation/opus-5.md:207-208` cites a probe record
(`thinking-off-probe-2026-07-26.md`) that exists nowhere in the
repository. And to F6: the cache-pricing stamp at
`skills/fable-5/context/orchestration.md:97` carries a date but no
recheck trigger.
- F15. Closed in 8e5edcb, 63c65a4, and 920b750. The statusline
compose transform in `unwrap-before-compose.md` (synced between
`context-guard` and `rate-limit-guard`) is a pure function of the
effective `statusLine` string that the model hand-executes over roughly
a hundred lines of prose, with eight eval cases checking the arithmetic
(prompt-audit Group 4). Extract it into a synced
`scripts/compose-statusline-wiring.sh` with the round-trip check inside,
shrink the reference to the contract, and turn those eval cases into
script tests. Deferred from the audit as a mechanism change.
rate-limit-guard also adds to F6: the undated "Monitors is an
experimental Claude Code component" claim in
`reference/reader-contract.md:206-209`.
- F16. Closed by main's 39442ff (the probe re-verified against
2.1.261); its F6 and F10 tails stay under those items.
`claude-ops/skills/plugins/SKILL.md:268-276` records that its own
probe's recheck trigger has fired (the CLI moved from 2.1.218 to 2.1.240
with the claim un-retested). Re-run the probe and refresh the stamp.
claude-ops also adds nine undated harness and upstream-issue claims to
F6 (bundled `doctor` gating, `audit-native-overlap` alias examples,
`inventory` command aliases, the WebFetch truncation window, the
`CLAUDE_PLUGIN_DATA` export claim, the `lanes` "verified on this
machine" lines, the `observability` `session_id` and Stop-hook gotchas,
upstream issue states in `read-routing.md` and `sync.md`, and the
triggerless `surfaces.md` stamp) and two measured figures (`backups/`
retention, the 97 percent and 50 MB figures in `observability`).
`plugins/repo-fleet-hygiene/skills/audit/scripts/audit-fleet.test.sh`
fails 5 of 180 cases on this host (the worktree-root-unconfigured
placement and header cases, the symlink discovery-root case, the
intermediate-symlink case, and the unreadable discovery-root case); the
scripts are untouched by the repo-fleet-hygiene commit and the
finding-kind table assertion passes.
- F17. Closed in dae163f and 118e4a1 (three of the four probes
pre-computed; the session-snapshot probe stays a body call because an
unexpanded `${CLAUDE_SESSION_ID}` must be visible to the consumer, per
the reader contract). `context-guard/skills/setup/SKILL.md` runs four
fixed read-only probes (jq presence, installed shim versus shipped
source, session snapshot, `zones.json`) as model-issued Bash calls where
a `## Pre-computed context` block would run them before the body loads
(prompt-audit Group 4). Adding one is a mechanism change: the block must
pass `scripts/check-skill-precompute-compose.sh` and stay inside the
worktree guard's rule that a composed block expands nothing but bare
`$HOME`, so it is deferred from the audit. context-guard also adds to
F6: the undated `disableAllHooks` / `allowManagedHooksOnly` claims in
`skills/setup/SKILL.md:93-96` and
`reference/reader-contract.md:503-507`, the undated PowerShell routing
note in `statusline-edit.md:106-109`, and the folklore-number paragraph
at `reader-contract.md:383-391`, which is dated but has no recheck
trigger.
- F18. Closed in 904de7e.
`autonomy/reference/autonomous-pipeline-reminder.md` (out of audit
scope; cited only by the README and a hook) rewords the vendor's
autonomy block under the repo's no-copy rule and omits the Fable 5.1
clause "Do not stop because the context or session is long"; the guide
calls the opening sentence load-bearing as written. Weigh the no-copy
rule against that claim and add the missing clause in the plugin's own
words. autonomy also adds to F6: the undated `AGENTS.md`-reachability
claim stated three times (`skills/setup/SKILL.md:267`,
`context/prerequisite-resolution-slice.md:38-39`,
`reference/prerequisite-resolution.md:86-88`), the undated empirical
telemetry claims in `reference/telemetry.md`, and the "shipped
first-party mechanisms today" claims in
`reference/runner/escalation.md:140-152`.
- F19. Closed in 81c6c0f and 8ebcf8d (the F6 additions in this line
stay under F6; the reader-contract wording landed in e128c11; a CI step
for `sync-context-zone.sh --check` lands in this PR's closing commits).
`plugin-quality/skills/audit/SKILL.md:58-92` has the model resolve the
context zone by hand from inlined band tables, a staleness window, a
version floor, and a combination rule that
`plugins/context-guard/scripts/context-zone.sh` already implements
(prompt-audit Group 1b and Group 4). Ship a byte-identical synced copy
at `plugins/plugin-quality/scripts/context-zone.sh` with its test,
register it in `scripts/cross-plugin-source-registry.txt` with a
`sync-context-zone.sh --check` entry, and have the gate and
`setup/SKILL.md:28-30` call it. Deferred from the audit as a mechanism
change. plugin-quality also adds to F6: two live doc-page titles quoted
undated in `agents/auditor.md:117-119`, the `context: fork` and
cloud-scoping claims in `references/component-types/skill.md:18-24`, and
six dated stamps with no recheck trigger. skill-quality adds to F6:
three undated harness claims outside the dated stamp in
`check/SKILL.md:160-172`, and the `setup/SKILL.md:16-20` stamp that has
no recheck trigger. instruction-placement adds to F6: the undated "other
agents resolve nearest-wins" claim in
`realign/context/apply-recipes.md:95-97`. context-budget adds to F6: the
`v2.1.232` measurement at `audit/SKILL.md:226-228`, the `/doctor`
availability and `disableModelInvocation` claim at
`audit/SKILL.md:34-36`, the cited-but-undated mechanism claims in
`audit/reference/engine.md:25-30` with the dangling "verified version"
referent at `:52-53`, and the wall-clock range at `audit/SKILL.md:93`.
computer-use adds to F6: the dated surface table in
`diagnose/SKILL.md:62-63` and the dated basis in
`diagnose/reference/windows-quirks.md:5-6`, both without a recheck
trigger. overengineering adds to F6: the undated harness-behavior claim
in the gather blocks of all three skills (`audit/SKILL.md:20-23`,
`delta/SKILL.md:19-23`, `realign/SKILL.md:19-22`, covered by the one
dated record the worktree skill will own) and the undated `/loop`
capability claims in `delta/context/recurring-wiring.md:37-38,51-53`.
improvement adds to F6: four undated GitHub REST and Claude Code CLI
claims in `find/context/ci-health.md:32-41`, `find/SKILL.md:235-237`,
and `find/context/unattended.md:74-75`. docs-hygiene adds to F6: the
bundled `/batch` skill claim in `extract-ssot/actions/batch.md:35,281`,
four undated external benchmark figures across
`extract-ssot/SKILL.md:27`, `context/anti-patterns.md:129`, and
`context/decision-framework.md:27-59`, and the undated
upstream-publishing claim in
`audit-encapsulation/context/public-surface-contract.md:5`. code-tidying
adds to F6: the CodeScene agentic-refactoring figure in
`tidy/reference/scope-budget.md` "Research lineage" has no resolvable
source; the audit dropped the number and kept the qualitative claim
until a publication URL and read date are recorded. repo-hygiene adds to
F6: the sourced-but-undated `${CLAUDE_SKILL_DIR}` substitution-scope
claim in `clean/reference/invocation-forms.md`. disk-hygiene adds to F6:
four undated harness-version claims across `clean/SKILL.md` and
`clean/reference/safety-model.md` (report F15). codebase-health adds to
F6: the undated harness-capability claim at `audit/SKILL.md:25-28`,
verified true by the auditor on 2026-09-04 and needing only its dated
record. architecture adds to F6: the undated pre-compute execution claim
at `improve/SKILL.md:25-28`. mcp-tools adds to F6: three
cited-but-undated Claude Code client-behavior values in
`audit/reference/checklist.md:38,105,106`. performance adds to F6: the
undated benchstat flag-set claim in `snapshot/SKILL.md:94-96`.
- F20. Closed in d84723f. `provenance/skills/audit` spells one tier
two ways: `not-found` in `SKILL.md:2,82,227` and `source-not-identified`
in `reference/rubric.md:297`, and `scripts/emit-findings.sh` with its
test asserts both. Pick one spelling, change the script and
`emit-findings.test.sh` with it, and align the markdown in the same
commit. Deferred from the audit because the fix crosses into a script
and its suite.
- F21. Closed in 8f09c4f and 3e3dd3d.
`mutation-testing/skills/setup/SKILL.md:80-89` has the model re-derive a
suppression entry's `finding_id` hash from its constituents and check
node-kind membership by hand (prompt-audit Group 1b and Group 4, the
same shape as F19). Ship
`plugins/mutation-testing/scripts/suppression-lint.sh` with a test
implementing the two published derivations and the membership check,
have setup call it, and retarget setup eval 5 and audit eval 3 from "the
model re-derives" to the script. Deferred from the audit as a mechanism
change.
- F22. Closed in ea8569d.
`plugins/ai-briefing/skills/setup/evals/evals.json:33` prompts
`/ai-briefing:setup --with-build-deps`, but the skill's contract is
`apply install-build-deps`; the case exercises a flag the skill does not
accept. Retarget the prompt to the contract form. Observed by the
ai-briefing auditor outside the audit's markdown scope.
- F23. Closed in f871ca2.
`plugins/dometrain/skills/sync/context/update.md` documents the
maintainer-only `--refresh-baseline` command through
`${CLAUDE_PLUGIN_ROOT}`, which resolves to the installed plugin cache in
a normal session, while the next paragraph forbids running it anywhere
but a working clone; the script writes next to itself either way. Give
the command as a clone-relative path, or document that the flag is only
safe under `--plugin-dir`. A script-safety contradiction, not a prose
hunk; observed by the dometrain auditor.
- F24. Closed in 52b2004. Add a criteria row to
`plugins/claude-config/skills/audit-instructions/reference/criteria.md`
for each recurring shape in [Catalog gaps](#catalog-gaps): dated stamps
with no recheck trigger, migration-relative phrasing inside reference
and context files, routing text that names a skill absent from
`plugins/`, sibling-file meta-commentary, and maintainer rationale
inside model-facing YAML comments; the rest are one-offs and stay
listed.
<!-- spellchecker:off -->

- F10. Closed in 7ae8d36 (work-items), 8c0d3eb (planning), and
4f51193 (instruction-placement) for cluster C2, and in 9baa032
(repo-hygiene) for cluster C5, which captured the check-7 error after
the merge of main at eba62c5 (seven fixture-side cases in three
`clean` suites) and cleared it; the autonomy `lane-stop-gate` FIFO case
passes on this host unchanged. One residual stays, not fixable on this
host: repo-fleet-hygiene `audit-fleet`'s 33 load-sensitive
GitHub-evidence cases, verified on CI's Linux lane. Reports `F10-C2.md`
and `F10-C5.md` under `.work/prompt-audit-follow-ups/reports/`. The
status below is as recorded on 2026-09-07 before C2 landed. In progress:
clusters C1, C3, and C4 landed (C1 1c75e31 and f385946 provenance,
037552c cloud-bootstrap; C3 eab3540 claude-ops, eec9018
claude-config; C4 6d34a94 knowledge, 09c8d00 education, 944e0cb
disk-hygiene, e07b89d repo-fleet-hygiene). Three of the recorded
symptoms were real cross-platform defects, not host quirks: provenance
`list-corpus` subtracted the corpus root as a string, knowledge's fence
gate wrote to a cp1252 console, and education's teach workspace split
across a repo's worktrees. Four recorded symptoms did not reproduce
(docs-hygiene `emit-findings`, claude-config `emit-findings` and
`permission-rule-check` 6b, claude-ops `fleet-state`, the last resolved
upstream by main's rewrite). Still open: cluster C2 (work-items
`generate-adapter` case 116, planning `interview-defenses` digests,
instruction-placement `verify-load`), the autonomy `lane-stop-gate` FIFO
case held back from C4 while a verifier held that plugin, the
`interview-defenses` frontmatter digest that F12's `shell: bash` removal
moved and that needs re-pinning, repo-fleet-hygiene `audit-fleet` at 33
load-sensitive GitHub-evidence failures the C4 report characterizes, and
one uncaptured error in repo-hygiene `clean` check 7 with main ahead of
the branch in those scripts. Not an audit finding, recorded so it is not
mistaken for one: `.claude/hooks/cloud-bootstrap-plugins.test.sh` fails
15 of 32 assertions on this Windows host ("not installed at user scope")
with `.claude/cloud-bootstrap.sh` and the suite byte-identical to
`origin/main`. The failure is environmental or pre-existing; confirm on
CI and file separately if it reproduces there. Same status for
`plugins/docs-hygiene/skills/audit-noise/scripts/emit-findings.test.sh`
("tier is looked up as IMPORTANT", "Location is repo-relative") and
`plugins/provenance/skills/audit/scripts/list-corpus.test.sh` and
`emit-findings.test.sh` ("a directory target lists its markdown"), which
fail on this host with their scripts and suites byte-identical to
`origin/main`. Same again for
`plugins/work-items/skills/onboard-adapter/scripts/generate-adapter.test.sh`
case 116, and for the nine eval-case digest assertions in
`plugins/planning/tests/interview-defenses.test.sh`
(`interview/evals/evals.json` unchanged since the digests were pinned;
local jq 1.8.2), and for four Windows temp-path cases in
`plugins/instruction-placement/scripts/verify-load.test.sh` (selected by
a basename collision on `typescript.md`; the probe and suite are
unchanged on this branch), and for
`plugins/claude-ops/skills/audit-install-state/scripts/install_state.test.sh`
(a Windows filename-syntax error on a fixture path) and
`plugins/claude-ops/skills/audit-skill-visibility/scripts/audit_skill_visibility.test.sh`
(no `installed_plugins.json` in the temp config), both with scripts and
suites byte-identical to HEAD, and for
`plugins/claude-ops/skills/plugins/scripts/fleet-state.test.sh`, which
fails a varying subset of its 74 cases on this host (six inside a
check-skill run, two when run alone) with the scripts byte-identical to
`origin/main`. Same again for
`plugins/claude-config/skills/audit-instructions/scripts/restatement-scan.test.sh`
(two I29 fixture cases, script and fixtures byte-identical to
`origin/main`) and the one `emit-findings.test.sh` case downstream of it
("Action names a body cut"), which reads the same scanner's output. Same
again for
`plugins/claude-config/skills/audit-permission-grants/scripts/permission-rule-check.test.sh`
case 6b ("vendored copies excluded, exactly one finding"), whose script
and suite no branch commit touched (main has since tidied the suite in
ac7eeea). The fleet gather block itself ("the harness runs a skill's
whole pre-compute block as one shell invocation") is an undated harness
claim in about 55 skills; one dated four-part record on the worktree
skill, which owns the mechanism, with the copies pointing at it, clears
every site at once. discovery adds six undated claim families across
thirteen files (silent preload failure, `AskUserQuestion` and plan-mode
tools filtered from non-fork subagents, the Workflow tool absent from
subagents, background as the default execution mode, spawns
permission-classified before launch); the fix is one dated record per
claim in the plugin's `reference/parent-contract.md` with the skills
pointing at it. claude-config adds the undated `pre-v2.1.211` boundary
at six body sites (the dated owner is
`audit-permission-state/reference/criteria.md`), dated-but-triggerless
stamps across eight files, the `conflict-scan.sh` precision figures in
`conflict-criteria.md`, and the "Fable 5 subpage" pointers in
`audit-prompting-postures/reference/postures.md` that need a Fable 5.1
sibling once it exists. discipline adds five files of undated fork-mode
harness claims (`sweep-all/SKILL.md`, its two references,
`scrutinize-dont-coast/SKILL.md`, `use-your-skills/SKILL.md`).
claude-memory adds the undated upstream-issue state at
`audit/reference/official-guidance.md:168`. testing adds the xUnit v3
and .NET 10 framework-trap claims (`diagnose/SKILL.md:68`,
`diagnose/context/investigate.md:16`, `write/SKILL.md:74`) and the
`playwright-cli` version floor in `run-e2e/context/e2e.md:12`. planning
also adds two undated harness claims to F6: the agent-teams
"experimental, default-off" status in `plan/SKILL.md` and the "cannot
read effort or advisor state" claim in
`interview/context/session-config.md`.
`plugins/ai-slop/skills/audit/scripts/detect.test.sh` fails its four
"git absent" cases (4 of 202) on this Windows host because the test
symlinks the shell builtin `printf` into a fake PATH directory (`ln:
failed to create symbolic link`); the scripts are unchanged by the
ai-slop commit.
`plugins/disk-hygiene/skills/clean/scripts/guard_launch_monitor.test.sh`
fails its two telemetry-sink cases and `hygiene.test.sh` fails
`test_stash_must_exist_in_an_independent_checkout` and
`test_preview_allows_root_children_os_managed_snapshot` on this host
with the scripts byte-identical to HEAD; neither case reads markdown,
and the frontmatter-belt assertions in `test_hygiene.py` that do read
`clean/SKILL.md` pass after the disk-hygiene commit.
`plugins/code-tidying/skills/audit-comment-residue/scripts/detect.test.sh`
fails 4 of 53 cases on this host (embedded quote and backslash
unescaping in the preview script, arrow-in-filename, tab-bearing path)
with `detect.sh` and the suite byte-identical to HEAD; the code-tidying
commit touches only prose the script does not read.
`plugins/knowledge/skills/docpage-digest/scripts/check-fences-exact.test.sh`
fails six cases on this host with a `UnicodeEncodeError` writing U+2265
to the cp1252 console, script and suite byte-identical to HEAD; the
knowledge commit touches no fence, quote payload, or script.
`plugins/education/skills/teach/scripts/list-workspaces.test.sh` fails
"worktree lists the MAIN repo's workspace" on this worktree checkout
with the script unchanged.
<!-- spellchecker:on -->

- F25. `plugins/source-control/scripts/babysit-readiness-gate.sh`
matches `P[0-3]` severity badges, one vendor's finding-format grammar,
the same coupling F7 removed from `pull-request` one skill over (it
serves `babysit-prs`). Parameterize the badge grammar on the discovered
reviewer shape that `pull-request/reference/reviewer-shapes.md` records,
with the script's test updated in the same commit. A script change
outside the F7 commit's blast radius (from the F7 applied report).

<details>
<summary>PLAN.md (graduated into the record and pruned; last held at
fe3ada2)</summary>

### prompt-audit-follow-ups

#### Brief

##### TLDR

Close every open follow-up the 2026-09 prompt-audit record inventories
(F2 to F24, less the two already done) in one follow-up PR on top of the
merged sweep: the small defects directly, the mechanism changes as
scripts with tests, the verification debt as dated records, and the
unaudited surfaces with the same audit method.

##### Goal

`docs/specs/prompt-audit-skills-2026-09.md` `## Follow-ups` reads as a
closed ledger: each of F2 to F24 either names the commit that closed it
or states, in one sentence, why it stays open and who owns it. Every
skill that loads a `reference/` tree, hook prompt, output style, or rule
has had those surfaces audited against Claude Fable 5.1. Every
deterministic procedure the audit found the model transcribing by hand
runs as a script with a test. Every undated harness or upstream claim
the audit withheld is stamped with a date and a recheck trigger, pointed
at a dated owner, or removed.

##### Constraints

- Branch `chore/prompt-audit-follow-ups` from `main` at f62c1b3, one
worktree, one PR. One commit per follow-up (or per plugin inside a
follow-up that spans plugins), each naming the follow-up id in its
subject.
- Every touched plugin gets a patch bump and a CHANGELOG line in the
same commit; versions land strictly above `origin/main`'s current
version at commit time and are renumbered once before the PR if main
overtakes them.
- Per-plugin gates before each commit: `check-skill.sh` on every touched
skill, `check-skill-precompute-compose.sh --paths`,
`check-evals-quality.sh` where evals change, markdownlint, typos, the
`ai-slop` detector; scripts get shellcheck and a co-located test that
runs green on CI's Linux lane.
- The autonomy plugin never names the org, a fleet repository, or a
vendor (`scripts/validate-plugin-contracts.mjs`); its citations get a
link-free convention name, never a marketplace URL.
- Subagents run as Opus 5 with `general-purpose`; at most three
concurrent; every dispatch held while
`~/.claude/rate-limit-guard/rate-limits.json` shows
`five_hour.used_percentage` above 85.
- No `worktree.baseRef` in any settings file
(`.claude/rules/worktree-base-ref.md`).
- ADR 0005 and ADR 0008 stay accepted (operator decision 2026-09-05).

##### Acceptance criteria

Direct fixes, lead:

- F5 residual: `emit-findings.sh` comment and the
`negation-trigger-fence.md` fixture no longer describe check 3 as a
hard-FAIL gate.
- F9: wayfind's pre-compute fails loud (or surfaces the raw value) on a
non-string `container_label`, matching `context/tracker-mechanics.md`.
- F12: no `SKILL.md` carries a `shell:` frontmatter key with no `` !` ``
injection left in the file; `check-skill.sh` check 19 stays green.
- F13: the boris playbook's Model row is qualified "as of the 2026-07-24
sync".
- F16: recorded as closed by main's 39442ff (probe re-verified against
2.1.261); its F6 items move under F6, its test failures under F10.
- F18: `autonomous-pipeline-reminder.md` carries the "do not stop
because the context or session is long" clause in the plugin's own
words.
- F20: one spelling of the neutral provenance tier across `SKILL.md`,
`reference/rubric.md`, `emit-findings.sh`, and its test.
- F22: the ai-briefing setup eval prompts the contract form `apply
install-build-deps`.
- F23: dometrain's `--refresh-baseline` is documented as a
clone-relative command or as safe only under `--plugin-dir`.
- F24: `criteria.md` gains one row per recurring catalog-gap shape
(dated stamp without recheck trigger; migration-relative phrasing in
reference and context files; routing text naming a skill absent from
`plugins/`; sibling-file meta-commentary; maintainer rationale in
model-facing YAML comments).

Mechanism changes, one dispatched implementer each, script plus test
plus the doc wiring:

- F11: `plugins/work-items/scripts/lane-telemetry-upsert.sh` with a
test; both telemetry-upsert references invoke it.
- F15: synced `scripts/compose-statusline-wiring.sh` in context-guard
and rate-limit-guard with the round-trip check inside;
`unwrap-before-compose.md` shrinks to the contract; the arithmetic eval
cases become script tests.
- F17: context-guard setup's four read-only probes run from a `##
Pre-computed context` block that passes
`check-skill-precompute-compose.sh` and the worktree guard's
`$HOME`-only expansion rule.
- F19: byte-identical synced
`plugins/plugin-quality/scripts/context-zone.sh` with test, registry
entry, and `sync-context-zone.sh --check`; the audit gate and
`setup/SKILL.md` call it.
- F21: `plugins/mutation-testing/scripts/suppression-lint.sh` with a
test; setup calls it; setup eval 5 and audit eval 3 retarget to the
script.
- F7: pull-request Gate 5 parameterized on the discovered reviewer
login; vendor shapes moved into a dated reference-shapes note with a
recheck trigger.
- F8: every cross-plugin or marketplace-`docs/` relative citation in
source-control, review, and playbooks converted to the raw-URL form; the
nonexistent probe record citation in `opus-5.md` removed or pointed at a
real file; autonomy's six sites given a link-free convention name.

Audit and verification, dispatched per surface or per plugin:

- F2: the plugin-level `reference/` trees of autonomy, architecture,
performance, playbooks, rate-limit-guard, and context-guard, plus hooks
prompt text, output styles, `.claude/rules`, `CLAUDE.md`, and
`AGENTS.md`, audited with the same brief and applied the same way;
reports under `.work/prompt-audit-follow-ups/reports/`.
- F6: every claim the record lists under F6 (including the per-plugin
additions folded into F10, F11, F14 to F19) carries a date and a recheck
trigger, points at a dated owner record, or is removed; the fleet
gather-block claim gets one dated record on the worktree skill.
- F10: each suite the record lists fails on this Windows host either
passes here after a portable fix or is declared Linux-only in the
runner's own mechanism, with the reason; `scripts/affected-tests.sh
--run` over this branch's diff reports no unexplained failure.

Closing:

- F3 is recorded as not a PR deliverable: behavior measurement runs
through `/claude-config:unhobble` on demand.
- F14: the whole-pack regeneration from Fable 5.1 is recorded as the
maintainers' separate run; its citation and stamp sub-items close under
F8 and F6.
- The record's `## Follow-ups` names the closing commit per item; this
Brief graduates into the record as a `## Follow-up PR` section and the
slice is pruned; the PR body carries the closed ledger and the pre-prune
commit.
- Static gates green: the four `check-changelog-parity.sh` modes,
`check-purged-em-dashes.sh`, repo-wide markdownlint and typos,
`check-skill-precompute-compose.sh --all`, `render-index.sh check --file
AGENTS.md`, `validate-plugin-contracts.mjs`,
`check-contract-slice-prune.sh --check-diff origin/main`, and CI on the
PR.

##### Captured assumptions

- Claude Code 2.1.261 is the harness version claims are verified
against; the bundled `claude-api` prompt-audit guide is unchanged since
the sweep.
- Verification of a harness claim means reading the current official
page (or the CLI's own output) on the day of the stamp; a claim that
cannot be verified from a source is removed, not re-asserted.

##### Out-of-scope

- Regenerating the playbooks pack from Fable 5.1 (F14's larger call) and
running behavior measurement (F3).
- Retiring ADR 0005 or ADR 0008.

##### Deferred questions

- None; the ADR question was decided 2026-09-05 (both stay accepted).

#### Plan

Phase A (lead, direct): F22, F23, F9, F20, F13, F18, F5 residual, F24,
F12, F16 bookkeeping.
Phase B (dispatched implementers, three at a time): F11, F15, F21, then
F19, F17, F7, F8.
Phase C (dispatched auditors and verifiers): F2 surfaces, F6 per plugin
group, F10 per suite cluster.
Phase D (lead): record ledger, version renumber against current main,
Brief graduation and prune, gates, PR.

</details>

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01S1Vu8qA5MKiSnXrWMEdbFW

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Claude Fable 5.1 <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