Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when working in the cc-safety-net repo to find non-obvious simplification candidates: dead, duplicated, speculative, over-built, or contract-exceeding surfaces in the analyzer, rules, guards, integrations, CLI, or GUI. Produces evidence-backed proposals for the maintainer, not a pile of guesses.
.claude/skills/kenryu42-ccsn-find-simplifications/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 62% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 132% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 103% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 144% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 85% | 0% |
This skill turns a broad "find things to simplify" request into evidence-backed candidates that remove or collapse existing surface area. It is guidance, not a checklist: follow the code, keep judgment active, and prefer a few well-proven candidates over many thin ones.
Over-engineering is this repo's documented dominant failure mode (see Scope Discipline in AGENTS.md), so simplification proposals have a tailwind — but the same discipline applies to the proposals themselves: each one must name the concrete cost the current code carries, not just "this looks complex."
AGENTS.md (Scope Discipline, Testing, Style Guide, Knip rules), REVIEW.md (threat model and review boundary), and SECURITY.md (the standard/strict/paranoid mode contract).docs/residual-risk.md before judging anything in src/core/shell, src/gate/analyzer, src/gate/guards, or src/core/rules. Adjudicated bypass families are settled decisions; fixtures pinning them are load-bearing even when nothing else references them. Read docs/secret-protection-known-limitations.md before judging src/gate/secret.REVIEW.md forbids adding it, which makes any existing instance a prime simplification candidate. Conversely, fail-closed machinery in strict/paranoid is contract, not bloat.src/hosts (amp, claude-code, codex, cursor, pi, and the rest). Each exists because a real host tool needs it; propose deleting one only if the user says the host is dropped. Removing an unused hook, command, or method inside one is still fair game, and so is folding duplication into the shared host machinery (src/hosts/detect, src/hosts/install, src/hosts/hook, src/hosts/templates) when no host's enforcement weakens.docs/residual-risk-registry.json + docs/residual-risk.md) and the strict/paranoid fail-closed fixtures that back its families.tests/gate/behavioral-contract-cases.ts, tests/gate/pipeline-contract-cases.ts, and the hand-edited verdict table tests/fixtures/gate/harvested-verdicts.jsonl. Per AGENTS.md, a row there is a stated expectation, not a recording; a proposal that needs a row flipped must name the row and argue the flip on contract grounds. The two snapshot surfaces (explain in tests/cli/explain, doctor --json in tests/cli/doctor) are byte contracts, not incidental output.src/core/io for an npm package; a new dependency is a maintainer decision to propose separately, never a "low effort" cleanup.src/rules-manager/resource-limits.ts) and the parser's exhaustion budgets. SECURITY.md publishes their numbers; they are contract.A strong simplification removes, folds, or demotes something real, with evidence the current design costs more than it buys:
src/entries/api.ts), configuration, policy knobs, and CLI or GUI features, require contract or deprecation evidence; repository-local absence cannot prove that external users do not depend on them.src/core/shell/model.ts and re-derived in the analyzer, a fact computed in src/gate/facts.ts and again in a guard, or parallel per-host code that could share one path without weakening any host's enforcement). Note that bun run check already gates textual duplication via jscpd — focus on structural duplication it cannot see.REVIEW.md that belongs to strict/paranoid fail-closed handling or documented residual risk, not emulation code.Thin candidates are not enough: one typo, a single knip run, "this looks complex" without call-site proof, or anything whose removal would create a false negative for recognizable danger in standard mode.
Use parallel subagents when the user asks for breadth. Give each a domain and require evidence, not guesses:
src/core/shell): normalization passes, node kinds, fields nothing downstream reads.src/gate/analyzer, src/core/rules): rule machinery, severity plumbing, contract-exceeding emulation.src/gate/guards, src/gate/secret, src/core/policy): backstops mirroring the same fact, config knobs nothing sets.src/gate/*.ts, src/core/*.ts, src/core/io, src/core/git, src/core/paths): intake/analysis/decision plumbing, trace and explain scaffolding, helpers with one caller.src/rules-manager, src/audit): sync and resolver states, retention and display paths no command reaches.src/cli, src/entries): commands, flags, install/doctor/policy/rule flows, output formatting, entry files that re-export what nothing imports.src/hosts per-host directories and shared machinery, hooks/, the plugin manifests): per-host duplication, unused adapter methods, template branches no host takes.src/gui, src/gui/frontend): surfaces or state with no interaction path.tests/, scripts/, evals/): redundant fixtures, helpers duplicating each other, verification scripts checking what another gate already checks.Do not let the first good candidate stop the survey, and start with the largest production files — duplicated lifecycle and defensive machinery costs more than stray unused symbols.
Classify consumers before writing anything up:
src/, hooks/, scripts/ used at build/publish time, the plugin manifests (.claude-plugin/plugin.json, .claude-plugin/marketplace.json, .codex-plugin/plugin.json, kimi.plugin.json), package.json bin/pi/peerDependencies wiring, and the tracked skills/ directory. Reachability runs through src/entries/*: a symbol only an entry file exports is still production if that entry is a published surface. Ignore dist/ (generated) and anything git ls-files does not list.tests/ and comments. README and other docs are non-runtime evidence, but count as contract consumers for public surfaces.tests/e2e, tests/e2e-live, and evals/ exercise real host-tool wiring — these often pin integration contracts; read them before classifying.Use rg first: the exact symbol, config key, CLI flag, rule id, host name string, and any wire/JSON strings (hosts dispatch on string tool names, so grep strings, not just identifiers). Then read the call sites. knip helps but runs in --production mode — a /** @internal */ tag means test-only-by-design, not dead; and dynamic string dispatch hides real consumers from it.
Reject or downgrade when:
docs/, and the new evidence does not beat the recorded rationale.This repo has no notes system and a solo maintainer. The deliverable is a report to the user, strongest evidence first. For each candidate:
file:line references.Do not create new docs, directories, dependencies, or process files to hold findings — placement of new repo structure is the maintainer's call. Do not implement removals during a survey unless the user asked for fixes; when they do, implement the smallest change per candidate, keep tests/ mirroring src/, and follow the Red–Green rule for any behavior change: the failing expectation (a contract row or stated assertion) lands first, and re-recording a snapshot or editing the verdict table is never the first step.
A findings-only survey needs no checks. When candidates are implemented, run bun run check once at the end (never its pieces separately). If knip then flags fallout, fix the root cause per the Knip section of AGENTS.md — unexport, tag /** @internal */, or trim the barrel; never touch ignoreIssues. If a change flips a verdict-table row or re-records one of the two permitted snapshots, the commit message must name which entries changed and why.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 58,515 | 45,809 | -22% | 1 | 1 | 0% | 5,098 | 3,430 | -33% | 0 | 0 | — |
case-02 | fail→fail | 41,587 | 10,535 | -75% | 1 | 1 | 0% | 6,670 | 3,135 | -53% | 0 | 0 | — |
case-03 | fail→fail | 12,125 | 11,674 | -4% | 1 | 1 | 0% | 326 | 3,097 | +850% | 0 | 0 | — |
case-04 | pass→fail | 24,536 | 10,536 | -57% | 1 | 1 | 0% | 1,766 | 2,944 | +67% | 0 | 0 | — |
case-05 | fail→pass | 13,075 | 11,884 | -9% | 1 | 1 | 0% | 2,003 | 3,237 | +62% | 0 | 0 | — |
case-06 | pass→pass | 12,880 | 7,327 | -43% | 1 | 1 | 0% | 1,841 | 3,529 | +92% | 0 | 0 | — |
case-07 | fail→pass | 10,478 | 15,812 | +51% | 1 | 1 | 0% | 1,541 | 3,569 | +132% | 0 | 0 | — |
case-08 | fail→fail | 18,203 | 12,011 | -34% | 1 | 1 | 0% | 2,491 | 2,843 | +14% | 0 | 0 | — |
case-09 | fail→fail | 10,648 | 10,176 | -4% | 1 | 1 | 0% | 1,384 | 2,932 | +112% | 0 | 0 | — |
case-10 | fail→fail | 27,020 | 16,516 | -39% | 1 | 1 | 0% | 2,182 | 2,959 | +36% | 0 | 0 | — |
case-11 | fail→pass | 10,446 | 6,980 | -33% | 1 | 1 | 0% | 1,679 | 3,402 | +103% | 0 | 0 | — |
case-12 | fail→fail | 14,306 | 11,347 | -21% | 1 | 1 | 0% | 1,957 | 3,011 | +54% | 0 | 0 | — |
case-13 | fail→pass | 9,886 | 6,497 | -34% | 1 | 1 | 0% | 1,343 | 3,274 | +144% | 0 | 0 | — |
case-14 | fail→fail | 28,230 | 29,536 | +5% | 1 | 1 | 0% | 1,975 | 3,003 | +52% | 0 | 0 | — |
case-15 | fail→pass | 15,421 | 4,047 | -74% | 1 | 1 | 0% | 1,627 | 3,013 | +85% | 0 | 0 | — |
case-16 | fail→fail | 19,746 | 12,643 | -36% | 1 | 1 | 0% | 1,875 | 2,983 | +59% | 0 | 0 | — |
case-17 | pass→pass | 10,854 | 15,243 | +40% | 1 | 1 | 0% | 1,634 | 3,100 | +90% | 0 | 0 | — |
case-18 | pass→fail | 26,921 | 8,874 | -67% | 1 | 1 | 0% | 2,241 | 2,893 | +29% | 0 | 0 | — |
case-19 | fail→fail | 4,144 | 9,880 | +138% | 1 | 1 | 0% | 327 | 3,050 | +833% | 0 | 0 | — |
case-20 | fail→fail | 7,770 | 10,819 | +39% | 1 | 1 | 0% | 134 | 2,938 | +2093% | 0 | 0 | — |
case-21 | fail→fail | 19,400 | 7,500 | -61% | 1 | 1 | 0% | 205 | 2,892 | +1311% | 0 | 0 | — |
case-22 | fail→fail | 27,767 | 24,361 | -12% | 1 | 1 | 0% | 1,030 | 2,901 | +182% | 0 | 0 | — |
case-23 | fail→fail | 6,562 | 6,674 | +2% | 1 | 1 | 0% | 226 | 2,866 | +1168% | 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. 23 cases were attempted, and 7 counted toward the lift figure. The other 16 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 +13 percentage points is the difference between those two pass rates over the 7 comparable cases. 8 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.