Milestone 2 — host accounts & event type management
- Milestone prompt: spec/slotbook/milestones/M2.md
- Tech constraints (all milestones): spec/slotbook/BRIEF.md
Process
CC-Opus4.8-i1 12/12 CC-Opus4.8-i2 12/12 CX-5.6-i1 12/12 11/12 before one fix-it CX-5.6-i2 12/12
CC-Opus4.8-i1 16.4 CLI crash ~6 min in, resumed — operator incident CC-Opus4.8-i2 14.7 active time; sleep-interrupted, resumed CX-5.6-i1 14.0 CX-5.6-i2 11.8 active time; sleep-interrupted, resumed
CC-Opus4.8-i1 107 CC-Opus4.8-i2 83 resumed segment only CX-5.6-i1 n/a CX-5.6-i2 n/a
CC-Opus4.8-i1 58.6K CC-Opus4.8-i2 31.6K resumed segment only CX-5.6-i1 52.0K CX-5.6-i2 27.9K resumed segment only
CC-Opus4.8-i1 15.28M includes crash-resume replay CC-Opus4.8-i2 8.22M resumed segment only CX-5.6-i1 4.87M includes fix-it replay CX-5.6-i2 2.42M resumed segment only
CC-Opus4.8-i1 163 CC-Opus4.8-i2 148 CX-5.6-i1 44 CX-5.6-i2 41
CC-Opus4.8-i1 +1,907 CC-Opus4.8-i2 +1,430 CX-5.6-i1 +981 CX-5.6-i2 +1,480
CC-Opus4.8-i1 browser click-testing, API probes, typecheck, build CC-Opus4.8-i2 browser click-testing, typecheck, build CX-5.6-i1 API probes, ad-hoc self-test suite, typecheck, build CX-5.6-i2 API probes, browser checks (MCP), typecheck, build
CC-Opus4.8-i1 no (did at m1) CC-Opus4.8-i2 no (did at m1) CX-5.6-i1 no CX-5.6-i2 no
Task checks
CC-Opus4.8-i1 ✓ CC-Opus4.8-i2 ✓ CX-5.6-i1 ✓ CX-5.6-i2 ✓
CC-Opus4.8-i1 ✓ CC-Opus4.8-i2 ✓ CX-5.6-i1 ✓ CX-5.6-i2 ✓
CC-Opus4.8-i1 ✓ CC-Opus4.8-i2 ✓ CX-5.6-i1 ✓ CX-5.6-i2 ✓
CC-Opus4.8-i1 ✓ CC-Opus4.8-i2 ✓ CX-5.6-i1 ✓ CX-5.6-i2 ✓
CC-Opus4.8-i1 ✓ CC-Opus4.8-i2 ✓ CX-5.6-i1 ✓ CX-5.6-i2 ✓
CC-Opus4.8-i1 ✓ CC-Opus4.8-i2 ✓ CX-5.6-i1 ✓ 1 fix-it CX-5.6-i2 ✓
Code metrics
CC-Opus4.8-i1 2,964 38 files CC-Opus4.8-i2 2,261 36 files CX-5.6-i1 1,477 29 files CX-5.6-i2 2,005 32 files
CC-Opus4.8-i1 0 CC-Opus4.8-i2 0 CX-5.6-i1 0 CX-5.6-i2 0
CC-Opus4.8-i1 44 CC-Opus4.8-i2 24 CX-5.6-i1 19 CX-5.6-i2 21
CC-Opus4.8-i1 1 CC-Opus4.8-i2 1 CX-5.6-i1 1 CX-5.6-i2 1
CC-Opus4.8-i1 23 CC-Opus4.8-i2 9 CX-5.6-i1 8 CX-5.6-i2 5
CC-Opus4.8-i1 5 CC-Opus4.8-i2 1 CX-5.6-i1 4 CX-5.6-i2 4
CC-Opus4.8-i1 0 CC-Opus4.8-i2 0 CX-5.6-i1 0 CX-5.6-i2 0
CC-Opus4.8-i1 0 CC-Opus4.8-i2 1 CX-5.6-i1 1 CX-5.6-i2 0
CC-Opus4.8-i1 0 CC-Opus4.8-i2 1 exhaustive-deps CX-5.6-i1 0 CX-5.6-i2 0
CC-Opus4.8-i1 1.01 CC-Opus4.8-i2 1.06 CX-5.6-i1 1.03 CX-5.6-i2 1.00
CC-Opus4.8-i1 99.3% CC-Opus4.8-i2 99.1% CX-5.6-i1 99.0% CX-5.6-i2 99.6%
CC-Opus4.8-i1 0% CC-Opus4.8-i2 0.4% CX-5.6-i1 0.3% CX-5.6-i2 1%
Review
One card per registered criterion; cells are descriptive, not scores. Full text with citations: light review · i2 addendum · scored review.
CC-Opus4.8-i1 ◐ buffers/notice/caps handled by verification instead of code — the m1 engine already composed them, so real values were wired through and probed (churn 1.01) — but
computeSlots is still the cognitive-complexity-44 function; milestone 5 lands there. CC-Opus4.8-i2 ✓ refactored in place, not extended around: exact-start matching became buffered busy-interval overlap (src/lib/slots.ts), closing its own m1 buffer gap; read and write paths still share one generateSlots. CX-5.6-i1 ✓ daily-cap semantics corrected for the multi-event-type world: the cap now counts per event type, in the host's calendar day (lib/slots.ts). CX-5.6-i2 ✓ m1's critical path untouched: slot engine and advisory-lock booking path reused as-is (churn 1.00), the dashboard integrating through thin query modules. CC-Opus4.8-i1 ✓ defense-in-depth: session cookie is id + secret with only the secret's hash at rest;
requireHost() on the dashboard layout and every server action; every query host-scoped. CC-Opus4.8-i2 ⚠ departs from i1's server-side sessions: a stateless HMAC cookie whose signing key falls back to a hardcoded string when SESSION_SECRET is unset (src/lib/session.ts) — forgeable sessions; expiry browser-only, no revocation. CX-5.6-i1 ✓ scrypt with timing-safe comparison, session tokens stored SHA-256-hashed, layout-level and per-action guards (lib/auth.ts). CX-5.6-i2 ◐ server-side sessions converge with i1: opaque token, only sha256(token) stored, expiry enforced in SQL — but sessions never rotate and expired rows are never cleaned up. CC-Opus4.8-i1 ✓ caught that the existing
ON DELETE CASCADE would destroy bookings and reversed it to RESTRICT; archived slugs freed for reuse via a partial unique index over live rows (src/db/schema.sql). CC-Opus4.8-i2 ✓ guarded idempotent migration: bookings FK swapped CASCADE → SET NULL with a denormalized event_name snapshot — deleting an event type never destroys booking history. CX-5.6-i1 ✓ the same conclusion independently: soft delete via deleted_at, live-row filters in every public query. CX-5.6-i2 ◐ soft delete via active = false with a partial unique index freeing archived slugs — but renaming an event type silently relabels historical bookings (live join, no snapshot). CC-Opus4.8-i1 ⚠ the m1 latent race is now live: 15/45/60-minute durations make overlapping different-start bookings possible, and the database still arbitrates identical starts only. CC-Opus4.8-i2 — CX-5.6-i1 — CX-5.6-i2 carried forward unchanged: the advisory-lock path is absent from the m1..m2 diff.
CC-Opus4.8-i1 — CC-Opus4.8-i2 — CX-5.6-i1 ⚠ the catch-all is unchanged and now wider: the booking transaction still maps any failure — database outage included — to 409
slot_unavailable (app/api/bookings/route.ts). CX-5.6-i2 — CC-Opus4.8-i1 ⚠ none. CC-Opus4.8-i2 ⚠ none. CX-5.6-i1 ⚠ none. CX-5.6-i2 ⚠ none.
Scored review (checkpoint)
Blind scored review of the i1 repos — the i2 iterations joined after this panel and enter judging at m4. Judge: Claude (claude-fable-5); procedure and conflict-of-interest mitigations: judging protocol. Scores are provisional pending second-rater replication. Full text with the comparative synthesis and verdict.
CC-Opus4.8-i1 3.65 CC-Opus4.8-i2 — CX-5.6-i1 3.30 CX-5.6-i2 —
CC-Opus4.8-i1 4.56 CC-Opus4.8-i2 — CX-5.6-i1 4.22 CX-5.6-i2 —
CC-Opus4.8-i1 4.50 CC-Opus4.8-i2 — CX-5.6-i1 3.83 CX-5.6-i2 —
CC-Opus4.8-i1 1.00 CC-Opus4.8-i2 — CX-5.6-i1 1.00 CX-5.6-i2 —
CC-Opus4.8-i1 0/11 CC-Opus4.8-i2 — CX-5.6-i1 0/11 CX-5.6-i2 —
CC-Opus4.8-i1 4 wins CC-Opus4.8-i2 — CX-5.6-i1 1 win (2 ties) CX-5.6-i2 —