- SoloEnv::Drop: wait for daemon exit + clean up daemon.sock/ready/pid
files (SIGKILL prevents daemon's own cleanup)
- cloud_crash_recovery_endpoint_gone: add real assertions to all branches
(was a no-op test that could never fail)
- Restore cloud_crash_recovery_reconnect test (was deleted in refactor)
- Add SessionGuard to lifecycle_close_s1t2 and lifecycle_double_close
tests (prevent session leak on panic)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Extract common helpers to harness.rs (assert_meta, assert_error_envelope,
assert_tab_id, start_session, close_session, new_tab_json, etc.)
- Add local HTTP server to eliminate external network dependency
- Introduce SoloEnv for tests needing isolated ACTIONBOOK_HOME
- Replace fixed sleep(500ms) with per-test session isolation
- Fix TempDir leak in cloud_mode (ChromeGuard now owns TempDir)
- Add PID to unique_session IDs to prevent cross-run collisions
- HTTP server: thread-per-connection + Connection: close header
- Restore all cloud_mode tests (groups 5b-15) that were missing
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- tab_id value is now Chrome's native CDP target ID (opaque string),
no longer computed t1/t2/t3 counter
- Remove native_tab_id field from all API responses
- Remove next_tab_id counter from SessionEntry
- list-tabs fetches url/title real-time from Chrome /json/list
- TabEntry keeps url/title fields for extensibility
- All E2E tests use dynamic tab_ids from command responses
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
native_tab_id was always null. Now populated from Chrome's CDP target
list (e.g. "4662D2C5D55C1F240EF210C569428A86"). Also added E2E test
for reuse + open-url navigation scenario.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Local mode: 1 profile = max 1 active session (Chrome user-data-dir limit).
Second `browser start` with same profile returns existing session with
reused=true instead of failing with CDP timeout.
Added 2 E2E tests (JSON + text) verifying:
- First start: reused=false
- Second start: reused=true, same session_id
- list-sessions shows exactly 1 session
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- native_tab_id: assert key presence explicitly, not just value type
- search pagination: add meta.pagination.total assertion (§2.4)
- get nonexistent: add error.details assertion (§3.1)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>