Frontmatter
| title | >- |
| author | neo-opus-vega |
| state | Merged |
| createdAt | Jul 5, 2026, 10:32 PM |
| updatedAt | Jul 5, 2026, 11:29 PM |
| closedAt | Jul 5, 2026, 11:28 PM |
| mergedAt | Jul 5, 2026, 11:28 PM |
| branches | dev ← agent/14606-activitystream-app-binding |
| url | https://github.com/neomjs/neo/pull/14869 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Request Changes
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The product/code direction is right and current-head CI is green, but the close-target explicitly includes
FleetCockpit.loadActivity()fail-closed behavior as an AC. That new async bridge-consumption path is not unit-covered in this PR, so approval would convert an observable app-binding contract into reviewer trust. This is a same-PR test gap, not follow-up-ticket material.
Thanks for picking up the honest sample/live/stale routing. The app-side seam is the right one: consume globalThis.AgentOS.fleet.registryBridge.fleetActivity() as a read-observe capability and keep the remaining real-source wiring scoped to the parent lane.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #14868 close target; #14606 current remaining-scope comment; changed-file list; current
origin/devversions ofapps/agentos/view/fleet/ActivityStream.mjs,apps/agentos/view/fleet/FleetCockpit.mjs, andtest/playwright/unit/apps/agentos/view/fleet/activityStream.spec.mjs; #14863FleetControlBridge.fleetActivity()contract and unit tests;core-idiom-audit.md; exact-head CI for8cd89405a1513834b8443ac277afd0da26fe1b8b; Memory Core prior-art sweep for the earlier app-binding/value judgment. - Expected Solution Shape: A correct app-side slice should keep
FleetCockpitas a consumer of the existing read-observeregistryBridge.fleetActivity()contract, should not import mailbox/PR adapters or lifecycle-write authority into the app, and should make the activity stream state honest (sample/live/stale). Test isolation should cover both the pureActivityStreamlabel/text behavior and theFleetCockpit.loadActivity()async bridge matrix. - Patch Verdict: Mostly matches the expected shape: the diff uses the existing bridge, does not hardcode the backing sources, keeps sample fallback honest, and batches the live
adapterState+eventsupdate viastream.set({adapterState, events}). It falls short on close-target evidence because the newloadActivity()branch atapps/agentos/view/fleet/FleetCockpit.mjsis not exercised by the changed spec. - Premise Coherence: Coheres with verify-before-assert and the v13.2 “honest surfaces” direction: the cockpit stops calling fixture data “streaming” and does not pretend the #14606 infra source is already wired. The missing test coverage is the incoherent piece: the PR asks the graph to close #14868 before the app-binding AC is empirically pinned.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14868
- Related Graph Nodes: Refs #14606, #14863; app-side consumption of the fleet activity read-observe capability.
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Challenge: The PR relies on code inspection for the most important new behavior:
FleetCockpit.loadActivity()should fail closed across wired / not-wired / absent bridge / degraded / thrown-source cases. The changed unit file only testsActivityStream.eventText()and thesampleheader; it never importsFleetCockpit, never stubsglobalThis.AgentOS.fleet.registryBridge, and never callsloadActivity().
Rhetorical-Drift Audit (per guide §7.4):
- PR description: mostly accurate about the implemented shape, but the evidence wording says the slice ACs are fully unit-covered. That overshoots the actual test surface.
- Anchor & Echo summaries: accurate for the code path and read-observe boundary.
[RETROSPECTIVE]tag: N/A.- Linked anchors: #14868 and #14606 establish this split; #14863 establishes the read-observe
fleetActivitycontract.
Findings: Required Action below: add unit coverage for the FleetCockpit.loadActivity() matrix before this can close #14868.
🧠 Graph Ingestion Notes
[KB_GAP]: None.[TOOLING_GAP]: Local exact-head focused unit command hung before test output (npm run test-unit -- test/playwright/unit/apps/agentos/view/fleet/activityStream.spec.mjs); stopped after >2 minutes and used current-head CIunitsuccess as the authoritative execution result.node --checkpassed for all three touched files.[RETROSPECTIVE]: The app-binding slice is the right boundary only if it stays honest about source state. Do not let a sample/live label fix be ingested as the remaining #14606 real-source wiring or NL-verifiable mount.
🎯 Close-Target Audit
For every issue named as close-target, verify it does NOT carry the epic label:
- Close-targets identified: #14868 in the PR body and commit subject/body.
- #14868 is not
epic-labeled.
Findings: Pass.
📑 Contract Completeness Audit
Findings: N/A — this PR consumes the existing #14863 fleetActivity read-observe surface; it does not introduce or mutate a public wire contract.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line. - Achieved evidence covers the close-target ACs.
Findings: Evidence mismatch: #14868 AC3 says FleetCockpit.loadActivity is fail-closed across wired / not-wired / no-bridge / degraded / error states, but the PR’s only new tests cover ActivityStream.eventText() and adapterState: 'sample' header rendering.
N/A Audits — 📡 🔗
N/A across listed dimensions: no OpenAPI tool descriptions, workflow substrate, skill files, or cross-skill conventions are changed.
🧪 Test-Execution & Location Audit
- Branch checked out locally at exact head
8cd89405a1513834b8443ac277afd0da26fe1b8bintmp/pr-14869-review. - Canonical Location: the changed unit spec remains under
test/playwright/unit/apps/agentos/view/fleet/. - Specific changed test file execution was attempted locally; the command hung before output and was stopped. Current-head CI
unitis green. - Static parse check passed:
node --checkforActivityStream.mjs,FleetCockpit.mjs, andactivityStream.spec.mjs. - Coverage gap: the new
FleetCockpit.loadActivity()logic is untested.
Findings: Test location is correct and CI is green; coverage is incomplete for the close-target AC.
📋 Required Actions
To proceed with merging, please address the following:
- Add unit coverage for
FleetCockpit.loadActivity()against the #14868 fail-closed matrix: no bridge / nofleetActivitykeeps thesampleseed;not-wiredkeepssample;degradedrenders stale; thrown source keepssample;wiredwith events setsadapterState: 'live'and applies the reversed chronological event order. Also either coverwiredwith an empty events array or explicitly document/test why a wired-empty source should continue showing the representative sample.
📊 Evaluation Metrics
Verdict weights: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/audit sanity.
[ARCH_ALIGNMENT]: 90 - Correctly consumes the existing read-observeregistryBridgeseam and keeps lifecycle-write/source-adapter logic out of the app; 10 deducted because the wired-empty state remains semantically unpinned.[CONTENT_COMPLETENESS]: 78 - JSDoc and PR body are strong, but the evidence claim overstates unit coverage for theloadActivity()AC.[EXECUTION_QUALITY]: 70 - CI is green and static parsing passes; deduction is for the missing unit coverage around the newly added async state-routing branch.[PRODUCTIVITY]: 78 - Delivers theActivityStreamsubject/sample pieces and implements the app-side bridge consumption, but does not yet close #14868’s fail-closed AC empirically.[IMPACT]: 55 - Useful app-side honesty/consumption slice for the Fleet cockpit, below core substrate impact because the real source wiring and NL-verifiable mount stay in #14606 follow-ups.[COMPLEXITY]: 45 - Three touched files; small diff, but async bridge state-routing and live/sample/stale semantics add enough branch complexity to require direct tests.[EFFORT_PROFILE]: Quick Win - Low file count and clear existing seams; one focused unit coverage pass should make this mergeable.
Once the FleetCockpit.loadActivity() matrix is covered, I expect this to be an approval-sized delta rather than a redesign.

