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
Lucas Berger
e153f7c355
docs(15-02): complete plan 02 summary — changes job + gate aggregate
2026-06-12 10:53:22 -04:00
Lucas Berger
547b12ca4a
feat(15-02): add always-running gate aggregate job (Gitea-safe per-job result checks)
...
- gate job needs [fast-checks, changes, api, harness] with if: always()
- gate fails (exit 1) when fast-checks != success
- gate accepts success OR skipped for api and harness, fails on any other result
- uses individual needs.X.result checks (not wildcard) — Gitea 1.26.2 bug #31007
- once merged, emits CI / gate commit-status required by Plan 03 branch-protection update
2026-06-12 10:52:18 -04:00
Lucas Berger
72604385bc
feat(15-02): add changes job and gate api/harness on code output
...
- insert changes job (dorny/paths-filter@v4) before fast-checks
- changes job: permissions pull-requests:read, outputs code, no checkout
- code filter lists positive patterns: **/*.ts, apps/**, pnpm-lock.yaml, Dockerfile, etc.
- api job: needs [changes] + if combined with needs.changes.outputs.code == 'true'
- harness job: same needs/if pattern as api
- services, env, and step bodies unchanged in both heavy jobs
2026-06-12 10:51:20 -04:00
Lucas Berger
20ebd90554
docs(phase-15): update tracking after wave 1
2026-06-12 10:49:12 -04:00
Lucas Berger
cd6be1b9c3
chore: merge executor worktree (worktree-agent-ad1b2de59871ef5b9)
2026-06-12 10:47:56 -04:00
Lucas Berger
4c5efb0604
docs(15-01): complete markdown lint gate plan — SUMMARY.md
2026-06-12 10:47:17 -04:00
Lucas Berger
46bea03757
feat(15-01): fix 13 markdown violations + wire md:lint to fast-checks CI step
...
- Fix MD040 (11 bare fences): add language tags (text/bash) across 7 files
- Fix MD031 (2 violations): add blank lines around fence in GETTING-STARTED.md
- Wire 'Markdown lint' step to fast-checks job (after Format check, before Typecheck)
- Reformat .markdownlint-cli2.jsonc per Prettier (trailing commas in JSONC)
- pnpm md:lint exits 0; pnpm format:check exits 0; gate can fail on bare fence (verified)
2026-06-12 10:46:01 -04:00
Lucas Berger
adb7641c19
feat(15-01): add markdownlint-cli2 + md:lint script + root config
...
- Install markdownlint-cli2@0.22 .1 as root workspace devDependency
- Add md:lint script (no glob args — globs/ignores live in config file)
- Create .markdownlint-cli2.jsonc with prettier preset + content rules
- Enable MD001/MD024/MD040/MD031/MD051/MD052; disable MD041/MD034/MD036
- Glob: docs/**/*.md, *.md, apps/**/*.md; ignores .planning/** and node_modules
2026-06-12 10:42:52 -04:00
Lucas Berger
4728c41539
docs(phase-15): mark phase execution started
2026-06-12 10:40:07 -04:00
Lucas Berger
c687efce27
docs(15): record planning complete + roadmap wave annotations
2026-06-12 10:30:50 -04:00
Lucas Berger
e19d4736c7
docs(15): create phase plan — doc-only CI skip + markdown lint
...
3 plans across 3 waves:
- 15-01: markdownlint-cli2 config/script/step + fix 13 baseline violations (SC-4)
- 15-02: ci.yml changes job + conditional api/harness + always-running gate (SC-1/2, SC-3 YAML)
- 15-03: operator branch-protection checkpoint + publish.yml comment (SC-3)
2026-06-12 10:28:56 -04:00
Lucas Berger
899528eeb3
docs(phase-15): add pattern map
2026-06-12 10:22:37 -04:00
Lucas Berger
18cf62b702
docs(phase-15): add validation strategy
2026-06-12 10:19:08 -04:00
Lucas Berger
e84911de10
docs(15): research phase - doc-only CI skip + markdown lint
2026-06-12 10:17:53 -04:00
Lucas Berger
23fb238443
docs(roadmap): add markdown linting to Phase 15 scope
Publish / publish (push) Successful in 6s
2026-06-12 09:52:34 -04:00
Lucas Berger
300a07ab4b
docs: review backlog — promoted 999.17 to Phase 15, removed 6 stale promoted stubs
Publish / publish (push) Successful in 7s
2026-06-12 09:47:12 -04:00
luckberg
2a209080a9
Merge pull request 'Phase 14: desktop e2e coverage (add blocking Desktop Chrome Playwright gate)' ( #10 ) from gsd/phase-14-desktop-e2e-coverage into main
...
Publish / publish (push) Successful in 19s
Reviewed-on: #10
2026-06-12 09:32:26 -04:00
luckberg
4607693a71
Merge branch 'main' into gsd/phase-14-desktop-e2e-coverage
CI / fast-checks (pull_request) Successful in 1m33s
CI / api (pull_request) Successful in 59s
CI / harness (pull_request) Successful in 3m55s
2026-06-12 09:25:47 -04:00
Lucas Berger
cf48fa8e1b
docs(phase-14): complete phase execution
CI / fast-checks (pull_request) Successful in 1m20s
CI / api (pull_request) Successful in 57s
CI / harness (pull_request) Successful in 3m56s
2026-06-12 09:10:18 -04:00
Lucas Berger
f9fc7bbda2
docs(14): add code review report
2026-06-12 09:07:20 -04:00
luckberg
75760e9d7d
Merge pull request 'docs: refresh CI + lint/format docs (Phase 8 + Phase 13)' ( #9 ) from gsd/docs-ci-lint-refresh into main
...
Publish / publish (push) Successful in 7s
Reviewed-on: #9
2026-06-12 08:54:16 -04:00
Lucas Berger
f75bc4239f
style(14-01): apply prettier formatting to layout.spec.ts for CI format:check gate
CI / fast-checks (pull_request) Successful in 1m22s
CI / api (pull_request) Successful in 59s
CI / harness (pull_request) Successful in 3m58s
2026-06-12 08:31:33 -04:00
Lucas Berger
214e59d6e2
docs(phase-14): update tracking after wave 1
2026-06-12 08:27:39 -04:00
Lucas Berger
1c7775a022
chore: merge executor worktree (worktree-agent-aaafe3c94f936d618)
2026-06-12 08:25:19 -04:00