LearnNewsExamplesServices
Frontmatter
id14721
titleRetrospective enrichment readers: issues, graduations, sessions join the live handoff window
stateClosed
labels
enhancementai
assigneesneo-fable
createdAt10:46 AM
updatedAt3:42 PM
githubUrlhttps://github.com/neomjs/neo/issues/14721
authorneo-fable
commentsCount3
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAt3:42 PM

Retrospective enrichment readers: issues, graduations, sessions join the live handoff window

Closed Backlog/active-chunk-3 enhancementai
neo-fable
neo-fable commented on 10:46 AM

Context

Follow-up leaf split from #14706 (the assembler + wiring, PR #14709) at PR-authoring time — the same ship-the-spine/name-the-enrichment discipline as the render/assembler split. The live retrospective section currently folds the two highest-signal, zero-new-query fact classes (merged PRs via a bounded gh query; opened PRs free from the in-hand open-PR list). The assembler and render already support all six classes — adding one is a bounded READER, zero assembler/render change.

The Fix

Three bounded readers feeding assembleRetrospectiveStats' existing fact contract ({ref, headline, at} arrays):

  • Closed/opened issues in-window — a bounded gh issue list --search pair (closed:>= / created:>=), same day-granularity pattern as fetchRecentMergedPRs.
  • Graduations in-window — detect [GRADUATED_TO_TICKET|EPIC]-class markers on recently-closed Discussions (bounded search; the marker vocabulary is the recorded graduation convention).
  • Sessions in-window — count from the summary collection already in scope at the call site (the synthesizer holds summaryColl); a count + latest-N refs, no new storage surface.

Each reader is best-effort inside the existing try/caught enrichment block; a failing reader drops its class (counts stay honest at 0 for that class under the declared filter set — extend the filterSets label as classes join, so the render never overstates coverage).

Acceptance Criteria

  • The three readers land behind the existing call-site seam; filterSets label extends with each class (the declared-coverage honesty rule).
  • Out-of-window and undateable facts excluded (the assembler already enforces; the readers must pass at through).
  • Synthesizer integration test extended: all wired classes appear with correct counts; the route-parser firewall still holds.
  • Reader failure = class dropped + warn, never a crashed handoff (the enrichment-block contract).

Out of Scope

New aggregation substrate (the temporal-pyramid orbit) · per-reader pagination beyond the bounded windows · monthly/per-release grains (on-demand path).

Related

#14706 / PR #14709 (the spine this enriches — split recorded there) · #14603 (the render + stats contract) · #11375 (the operator seed) · #14560 T7.26 (the cockpit consumer of the same assembler).

Claimable — bounded, well-specified, non-fable-suitable; I take it only if unclaimed when my queue clears.

Origin Session ID: b9b95ac6-42f5-47a3-b58f-6071f79657e8 Retrieval Hint: "retrospective enrichment readers issues graduations sessions window fact classes filter label"

tobiu referenced in commit fccec61 - "feat(ai): retrospective enrichment — issues + sessions join the coverage label (#14721) (#14739) on 3:42 PM
tobiu closed this issue on 3:42 PM