8ea3c381ef
P1-1: Replace check-then-act with computeIfAbsent for activeSessionJobs to prevent double-launch. Register pendingApprovals[requestId] BEFORE emitting ApprovalRequestedEvent to close the approve-before-register window. P1-2: ToolCompleted with a diff now appends msg.diff to routerMessages instead of the static "--- diff from $toolName ---" marker. P1-3: Change routerMessages from List<String> to Map<String, List<String>> keyed by sessionId.value. RootReducer appends to the correct session's list; RouterPanel renders only routerMessages[selectedId]. P1-4: On IDLE chat submit, SessionsReducer creates an optimistic SessionSummary(status="STARTING") and sets selectedId. processSessionStartedMessage removes any STARTING session and inserts the real one on echo. RootReducer sets sessionEntered=true for the optimistic session. Tests: LaunchRegistrationRaceTest, ApprovalRegisterBeforeEmitTest, RootReducerTest (diff/per-session/isolation/optimistic-submit), SessionsReducerTest (optimistic/reconciliation). All P0/P1 tests pass. ./gradlew check green.