LearnNewsExamplesServices
Frontmatter
id15382
titleFleet activity PR/lane slot emits no PR events — wire the synced-pulls reader
stateClosed
labels
enhancementai
assigneesneo-opus-ada
createdAtJul 17, 2026, 8:17 PM
updatedAtJul 18, 2026, 8:09 AM
githubUrlhttps://github.com/neomjs/neo/issues/15382
authorneo-opus-ada
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJul 18, 2026, 8:09 AM

Fleet activity PR/lane slot emits no PR events — wire the synced-pulls reader

Closed Backlog/active-chunk-7 enhancementai
neo-opus-ada
neo-opus-ada commented on Jul 17, 2026, 8:17 PM

Context

Follow-up to #15339 (the activitySource composer wiring, merged as PR #15375). That leaf wired FleetControlBridge.activitySource and deliberately shipped readPrs omitted in v1 — the PR/lane slot's pure builder createFleetPrLaneActivitySnapshot accepts {prs, issues, stallFindings}, but the wiring feeds only issues (via readWorkGraphIssueRecords) + stallFindings (via buildWorkGraphStallFindings). So the live fleet cockpit activity feed emits issue / lane-claim / work-stall events but no pr-activity events.

The Problem

createFleetPrLaneActivitySnapshotcreatePrActivityEvents(prs) has no caller (verified: grep createPrActivityEvents ai/ finds only the definition). PR opens/reviews/merges — a large part of fleet coordination — never reach the cockpit's ActivityStream.

The Architectural Reality

  • PRs are locally synced at resources/content/pulls/chunk-*/ (the same chunked shape as resources/content/issues/), and a pullsDir config leaf already exists (ai/mcp/server/github-workflow/configBase.mjs).
  • wireFleetActivityReadSource (ai/services/fleet/wireFleetActivityReadSource.mjs) already exposes an injected readPrs seam for exactly this — the composer/reader plumbing is done; only the reader + its injection at the devFleetServer boot use site are missing.
  • createPrActivityEvents reads pr.number/author/title/state/reviewDecision/isDraft/updatedAt from GitHub-Workflow-shaped PR payloads.

The Fix

  1. A synced-pulls reader (parallel to readWorkGraphIssueRecords) over resources/content/pulls → PR payloads in the shape createPrActivityEvents consumes.
  2. Inject it as readPrs in devFleetServer's wireFleetActivityReadSource({...}) call, resolving pullsDir at the entry use site (read-at-use-site; ADR-0019 for any config).
  3. Fail-soft: an unreadable pulls tree degrades the PR/lane slot honestly (the builder's error path), never fabricated PR events.

Acceptance Criteria

  • node ai/services/fleet/devFleetServer.mjs + fleetActivity emits real pr-activity events alongside the existing issue/lane/stall events — verified live (receipt), not inferred.
  • The reader reads local-synced resources/content/pulls; no live GitHub call from the fleet-server process.
  • Unreadable pulls tree → PR/lane slot degrades naming its slot; no fabricated PR events.
  • Bounds: the read respects the composer's limit; a large pulls tree does not unbound the read.

Out of Scope

  • The A2A slot's identity gate (#15320) and the composite wired/live state (#15339's finding).
  • Changing createFleetPrLaneActivitySnapshot / createPrActivityEvents (the builder is delivered).

Related

Parent Epic #13015 · follow-up to #15339 (the readPrs seam) · sibling reader readWorkGraphIssueRecords (ai/services/graph/issueFocusSections.mjs).

Origin Session ID: 3f892890-5ce2-4045-8290-dbbdff1b987a

Retrieval Hint: fleet activity readPrs synced pulls reader createPrActivityEvents devFleetServer wireFleetActivityReadSource

Live latest-open sweep: checked latest 15 open at 2026-07-17T18:09Z (latest #15379); no equivalent — createPrActivityEvents has no caller. A2A in-flight sweep: no [lane-claim] on the fleet-activity PR-reader scope.