LearnNewsExamplesServices
Frontmatter
id15088
titleAdd runtime Bird View for resolved PR conversations
stateOpen
labels
enhancementaiarchitecturemodel-experience
assignees[]
createdAt12:02 PM
updatedAt12:54 PM
githubUrlhttps://github.com/neomjs/neo/issues/15088
authorneo-gpt
commentsCount2
parentIssue12679
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[ ] 14435 Temporal-pyramid L3–L5 dynamic synthesis path (weekly/monthly/quarterly)
blocking[]

Add runtime Bird View for resolved PR conversations

Open Backlog/active-chunk-5 enhancementaiarchitecturemodel-experience
neo-gpt
neo-gpt commented on 12:02 PM

Context

This restores the product shape that was accepted but never filed under Epic #12679.

On 2026-07-02, the operator separated two Bird Views: Memory Core sessions/memories by week/month, and pull-request conversation bodies by 3-day/week/month/quarter windows. Epic #12679 recorded the second source as Leaf D — GitHub-conversation temporal windows and the season owner accepted it as a distinct fourth leaf because its ingestion mechanics differ from Memory Core. On 2026-07-12, a fresh authority audit found that Leaf D was never created, while later work shipped a static Markdown handoff retrospective and a static HTML mock instead.

The operator has now restated the requirement at P0: Bird View is a runtime exploration tool, never a Markdown blob in sandman_handoff.md, and resolved pull-request history must remain separate from the Memory/session view.

Source record:

  • Epic #12679 — accepted Leaf-D comments IC_kwDODSospM8AAAABIezvDw and IC_kwDODSospM8AAAABIe0zJA.
  • Depends on #14435 — the still-open dynamic L3–L5 synthesis path and minimal Memory Core query entry.
  • Strategic parent Discussion #11375 — explicitly rejects dashboard/presentation-first work as a substitute for queryable synthesis.
  • Graduated history Discussion #11376 and ADR 0028 — L3–L5 are synthesized on demand, never durably materialized.

The Problem

There is no runtime operation that answers: “What happened across the resolved pull-request conversations in this window?”

The existing surfaces are insufficient:

  • list_pull_requests returns a bounded metadata list. It does not read review/comment reasoning or synthesize a window.
  • get_conversation({pr_number}) gives excellent one-PR drill-down, but reconstructing a week requires first discovering every resolved PR and then walking them N+1, with no coverage manifest or cross-PR synthesis.
  • The generated Handoff Retrospective is a parallel direct-read renderer, not the temporal pyramid. Its exact 2026-07-09 09:11Z → 2026-07-12 09:11Z window rendered 50 merged / 10 opened / 50 closed issues / 50 opened issues; bounded GitHub search returns 86 / 99 / 97 / 85. The readers hard-cap several classes at 50, and “opened PRs” means only PRs still open when synthesis runs.
  • The handoff session rows are metadata labels such as “session recorded”; no conversation or memory content is synthesized.

The missing capability is not another display. It is a source-complete, window-parameterized, cite-backed runtime query over resolved PR conversation bodies, with exact drill-down handles.

Architectural Step-Back / ungraduated-parent exception

#11375 intentionally remains open as a parent ontology rather than graduating as one epic. Filing is nevertheless valid because: (1) the operator made the runtime/separate-view call directly at P0; (2) graduated Discussion #11376 plus Epic #12679 already accepted Leaf D as an implementation leaf; and (3) the divergence matrix below preempts the remaining parent-level consumer ambiguity. If later #11375 children alter the broader current-state or future-planning dimensions, this ticket’s output vocabulary and consumer list may need amendment; the historical query-time/no-durable-write boundary remains governed by ADR 0028.

Option Evidence / falsifier Disposition
Static handoff or dashboard #11375 rejects presentation over unsynthesized data; current handoff totals are empirically capped/wrong Rejected
Compose list_pull_requests + N× get_conversation manually No exact window coverage, no synthesis, N+1 archaeology, bounded list semantics Rejected
One mixed PR + Memory/session digest tool Different source completeness, privacy, citation, and drill-down contracts; operator explicitly requires separate views Rejected
Separate runtime PR-history tool over the shared dynamic-synthesis path Matches the accepted Leaf-D disposition and preserves source-specific truth Selected

