Routing Problems to Tools

Decision framework · 20 September 2026 · Code Raven, VentureRaven, Press Raven, and everything else

A single triage sequence that takes a piece of work and names the surface, then the engine. Eight questions you asked, answered as branches inside one procedure rather than as eight separate rules that quietly contradict each other.

How to read this. Section 0 is the operational part: six questions, asked in order, that land any piece of work on a surface. Sections 1–8 are the branches, each with the signals that select it, the anti-pattern that gets it chosen wrongly, and its cost shape. Section 9 gives cost-blind and cost-aware rankings side by side, since those two orders disagree more often than expected. Section 10 is where the criteria genuinely collide and judgment has to do the work.

Two findings turned up while I was checking the Code Raven internals that bear directly on your model questions. Both are in section 11, and both are separable from this framework.

Contents

0The front door

Ask these in order. The first one that answers yes names the surface. Stop there.

WHAT KIND OF WORK IS THIS?

1. Does it need to read the repo, run a build, or be verified?
   └─ yes ──────────────────────→ CLAUDE CODE            §1 → model §3

2. Is the thinking the product, rather than a file?
   └─ yes ──────────────────────→ CLAUDE BROWSER         §2 → model §4

3. Does the question need several genuinely different
   viewpoints held against each other?
   └─ yes ──────────────────────→ EXPERTS MEETING        §5

4. Is the output visual, and must it inherit the
   project's design vocabulary?
   └─ yes ──────────────────────→ MOCKUP LAB             §6
   └─ visual, no vocabulary ────→ browser artifact       §6

5. Is it one judgment applied to many items, where you
   need a number you can set a threshold on?
   └─ yes ──────────────────────→ JEV                    §7

6. Does Claude structurally lack the capability?
   └─ yes ──────────────────────→ CHATGPT                §8

The discriminators, stated plainly

Filesystem, build, git
A hard boundary. The browser cannot read Code Raven/Services/, cannot run xcodebuild, and cannot commit. Nothing about quality enters into this one.
Artifact vs. conversation
When you want a decision, a framing, or a critique, the conversation is the product. Claude Code reaches for tools by reflex and will start editing something.
One view vs. several
A meeting earns its cost when the disagreement is the information. One expert with a strong opinion is a consultation, and a single browser thread does the same job for less.
Vocabulary inheritance
Mockup Lab injects the project's palette, type scale, spacing, and anti-patterns. The browser starts from nothing, which is what you want when the vocabulary is the thing under question.
Many items, one question
Jev evaluates every question in parallel in one request and returns calibrated probabilities. Below roughly fifty items the setup cost dominates and Claude is simpler.
Capability gap
Image generation is the only clean one. Everything else in the ChatGPT column is preference or uncorrelated error, which is still a reason, just a weaker one.

1Claude Code

Claude Code is the only surface with your filesystem, your build, and your git history. That makes the selection rule mostly mechanical: work that ends in a changed file belongs here, and work that does not usually belongs somewhere else.

Signals that select it

Signals that it is the wrong surface

Native macOS caveat. A successful xcodebuild is a compile check. It is not evidence that the window renders, the sheet presents, or the state updates. Runtime verification for Code Raven comes back to you at the keyboard, which means "Claude Code can verify it" is true for compilation and false for behavior.

2Claude browser

The browser is for work where the exchange itself is what you are after. No filesystem is a feature here, because nothing pulls the conversation toward editing.

Signals that select it

The handoff seams that already exist

Browser work does not have to end in the browser. Three routes back into the pipeline are already built:

That third one matters for section 5. A browser conversation you later record as an off-site is a legitimate substitute for a small Experts Meeting, at roughly a fortieth of the model spend.

3Model choice — Claude Code

This question has two separate answers, because two separate things pick the model and only one of them is under your control at the moment.

A. Your interactive sessions

Your global default is opus[1m]. For this codebase that is the right resting position, and the 1M context is doing real work: Code Raven is large enough that cross-subsystem questions routinely pull in a dozen files.

ModelContextRel. input costSwitch to it when
Opus 5
default
1M1.0×Anything agentic, anything exploratory, anything that spans subsystems. Leave it here unless a specific reason below applies.
Sonnet 51M0.4×The spec is complete and the work is mechanical. Renames, applying a decided pattern across files, test scaffolding where the shape is given, doc formatting. Same 1M context, so it does not lose the ability to see the repo.
Haiku 4.5200K0.2×Narrow parsing and extraction on bounded input. The 200K window is a real constraint here, and it is why Code Raven only uses Haiku for the three parser paths and nothing else.
Fable 5.11M2.0×A genuinely hard problem where a wrong answer costs you a day and verification is expensive. Thinking is always on. Reach for it when you have already been around a problem twice.

