DAO layer for task_instances and append-only completion_events #21

4 Commits
Author SHA1 Message Date
Joshua King a887df232a test: derive occurred-at query date from the event stamp; capture generated_at at creation
Both comparisons now use the recorded value, never a fresh clock read,
so a midnight boundary mid-test cannot flake them.
2026-09-14 08:26:58 -04:00
Joshua King 6e1f22e18a fix: rollover-safe today reads under lock, INSERT INTO regex, midnight-safe dynamic dates
- upsert re-checks 'today' after acquiring the connection lock (call
  date can go stale while queued across midnight); delete cutoff
  clamps to the lock-time date too
- mutation regex now matches INSERT [OR x] INTO completion_events;
  test_schema.py's raw-SQL CHECK-constraint helper exempted narrowly
  via INSERT-strip, guard file self-scanned
- NOW replaced by _now_stamp() (today 08:00 UTC, computed at call
  time); occurred-at test derives its query date from the stamp so it
  is midnight-safe
- new rollover-contention test: a lock holder delays A's upsert across
  a shifted clock; the in-lock re-check rejects the now-past date
2026-09-14 08:24:17 -04:00
Joshua King e48123e488 fix: immutable completed instances, no past generation, strict UTC timestamps, hardened append-only guards
- upsert refuses due_dates before today (never generate in the past)
  and refuses regeneration of any instance carrying a completion event
  (immutability); the ON CONFLICT refresh only ever touches open
  instances
- delete_future_uncompleted clamps the cutoff to today so backdating
  cannot rewrite past open instances
- occurred_at enforces ONE strict UTC shape (YYYY-MM-DDTHH:MM:SS+00:00)
  at append; occurred-at range scope uses exact half-open bounds
- was_on_time: bool | None with type(was_on_time) is bool validation -
  0.5 silently coercing to False is rejected
- append-only guards hardened: package-wide mutation regex covers
  UPDATE OR IGNORE/qualified names/quotes, DAO INSERT exempted
  narrowly; behavioral call-interception test proves only INSERT/SELECT
  ever reach the DB for completion_events; compensating self-scan for
  the instances test file's rules-table exemption
2026-09-14 08:17:48 -04:00
Joshua King ea6cf73bdc feat: add typed DAO layer for task_instances and append-only completion_events (#21) 2026-09-14 08:10:41 -04:00