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