Clean-room loop (discussion -> clean-room-loop workflow launch)
SkillProductivityFront 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, source roots, output roots, iterations) then launches the `clean-room-loop` workflow with the answers. NOT the enforced OS-level wall - that is `clean-room-skill run --agent-runtime claude`.
Use Clean-room loop (discussion -> clean-room-loop workflow launch) in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add Clean-room loop (discussion -> clean-room-loop workflow launch) and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use the Clean-room loop (discussion -> clean-room-loop workflow launch) skill
Details
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; Ahel provides instructions and does not run this skill.
No other account needed.
Add Ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
What this skill tells your AI
The instructions your AI receives, as published by hashgraph-online/awesome-codex-plugins in plugins/whit3rabbit/clean-room-skill/skills/clean-room-loop/SKILL.md and read by Ahel’s review.
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.
What this is (and is NOT)
- It drives the six clean-room roles with the workflow's OWN
agent()subagents (in-session, subscription, noclaude -p), gating every wall crossing with the realclean-room-skill artifact validate --roleleakage + schema hooks. - It is a cost-free path with context-level separation, NOT the OS-enforced wall. A workflow
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, useclean-room-skill run --agent-runtime claudeinstead (that path costs API tokens by design). - The workflow READS the authorized source and WRITES clean specs, plans, code, and reports under the external artifact roots. Confirm authorization and paths before launching.
Steps
-
Get the brief. Take the end goal from the invocation if present. If missing, ask what they are reimplementing and why they are authorized to.
-
Run the discussion. Collect the fields below with
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):
- endGoal (free-text): what the clean implementation must do; its success definition.
- targetStack: language / runtime / framework / packageManager / testFramework. Pass as a nested object.
- compatibilityPolicy: public-behavior-and-API-names only (default) or public-behavior-only. Private structure/comments/internal names are NEVER mirrored.
- featurePolicy (skippable): features to preserve / remove / add / non-goals.
Batch B (policy):
- licensePolicy: destination license + any blocked dep licenses.
- dependencyPolicy: allow new deps? prefer stdlib? require approval for native deps.
- codeHygienePolicy (skippable): max lines per code/test file, max files per iteration.
- schemaProfile: speckit-feature-folder (default) / openspec-delta / gsd-planning-package / kiro-spec-folder.
Batch C (roots + bounds - all safety-relevant):
- sourceRoots (REQUIRED): absolute path(s) to the authorized source. No source = cannot run.
- artifactBase: where run artifacts live (default
~/Documents/CleanRoom). Must be OUTSIDE the source tree and neutral-named. - project / taskId (skippable): neutral names; the CLI generates neutral ones if omitted.
- maxIterations: finite inner-loop cap (default 3).
-
Ensure the workflow is installed project-local, preview, STOP for confirmation, then launch. First confirm this project has the workflow. Dynamic workflows load from project-local
.claude/workflows/. If.claude/workflows/clean-room-loop.jsis absent in the current project (and no~/.claude/workflows/clean-room-loop.jspersonal copy exists), initialize a project-local install before launching:clean-room-skill --claude --local --yes # or, without a global CLI: npx clean-room-skill@latest --claude --local --yesThat writes
clean-room-loop.jsinto the current project's.claude/workflows/soWorkflow({ name })can discover it. Then show a compact preview of theargs(at leastendGoal,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 callWorkflowin 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).
-
Fallback. If
Workflow()errors or is unavailable (non-Claude host, or dynamic workflows disabled), 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(spawnsclaude -p, Claude only, per-token) last. Use the runner only once a runner-ready manifest withloop_contextexists. -
Hand back the workflow's result (the terminal
clean-room-result.jsonresult string, task root, and clean/implementation roots).
Signals
- GitHub stars
- 1k
- Forks
- 316
- Last commit
- Oct 2026
Advanced
- Item type
- skill
- Key
clean-room-loop- Source
- github.com/hashgraph-online/awesome-codex-plugins
github.com/hashgraph-online/awesome-codex-plugins
Related picks
Skill · thedaviddias
The pick for JavaScriptmodern-javascript-patterns
Skill · wshobson
The pick for JavaScriptsocial
Skill · coreyhaines31
More in Productivitygws-calendar
Skill · googleworkspace
More in Productivitylark-minutes
Skill · larksuite
More in Productivitylark-workflow-standup-report
Skill · larksuite
More in Productivity