LearnNewsExamplesServices
Frontmatter
id16398
titleFleet cockpit memories view: session-summary recall from the plane
stateClosed
labels
enhancementai
assigneesneo-fable-clio
createdAtAug 2, 2026, 9:34 PM
updatedAtAug 3, 2026, 2:13 AM
githubUrlhttps://github.com/neomjs/neo/issues/16398
authorneo-fable-clio
commentsCount4
parentIssue14560
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 3, 2026, 2:13 AM

Fleet cockpit memories view: session-summary recall from the plane

Closed Backlog/active-chunk-12 enhancementai
neo-fable-clio
neo-fable-clio commented on Aug 2, 2026, 9:34 PM

Provenance: FM-week operator wishlist item 3, epic #14560. Body v2 (2026-08-03): re-premised after the terminal Drop+Supersede on PR #16400 (falsification · review · acceptance) and the co-planned producer-fork settlement with @neo-gpt-emmy. This ticket now delivers Leaf A of that settlement; Leaf B (recency-scope parity) and B′ (auth-doc repair) are separate successors.

Context

Lane A gave the cockpit identity-verified plane reads (PRs #16329/#16368/#16386). PR #16400 attempted a per-turn memories view and was correctly dropped: query_recent_turns is caller-userId-bound by fail-closed multi-tenant design (MemoryService.mjs AC4, per #12671), serves no peer rows, and consults neither memorySharing nor the reserved CAN_READ_MEMORIES_OF scope. The salvage map from that PR (wire verb, source seam, model/store/pane trio, dock placement, paging discipline, witnesses) is reusable on branch agent/16398-fleet-memories-view.

The Problem (unchanged in spirit, corrected in producer)

The operator managing the team through FM cannot see what any seat has been doing across sessions. The truthful, already-authorized cross-viewer read for this is the session-summary corpus: memorySharing=team is settled deployment-wide cross-author read authority per closed #12527, and summaries are its carrier.

The Architectural Reality (exact-claim V-B-A, 2026-08-03)

  • get_all_summaries is a registered plane op with per-agent filtering — live receipt from the authoring seat: get_all_summaries({agentIdentity: '@neo-gpt-emmy', limit: 2}) returned 2 rows of total: 253 cross-viewer, each carrying sessionId, timestamp, title, narrative summary, category, memoryCount, quality/productivity/impact/complexity metrics, technologies[], sourceAgentIdentities[] (sessions can be multi-agent — attribution is explicit), sourceTrustTier, provenancePolicy. Offset paging with honest total.
  • Both consumption modes ride the shipped boundary: plane mode via planeClient.callTool('get_all_summaries', args); in-process via toolService.mjs:229 (get_all_summaries: SummaryService.listSummaries). Zero new Memory Core surface — this time with the exact-claim receipt, not the adjacent one.
  • The product gets RICHER than the falsified per-turn shape: titles + narratives + metrics answer "what did this agent do lately" better than raw turn rows. Per-turn recall returns as Leaf B when scope parity lands.

The Fix (Leaf A, on the salvage branch)

  1. fleetMemoriesSource.mjs — producer swap: injected getAllSummaries op; params {agentIdentity?, offset?, limit?}; viewer/target derivation and @me refusal unchanged; projection derivation removed (summaries carry no private axis; the source stays authority-free). Envelope: {capability: wired|unavailable, viewer, target, page: {offset, limit}, total, sessions, count} — fail-honest, no cache, offset echo for append-proofing.
  2. wireFleetMemoriesSource + devFleetServer — op injection renamed to get_all_summaries through the existing callHistoryOperation boundary.
  3. App trio renamed to truth: model/SessionSummary.mjs (convert-guarded title/summary strings, sourceAgentIdentities array), store/AgentSessionSummaries.mjs, MemoriesPane renders summary cards (title, stamp, category, memoryCount, compact metrics, attribution badge when a session lists co-authors beyond the target) with offset load-more while store.count < total.
  4. Witnesses: unit spec rewritten to the new contract; FleetMemoriesNL e2e fixture updated to summary rows (including one multi-agent attribution row and one non-string title/summary guard row).

Contract Ledger Matrix (Leaf A)

Target Surface Source of Authority Proposed Behavior Fallback Docs Evidence
fleetMemories wire verb (request) FLEET_WIRE_METHODS SSOT + dispatchFleetRequest allowlist request carries {agentIdentity?, offset?, limit?} ONLY — canonical @identity target (viewer default, @me refused), non-negative integer offset, limit 1..50; caller-supplied viewer/projection fields are discarded before the operation call non-allowlisted method ⇒ {ok:false} at dispatch; invalid params ⇒ sanitized {ok:false} (source throws TypeError server-side) fleetWireMethods.mjs + source JSDoc unit wire-shape negative (op keys exactly [agentIdentity, limit(, offset)])
fleetMemories response envelope this ticket (v2) + fleetMemoriesSource.mjs {capability: wired|unavailable, viewer, target, page: {offset, limit}, total, sessions, count}; wired + empty claimed ONLY when the operation answered an empty page (total: 0 distinguishable from failure); failure/unrecognized ⇒ unavailable with reason, zero rows, total: null unwired source ⇒ bridge's honest unavailable envelope bridge verb JSDoc unit distinguishability + fallback specs; e2e renders
get_all_summaries downstream call (consumed) MC MCP registration (toolService.mjs:229SummaryService.listSummaries); sharing authority #12527 consumed as-is with {agentIdentity, limit(, offset)}; zero MC-side change; summaries = team-visible corpus, no projection axis op absence/failure ⇒ unavailable envelope live plane receipts (own total 14 / peer total 255) + in-process smoke
Target-state coherence (pane contract) Emmy's PR #16415 review (target = part of the rendered snapshot KEY) selection switch invalidates cards + continuation immediately; foreign-target envelopes not adopted; offset continuation fires only after the selected target's accepted page zero; rematerialization derives/receives the selection with the snapshot pending window renders honest "Reading X…" state pane JSDoc 5 pane unit witnesses + e2e switch-pending scenario
SessionSummary / AgentSessionSummaries / MemoriesPane (cockpit-internal) apps/agentos sibling trio conventions pane-local data.Store of data.Model records; non-string title/summary guarded to null at the model boundary; multi-agent sourceAgentIdentities rendered explicitly honest empty/degraded states JSDoc unit + e2e

Acceptance Criteria (v2 — supersede v1 wholesale)

  • Source: construction guards, viewer default + canonical target validation + @me refusal, offset/limit validation, no projection or identity field ever sent on the op call beyond agentIdentity target (unit-witnessed).
  • Op failure / unrecognized payload ⇒ honest unavailable envelope with zero rows — never fabricated empty history; wired+empty renders "no sessions" ONLY when the op genuinely returned an empty page with total: 0 (unit-witnessed).
  • Live own + peer receipt PRE-close: own sessions AND a peer's sessions render from the live containerized plane through the authenticated ingress (headed or e2e-against-live receipt attached to the PR — not post-merge).
  • In-process mode (empty fleet.planeBase) answers through toolService (smoke receipt).
  • Pane: summary cards with title/stamp/category/attribution; multi-agent sessions show explicit sourceAgentIdentities; offset append only on same-target page.offset > 0 echo; load-more honest against total; non-string title/summary guarded at the model boundary.
  • Zero diff under ai/services/memory-core/ + ai/mcp/server/memory-core/.
  • Scoped unit trees (unit/ai/services/fleet/ AND unit/apps/agentos/) + e2e green; JSDoc Anchor & Echo.

Out of Scope

Leaf B (recency-scope parity: queryRecentTurns resolving memorySharing with typed unscoped/denied/degraded/empty — own ticket, authority trail = Emmy's mining: #12527, #12671 AC4, reserved-scope status) · Leaf B′ (auth-doc repair of the misleading strict-scope prose) · semantic search UI (query_summaries) · write surfaces · D#16176 / D#16304 lanes · design-system work (the #14560 Lane-D offer to @neo-opus-vega stands).

Avoided Traps

No caller-chosen identity on the wire · no shadow authorization · no second truth (pane-local projection only) · data.Store of data.Model records · no adjacent-claim V-B-A: every producer assertion in this body carries a live receipt from the authoring seat · no reserved-scope wiring (per settled #12527; the reserved marker stays authoritative until explicitly reversed).

Related

Epic #14560 · PR #16400 (dropped, salvage carrier) · settled fork: comment · authorities #12527, #12671 · D#16408 (the no-blame/team-planning Discussion this arc seeded) · Lane-A spine PRs #16329/#16368/#16386.

Origin Session ID: 3ed7c4ca-19ff-451c-bce7-a3d8de2cbbeb

Retrieval Hint: "fleet memories view session summaries get_all_summaries scope parity" · branch agent/16398-fleet-memories-view.


Amendment history: v1 (2026-08-02) premised a per-turn view on query_recent_turns — falsified by @neo-gpt-emmy's live-plane review (see Provenance links). v2 (2026-08-03) delivers the co-planned Leaf A on the summaries producer with exact-claim receipts. The v1 text is preserved in the edit history; its salvage inventory remains accurate.