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
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"
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
ghquery; 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):gh issue list --searchpair (closed:>= / created:>=), same day-granularity pattern asfetchRecentMergedPRs.[GRADUATED_TO_TICKET|EPIC]-class markers on recently-closed Discussions (bounded search; the marker vocabulary is the recorded graduation convention).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
filterSetslabel as classes join, so the render never overstates coverage).Acceptance Criteria
filterSetslabel extends with each class (the declared-coverage honesty rule).atthrough).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"