* refactor(web): break down SessionDetail.tsx into focused components
Split the 1089-line SessionDetail page into smaller, focused modules so
every file stays under the 400-line component cap (CLAUDE.md C-04).
- SessionDetail.tsx: 1089 -> 248 lines, now orchestrates layout only
- SessionDetailHeader.tsx (new): topbar with PR popover + kill/restore
- OrchestratorStatusStrip.tsx (new): orchestrator zone counters
- SessionDetailPRCard.tsx: wired in, with merge-conflict actions and
reliability check that previously lived inline in SessionDetail
- PRCommentThread.tsx (new): unresolved review comment list
- Reuses session-detail-utils and session-detail-agent-actions, which
were previously orphaned dead code
Closes#770
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* test(web): unit-test logic in SessionDetail extractions
Cover the pure logic in the modules extracted by #770:
- buildBlockerChips (PR card): 12 cases for CI/review/conflict/draft
branching, lifecycle hints, and the unenriched/rate-limited
reliability gate
- buildZoneStats (orchestrator strip): zone filter + canonical order
- buildAgentFixMessage (agent actions): bugbot vs plain bodies and
truncation against title/description/total budgets
Pure JSX shells (PRCommentThread, header markup) stay covered by the
existing integration tests.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(web): wire lifecyclePrReason into PR popover
Pass session.lifecycle?.prReason to SessionDetailPRCard from the topbar
header so blocker chips derived from lifecycle state (ci_failing,
changes_requested) surface in the popover.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Prateek <karnalprateek@gmail.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>