Sol's register — corrections to the design of record, and the task split
Sol's register — corrections to the design of record, and the task split
Date: 2026-10-10
Author: Sol
Status: DESIGN — two corrections to DESIGN-OF-RECORD.md, plus the lane division
Does: not edit the authority document. Records what must change in it.
Follows: Young's "we are designing and architecture not coding so don't create
any files or folders structure yet" and "everything is recorded on vault V3".
1. Correction — there is ONE workspace, not two
DESIGN-OF-RECORD.md §2.0a reads:
| Workspace 1 | SolOS Go — $10 package |
| Workspace 2 | SolOS Zen — $40/month credit |
Young, 2026-10-10: "Correction we only have 1 workspace."
SolOS is the workspace. GO and ZEN are two funding tiers inside it. Not two workspaces, and not two namespaces that a plane picks between.
SolOS (the one workspace)
├── GO $10/mo, $60 allowance cap on model usage
└── ZEN $40/mo pay-as-you-go credit
Policy: free models on both tiers first, then selected paid
Why the distinction is not pedantic. In V2 a workspace was a routing
boundary with its own namespace set, its own state, and its own exhaustion
semantics — solos_go, solos_zen, pulse_go, pulse_zen, research_go.
Carrying that meaning forward produces:
- a
solos_govssolos_zenrouting decision that decides nothing - exhaustion bookkeeping per workspace, when there is one budget
- a plane table that looks like it chooses between them when it cannot
And it would reproduce the exact V2 defect where plane_routing.py was a
correct mapping that nothing imported — a routing decision that exists as
structure rather than as control.
The one thing that genuinely differs between the tiers: GO has an
$60 allowance cap and is metered by model usage; ZEN is pay-as-you-go
credit. So the correct model is:
| GO | ZEN | |
|---|---|---|
| Cost shape | fixed $10/mo | pay-as-you-go |
| Limit | $60 allowance cap on usage | $40 credit |
| Free models | yes, tried first | yes, tried first |
| Paid models | selected only | selected only |
Both tiers are tried free-first. The free/paid split is the real decision; GO vs ZEN is only a funding source. That is a much simpler control than V2's workspace matrix, and it is the one Young's correction implies.
What must change in the authority doc
§2.0a's "Workspace 1 / Workspace 2" table becomes "SolOS — one workspace, two
tiers", with the cost shape above. D1-style workspace routing disappears; the
only routing decision left is free → paid, and which tier funds it.
I am not editing the file — it is Min's authority document, and last time I "fixed" someone's doc by overwriting it I lost his work. He edits; I record.
2. Correction — references/spec/ and SDK compat
Young: "start fresh one using A2A standard V1.0 is the upto date version."
DESIGN-OF-RECORD.md §2.0b already says native v1.0, with PascalCase names and
the SDK's v0.3 adapter as "a migration path, not the target." I now disagree
with my own earlier position and the record is corrected:
My sol-answer-solos-layout.md and sol-transport-and-execution.md recommended
enable_v0_3_compat=True as day-one behaviour. Young says start fresh on v1.0 —
so V3 has no v0.3 peers to be compatible with, and running the compat adapter
would only add a second dialect to police.
Corrected position: v1.0 native only, compat OFF.
enable_v0_3_compat = False # V3 is greenfield; v0.3 exists only in V2
Consequence worth stating: the v0.3 dialect still lives in V2, so if V2's fleet is ever brought back up it cannot be spoken to by a compat-off V3. That is acceptable — Young stopped V2's Heart deliberately, and a migration bridge for a stopped fleet is dead weight.
references/spec/ stays as I wrote it: tracked, pinned, the four official A2A
repos. V2 left 18 MB of the reference implementation untracked with zero files
in git, which is why the hand-rolled server existed — the SDK was on disk and
nothing forced anyone to read it.
3. Skills and tools on cortex — one sentence, and a design consequence
Young: "Skills and tools stored on cortex for agents to access and load when required, similar to Brain Unit load skill on Hermes."
Recorded as a rule: skills and tools live in cortex/. An agent loads the
one it needs for the task, not all of them.
This is the Hermes pattern, and it is the right one, but V2 already tried and failed it once. The failure is measured, not hypothetical:
V2's agent card advertised 3–5 differentiated skills per agent while every Hermes profile received all 67 — two systems, no shared source. And V2's
_get_skillsreadall_skills.get(agent_id)at the top level ofconfig/a2a_skills.jsonwhile the file nests underagents, so all 8 cards servedskills: []— an unroutable card that looks valid.
So the rule needs the accompanying guard, or it is a preference and not a control:
| Rule | Guard |
|---|---|
skills and tools live in cortex/ | a probe asserts an agent's card lists only skills it may load |
| load on demand | a probe asserts a loaded skill is present in the prompt — a file on disk is not a file in context |
| one source, two projections | a drift test per projection: mutate cortex → each projection fails |
| empty skills = unroutable | a card with skills: [] fails rather than serving |
That last row is the one V2 lacked. An empty skills array is not a weak card; it is a card that routes nothing, and it looked perfectly healthy.
Ownership: this straddles my lane (the A2A card projection) and Min's
(cortex/). I propose: cortex owns the store; I own the card projection; a
drift test in harness/ proves they agree. Recorded here so we do not each
build one.
4. Task lifecycle — the four things Young named, and who owns which
Young: "need to store information of task · assign to agent · completion status · brain Unit can follow up if agent got stuck or blocked."
All four are cortex/tasks/, Min's lane by the design of record. V2's
core/queue.py is the one component that worked — atomic claim with
BEGIN IMMEDIATE, separation of duties enforced — so the contract is carried,
not rebuilt.
What I add is the follow-up requirement, which V2 lacked and which is measurable:
| Requirement | V2 measured | V3 design |
|---|---|---|
| store task info | worked | carried |
| assign to agent | worked — and misrouted: sol reached min, 3 peers rotated | assignment from cortex/registry/, drift-tested |
| completion status | 8 local states, 9 wire states, no bridge | one vocabulary, one declared mapping |
| follow up when stuck/blocked | reclaim_orphaned_tasks, check_stuck_tasks, activate_failover — all built, all ZERO callers | a consumer, or it does not exist |
That last row is the whole lesson in one line. V2 built three mechanisms for exactly the thing Young just specified, and none of them had a caller, so a stuck agent was never followed up with. The follow-up is the part that must have a consumer; the store and the assignment were never the hard part.
Boundary: I do not design the task contract — it is Min's. I record the
follow-up requirement and the guard it needs, and I take the A2A side of it
(tasks/get, tasks/list, the state mapping) in core/protocol/.
5. The division — recorded so we do not clash
Young: "Divide tasks among Sol, Min and Mira and don't clash."
| Lane | Owner | Files | Design source |
|---|---|---|---|
| Registry, identity, task contract | Min | cortex/registry/, cortex/agents/, cortex/tasks/ | DESIGN-OF-RECORD.md, OPEN-DECISIONS.md |
| Transport, execution, probes | Sol | core/protocol/, core/arms/, core/harness/ | sol-transport-and-execution.md (this lane, mine) |
| Providers, cost, dependencies | Mira | core/config/, COST-POLICY.md | mira-dependency-and-toolchain-cost.md |
| Skills/tools store | Min (store) + Sol (card projection) | cortex/ + core/protocol/ | §3 above |
| Task lifecycle | Min (contract) + Sol (A2A surface) | cortex/tasks/ + core/protocol/ | §4 above |
The rule that makes the division hold, learned from my own mistake today: if
a change needs a fact owned by another lane, the task is to give that owner the
evidence and let them make it. I overwrote Min's SCOPE.md this morning by
skipping exactly that step.
Nothing has been created. No files, no folders, no code — per Young's instruction. This document is the entire output of this turn.
6. Open, awaiting Young or the owning lane
| §1 workspace correction into the authority doc | Min |
| §2 compat-off confirm, and the V2-peer consequence | Sol in core/protocol/ design |
| §3 skills guard written into a probe spec | Sol, with Min's store |
| §4 task follow-up consumer named | Min |
| MCP: in scope by Young's ruling; consumer still undefined | unassigned |
solos3 removal — intentional or not? | Young |
The last one is first among equals: V3 has no tree, and everything above is
design until Young says whether solos3 coming back is wanted.
V3 conflicts and corrections — Sol's register
Date: 2026-10-10 Author: Sol (Head of Engineering) Purpose: Record where Min's V3 authority documents and my own measurements disagree, so Young rules on a real disagreement rather than a tidied one.
D1–D5 re-verified individually — measured against disk, and one decision evaporates
Date: 2026-10-10 Author: Sol Answers: Young's "re-verify D1–D5 individually"Also records: Young's six other rulings from the same message

