V3 structure — Young's directive, mapped onto the lanes
V3 structure — Young's directive, mapped onto the lanes
Date: 2026-10-10
Author: Sol
Status: DESIGN — implements Young's structure, flags two things it decides by accident
Answers: Young's structure message; Min's D1; the open MCP question
Young's directive:
Providers: Opencode
workspace: SolOS Go / Zen — Go $10 package, Zen $40/mth credit
optimise free models on both Go/Zen, then selected paid models
Transport: native A2A v1.0
cortex
1. registry <- where agents are defined and live
2. personas -> update to agents
core
protocol · config · arms · harness
operation
mcp · test · ops · state · runtime
references
spec · docs
This is a ruling, not a proposal. Where it conflicts with a design I or Min wrote, Young's version wins and I record what changed. Two items are decided before the open decisions were answered, and I would be doing the opposite of my job if I filed that as agreement.
1. The tree, as ruled
solos3/
cortex/
registry/ agents are DEFINE HERE and LIVE HERE (Min)
agents/ personas, projected from registry (Min)
core/
protocol/ A2A v1.0 transport (Sol)
config/ providers, workspaces, budgets (Mira/Young)
arms/ the executor → opencode (Sol)
harness/ probes, negative cases, conformance (Sol)
operation/
mcp/ agent↔tool channel (unassigned — see §3)
test/ tests (split by lane)
ops/ operational entry points (Sol)
state/ runtime state, disposable (shared)
runtime/ worker/executor wiring (Sol)
references/
spec/ official A2A repos (referenced, not copied)
docs/ notes not yet vault-registered (shared)
What this settles that was open: D1 is answered — the registry lives at
cortex/registry/ and it is where agents live. D5 (Phase 0 first) is answered
implicitly: registry is item 1 in Young's own list.
What changes from my earlier layout: a2a/, arms/, harness/ were at the
repo root in my sol-transport-and-execution.md. Young puts them under core/.
Young's version stands; core/protocol/ for the A2A transport is a better
name than a2a/ anyway, because it says what it does rather than what it
speaks.
core/ and operation/ are new distinctions I did not have, and they are
good ones: core is what a task flows through, operation is what keeps it alive.
2. personas -> agents — this decides Min's D1 by naming, and there's a real consequence
Young wrote 2. personas -> update to agents. Min's D1 offered three
options, the third being: "cortex/personas/AGENT_IDENTITIES absorbs the role
and cortex/registry is retired."
Young's structure is close to that third option, but not the same, and the difference matters:
- Min's option 3 retires the registry and puts identity in
personas/ - Young keeps
registry(item 1) and renamespersonastoagents(item 2)
That is actually the better of the two, and worth saying why: it keeps the
registry as the source and makes agents/ the projection. That is exactly
Min's own Phase 0 architecture — agents.yaml is the one home, everything
derives. The rename makes the projection's subordinate role visible in the
name, which V2's five roster sources could have used.
Consequence for the record: V2's live identity was a hardcoded Python
dict (cortex/personas/__init__.py:52-54: "identities are hardcoded... No
external config file is used"). Renaming the directory does not by itself fix
that. The rule that does: cortex/registry/ is read; cortex/agents/ is
generated; neither may be hand-edited without a drift test failing. I am
recording that as a design rule for this rename so the rename cannot become the
fix.
Not yet done: the rename is a change to Min's lane (agents/ was his
persons/). I am not performing it.
3. operation/mcp — Young has ruled, and I am recording my objection once
Young's structure includes operation/mcp/. My measured position, on record in
sol-conflicts-and-corrections.md §1:
| Measurement | Value |
|---|---|
Production importers of arms/mcp_server.py | 0 |
Production importers of arms/acp_surface.py | 0 |
| Measured usage | 0.03% |
Young has included it, so it is in scope. I am not relitigating it — the decision is made and it is not mine to make. Recording what I would do given that ruling, which is the useful version of an objection:
Build operation/mcp/ against the gate that would have saved V2:every entry point must have a caller, or not exist. V2's inventory of
built-with-zero-callers was six items long — reclaim_orphaned_tasks,
check_stuck_tasks, activate_failover, the priority column, the brain gate,
and cortex/registry itself.
So operation/mcp/ gets exactly one consumer — the A2A Part.data tool-call
channel, which is the reason the capability exists at all. If that channel
never gets a real caller, operation/mcp/ stays a contract with no code, and the
contract says so. A directory that exists without code is honest; code without
a consumer is the defect.
That is a design rule, not a veto. Young's structure stands.
4. Providers and workspaces — Mira's lane, and my two contributions
Young: Opencode · SolOS Go / Zen · Go $10 · Zen $40 credit · free first on both, then selected paid.
This is Mira's lane (config/providers.json, the fallback chain, cost
policy) and it confirms the policy V2 already ran. Two things worth carrying
into it, both measured:
a) The workspace table must be read by code. V2's plane_routing.py held a
correct agent→workspace mapping that nothing imported — the real source was a
hardcoded workspace="solos_go" default in the executor's signature. A workspace
policy that no code reads is a claim. In V3 the workspace comes from
cortex/registry/ or from core/config/, and if it is unreadable it fails
loud. A default is a decision about the case you have not thought about.
b) monthly_cap_usd stays 0.0. GO is a $10/month subscription with
per-model allowances (5-hour 20%, weekly 50%, monthly 100%). A monthly dollar cap
cannot represent per-model allowances, and it would authorise spend already ruled
out. The cap is a guard, not an allowance: an unauthorised paid call must
fail at $0.00 rather than accumulate quietly.
Both are recorded so they survive into Mira's config work.
5. references/ — vault or repo?
Young: "References -> this keep on vault or in repo — spec, docs."
Split it, and the split is not arbitrary:
| Where | Why | |
|---|---|---|
spec/ | references/spec/ as a git submodule | the reference implementations are versioned upstream and 18 MB; copying them makes them stale silently, losing them loses the ground truth |
docs/ | vault | SolOS/vault/Docs/SolOSV3/ is the authority. A doc in the repo is a doc that has not been argued for |
V2's actual state: 18 MB in spec/, zero tracked files. That is why the
hand-rolled A2A server existed at all — the SDK was on disk and nothing forced
anyone to look at it.
Track it or the same thing happens again. A submodule is the cheapest way to make "what spec are we implementing?" a git question rather than a memory.
6. What is decided vs what I still need
| Status | |
|---|---|
| Tree shape | ✅ Young's, above |
D1 registry location | ✅ answered — cortex/registry/, agents live there |
D5 Phase 0 first | ✅ answered — registry is item 1 |
| MCP in scope | ✅ ruled in — with a caller gate |
| Provider/workspace policy | ✅ confirmed — with two rules recorded for Mira |
references/ | ✅ proposed split |
cortex/persons/ → cortex/agents/ rename | ⚠️ not performed — Min's lane |
solos3 recreation | ⚠️ not performed — see below |
7. The thing that has to be said before anyone builds on this
/home/lab/solos3 no longer exists. It held Min's registry, his loader, 14/14
passing tests, all 13 lane contracts, and two commits (ab1081f, ac578e7).
I do not know what removed it — another session's cleanup, a git clean,
a concurrent operation. No evidence, so no claim.
Young's directive says where everything goes, and it is enough to rebuild the tree. But:
Nothing should be rebuilt until Young confirms whether the removal was intentional. If it was deliberate, rebuilding is working against you. If it was an accident, the design in the vault is complete enough to restore from — this document plus
DESIGN-OF-RECORD.mdandsol-transport-and-execution.md.
That question is mine to ask and not mine to answer.
8. No code was written
This is design only, per Young's instruction. Nothing was created, moved or renamed. The vault holds both lanes' design; the tree does not currently exist.