The Architectural Reality

  • GitHub Workflow owns PR ingestion and one-PR drill-down. PullRequestSyncer.mjs writes active and release-bucketed archived PR Markdown containing body/reviews/conversation content; resources/content/_index.json addresses the repo corpus.
  • The corpus currently spans both resources/content/pulls/ and resources/content/archive/pulls/; a window reader that scans only the active directory is incomplete by construction.
  • PullRequestService.getConversation() is the existing surgical drill-down authority. The new overview must cite PR numbers/comment or review IDs so callers can continue through that tool rather than embedding every conversation in one response.
  • #14435 owns the reusable dynamic window-synthesis path. This leaf adds a distinct GitHub PR-conversation source adapter and a separate MCP operation; it must not clone the synthesis algorithm or merge Memory/session records into the same response.
  • ADR 0028 §2.2 forbids durable L3–L5 output. Every Bird View is generated on demand from source artifacts and L1/L2 facts.
  • PR sync completeness is part of the truth boundary. The source adapter must prove conversation exhaustion or report an incomplete/degraded envelope; cap equality and silent truncation are forbidden.

Structural pre-flight

Future ai/services/github-workflow/PullRequestHistoryService.mjs is a structural fast-path sibling of PullRequestService.mjs in ai/services/github-workflow/: same GitHub-corpus service role, no novel directory. Memory-side synthesis stays in #14435’s ai/services/memory-core/ lane. OpenAPI/dispatch changes remain in the existing MCP server files. No ArchitectureOverview map update is required.

The Fix

One coherent PR:

  1. Add a GitHub PR-history source service that selects all resolved PRs in a half-open [windowStart, windowEnd) interval across active + archived synced content. Resolution semantics are explicit: merged, closed_unmerged, or all_resolved; ordering uses mergedAt/closedAt, never creation time.
  2. Prove source completeness. Exhaust PR review/comment connections during sync or persist a structured incompleteness signal; the reader fails closed/degraded when any selected conversation is legacy-unknown or truncated.
  3. Feed the selected conversation bodies into the dynamic synthesis path from #14435. No higher-tier document is persisted.
  4. Expose a distinct read-only MCP operation, provisionally explore_pull_request_history, with arbitrary (windowStart, windowEnd) plus presets daily, 3-day, weekly, monthly, quarterly, and release (cut-to-cut). Naming can refine during intake, but the operation must remain distinct from the Memory/session tool.
  5. Return a structured Bird View: window semantics, exact coverage/exhaustion, source-manifest hash, narrative/themes/decisions/friction/outcomes, cite-backed notable events, and PR/comment/review drill-down handles. Stamp notAuthority: true and generated-at/source provenance.
  6. Bound response density without hiding coverage: the narrative may be concise, but coverage.totalResolved, inclusion/exclusion counts, truncation state, and citations remain explicit.

Contract Ledger Matrix

Target Surface Source of Authority Proposed Behavior Fallback Docs Evidence
New explore_pull_request_history MCP operation Epic #12679 Leaf D + operator P0 correction Query-time resolved-PR conversation Bird View for one arbitrary/preset window; separate from Memory/session history Invalid window rejects; incomplete source returns explicit degraded envelope, never partial-as-complete GitHub Workflow or Memory Core OpenAPI (final facade chosen at intake) + JSDoc OpenAPI contract test + exact tool invocation
New PullRequestHistoryService source adapter PullRequestSyncer corpus ownership + ADR 0028 §2.2 Select every terminal PR across active/archive by half-open resolution event time and emit a source manifest Missing/unproven conversation completeness fails closed Class/method JSDoc >50-PR window, archive+active, boundary-time, closed-unmerged fixtures
Existing PullRequestService.getConversation() drill-down ai/services/github-workflow/PullRequestService.mjs + GitHub Workflow OpenAPI Bird View citations expose PR/comment/review identifiers consumable by the existing one-PR tool Missing cited node is surfaced as source drift Cross-link in operation description Citation-to-drilldown integration spec
Dynamic synthesis path #14435 + ADR 0028 §2.2/§2.5 Synthesize on demand; cite named PR sources; write nothing above L2 Inference unavailable returns source manifest + deterministic coverage, clearly unsynthesized Service JSDoc + OpenAPI no-write assertion + degraded-inference test
Coverage/provenance envelope #11375 DerivedSignalContract + operator truthfulness correction {window, resolution, coverage, sourceManifestHash, generatedAt, citations, notAuthority:true} accompanies every answer No confident narrative without complete coverage Schema/OpenAPI schema + partial-source falsifiers

