Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Turn the evidence of a finished work session — git commits, changed files, recently-touched seeds issues — into well-formed `ml record` invocations. Use at session close, when an agent has made changes worth preserving as mulch expertise but hasn't yet recorded them.
.claude/skills/jayminwest-mulch-record-from-evidence/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 56% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 73% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 44% | 0% |
Use this skill when you have just finished a chunk of work in the mulch repo and need to preserve the durable insights as mulch expertise. It converts concrete evidence — what you changed, why, and what broke along the way — into precise ml record calls, instead of inventing ritual filler records. Unrecorded learnings are lost; vague records are noise. The goal is a small number of high-signal records, each backed by real evidence.
Skip recording entirely if the session produced no durable insight: a trivial typo fix, a dependency bump with no behavioral change, or a revert. A record that just restates the diff is noise. Only record a convention, pattern, decision, or failure that a future agent would benefit from knowing before touching the same area.
Confirm you are at the mulch repo root and the store is healthy:
bashml status # per-domain health + record counts ml doctor # exits 0 when records are intact
If ml doctor reports problems, fix the store first (see RUNBOOK.md §4) — do not record on top of a corrupt JSONL.
Let mulch tell you what changed and which domains are implicated:
bashml learn # changed files + suggested domains git status # uncommitted work git diff --stat HEAD~1 # what the last commit touched git log --oneline -5 # recent commit subjects
If the work maps to a tracker, pull its context too:
bashsd show <issue-id> # the seeds issue you were working
Write down, for each insight candidate: what you learned, which file or subsystem it concerns, and what evidence supports it (a commit sha, a changed file, a failing test you fixed).
For every insight worth keeping, decide:
.mulch/expertise/<domain>.jsonl it belongs to.Run ml status to see existing domains; match the subsystem you touched (e.g. CLI behavior → cli, test infra → testing, type conventions → typescript). Respect the project's per-domain allowed_types rules printed at the top of ml prime — a domain may only accept certain types.
convention (a rule to follow), pattern (a reusableapproach that worked), decision (a choice made and its rationale), failure (something that broke and how it was resolved), reference (an external fact/link), or guide (a procedure). Custom project types (e.g. flake_symptom, release_decision) carry extra required fields — ml record will tell you which.
foundational (permanent truth),tactical (relevant ~14 days), observational (relevant ~30 days). Default to the shortest shelf life that fits; only mark foundational when the insight is a lasting invariant.
ml record callsRun one ml record per insight. Evidence auto-populates from the current git commit and changed files; link explicitly when you can:
bashml record cli --type convention \ --description "ml ready/prime/compact reject non-integer --limit/--budget with exit 1; each command inlines its own parseStrictPositiveInt rather than sharing a util" \ --evidence-seeds <issue-id>
Useful evidence flags:
--evidence-seeds <id> / --evidence-gh <id> — link a tracker.--evidence-commit <sha> — pin a specific commit.--relates-to <mx-id> — link a related mulch record.Naming a record (a stable identity) makes a re-record merge outcomes into the existing entry instead of appending a duplicate — prefer this when you are refining an insight you recorded before. If validation fails, mulch prints a copy-paste retry hint with the missing required fields pre-filled; fill them in and re-run.
bashml validate # confirm every new record is well-formed ml prime <domain> # eyeball that the new record reads cleanly ml sync # validate, stage, and commit .mulch/
Do not git push unless the user asks — leave the commit local.
The skill is complete when all hold:
record (no duplicates, no filler).
ml validate exits 0.ml prime <domain> shows the new record(s) with sensibledomain/type/classification.
ml sync has committed the .mulch/ change; git status is clean.| Symptom | Likely cause | Remedy | |---------|--------------|--------| | ml record rejects --type for a domain | The domain's allowed_types doesn't permit that type. | Pick an allowed type (check the contract at the top of ml prime), or record under a different domain. | | Validation error about a missing field | A custom type requires extra fields. | Re-run with the fields from the printed retry hint. | | Two near-identical records appear | Recorded anonymously twice instead of naming the record. | Name the record so re-records merge; remove the duplicate with ml delete <id>. | | ml sync reports an unknown type | Config declaring the custom type hasn't merged yet. | Wait for config to land, or re-run after merging; sync intentionally ignores --allow-unknown-types. |
AGENTS.md — repo-wide conventions and the agent workflow.CLAUDE.md — record types, classifications, and the registry layer.CONFIG.md — .mulch/mulch.config.yaml reference (domains, customtypes, hooks).
RUNBOOK.md — operational procedures, including debugging a brokenstore.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | fail→fail | 6,403 | 5,182 | -19% | 1 | 1 | 0% | 210 | 1,648 | +685% | 0 | 0 | — |
case-01 | fail→fail | 4,804 | 4,065 | -15% | 1 | 1 | 0% | 172 | 1,610 | +836% | 0 | 0 | — |
case-02 | fail→fail | 4,493 | 5,108 | +14% | 1 | 1 | 0% | 227 | 1,639 | +622% | 0 | 0 | — |
case-09 | fail→pass | 11,665 | 4,633 | -60% | 1 | 1 | 0% | 1,949 | 2,187 | +12% | 0 | 0 | — |
case-04 | pass→fail | 7,449 | 5,118 | -31% | 1 | 1 | 0% | 1,112 | 1,719 | +55% | 0 | 0 | — |
case-05 | pass→pass | 7,948 | 2,384 | -70% | 1 | 1 | 0% | 1,191 | 1,741 | +46% | 0 | 0 | — |
case-06 | fail→pass | 9,268 | 5,124 | -45% | 1 | 1 | 0% | 1,372 | 2,147 | +56% | 0 | 0 | — |
case-07 | pass→pass | 6,556 | 2,451 | -63% | 1 | 1 | 0% | 1,135 | 1,823 | +61% | 0 | 0 | — |
case-08 | fail→pass | 6,845 | 1,826 | -73% | 1 | 1 | 0% | 1,146 | 1,620 | +41% | 0 | 0 | — |
case-10 | fail→pass | 8,203 | 5,089 | -38% | 1 | 1 | 0% | 1,348 | 2,328 | +73% | 0 | 0 | — |
case-11 | pass→pass | 5,316 | 2,009 | -62% | 1 | 1 | 0% | 759 | 1,754 | +131% | 0 | 0 | — |
case-12 | pass→pass | 11,137 | 1,924 | -83% | 1 | 1 | 0% | 1,750 | 1,712 | -2% | 0 | 0 | — |
case-13 | fail→pass | 10,258 | 5,028 | -51% | 1 | 1 | 0% | 1,571 | 2,258 | +44% | 0 | 0 | — |
case-14 | fail→pass | 8,233 | 1,711 | -79% | 1 | 1 | 0% | 1,379 | 1,678 | +22% | 0 | 0 | — |
case-15 | fail→pass | 12,939 | 1,755 | -86% | 1 | 1 | 0% | 2,167 | 1,662 | -23% | 0 | 0 | — |
case-16 | fail→pass | 16,468 | 1,887 | -89% | 1 | 1 | 0% | 2,789 | 1,684 | -40% | 0 | 0 | — |
case-17 | fail→pass | 7,846 | 1,608 | -80% | 1 | 1 | 0% | 1,294 | 1,669 | +29% | 0 | 0 | — |
case-18 | fail→pass | 8,111 | 2,330 | -71% | 1 | 1 | 0% | 1,411 | 1,781 | +26% | 0 | 0 | — |
case-19 | pass→pass | 9,389 | 1,792 | -81% | 1 | 1 | 0% | 1,454 | 1,672 | +15% | 0 | 0 | — |
case-20 | fail→pass | 4,687 | 1,453 | -69% | 1 | 1 | 0% | 754 | 1,581 | +110% | 0 | 0 | — |
case-21 | fail→pass | 7,887 | 1,648 | -79% | 1 | 1 | 0% | 1,199 | 1,620 | +35% | 0 | 0 | — |
case-22 | pass→pass | 9,577 | 6,274 | -34% | 1 | 1 | 0% | 1,550 | 2,414 | +56% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +50 percentage points is the difference between those two pass rates over the 18 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.