Commit Graph
708 Commits
Author SHA1 Message Date
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
Lucas Berger 492adbc8b3 docs(14-01): complete desktop e2e coverage plan
- 85 passed, 5 skipped, 0 failed across iphone + pixel + desktop
- SC-1/SC-2/SC-3 all satisfied
2026-06-12 08:24:31 -04:00
Lucas Berger bfc49d199d chore(14-01): update spec headers + README for desktop profile, cosmetic CI step rename
- Updated calendar.spec.ts header to list all three profiles (iphone/pixel/desktop)
- Updated lists.spec.ts header to list all three profiles (iphone/pixel/desktop)
- Updated e2e/README.md preamble to add 'Desktop Chrome (1280x720)'
- Added --project=desktop example to README run-commands block
- Updated README full-suite command comment to name all three profiles
- Cosmetic: ci.yml step-name and comment updated to mention desktop (no plumbing change)
- Full suite verified: 85 passed, 5 skipped (3 desktop geometry + 2 parity guards), 0 failed
2026-06-12 08:23:10 -04:00
Lucas Berger 29035999ea feat(14-01): desktop-skip three mobile-only layout assertions, add D-04 parity
- Added test.skip(testInfo.project.name === 'desktop') to the two safe-area-inset
  BottomTabBar in-viewport tests (BottomTabBar returns null at >=768px on desktop)
- Added test.skip(testInfo.project.name === 'desktop') to the 56x56 FAB geometry test
  (on desktop 'New Event' resolves to the toolbar button, not the 56px FAB)
- Added desktop-only D-04 parity test asserting 'New Event' toolbar button height >=44px
  guarded by test.skip(testInfo.project.name !== 'desktop')
- Updated header jsdoc to list all three profiles including desktop
- All mobile assertions preserved (toBeGreaterThanOrEqual(56) and (44) still present)
2026-06-12 08:20:06 -04:00