feat(chat): realtime executor-subagent strip (executor-only, per-tab activity)#47
Merged
Conversation
…rk decided/as-built (Lane P) Bring the design spike (PR #43) into this branch and record the two owner decisions that override its recommendations: executor/UI-driven subagents only (native/CLI sidechain out of scope) and per-tab activity. Add a §0 decision + as-built section, mark §6.5 executor path implemented / native path deferred, and resolve §10 Q2/Q3/Q4/Q5/Q8/Q9. Facets 1 & 3 and the native path remain design-only.
miguelrisero
marked this pull request as ready for review
July 23, 2026 16:59
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Realtime executor-subagent strip (executor-only, per-tab activity) — DRAFT
Session-scoped strip at the top of the conversation pane that surfaces the executor's subagents live: active subagents render as tabs, each with its own working animation; finished ones collapse into a "N done" drawer. Pure render/projection over the
task_createconversation rows the app already streams — no backend, no schema, no new ingestion, no new stream.Owner decisions honored (these override the design spike where they conflict)
claudein a terminal already surfaces its own subagents, so the CLI/native-sidechain path is out of scope. This removes the spike's riskiest piece (un-hiding native sidechain records).RunningDotsanimation, so you can see which subagent is busy vs done at a glance — not one session-wide state.Behavior
created/pending_approval), each animating its ownRunningDots.FINISHED_LINGER_MS = 5000) as a done-styled tab (check/x icon, no animation), then collapses into the trailing "N done ▾" button; the drawer lists finished subagents, each expandable to its result (reusesChatSubagentEntry).MAX_ACTIVE_TABS = 4tabs; overflow folds into the same button relabeled "N more ▾".useIsMobile, ≤767px): a single "N active · M done" summary line that expands to a floating overlay sheet (RadixPopover, does not resize the conversation) — no horizontal tab scroll. The global 7-tab nav is untouched. Existing inlineChatSubagentEntryrows remain the primary mobile reading surface.EntriesProviderin both the standard and VS Code conversation panes); renders nothing when there are no subagents.Design
partitionStrip()+selectSubagents()projection — both unit-tested (Node-env vitest, matching the repo's model-test convention; there's no jsdom/render-test setup). Timers +doneAttracking live in a thinuseSubagentStrip()hook with a single absolute-deadline timer.RunningDots(the feat(cli-mode): make CLI/tmux agent 'working right now' legible in web UI (animated, is_running-driven) #44-standardized working animation),ChatSubagentEntry,AgentIcon, RadixPopover,CpuIcon; status-icon language mirrored fromChatSubagentEntry. No new spinner.aria-hidden+sr-onlystatus text; drawer entries announce status to screen readers; per-tabrole="status"removed to avoid multiple live regions; reduced-motion respected. Honors thecn()-has-no-tailwind-merge footnote (§8): conditional classes are ternaries.Spec-of-record
Brings the design doc (
docs/superpowers/specs/2026-07-23-agent-activity-legibility-design.md, previously draft PR #43) into this branch and revises it to decided + as-built: facet 2 scoped to the executor path, §10 Q3→~5s linger, Q4→MAX_ACTIVE_TABS=4, Q5→per-tab yes, Q8→executor-only, Q9→generic "Subagent". The native/CLI path and facets 1/3 remain design-only. Please close #43 as superseded by this PR.Verification
Gate (feature-only tree) GREEN:
pnpm --filter @vibe/web-core run check,pnpm --filter @vibe/ui run check,pnpm run test(full suite: 27 files / 269 tests),pnpm run local-web:lint,pnpm run ui:lint,check-unused-i18n-keys.mjs,scripts/check-i18n.sh. Newsubagent-strip-model.test.ts+subagent-strip-partition.test.tscover budget boundary, linger window (injectednow), overflow labels, null subagent_type, phase mapping, ordering. No Rust/db/schema touched (clippy/cargo N/A). Frontend vitest is not in CI (tsconfig excludes*.test.ts) — run locally viapnpm run test.Live visual verify (scratch Vite instance, never prod 4111; desktop + mobile, agent-browser/Chrome). Seeded EntriesProvider driving the REAL components (owner-approved seeded set in lieu of a live executor run). DOM assertions + screenshots:
desktop-1-two-active.pngdesktop-2-complete-linger.pngdesktop-3-overflow.pngmobile-1-summary.png,mobile-2-drawer-open.pngdesktop-4-cleared-selfhide.pngScreenshots (viewable):
/tmp/laneP-shots/*.png.Review gauntlet + deviations (proportional, ship-it-light)
role="status"live-region noise; exhaustive status-mapping guard; reduced-motion on the surfaced spinner.RunningDotsnot the entry's spinner (feat(cli-mode): make CLI/tmux agent 'working right now' legible in web UI (animated, is_running-driven) #44 mandate); the persistent "N done" affordance is the owner's explicit "small button to check inactive subagents" — the mobile "0 active · N done" line is left for the owner to decide at flip.Risk: LOW–MEDIUM (frontend projection over existing data). Draft — boss verifies (screenshots above), flips, merges per the owner's standing "merge as you go".