b1f57cec6b
A new Playwright project — \`docker\` — runs container-bound E2E specs against a backend with KANDEV_E2E_DOCKER=1. The fixture probes for a Docker daemon and skips the worker entirely when none is reachable, so contributors without Docker can still run the rest of the suite. The fixture builds a tiny kandev-agent:e2e image once per machine (node:22-slim + git/curl), pre-seeds a local_docker executor profile, and seeds a local repo with a file:// origin so the executor's clone-inside-container path resolves without network access. A small WS-based session.launch helper is added to the api-client for tests that need to launch additional sessions on an existing task. First spec — docker-launch.spec.ts — covers the smoke path: a session launches in a real container, the task environment records its container_id, and \`docker inspect\` confirms the container exists. Two follow-up specs (multi-session env reuse + recovery from external container removal) are wired up but marked test.fixme with comments pinpointing the backend gaps that block them: persistTaskEnvironment isn't called for workflow-prepared sessions (so task_environment_id stays empty on those rows), and DockerExecutor.reconnectToContainer loses the agentctl handshake auth token across launches (so reconnect 401s and falls back to a fresh container every time). Run locally with: \`pnpm --filter @kandev/web exec playwright test --config e2e/playwright.config.ts --project=docker\`.