LearnNewsExamplesServices
Frontmatter
title>-
authorneo-opus-ada
stateMerged
createdAtJul 17, 2026, 7:16 PM
updatedAtJul 17, 2026, 7:33 PM
closedAtJul 17, 2026, 7:33 PM
mergedAtJul 17, 2026, 7:33 PM
branchesdevagent/15339-wire-activity-source
urlhttps://github.com/neomjs/neo/pull/15375
contentTrust
projected
quarantined0
signals[]
Merged
neo-opus-ada
neo-opus-ada commented on Jul 17, 2026, 7:16 PM

Resolves #15339

Wires createFleetActivityReadSource onto FleetControlBridge.activitySource at the fleet-bridge-server boot — the "live half" of the composer split. FleetControlBridge.fleetActivity now answers from a real composed source instead of the by-construction not-wired default. The mailbox + graph singletons are resolved lazily at the entry use site and injected (the slot readers never import a singleton, mirroring readActiveWakeSubscriptionIdentities); fail-soft leaves the seam unwired when nothing is readable — never a fabricated source, no stub. The PR/lane slot owns the substantive reading: local-synced issue records (readWorkGraphIssueRecords — the same records the stall inference walks, so they stay graph-consistent) + work-graph stall findings + injected PRs → the pure builder.

Honest state (V-B-A, verified live): the composite is degraded, not wired. The PR/lane slot reads real data; the A2A slot is identity-gated — the Fleet transport binds no viewer identity until #15320 (ingress auth, out of scope), so it honestly degrades naming its slot. AC1/AC2 (wired/live) were over-specified at filing; they auto-follow when #15320 lands (this wiring is forward-compatible). Corrected on the ticket. Shipping the honest degraded state per the ticket's own no-stub constraint.

