LearnNewsExamplesServices
Frontmatter
id17307
titleMemories pane read fails through the fleet wire while the same tool answers directly
stateClosed
labels
bugaiagent-os
assigneesneo-fable-clio
createdAtAug 17, 2026, 6:49 PM
updatedAtAug 17, 2026, 10:12 PM
githubUrlhttps://github.com/neomjs/neo/issues/17307
authorneo-fable-clio
commentsCount2
parentIssue14560
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[x] 17271 The cockpit shows the real fleet by default on the operator seat
closedAtAug 17, 2026, 10:12 PM

Memories pane read fails through the fleet wire while the same tool answers directly

Closed Backlog/active-chunk-17 bugaiagent-os
neo-fable-clio
neo-fable-clio commented on Aug 17, 2026, 6:49 PM

Context

Found by the operator during the #17271 L1 drill-in (2026-08-17): the agent-detail Memories pane renders Memories unavailable · memories-read-failed — "The memories source did not answer." for neo-fable-clio — while the summaries corpus was demonstrably healthy (direct get_all_summaries calls answered rich payloads from the same plane, same tool, same identity).

Diagnosis — re-scoped after the falsifier ladder ran (see the ticket comments for the full ladder)

The original prime suspect (a malformed session UUID in the corpus + strict SDK output-schema validation) was falsified by a standalone reproducer: the exact fleet-child path (createPlaneMailboxClient → real admission → callTool('get_all_summaries')) answered all probes in ~110ms — the malformed row included, which parses fine and is retired to a cosmetic data-quality note.

What actually happened: the failing read was the first attempt after plane recovery on a dead session inside GitHub's auth-flap window — its one-reconnect re-proof hit a PAT revalidation that 503'd; the honest failure envelope then pinned itself forever, because the pane histories are request-driven with no cadence and nothing re-drives them when the transport heals. Two real defects survived the diagnosis:

  1. The source catch discarded the error entirelymemories-read-failed was the whole story, and the five-probe diagnosis this ticket documents is exactly what that costs.
  2. The dead-pane gap: reconnectFleet() ("every liveness seam, immediately") re-drove roster/activity/brain-health/wake-stream — but not the pane histories, the one read class with no cadence of its own.

The Fix (delivered by the resolving PR)

  • fleetMemoriesSource: a failure envelope carries a sanitized detail (message extracted, whitespace-collapsed, 240-bounded, credential families masked via the shared redaction authority); message-less failures omit the field rather than carrying an empty claim. The fleet child logs the same fact server-side ([fleet] memories read failed (<target>): <detail>).
  • FleetCockpit.reconnectFleet(): additionally re-drives the three pane histories (memories / catch-up / wake routes) THROUGH each pane's own refresh handler, whose guards (active agent, partition) decide whether a request exists — an unmounted pane is silence, never a throw.

Acceptance Criteria

  • A failed memories read carries sanitized detail beside the constant memories-read-failed reason; credential-bearing messages are masked; whitespace collapsed; 240-bounded; message-less failures omit the field.
  • The fleet child logs the failure cause server-side.
  • reconnectFleet re-drives the pane histories through the panes' own refresh guards; unmounted panes tolerated.
  • Unit coverage for all of the above (source spec + cockpit spec).
  • Post-merge, live plane: the warn line observed in fleet-child logs on a real failure, and a transport recovery un-pinning a failed pane without manual action.

Data-quality note (retired from scope)

summary_c4996813-01b9-4234-8bdd-4bd-ed3bf22c0970 carries a six-group sessionId — cosmetic, parses fine, not causal. If a summaries-hygiene lane ever exists, it belongs there; it blocks nothing here.

Out of Scope

Pane visual design + refresh affordances (#17268) · summaries content quality · new MC surface · a pane-level auto-retry cadence (the reconnect seam is the designed recovery path; a standing cadence would be new machinery the recovery button explicitly avoids).

Related

#17271 (origin L1 run — closed on the operator-witnessed evidence; this ticket continues as the hardening) · #17268 (pane design) · Epic #14560

Origin Session ID: 7ee47ccf-d1c7-469d-a75e-15cebf3b5ea5

Retrieval Hint: query_raw_memories("memories read failed detail redacted reconnect re-drive dead pane gap")

tobiu referenced in commit 848bc77 - "fix(fleet): memories read failures carry their cause and re-drive on reconnect (#17307) (#17319) on Aug 17, 2026, 10:12 PM
tobiu closed this issue on Aug 17, 2026, 10:12 PM