Commit Graph
885 Commits
Author SHA1 Message Date
Lucas Berger 0f101bdd39 chore(16-02): seed audit allowlist (esbuild GHSA waiver) + outdated pin reasons
- audit-allowlist.json: GHSA-gv7w-rqvm-qjhr waiver (esbuild dev transitive via drizzle-kit/vitest/vite; not in production runtime)
- outdated-pins.json: intentional pin reasons for eslint, @eslint/js, zod, @types/node
2026-06-13 05:17:13 -04:00
Lucas Berger b67d757f87 docs(16-01): complete boot-guard plan — add SUMMARY, advance state to plan 2 2026-06-13 05:15:35 -04:00
Lucas Berger 5b4f32a649 chore(16-01): bake ENV NODE_ENV=production into production Dockerfile stage
- Add ENV NODE_ENV=production in production stage after WORKDIR /app/apps/api
- Engages the devBypass.ts hard guard so DEV_AUTH_BYPASS can never inject
  DEV_USER in the shipped image, even if accidentally set (D-07)
- No other stage (base/builder/dev/pwa-builder) is affected
2026-06-13 05:14:28 -04:00
Lucas Berger c2ffd1c1b2 feat(16-01): add boot-time refuse-to-boot guard for dev-bypass in production
- Create apps/api/src/lib/bootGuards.ts with assertNotDevBypassInProduction()
- Guard exits non-zero when NODE_ENV=production AND DEV_AUTH_BYPASS=true (D-08)
- Wire import + call as first statement in isMainModule() block in index.ts
- 3/3 unit tests pass, typecheck green
2026-06-13 05:14:08 -04:00
Lucas Berger 8414e891b3 test(16-01): add failing tests for boot-time dev-bypass guard
- Three test cases: prod+bypass=exit(1), dev+bypass=no-exit, prod+unset=no-exit
- Fails with Cannot find module (src/lib/bootGuards.ts absent) — RED confirmed
2026-06-13 05:12:33 -04:00
Lucas Berger 0d6366cd56 docs(16): create phase plan 2026-06-12 23:25:48 -04:00
Lucas Berger e039c85a22 docs(16): create phase plan — 6 plans, 2 waves (dep audit, security checks, image hygiene)
SEC-01/02, DEP-01/02, IMG-01/02/03, CI-03. Wave 1: image-hygiene runtime guard (TDD), audit+outdated wrappers (TDD), eslint-plugin-security fold, gitleaks config+baseline+.dockerignore. Wave 2: ci.yml security job + gate wiring, publish.yml hygiene assertions + boot-smoke. esbuild GHSA-gv7w-rqvm-qjhr waivered in 16-02 before the gate goes live.
2026-06-12 23:23:18 -04:00
Lucas Berger bfc93584d7 docs(16): add validation strategy 2026-06-12 23:08:05 -04:00
Lucas Berger 4929a79eee docs(16): research phase — gitleaks, eslint-plugin-security, pnpm audit/outdated, image hygiene 2026-06-12 23:06:20 -04:00
Lucas Berger 7d30e0bfab docs(state): record phase 16 context session 2026-06-12 22:50:57 -04:00
Lucas Berger 75b82f472c docs(16): capture phase context 2026-06-12 22:50:52 -04:00
Lucas Berger 2d50c7b515 docs(roadmap): add Phase 16 (CI dep audit, security & image hygiene); fold in + remove backlog 999.17
Publish / publish (push) Successful in 6s
2026-06-12 22:08:29 -04:00
Lucas Berger 656da005d6 docs: fix backlog 999.17 dir name (drop spurious null- prefix) 2026-06-12 21:41:15 -04:00
Lucas Berger f742583842 docs: add backlog item 999.17 — define & enforce dev/prod image boundary 2026-06-12 21:41:02 -04:00
Lucas Berger 17c1f63d4c docs(state): record phase 10 context session 2026-06-12 21:37:32 -04:00
Lucas Berger 52506cdc2d docs(10): capture phase context 2026-06-12 21:37:26 -04:00
luckberg b119f11cf2 Merge pull request 'Phase 9: Faster Write-Back (CAL-15) — event-driven outbox drain' (#14) from gsd/phase-09-faster-write-back into main
Publish / publish (push) Successful in 15s
Reviewed-on: #14
2026-06-12 21:19:16 -04:00
Lucas Berger 89411ce44b style(09): prettier-format outboxWorker.test.ts (fix CI format check)
CI / changes (pull_request) Successful in 2s
CI / fast-checks (pull_request) Successful in 1m20s
CI / api (pull_request) Successful in 58s
CI / harness (pull_request) Successful in 3m52s
CI / gate (pull_request) Successful in 1s
2026-06-12 21:12:17 -04:00
Lucas Berger 777910c86a docs(09): add code review fix report + refresh review after fixes
CI / changes (pull_request) Successful in 2s
CI / fast-checks (pull_request) Failing after 54s
CI / api (pull_request) Successful in 58s
CI / harness (pull_request) Successful in 3m51s
CI / gate (pull_request) Failing after 0s
2026-06-12 21:01:55 -04:00
Lucas Berger b7767af825 fix(09): IN-01 guard __resetDrainState against production use 2026-06-12 20:59:53 -04:00
Lucas Berger b724b3e932 fix(09): WR-03/IN-03/IN-04 add drain-listener teardown, test-only __resetDrainState, and remove stale RED @ts-ignore 2026-06-12 20:51:49 -04:00
Lucas Berger e1ffddf8dc fix(09): WR-02 make initOutboxTrigger idempotent and retain the unsubscribe handle via stopOutboxTrigger 2026-06-12 20:51:32 -04:00
Lucas Berger d3163f2281 fix(09): IN-02 extract shared resolveFinalRrule helper to deduplicate the update/create RRULE decision tree 2026-06-12 20:50:52 -04:00
Lucas Berger b8bb6e7671 fix(09): IN-01 add ordering comments cementing signalOutboxDrain() stays after the enqueue commit 2026-06-12 20:50:26 -04:00
Lucas Berger 8307a7b713 fix(09): WR-01 defer outbox drain emit to a microtask so a throwing listener cannot corrupt the enqueue route response 2026-06-12 20:50:21 -04:00
Lucas Berger 1bc1f134a7 docs(09): refresh code review report
CI / changes (pull_request) Successful in 2s
CI / fast-checks (pull_request) Failing after 56s
CI / api (pull_request) Successful in 59s
CI / harness (pull_request) Successful in 3m55s
CI / gate (pull_request) Failing after 1s
2026-06-12 17:24:08 -04:00
Lucas Berger ffc1f52f2b docs(phase-09): evolve PROJECT.md after phase completion
CI / changes (pull_request) Successful in 2s
CI / fast-checks (pull_request) Failing after 56s
CI / api (pull_request) Successful in 1m0s
CI / harness (pull_request) Successful in 4m0s
CI / gate (pull_request) Failing after 1s
2026-06-12 17:09:34 -04:00
Lucas Berger 03f02a1207 docs(phase-09): complete phase execution 2026-06-12 17:08:54 -04:00
Lucas Berger 551b751b81 docs(09): add code review report 2026-06-12 17:04:55 -04:00
Lucas Berger fff5789a5f docs(09-02): complete enqueue-site signal wiring plan
- 09-02-SUMMARY.md: 4 signalOutboxDrain() sites + initOutboxTrigger() startup wiring
- STATE.md: plan position advanced, metrics recorded
- ROADMAP.md: plan progress updated
- REQUIREMENTS.md: CAL-15 marked complete
2026-06-12 16:59:27 -04:00
Lucas Berger 0ebdf4864d feat(09-02): wire initOutboxTrigger() at startup under isMainModule() in index.ts
- extend outboxWorker import to include initOutboxTrigger alongside startOutboxWorker
- call initOutboxTrigger() immediately after startOutboxWorker() inside isMainModule() guard
- gated by isMainModule() so tests importing app never register the drain listener (Pitfall 4)
2026-06-12 16:57:52 -04:00
Lucas Berger 30eff3dcdb feat(09-02): add signalOutboxDrain() after each of four enqueue sites in events.ts
- import signalOutboxDrain from '../lib/outboxTrigger.js'
- Site 1 (POST /create): fire-and-forget signal after outbox insert, before 202
- Site 2 (PATCH edit-as-move): signal after await db.transaction() resolves, not inside callback (D-03)
- Site 3 (PATCH same-calendar update): signal after outbox insert, before 202
- Site 4 (DELETE): signal after outbox insert, before 202
2026-06-12 16:57:21 -04:00
Lucas Berger 9164619ccd docs(09-01): complete outbox drain trigger wiring plan 2026-06-12 16:54:20 -04:00
Lucas Berger 2b113045f7 feat(09-01): add scheduleOutboxDrain, drainRequested, initOutboxTrigger; route setInterval through wrapper
- Add import { onOutboxDrain } from outboxTrigger.js
- Add let drainRequested = false (D-05 trailing-re-drain flag)
- Export scheduleOutboxDrain(): void — isDraining guard + drainRequested loop (D-05/T-09-01)
  drainRequested=false reset precedes recursive call (Pitfall 3)
  errors caught via .catch to prevent crash (D-02/T-09-03)
- Export initOutboxTrigger(): void — registers onOutboxDrain(() => scheduleOutboxDrain())
- startOutboxWorker setInterval body: scheduleOutboxDrain() replaces runOutboxDrain().catch()
  15 * 1000 interval unchanged (D-08)
- runOutboxDrain body/isDraining guard/finally unchanged (D-02/D-07)
- Fix trigger-wiring tests: add beforeAll(initOutboxTrigger) to wire EventEmitter listener;
  fix Test C mock to return empty rows on trailing drain (correct D-07 behaviour)
- 30/30 outboxWorker tests GREEN; tsc --noEmit clean
2026-06-12 16:52:36 -04:00
Lucas Berger bcde073729 test(09-01): add failing trigger-wiring tests for SC-1, D-05, D-07
- Import scheduleOutboxDrain (not yet exported — causes RED)
- Import signalOutboxDrain from outboxTrigger.ts
- Add describe block 'scheduleOutboxDrain — trigger wiring (D-09)' with 3 tests:
  Test A SC-1: signalOutboxDrain() fires drain promptly without timer advance
  Test B D-05: two mid-drain signals collapse to exactly one trailing re-drain
  Test C D-07: concurrent scheduleOutboxDrain() calls dispatch exactly once via isDraining guard
- 27 pre-existing tests unmodified and passing; 3 new tests failing (RED)
2026-06-12 16:48:41 -04:00
Lucas Berger 1e12d702a1 feat(09-01): create outboxTrigger.ts zero-dependency EventEmitter signal module
- Module-level singleton EventEmitter, single subscriber, no setMaxListeners
- Export signalOutboxDrain(): void — fire-and-forget drain signal (D-04)
- Export onOutboxDrain(handler): () => void — register/unsubscribe listener
- Only imports node:events; zero internal dependencies (no circular import risk)
2026-06-12 16:47:39 -04:00
Lucas Berger a78c7241d6 docs(09): add pattern map 2026-06-12 14:28:32 -04:00
Lucas Berger 5fdbd11475 docs(09): create phase plan 2026-06-12 14:28:09 -04:00
Lucas Berger b22c92ae92 docs(09): create phase plan (2 plans, 2 waves) — outboxTrigger + drain signal wiring 2026-06-12 14:21:37 -04:00
Lucas Berger 555f4c80f8 docs(phase-9): add validation strategy 2026-06-12 14:11:10 -04:00
Lucas Berger 106574df1d docs(09): research phase — faster write-back trigger wiring 2026-06-12 14:09:26 -04:00
Lucas Berger b104d73cb5 docs(state): record phase 9 context session 2026-06-12 14:02:28 -04:00
Lucas Berger 2a11e86bca docs(09): capture phase context 2026-06-12 14:02:21 -04:00
Lucas Berger 2b4eb5d6ba docs(phase-15): complete phase execution
Publish / publish (push) Successful in 6s
2026-06-12 11:20:09 -04:00
Lucas Berger 62252ce434 docs(15-03): complete plan 03 — branch protection finalized (fast-checks + gate), publish.yml comment 2026-06-12 11:20:09 -04:00
luckberg 4e8ab562f4 Merge pull request 'Phase 15: skip api/harness CI for doc-only PRs + markdown lint gate' (#11) from gsd/phase-15-ci-skip-api-harness-jobs-for-doc-only-prs into main
Publish / publish (push) Successful in 1m39s
Reviewed-on: #11
2026-06-12 11:08:53 -04:00
Lucas Berger a6e2474379 docs(phase-15): record deferred 15-03 operator checkpoint
CI / changes (pull_request) Successful in 6s
CI / fast-checks (pull_request) Successful in 1m23s
CI / api (pull_request) Successful in 59s
CI / harness (pull_request) Successful in 3m55s
CI / gate (pull_request) Successful in 1s
2026-06-12 10:59:48 -04:00
Lucas Berger da623ac234 docs(15-03): update publish.yml safety-gate comment to name new required checks
- Replace "three required checks (CI / fast-checks, CI / api, CI / harness)"
  with the new gating surface: CI / fast-checks + CI / gate
- Note that CI / api and CI / harness are conditionally skipped on doc-only PRs
  and gated via the always-running CI / gate aggregate
- Comment-only change; no job/step/env/trigger modified
2026-06-12 10:56:03 -04:00
Lucas Berger 0278e2080a docs(phase-15): update tracking after wave 2 2026-06-12 10:54:26 -04:00
Lucas Berger c0c217019c chore: merge executor worktree (worktree-agent-afb241c0e741e819e) 2026-06-12 10:53:47 -04:00