Conversation
Count armed background monitors as workspace activity while preserving the completed-report fence against stale live hints. Show Monitoring for settled rows with armed monitors and cover live desktop/mobile transitions. --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `coder:openai/gpt-6-astra` • Thinking: `high` • Cost: `$115.79`_ <!-- mux-attribution: model=coder:openai/gpt-6-astra thinking=high costs=115.79 -->
Comment-only pass over the composer-tray layer of #4327: shorten the hint and snapshot-encoding docblocks to the non-obvious rationale, drop two comments that restated the code or a test assertion, reword the registration race note, and remove change narration from the story. --- _Generated with `xum` • Model: `coder:anthropic/claude-fable-5-1` • Thinking: `xhigh`_ <!-- mux-attribution: model=coder:anthropic/claude-fable-5-1 thinking=xhigh --> Signed-off-by: Thomas Kosiewski <tk@coder.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Desktop and phone evidenceMock-driven full-app Storybook UAT on The recordings include setup/reset and debugger-paced steps. The verified continuous forward sequence shows Monitoring → Completed/inactive → Monitoring without replacing the tray node. Phone evidence uses the pinned 375px Storybook manager viewport with the drawer closed. This is renderer/store evidence, not backend monitor or real-provider UAT. RecordingsDesktop recording R3-desktop-continuous.webm375px phone recording R3-phone-continuous.webmGenerated with |
Blocked after merge-queue validationNeither this PR nor foundation #4338 landed. Both remain open and are outside the queue. The source heads remain
The E2E case passed three isolated source-head runs before queue admission. The newly failed unit case also passed locally on the current source head (1 test, 7 assertions, pinned Bun 1.3.5). These passes do not validate the failed integration tree or establish a CI cause. Neither failing test was changed by this stack. Decision: pause as incomplete. No speculative source edits, further reruns, re-enqueue, direct merge, or gate bypass. The final advisory remains valid for the unchanged code; the advisor recommends a separately scoped investigation of these integration failures before another guarded queue attempt. This is a convergence/scope checkpoint, not exhaustion of the six-review limit. Observed reviews: one code/security pair per PR and one final independent pass; the foundation may also have overlapping automatic startup activity, conservatively within five combined assessments. No findings-driven revision rounds occurred. Follow-up owner: the assigned implementer. Trigger: authorization to continue the CI investigation. Logs, tested integration identities, and local reproduction receipts are preserved. Required merge admission checks remain failed; delivery is not complete. Generated with |
Landed through the merge queue
Both landed as linear squash commits on Record
Generated with |
…orts (coder#4472) ## Summary Deletes browser production code that only tests still called, and moves the tests that guarded live behavior onto the live code path. Part of the test-audit follow-up campaign (frontend area, WS7). ## What was removed | Removed | Why it was dead | What happened to its tests | | --- | --- | --- | | `StatsTab` component + its test-only `_snapshot`/`_clearStats` props and `useStatsData` overrides | No production caller since coder#2729 moved the Stats tab to `StatsContainer` (`TimingPanel` + `ModelBreakdownPanel`) | `StatsTab.clear.test.tsx` replaced by `TimingPanel.clear.test.tsx`, which drives the live path: real `WorkspaceStore` stats subscription + `APIProvider` client whose `workspace.stats.clear` rejects | | `compareRecords`, `compareArrays` (`useStableReference.ts`) | Only `compareMaps` is used (`App.tsx`) | 12 comparator tests deleted; stale "tested manually via useUnreadTracking…" comments fixed | | `closeSplit` (`rightSidebarLayout.ts`) | Never called in production since coder#1340 | Test deleted | | `isActionableTaskExecutionStatus` | Last caller removed in coder#4341 | No tests | | `shouldRefreshInlineSkillSuggestions` | coder#4013 made inline suggestions synchronously derived, so there is no refresh gate | Tests deleted | | `getAnthropicThinkingDisableReason` + `hasAnthropicThinkingSignature` | coder#1450 stopped disabling Anthropic thinking | Tests deleted; the one transform test that used it as an oracle now asserts the preserved signature directly | | `useProjectGitStatuses` (`GitStatusStore.ts`) | No production caller | None in CI | | `buildReviewDiffPathFilter`, `normalizeReviewPanelAssistedHunks` (test-only wrappers in `ReviewPanel.tsx`) | Production calls `buildReviewDiffPathFilterSpecs` / `getReviewPanelPathContext` + `normalizeAssistedReviewHunks` directly | Tests retargeted to those production functions (`getReviewPanelPathContext` is now exported) | | `computeTaskAwaitPollGroupInfos` (test-only wrapper) | ChatPane calls `computeOperationalBundleInfos({ taskAwaitPollsOnly })` | Tests use a local fixture helper around the production function | | 2 `/fork` cases in `parser.test.ts` | Same contract and name as `fork.test.ts` | Deleted | Retained on purpose (test reset seams, not dead code): `__resetForTests` (highlight worker), `resetAiSelectionIntentForTests`, `overlayWorkspaceStoreRaw` (test-support module). ## Validation - Sweep: every `export` under `src/browser` (excluding stories) checked for non-test references across `src/`, `tests/`, `vscode/`, `scripts/`, `.storybook/`; orphan-module sweep found only the two HTML entry points. - `TimingPanel.clear.test.tsx` fails when `handleClearStats` stops setting the error (mutation check). - `bun test` on RightSidebar, hooks/useStableReference, utils/{messages,agentSkills,ui,rightSidebarLayout}, stores/GitStatusStore: 1141 pass. - `make static-check` green. LOC: production +11 / −585; tests +134 / −355. --- _Generated with `xum` • Model: `anthropic:claude-opus-5-5` • Thinking: `high` • Cost: `$4.21`_ <!-- mux-attribution: model=anthropic:claude-opus-5-5 thinking=high costs=4.21 -->



Summary
Keep a reported sub-agent active in the composer while its background Bash monitor is armed. Show Monitoring, then return to Completed when the last monitor retires. Fixes #4327.
Stack Context
Layer 2 of 2, based on #4338. This layer changes the composer tray and its regression coverage; the lower layer supplies shared activity helpers.
Why
Task-turn completion does not mean the workspace is idle. The sidebar already knows about armed monitors; the composer now consumes the same activity signals.
Review focus
The subscription tracks activity per child, so moving a monitor between children still updates the rows. Multiple monitors count as one active child. The completed-report fence rejects stale stream hints after retirement. Running/error/interrupted labels retain precedence; queued work retains the tray's existing active convention. No backend or persistence changes.
All 465 changed lines are handwritten; no generated files.
Validation
On
15c051b06, using repository-pinned Bun 1.3.5:ProjectSidebar.test.tsx: 54 passed.make static-check, Storybook build, and both affected Storybook suites: 10 stories passed.Remote mock-driven full-app UAT on checkpoint
c5d0b7410captured desktop and pinned 375px phone transitions, navigation, collapse/expand, and light/dark legibility. Publication split the commits and cleaned comments; all seven changed files produce identical TypeScript-transpiled output to that checkpoint. The new branch heads were validated locally, not by another remote UAT run. Recordings and screenshots are attached below.Hands-on reproduction and evidence limits
Start Storybook with
make storybook. OpenApp/PersistentSubagents/BackgroundMonitor, then its pinned phone variant. The play drives monitor counts 0 → 1 → 2 → 1 → 0 → 1 while stale interrupt hints remain set. Check the tray and sidebar agree, retirement shows Completed/inactive, and re-arming restores Monitoring/active. On phone, close the sidebar drawer to inspect the tray.The recorded evidence uses mock activity updates through the real renderer store. It does not test backend monitor lifecycles, Electron, real providers, or the Pixel capture matrix. Recordings include setup/reset and debugger-paced steps; continuity applies to the held forward sequence after setup.
Generated with
xum• Model:coder:openai/gpt-6-astra• Thinking:high• Cost:$129.41