π² CAULDRON β Full Protocol
SkillDev toolsTwo-phase discipline for large cross-cutting technical plans. This file documents the full CAULDRON protocol: when to invoke, how each K-line works, how cauldron composes with the rest of MOOLLM, and a full worked walkthrough against the first real-world instance.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the π² CAULDRON β Full Protocol skill
About this capability
MOOLLM
What this skill tells your AI
The instructions your AI receives, as published by simhacker/moollm in skills/cauldron/SKILL.md and read by ahelβs review.
Two-phase discipline for large cross-cutting technical plans. This file documents the full CAULDRON protocol: when to invoke, how each K-line works, how cauldron composes with the rest of MOOLLM, and a full worked walkthrough against the first real-world instance.
Classification: meta-orchestrator. Cauldron is not a leaf skill β it sequences K-lines, iterates within them (SCRY loops, STIR turns, TASTE/STIR ping-pong), conditionally branches on state signals, composes sub-skill outputs into next-step inputs, and delegates work to three tiers: tools (sister-scripts), other LLM skills (trekify/skill-snitch/committee), and the LLM itself (for holistic interpretation). See CARD.yml orchestration_model for the full state machine, guards, and delegation classification.
Patron: The Weird Sisters (Macbeth). Practical, not parodic: the brew produces dinner, not curses.
Tagline: Melt a big plan down. Ladle out small PRs.
See GLANCE.yml for the 50-line summary and CARD.yml for the machine-readable interface. See README.md for the pitch. See META-PLAN.md for the self-replication story β how cauldron was brewed, how future cauldrons mutate, the Thumb Principle, and the Three Laws.
1. When to invoke CAULDRON
Use cauldron when all three are true:
- The problem is cross-cutting β touches multiple apps, subsystems, repos, or roles.
- The total work is many PRs worth β at minimum 5, more usually 10β20.
- Multiple people or LLM agents can usefully work on different parts in parallel once the shape is known.
Do not use cauldron for:
- Single-PR changes. Write a clear PR description and ship it.
- Exploratory research where the shape of the problem isn't known yet. Start with a small "what do I even want to know?" doc and iterate on smaller scales; invoke cauldron once you hit "this spans multiple systems."
- One-person efforts with no future readers. Cauldron is leverage through docs; no audience = no leverage.
- Production incidents. Fix the thing. Write the playbook afterward if the incident will recur.
1.5. Cauldron is a meta-orchestrator
Cauldron's job is not to do the work. Its job is to sequence, iterate, branch, compose, and delegate β so the right actor does the right step at the right time, with the right inputs from the prior step.
Sequential. Phases run in order: MELT β STIR* β LADLE β ANCHOR β LINK β TASTE β SERVE. This is the happy path.
Iterative. Three nested iteration shapes:
- STIR Γ N turns β every user message folds into the monolith; Phase 1 may last 30+ turns.
- SCRY Γ N reports β within ANCHOR / LINK / TASTE, tool-reports-LLM-decides-iterate loops run until the report is clean OR the tool itself needs fixing (meta-fix).
- Phase ping-pong β TASTE can send you back to STIR if smells are structural; LADLE can be redone if the monolith wasn't stable after all.
Conditional. Cauldron branches on state signals, not on fixed schedules:
| Signal | Guard | Transition |
|---|---|---|
| Section numbers renumbering? | Yes β stay in STIR. No β eligible for LADLE. | STIR β STIR or STIR β LADLE |
| SCRY report clean? | Yes β next phase. No β LLM fixes content or fixes the tool; re-SCRY. | in-phase iteration |
| TASTE found structural smells? | Yes β back to STIR (redo content). No / cosmetic β SERVE. | TASTE β STIR or TASTE β SERVE |
| Skill-snitch audit clean? | Yes β SERVE commits. No β tighten trekify dict; re-PROBE; re-SCRY. | SERVE iteration |
Composing. Output of step N is a named, typed input to step N+1. No hidden state:
MELT β {monolith_path, session_id}
STIR β {sections_modified, questions_added/resolved, consolidated_monolith}
LADLE β {created_files, section_map, playbook_list}
ANCHOR β {verified_count, broken_citations} (SCRY until broken == [])
LINK β {links_checked, broken_links} (SCRY until broken == [])
TASTE β {smells, next_steps} (branch: STIR or SERVE)
SERVE β {commit_sha, pr_url, example_dir, dispatch_plan}
Delegating to three tiers. Every step in cauldron is one of:
- Delegated to a tool (sister-script). Mechanical, verifiable, deterministic work. Examples:
split_monolith.py(LADLE),link_check.py(LINK),anchor_verify.py(ANCHOR). The tool reports; cauldron reads the report and decides. SCRY shape. - Delegated to another LLM skill. Specialized LLM judgment that already has a home. Examples:
adversarial-committee(STIR),empathic-templates(LADLE),trekify+skill-snitch(SERVE),thoughtful-commitment(SERVE),cursor-mirror(MELT, STIR, SERVE). Each sub-skill's output becomes cauldron's next-step input. - Done by the LLM itself inside cauldron's phase. Holistic interpretation that no sub-skill covers. Examples: choosing the initial section set in MELT; writing a walk-back in STIR; smell-testing the whole tree in TASTE. Cauldron acts; it doesn't delegate.
Why the classification matters. Most MOOLLM skills are leaves: one input β one output. Meta-orchestrators aren't: they carry state across phase boundaries, iterate with signal-driven loops, compose sub-skill outputs, and delegate to the right actor at each step. Other MOOLLM meta-orchestrators include debate / adversarial-committee (multi-agent), plan-then-execute (gated phases), play-learn-lift (3-phase sequential). Cauldron is the most complex of them β 7 phase-specific K-lines + 1 cross-cutting (SCRY) + iteration + branching.
If you want to build another meta-orchestrator (e.g. a publish-book skill, an onboard-new-hire skill), cauldron's structure is the template. The three-tier delegation classification β tool, sub-skill, LLM β generalizes beyond plans into any multi-step coordinated workflow.
See CARD.yml orchestration_model for the state-machine diagram with explicit guards.
1.6 Model routing β four models, four jobs
Cauldron already splits design (Phase 1) from execution (Phase 2 playbooks). In Cursor, that split maps to a four-model pipeline. Switch models at phase boundaries; don't ask one model to melt, ladle, execute, and review in a single thread.
Full machine-readable spec: protocols/MODEL-ROUTING.yml.
| Stage | Cauldron protocols | Recommended Cursor model | Optimizes for |
|---|---|---|---|
| Melt & stir | MELT, STIR | Claude Opus 4.7 (High or Medium) | Architecture, edge cases, walk-backs, Appendix B, adversarial-committee |
| Ladle & structure | LADLE, ANCHOR, LINK | GPT-5.5 (High or Medium) | Numbered steps, acceptance criteria, playbook scoping, verification blocks |
| Execute | Playbook Steps (executor pickup) | Composer 2.5 (fast default) | Speed, tool use, following written steps one phase at a time |
| Review | TASTE; post-land REVIEW | Claude Opus 4.7 (High or Medium) | Smell-test, structural gaps, confirm executors didn't shortcut constraints |
Why this split:
- Opus for melting β Phase 1 is finding shape. Relationships form; rules clash; walk-backs must stay visible. Opus-class models hold contradictions and "what could go wrong" without rushing to implementation.
- GPT-5.5 for ladling β Ladling turns narrative design into machine-actionable runbooks: empathic-template playbooks with atomic Steps, inline Verify, Rollback, Success criteria. That's structured-spec work, not architecture discovery.
- Composer 2.5 for execution β Executors should not re-derive the monolith. They read Navigation + Prerequisites + one playbook (often one phase per session) and run Steps. Composer 2.5 is tuned for sustained agentic coding at lower cost when the runbook is explicit (Cursor Composer 2.5 blog).
- Opus for review β Review is a different job from execution. A fresh Opus pass catches vague TBDs, missing verification, scope creep, and constraint violations. For high-stakes brews, add a second reviewer via
REVIEW.*sidecars (see SELF-OPTIMIZATION-ROADMAP.md Layer 5 panel review).
Session hygiene:
- New chat when switching model tier (especially MELT β LADLE β EXECUTE β REVIEW).
- Executor prompt: "Execute Phase N only from
playbooks/PB-XX-β¦.md. Do not infer missing context. Stop-and-escalate on unexpected state." - Doc gaps go back to STIR on an Opus thread β don't patch architecture in a Composer session.
Budget alternatives (see MODEL-ROUTING.yml): Sonnet 4.6 for smaller melts; GPT-5.5 Low for obvious ladles; Composer 2 if 2.5 unavailable; GPT-5.5 High as second reviewer without a second Opus pass.
Evidence elsewhere in MOOLLM: cursor-mirror/reference/universal/model/models.yml documents Cursor's internal routing (plan: gpt-5-high, synthesis: claude-4.5-opus-high) β cauldron's pipeline aligns with that separation at human-visible phase boundaries.
2. The K-lines
Seven phase-specific protocols (MELT through SERVE) plus one cross-cutting: SCRY, the lint-in-the-loop pattern that runs inside LINK, ANCHOR, TASTE, and SERVE. Each K-line activates a protocol cluster.
2.1 MELT β start a Phase-1 monolith
Input: a topic name, scope description.
Output: docs/<topic>-plan.md seeded with:
## 1. Current state: what is wrong(the audit of why we're doing this)## 2. Target model(the proposed change)## 3. Affected surfaces(what changes where β filled in during STIR)- β¦ (sections accumulate during STIR)
## N. Open questions(reserved; short)## Appendix A. Design wisdom and conventions(reserved for cross-cutting principles)## Appendix B. Questions still awaiting a decision(the tracker)
Composition: calls bootstrap for session warmup; reads kernel/naming/NAMING.yml to inherit big-endian / prefix-as-owner rules; applies yaml-jazz discipline to Appendix B.
Discipline:
- Every top-level section is numbered (Β§1, Β§2, β¦) and every sub-section is dotted (Β§3.1, Β§4.5.2). Numbers may be renumbered during Phase 1 but the existence of numbering is non-negotiable.
- Appendix B structure is fixed: B.1 resolved / B.2 open not-blocking / B.3 newly raised / B.4 drafting-answered.
- No implementation files are created. The plan is text.
2.2 STIR β fold a new turn into the monolith
Input: user message or clarifying turn; current monolith.
Output: modifications to one or more sections; possible new entries in Appendix B.
Steps taken by STIR:
- Read the monolith (or the relevant Β§).
- Identify which Β§ is affected. If none, create a new Β§ or Appendix subsection.
- Compose with
cursor-mirrorto probe earlier sessions for related ingredients. - Compose with
adversarial-committeeif the user's input is contested (e.g., "should we abstract events?"). The committee's verdict lands in the Β§ as reasoning, not just conclusion. - Update cross-references. If a new Β§ is added, scan other sections for mentions of the same concept and add the Β§-number link.
- If a question was raised but not answered, add an entry to Appendix B with a default answer and mark it
status: open. - If a prior question is now answered, move it from B.2/B.3 to B.1 ("resolved, kept for audit"). Do not delete β the audit trail is a gift to future readers.
Walk-backs are sacred. If the user rejects a previously-accepted idea, update the Β§ to open with "An earlier draft proposed X; that design is cancelled. Reasoning: β¦" and keep the rejected design visible. Future readers need to see the rejected alternatives, not just the surviving one.
Composition: cursor-mirror, adversarial-committee, no-ai-slop (ambient), no-ai-hedging (ambient β every claim gets a confidence), postel (ambient β tolerate messy user instructions).
2.3 LADLE β split the stable monolith
Precondition: the monolith's section numbering has been stable across at least the last 3 STIR invocations. If sections are still being renumbered, Phase 1 is not done.
Input: monolith path, output directory, sectionβfile mapping.
Output: the Phase-2 tree:
docs/<topic>/
README.md β scope + navigation
01-<shortname>.md .. NN-<shortname>.md β topical files, one per top-level Β§
design-wisdom.md β Appendix A
<N>-open-questions.md β Appendix B carried forward
playbooks/
README.md β dependency graph + PR index
PB-01-<short>.md .. PB-NN-<short>.md β one per landable PR
META-PLAN.md β process wisdom extracted from this brew
Steps taken by LADLE:
- Section mapping. The caller supplies a map:
Β§N β filename. Cauldron writes this as a YAML comment block at the top of the split script. - Split mechanically.
scripts/split_monolith.pywalks## N.boundaries and writes each slice to its target file. No manual copy-paste. - Preamble per file. Each topical file gets a
> Maps to Β§XβΒ§Ypreamble + back-link to the monolith for archaeology. - Playbook generation. For each landable PR, empathic-templates fills
templates/playbook.md.tmplfrom the relevant sections. - README generation.
templates/topical-readme.md.tmplfills with the topic table, the target-model summary, and the playbook index.
Composition: empathic-templates provides the slot-filling; sister-script convention governs the Python scripts (doc-first: the script's behavior matches what the doc says).
Output principle: keep the monolith. It's the Phase-1 artifact of record. Someone may want to scroll it end-to-end; someone may want to diff it against a future rebrew; someone may want to cite a Β§-number in a meeting. One file's worth of storage is not worth deleting.
2.4 ANCHOR β re-verify every claim
Input: the output directory from LADLE.
Output: a report of every claim verified + every claim that didn't match the code.
Steps:
- Walk every markdown file.
- For each
`apps/foo/bar.py:123`orline 162orfunction_namein a code-reference position, run a ripgrep that should match. - If the match fails or has moved (different line number), flag it.
- Collect all flags into a report.
Why: line numbers drift. Function names get refactored. File sizes change. The Phase-1 monolith captured a snapshot; the tree might land days or weeks later; the code may have moved. ANCHOR is the "re-verify before committing" step.
Composition: ripgrep does the grepping; no-ai-hedging forbids "line ~120ish" phrasing β if a line number is cited, it's cited exactly or marked "drift-prone, re-grep on execution."
2.5 LINK β bidirectional navigation + link-checker
Steps:
- Playbook Navigation blocks. Each playbook gets
## NavigationwithPreceded by / Unlocks / Related / Design source. TheDesign sourcelinks into the topical doc sections. - Topical
## Implemented byblocks. Each topical doc gets a footer listing which playbooks implement its prescriptions. - Playbook
## See alsoblocks. Reverse-direction from Navigation: what to monitor after landing, parallel playbooks, follow-up PRs. - Link-checker.
scripts/link_check.pyiterates every[label](target)and verifies the target exists. Broken links are a silent tax β eliminate them.
K-REF format (from k-lines skill): path/to/file.md#section-anchor with inline type/description.
Composition: k-lines for the cross-reference format.
2.6 TASTE β end-to-end readthrough
Input: the tree.
Output: a smell report: vague TBDs, dangling questions, inconsistent style, over-ambitious playbooks, under-specified verification.
Smells to detect:
- Phrases like "figure out later" / "TBD" / "we'll see" β commit to a default or mark as an Appendix B entry.
- Playbook steps without verification.
- Cross-refs that resolve but point at the wrong thing (caught by reading, not by link-checker).
- Playbook scope that's obviously >1 PR worth.
- Unresolved open questions that block a named playbook β should be flagged in the playbook's Prerequisites.
- Claims phrased with qualifier-stacks ("may potentially", "could perhaps be") β
no-ai-hedgingapplies.
Composition: no-ai-slop, no-ai-hedging, adversarial-committee on contested sections, postel for charitable interpretation of the author's earlier self.
2.7 SERVE β deliver to executors
Input: the tree, plus delivery options.
Output:
- A
thoughtful-commitment-style commit for the split PR, linking back to the cursor-mirror session. - Optionally: a trekified teaching copy in the cauldron skill's
examples/directory.
Steps:
thoughtful-commitment COMMITwith the rich message (summary + per-playbook list + link to META-PLAN.md).- If
create_trekified_example, calltrekify MASK-FILEover each file in the tree, using the project-specific substitution dictionary. - Run
skill-snitch SCANover the trekified output. Iterate if anything proprietary leaks through. - Commit the trekified example as a second PR against
moollm/skills/cauldron/examples/<topic>/. - Produce a PR description referencing the dependency graph and suggesting a dispatch order for executors.
Composition: thoughtful-commitment, trekify, skill-snitch.
2.8 SCRY β lint-in-the-loop (cross-cutting)
Every other cauldron K-line that does verification uses SCRY: run a mechanical tool, read its text report, interpret, iterate.
Principle: tool reports, LLM decides, iterate until clean.
The tool is a sensor, not a judge. Its job is to tell the LLM faithfully what the literal state of the artifact is: which links are broken, which line numbers drifted, which TBDs are dangling, which secrets might have leaked through trekify. The tool does not decide what to do about its findings. The LLM does that.
Shape:
while iteration < max_iterations:
report = run_tool(target)
if report.clean: return CLEAN
interpretation = llm_interpret(report, context)
if interpretation.is_false_positive:
update_tool_or_config(interpretation) # meta-fix
continue
if interpretation.is_genuine_issue:
apply_fix(interpretation.fix)
continue
if interpretation.is_ambiguous:
return ESCALATE_TO_HUMAN
Two observed failure modes that SCRY handles:
- Genuine issue. Tool says "broken link"; the link really is broken; LLM fixes it. (This is the common case.)
- False positive that reveals a tool bug. Tool says "broken link"; the "link" is a literal
[label](target)inside prose code blocks; LLM recognizes the tool's code-stripping is incomplete; LLM fixes the tool, re-runs, tool now passes. The tool improves through use.
Why this pattern instead of "just write the right tool":
- Tools that decide silently are risky β they paper over issues the LLM should surface.
- Tools that dump every possible warning produce noise the LLM has to re-interpret every run.
- The balance: tool cites specific locations faithfully; LLM applies context-aware judgment.
Neither sufficient alone. Neither optional. Iteration is the expected shape of the work.
Implementations in this skill:
scripts/link_check.pyβ SCRY for cross-reference integrity (used by LINK).scripts/anchor_verify.pyβ SCRY for code-citation drift (used by ANCHOR).- Planned: TASTE's smell-scanner; SERVE's skill-snitch wrapper.
The same pattern elsewhere in MOOLLM:
skill-snitch SCANβ scans skill sources for security smells; LLM interprets/fixes.trekify PROBEβ scans transcripts for leaked credentials; LLM masks.trekify LONG-RANGE-SCANβ scans the workspace; LLM audits findings.cursor-mirror tgrepβ scans transcripts; LLM interprets patterns.sister-script's entire premise: tools emit text for LLMs to read, not just for machines to consume.
Tool contract (what any SCRY-compatible tool must do):
- Produce text output (not JSON only β humans and LLMs read the same stream).
- Cite specific locations (
file:line, not "somewhere in the repo"). - Exit non-zero on issues (so CI integration works).
- Be deterministic given the same input.
- Be fast (< 10s for the full tree).
- Never silently apply fixes. That's the LLM's job.
- Never hide details. The LLM needs the full context to decide.
- Never rename / reformat without telling the LLM what changed.
- Never be clever about "what you probably meant." Escalate instead.
LLM contract (what the LLM must do when reading a SCRY report):
- Read the whole report, not just the summary.
- Distinguish false positives (tool was wrong) from real issues (fix needed).
- Fix at the right level β could be tool config, could be doc content, could be escalation to a human.
- Re-run the tool to verify the fix worked. Don't assume.
- Never ignore the report because "I'm sure it's fine."
- Never silently suppress warnings without documenting why.
See also: protocols/SCRY.yml for the full protocol spec. This pattern is general to MOOLLM and deserves to be called out alongside sister-script as a core principle of how tools and LLMs cooperate.
3. Worked walkthrough β the configuration-flags instance
The first real-world cauldron instance. 30+ turns of Phase 1, then a single LADLE. Here's what each K-line did:
3.1 MELT
User: "You ever work with env vars that gate python imports and silently break autotest?"
Cauldron responded by:
- Reading
moollm/kernel/naming/NAMING.ymlfor naming conventions. - Creating
central/docs/CONFIGURATION-FLAGS-PLAN.mdwith Β§1 (Current state), Β§2 (Target model), Β§3 (Affected surfaces), Appendix B (Questions tracker). - Seeding Appendix B with the questions implicit in the user's opening: "what's the canonical name? which aliases retire? what stays?"
3.2 STIR Γ 30
Each user turn folded into the monolith. Key STIR decisions preserved as walk-backs:
- Storage abstraction proposed (Β§5 draft 1) β cancelled (Β§5 current). The rejected design is still visible in Β§5's opening paragraph. Reason: Azure/edgebox future doesn't need a unified abstraction.
pystorage/pyevents/pybigqueryshared packages proposed β all three cancelled. Reasons preserved in Β§4.2 ("Not in this table").camera_codebug characterized as "silent NULL" β upgraded to "every insert fails silently." Evidence (ripgrep count + file inspection) preserved in Β§5 / Β§A.6.1.
Appendix B grew from 7 questions to 20. Most moved to B.1 (resolved) over successive turns.
3.3 LADLE
Single user turn: "Now break it up into separate documents in docs/configuration including a top level README.md summary index."
Cauldron's response:
- Decided the shape: README + 10 topical files + playbooks/ + design-wisdom.md + META-PLAN.md.
- Wrote a Python script that walked
## N.boundaries and wrote each slice to its target file. - Generated 13 playbooks, each following the 10-section empathic template.
- Added Navigation/Implemented-by/See-also blocks bidirectionally.
Total artifacts: 27 files, 5183 lines.
3.4 ANCHOR
Single user turn: "be evidence based, grep and tree and fuzzy search."
Cauldron's response:
Shortened here. Read the whole file on GitHub.
Signals
- GitHub stars
- 52
- Forks
- 5
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
cauldron- Source
- github.com/simhacker/moollm