{"id":"06a133cb-b012-461d-84ec-03d8571b6be7","shortId":"p3HmVB","kind":"skill","title":"cheese-factory","tagline":"This skill should be used when the user has an approved spec that decomposes into 5+ independent behavioural curds and wants the whole pipeline run in parallel with reviewable PRs at the end — phrases like \"/cheese-factory .cheese/specs/<slug>.md\", \"send through the factory\", \"pa","description":"# /cheese-factory\n\nUse this skill when an approved spec decomposes into 5+ file-disjoint behavioural curds and the user wants the whole implementation parallelised, reviewed per-curd, integrated, reviewed again at the seam, and shipped as 1–N reviewable PRs.\n\nDo not use it for single coherent feature work (`/cook` or `/ultracook`), fuzzy planning (`/mold`), review-only work (`/age`), or specs that decompose into fewer than 5 curds (`/ultracook`).\n\n`/cheese-factory` is the portable, harness-agnostic sibling of `/fromagerie`. Same decomposition pattern, same dual fan-out/fan-in, no bespoke agent files. Every sub-agent is a general-purpose full-peer worker driven by an in-prompt skill invocation.\n\n## Inputs\n\nAccept:\n\n```text\n/cheese-factory <spec-path-or-slug> [--hard] [--resume <slug>]\n```\n\n- A spec path, usually `.cheese/specs/<slug>.md`.\n- A bare slug whose spec lives at `.cheese/specs/<slug>.md`.\n- `--hard` — propagate the `/hard-cheese` metacognitive gate flag through per-curd `/cook --hard --auto` and the Phase 6 `/cure --hard --auto --stake medium+`. The orchestrator does not fire the gate itself. See `skills/hard-cheese/SKILL.md`.\n- `--resume <slug>` — read `.cheese/cheese-factory/<slug>/manifest.yaml`, find the latest phase marked complete, and continue from the next phase.\n\n`/cheese-factory` does not accept fuzzy or open-ended asks — route those to `/mold` first. The orchestrator assumes the contract is locked.\n\n`--auto` is **implicit**. After Phase 0 gate approval, the chain runs autonomously with no per-step handoff questions. There is no interactive mode — the value of this skill is unattended parallel execution.\n\n## When to use `/cheese-factory` vs alternatives\n\n| Skill | Use when |\n|---|---|\n| `/cook` | Single unambiguous task, no decomposition. |\n| `/ultracook` | Single coherent spec, high-blast-radius, sequential review pipeline. |\n| `/cheese-factory` | Spec decomposes into 5+ file-disjoint behavioural curds. |\n| `/fromagerie` | Same problem on Anthropic Claude Code with the bespoke agent files installed and a preference for specialised agent contracts. |\n\n## Decomposition contract — curds of behaviour\n\nIn cheese-factory terms, a curd is the smallest commit-worthy unit of behaviour:\nsmall enough to be worked independently, but intended to be pressed back into the\nwhole feature.\n\nThe Phase 0 decomposer produces three artifact lists from the spec:\n\n1. `seed[]` — foundational types / interfaces / enums that 2+ curds depend on.\n2. `curds[]` — parallel units of behaviour, file-disjoint, one acceptance criterion each.\n3. `wiring[]` — integration tasks with topological dependencies (barrels, registrations, routes, config).\n\n### The five criteria\n\nEvery curd must satisfy all five. Token budgets are explicitly **not** a criterion — LLM agents cannot estimate their own token usage reliably, and the five behavioural criteria substitute. Curds remain bounded by their file scope, which is decomposer-controlled.\n\n| # | Criterion | Decomposer check |\n|---|---|---|\n| 1 | One behaviour per curd | Describable in a single declarative sentence (\"adds X\", \"extracts Y\", \"renames Z\", \"fixes A\"). If the description needs \"and\" between two distinct behaviours, split. |\n| 2 | One acceptance criterion | Maps to exactly one bullet in the spec's Acceptance Criteria / User Story list. Curds collectively cover every acceptance criterion 1:1. |\n| 3 | One test target | A single focused test command verifies this curd alone (e.g., `vitest run src/orders/order.test.ts`). If the curd needs N test commands, it's N curds. |\n| 4 | File-disjoint | No two curds list the same file. HARD CONSTRAINT. |\n| 5 | Commit-worthy alone | After this curd's commit, `just check` (or project equivalent) passes without sibling curds merged. Implied by 4 plus seed carrying any shared deps. |\n\nIf criterion 4 cannot be satisfied because two curds genuinely share a file, the shared content belongs in seed (if foundational) or wiring (if integration). Curds never share files.\n\n### Manifest format\n\nThe per-run manifest is written as YAML at `.cheese/cheese-factory/<slug>/manifest.yaml`.\nYAML is the human/agent-facing syntax; the contract stays schema-shaped and is\ndocumented in `references/manifest-schema.json`. Keep manifests in the JSON-compatible\nsubset of YAML: mappings, lists, strings, numbers, booleans, and nulls only; no anchors,\naliases, tags, or multi-document streams.\n\nThe PR plan follows the same convention — written as YAML at\n`.cheese/cheese-factory/<slug>/pr-plan.yaml`, with its shape documented in\n`references/pr-plan-schema.json`. `scripts/pr_plan_to_branches.py` reads either YAML\nor JSON for backward compatibility, but YAML is the canonical format.\n\n### Validation (Phase 0)\n\nThe decomposer's output is validated by `scripts/validate_manifest.py` for required\nsections and field shapes, then by `scripts/validate_decomposition.py` against:\n\n- **Behaviour overlap** — each curd describes one behaviour (criterion 1).\n- **Spec coverage** — every acceptance criterion has exactly one curd (criterion 2).\n- **Test target check** — each curd has a focused test command (criterion 3).\n- **File disjointness** — no file appears in two curds (criterion 4).\n- **Wiring DAG check** — no cycles, no cross-branch overlap, barrel files included where curds create new slices.\n- **Seed minimality** — seed contains only files that 2+ curds depend on.\n\nIf validation fails: re-run decomposer with violations highlighted. Max 2 retries before escalating to the user.\n\n## Phases\n\nEight phases. The orchestrator walks them top-to-bottom and stops after the last entry or any halt.\n\n| # | Phase | Shape |\n|---|---|---|\n| 0 | Pre-compile | Read spec, decompose via heavy general-purpose sub-agent, validate against the five criteria, user gate |\n| 1 | Seed | Orchestrator inline edits via `/cheez-write` (or host edit tool if tilth MCP is unavailable), commit, push |\n| 2 | Curds (fan-out) | N parallel general-purpose spawns; each runs `/cook --auto → /press --auto → /age --auto` (inline-degrade) `→ /cure --auto --stake medium+` and commits |\n| 3 | Merge curds (fan-in) | Cherry-pick curd commits → orchestrator branch; `/melt` on conflicts |\n| 4 | Wiring (sequential within wave) | Integration files only; per-task general-purpose spawn with wiring-only prompt |\n| 5 | Final merge wiring | Wiring commits → orchestrator branch; conflicts here = halt (decomposer error) |\n| 6 | Post-merge review (fresh-context, ultracook-style) | Three sub-agent spawns: `/press --auto`, `/age --auto`, `/cure --auto --stake medium+`. Single pass. |\n| 7 | PR plan + publish | Heavy PR planner sub-agent decides layout, orchestrator delegates publish via skill discovery (`/pr-stack`, `/gh`, fallbacks) |\n\n### Phase 0 — Pre-compile\n\nRead the spec from the argument (or, if `--resume <slug>`, read the manifest and skip to the next incomplete phase).\n\nValidate the spec has: Executive Summary, Problem Statement, User Stories, Acceptance Criteria, Quality Gates. Fail fast if any is missing.\n\n**Hard worktree gate**: detect the host's worktree mechanism (Conductor, git worktrees, plain branches) and prompt if working on the default branch. Never skipped.\n\nSpawn a heavy general-purpose **decomposer** sub-agent (prompt template at `references/decomposer-prompt.md`) with the spec text, the five criteria, the validation checks, and instructions to produce `seed[]`, `curds[]`, `wiring[]`, and a manifest scaffold.\n\nThe decomposer may invoke `/culture` or `/briesearch` internally if it needs to ground its decomposition against the codebase or external docs.\n\n**Front-load permissions**: present the per-host permission manifest (git, the project's quality gate command, the host-specific spawn primitive) to the user. On approval, merge into the host's settings.\n\n#### Gate — User Approval\n\nPresent the full plan:\n\n```text\n## Cheese-Factory Plan: <slug>\n\n### Seed (sequential)\n1. <description> — files: [<list>]\n\n### Curds (parallel)\n| # | Behaviour | Acceptance criterion | Files | Test target |\n|---|---|---|---|---|\n\n### Wiring DAG\n| # | Type | File | Depends on |\n|---|---|---|---|\n\n### Review Pipeline\nPer-curd: /cook → /press → /age (inline-degrade) → /cure\nPost-merge: /press → /age → /cure (fresh-context sub-agents)\n\nA. Approve — start execution\nB. Modify — change the decomposition\nC. Re-decompose — different boundaries\nD. Pause — hold off\n```\n\nUse the shared handoff gate in [`../../shared/handoff-gate.md`](../../shared/handoff-gate.md) for this approval step. All four options keep cheese-factory running internally (no skill transition) — they use `continue:` identifiers rather than `dispatch:` commands per the gate vocabulary:\n\n- **Approve** — `continue: write-manifest-then-seed`: write `.cheese/cheese-factory/<slug>/manifest.yaml`, set `phase: gate_approved`, then proceed with Phase 1 (seed execution).\n- **Modify** — `continue: ask-for-decomposition-change`: ask one targeted question for the requested decomposition change, then re-render the plan.\n- **Re-decompose** — `continue: re-run-decomposer`: re-run the decomposer with the user's boundary instruction. Retry at most twice.\n- **Pause** — `dispatch: none`: leave the manifest draft and report its path.\n\n**Do NOT proceed without explicit approval.**\n\n#### Compaction seam C1\n\nDrop: full spec text, permission manifest, decomposition reasoning.\nKeep: slug, spec summary (≤2K chars), manifest path, quality gate commands.\n\n### Phase 1 — Seed (sequential, inline)\n\nSeed items are minimal — only the shared types / protocols that curds cannot compile without. The orchestrator executes seed inline (a deliberate exception to the orchestrator's \"never write code\" rule because seed is always small).\n\nFor each seed item:\n\n1. Implement the change. Prefer `/cheez-write` when tilth MCP is present; otherwise fall back to the host's native edit tool (per the cheez-* portability rule in `README.md`). The skill must not hard-fail when `/cheez-write` is unavailable.\n2. Run quality gates (the project's `just check` or equivalent) — if gates fail, STOP.\n3. Commit via `/commit` (if available) or `git commit` direct.\n\nPush to branch — curds branch from HEAD.\n\nUpdate manifest: `phase: seed_complete`, commit SHAs.\n\n### Phase 2 — Curds (fan-out)\n\nSpawn ALL curd workers in a single message via the host's fan-out primitive. If more than 5 curds, dispatch in waves of 5.\n\nEach curd worker is a general-purpose sub-agent (full peer of the orchestrator — same model, full tools, full skills, full MCP) given the per-curd prompt at `references/curd-prompt.md`.\n\nCollect results as curds complete. For failed curds: retry ONCE with error context. Mark `retry_count: 1`; do not retry twice.\n\nUpdate manifest: curd statuses, worktree paths, branch names, commit SHAs.\n\n#### Compaction seam C2\n\nDrop: decomposer artifacts, curd dispatch prompts, curd return summaries.\nKeep: slug, manifest path, quality gate commands, curd branch list.\nRead from disk when needed: wiring DAG.\n\n### Phase 3 — Merge curds (fan-in)\n\nCherry-pick curd commits onto the orchestrator branch in curd-id order:\n\nFor each curd (in order):\n\n1. `git cherry-pick <curd_commit_sha>` — or, if the host fan-out used worktrees, merge the worktree branch.\n2. On conflict: invoke `/melt` if available, else fall back to mergiraf → `git rerere` → manual.\n3. If `/melt` cannot resolve: STOP, fall back to per-curd PRs in Phase 7.\n\nAfter all curds merged: run quality gates. If failing, STOP and report — curds passed individually but conflict in aggregate (decomposer error).\n\n### Phase 4 — Wiring (fan-out, sequential within wave)\n\nRead wiring DAG from manifest. Dispatch wiring tasks in topological order, sequentially within each wave (concurrent commits to the same working directory race on git's `index.lock`).\n\nEach wiring worker is a general-purpose sub-agent with the prompt template at `references/wiring-prompt.md`.\n\nFor failed wiring tasks: retry ONCE. If still failing, mark incomplete in manifest.\n\n### Phase 5 — Final merge wiring\n\nCherry-pick wiring commits onto the orchestrator branch.\n\nIf conflicts arise here: STOP. Wiring conflicts mean the decomposer's DAG was wrong (wiring touched implementation territory, or two wiring tasks shared a file outside the DAG). Do not auto-resolve.\n\n#### Compaction seam C3\n\nDrop: wiring DAG details, per-curd diffs, intermediate merger reports.\nKeep: slug, spec path (for downstream skills), quality gates, list of all changed files, list of all commit SHAs (curds + seed + wiring).\n\n### Phase 6 — Post-merge review (ultracook-style fresh-context)\n\nBy Phase 6 the orchestrator's context is heavy. Run the final review pipeline in fresh-context sub-agents to keep review reasoning adversarial and clean.\n\nThree sequential spawns:\n\n1. `/press --auto` on the merged diff — writes `.cheese/press/<slug>.md`.\n2. `/age --auto` on the merged diff — writes `.cheese/age/<slug>.md`.\n3. `/cure --auto --stake medium+` on the age findings — writes `.cheese/cure/<slug>.md`.\n\nEach spawn is a full-peer general-purpose sub-agent. Pass the no-chain-forward directive (same as `/ultracook`) so each spawn runs its phase only.\n\nSingle pass through — no two-cure-pass cap. Curds each had their own press/age/cure; this is integration-level review.\n\nIf any phase writes `status: halt: <reason>` in its slug, surface the halt and STOP. If `/cure` writes `next: done`, continue to Phase 7.\n\n### Phase 7 — PR plan + publish\n\nSpawn a heavy general-purpose **PR planner** sub-agent (prompt template at `references/pr-planner-prompt.md`) with the wiring DAG, the manifest, the merged diff, and the spec summary.\n\nThe planner emits one of four shapes:\n\n| Shape | When | PR layout |\n|---|---|---|\n| `single` | Small total diff, tightly coupled | All commits in one PR. |\n| `orthogonal_flat` | Curds touch disjoint slices, no seed/wiring coupling | N PRs each branching from main. |\n| `stacked_linear` | Linear dependencies seed → curds → wiring | gt/gh stack. |\n| `diamond_stack` | Seed and wiring exist; curds independent of each other | seed PR (base) → N parallel curd PRs → wiring PR. |\n\nThe planner writes its grouping to `.cheese/cheese-factory/<slug>/pr-plan.yaml` and returns control.\n\n#### Skill discovery (orchestrator-side)\n\nBefore publishing PRs, the orchestrator detects which skills are available and picks the right delegate:\n\n| Need | Prefer | Fallback |\n|---|---|---|\n| Stack publish | `/pr-stack` (Graphite `gt` or `gh stack`) | manual `gh pr create --base <prev-branch>` chain |\n| Commits | `/commit` | `git commit` direct |\n| PR publish | `/gh` | `gh pr create` direct |\n| Merge conflicts | `/melt` | mergiraf → rerere → kdiff3 direct |\n\nDetection: attempt to invoke the skill via the host's Skill tool; on unrecognised-skill error, fall back. Cache the result for the rest of the phase.\n\n#### Publish\n\nFor each PR group in the plan:\n\n1. Read group metadata from `pr-plan.yaml`.\n2. Push the branch (use `scripts/pr_plan_to_branches.py` to convert `pr-plan.yaml` to branch-creation commands).\n3. Create the PR (via `/gh` if available, else `gh pr create` direct).\n4. For stacks: invoke `/pr-stack` with the ordered branch list.\n5. Update manifest with PR numbers and URLs.\n\n## Final report\n\n```text\n## Cheese-Factory Complete: <slug>\n\n### Results\n| Phase | Status | Detail |\n|---|---|---|\n| Seed | complete | 2 commits |\n| Curds | 5/6 succeeded | Curd #4 failed after retry |\n| Merge | complete | — |\n| Wiring | 4/4 complete | — |\n| Final merge | complete | — |\n| Post-merge review | press: pass, age: 3 findings, cure: 3 applied |\n| PR plan | diamond_stack | seed + 5 curds + wiring = 7 PRs |\n\n### PRs\n| PR | Title | Stack base |\n|---|---|---|\n| #101 | feat(orders): shared types | main |\n| #102 | feat(orders): order entity | #101 |\n| ... |\n\n### Manual actions needed\n- Curd #4 failed: {error_summary}\n\nManifest: .cheese/cheese-factory/<slug>/manifest.yaml\n```\n\n## Orchestrator token discipline\n\nThe orchestrator reads ONE thing: the spec. Everything else is delegated.\n\n**Must not**:\n\n- Read / grep / glob codebase files (decomposer + per-curd workers do that).\n- Run build / test commands (per-curd workers + post-merge sub-agents do that).\n- Read full sub-agent reports — work from handoff slug digests.\n\n**Should**:\n\n- Read the spec once at Phase 0.\n- Read per-phase handoff slugs (each ≤2KB).\n- Write manifest updates after each phase.\n- Decide chain progression based on slug `status` and `next` fields, never on sub-agent stdout.\n\n## Compaction strategy\n\nThree seams where the orchestrator drops accumulated context.\n\n| Seam | After | DROP | KEEP |\n|---|---|---|---|\n| C1 | Phase 0 (gate approved) | Full spec text, permission manifest, decomposition reasoning | Slug, spec summary (≤2K), manifest path, quality gates |\n| C2 | Phase 2 (curds done) | Decomposer artifacts, curd dispatch prompts, curd return summaries | Slug, manifest path, quality gates, curd branch list |\n| C3 | Phase 5 (final merge done) | Wiring DAG, per-curd diffs, merger details | Slug, spec path, quality gates, changed files list, all commit SHAs |\n\nAt each seam, write a self-summary to the manifest before dropping:\n\n```json\n{\n  \"phase_summary\": \"<2-3 sentences: what happened, what succeeded/failed, what's next>\",\n  \"carry_forward\": [\"slug\", \"spec_summary\", \"manifest_path\", \"quality_gates\"]\n}\n```\n\nOn `--resume`, read `phase_summary` from the manifest. This is the only cross-seam continuity mechanism — do not rely on conversation history.\n\n## Spawn primitive contract (host-agnostic)\n\nThe orchestrator never names a specific host primitive. Any primitive that satisfies all five invariants below is acceptable. See `references/spawn-primitive-reference.md` for host-by-host examples.\n\n1. **Fresh context per spawn.** The sub-agent boots with no memory of prior phases.\n2. **Full-peer inheritance.** Same model as the parent, full tool access, full skill access, full MCP access. No diminutive workers.\n3. **No chain-forward.** The sub-agent runs only its phase and returns. The no-chain-forward directive is passed in the prompt.\n4. **Returns control.** The orchestrator regains control after each spawn so it can read the handoff slug.\n5. **Writes handoff slug.** Each spawn writes its result to `.cheese/<phase>/<slug>.md` per the schema. The orchestrator decides chain progression from the slug, never from stdout.\n\nIf the host harness exposes no fan-out primitive at all, `/cheese-factory` is the wrong skill — recommend `/ultracook` for the same review semantics in the parent's own context.\n\n## Handoff slug schema\n\nEvery phase writes a handoff slug to `.cheese/<phase>/<slug>.md` (or, for per-curd workers, to `.cheese/cheese-factory/<slug>/curds/<curd-id>.md`) with the minimum shape:\n\n```markdown\nstatus: ok | halt: <one-line reason>\nnext: <phase-name | done>\nartifact: <path-to-richer-report-if-any>\n<one-line orientation: what this phase did>\n```\n\nFor phases that already write rich reports (`/age`, `/press`, `/cure`), the schema is prepended at the top of the same file.\n\n## Quality gates\n\n`/cheese-factory` runs the project's quality gate command (typically `just check` per `AGENTS.md`) at four points:\n\n1. After seed (Phase 1).\n2. Inside each curd worker (after its `/cure` step).\n3. After curd merge (Phase 3, before wiring).\n4. After Phase 6 `/cure`.\n\nIf any gate fails: STOP, report, do not silently fix.\n\n## `--hard` propagation\n\n`/cheese-factory <spec> --hard`:\n\n- Passes `--hard` to per-curd `/cook --hard --auto` — each curd gets its own hard-cheese vibecheck at its `/cure` share-for-review boundary.\n- Passes `--hard` to Phase 6 `/cure --hard --auto --stake medium+` — the integration `/cure` runs the share-for-review vibecheck too.\n\nThe orchestrator does not invoke `/hard-cheese` itself — it propagates the flag. See `skills/hard-cheese/SKILL.md`.\n\n## `--resume <slug>`\n\nRead manifest at `.cheese/cheese-factory/<slug>/manifest.yaml`, find the latest phase marked complete, skip to the next phase. Report: `Resuming <slug> from phase <N>`.\n\nIf the manifest references commits that no longer exist (rebased, deleted), fail fast and report — do not silently re-execute the phase.\n\n## Error recovery\n\n| Failure | Recovery |\n|---|---|\n| No spec argument | STOP. Report `cheese-factory requires an approved spec; run /mold first if you need to shape one`. Do not auto-dispatch — cross-skill handoffs stay user-visible. |\n| Overlap / criterion violation in decomposer output | Re-run decomposer (max 2 retries) |\n| Seed gate failure | STOP, report — do not dispatch curds |\n| Curd fails | Retry once with error context, then mark failed |\n| All curds fail | STOP, no merge/wiring |\n| Curd merge conflict | `/melt`; if `/melt` fails, fall back to per-curd PRs |\n| Wiring agent fails | Retry once, mark incomplete if still failing |\n| Phase 5 conflicts | STOP — decomposer error, report to user |\n| Phase 6 `/press` or `/age` halt | Surface halt, STOP |\n| Phase 6 `/cure` cannot apply any finding | Surface report, STOP |\n| `/pr-stack` not available, plan calls for stack | Fall back to manual `gh pr create --base` chain |\n| `--resume` on missing manifest | Fail fast |\n\n**Never proceed past Phase 0 gate without explicit user approval.**\n**Never claim green on partial work.**\n\n## What the orchestrator never does\n\n- Read codebase files (sub-agents explore, orchestrator routes).\n- Run build / test commands (per-curd workers and post-merge sub-agents handle verification).\n- Write implementation code (cook agents and wiring agents implement; the orchestrator's only inline writes are the small seed items in Phase 1).\n- Make decomposition decisions after Phase 0 (plan is locked at gate approval).\n- Retry more than once (curds and wiring get one retry, then mark failed).\n- Auto-resolve Phase 5 conflicts (wiring conflicts = decomposer error).\n- Estimate sub-agent token usage (decomposition uses behavioural criteria, not token counts).\n\n## Gotchas\n\n- **`/age` nesting depth**: curd workers invoke `/age` which normally fans out to 6 review sub-agents (level 2, blocked). `/cheese-factory` requires `/age` to support an inline-degrade mode for sub-agent invocation — see `skills/age/SKILL.md` \"Inline-degrade mode\".\n- **Context death after C2**: after C2 the orchestrator has no curd details. The wiring DAG must be self-contained on disk. If wiring references curd internals not captured in the manifest, wiring agents will fail.\n- **Wiring race conditions**: wiring tasks commit to the same working directory. Phase 4 dispatches them sequentially (not in parallel) to avoid `git index.lock` races even when files differ.\n- **bypassPermissions doesn't bypass Bash**: curd workers can Edit/Write freely but cannot `git push` or `gh pr create` without explicit Bash allowlist. The orchestrator must handle all push / PR operations.\n- **Stale worktrees**: curd worktrees persist after Phase 3 merge. The orchestrator does NOT clean them up — recommend the user run `/worktree-sweep` (or host equivalent) after the pipeline completes.\n\n## References\n\n- `references/decomposer-prompt.md` — heavy decomposer sub-agent prompt template.\n- `references/curd-prompt.md` — per-curd worker prompt template.\n- `references/wiring-prompt.md` — per-wiring task prompt template.\n- `references/pr-planner-prompt.md` — PR planner sub-agent prompt template.\n- `references/manifest-schema.json` — JSON Schema for the manifest.\n- `references/pr-plan-schema.json` — JSON Schema for the PR plan, `$ref`'d from `manifest-schema.json`.\n- `references/spawn-primitive-reference.md` — host-by-host invocation examples plus the five invariants.\n- `scripts/validate_manifest.py` — Phase 0 structural validation of required manifest sections and fields.\n- `scripts/validate_decomposition.py` — Phase 0 semantic validation of decomposer output against the five criteria.\n- `scripts/validate_pr_plan.py` — Phase 7 validation of PR planner output before branch creation.\n- `scripts/pr_plan_to_branches.py` — converts `pr-plan.yaml` to branch-creation commands for Phase 7.\n\n## Rules\n\n- Sub-agents are full peers, not diminutive workers. Do not downgrade the model, do not narrow `subagent_type`, do not restrict tools or MCP access.\n- The chain is fixed at eight phases. Do not invent extra phases or skip phases (except via `--resume`).\n- Read each phase's handoff slug after the sub-agent returns. Do not infer success from the sub-agent's last line — read the file.\n- Surface halts verbatim. Do not paraphrase, do not soften, do not \"retry\" a halted phase silently.\n- Never invoke `/gh` directly without confirming via the user-approved permission manifest from Phase 0.\n- Apply the shared voice kernel (lives at `skills/age/references/voice.md` in this repo): lead the final report with what happened, flag residual risk as `certain | speculating | don't know`, do not manufacture follow-ups.","tags":["cheese","factory","easy","paulnsorensen","agent-skills","ai-coding","claude-code","code-review","developer-tools"],"capabilities":["skill","source-paulnsorensen","skill-cheese-factory","topic-agent-skills","topic-ai-coding","topic-claude-code","topic-code-review","topic-developer-tools"],"categories":["easy-cheese"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/paulnsorensen/easy-cheese/cheese-factory","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add paulnsorensen/easy-cheese","source_repo":"https://github.com/paulnsorensen/easy-cheese","install_from":"skills.sh"}},"qualityScore":"0.453","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 7 github stars · SKILL.md body (24,777 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:13:40.353Z","embedding":null,"createdAt":"2026-05-18T13:21:08.001Z","updatedAt":"2026-05-18T19:13:40.353Z","lastSeenAt":"2026-05-18T19:13:40.353Z","tsv":"'-3':2550 '/../shared/handoff-gate.md':1251,1252 '/age':107,906,984,1209,1218,1931,2803,3093,3249,3255,3271 '/briesearch':1122 '/cheese-factory':39,47,118,165,232,290,313,2742,2819,2874,3269 '/cheez-write':877,1435,1466 '/commit':1487,2174 '/cook':97,194,296,902,1207,2882 '/culture':1120 '/curds':2780 '/cure':201,911,986,1213,1219,1941,2018,2805,2847,2861,2896,2907,2914,3100 '/fan-in':136 '/fromagerie':127,323 '/gh':1011,2180,2253,3606 '/hard-cheese':186,2928 '/manifest.yaml':219,639,1290,2359,2941 '/melt':930,1680,1693,2187,3059,3061 '/mold':102,245,2997 '/pr-plan.yaml':695,2132 '/pr-stack':1010,2161,2265,3108 '/press':904,982,1208,1217,1921,2804,3091 '/ultracook':99,117,302,1974,2748 '/worktree-sweep':3404 '0':259,382,719,849,1014,2422,2469,3134,3205,3473,3484,3619 '1':84,391,472,525,526,746,871,1186,1299,1387,1430,1588,1658,1920,2228,2623,2835,2839,3199 '101':2337,2348 '102':2343 '2':398,402,501,757,805,820,889,1469,1509,1676,1930,2234,2292,2489,2549,2639,2840,3029,3267 '2k':1379,2482 '2kb':2430 '3':415,527,769,917,1484,1633,1691,1940,2248,2317,2320,2661,2849,2854,3391 '4':555,590,599,779,933,1729,2261,2298,2353,2687,2857,3338 '4/4':2305 '5':19,57,115,317,568,953,1533,1539,1795,2271,2327,2510,2704,3081,3229 '5/6':2295 '6':200,966,1878,1891,2860,2906,3090,3099,3261 '7':992,1706,2025,2027,2330,3496,3515 'accept':163,235,412,503,514,523,750,1047,1191,2614 'access':2651,2654,2657,3542 'accumul':2461 'action':2350 'add':483 'adversari':1914 'age':1947,2316 'agent':139,144,333,341,443,863,980,1001,1090,1225,1550,1774,1909,1964,2041,2401,2408,2451,2631,2669,3071,3156,3174,3181,3184,3238,3265,3282,3323,3418,3440,3519,3571,3581 'agents.md':2831 'aggreg':1725 'agnost':124,2596 'alias':676 'allowlist':3375 'alon':539,572 'alreadi':2799 'altern':292 'alway':1424 'anchor':675 'anthrop':327 'appear':774 'appli':2321,3102,3620 'approv':14,53,261,1165,1174,1227,1255,1281,1294,1363,2471,2994,3139,3211,3614 'argument':1023,2986 'aris':1810 'artifact':386,1608,2493,2795 'ask':241,1305,1309 'ask-for-decomposition-chang':1304 'assum':249 'attempt':2193 'auto':196,203,254,903,905,907,912,983,985,987,1839,1922,1932,1942,2884,2909,3008,3226 'auto-dispatch':3007 'auto-resolv':1838,3225 'autonom':265 'avail':1489,1682,2150,2255,3110 'avoid':3346 'b':1230 'back':375,1443,1685,1698,2210,3064,3116 'backward':709 'bare':175 'barrel':422,790 'base':2118,2171,2336,2440,3122 'bash':3358,3374 'behaviour':21,61,321,347,363,407,454,474,499,738,744,1190,3243 'belong':613 'bespok':138,332 'blast':308 'block':3268 'boolean':670 'boot':2632 'bottom':837 'bound':459 'boundari':1240,1341,2901 'branch':788,929,960,1070,1078,1496,1498,1599,1623,1647,1675,1807,2093,2237,2245,2269,2506,3503,3510 'branch-creat':2244,3509 'budget':436 'build':2389,3161 'bullet':509 'bypass':3357 'bypasspermiss':3354 'c':1235 'c1':1366,2467 'c2':1605,2487,3293,3295 'c3':1843,2508 'cach':2211 'call':3112 'cannot':444,600,1402,1694,3101,3365 'canon':715 'cap':1990 'captur':3318 'carri':593,2559 'certain':3642 'chain':263,1969,2172,2438,2664,2679,2722,3123,3544 'chain-forward':2663 'chang':1232,1308,1317,1433,1867,2527 'char':1380 'check':471,579,760,782,1104,1477,2829 'chees':2,350,1181,1262,2283,2714,2770,2892,2990 'cheese-factori':1,349,1180,1261,2282,2989 'cheese/age':1938 'cheese/cheese-factory':218,638,694,1289,2131,2358,2779,2940 'cheese/cure':1950 'cheese/press':1928 'cheese/specs':40,172,181 'cheez':1453 'cherri':924,1640,1661,1800 'cherry-pick':923,1639,1660,1799 'claim':3141 'claud':328 'clean':1916,3397 'code':329,1419,3179 'codebas':1133,2379,3152 'coher':94,304 'collect':520,1572 'command':535,550,767,1154,1276,1385,1621,2247,2391,2826,3163,3512 'commit':359,570,577,887,916,927,958,1485,1492,1506,1601,1643,1753,1803,1872,2077,2173,2176,2293,2531,2961,3331 'commit-worthi':358,569 'compact':1364,1603,1841,2453 'compat':662,710 'compil':852,1017,1403 'complet':225,1505,1576,2285,2291,2303,2306,2309,2947,3411 'concurr':1752 'condit':3328 'conductor':1066 'config':425 'confirm':3609 'conflict':932,961,1678,1723,1809,1814,2186,3058,3082,3230,3232 'constraint':567 'contain':801,3309 'content':612 'context':973,1222,1584,1888,1895,1906,2462,2625,2759,3046,3290 'continu':227,1271,1282,1303,1327,2022,2583 'contract':251,342,344,646,2593 'control':468,2135,2689,2693 'convent':689 'convers':2589 'convert':2241,3506 'cook':3180 'count':1587,3247 'coupl':2075,2089 'cover':521 'coverag':748 'creat':795,2170,2183,2249,2259,3121,3371 'creation':2246,3504,3511 'criteria':428,455,515,868,1048,1101,3244,3493 'criterion':413,441,469,504,524,598,745,751,756,768,778,1192,3019 'cross':787,2581,3011 'cross-branch':786 'cross-seam':2580 'cross-skil':3010 'curd':22,62,74,116,193,322,345,354,399,403,430,457,476,519,538,546,554,561,575,586,605,622,741,755,762,777,794,806,890,919,926,1110,1188,1206,1401,1497,1510,1516,1534,1541,1568,1575,1579,1595,1609,1612,1622,1635,1642,1650,1655,1702,1709,1719,1850,1874,1991,2083,2101,2111,2121,2294,2297,2328,2352,2384,2394,2490,2494,2497,2505,2518,2776,2843,2851,2881,2886,3039,3040,3051,3056,3068,3166,3216,3252,3300,3315,3359,3386,3424 'curd-id':1649 'cure':1988,2319 'cycl':784 'd':1241,3457 'dag':781,1197,1631,1739,1819,1835,1846,2049,2515,3304 'death':3291 'decid':1002,2437,2721 'decis':3202 'declar':481 'decompos':17,55,111,315,383,467,470,721,815,855,964,1087,1117,1238,1326,1331,1336,1607,1726,1817,2381,2492,3022,3027,3084,3233,3415,3488 'decomposer-control':466 'decomposit':129,301,343,1130,1234,1307,1316,1373,2477,3201,3241 'default':1077 'degrad':910,1212,3277,3288 'deleg':1005,2155,2373 'delet':2967 'deliber':1411 'dep':596 'depend':400,421,807,1200,2099 'depth':3251 'describ':477,742 'descript':493 'detail':1847,2289,2521,3301 'detect':1060,2146,2192 'diamond':2105,2324 'diff':1851,1926,1936,2054,2073,2519 'differ':1239,3353 'digest':2414 'diminut':2659,3524 'direct':1493,1971,2177,2184,2191,2260,2681,3607 'directori':1758,3336 'disciplin':2362 'discoveri':1009,2137 'disjoint':60,320,410,558,771,2085 'disk':1627,3311 'dispatch':1275,1348,1535,1610,1742,2495,3009,3038,3339 'distinct':498 'doc':1136 'document':653,681,699 'doesn':3355 'done':2021,2491,2513,2794 'downgrad':3528 'downstream':1860 'draft':1353 'driven':154 'drop':1367,1606,1844,2460,2465,2545 'dual':132 'e.g':540 'edit':875,880,1449 'edit/write':3362 'eight':828,3548 'either':704 'els':1683,2256,2371 'emit':2061 'end':36,240 'enough':365 'entiti':2347 'entri':843 'enum':396 'equival':582,1479,3407 'error':965,1583,1727,2208,2355,2980,3045,3085,3234 'escal':823 'estim':445,3235 'even':3350 'everi':141,429,522,749,2763 'everyth':2370 'exact':507,753 'exampl':2622,3466 'except':1412,3558 'execut':286,1041,1229,1301,1407,2977 'exist':2110,2965 'explicit':438,1362,3137,3373 'explor':3157 'expos':2734 'extern':1135 'extra':3553 'extract':485 'factori':3,45,351,1182,1263,2284,2991 'fail':811,1051,1464,1482,1578,1715,1782,1789,2299,2354,2865,2968,3041,3049,3052,3062,3072,3079,3128,3224,3325 'failur':2982,3033 'fall':1442,1684,1697,2209,3063,3115 'fallback':1012,2158 'fan':134,892,921,1512,1527,1637,1668,1732,2737,3258 'fan-in':920,1636 'fan-out':133,891,1511,1526,1667,1731,2736 'fast':1052,2969,3129 'feat':2338,2344 'featur':95,379 'fewer':113 'field':732,2446,3481 'file':59,140,319,334,409,462,557,565,609,625,770,773,791,803,939,1187,1193,1199,1832,1868,2380,2528,2816,3153,3352,3587 'file-disjoint':58,318,408,556 'final':954,1796,1900,2279,2307,2511,3633 'find':220,1948,2318,2942,3104 'fire':210 'first':246,2998 'five':427,434,453,867,1100,2610,3469,3492 'fix':489,2871,3546 'flag':189,2933,3638 'flat':2082 'focus':533,765 'follow':686,3651 'follow-up':3650 'format':627,716 'forward':1970,2560,2665,2680 'foundat':393,617 'four':1258,2064,2833 'freeli':3363 'fresh':972,1221,1887,1905,2624 'fresh-context':971,1220,1886,1904 'front':1138 'front-load':1137 'full':151,1177,1368,1551,1558,1560,1562,1957,2405,2472,2641,2649,2652,2655,3521 'full-peer':150,1956,2640 'fuzzi':100,236 'gate':188,212,260,870,1050,1059,1153,1172,1249,1279,1293,1384,1472,1481,1620,1713,1863,2470,2486,2504,2526,2567,2818,2825,2864,3032,3135,3210 'general':148,859,897,945,1085,1546,1770,1960,2035 'general-purpos':147,858,896,944,1084,1545,1769,1959,2034 'genuin':606 'get':2887,3219 'gh':2165,2168,2181,2257,3119,3369 'git':1067,1148,1491,1659,1688,1761,2175,3347,3366 'given':1564 'glob':2378 'gotcha':3248 'graphit':2162 'green':3142 'grep':2377 'ground':1128 'group':2129,2224,2230 'gt':2163 'gt/gh':2103 'halt':846,963,2008,2014,2789,3094,3096,3589,3601 'handl':3175,3379 'handoff':271,1248,2412,2427,2702,2706,2760,2767,3013,3565 'happen':2553,3637 'har':123,2733 'hard':166,183,195,202,566,1057,1463,2872,2875,2877,2883,2891,2903,2908 'hard-chees':2890 'hard-fail':1462 'harness-agnost':122 'head':1500 'heavi':857,996,1083,1897,2033,3414 'high':307 'high-blast-radius':306 'highlight':818 'histori':2590 'hold':1243 'host':879,1062,1145,1157,1169,1446,1524,1666,2200,2595,2603,2619,2621,2732,3406,3462,3464 'host-agnost':2594 'host-by-host':2618,3461 'host-specif':1156 'human/agent-facing':643 'id':1651 'identifi':1272 'implement':69,1431,1824,3178,3185 'impli':588 'implicit':256 'in-prompt':157 'includ':792 'incomplet':1035,1791,3076 'independ':20,369,2112 'index.lock':1763,3348 'individu':1721 'infer':3575 'inherit':2643 'inlin':874,909,1211,1390,1409,3190,3276,3287 'inline-degrad':908,1210,3275,3286 'input':162 'insid':2841 'instal':335 'instruct':1106,1342 'integr':75,417,621,938,2000,2913 'integration-level':1999 'intend':371 'interact':276 'interfac':395 'intermedi':1852 'intern':1123,1265,3316 'invari':2611,3470 'invent':3552 'invoc':161,3283,3465 'invok':1119,1679,2195,2264,2927,3254,3605 'item':1392,1429,3196 'json':661,707,2546,3444,3450 'json-compat':660 'kdiff3':2190 'keep':656,1260,1375,1615,1855,1911,2466 'kernel':3624 'know':3646 'last':842,3583 'latest':222,2944 'layout':1003,2069 'lead':3631 'leav':1350 'level':2001,3266 'like':38 'line':3584 'linear':2097,2098 'list':387,518,562,667,1624,1864,1869,2270,2507,2529 'live':179,3625 'llm':442 'load':1139 'lock':253,3208 'longer':2964 'main':2095,2342 'make':3200 'manifest':626,632,657,1029,1114,1147,1285,1352,1372,1381,1502,1594,1617,1741,1793,2051,2273,2357,2432,2476,2483,2501,2543,2564,2575,2938,2959,3127,3321,3448,3478,3616 'manifest-schema.json':3459 'manual':1690,2167,2349,3118 'manufactur':3649 'map':505,666 'mark':224,1585,1790,2946,3048,3075,3223 'markdown':2786 'max':819,3028 'may':1118 'mcp':884,1438,1563,2656,3541 'md':41,173,182,1929,1939,1951,2715,2771,2781 'mean':1815 'mechan':1065,2584 'medium':205,914,989,1944,2911 'memori':2635 'merg':587,918,955,969,1166,1216,1634,1672,1710,1797,1881,1925,1935,2053,2185,2302,2308,2312,2398,2512,2852,3057,3171,3392 'merge/wiring':3055 'merger':1853,2520 'mergiraf':1687,2188 'messag':1521 'metacognit':187 'metadata':2231 'minim':799,1394 'minimum':2784 'miss':1056,3126 'mode':277,3278,3289 'model':1557,2645,3530 'modifi':1231,1302 'multi':680 'multi-docu':679 'must':431,1460,2374,3305,3378 'n':85,548,553,894,2090,2119 'name':1600,2600,2793 'narrow':3533 'nativ':1448 'need':494,547,1126,1629,2156,2351,3001 'nest':3250 'never':623,1079,1417,2447,2599,2727,3130,3140,3149,3604 'new':796 'next':230,1034,2020,2445,2558,2790,2951 'no-chain-forward':1967,2677 'none':1349 'normal':3257 'null':672 'number':669,2276 'ok':2788 'one':411,473,502,508,528,743,754,1310,2062,2079,2366,3004,3220 'onto':1644,1804 'open':239 'open-end':238 'oper':3383 'option':1259 'orchestr':207,248,831,873,928,959,1004,1406,1415,1555,1646,1806,1893,2139,2145,2360,2364,2459,2598,2691,2720,2924,3148,3158,3187,3297,3377,3394 'orchestrator-sid':2138 'order':1652,1657,1747,2268,2339,2345,2346 'orthogon':2081 'otherwis':1441 'output':723,3023,3489,3501 'outsid':1833 'overlap':739,789,3018 'pa':46 'parallel':30,285,404,895,1189,2120,3344 'parallelis':70 'paraphras':3593 'parent':2648,2756 'partial':3144 'pass':583,991,1720,1965,1983,1989,2315,2683,2876,2902 'past':3132 'path':170,1357,1382,1598,1618,1858,2484,2502,2524,2565 'pattern':130 'paus':1242,1347 'peer':152,1552,1958,2642,3522 'per':73,192,269,475,630,942,1144,1205,1277,1451,1567,1701,1849,2383,2393,2425,2517,2626,2716,2775,2830,2880,3067,3165,3423,3430 'per-curd':72,191,1204,1566,1700,1848,2382,2392,2516,2774,2879,3066,3164,3422 'per-host':1143 'per-phas':2424 'per-run':629 'per-step':268 'per-task':941 'per-wir':3429 'permiss':1140,1146,1371,2475,3615 'persist':3388 'phase':199,223,231,258,381,718,827,829,847,1013,1036,1292,1298,1386,1503,1508,1632,1705,1728,1794,1877,1890,1980,2005,2024,2026,2219,2287,2421,2426,2436,2468,2488,2509,2547,2571,2638,2673,2764,2792,2797,2838,2853,2859,2905,2945,2952,2956,2979,3080,3089,3098,3133,3198,3204,3228,3337,3390,3472,3483,3495,3514,3549,3554,3557,3563,3602,3618 'phase-nam':2791 'phrase':37 'pick':925,1641,1662,1801,2152 'pipelin':27,312,1203,1902,3410 'plain':1069 'plan':101,685,994,1178,1183,1323,2029,2227,2323,3111,3206,3455 'planner':998,2038,2060,2126,3437,3500 'plus':591,3467 'point':2834 'portabl':121,1454 'post':968,1215,1880,2311,2397,3170 'post-merg':967,1214,1879,2310,2396,3169 'pr':684,993,997,2028,2037,2068,2080,2117,2124,2169,2178,2182,2223,2251,2258,2275,2322,2333,3120,3370,3382,3436,3454,3499 'pr-plan.yaml':2233,2242,3507 'pre':851,1016 'pre-compil':850,1015 'prefer':338,1434,2157 'prepend':2809 'present':1141,1175,1440 'press':374,2314 'press/age/cure':1996 'primit':1160,1529,2592,2604,2606,2739 'prior':2637 'problem':325,1043 'proceed':1296,1360,3131 'produc':384,1108 'progress':2439,2723 'project':581,1150,1474,2822 'prompt':159,952,1072,1091,1569,1611,1777,2042,2496,2686,3419,3426,3433,3441 'propag':184,2873,2931 'protocol':1399 'prs':33,87,1703,2091,2122,2143,2331,2332,3069 'publish':995,1006,2030,2142,2160,2179,2220 'purpos':149,860,898,946,1086,1547,1771,1961,2036 'push':888,1494,2235,3367,3381 'qualiti':1049,1152,1383,1471,1619,1712,1862,2485,2503,2525,2566,2817,2824 'question':272,1312 'race':1759,3327,3349 'radius':309 'rather':1273 're':813,1237,1320,1325,1329,1333,2976,3025 're-decompos':1236,1324 're-execut':2975 're-rend':1319 're-run':812,1332,3024 're-run-decompos':1328 'read':217,703,853,1018,1027,1625,1737,2229,2365,2376,2404,2416,2423,2570,2700,2937,3151,3561,3585 'readme.md':1457 'reason':1374,1913,2478 'rebas':2966 'recommend':2747,3400 'recoveri':2981,2983 'ref':3456 'refer':2960,3314,3412 'references/curd-prompt.md':1571,3421 'references/decomposer-prompt.md':1094,3413 'references/manifest-schema.json':655,3443 'references/pr-plan-schema.json':701,3449 'references/pr-planner-prompt.md':2045,3435 'references/spawn-primitive-reference.md':2616,3460 'references/wiring-prompt.md':1780,3428 'regain':2692 'registr':423 'reli':2587 'reliabl':450 'remain':458 'renam':487 'render':1321 'repo':3630 'report':1355,1718,1854,2280,2409,2802,2867,2953,2971,2988,3035,3086,3106,3634 'request':1315 'requir':729,2992,3270,3477 'rerer':1689,2189 'residu':3639 'resolv':1695,1840,3227 'rest':2216 'restrict':3538 'result':1573,2213,2286,2712 'resum':167,216,1026,2569,2936,2954,3124,3560 'retri':821,1343,1580,1586,1591,1785,2301,3030,3042,3073,3212,3221,3599 'return':1613,2134,2498,2675,2688,3572 'review':32,71,76,86,104,311,970,1202,1882,1901,1912,2002,2313,2752,2900,2920,3262 'review-on':103 'rich':2801 'right':2154 'risk':3640 'rout':242,424,3159 'rule':1420,1455,3516 'run':28,264,542,631,814,901,1264,1330,1334,1470,1711,1898,1978,2388,2670,2820,2915,2996,3026,3160,3403 'satisfi':432,602,2608 'scaffold':1115 'schema':649,2718,2762,2807,3445,3451 'schema-shap':648 'scope':463 'scripts/pr_plan_to_branches.py':702,2239,3505 'scripts/validate_decomposition.py':736,3482 'scripts/validate_manifest.py':727,3471 'scripts/validate_pr_plan.py':3494 'seam':80,1365,1604,1842,2456,2463,2535,2582 'section':730,3479 'see':214,2615,2934,3284 'seed':392,592,615,798,800,872,1109,1184,1287,1300,1388,1391,1408,1422,1428,1504,1875,2100,2107,2116,2290,2326,2837,3031,3195 'seed/wiring':2088 'self':2539,3308 'self-contain':3307 'self-summari':2538 'semant':2753,3485 'send':42 'sentenc':482,2551 'sequenti':310,935,1185,1389,1734,1748,1918,3341 'set':1171,1291 'shape':650,698,733,848,2065,2066,2785,3003 'share':595,607,611,624,1247,1397,1830,2340,2898,2918,3622 'share-for-review':2897,2917 'shas':1507,1602,1873,2532 'ship':82 'sibl':125,585 'side':2140 'silent':2870,2974,3603 'singl':93,297,303,480,532,990,1520,1982,2070 'skill':5,50,160,282,293,1008,1267,1459,1561,1861,2136,2148,2197,2202,2207,2653,2746,3012 'skill-cheese-factory' 'skills/age/references/voice.md':3627 'skills/age/skill.md':3285 'skills/hard-cheese/skill.md':215,2935 'skip':1031,1080,2948,3556 'slice':797,2086 'slug':176,1376,1616,1856,2011,2413,2428,2442,2479,2500,2522,2561,2703,2707,2726,2761,2768,3566 'small':364,1425,2071,3194 'smallest':357 'soften':3596 'source-paulnsorensen' 'spawn':899,947,981,1081,1159,1514,1919,1953,1977,2031,2591,2627,2696,2709 'spec':15,54,109,169,178,305,314,390,512,747,854,1020,1039,1097,1369,1377,1857,2057,2369,2418,2473,2480,2523,2562,2985,2995 'specialis':340 'specif':1158,2602 'specul':3643 'split':500 'src/orders/order.test.ts':543 'stack':2096,2104,2106,2159,2166,2263,2325,2335,3114 'stake':204,913,988,1943,2910 'stale':3384 'start':1228 'statement':1044 'status':1596,2007,2288,2443,2787 'stay':647,3014 'stdout':2452,2729 'step':270,1256,2848 'still':1788,3078 'stop':839,1483,1696,1716,1812,2016,2866,2987,3034,3053,3083,3097,3107 'stori':517,1046 'strategi':2454 'stream':682 'string':668 'structur':3474 'style':976,1885 'sub':143,862,979,1000,1089,1224,1549,1773,1908,1963,2040,2400,2407,2450,2630,2668,3155,3173,3237,3264,3281,3417,3439,3518,3570,3580 'sub-ag':142,861,978,999,1088,1223,1548,1772,1907,1962,2039,2399,2406,2449,2629,2667,3154,3172,3236,3263,3280,3416,3438,3517,3569,3579 'subag':3534 'subset':663 'substitut':456 'succeed':2296 'succeeded/failed':2555 'success':3576 'summari':1042,1378,1614,2058,2356,2481,2499,2540,2548,2563,2572 'support':3273 'surfac':2012,3095,3105,3588 'syntax':644 'tag':677 'target':530,759,1195,1311 'task':299,418,943,1744,1784,1829,3330,3432 'templat':1092,1778,2043,3420,3427,3434,3442 'term':352 'territori':1825 'test':529,534,549,758,766,1194,2390,3162 'text':164,1098,1179,1370,2281,2474 'thing':2367 'three':385,977,1917,2455 'tight':2074 'tilth':883,1437 'titl':2334 'token':435,448,2361,3239,3246 'tool':881,1450,1559,2203,2650,3539 'top':835,2812 'top-to-bottom':834 'topic-agent-skills' 'topic-ai-coding' 'topic-claude-code' 'topic-code-review' 'topic-developer-tools' 'topolog':420,1746 'total':2072 'touch':1823,2084 'transit':1268 'twice':1346,1592 'two':497,560,604,776,1827,1987 'two-cure-pass':1986 'type':394,1198,1398,2341,3535 'typic':2827 'ultracook':975,1884 'ultracook-styl':974,1883 'unambigu':298 'unattend':284 'unavail':886,1468 'unit':361,405 'unrecognis':2206 'unrecognised-skil':2205 'up':3652 'updat':1501,1593,2272,2433 'url':2278 'usag':449,3240 'use':8,48,90,289,294,1245,1270,1670,2238,3242 'user':11,65,516,826,869,1045,1163,1173,1339,3016,3088,3138,3402,3613 'user-approv':3612 'user-vis':3015 'usual':171 'valid':717,725,810,864,1037,1103,3475,3486,3497 'valu':279 'verbatim':3590 'verif':3176 'verifi':536 'via':856,876,1007,1486,1522,2198,2252,3559,3610 'vibecheck':2893,2921 'violat':817,3020 'visibl':3017 'vitest':541 'vocabulari':1280 'voic':3623 'vs':291 'walk':832 'want':24,66 'wave':937,1537,1736,1751 'whole':26,68,378 'whose':177 'wire':416,619,780,934,950,956,957,1111,1196,1630,1730,1738,1743,1765,1783,1798,1802,1813,1822,1828,1845,1876,2048,2102,2109,2123,2304,2329,2514,2856,3070,3183,3218,3231,3303,3313,3322,3326,3329,3431 'wiring-on':949 'within':936,1735,1749 'without':584,1361,1404,3136,3372,3608 'work':96,106,368,1074,1757,2410,3145,3335 'worker':153,1517,1542,1766,2385,2395,2660,2777,2844,3167,3253,3360,3425,3525 'worktre':1058,1064,1068,1597,1671,1674,3385,3387 'worthi':360,571 'write':1284,1288,1418,1927,1937,1949,2006,2019,2127,2431,2536,2705,2710,2765,2800,3177,3191 'write-manifest-then-se':1283 'written':634,690 'wrong':1821,2745 'x':484 'y':486 'yaml':636,640,665,692,705,712 'z':488","prices":[{"id":"8bcea6c1-8a28-43f6-ac60-74c9798a38da","listingId":"06a133cb-b012-461d-84ec-03d8571b6be7","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"paulnsorensen","category":"easy-cheese","install_from":"skills.sh"},"createdAt":"2026-05-18T13:21:08.001Z"}],"sources":[{"listingId":"06a133cb-b012-461d-84ec-03d8571b6be7","source":"github","sourceId":"paulnsorensen/easy-cheese/cheese-factory","sourceUrl":"https://github.com/paulnsorensen/easy-cheese/tree/main/skills/cheese-factory","isPrimary":false,"firstSeenAt":"2026-05-18T13:21:08.001Z","lastSeenAt":"2026-05-18T19:13:40.353Z"}],"details":{"listingId":"06a133cb-b012-461d-84ec-03d8571b6be7","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"paulnsorensen","slug":"cheese-factory","github":{"repo":"paulnsorensen/easy-cheese","stars":7,"topics":["agent-skills","ai-coding","claude-code","code-review","developer-tools"],"license":"mit","html_url":"https://github.com/paulnsorensen/easy-cheese","pushed_at":"2026-05-18T06:33:38Z","description":"Cheese your code 🧀 — high-quality results as easy as cheese. A portable, harness-agnostic Agent Skills toolkit.","skill_md_sha":"8c9bf81f55dec53cb131ab7b667fd3d50cdd1ad7","skill_md_path":"skills/cheese-factory/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/paulnsorensen/easy-cheese/tree/main/skills/cheese-factory"},"layout":"multi","source":"github","category":"easy-cheese","frontmatter":{"name":"cheese-factory","license":"MIT","description":"This skill should be used when the user has an approved spec that decomposes into 5+ independent behavioural curds and wants the whole pipeline run in parallel with reviewable PRs at the end — phrases like \"/cheese-factory .cheese/specs/<slug>.md\", \"send through the factory\", \"parallelize this spec\", \"many curds\", \"fan out the implementation\", \"cheese-factory this\". Runs inline and spawns full-peer general-purpose sub-agents per phase (decomposer, per-curd workers, wiring, post-merge review, PR planner), ending in 1–N reviewable PRs via `/pr-stack`. Use even when the user mentions `/fromagerie` — `/cheese-factory` is the portable harness-agnostic sibling. Supports `--hard` propagation and `--resume <slug>` to continue a crashed pipeline. Do NOT use for single coherent specs (`/cook`, `/ultracook`), fuzzy planning (`/mold`), review-only work (`/age`), or specs with fewer than 5 curds (`/ultracook`)."},"skills_sh_url":"https://skills.sh/paulnsorensen/easy-cheese/cheese-factory"},"updatedAt":"2026-05-18T19:13:40.353Z"}}