Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when the user explicitly asks to inspect past Codex or Claude Code sessions, runs, or chats from a specific time range and extract reusable upgrades (skills to codify, memories to pin, or strategy-shaped findings that can be represented as skills or memories). Also invoked by the auto-optimizer scheduler to produce structured JSON suggestions for the Auto-optimization route.
.claude/skills/getcrew44-session-skill-mining/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-15 | ✗→✓ | ▲ Improved | 380% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 137% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 741% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 302% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 349% | 0% |
Review AI coding sessions, run metadata, and edit history from an explicit time range and identify two kinds of upgrades:
Strategy-shaped findings are still in scope: routing, scheduling, agent shape, cost, queueing, and role-boundary patterns. Do not emit a separate strategy kind. Map them to:
The auto-optimizer (Auto optimization route in Crew44) invokes this skill on a schedule and parses the JSON block from your response. When invoked manually by the user, emit both the readable summary and the JSON so the user can see what would be persisted.
You are judged on signal-to-noise, not volume. Default to NOT surfacing. An empty suggestions array is a valid and often correct response. If a candidate does not clearly clear the bar below, drop it.
The cost of a false positive is high: the user has to read, judge, and reject it, and a single weak suggestion poisons trust in the entire scan. The cost of a missed signal is low: the same pattern will fire again next week if it is real.
grep, find, or reading one existing file in the project teaches the same lesson, the candidate is redundant with code. Code is the source of truth; do not duplicate it into prose.kind: documentation for a code comment instead.CLAUDE.md, AGENTS.md, README.md, package.json scripts, design docs, or a SKILL.md you already have.kind: documentation or just discard; do not dress it up as a memory or skill.evidence.runs and a short human-readable span in evidence.windows. Recurrence across multiple sessions strengthens the case, but a single session that produces a crystallized procedure (for skills) or a single explicit user statement with a stated reason (for memories) is enough on its own.main.cjs + preload.js + renderer." → Framework boilerplate documented in Electron's own quickstart. Any existing IPC handler in the repo teaches this in 30 seconds. Reject.scrollTop and use overflow:hidden." → Bug post-mortem. Both fixes are already merged. The invariants belong as a code comment in the component file or as a refactor that makes the failure impossible. Reject — or propose a documentation candidate that adds the comment to the source file.tsconfig.json and the file extensions in the repo. Reject.npm install at the repo root — it produces a package-lock.json that breaks the workspace resolver." Non-obvious, repeatedly rediscovered, not in framework docs, and cannot live in code (the fix is "don't run a command," not a code change).strategy result.skill, memory) and the threshold (all/med/high). Respect both: do not emit candidates for disabled surfaces, and drop candidates below the threshold.Default locations:
$CODEX_HOME/sessions/**/*.jsonl, usually ~/.codex/sessions/**/*.jsonl.$CODEX_HOME/archived_sessions/**, if present.$CLAUDE_CONFIG_DIR/projects/**/*.jsonl, usually ~/.claude/projects/**/*.jsonl.Timestamps are usually ISO-8601 UTC in each JSONL record. Normalize the user's requested range to exact start and end datetimes, including timezone. If the user gives only dates, interpret the range as local-time full days.
If the finding is a reusable decision process, classify it as skill. If it is a durable fact or constraint, classify it as memory-project or memory-user.
memory-project):memory-user):skill: one reusable procedure inside an existing role;memory-project: durable project knowledge worth injecting into future project sessions;memory-user: durable user preference or habit worth injecting across projects;documentation: knowledge should live in project docs, not Crew44 configuration;discard: too narrow, stale, sensitive, or one-off.Use equivalent tools when direct shell access is unavailable.
shfind "${CODEX_HOME:-$HOME/.codex}/sessions" -name '*.jsonl' -print find "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/projects" -name '*.jsonl' -print
For large ranges, avoid printing full transcripts. Extract compact fields with jq or a small script, then inspect only promising sessions.
When inspecting SQLite or JSONL indexes, keep every command bounded:
LIMIT.substr(title,1,120), substr(first_user_message,1,240), length(first_user_message).select * or print full transcript/tool-output/blob columns.Start with coverage:
Then list candidate skills:
name: short kebab-case proposal;trigger: when the skill should be used;reusable core: the workflow or knowledge to preserve;source signal: note whether this came from workflow repetition, memory rediscovery, or strategy-shaped evidence such as routing/scheduling/cost/role-boundary friction;evidence: 1-3 session references with timestamps, session id, project/cwd basename, and paraphrased rationale;confidence: high, medium, or low;recommendation: create, merge into existing skill, document elsewhere, or discard.Then list candidate memories:
scope: memory-project or memory-user;durable fact: the exact project fact, user preference, or user habit to preserve;source signal: note whether this came from explicit user instruction, repeated rediscovery, or strategy-shaped evidence such as routing/scheduling/cost/role-boundary friction;evidence: 1-3 session references with timestamps, session id, project/cwd basename, and paraphrased rationale;confidence: high, medium, or low;recommendation: pin as memory, document elsewhere, or discard.When you find a strategy-shaped signal, do not create a separate strategy section. Put it in candidate skills if it is a reusable procedure, or candidate memories if it is durable context.
When useful, include a compact draft:
markdown--- name: proposed-skill-name description: Use when ... --- # Proposed Skill Name ## Steps 1. ...
Reply with a short plain-English summary the user can skim, then a single fenced JSON block. The block must match the schema below; the daemon parses it. If you cannot produce valid JSON, do not invent it — emit an empty suggestions array instead.
json{ "schema_version": 1, "scan_summary": { "window": "2026-05-06..2026-05-13", "runs_analyzed": 142 }, "suggestions": [ { "id": "k-1", "kind": "skill", "priority": "high", "title": "Bundle the 6-step locale video prep into a skill", "body": "Milo runs the same prep ritual before every doubao-tts job: check 16:9 crop, normalize audio to -14 LUFS, name subtitles {locale}.vtt, copy to /out/locale/, verify duration <= 90s, log to ledger. Five runs in 8 days, near-identical.", "impact": "-4m/run", "evidence": { "runs": ["t-091","t-088","t-082"], "windows": ["5 runs, 8d window"] }, "preview": { "type": "skill", "name": "locale-video-prep", "lines": [ "# locale-video-prep", "", "Required reading before any locale promo render.", "", "## Steps", "1. Verify aspect ratio is 16:9 (crop, do not pad).", "2. Normalize audio to -14 LUFS." ] } }, { "id": "m-1", "kind": "memory-project", "priority": "high", "title": "This repo uses pnpm workspaces; npm install breaks it", "body": "Three lockfile-recovery sessions in the last week. Worth pinning so no agent runs npm install at the repo root again.", "impact": "Prevents 10m/slip", "evidence": { "runs": ["t-114","t-112","t-109"], "windows": ["3 lockfile-recovery sessions"] }, "preview": { "type": "memory", "scope": "crew44", "scope_id": "PASTE-PROJECT-UUID-HERE", "text": "Project uses pnpm workspaces. Never run npm install at the repo root." } }, { "id": "u-1", "kind": "memory-user", "priority": "med", "title": "Jordan prefers em-dashes over semicolons in copy", "body": "Across 7 copy reviews, you replaced 19 of 21 agent-written semicolons with em-dashes.", "impact": "Style fit", "evidence": { "runs": ["t-114","t-082"], "windows": ["7 copy reviews, 14d"] }, "preview": { "type": "memory", "scope": "Jordan", "text": "In copy, prefer em-dashes over semicolons." } } ] }
schema_version: always 1.id: short kebab/letter hint (k-1, m-1, u-1). The daemon rewrites this to <scan_id>:<hint> server-side, so hints do not need to be globally unique.kind: one of skill, memory-project, memory-user. Do not emit strategy.priority: high for clear wins, med for likely wins, low for speculation. Drop low if the prompt's threshold is med or high.title: one line, lead with what the user gains.body: 1-3 sentences, name the pattern and the cost of not fixing it.impact: short chip text (-4m/run, +22% throughput, Prevents 10m/slip, Style fit).evidence.runs: chat or turn IDs you can quote. evidence.windows: short human-readable spans.preview.type follows kind:skill → type: "skill", set name (kebab-case), lines is the SKILL.md body.memory-project → type: "memory", set scope (project display name), scope_id (project UUID), text (the one-line bullet to append).memory-user → type: "memory", set scope (user display name), text. Omit scope_id.The auto-optimizer's scan prompt lists which surfaces are enabled and the priority threshold. If surfaces.memory=false you must skip both memory-project and memory-user. Do not emit strategy candidates. If threshold=high you must skip med and low candidates. The daemon also re-validates server-side; emitting filtered candidates wastes tokens but does not harm the system.
For every candidate you are about to include, walk through this checklist. If any answer is "no" or "yes (for the wrong column)," drop the candidate.
body name why it matters (an incident, a constraint, a measurable lift) — not just what the pattern is? If no → rewrite or drop.A scan that emits 0–2 strong suggestions per week beats a scan that emits 5 weak ones. The user trusts the next scan based on the worst suggestion in this one.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | pass→fail | 11,357 | 8,784 | -23% | 1 | 1 | 0% | 2,222 | 6,516 | +193% | 0 | 0 | — |
case-15 | fail→pass | 8,352 | 9,155 | +10% | 1 | 1 | 0% | 1,405 | 6,744 | +380% | 0 | 0 | — |
case-01 | fail→fail | 14,238 | 14,888 | +5% | 1 | 1 | 0% | 2,421 | 5,679 | +135% | 0 | 0 | — |
case-02 | fail→fail | 11,235 | 6,711 | -40% | 1 | 1 | 0% | 1,782 | 5,375 | +202% | 0 | 0 | — |
case-03 | fail→fail | 12,033 | 6,576 | -45% | 1 | 1 | 0% | 2,253 | 5,408 | +140% | 0 | 0 | — |
case-04 | pass→pass | 7,754 | 9,287 | +20% | 1 | 1 | 0% | 1,172 | 6,612 | +464% | 0 | 0 | — |
case-06 | pass→pass | 7,579 | 13,420 | +77% | 1 | 1 | 0% | 338 | 7,186 | +2026% | 0 | 0 | — |
case-07 | fail→pass | 19,996 | 10,154 | -49% | 1 | 1 | 0% | 2,899 | 6,876 | +137% | 0 | 0 | — |
case-08 | fail→pass | 4,622 | 8,766 | +90% | 1 | 1 | 0% | 787 | 6,619 | +741% | 0 | 0 | — |
case-09 | fail→pass | 10,200 | 5,509 | -46% | 1 | 1 | 0% | 1,490 | 5,988 | +302% | 0 | 0 | — |
case-10 | fail→pass | 7,697 | 6,248 | -19% | 1 | 1 | 0% | 1,372 | 6,162 | +349% | 0 | 0 | — |
case-11 | fail→pass | 7,307 | 9,435 | +29% | 1 | 1 | 0% | 1,308 | 6,783 | +419% | 0 | 0 | — |
case-12 | fail→pass | 5,767 | 7,770 | +35% | 1 | 1 | 0% | 1,084 | 6,486 | +498% | 0 | 0 | — |
case-13 | fail→pass | 4,452 | 6,314 | +42% | 1 | 1 | 0% | 894 | 6,251 | +599% | 0 | 0 | — |
case-14 | fail→pass | 5,020 | 7,732 | +54% | 1 | 1 | 0% | 888 | 6,428 | +624% | 0 | 0 | — |
case-16 | fail→pass | 9,507 | 7,390 | -22% | 1 | 1 | 0% | 1,541 | 6,237 | +305% | 0 | 0 | — |
case-17 | fail→pass | 12,226 | 8,471 | -31% | 1 | 1 | 0% | 2,323 | 6,798 | +193% | 0 | 0 | — |
case-18 | fail→pass | 7,085 | 3,726 | -47% | 1 | 1 | 0% | 1,373 | 5,701 | +315% | 0 | 0 | — |
case-19 | fail→pass | 7,658 | 6,257 | -18% | 1 | 1 | 0% | 1,380 | 6,224 | +351% | 0 | 0 | — |
case-20 | fail→pass | 6,655 | 4,634 | -30% | 1 | 1 | 0% | 1,179 | 5,768 | +389% | 0 | 0 | — |
case-21 | fail→fail | 13,287 | 5,484 | -59% | 1 | 1 | 0% | 2,035 | 6,008 | +195% | 0 | 0 | — |
case-22 | fail→fail | 12,103 | 5,838 | -52% | 1 | 1 | 0% | 1,630 | 5,950 | +265% | 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 19 counted toward the lift figure. The other 3 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 +59 percentage points is the difference between those two pass rates over the 19 comparable cases. 2 cases got worse with the skill loaded, and they are 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.