Overview
Two parallel workstreams: Security hardening (helmet, CORS, env validation, 529 retry, credential rotation) and container setup (Dockerfile, .dockerignore, DB pool config).
Execution Plan: docs/pending-updates/deploy-week-2.md
Reference: docs/pending-updates/deployment-guide.md — Sections 2.8-2.9, 4.1-4.6, 7.1-7.2
Stream A: Security Hardening
Stream B: Container Setup
Progress
- Implemented (6/12): A3, B1, B2, B3, B4, B5 — merged to
main via deploy-week-2 branch (2026-03-11)
- Deferred (4/12): A1, A2, A4, A7 — documented in CHANGELOG, not required for deployment
- Descoped (1/12): A6 — upstream APIs don't support header auth
- Remaining (1/12): A5 credential rotation — operational task, not code change
- Test baseline: 37 suites / 1160 tests passing (zero regressions)
- Version: v4.5.0
Effort
~2 days (2 developers, 1 per stream)
Depends On
Blocks
🤖 Generated with Claude Code
Overview
Two parallel workstreams: Security hardening (helmet, CORS, env validation, 529 retry, credential rotation) and container setup (Dockerfile, .dockerignore, DB pool config).
Execution Plan:
docs/pending-updates/deploy-week-2.mdReference:
docs/pending-updates/deployment-guide.md— Sections 2.8-2.9, 4.1-4.6, 7.1-7.2Stream A: Security Hardening
helmetsecurity headers (CSP, HSTS, X-Frame-Options) — DEFERRED (CSP complexity, 50+ inline styles need browser validation)ANTHROPIC_API_KEYmissing ✅d790714.envmust be rotated immediatelyStream B: Container Setup
node:22-slim, pandoc, typst, non-root user +package.jsonengines>=22.0.0✅d790714.dockerignore— exclude tests, docs,.env, coverage ✅d790714.nvmrc(value:22) ✅d790714max: 5→Number(process.env.PG_POOL_MAX || 10)✅d790714.env.examplewithALLOWED_ORIGINS,PG_POOL_MAX✅d790714Progress
mainviadeploy-week-2branch (2026-03-11)Effort
~2 days (2 developers, 1 per stream)
Depends On
Blocks
🤖 Generated with Claude Code