51f712f602
- Dockerfile: node:22-slim stage runs npm ci + npm run build; python runtime stage COPY --from copies dist to /app/frontend/dist (matches SPA_DIST_DIR); runtime image has no node - .dockerignore: exclude frontend/node_modules and frontend/dist from context - .github/workflows/frontend.yml: npm ci + codegen-sync + lint/typecheck/test/build - tests/test_deployment.py: skip COPY --from sources in the context-existence check; assert the multi-stage frontend build wiring - verified with a real docker build (image serves SPA, no node at runtime)