Model-Mediated Development
Overview
Model decides. Code provides inputs and executes. This skill is a thinking lens that applies DURING other workflows, not a replacement for them.
Core question throughout: "What decisions exist, and who should make each?"
Integration with Development Workflows
This skill runs ALONGSIDE other skills:
| Phase | Use With | Model-Mediated Lens | |-------|----------|---------------------| | Design | brainstorming | Identify decisions, propose who makes each | | Planning | writing-plans | Distinguish pipes from decision layers | | Implementation | TDD | TDD for pipes, but no decision logic in code | | Verification | verification | Check for leaked heuristics |
Works with both Claude Code (superpowers) and Codex (bootstrappers).
During Design/Brainstorming
When designing any system that might involve model calls, explore:
Suggest possibilities:
- "This could be model-mediated - the model could decide X based on Y"
- "What if we gave the model tools for Z and let it figure out timing?"
- "Here's a tool interface that would give the model control..."
Ask yourself and the user:
- "What decisions exist in this system?"
- "For each decision: should it be user-controlled, model-controlled, or hardcoded?"
- "This could go either way - do you want explicit control or model judgment?"
Surface considerations:
- "If the model decides this, here's what it would need..."
- "If we hardcode this, we lose flexibility for..."
- "This feels like a decision - should we discuss who makes it?"
Not everything needs model-mediation. A CLI that takes explicit user input and calls an API is a dumb pipe. That's fine. The question is whether there are DECISIONS being made, and if so, by whom.
During Planning
When writing implementation plans, distinguish:
Dumb pipes (code):
- Fetch data, transform formats, call APIs
- Execute tool calls from model
- Provide factual inputs (time, state, history)
- Health checks, audit trails
Decision layers (model):
- What action to take
- When to take it
- What context to request
- How to interpret ambiguous intent
The plan should make clear: "Component X is a pipe - TDD applies. Component Y is a decision layer - model controls via tools."
During Implementation (TDD)
TDD applies to pipes. Write tests for:
- Data fetching works correctly
- Tool execution is reliable
- Inputs are gathered accurately
- Error handling is robust
But continuously ask:
- "Am I about to write an IF that decides behavior? Stop - that's model logic."
- "Am I pre-gathering context? Should model request this instead?"
- "Am I adding a threshold/rule? Why isn't the model deciding this?"
When uncertain, surface it:
- "This looks like it could be model-controlled. Thoughts?"
- "I'm tempted to add a safety check here - but that's compensating for the model. Should we improve the prompt instead?"
- "This pattern looks like [anti-pattern] - intentional?"
During Verification
Before claiming complete:
- [ ] All IF statements are execution flow, not decision logic
- [ ] Model receives tools, not pre-gathered context dumps
- [ ] Tool calls execute without filtering/modification
- [ ] No fallback logic compensating for model behavior
- [ ] Adding new behavior requires only prompt changes
Surface anything suspicious:
- "I notice we added X - this looks like a heuristic"
- "This threshold wasn't in the plan - should we discuss?"
- "The model's decisions are being filtered here - intentional?"
The Right Pattern
async execute(workItem, context) {
// === CODE: Factual inputs ===
const inputs = {
currentTime: new Date().toISOString(),
lastRunTime: await getLastRunTime(),
};
// === CODE: Available tools ===
const tools = [
{ name: 'get_context', description: '...' },
{ name: 'create_work_item', description: '...' },
];
// === MODEL: Reasons and decides ===
const result = await model.run({
system: buildPrompt(inputs), // Adversarial prompts included
tools,
});
// === CODE: Execute exactly what model decided ===
for (const toolCall of result.tool_calls) {
await executeToolCall(toolCall); // No filtering!
}
}
Multi-Turn Model Reasoning
Don't dump context. Let model request what it needs:
Turn 1: Minimal seed
Model: "What do I need to know?"
→ calls get_context(source: 'conversations')
Turn 2: Has some data, needs more
Model: "Is he busy today?"
→ calls get_context(source: 'calendar')
Turn 3: Enough to decide
Model: "I'll wait until after his meeting"
→ calls schedule_next(when: '11am')
Adversarial Prompts for Runtime Models
Build into system prompts:
- "What makes sense here?"
- "What information would help me assess this?"
- "What should I NOT do in this setting?"
- "What would [persona] do? What would [user] want?"
- "What if action 1 vs action 2?"
- "Review what you need, request it, then decide."
Anti-Patterns to Surface
When you see these, ask about them:
| Pattern | Surface As | |---------|------------| | Pre-fetching all context | "Should model request this instead?" | | IF statements deciding behavior | "This looks like decision logic - model's job?" | | Thresholds/time windows | "Hardcoded rule - should model judge this?" | | Filtering model output | "We're overriding model decisions - intentional?" | | Fallback logic | "Compensating for model - improve prompt instead?" | | "Safety" checks | "Who defines safe? Maybe model should." |
When Model-Mediation Doesn't Apply
Not everything needs it:
- Pure pipes: User provides explicit input → API call → output
- Deterministic transforms: Data in → format change → data out
- User-controlled flows: User explicitly decides each step
The question isn't "does this call a model?" but "are there decisions being made, and should a model make them?"
Collaborative Mode
This skill is about ongoing dialogue, not checkpoints:
- Propose architectures and tool designs
- Question yourself when writing code that decides
- Ask the user when you're uncertain
- Surface anti-patterns as they emerge
- Suggest model-mediated alternatives
Don't wait until verification to catch problems. Think about decision ownership continuously.
The Bottom Line
Every decision needs an owner: user, model, or code.
- User: Explicit control, deterministic
- Model: Judgment, context-dependent, flexible
- Code: Never for judgment calls - only execution
When in doubt, ask: "Is this a judgment call?" If yes, model decides.
Reference
For detailed methodology, see:
docs/design/13-model-mediated-methodology.md(assistant-system)- Anthropic SDK documentation for tool-based patterns