Corrections Audit Skill
SkillDev toolsUse to analyze correction trends, surface recurring patterns, and graduate repeat corrections to guardrails or anti-patterns.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Corrections Audit Skill skill
What this skill tells your AI
The instructions your AI receives, as published by haabe/mycelium in plugins/mycelium/skills/corrections-audit/SKILL.md and read by ahel’s review.
Analyze corrections.md for trends, recurring patterns, and actionable insights.
Attribution: run the script, do not count by hand
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/check_correction_attribution.py" --root . --snapshot
Added 2026-08-03. This audit's headline number — who caught the mistake — was computed by hand and had been produced exactly twice, six weeks apart, each time because a human remembered to look. It is the only number that answers the question the correction loop exists to answer: more harness, or more context.
The script reports the escape rate and its denominator, every time. At the
time of writing 14 of 72 entries carry a catcher, so the rate covers 19% of the
corpus — quoting it without that is a claim about the whole wearing borrowed
clothes, which is the failure this repo spent 2026-08-02/03 removing from its own
checks. If it prints NO RATE AVAILABLE, that is not 0%: it means nothing in the
corpus says who caught anything.
--snapshot appends the reading to .claude/evals/metrics/corrections/<date>.json, the same layout the other metric adapters use. The level is not the signal. Trend caught_by_hook_or_check rising in absolute terms; the ratio can also be improved by logging fewer user-caught mistakes, which is why this script never gates on it.
Attribution is a HARD RULE at write time, not a suggestion — see engine/agent-operating-contract.md. It was advisory until 2026-08-03 and 72 of 100 entries carry no catcher as a result. Do not backfill those in bulk: who caught a mistake six weeks ago is not recoverable by inference, and a guessed catcher corrupts the only number this loop produces.
For entries written before the rule, add one phrase per new entry — caught by user,
caught by hook, caught by review, self-caught. The parser reads the prose
forms already present rather than requiring a new field, so nothing existing
needs rewriting.
When to Use
- Loop 2 (Incremental) cadence: after every 3+ corrections are logged
- When the same correction category appears 3+ times
- During
/mycelium:diamond-assessif corrections gate has findings - Before starting a new diamond at the same scale as a previously corrected one
Workflow
-
Load corrections AND warnings AND clusters: Read
.claude/memory/corrections.md,.claude/memory/warnings-log.md, AND.claude/memory/cluster-instances.md(the cluster log graduated 2026-05-08 — canonical record of recurring-pattern instances and their graduation status; without it, "the cluster has graduated N times" has no auditable backing).- If corrections + warnings both empty AND no clusters logged: report "No corrections, warnings, or clusters to audit" and stop
- Treat all three as inputs to the same pattern analysis. Corrections capture agent-introduced failures; warnings capture framework-state debt; cluster-instances capture cross-cluster pattern accumulation with explicit graduation criteria. Same recurring-pattern shape, different vantage points.
-
Categorize by frequency:
- Group corrections by
Category(bias, security, engineering, process, communication) - Group by
Scope(discovery, delivery, orchestration, quality) - Count occurrences per group
- Group corrections by
-
Detect recurring patterns:
- Same category appears 3+ times -> candidate for guardrail graduation
- Same scope appears 3+ times -> candidate for domain-level CLAUDE.md update
- Same mistake repeats after prevention was documented -> prevention strategy failed, needs escalation
-
Check origin distribution (APEX alignment):
- Count corrections by
Origin(ai-generated, human-written, ai-assisted) - If ai-generated corrections dominate (>60%): flag for prompt/context improvement, BUT see
detection_origincross-check below before acting on this interpretation - If human-written corrections dominate (>60%): flag for process/training improvement
- If ai-assisted is high: check if the AI contribution or the human contribution caused the issue
- Count corrections by
4b. Cross-check with detection_origin (when field is present — see .claude/memory/README.md):
- Count corrections by
Detection_originif present (user / agent_self / hook / evaluator / eval_runner / external_review) - Critical disambiguation: if Origin is heavily ai-generated AND detection_origin is heavily
user, the apparent AI-quality signal is actually a HARNESS-DETECTION GAP. The AI is generating failures and the user is the only entity catching them. The right intervention is more harness checks (hooks, evaluators), NOT more AI context. - If detection_origin is dominantly
user(>70%): flag for harness-detection gap. Suggest where new hooks or evaluators could catch the failure modes earlier. - If detection_origin is well-distributed across mechanisms: harness coverage is healthy; trust the Origin signal at face value.
- Surfaced 2026-05-03 (mycelium-roadmap dogfood): without this cross-check, the audit's "100% ai-generated → improve prompt context" framing would have driven the wrong intervention. Real signal was "AI generates, user catches" — fixed by shipping the framework-guard hook (harness-detection layer), not by improving prompts.
-
Root-cause recurring corrections (5 Whys): For each correction that appears 3+ times, apply 5 Whys to find the systemic root:
- Why did this happen? -> Why did that happen? -> ... -> [systemic root cause]
- Stop when you reach something changeable: a guardrail, gate, process step, or prompt instruction
- Anti-pattern: stopping at "human error" or "agent didn't follow instructions" — ask why the system allowed it Source: Toyoda/Ohno (5 Whys), adapted for agentic workflows.
-
Identify graduation candidates (across corrections, warnings, AND cluster-instances):
- Correction logged 3+ times with same root cause -> propose new guardrail (draft G-XX entry) AND ensure a cluster-instances.md entry exists for the pattern
- Warning class with
Count: 3+andStatus: openin.claude/memory/warnings-log.md-> graduation candidate. Consult${CLAUDE_PLUGIN_ROOT}/engine/warning-handbook.mdfor the canonical fix; if the canonical fix is "manifest-driven" or similar structural pattern that's already shipped, the recurrence indicates a regression, not a new pattern. - Correction reveals a failure mode not in ${CLAUDE_PLUGIN_ROOT}/harness/anti-patterns.md -> propose new anti-pattern entry
- Correction reveals a successful mitigation -> propose new pattern in patterns.md
- Cross-cluster patterns: when corrections + warnings together reveal the same shape (e.g., "documented rule diverges from enforcement" — fired both via validator gaps in warnings-log AND via agent-behavior corrections), graduate to a meta-pattern in patterns.md and consider whether one upstream mechanism could close both surfaces.
6b. Cluster-instance audit (graduated 2026-05-08):
For each entry in cluster-instances.md:
- Update instance count: if any correction logged since the last audit fits an existing cluster's shape, increment that cluster's instance count and add a row to its instance log. If the shape is new and recurs (≥2 candidates), propose a new cluster section.
- Check graduation criterion: each cluster has a stated graduation criterion (e.g., "≥3 instances, ≥3 detection rules validated, <5% FP"). If a cluster has crossed its criterion without being graduated, flag it as a graduation-readiness signal.
- Cross-reference spec docs: if a cluster has a
specgraduation status (e.g., "documented-rule-diverges-from-enforcement" →${CLAUDE_PLUGIN_ROOT}/engine/consistency-check-spec.md), check whether new instances introduce subclass shapes the spec hasn't yet considered. New subclasses extend the spec; recurring known subclasses just increment the count. - Surface mis-counted clusters: a recurring failure mode silently accumulating without a cluster entry IS the harness-context-debt the cluster log was created to scope. If you find correction patterns that should have been counted but weren't, propose backfill entries.
- Recursive check: a cluster's graduation criterion not being honored is itself an instance of the documented-rule-diverges-from-enforcement cluster. If you detect this, log it as a new instance of that cluster (with appropriate eyebrow-raising in the report).
6c. Scan docs/receipts/cases/ frontmatter for graduation signals (added 2026-05-08 with the docs restructure):
For each case file in docs/receipts/cases/*.md:
- Parse YAML frontmatter (
id,date,contributor,mechanism_or_status,commits,subclass). - Cross-reference with
cluster-instances.md: if the case'ssubclassfield names a known cluster, ensure the cluster's instance count includes this case. If the case is the first instance of a recurring shape that has no cluster entry, propose a new cluster. - Detect mechanism-or-status patterns: if multiple cases share a
mechanism_or_status: in-progressand the underlying friction recurs, that is a graduation-readiness signal — the partial fix has not converged. If multiple cases sharemechanism_or_status: one-off, check whether they actually share a root-cause shape that warrants graduation to a cluster. - Report contributor distribution: which contributors produce the most receipts? Solo internal-dogfood receipts are valid but the framework's claim of community-shaped feedback weakens if external_human contributor cases are sparse. Flag if external receipts < internal receipts × 0.2 across the last 90 days.
- Identify candidate-graduation cases: a
mechanism_or_status: specthat has been at spec ≥30 days without a promotion-bar update is a stalled-spec signal worth surfacing. The frontmatter exists specifically so this audit step can detect graduations from cases without parsing prose. Seedocs/contributing/style.md#receipts-case-file-frontmatter.
6d. Consistency-as-evidence pattern detection (added 2026-05-09 with the anti-pattern graduation):
Scan corrections.md entries for the Consistency-as-Evidence signature:
- Mistake involves a generalization (claim of structural significance, "this means", "this generalizes to")
- At least one piece of supporting evidence in the entry's mistake or correction sections is consistency-only (the data is compatible with the hypothesis but the cause was not isolated)
- User intervention caught the failure post-publication, not the agent pre-publication
If 3+ instances within a rolling 90-day window: surface as graduation-confirmed (the anti-pattern Consistency-as-Evidence in
${CLAUDE_PLUGIN_ROOT}/harness/anti-patterns.md#7). If the pattern recurs after graduation, that's a signal the prevention layer needs strengthening (e.g., harden Technique 4 in/devils-advocatefrom skill-time check to ambient hook).
6e. Stale-state-read pattern detection (added 2026-05-09 with the anti-pattern graduation):
Scan corrections.md for the Stale State Read signature:
- Mistake involves a script, validator, or check producing nominally-correct output against an outdated reference
- Root cause: read default was hardcoded local path without explicit-source override, OR a sync flow read pre-replacement state
- Same epistemic shape as anti-pattern #8 in
${CLAUDE_PLUGIN_ROOT}/harness/anti-patterns.mdTrack instance count. The 5th instance graduates the prevention layer beyond the existingparse_manifest.py --manifest=<path>worked example: scan the codebase viavalidate-template.shCheck 29 for state-reading scripts that lack explicit-source parameters. Until then, the anti-pattern entry is the primary defense.
-
Consolidate memory files (automated hygiene):
- Deduplication: Identify corrections that describe the same root cause in different words. Merge into a single entry, preserving all dates and evidence.
- Contradiction detection: Flag corrections that contradict each other (e.g., "always use X" vs "never use X"). Present conflicts to the user for resolution.
- Staleness removal: Corrections older than 6 months whose prevention has been verified effective (no recurrence) can be archived to
.claude/memory/corrections-archive.md. - Size cap: If corrections.md exceeds 50 entries, consolidate the oldest resolved entries into a summary paragraph in the archive.
- Apply the same consolidation to
.claude/memory/patterns.md. Inspired by: greyhaven-ai/autocontext curator agent — periodic dedup, cap, and contradiction removal.
-
Update TL;DR section:
- Regenerate the TL;DR in corrections.md with the top 5 most impactful corrections
- Impact = frequency x severity (blocking vs. quality vs. cosmetic)
-
Recommend actions:
- For each graduation candidate: specific guardrail text, tier, and constraint type
- For failed preventions: what went wrong and what stronger mechanism to use
- For origin imbalances: specific context improvements
Output Format
## Corrections Audit
### Summary
Total corrections: [N]
Period: [earliest date] to [latest date]
### Frequency Analysis
| Category | Count | Trend |
|----------|-------|-------|
| engineering | 3 | rising |
| bias | 1 | stable |
### Origin Distribution
| Origin | Count | % |
|--------|-------|---|
| ai-generated | 4 | 57% |
| human-written | 2 | 29% |
| ai-assisted | 1 | 14% |
### Recurring Patterns
- [Pattern description]: [N] occurrences -> [recommendation]
### Cluster Status (from cluster-instances.md)
| Cluster | Instances | Status | Graduation criterion | Notes |
|---|---|---|---|---|
| documented-rule-diverges-from-enforcement | 8 | spec | ≥3 detection rules validated, <5% FP | Spec at ${CLAUDE_PLUGIN_ROOT}/engine/consistency-check-spec.md (graduated 2026-05-08) |
### Graduation Candidates
1. [Correction pattern] -> Proposed guardrail: G-XX "[text]" `[TIER]` `[type]`
2. [Cluster X reaching its graduation criterion] -> Proposed promotion from <current_status> to <next_status>: <action>
### Failed Preventions
- [Correction] was logged again despite prevention "[strategy]" -> [escalation]
### TL;DR Update
[Updated summary for corrections.md TL;DR section]
Prior findings first (added v0.96.0)
Before producing new findings, rule on the previous run's — per ${CLAUDE_PLUGIN_ROOT}/engine/canvas-guidance.yml#prior_findings_first. For each: CLOSED (name what closed it), STILL-OPEN (carry it forward with a horizon), or DECLINED (a reason AND a re-open trigger). If there is no prior run, say so and continue.
Scoring goes first because it is the boring half. A periodic instrument that produces findings and never scores its old ones accumulates a ranking nobody reads — theory-audit-2026-04-17.md ranked its gaps correctly and sat unconsumed for four months. Anything placed after the interesting work is what a long session drops.
A finding ranked HIGH must leave this skill with a home — tag or create an opportunity on the framework-side root of the OST (opportunities.yml, rolls_up_to), or decline it with a re-open trigger. Scoring alone does not close the loop: it fires only when someone runs this skill again, so on a slow cadence findings still sleep. An opportunity is read by instruments on their own schedule. Not human-tasks.yml — that canvas is scoped to offline HUMAN work (interviews, outreach), and an engineering finding filed there is a category error.
Theory Citations
- Mycelium internal learning loop
- APEX framework (origin-aware quality tracking)
- Senge: systems thinking (recurring patterns signal structural issues)
Signals
- GitHub stars
- 45
- Forks
- 3
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
corrections-audit- Source
- github.com/haabe/mycelium