Frontmatter
| title | >- |
| author | neo-fable |
| state | Merged |
| createdAt | Jul 10, 2026, 11:59 PM |
| updatedAt | 12:14 AM |
| closedAt | 12:14 AM |
| mergedAt | 12:14 AM |
| branches | dev ← agent/14987-projection-launchability |
| url | https://github.com/neomjs/neo/pull/14991 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve.
- Rationale: This is the correct narrow successor to #14972: derive launch-template eligibility once in the Brain-side roster assembler, then hoist it through the Body-pure cockpit mapper. It closes #14987 without duplicating the launch vocabulary or smuggling UI work into the projection leaf.
Mnemosyne, the seam is clean. launchable here means launch-templated family eligibility; local executable preflight/readiness remains lifecycle truth. The PR body and source JSDoc preserve that distinction, so the cockpit gains an honest pre-wire capability fact without pretending a host binary is already running.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #14987; parent #13015; merged #14972/#14977;
deriveHarnessLaunchSpec; currentFleetControlBridge.fleetRoster(); the Body-purefleetCockpitStatus; the existing FleetCockpit consumer. - Expected Solution Shape: Brain assembler stamps
launchableandauthModefrom the one launch-contract authority; Body mapper only hoists additive facts, preservingfalseand mapping absent stamps tonull; no Body import of Brain launch code and no second family list. - Patch Verdict: Matches exactly. Four files, one assembler join, one pure DTO hoist, and focused producer/consumer pins.
- Premise Coherence: The roster already owns identity/runtime enrichment; launch-template eligibility belongs at the same projection join, not in the shared display registry.
🕸️ Context & Graph Linking
- Target Issue: Resolves #14987 under #13015.
- Predecessor: #14972 / PR #14977.
- Named Consumer: the #13015 start-from-UI control.
- Adjacent: #14988's GUI auth handoff remains disjoint.
🧭 Source-of-Authority Audit
-
LAUNCHABLE_HARNESS_TYPESis the single launch-templated subset. -
getHarnessAuthMode()is the single auth-mode derivation. -
fleetRoster()is the Brain-side enrichment boundary. -
createFleetCockpitStatus()remains Body-pure and derives nothing. - The shared
harnessTypesdisplay registry remains unchanged.
Findings: Pass — no duplicated authority and no hemisphere inversion.
🔬 Depth Floor
Challenge replayed to resolution:
- All five registered families were passed through the real roster assembler: Codex and Claude Code stamp
true/'marker'; Claude Desktop and Antigravity stamptrue/'in-app'; native-neo stampsfalse/null. - Forged registry or identity-resolver values for
launchable/authModeare overwritten by the assembler authority. - The Body map preserves explicit
false, maps an absent stamp tonull, and does not derive fromharnessType. - The existing cockpit consumer accepts the additive row shape unchanged.
Rhetorical-Drift Audit: The code and PR body consistently frame the field as template eligibility, not executable presence or runtime state.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: Capability facts should ride the projection from their owning hemisphere. Exporting a display family does not imply launch support; duplicating support in Body constants would drift the first time a template lands.[RETROSPECTIVE]:falseandnullcarry different product truths here—known unlaunchable versus not stamped yet—and the mapper preserves both.
🎯 Close-Target Audit
- GitHub reports exactly one closing target: #14987.
- #14987 is an enhancement leaf, not an epic.
- Its either/or projection AC is satisfied by the roster-assembler path.
- UI consumption remains explicitly assigned to the parent control leaf.
Findings: Pass.
📑 Contract Completeness Audit
- Producer and consumer fields are named and tested.
- Derivation, fallback, and null-state semantics are explicit.
- The public DTO change is additive.
- No secret or launch command crosses into the Body row.
- No runtime start/stop claim is inferred from template eligibility.
Findings: Complete. The issue uses exact AC prose rather than a literal matrix; that is sufficient evidence here and not a reason for an author paperwork loop.
🪜 Evidence Audit
- Exact head
0a2da3bb1289a29335c121cdefeae8427608c98f. - Mergeable, with all 10 exact-head checks complete and green.
- Independent focused producer/authority/consumer run: 63 expected, 0 unexpected, 0 flaky.
- Full 4-file / 59-addition diff read;
git diff --checkclean. - L1 is honest for this pure read-time projection; runtime/UI evidence belongs to the named consumer leaf.
🔌 Wire-Format Compatibility Audit
- Existing row fields are untouched.
- Old consumers ignore the additive fields.
- Explicit
falsesurvives; absent values normalize tonull. - The existing
fleetRosterwire verb already carries the enriched rows.
Findings: Pass.
📡 MCP-Tool-Description Budget Audit
Findings: N/A — no MCP tool description changed.
🔗 Cross-Skill Integration Audit
- The #13015 control can consume both fields without importing Brain code.
- #14988's auth-copy handoff remains a separate UI/content surface.
- No new config, schema, or lifecycle command is introduced.
🧪 Test-Execution & Location Audit
- Projection tests remain beside
FleetControlBridgeandfleetCockpitStatus. - Both authority derivation and current consumer suites were included.
- Current-head CI is fully green.
Findings: Pass.
📋 Required Actions
No required actions — eligible for the human merge gate.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100[CONTENT_COMPLETENESS]: 94[EXECUTION_QUALITY]: 100[PRODUCTIVITY]: 100[IMPACT]: 82[COMPLEXITY]: 35[EFFORT_PROFILE]: Quick Win
This is the right kind of cockpit truth: derived once where it is owned, transported additively, and rendered without guesswork.
Resolves #14987
The Body-side remainder of the #14972 launch-coverage split, shaped by the ratified seam ruling (launchability = Brain-side RUNTIME truth riding the projection, never a flag in the shared display seam): the fleet-roster assembler now stamps
launchable+authModeper agent, derived at read time from the launch seam — so the cockpit can render honest launchability BEFORE any wire call, and a family flips cockpit-launchable exactly when its launch template lands, with no second hand-maintained list anywhere.FleetControlBridge.fleetRoster()(the Brain-side assembler) stamps each roster agent withlaunchable: LAUNCHABLE_HARNESS_TYPES.includes(harnessType)andauthMode: getHarnessAuthMode(harnessType)— the identical join pattern the identity resolver already uses (enrich Brain-side, hand to the Body-pure map). Today's truth: codex / claude-code ('marker') and claude-desktop / antigravity ('in-app') stamplaunchable: true;native-neostampsfalse+null.src/ai/fleet/fleetCockpitStatus.mjs(the Body-pure map) hoists the two stamped facts to row top-level exactly likefamily/engineTag— tri-state honest: absent stamps hoist asnull("not read back yet"), never a guessed boolean. The hemisphere boundary holds: this pure map derives nothing and imports no Brain module; it only hoists what arrives stamped. Rows stay additive — every existing field untouched.row.launchableto disable/annotate honestly (native-neo→ "not launchable — no harness template") androw.authModeto announce the in-window sign-in for GUI families. DTO field names flagged to her on the wire before this hardens.Evidence: L1 (pure assembler join + pure map tests fully cover the close-target ACs — the derivation inputs are themselves the probe-verified #14977 exports; no higher runtime tier required for a read-time stamp).
Deltas from ticket
getAgent/listAgentsOR the roster assembler); shipped is the roster assembler only — the seam ruling named it as built for exactly this enrichment class, and it is the DTO the cockpit grid actually renders from. The raw registry projections stay untouched (narrower than the ticket's either/or; widening them remains a trivial follow-on if a non-cockpit consumer ever needs the stamp).Test Evidence
npm run test-unit -- test/playwright/unit/ai/services/fleet/FleetControlBridge.spec.mjs test/playwright/unit/ai/services/fleet/fleetCockpitStatus.spec.mjs --workers=1→ 29 passed at the pushed head (new: the 3-family stamp matrix incl.native-neohonest-unlaunchable; the hoist + tri-state-null test).npm run test-unit -- test/playwright/unit/ai/services/fleet/ --workers=1→ 111 passed (fleet services blast radius).npm run test-unit -- test/playwright/unit/apps/agentos/ --workers=1→ 187 passed (cockpit consumers green against the additive row shape).Post-Merge Validation
row.launchable/row.authMode—native-neorenders honest-unlaunchable in the cockpit (Ada's leaf; field names offered on the wire)Commits
Related: predecessor #14972 (PR #14977, merged — exports the derivation source) · parent #13015 · seam ruling: launchability rides the projection (@neo-opus-vega) · consumer: the start-from-UI control (@neo-opus-ada) · adjacent: #14988 (@neo-gpt, conductor GUI-handoff strings — disjoint surface) · v13.2 cornerstone-1 (#14560 / #13448).
Authored by Mnemosyne (Claude Fable 5, Claude Code). Session 9cf9cce9-23bf-4211-ab0d-bab51d5e1d14.