Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Front door for running the clean-room unattended loop as a Claude Code dynamic WORKFLOW using in-session subagents, so it never spends `claude -p` API tokens. Use when the user wants to run a clean-room / reverse-engineering / source-to-clean-implementation task hands-off but without paying per-token for `clean-room-skill run`, or says "clean-room as a workflow", "unattended clean-room without API cost", "/clean-room-loop". Runs a short discussion (authorization, end goal, target stack, policies
.claude/skills/hashgraph-online-clean-room-loop/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 7 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 59% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -6% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 44% | 0% |
Conversational front door to the clean-room-loop dynamic workflow (.claude/workflows/clean-room-loop.js). The workflow runs in the background with no way to ask anything mid-run, so the discussion happens HERE; answers pass as args.
Claude Code only. Dynamic workflows are a Claude Code feature. In Pi/Codex/OpenCode the Workflow() call will not exist - see the Fallback step. Only this workflow shortcut is Claude Code specific; the underlying clean-room skills (/clean-room:unattended, clean-room-skill run) work on every supported runtime.
Installed project-local. The workflow script ships to project-local .claude/workflows/ (not global). Workflow({ name }) discovers it from the current project's .claude/workflows/ (or ~/.claude/workflows/ if a personal copy exists). If the current project does not have it, initialize a project-local install before launching - see Step 3.
agent() subagents (in-session,subscription, no claude -p), gating every wall crossing with the real clean-room-skill artifact validate --role leakage + schema hooks.
cannot set CLEAN_ROOM_* env or install hooks, so nothing stops a clean subagent from reading source off disk except the neutral-artifact discipline + the leakage gate. If the user needs the enforced boundary, use clean-room-skill run --agent-runtime claude instead (that path costs API tokens by design).
external artifact roots. Confirm authorization and paths before launching.
reimplementing and why they are authorized to.
AskUserQuestion (batch - max 4 per call,~3 calls); ask free-text ones plainly. Offer defaults so a terse brief is still runnable. Do NOT infer the end goal or target stack from source - clean-room forbids it; if unknown, ask.
Batch A (goal + stack):
Private structure/comments/internal names are NEVER mirrored.
Batch B (policy):
Batch C (roots + bounds - all safety-relevant):
~/Documents/CleanRoom). Must be OUTSIDE thesource tree and neutral-named.
First confirm this project has the workflow. Dynamic workflows load from project-local .claude/workflows/. If .claude/workflows/clean-room-loop.js is absent in the current project (and no ~/.claude/workflows/clean-room-loop.js personal copy exists), initialize a project-local install before launching:
bash clean-room-skill --claude --local --yes # or, without a global CLI: npx clean-room-skill@latest --claude --local --yes
That writes clean-room-loop.js into the current project's .claude/workflows/ so Workflow({ name }) can discover it. Then show a compact preview of the args (at least endGoal, sourceRoots, artifactBase, targetStack, maxIterations) so a wrong source path or output root is caught BEFORE a filesystem-writing, source-reading run starts. STOP and wait for an explicit "yes". Do NOT call Workflow in the same turn as the preview. Only after the user confirms:
Workflow({ name: "clean-room-loop", args: { endGoal, targetStack, // { language, runtime, framework, packageManager, testFramework } compatibilityPolicy, featurePolicy, licensePolicy, dependencyPolicy, codeHygienePolicy, sourceRoots, // array of absolute paths (REQUIRED) artifactBase, project, taskId, schemaProfile, maxIterations, specSliceRef, // optional }})
Pass only what was gathered; omit the rest (the workflow defaults them).
Workflow() errors or is unavailable (non-Claude host, or dynamic workflowsdisabled), do NOT hand-run the roles here. Route the user to /clean-room:unattended, which prefers fresh-context in-harness roles on that harness and drops to the durable runner only as a last resort: clean-room-skill run --agent-commands <adapter> on Codex/Pi/other runtimes (spawns the harness CLI, shell: false), or --agent-runtime claude (spawns claude -p, Claude only, per-token) last. Use the runner only once a runner-ready manifest with loop_context exists.
clean-room-result.json result string, taskroot, and clean/implementation roots).
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 15,522 | 25,324 | +63% | 1 | 1 | 0% | 1,757 | 2,632 | +50% | 0 | 0 | — |
case-02 | fail→fail | 11,742 | 10,025 | -15% | 1 | 1 | 0% | 1,163 | 2,398 | +106% | 0 | 0 | — |
case-03 | fail→fail | 14,387 | 9,988 | -31% | 1 | 1 | 0% | 1,650 | 2,357 | +43% | 0 | 0 | — |
case-04 | fail→pass | 14,367 | 10,118 | -30% | 1 | 1 | 0% | 1,527 | 2,425 | +59% | 0 | 0 | — |
case-05 | fail→pass | 15,277 | 8,744 | -43% | 1 | 1 | 0% | 1,731 | 2,137 | +23% | 0 | 0 | — |
case-06 | fail→pass | 24,531 | 8,194 | -67% | 1 | 1 | 0% | 1,792 | 2,217 | +24% | 0 | 0 | — |
case-07 | fail→pass | 39,563 | 7,417 | -81% | 1 | 1 | 0% | 1,986 | 1,875 | -6% | 0 | 0 | — |
case-08 | fail→pass | 13,644 | 7,816 | -43% | 1 | 1 | 0% | 1,385 | 1,988 | +44% | 0 | 0 | — |
case-09 | pass→pass | 14,325 | 11,009 | -23% | 1 | 1 | 0% | 1,360 | 2,238 | +65% | 0 | 0 | — |
case-10 | fail→pass | 18,890 | 9,849 | -48% | 1 | 1 | 0% | 1,911 | 2,427 | +27% | 0 | 0 | — |
case-11 | fail→pass | 17,547 | 12,314 | -30% | 1 | 1 | 0% | 2,029 | 2,758 | +36% | 0 | 0 | — |
case-12 | pass→pass | 28,228 | 8,203 | -71% | 1 | 1 | 0% | 1,514 | 2,054 | +36% | 0 | 0 | — |
case-13 | fail→pass | 23,327 | 8,263 | -65% | 1 | 1 | 0% | 959 | 2,034 | +112% | 0 | 0 | — |
case-14 | fail→pass | 16,777 | 11,467 | -32% | 1 | 1 | 0% | 1,944 | 2,691 | +38% | 0 | 0 | — |
case-19 | fail→fail | 12,675 | 3,456 | -73% | 1 | 1 | 0% | 1,985 | 2,119 | +7% | 0 | 0 | — |
case-15 | fail→pass | 26,623 | 2,709 | -90% | 1 | 1 | 0% | 1,071 | 1,982 | +85% | 0 | 0 | — |
case-16 | pass→pass | 10,503 | 4,668 | -56% | 1 | 1 | 0% | 1,763 | 2,233 | +27% | 0 | 0 | — |
case-17 | fail→pass | 17,279 | 1,611 | -91% | 1 | 1 | 0% | 2,822 | 1,735 | -39% | 0 | 0 | — |
case-18 | pass→pass | 7,636 | 4,385 | -43% | 1 | 1 | 0% | 1,204 | 2,281 | +89% | 0 | 0 | — |
case-20 | fail→pass | 12,545 | 11,796 | -6% | 1 | 1 | 0% | 2,097 | 3,743 | +78% | 0 | 0 | — |
case-21 | fail→pass | 10,273 | 9,821 | -4% | 1 | 1 | 0% | 871 | 2,384 | +174% | 0 | 0 | — |
case-22 | pass→fail | 17,651 | 27,678 | +57% | 1 | 1 | 0% | 2,990 | 5,350 | +79% | 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 +55 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.