Decision Record impact

aligned-with ADR 0028; depends-on #14435; implements the accepted Leaf-D disposition under #12679. It does not amend the durable/dynamic tier boundary.

Decision Record

Required authority: ADR 0028 + Epic #12679. Strategic parent #11375 remains open by design.

Discussion Criteria Mapping

Upstream criterion This ticket
Queryable synthesis, not dashboard polish (#11375) New runtime MCP operation; Markdown/UI excluded
Historical L3–L5 dynamic, no photocopy cascade (#11376 / ADR 0028) Query-time synthesis; explicit no-write AC
GitHub conversations as distinct source (Epic #12679 Leaf D) Source-specific PR adapter + separate operation
Arbitrary windows and PR conversation content (operator July-2026 seeds) Parameterized windows/presets + full conversation reasoning
Cite-backed, confidence/provenance, not authority Structured coverage/manifests/citations + notAuthority:true

Acceptance Criteria

  • A read-only runtime tool explores resolved PR conversations separately from Memory/session history.
  • Arbitrary (windowStart, windowEnd) and daily / 3-day / weekly / monthly / quarterly / release presets resolve through one path.
  • Window inclusion is half-open and resolution-event based; merged, closed-unmerged, and all-resolved filters are explicit.
  • Active and archived PR corpora are both covered; >50 selected PRs neither truncate nor masquerade as a complete answer.
  • Conversation review/comment exhaustion is proven; unknown/incomplete artifacts return a degraded envelope, never numeric zero or partial-as-complete synthesis.
  • Output includes exact coverage, source manifest/hash, generated timestamp, concise narrative/themes/decisions/friction/outcomes, and drill-down citations.
  • Every mutable/derived claim is cite-backed and stamped notAuthority:true.
  • Existing get_conversation({pr_number}) can drill into every cited PR; comment/review IDs are preserved when the synthesis cites a specific exchange.
  • No L3–L5 result is written to Chroma, SQLite, Markdown, handoff, or another cache.
  • Inference failure preserves deterministic source/coverage evidence and clearly marks narrative synthesis unavailable.
  • Focused tests include >50 PRs, active+archive union, exact boundaries, closed-unmerged semantics, release windows, incomplete conversations, no-write behavior, and citation drill-down.
  • Cross-family review challenges the exact tool contract and source-completeness proof before merge.

Out of Scope

  • Memory/session Bird View (owned separately by #14435).
  • Handoff Markdown, Fleet Manager cockpit, dashboard, HTML mock, or other presentation surfaces.
  • Issues/Discussion conversation Bird Views; this P0 slice is resolved pull requests. They may extend the source family later without changing this tool’s PR-specific semantics.
  • Current-state strategy, future counterfactual planning, ranking, or automatic lane selection.
  • Durable weekly/monthly/quarterly narrative summaries.

Avoided Traps

  • No reuse of the static Handoff Retrospective as authority.
  • No 50-item live API cap presented as a total.
  • No “opened PR” proxy for resolved-window membership.
  • No counts-only answer to a “WHAT happened?” question.
  • No mixed PR + private Memory/session payload.
  • No UI-first implementation before the tool contract exists.

Related

Parent: #12679
Depends on: #14435
Strategic parent: #11375
Graduated history source: #11376
Wrong-shape artifacts: #14603, #14706, #14680, PR #15085
Existing drill-down: get_conversation({pr_number})

Live duplicate sweep: latest 20 open issues, targeted open-title searches, Knowledge Base tickets, active+archived local issues/Discussions, and last 30 all-state A2A messages checked at 2026-07-12T09:59:43.552Z; no equivalent ticket or competing in-flight claim found. #14620 is a Fleet UI consumer, and #14435 is the separate Memory/session source.

Origin Session ID: 837ad74b-c2d2-413d-9aab-b7165a93a82a

Retrieval Hint: "P0 Bird View resolved PR conversation runtime tool Leaf D #12679 #14435 static handoff authority correction"