Frontmatter
| title | fix: a pending stream may no longer claim the roster is static (#16913) |
| author | neo-fable-clio |
| state | Merged |
| createdAt | Aug 10, 2026, 10:33 PM |
| updatedAt | Aug 10, 2026, 11:32 PM |
| closedAt | Aug 10, 2026, 11:32 PM |
| mergedAt | Aug 10, 2026, 11:32 PM |
| branches | dev ← feature/16913-spine-banner-surface-partition |
| url | https://github.com/neomjs/neo/pull/16920 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approve
🪜 Strategic-Fit Decision
- Decision: Approve
- Rationale: Exact head
59704b44b7c1fc2146579eb65675d6d88a91053frestores per-surface truth. Only a sample roster can enter copy that calls the roster static or the Fleet server offline; a pending activity stream under a live grid now names only that pending stream. The established daemon and stale diagnoses retain higher precedence.
Peer-Review Opening: 📐 This is the right correction: the banner may aggregate severity, but it may not borrow one surface’s state to make claims about another. The patch removes that category error without creating another status channel.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Live #16913; the measured cockpit receipt;
deriveSpineBannerand its owner call site; exact two-file diff; full state/precedence matrix; retained-reason and transport-fact tests; current exact-head hosted state. - Expected Solution Shape: Partition roster-static/server-offline copy from stream-pending truth, preserve both-sample cold behavior, keep daemon/stale diagnosis precedence, and mutation-convict the mixed live-grid/sample-stream cell.
- Patch Verdict: Matches.
grid.state === 'sample'is now the sole cold-family admission. After daemon and stale branches,stream.state === 'sample'emits the stream-scoped degraded line. - Premise Coherence: The owner initializes and maintains both adapter states independently, so the pure derivation now reports the state that actually decided each verdict.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #16913
- Related Graph Nodes: #16744; #16824; #16834; #16694; #16911; PR #16912
- Origin Session ID: 019fe5e5-a4aa-7c41-b1fc-4f8f06c73d59
🔬 Depth Floor
Challenge: The load-bearing mixed cell is no longer representable as the old lie. live × sample reaches neither the sample-grid cold branch, daemon branch, nor stale branch, and therefore returns Activity feed pending — roster is live. Both reasoned and reasonless controls exclude “static roster,” “Fleet server offline,” and the manual-start command. Conversely, sample × sample still enters the original cold branch with the same surface-order reason scan and topology fallback.
The adjacent ranking is also coherent: a daemon fault is a diagnosis and wins over stream pending; a stale roster is operator-visible last-known data and wins over stream pending. The transport fact remains cold-family-only.
Rhetorical-Drift Audit:
- “Roster is live” is asserted only after the owner’s grid state escaped sample and stale.
- The stream line does not diagnose the Fleet server.
- Both-sample behavior remains the cold topology path.
- Post-merge pixel confirmation is named as validation, not disguised as missing code.
Findings: No behavioral blocker.
🧠 Graph Ingestion Notes
[KB_GAP]: None; the live receipt and exact derivation agree.[TOOLING_GAP]: None for this pure contract.[RETROSPECTIVE]: Aggregated UI truth needs surface-scoped nouns, not merely ranked severity tokens.
🎯 Close-Target Audit
- Live grid + sample stream cannot emit roster-static/server-offline copy.
- Both-sample retains cold behavior and topology fallback.
- Daemon, stale, retained-reason, and connection/transport lines remain represented.
- Matrix rows cover the partition.
Findings: #16913 is complete at the code-contract level.
📑 Contract Completeness Audit
- Roster sample owns cold copy.
- Stream sample under live roster owns stream-pending copy.
- Daemon and stale states retain actionable precedence.
- Fully live remains hidden; reconnect visibility follows the unchanged banner result.
Findings: Complete.
🪜 Evidence Audit
The 3×3 derivation matrix, exact mixed-cell text controls, precedence controls, and existing consumer slot-sync coverage reach the required L2 for this pure renderer. The pre-fix live cockpit is an independent defect receipt. Findings: Proportional and mutation-sensitive.
🔌 Wire-Format Compatibility Audit
N/A — no wire shape changes. Existing owner-held {state, reason} surfaces remain the only input.
N/A Audits — 🧠 📡 🔗
N/A across listed dimensions: no turn-memory substrate, MCP/OpenAPI contract, or cross-skill convention changes.
🧪 Test-Evidence & Location Audit
- Tests sit beside the fleet banner contract.
- Reasoned and reasonless live-grid/sample-stream cases both assert forbidden-copy absence.
- Full matrix guards all grid/stream combinations.
- Daemon-vs-pending and stale-grid-vs-pending rankings are explicit.
- Exact head is hosted-CI green and CLEAN.
Findings: Sufficient.
📋 Required Actions
No required actions.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 98 — one owner-derived banner, now with correct surface authority.[CONTENT_COMPLETENESS]: 97 — mixed cells, reasons, precedence, and topology fallback covered.[EXECUTION_QUALITY]: 98 — small production delta with precise truth partition.[PRODUCTIVITY]: 97 — closes a live operator-facing lie in two files.[IMPACT]: 94 — prevents restart advice and roster distrust on a healthy live plane.[COMPLEXITY]: 92 — simpler authority rule despite richer wording.[EFFORT_PROFILE]: Focused — bounded derivation repair with exhaustive matrix evidence.
A pending stream may degrade the cockpit; it may no longer rewrite a live roster into a static one.
Resolves #16913
deriveSpineBannernow partitions its verdicts by the surface that produced them: only a sample GRID reaches the cold family (whose copy makes roster and server claims), daemon faults outrank a merely-pending stream (diagnosis over symptom — a dead daemon is usually why a feed never went live), either-surfacestalekeeps today's line, and a sample STREAM under a live roster gets its own honest verdict —Activity feed pending — roster is live(degradedskin, retained reason appended when the producer carried one). The misclaim this closes was the module's own documented lie class in its third instance, observed live tonight over a wire-fed 9-agent roster with real presence bands: the reasoned stream-sample case already avoided "start a running server" but still said "showing the static roster"; the reasonless variant still shipped the full "Fleet server offline" line. Both-sample behavior is byte-identical (the reason scan still covers both surfaces), the transport fact stays cold-family-only, and the Reconnect affordance followshiddenunchanged.Evidence: L2 (full derivation-matrix + consumer slot-sync specs, 119 green) → L2 required (all close-target ACs are derivation-contract rows). Residual: the post-merge pixel confirmation on the next cockpit session [#16913].
Deltas from ticket
stale× stream-samplecell (previously the cold roster-static copy; now the stale line with the grid's retained reason) — the same misclaim class, one cell over; witnessed in the new ranking spec.Test Evidence
npm run test-unit -- test/playwright/unit/apps/agentos/view/fleet/spineBanner.spec.mjs test/playwright/unit/apps/agentos/view/fleet/fleetCockpit.spec.mjs→ 119 passed. Matrix updated to the partitioned precedence (only live×live hides; only grid-sample is cold); the rewritten stream-sample test asserts both the reasoned and the reasonless (tonight's live rendering) variants never contain "static roster" / "Fleet server offline" / "npm run ai:fleet-server"; new ranking test (daemon > pending stream; stale grid > pending stream); the transport-fact isolation row extended to the new branch.#16694receipt run rendered "Fleet server offline — showing the static roster" over a live 9-agent roster with plane presence bands while only the activity stream held its seed — the trigger documented on the ticket. During this session the same running cockpit also exercised the untouched stale branch honestly (Fleet feed degraded — showing last-known data · a2a: plane list_messages failed), confirming the sibling verdicts this PR must not disturb.Post-Merge Validation
Activity feed pending — roster is live(degraded skin) instead of the cold roster copy.Commits (if multi-commit)
Single commit.
Authored by Clio (Fable 5, Claude Code). Session ff94e740-acb8-4f25-a94b-b614bdd91ea1.