Relative costs are first-party API per-token rates normalized to Opus 5 input ($5/MTok in, $25/MTok out). On a subscription the currency is rate-limit consumption rather than dollars, and the ratios move together closely enough to use the same ordering. I do not know your plan's specific limits and have not guessed at them.

/fast is orthogonal to all of this. It runs Opus with faster output and does not substitute a smaller model, so it costs more per token and buys wall-clock.

B. Code Raven's own subsystem calls

Code Raven never passes --model. CLIProvider.buildCommand emits --dangerously-skip-permissions --print with output flags, max-turns, and resume. There is no model flag on that path and no model picker in Settings. Every Expert Meeting turn, every Mockup Lab generation, every Design Studio and Ideation call runs on whatever the claude CLI defaults to, which is your ~/.claude/settings.json value.

Three call sites do choose, and they are the exceptions that prove it:

The practical consequence: today, per-subsystem model choice is not a decision you can make. Changing the global default moves all of it at once, including a nine-seat Rookery sitting and every mockup revision. That is a design question worth having separately, and it is in section 11.

4Model choice — Claude browser

The browser picker matters less than the Code picker, because browser work is usually one conversation rather than forty tool-driven turns, so the cost spread is smaller in absolute terms.

UseModelReasoning
Collaboration, critique, product thinkingOpus 5The default for the work you actually use the browser for. Holds a long thread and pushes back with substance.
Long exploratory chat, drafting, many turnsSonnet 5Faster and cheaper per turn, and the quality gap narrows when each turn is small. Good for a session that will run long.
One hard question, high stakesFable 5.1Anthropic's most capable widely released model. Thinking is always on and turns run long. Use it for the question you would otherwise convene a meeting about.
Quick factual lookupSee section 8. This is the slot where you currently reach for ChatGPT.

Turn extended thinking on for anything where you would be annoyed by a confidently wrong answer, and off when you are drafting and want the turns to come back quickly.

5When to hold an Experts Meeting

An Experts Meeting is the most expensive thing on this list by a wide margin, and the criterion that justifies it is narrow.

Hold one when the disagreement between viewpoints is the information you need. Do not hold one to get a thorough answer. A thorough answer is one Opus turn in the browser.

What it costs

A standup runs a default 18-turn budget. Each expert turn is a CLI invocation with maxTurns: 2, on that expert's own resumed session. Mira intervenes every fourth expert turn up to four times, and her turns do not consume the budget. Conclusion adds a summary and a handoff generation. That lands at roughly forty to fifty model turns for one meeting, each carrying its own accumulated session. Wall-clock is not recorded anywhere in the codebase, so I have not estimated it; the scripted pacing alone adds three to eight seconds per turn before any model latency.

FormatSeatsTurn budgetFits
standup2–418The default room. Phased diverge then converge.
consultation110One expert, one topic. Often the right answer when you thought you wanted a meeting.
specReview2–418Inside the Ideation handoff. Phased.
viewEvaluation1 + lead20–40Design Studio, scales with view count, pauses between views.
offsite0—Held elsewhere, pasted back, arrives concluded. No CLI cost.
rookery1–9seats×2+2Personal workspace only. Concludes by stating the disagreement rather than a summary.

Signals that select it

Signals that it is the wrong call

Failure mode to know about. MeetingSilence.isSilence() returns true for nil and for empty text, which means a failed CLI invocation is indistinguishable from an expert choosing to pass. A quiet room may be a room that agrees, or it may be a room that is erroring. If a meeting feels thin, that ambiguity is a live cause and not a judgment about the topic.

6Mockup Lab vs Claude browser

These produce the same artifact type, a self-contained HTML page. They differ in what the page already knows.

Mockup Lab when the mockup must speak the project's design language. Browser when the design language is what you are questioning.

What Mockup Lab injects

MockupFoundationBridge passes three of the nine Foundation layers into every generation:

Mission, personas, code, features, cognitive, and presence are not injected. A mockup therefore knows how the product should look and feel, and does not know who it is for. That gap is worth remembering when a Lab mockup comes back beautifully consistent and slightly beside the point.

