LearnNewsExamplesServices
Frontmatter
id14831
titleFM cockpit ActivityStream component slice — bounded buffer + fold + kind-delegation + honest degrade (unit-provable)
stateClosed
labels
enhancementdeveloper-experienceai
assignees[]
createdAt7:00 AM
updatedAt7:39 AM
githubUrlhttps://github.com/neomjs/neo/issues/14831
authorneo-opus-vega
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAt7:39 AM

FM cockpit ActivityStream component slice — bounded buffer + fold + kind-delegation + honest degrade (unit-provable)

Closed Backlog/active-chunk-4 enhancementdeveloper-experienceai
neo-opus-vega
neo-opus-vega commented on 7:00 AM

Context

T3.11 sub-slice of Epic #14560, extracted from #14606 during PR #14827's cross-family review (@neo-gpt). #14606 bundled a unit-provable component with host-gated live wiring. V-B-A confirmed the split is real, not cosmetic: no cockpit host view exists yet (apps/agentos/view/fleet/ is all leaf components — no container mounting them), and the activity adapters are server-side services (ai/services/fleet/fleetA2AActivityAdapter.mjs, fleetPrLaneActivityAdapter.mjs), not client stores the component binds to directly. So #14606's live-binding + NL-mount ACs are structurally blocked on a host that isn't built. This leaf is the component half — unit-provable in isolation, no host required.

Scope (delivered by PR #14827)

apps/agentos/view/fleet/ActivityStream.mjs:

  • boundActivity(events, maxVisible) — the pure backpressure core (newest maxVisible, newest-first, folded overflowCount); unit-provable in isolation.
  • The component (extends Container) — liveness header, bounded event rows (time · kind chip · text), "N more" fold; rebuilt bounded on every events change so the rendered child count never exceeds the window.
  • Kind rendering delegates entirely to #14594 EventChip (zero local kind logic; unknown → neutral).
  • Honest degrade — adapterState: 'stale' renders a stale header, never a blanked/frozen feed (component-level, config-driven).
  • .fm-activity-stream CSS anatomy (token-only, per the cockpit-plan stream).

Acceptance Criteria

  • Buffer bound holds under a fixture burst ≥ 100 events (no unbounded DOM growth; "N more" fold renders).
  • Kind rendering delegates entirely to #14594 (zero local kind logic; unknown → neutral).
  • Adapter-loss renders the stale state at the component level (config-driven adapterState, not the live adapter).
  • Unit specs (custom playwright config) green.

Out of Scope (remain OPEN on #14606)

  • Live binding to the #14572/#14573 activity adapters.
  • NL-verifiable live mount.
  • Burst e2e (T3.13).

All three are gated on the cockpit host view (not yet built); tracked on #14606, which stays open.

Related

Epic #14560 (parent) · extracted-from #14606 (stays open for binding/mount) · composes #14594 (EventChip) · #14592 (density numbers) · delivered by PR #14827.

Live latest-open sweep this turn (newest #14830); no equivalent component-slice ticket exists.

Origin Session ID: 3bc21462-8122-4b02-81e4-324ed781e1ac (@neo-opus-vega · Opus 4.8)

tobiu closed this issue on 7:39 AM