V3 — cost and provider policy
V3 — cost and provider policy
Read first: young-corrections-2026-10-10.md §1 (Min) and
sol-corrections-and-lane-division.md §1 (Sol) both record the one-workspace
correction. I am not restating it. This file holds the part of my lane that
neither of them covered, because neither of us is the finance owner:
what a $60 allowance cap and a $40 PAYG float do differently to behaviour.
Young, 2026-10-10:
"Correction we only have 1 workspace / SolOS — GO $10 / allowance cap $60 credit on model usage — ZEN $40/mth pay as you go credit."
1. The one thing the correction changes that neither doc has
Min's §1 and Sol's §1 both note that GO is a subscription with an allowance cap and ZEN is pay-as-you-go. Both stop at "the ledger must record which pool a call drew on." That is necessary but not sufficient — the two instruments do not just need different labels, they need different behaviour, and the difference is invisible in a ledger that only records amounts.
| GO — $60 allowance cap | ZEN — $40 PAYG float | |
|---|---|---|
| what it is | a ceiling inside a $10 package | a balance that depletes as spent |
| unused balance | money we already paid for | money not yet spent |
| spending to the cap | efficient use of something sunk | $60 gone, permanently |
| the right instinct | use it deliberately, up to the cap | avoid drawing on it |
| when it binds | the model blocks — not the bill | the balance runs out |
| failure mode | blocked at 5,400 req / 5h — reads fine until it stops | silence, until an invoice says $40 |
A bundled allowance rewards use-within-cap. A PAYG float punishes use. Same arithmetic, opposite meaning.
This is why billing_instrument is not a label. If the ledger records only
dollars, a call that draws GO-allowance and a call that draws ZEN-float look
identical and are priced the same. They are not: one is consuming something
already bought, the other is spending cash.
Behavioural consequence, and it is a rule rather than a preference: free-first is unchanged and already settled. But tier 2 must default to GO, not ZEN — GO's cap is a resource we have already bought, while ZEN is money leaving the account. ZEN tier 2 is an escalation above GO tier 2, not a peer of it.
The ladder Young ruled — free first, then selected paid — holds exactly. This only orders the two paid instruments, which Young's line did not specify.
2. No fallback provider — stated plainly, because it is a resilience fact
Young ruled Opencode only. Under my earlier two-workspace reading I argued Zen free was "the only independent redundancy." That argument is now void and I am withdrawing it explicitly, because it is the kind of claim that survives in a doc after it stops being true.
There is one provider. GO and ZEN are two payment instruments inside it, not two operational estates. If Opencode degrades, switching GO→ZEN does not help — it just changes who we pay.
Consequence to record as accepted, not discovered: V3 has no provider-level fallback. That is a resilience decision wearing a cost decision's clothes, and it belongs on the record. The internal redundancy that does exist is per-model: V2's model-health circuit breaker quarantines a model that cannot answer, so the fleet survives a single model dying. That is the redundancy V3 has, and it is not provider redundancy.
3. The $60 cap against a $10 package — confirm before enforcing
A $10 package carrying a $60 allowance is credit worth 6× the subscription. That is commercially favourable enough that I want it confirmed rather than assumed, because the enforcement behaviour differs entirely:
| If $60 is | then enforcement must | the failure looks like |
|---|---|---|
| a hard ceiling | block at $60, and block cleanly | a model stops serving; loud |
| a soft/billed ceiling | escalate at $60 and keep serving | an invoice arrives; silent |
I am not writing enforcement until this is answered. A guard built on the wrong one of those is worse than no guard: a hard-block guard on a soft ceiling halts the fleet unnecessarily, and a soft guard on a hard ceiling spends past the cap.
4. The ledger spec — what my lane owes
V2 recorded zero cost across 30,721 attempts. The $10/day was visible only
because opencode stats exists as an external tool. A month could have
passed. The ledger is not reporting — it is the instrument that makes every
number in this design re-measurable.
| Field | Why it must exist |
|---|---|
billing_instrument | none (free) · go_allowance · zen_payg — the field that makes §1's distinction enforceable rather than descriptive |
cost_state | measured · unknown — never conflated with $0.00 (Sol's §2.4, adopted wholesale) |
tokens_in / tokens_out | the cost driver |
requests | the binding constraint is requests per window, not dollars |
window_state | ok · approaching · blocked — a blocked model is not a spend |
wall_seconds | to test the "4 seconds faster" justification |
why_paid | the escalation reason — blank for tier 1 |
result_class | success · refusal · empty · error — never one word for all four |
Two rules that are not negotiable:
- A tier-2 call without a
why_paidvalue is a defect, not a blank. cost_state: unknownmust never be aggregated into a spend total. V2's 30,721 rows all read$0.00000because anImportErrorinbin/was swallowed — an unknown that sums as free is a five-hour plausible-looking zero, and on a PAYG float it hides real cash leaving the account.
Result class closes a second V2 defect: a prose refusal sets no failure
signal, so a task can read completed while nothing was produced.
Proof of done for this lane
grep -rfor a key pattern in my directory returns nothing.- The ledger disaggregates refusal / empty / error from success.
- A tier-2 choice cannot be recorded without a reason.
- Window exhaustion is recorded as model-blocked, not as spend.
billing_instrumentis always populated;unknown≠$0.00.- GO and ZEN are separately attributable — never one merged "spend" figure.
5. Free-first — what it rests on, unchanged by the correction
V2, one day, measured:
| Model | Tokens | Steps | Cost |
|---|---|---|---|
| longcat-2.5-preview-free | 2.6b | 51.1k | $0.00 |
qwen3.8-flash | 288.2m | 6.9k | $10.34 |
nemotron-3.ultra-free | 24.9m | 5.3k | $0.00 |
space-bunny-free | 19.8m | 5.3k | $0.00 |
The free model did 9× the tokens for nothing. On a correctness-controlled test all four were right; the paid model's only justification was 4 seconds faster. 99% of that day's spend bought speed nobody needed.
Now on firmer ground than before: free sits outside both billing instruments entirely, so tier 1 is not merely cheaper — it is not billed at all. That strengthens Young's "free first" rule rather than merely permitting it.
6. Retention posture outranks cost — unchanged, and still mine
From SolOSV2/05-operations/free-model-reality-check.md:
| Posture | Models | Consequence |
|---|---|---|
| zero-retention, documented | Space Bunny Free, LongCat 2.5 Preview Free | may carry vault content, credentials, task text, registry |
| no statement either way | Nemotron, MiMo, Ling, Big Pickle, Muse Spark, … | may not, without an explicit recorded opt-in |
| refuses by policy | Muse Spark — trains on request data | unusable regardless of availability |
Anything touching vault content, credentials, task text or the registry routes only to a zero-retention model, or to none at all.
A model that may train on our task text is not free. It is an undisclosed disclosure.
Today the cost ladder and the privacy ladder agree — the cheapest model is also the zero-retention one. The moment they disagree, this section wins. And on a workspace where ZEN is PAYG, a cheap-but-training model is doubly wrong.
7. "Free" is four states, not a boolean
| State | Meaning | V2 evidence |
|---|---|---|
| works | a real call returns a real result | MiMo, Nemotron, Big Pickle, Space Bunny, LongCat |
| listed but dead | listed, returns Endpoint is unavailable | Ling 3.0 Flash Fin Free |
| refuses on policy | serves a refusal, not an answer | Muse Spark |
| transient empty | empty first call, OK on retry | LongCat, measured |
The catalogue must be probed, not read. opencode models lists models that
return Endpoint is unavailable. Availability is a measurement — and V2's
catalogue was measured 2026-10-01, so it is stale by nine days and must be
re-probed.
8. The registry gap — Min's lane, reported not fixed
cortex/registry/agents.yaml declares no model field. I read all 218
lines, 11 agents: id, name, plane, role, pronouns, host, port,
endpoint, capabilities, boundaries — and no model anywhere. V2 held it
in the personas (echo.md:13 → model: opencode-go/gpt-6-luna).
This is V3's defect class, currently live: the most expensive fact in the
system — what each agent talks to, and now which payment instrument pays for
it — has no home in the one registry. Worse, V2's persona files were
generated from AGENT_IDENTITIES, so the model id silently vanishes in
the projection.
Recommendation to Min: add model and billing_instrument to the registry,
so the projection, my ladder, and Sol's router read one fact. I have not
touched his file.
9. Still open, and mine
| Item | Why it is open |
|---|---|
| Tier-2 ordering GO-before-ZEN | §1 of this file. Young's line did not specify; this needs his confirmation |
| Is the $60 cap hard or soft? | §3. Enforcement cannot be written until answered |
| Per-model tier membership | needs a live probe. V2's catalogue is from 2026-10-01 and availability drifts |
V2's stale state/model_health.json | carries deepseek-v4-flash as "Model access is disabled" — a verdict from a different workspace that must not be inherited |
10. What I am not doing
- Writing
providers.jsonorbudget.json. They would restate facts the registry owns (§8). A second model list in my lane is V2's five-roster-sources defect, committed by the person whose job is to prevent it. - Probing the catalogue. Every
terminalcall this session has failed on a stuck cwd (cd: /home/lab/.solos/config: No such file or directory), soopencode modelsnever ran. No probe, no list.
The Brain stopped on 429. It is not rate limited. It is misconfigured.
Young, 2026-10-11: "I saw Brain Unit stopped due to 429 on Hermes, now how do we fix this issue and switch to different model when it happen and resume tasks."
D1–D5, re-verified one at a time
Young, 2026-10-10: "re-verify D1–D5 individually."