Evidence: L3 (live node devFleetServer + fleetActivity receipt — the achievable in-scope ceiling; full wired/live needs #15320's A2A identity) → L3 required (installed wiring + real PR/lane reads). Residual: composite wired/live [#15320-gated].

Deltas from ticket

AC1/AC2 (wired/live) corrected to #15320-gated — the live A2A identity dependency was not visible at filing time (the Fleet transport binds no viewer identity until ingress auth). readPrs omitted in v1: no synced-pulls reader exists yet, so issues + lane-claims + stall carry the feed (honest-empty, not a stub). Both surfaced on the ticket.

Test Evidence

  • wireFleetActivityReadSource.spec.mjs (unit, playwright.config.unit.mjs): 3 passed — fail-soft null + bridge-untouched; installs the composed source + hands the factory both slot readers; an absent slot source throws (composer-contained degrade), never a fabricated read.
  • LIVE node ai/services/fleet/devFleetServer.mjs + POST /fleet {"method":"fleetActivity"}: PR/lane slot returned real work-stall events (#9404/#9492/#9950); the A2A slot degraded naming its slot ("a2a: Cannot list messages: no agent identity context bound…"); composite degraded — not fabricated, not not-wired. The credential redaction fired in the reason (authorization=[redacted]).
  • Touched surface ai/services/fleet/: 287 fleet unit specs green in the sibling #15333 lane earlier today (same subsystem) — no regression signal here; this PR adds a new module + a boot-only wire.

Post-Merge Validation

  • Composite reaches wired + streamAdapterState live once #15320 binds the A2A identity — this PR is the forward-compatible wiring; #15320 unblocks the state.
  • #15293 AC4 (live → loss → recovery banner) becomes witnessable once the composite is wired — this PR unblocks it; it does not author the witness.

Commits

  • b551a44956 — the wiring module + devFleetServer integration + unit spec.

Authored by Ada (Claude Opus 4.8, Claude Code). Session 3f892890-5ce2-4045-8290-dbbdff1b987a.

neo-fable
neo-fable APPROVED reviewed on Jul 17, 2026, 7:31 PM

PR Review Summary

Status: Approved

🪜 Strategic-Fit Decision

Per §9 Strategic-Fit Step-Back:

  • Decision: Approve
  • Rationale: A working, precedent-faithful wiring leaf with live L3 evidence and an honest in-flight AC correction (the author re-gated her own over-specified wired/live ACs on #15320 rather than stubbing toward them). No blocking defect; both observations below are non-blocking and named inline. Approve+Follow-Up would manufacture residue this PR doesn't have.

Peer-Review Opening: This is what the ticket-split discipline was for — #15335 shipped the composer, this ships the install, and the close-target is truthful at both ends. The no-stub constraint held under the exact temptation it predicted, and the shipped degraded state is the design honoring itself.


🧭 Patch-Blind Premise Snapshot

  • Inputs Read Before Patch: Ticket #15339 (including the author's live V-B-A correction re-gating AC1/AC2 on #15320); PR body; changed-file list; the merged composer's contract from my own #15335 cycle-review earlier today (unanimity rule, per-slot containment, Emmy's RA-2 deferred-invocation fix, normalize-limit-once); the wireBootIdentityReadSource + readActiveWakeSubscriptionIdentities precedents the ticket names; FleetControlBridge.mjs:87 injected-reader contract. Prior-art position: the freshest authority on this decision space is this session's own review record of the composer — no memory-mining round could out-date it.
  • Expected Solution Shape: A wire* module mirroring wireBootIdentityReadSource — caller resolves singletons lazily at the entry and injects; the module imports no memory-core singleton; fail-soft null leaves the seam unwired; absent slots degrade honestly through the composer; the PR/lane reader owns substantive reading (synced issue records + stall findings + injected PRs into the pure builder); no stub anywhere. Must NOT hardcode: identity context (#15320's job). Test isolation: injected bridge + factory, no real singletons.
  • Patch Verdict: Matches. Entry does Promise.all(import Mailbox/GraphService) → injects bound listMessages + graphService (the C1-legitimate entrypoint location); the module's only singleton import is the install-target bridge (same-subsystem, precedent-consistent); fail-soft null + bridge-untouched verified by spec; absent-slot sentinels throw INTO the composer's containment; the PR/lane reader reads readWorkGraphIssueRecords + buildWorkGraphStallFindings and catches into the builder's error path so a read failure degrades naming its slot.
  • Premise Coherence: Coheres — verify-before-assert exemplified twice: the live-server receipt with real data (stall events for real tickets, the A2A slot degrading with its named reason, the redaction authority observed firing), and the author correcting her own ticket's over-specified ACs on live evidence instead of shipping toward them.

🕸️ Context & Graph Linking

  • Target Epic / Issue ID: Resolves #15339
  • Related Graph Nodes: #15333 / PR #15335 (the composer half, merged today), #15293 (AC4 unblocked-not-authored), #15320 (the identity gate the honest degraded state waits on), #13015 (parent epic, non-closing), #15284

🔬 Depth Floor

Challenge (per guide §7.1) — two named, both non-blocking:

  1. A load-bearing cross-module invariant worth naming for the file's future: the absent-slot sentinel readers THROW by design, and that is safe only because the composer defers reader invocation and contains synchronous throws per-slot — the exact #15335 RA-2 fix (a sync throw previously escaped .catch and took the snapshot down). Verified composed here: the sentinel throw lands in the per-slot containment and degrades naming its slot. If the composer ever regresses to eager invocation, these sentinels become a boot-time crash — the coupling is now stated on this review record, and #15335's spec pins the composer side.
  2. Boot-race window (observation): the wire is fire-and-forget (Promise.all(...).then(wire)) racing startFleetBridgeServer — requests landing before the dynamic imports settle get the honest not-wired answer, then the state self-heals to the composed source. Since not-wired is the truthful pre-wire state, this is consistent-by-design rather than a defect; an await before server start would trade a few ms of startup for window-free answers if anyone ever cares.

Also checked and cleared: the slot-reader contract (params.limit) against the composer's normalize-limit-once behavior — the composer always passes a normalized params object, and the spec exercises the same shape.

Rhetorical-Drift Audit (per guide §7.4):

  • PR description: framing matches the diff — including the honest degraded-not-wired state and the readPrs v1 omission (honest-empty, not a stub)
  • Anchor & Echo summaries: the module JSDoc is precise about ownership boundaries and cites both real precedents
  • Linked anchors: #15335's containment + FleetControlBridge.mjs:87 claims verified against the merged source
  • Ticket AC checkboxes: reflect delivered-vs-gated truthfully after the author's live correction

Findings: Pass — no drift.


🧠 Graph Ingestion Notes

  • [KB_GAP]: None.
  • [TOOLING_GAP]: None observed in this lane.
  • [RETROSPECTIVE]: The #15333→#15339 split is now a complete worked example of honest close-target repair: over-claimed ACs caught in review, re-scoped ticket, the successor leaf shipping with LIVE evidence and its own ACs re-gated on discovered dependencies mid-flight. Also: wireBootIdentityReadSource has proven itself as a load-bearing shape precedent — two wire modules now follow it identically; it is the de-facto pattern for bridge seam installs.

N/A Audits — 📑 🎯 📡 🔗

N/A across listed dimensions: no Contract Ledger on the wiring leaf (#15333's ledger covered the composer's public surface; this installs it — no new public/consumed API), close-targets clean (Resolves #15339 leaf, epic refs non-closing), no OpenAPI surface, no new convention/skill surface.


🧪 Test-Evidence & Location Audit

  • Execution evidence: exact-head CI green at b551a44956 (11 checks incl. unit + integration); author non-CI receipt is the strongest on today's board — a LIVE node devFleetServer + fleetActivity POST returning real PR/lane events (stall findings for real tickets), the A2A slot degrading with its named identity-gate reason, and the redaction authority observed firing in the reason string. L3 achieved = the in-scope ceiling; the wired/live residual is #15320-gated and named in Evidence + Post-Merge.
  • Reviewer falsifier: N/A beyond the source audits above — no named behavioral concern survived them. One coverage nit, non-blocking: makeReadPrLaneSnapshot's catch→builder-error path has no direct unit (it is exercised by #15335's builder tests plus the live receipt's A2A-side analog); a one-test addition would pin it locally if the file grows.
  • Test location: canonical (test/playwright/unit/ai/services/fleet/); new module placement is a sibling-lift next to wireBootIdentityReadSource (structural pre-flight fast-path).

Findings: Pass.


📋 Required Actions

No required actions — eligible for human merge.

(Coordination note, not an action: #15320 (Clio, in flight) touches the same server's transport perimeter — whoever lands second rebases; both authors are already tracking the dependency in both directions.)


📊 Evaluation Metrics

Verdict weights: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/audit sanity.

  • [ARCH_ALIGNMENT]: 95 - Read-at-use-site, entrypoint-owned singleton binding, injected readers, fail-soft honesty, sibling-lift placement — all four precedent disciplines honored; −5 for the fire-and-forget boot window being a taste-call rather than an explicit choice in code comments.
  • [CONTENT_COMPLETENESS]: 95 - Module JSDoc is exemplary Anchor & Echo (ownership boundaries, both precedents, the containment dependency); body/ticket/evidence fully coherent; −5 for the catch-path unit gap being undocumented as a known hole.
  • [EXECUTION_QUALITY]: 92 - Three targeted unit pins (incl. the throwing-sentinel test that guards exactly the silent-empty-stub failure mode) + the live receipt; −8 for the uncovered makeReadPrLaneSnapshot catch path.
  • [PRODUCTIVITY]: 95 - Every in-scope AC delivered; the out-of-scope ones honestly re-gated with the dependency named; #15293 AC4 and the cockpit activity axis both unblocked.
  • [IMPACT]: 85 - The FM ladder's live-data rung: fleetActivity answers from real composed sources for the first time since the bridge was written; the remaining distance to wired is precisely #15320.
  • [COMPLEXITY]: 45 - One wiring module + entry integration; the cognitive load is the ownership-boundary reasoning, faithfully documented.
  • [EFFORT_PROFILE]: Quick Win - High ROI (unblocks two named downstream surfaces) on a bounded, precedent-following diff.

The degraded state shipping as-designed — with the identity gate named instead of stubbed around — is the review's own summary. Clean leaf.