devcontainer.json's forwardPorts is a VS Code feature; the devcontainer CLI
(which devcontainer.sh drives) doesn't implement it. Compose only published
3000, so a container started via `./devcontainer.sh up|rebuild` left the
impeccable live helper on 8400 unreachable from the host — and the failure is
silent: the page loads, the injected script 404s, the element picker just never
appears.
Publish 8400:8400 explicitly. The mapping is fixed rather than dynamic because
the injected script hard-codes http://localhost:8400, which also means only one
container at a time can run live mode.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Live mode (impeccable.style/live-mode) never worked here because the skill was
never actually installed: postCreate ran `skills add pbakaus/impeccable
--global`, which silently no-ops — it's absent from ~/.claude/skills. Vendor it
into .claude/skills/impeccable instead, so live mode's scripts/ sit on a stable
path and everyone gets the same version (`npx impeccable update` to refresh).
Drop the dead postCreate step.
Live-mode wiring:
- .impeccable/live/config.json for Next.js App Router (src/app/layout.tsx,
</body>, jsx). detect-csp.mjs reports no CSP in this project, so no config
patch is needed and cspChecked is honestly true.
- Forward port 8400 with requireLocalPort. The script injected into the page
hard-codes http://localhost:8400, so if VS Code remaps it the element picker
silently never loads — the one devcontainer-specific trap here.
- Ignore the per-session journal/screenshots; keep the configs tracked.
DESIGN.md is required — live.mjs refuses to boot without it (context_missing).
Generated via the `document` skill from the actual codebase, so it records what
the code really does, including the gaps (dark mode defined but dead, --font-sans
referenced but never defined, --radius unused, the broken Tremor colour block).
Worth a read rather than a rubber stamp: it's the context live mode generates
variants against.
Verified: live.mjs boots ok with the helper on 8400 and injects into layout.tsx;
live-server.mjs stop strips the tag back out cleanly.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirrors the Model devcontainer's Playwright setup for this Next.js repo, so
agents and humans can drive the running app in a browser.
The image bakes in chromium's apt libraries (as root) and the browser binary
(as vscode, so it lands in that user's cache), meaning a fresh container is
ready to run with no first-use download. The @playwright/test version and the
Dockerfile's PLAYWRIGHT_VERSION are pinned to the same number because Playwright
ties browser builds to a library version.
Also ports Model's headed viewer stack (Xvfb -> fluxbox -> x11vnc -> noVNC on
:6080) as scripts/start_viewer.sh, for watching a headed run.
Cypress is untouched; Playwright specs live in e2e/.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Design references and critique snapshot for the portfolio home redesign;
impeccable design skill added to devcontainer postCreateCommand on trial.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>