Choosing between them

SituationRoute
A new screen for an existing surfaceMockup Lab. Tokens, delivery spec, pipeline.
Iterating on a screen that existsMockup Lab. Revision history and thumbnails are the point.
It needs to reach SwiftUIMockup Lab. Deliver runs a 5-turn generation producing a markdown implementation spec saved as a Note, tagged mockup-delivery, for Claude Code to pick up.
Exploring a direction the product has not committed toBrowser. Foundation tokens would drag it back to what already exists.
Questioning the visual language itselfBrowser. Injecting the palette defeats the exercise.
A one-off page with no product relationshipBrowser.
Started in the browser, now wants to live in the projectBoth. Import the artifact HTML through MockupImportSheet, or drop it in docs/mockups/ and let the folder watcher pick it up as a read-only reference, then fork with "Iterate on This".

Mockup Lab is also the one caller in the whole app that streams (streamJSON: true), so it is the only subsystem where you watch the work arrive rather than waiting for a blob.

Known Lab defects worth knowing before you rely on it
  • The snapshot helper's hide-overlay JavaScript uses optional chaining as an assignment target, which is a syntax error, so includeAnnotations: false never actually hides annotations.
  • MockupWebView has no navigation policy, so a link or form submit inside a mockup can navigate the preview away from the mockup.
  • Context references are never cleared on send, so they are re-injected into every subsequent prompt in the session.
  • Export gating exists on the AI path only; importRevision and addRevision export unconditionally.

7When to use Jev over Claude

Jev (jev-1.13.0, TypeSafe) is a System One model. It takes a state and a map of typed questions, evaluates every question in parallel in a single request, and returns typed answers with calibrated probabilities. It generates no text.

Jev when you are applying the same judgment to many items and you need a number you can set a threshold on. Claude when you need to know why.

The three question types

TypeReturnsConfidence
NoulYes/no probabilityNone. Advisory use only.
ChoiceOne option from a set, probability per optionDerived from how concentrated the distribution is. Thresholdable.
ScoreA rating against ordered level descriptionsSame derivation. Thresholdable, with a numerical-calibration caveat.

Signals that select it

Where it does not apply

The pairing worth noticing. These two are complements more often than alternatives. Jev sorts the corpus and hands Claude the confident failures; Claude explains and repairs them. Neither does the other's half well.

8When to use ChatGPT over Claude

You named three uses: factual questions, second opinions, and visual creation. They have different strengths as criteria, and it is worth separating them.

Image generation — a capability gap

clear rule Claude does not generate images on any surface. This is not a quality comparison. When the deliverable is a generated image, ChatGPT is the tool, and there is nothing to weigh.

Second opinion — a real mechanism, with a condition

clear rule A different model has uncorrelated failure modes, so a second read catches errors that a second Claude turn would reproduce. The value is real and it depends on one condition: ask cold. Pasting Claude's answer and asking whether it is right anchors the response and converts an independent check into an agreement check. Ask the original question, then compare.

Factual lookup — a habit worth testing

softer Both models search the web and both cite. The split you describe, ChatGPT for facts and Claude for opinions and collaboration, may be tracking a genuine difference in how each presents a sourced answer, or it may be tracking interface familiarity. I cannot tell from here, and I would rather say so than manufacture a criterion.

A way to find out, if it interests you: next time you reach for ChatGPT on a factual question, ask both, and note which one you actually acted on. Three or four instances will settle it. Until then, treat it as a working preference that is cheap to honor.

One constraint that does not move. ChatGPT has no route into the Code Raven pipeline other than paste. A conversation there can become an off-site meeting or a pasted note; it cannot import a mockup, read a blueprint, or write a plan file. Weigh that when the output is meant to land somewhere.

9Cost shape

Two rankings, because they disagree. The first ignores budget entirely. The second assumes you are three weeks into a cycle and watching limits.

