You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
models: a bare spec silently lands on the paid subscription backend — make the footgun refuse #50
A model spec without a slash resolves to the paid claude-cli backend with the whole string as the model name. The README's known-limits section documents the sharpest edge itself: --model mock does not reach the scripted double — it becomes model name mockon the subscription backend. Only the slash form (mock/anything) reaches the double. So the exact spelling a newcomer tries first, on the one backend that spends real subscription quota, is the one that silently does the wrong thing — while a mistyped backend with a slash is properly rejected with exit 2.
Why it matters
This inverts the project's own principle that the expensive path must be opt-in. Every other spend gate in the tree (Slack's --model opt-in, the budget gate, live tests behind -m live) fails closed; spec parsing is the one place that fails open, onto the paid backend. A typo'd demo command is a real charge and a confusing error from the Claude CLI instead of a clean refusal.
What to consider
Make a bare spec an error (exit 2): model spec 'mock' has no backend; write 'claude-cli/mock' if you meant the subscription backend — the same shape as the existing mistyped-backend refusal. This is a breaking change for anyone relying on the bare shorthand; the release note says so, loudly.
Softer alternative: keep the default but require one-time acknowledgement (env var or config key) before a bare spec may resolve to a paid backend; refuse otherwise.
Update the README limits bullet and the models cookbook page, both of which currently document the behaviour as a trap to memorise.
Acceptance criteria
grapharc run --model mock … (and models mock) refuse with a message naming the fix; the slash forms behave exactly as today; README/cookbook text describing the old behaviour is updated and its byte-compare tests pass.
Already fixed by #56/#57, which landed after this was filed. Verified on main:
$ grapharc models mock
spec: mock backend: mock model: mock
$ grapharc models claude-cli
spec: claude-cli backend: claude-cli model: claude-sonnet-5
$ grapharc models openrouter
error: 'openrouter' names a backend, not a model, and it has no default model to fall back on
— write openrouter/<model>, for example 'openrouter/anthropic/claude-sonnet-4.5'
All three behaviours this issue asked for: mock reaches the scripted double instead of billing the subscription backend, a bare backend with a sensible default resolves to that default, and a backend that fronts a catalogue is refused with an example spelling rather than a guess about what to bill for.
Activity
Shashankss1205 commentedon Aug 4, 2026
Already fixed by #56/#57, which landed after this was filed. Verified on
main:All three behaviours this issue asked for:
mockreaches the scripted double instead of billing the subscription backend, a bare backend with a sensible default resolves to that default, and a backend that fronts a catalogue is refused with an example spelling rather than a guess about what to bill for.