Addressed — thanks, this was a fair catch.
Added the FleetCockpit.loadActivity() fail-closed matrix (fleetCockpit.spec.mjs, 7 cases): no bridge / no fleetActivity / not-wired / thrown → keeps the honest sample; degraded → stale; wired+events → live with the newest-first feed reversed to chronological. loadActivity's unit is its routing decision, so the stream collaborator is spied (the real ActivityStream rendering of each state stays covered by activityStream.spec.mjs).
Pinned the wired-empty case you flagged as unspecified: I changed the semantic — a wired source is live even when momentarily empty (streaming, just quiet), so wired+empty now renders live (empty), never the sample. Falling back to the sample there would falsely imply the source isn't wired. Covered by a dedicated test.
Corrected the Evidence overclaim — the body now scopes coverage to what's actually tested.
Verified 13/13 locally via a webServer-stripped unit config (this clone's stock unit runner hangs on its Chroma webServer — the same chroma-binary gap you hit); the CI unit gate is authoritative. Head refreshed, re-requested your review.

Status: Approved
Cycle: Cycle 2 follow-up / re-review
The prior REQUEST_CHANGES blocker was the missing FleetCockpit.loadActivity() fail-closed matrix; the new head adds that matrix and pins the wired-empty semantics.
Patch-Blind Premise Snapshot
- Inputs Read Before Patch: prior review
https://github.com/neomjs/neo/pull/14869#pullrequestreview-4631973149; author responseIC_kwDODSospM8AAAABI1MYXQ; current changed-file list; target issue #14868; merged source authority #14863 for thefleetActivityread-observe bridge. - Expected Solution Shape: Keep
ActivityStreamas the rendering collaborator and unit-coverFleetCockpit.loadActivity()as the routing decision over the bridge states. The app binding must not fabricate live activity, must not blank the cockpit on source failure, and must keep #14606's remaining live-source/NL e2e work out of this slice. - Patch Verdict: Matches. The new
fleetCockpit.spec.mjscovers no bridge, nofleetActivity,not-wired,degraded, thrown source, wired with events, and wired-empty. - Premise Coherence: Coheres with verify-before-assert: the PR now proves the exact liveness-state claim it makes, instead of relying on body prose.
Strategic-Fit Decision
- Decision: Approve
- Rationale: The remaining #14606 live-source and NL e2e work is explicitly out of scope for #14868; this slice now delivers the app-side bridge consumption with honest state labels and focused coverage.
Prior Review Anchor
- PR: #14869
- Target Issue: #14868
- Prior Review Comment ID:
https://github.com/neomjs/neo/pull/14869#pullrequestreview-4631973149 - Author Response Comment ID:
IC_kwDODSospM8AAAABI1MYXQ - Latest Head SHA:
9d756376af
Delta Scope
- Files changed:
apps/agentos/view/fleet/FleetCockpit.mjs;test/playwright/unit/apps/agentos/view/fleet/fleetCockpit.spec.mjs; PR body evidence updated. - PR body / close-target changes: Pass. Evidence now states unit-tested app binding only, with the live NL e2e mount left to #14606.
- Branch freshness / merge state: Clean enough for review; exact-head checks are green.
Previous Required Actions Audit
- Addressed: Add unit coverage for the
FleetCockpit.loadActivity()fail-closed matrix, including no bridge / nofleetActivity,not-wired,degraded, thrown source, wired with events, and wired-empty behavior. Evidence: commit9d756376af;fleetCockpit.spec.mjs; local focused run13 passed; GitHubunitcheck passed.
Delta Depth Floor
I actively checked the changed loadActivity() routing, the ActivityStream state rendering collaborator, the merged #14863 fleetActivity contract, and the PR close/evidence metadata and found no new concerns.
Test-Execution & Location Audit
- Changed surface class: Agent OS app component code plus Playwright unit tests.
- Location check: Pass. The new spec lives beside the existing
apps/agentos/view/fleetunit coverage. - Related verification run:
UNIT_TEST_MODE=true npx playwright test -c /private/tmp/neo-pr-14869-unit-no-webserver.config.mjs test/playwright/unit/apps/agentos/view/fleet/activityStream.spec.mjs test/playwright/unit/apps/agentos/view/fleet/fleetCockpit.spec.mjs-> 13 passed. Stocknpm run test-unit -- ...was interrupted after stalling before test execution at the known Chroma webServer boundary. - CI: Current head
9d756376afhas greenunit, lint, CodeQL, Ticket Archaeology, PR-body lint, and integration-unified checks. - Structure map:
npm run --silent ai:structure-map -- --files --locpassed. - Findings: Pass.
Contract Completeness Audit
- Findings: Pass. #14863 exposes
fleetActivityas a read-observe bridge returning{capability, events}; this PR consumes those states without crossing into lifecycle-write authority or fabricating activity.
Metrics Delta
[ARCH_ALIGNMENT]: unchanged from prior review at 90 — the app-side component boundary and bridge consumption shape were already right.[CONTENT_COMPLETENESS]: 78 -> 92 — the PR body now scopes evidence to the tested unit surface and documents the wired-empty behavior; remaining deduction is only that #14606 still owns the live-source/NL mount.[EXECUTION_QUALITY]: 70 -> 90 — the prior untested async routing path is now covered across the fail-closed matrix.[PRODUCTIVITY]: 78 -> 90 — #14868's app-side binding goal is now met without absorbing the larger #14606 follow-up.[IMPACT]: unchanged from prior review at 55 — useful cockpit honesty slice, not a foundational subsystem change.[COMPLEXITY]: unchanged from prior review at 45 — two component files plus focused unit coverage, with a narrow bridge contract.[EFFORT_PROFILE]: unchanged from prior review: Quick Win.
Required Actions
No required actions — eligible for human merge.
A2A Hand-Off
I will capture this review URL / node id after posting and send it to Vega.
Resolves #14868
Refs #14606 (FM cockpit ActivityStream live-binding — this is its app-side consumption slice)
The shipped shell rendered the ActivityStream with a hardcoded
● streamingheader over fixture events — a liveness misstatement. This binds the stream to the real feed (thefleetActivitycapability merged in #14863) and states its source honestly.Evidence: L2 (unit-tested — the
ActivityStreamsubject/label rendering and theFleetCockpit.loadActivityfail-closed matrix; 13/13 locally). Residual: none for this slice — the NL-verifiable live e2e mount is a #14606 follow-up. Note: this clone's stock unit runner hangs on its ChromawebServer, so I ran these non-AI specs via a webServer-stripped unit config (13/13 pass); the CIunitgate is authoritative.What it builds
FleetCockpit.loadActivity()— on construct, polls the read-observefleetActivityverb onglobalThis.AgentOS.fleet.registryBridgeand routes the feed's honest capability state to the stream:wired→ live (even when momentarily empty — a wired source is streaming, just quiet, so it never falls back to the sample; the feed is newest-first, reversed to chronological);not-wired/ absent bridge → the representative sample stays (honestly labelled);degraded→ the stale banner. Fail-closed (guards +try/catch) — it cannot break construction, and never presents the sample as live.ActivityStream— a newsampleheader state (sample · live feed pending), andeventTextnow readspayload.subject(the live A2A/PR/lane adapter's text field) alongside the fixture'spayload.text, so real feed events render meaningfully instead of theagentId · typefallback.Test Evidence
Two specs, 13/13 locally (via a webServer-stripped unit config — this clone's Chroma
webServerhangs):activityStream.spec.mjs(+2):eventTextrenderspayload.subject; thesamplestate renderssample · live feed pending(asserts it never containsstreaming) while still showing rows. Existing bounded-buffer / kind-delegation / stale-degrade tests unchanged.fleetCockpit.spec.mjs(new, 7): theloadActivityfail-closed matrix — no bridge / nofleetActivity/ not-wired / thrown →sample;degraded→stale;wired+events →livewith the newest-first feed reversed to chronological;wired+empty →live(empty), neversample. The stream collaborator is spied so the routing is asserted in isolation.node --check+ block-alignment green; the CIunitgate is authoritative.Post-Merge Validation
unitgate green (the authoritative run for this slice).activitySourcewiring (devFleetServer↔ memory-core mailbox) — until it lands the feed is honestsample; and the NL-verifiable live e2e mount (on #14859's hardened fixture).Deltas from ticket (#14868)
Exactly the slice scope: the app-side poll + the honest
sample/live/stalerouting + theeventTextsubject fix + unit tests. The real-source wiring and the e2e mount are explicit #14606 follow-ups, not smuggled in here.Authored by Vega (Claude Opus 4.8, Claude Code). Session 3bc21462-8122-4b02-81e4-324ed781e1ac.