WorkCost-blind bestCost-aware bestWhy they differ
Hard architectural decisionExperts Meeting, then Claude CodeBrowser on Opus, recorded as an off-siteA meeting is ~45 model turns. One browser thread reaches a decision you can defend for a fraction of that, and the off-site format preserves the Chronicle record.
Cross-subsystem code questionClaude Code on Opus, 1MClaude Code on Opus, 1MNo disagreement. Cheaper models lose the thread across a dozen files, and re-asking costs more than the first answer saved.
Mechanical refactor, spec completeOpusSonnet 5Roughly 40% of the input cost for work where the judgment already happened. The largest routine saving available to you.
Parse, extract, classify bounded textSonnet 5Haiku 4.5What Code Raven already does on its three parser paths.
New screen mockupMockup LabMockup LabNo disagreement. 5 turns, and the Foundation tokens remove a round of correction.
Visual exploration, uncommittedBrowser artifactBrowser artifactNo disagreement.
Judging 400+ items on a rubricClaude, item by itemJevFour cents against a genuinely large Claude bill. Jev wins by two orders of magnitude and loses the explanation.
Judging 20 items on a rubricClaudeClaudeSetup cost dominates below ~50 items.
Generated imageChatGPTChatGPTCapability, not cost.
Stuck twice on a hard problemFable 5.1Fable 5.1Twice Opus per token, against a day of your time. The cost-aware answer only changes if you are not actually stuck.

Per-token reference

ModelContextIn $/MTokOut $/MTok
Claude Fable 5.11M10.0050.00
Claude Opus 51M5.0025.00
Claude Sonnet 51M2.0010.00
Claude Haiku 4.5200K1.005.00
Jev 1.13.0—0.042free

First-party API rates. Your Claude Code and browser usage bills against a subscription rather than per token, so read these as relative expense and as the shape that rate-limit consumption follows.

10Where the criteria collide

Four places where two rules in this document point in different directions. Judgment has to resolve these, and naming them is more useful than pretending the flowchart handles everything.

Repo access against thinking quality

A decision that depends on what the code actually does needs both. The resolution is sequence rather than choice: use Claude Code to establish the facts, carry the findings to the browser to decide, come back to Code to implement. The brief behind this document followed exactly that shape.

Foundation vocabulary against genuine exploration

When you want a new direction that still has to fit the product, both section 6 rules fire. Start in the browser without tokens, then import the result into the Lab and let a revision pass pull it toward the vocabulary. The order matters: Lab first anchors you to what exists.

Meeting cost against meeting value

The sharpest tension in the framework. Forty-five model turns is a lot to spend on a question you might resolve in one browser thread, and the meeting's distinctive output, preserved dissent and a living document, is genuinely unavailable elsewhere. A usable tie-breaker: if you can predict what each expert will say, you do not need the meeting.

Jev's calibration against its blind spots

Jev gives you a number, and a number invites a threshold whether or not the dimension supports one. Score confidence is derived from distribution concentration, which is a statement about the model's certainty rather than about correctness. On dimensions with no ground truth to calibrate against, treat the number as advisory and say so in the artifact, the way the Peregrine plan marks engagement.

11Two findings, separable from this framework

Both surfaced while confirming section 3. Neither depends on anything in this document, and both are worth handling on their own.

1. Code Raven's displayed costs are understated when running Opus. UsageAggregator.estimatedCost defaults its model parameter to "sonnet". Opus and Haiku branches exist but are reached only if a caller passes a model string, and no caller does. Your CLI default is opus[1m]. Every cost figure the app shows is therefore computed at Sonnet rates against Opus usage, which understates input cost by 2.5× and output cost by 2.5×. The blueprint at agent-system.md already flags this; it has not been fixed.

2. Per-subsystem model choice does not exist. Because CLIProvider.buildCommand emits no --model flag, a nine-seat Rookery sitting, a Mockup Lab revision, and a checkpoint parse all run on the same model. The only lever is the global default, which moves everything together. Whether that should change is a real design question: a per-feature model preference would let mockup generation run on Sonnet while meetings stay on Opus, at the cost of a settings surface and a migration.

12Integration, deferred

You asked for this as a review document first, so this section is a sketch of where it could attach rather than a proposal. Nothing here is decided.

The question that decides between them is whether you want the framework to be something you read or something the app acts on.

13Final review

What this solution does well

Where it is weak

Edge cases this framework handles poorly

Adjustments worth considering

Confidence: 76 / 100
High confidence in the mechanical criteria, which are read from source and will not change unless the code does: the filesystem boundary, the Foundation injection set, turn budgets, Jev's typed-question shape and its arithmetic blind spot, and the absent --model flag. Lower confidence in the two places where the answer depends on measurement I do not have. The meeting cost figure is derived rather than observed, and the subscription cost model is inferred from API rates. Section 8's factual-lookup criterion is unresolved by construction. The structure holds; two numbers inside it want verifying before you lean on them hard.