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
createFleetPrLaneActivitySnapshot → createPrActivityEvents(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
- A synced-pulls reader (parallel to
readWorkGraphIssueRecords) over resources/content/pulls → PR payloads in the shape createPrActivityEvents consumes.
- 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).
- Fail-soft: an unreadable pulls tree degrades the PR/lane slot honestly (the builder's
error path), never fabricated PR events.
Acceptance Criteria
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.
Context
Follow-up to #15339 (the
activitySourcecomposer wiring, merged as PR #15375). That leaf wiredFleetControlBridge.activitySourceand deliberately shippedreadPrsomitted in v1 — the PR/lane slot's pure buildercreateFleetPrLaneActivitySnapshotaccepts{prs, issues, stallFindings}, but the wiring feeds onlyissues(viareadWorkGraphIssueRecords) +stallFindings(viabuildWorkGraphStallFindings). So the live fleet cockpit activity feed emits issue / lane-claim / work-stall events but nopr-activityevents.The Problem
createFleetPrLaneActivitySnapshot→createPrActivityEvents(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
resources/content/pulls/chunk-*/(the same chunked shape asresources/content/issues/), and apullsDirconfig leaf already exists (ai/mcp/server/github-workflow/configBase.mjs).wireFleetActivityReadSource(ai/services/fleet/wireFleetActivityReadSource.mjs) already exposes an injectedreadPrsseam for exactly this — the composer/reader plumbing is done; only the reader + its injection at thedevFleetServerboot use site are missing.createPrActivityEventsreadspr.number/author/title/state/reviewDecision/isDraft/updatedAtfrom GitHub-Workflow-shaped PR payloads.The Fix
readWorkGraphIssueRecords) overresources/content/pulls→ PR payloads in the shapecreatePrActivityEventsconsumes.readPrsindevFleetServer'swireFleetActivityReadSource({...})call, resolvingpullsDirat the entry use site (read-at-use-site; ADR-0019 for any config).errorpath), never fabricated PR events.Acceptance Criteria
node ai/services/fleet/devFleetServer.mjs+fleetActivityemits realpr-activityevents alongside the existing issue/lane/stall events — verified live (receipt), not inferred.resources/content/pulls; no live GitHub call from the fleet-server process.limit; a large pulls tree does not unbound the read.Out of Scope
wired/livestate (#15339's finding).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-dbbdff1b987aRetrieval Hint:
fleet activity readPrs synced pulls reader createPrActivityEvents devFleetServer wireFleetActivityReadSourceLive latest-open sweep: checked latest 15 open at 2026-07-17T18:09Z (latest
#15379); no equivalent —createPrActivityEventshas no caller. A2A in-flight sweep: no[lane-claim]on the fleet-activity PR-reader scope.