D1–D5, re-verified one at a time
D1–D5, re-verified one at a time
Young, 2026-10-10: "re-verify D1–D5 individually."
Why re-verify. These five decisions were written when nothing existed. Since
then: the registry gained three fields (model, billing_instrument, retention),
the one-workspace ruling landed, the SDK ruling landed, the stuck number was ruled
then corrected, and .solos became the root. A recommendation made against
an empty tree is not automatically the same recommendation made against a
populated one. Each is checked below against disk, not against the original
reasoning.
One thing I found before starting: OPEN-DECISIONS.md's banner records the
stuck number as 3600 s. Young corrected it to 300 s in a later message,
and mira-opencode-budget-trace.md records that. The banner is stale and it is
the authority doc. Flagged for Min at the end.
D1 — Where does the registry live?
Original recommendation: a declarative file, cortex/registry/agents.yaml.
Verified against disk: ✅ the recommendation is holding, and the file is live.
| Evidence | State |
|---|---|
.solos/cortex/registry/agents.yaml | exists, 253 lines, 11 agents, 3 planes |
Carries id, name, plane, role, pronouns, host, port, endpoint, capabilities, boundaries | ✅ every agent |
Carries model, billing_instrument, retention | ✅ added 2026-10-10 — the three fields that did not exist when D1 was written |
| Any second roster source? | none found. No a2a_fleet.py, no fleet.json, no port literal |
The registry's own note records why, and it is the V2 defect in one line:
"V2 held the model in the personas, where all 8 agents carried the same PAID model — the cost defect itself."
Verdict: D1's recommendation stands, now with evidence it did not have. The declarative file gained precisely the three fields that make it worth declaring.
Open sub-question D1 left: registry.py already exists (orphaned) — keep,
absorb, or delete? No registry.py in .solos/cortex/registry/ — it exists
in V2's tree, not V3's. The question is answered by not porting it. Recorded so
nobody re-asks.
D2 — Where do tasks live?
Original recommendation: cortex owns the contract (states + wire mapping); a database stays the store.
Verified against disk: ✅ the recommendation stands, and the state vocabulary file it implies does not exist yet.
| Evidence | State |
|---|---|
cortex/tasks/states.yaml | absent — nothing to verify against |
| The stuck rule | RULED: 300 s (Young's correction; the authority banner still says 3600 s — stale) |
V2's core/queue.py | atomic claim with BEGIN IMMEDIATE, sound machine, separation of duties — the one component that worked |
Verdict: stands. Relocating working code to satisfy a diagram is still the wrong trade, and three months of evidence has not changed that.
What D2 needs now, which it did not need when written: a decision on the
state vocabulary's two forms. a2a-sdk's TaskState is protobuf — its JSON
serialisation is TASK_STATE_CANCELED, and the wire value is canceled. The
same state, two strings. states.yaml must record both or Stage 3.1's
mapping encodes the wrong one. This was unverifiable when D2 was written,
because the SDK was not installed then.
D3 — How is a skill assigned to an agent?
Original recommendation: plane by default, per-agent override.
Verified against disk: ✅ the recommendation stands, and the mechanism now exists where it did not.
| Evidence | State |
|---|---|
cortex/skills/README.md | declares "each declares: planes, capabilities" |
| Skills actually declared | one — onboard-a-new-agent, which declares no planes field |
Agents carry plane + capabilities | ✅ all 11, in the registry |
V2's other skill system (config/a2a_skills.json) | not ported — V3 has one skill source |
Verdict: stands. Plane is the default and it is a one-field decision that cannot drift.
But this re-verification found a real gap: the one skill that exists does not declare its planes. So the filter D3 describes has nothing to filter. The skill I wrote last turn is the proof of the gap — it is plane-blind, which means it would pass every agent's index.
Action, mine: add planes (and capabilities) to
cortex/skills/onboard-a-new-agent/SKILL.md. It is my lane and my file, so this is
a fix not a report.
D4 — SDK migration: replace or run both?
Original recommendation: both, prove with the Inspector, then migrate.
Verified against disk: ✅ superseded by Young's ruling — the official
a2a-sdk 1.2.2. The question is no longer whether to run both; it is settled.
What the re-verification adds: the compat finding that made D4's recommendation attractive is now moot for a different reason — and worth recording so nobody re-uses it:
| D4 relied on | Reality |
|---|---|
| "the v0.3 compat adapter accepts our exact method names, so running both is safe" | Young ruled fresh on v1.0. V3 has no v0.3 peers to be compatible with — the compat bridge would be a second dialect to police for no benefit |
Verdict: D4's recommendation was sound and is now unnecessary. Adopt the SDK; leave compat off. The Inspector proof survives as the acceptance test, which is the part worth keeping.
The unverified part D4 always carried: the Inspector has never run here,
and opencode.ai/docs/go/ truncation this week showed me how a doc can fail to
deliver its own section. Stage 2.4's proof is the first experiment to run, not a
step to assume.
D5 — Phase 0 first?
Original recommendation: yes, immediately.
Verified against disk: ✅ stands, and the case is now stronger.
| Evidence | State |
|---|---|
.solos root | exists, 253-line registry, structure — and 0 .py files |
| Every stage's proof | none has run |
| The V2 defect D5 protects against | the misaddressed A2A peers — still live in Hermes' config (Sol measured all 8 on wrong ports, three rotating) |
Verdict: stands, unambiguously. Stage 0 is not just first — it is the only stage whose proof can run before any other stage exists, because it exists to detect the thing every other stage produces. It is the cheapest and it should not slip.
Summary
| # | Decision | Re-verified verdict |
|---|---|---|
| D1 | Registry = declarative file | ✅ stands — and gained the 3 fields that justify it |
| D2 | Cortex owns the contract | ✅ stands — plus a new trap found (two strings per state) |
| D3 | Plane by default, override | ✅ stands — but the one existing skill declares no plane. My file, my fix |
| D4 | Run both, prove, migrate | ✅ superseded by the SDK ruling. Compat finding now moot — fresh v1.0, compat off |
| D5 | Phase 0 first | ✅ stands, stronger. Only stage whose proof can run first |
Four hold, one superseded, none overturned.
Flagged, not mine to edit
OPEN-DECISIONS.md's banner records the stuck number as 3600 s. Young corrected to 300 s. The authority doc is stale on a ruled value. Min's file — reported.cortex/tasks/states.yamlstill does not exist, so D2's contract has no artefact. Min's lane.
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:
V3 — Dependencies, Toolchain Cost, and the SDK Proof
Why this exists. Sol's 03-decisions/sol-conflicts-and-corrections.md §5 lists three things neither author had verified. All three are now measured. This file is the evidence, written as a finding in docs/-equivalent territory — V3's dependency and cost posture is my lane (config/providers.json, fallback chain, cost policy per 05-operations/layer-ownership.md), so this is a report from my lane, not a patch to Sol's or Min's.

