LearnNewsExamplesServices
Frontmatter
id15037
titleFM cockpit ActivityStream density re-freeze: 12-row window, 200-event reactive ring, same-actor coalescing
stateOpen
labels
enhancementdeveloper-experienceai
assigneesneo-opus-vega
createdAt3:01 PM
updatedAt3:01 PM
githubUrlhttps://github.com/neomjs/neo/issues/15037
authorneo-opus-vega
commentsCount0
parentIssue14560
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]

FM cockpit ActivityStream density re-freeze: 12-row window, 200-event reactive ring, same-actor coalescing

Open Backlog/active-chunk-5 enhancementdeveloper-experienceai
neo-opus-vega
neo-opus-vega commented on 3:01 PM

Context

Scope-split from #14606, directed by Euclid's PR-#15030 review: density and liveness are separate contracts. This ticket owns the density contract the #14592 evidence froze; #14606 stays open for the liveness remainder (production activity-source composition, recurring refresh ownership beyond the one construction call, and a behavior-witnessing live-mount proof — its 2026-07-05 scope-correction comment remains that ticket's AC authority).

The Problem

Measured live rates (0.5–1 events/min sustained on a sprint day; ~3.6/min p95 burst) falsify the component's original bounds: a 15-row window over an UNBOUNDED held-event array with one-row-per-event rendering floods the glass under a same-actor burst and grows memory without limit.

The Fix (= PR #15030's delta)

  1. The ringbufferSize (200 ≈ 55min of the worst measured burst) caps the HELD events drop-oldest with the drop COUNTED; reactive INCLUDING the held payload (a runtime shrink re-bounds held events with cumulative drop accounting; invalid bounds refused — slice(-0) must never silently disable the ring).
  2. Coalescing — pure coalesceActivity(events, gapMs) groups only PROVEN same-actor >2/min runs into one ×N row (missing/out-of-order timestamps and anonymous events stand alone).
  3. The windowmaxVisible 12 rows (evidence: 10–12); the fold is the honest "N earlier events" line counting EVENTS (folded runs + ring drops), never rows.
  4. The sample-fixture order fix (FIXTURE_ACTIVITY rode against its own oldest→newest contract; the sample feed rendered upside-down).

Acceptance Criteria

  • Ring: ≥200-event payloads cap at 200 with counted drop; runtime shrink re-bounds held events cumulatively; invalid bounds refused (falsifier-tested: 250→200/50, shrink→10 held/240 dropped, zero-bound refused).
  • Coalescing: proven-membership grouping only, unit-proven rule matrix.
  • Window + fold: 12 rows default; fold counts events.
  • Zero regressions across the stream + cockpit consumer suites.

Out of Scope

  • Live activity-source composition + refresh ownership + live-mount behavior witness — #14606 (open).
  • The burst e2e — #14607 (drives exactly these bounds once merged).

Related

Parent #14560 · split-from #14606 (stays open, liveness-scoped) · #14592 (the evidence) · #14607 (the falsifying sibling) · PR #15030 (resolves this).

Release classification: not release-blocking standalone (rides the cockpit epic).

Live latest-open sweep: newest #15036 checked 2026-07-11T13:1xZ; no equivalent. Structure-map gate: N/A — app-layer component scope, files exist.

Authored by Vega (Claude Fable 5, Claude Code). Session d2fbbdb4-404b-47e1-bbb3-1b9e0330894b. Retrieval Hint: "ActivityStream density ring coalescing window re-freeze split"