Files
claude@clouddev1 55b784597a docs: ADR-0033 Accepted (Phase 3 complete) + session handoff 34
Phase 3 of the ADR-0030 SQL surface (DML) is implemented and verified through sub-phase 3k; mark ADR-0033 Accepted in the ADR and the README index (index-upkeep rule). Add handoff 34 tracking the close-out and teeing up ADR-0034 (history journal + replay filter) as the next job.

1645 passing / 0 failing / 0 skipped / 1 ignored. Clippy clean.
2026-05-24 09:23:03 +00:00

8.9 KiB
Raw Permalink Blame History

Session handoff — 2026-05-23 (34)

Thirty-fourth handover. This session completed ADR-0033 sub-phase 3k — the Phase-3 verification sweep — closing Phase 3 of the ADR-0030 advanced-mode SQL surface. A user-invoked /runda round hardened the matrix attributions and closed two small coverage gaps. ADR-0033 is now Accepted.

The next session (or the continuation of this one) starts the ADR-0034 implementation. See §4.

§1. State at handoff

Branch: main. Tests: 1645 passing, 0 failing, 0 skipped, 1 ignored (the unchanged friendly/mod.rs doctest). Clippy: clean (cargo clippy --all-targets -- -D warnings).

Latest committed (local-only):

380c423 test+docs: 3k Phase-3 verification sweep — e2e DML + filled cross-cut matrix

origin/main is at 6b8888f (3h), so 10 commits are local-only (the 3i series, handoff-32, 3j d5c7f63, handoff-33 a5cdb00, and this session's 3k 380c423). Unpushed commits are a normal working state; pushing is the user's step — do not prompt about it.

Uncommitted at the moment of writing this handoff (the ADR-0033 acceptance flip + this handoff doc):

  • docs/adr/0033-sql-dml-grammar.md — Status ProposedAccepted.
  • docs/adr/README.md — ADR-0033 index line flipped to Accepted (same-edit index-upkeep rule).
  • docs/handoff/20260523-handoff-34.md — this file.

These three should be committed together (proposed message in §8).

§2. What shipped this session (3k)

Authoritative detail lives in the phase-exit report: docs/handoff/20260523-phase-3-verification.md — read it for the filled matrix, the requirements-to-test mapping, and the DA review. Summary:

  • tests/sql_dml_e2e.rs (new) — 11 Tier-3 end-to-end DML tests (parse-in-Advanced → worker → persist/history): INSERT… SELECT cross-table, all-ten-type multi-row INSERT + RETURNING type recovery, UPDATE-with-subquery-in-SET, cascade DELETE, UPSERT round-trip, RETURNING ×3, history.log replay of Phase-3 forms, the full §13 OOS rejections, a trailing-; guard, and the [WRN] validity indicator driven by a SQL DML diagnostic.
  • Cross-cut gap-fill in src/: walker/mod.rs (5 inherited-diagnostic cross-cuts — DELETE/UPDATE WHERE schema-existence, like-numeric on DELETE WHERE, the corrected row-scoped predicate slots), highlight.rs (DML-keyword highlight), completion.rs (INSERT INTO target-table), input_render.rs (advanced-mode DML hint-panel — added in the /runda round).
  • Cross-cut matrix filled in docs/plans/20260520-adr-0033-phase-3.md85 , 1 N/A, 0 , every row a verified file::function.
  • ADR-0033 → Accepted (this handoff's commit).

§3. Decisions settled this session (do not re-litigate)

Both escalated and user-confirmed before any matrix/test edit (via AskUserQuestion); recorded in the phase-exit report §4 and the matrix footnotes [d]/[e]:

  1. Predicate-warning-in-VALUES (matrix I7) — claim corrected. Predicate warnings (eq_null / like_numeric / type_mismatch) fire on every DML sql_expr slot with row scope (UPDATE/ DELETE WHERE, UPDATE SET incl. CASE, INSERT…SELECT projection & WHERE) but not in plain INSERT … VALUES — a VALUES literal has no row to compare against. This matches ADR-0033 §8.4 ("WHERE and CASE"); the original "(e.g. = with NULL in VALUES)" example was an over-statement. Backed by new row-scoped tests.

  2. Auto-snapshot (ADR-0006 / ADR-0033 §10) — N/A, deferred. ADR-0006 auto-snapshot/undo is unimplemented for both the DSL and SQL paths (the U-series). The "same as DSL" parity holds vacuously; Phase 3 introduces no regression. The matrix row is N/A, not red.

The /runda round additionally corrected the A6 attribution (the hint-panel tests ran in Simple mode via ambient_hint, which defaults to Mode::Simple; added an advanced-mode DML hint test) and closed OOS-5/OOS-6 (INDEXED BY / multi-statement — both parse-reject; a single trailing ; still parses).

§4. ADR-0034 — the NEXT job

Implement ADR-0034 (docs/adr/0034-history-journal-and-replay-filter.md, Accepted). This is the user's standing "extra tasks after Phase 3" item; it subsumes the old TASK #8 + TASK #9 and fixes a real, currently-broken behaviour verified this session:

replay history.log fails on line 1. run_replay (src/runtime.rs:1630) feeds each whole raw line straight to parse_command_with_schema and only skips blank/# lines — it does not understand the <ts>|<status>|<source> journal format that history.rs already writes. So replay only works on hand-written bare-command .commands scripts, never on the actual journal. No test catches this (existing replay tests + the new 3k e2e replay test all use bare-command scripts).

Concrete work (ADR-0034 §§14):

  1. Writer records every command, tagged ok / err (today history.rs hardcodes ok). err lines are journalled best-effort from the runtime/app error path (a parse failure never reaches the worker); ok lines stay worker-journalled, transactionally coupled to the state change.
  2. Hydration reads all records (ok + err) so cross-session recall matches the in-session ring (req I2 is marked done but only covers ok today — err lines are lost across sessions).
  3. Replay learns the journal format: detect the <iso8601>|<status>| prefix, extract+unescape <source>, skip non-ok; bare commands still replay as-is. Detection by the leading timestamp+status prefix so a | inside a bare command isn't misread.
  4. Escape/unescape parity with the existing history.rs helpers.

Test-first (global rule): the first move is a failing test that replays an actual history.log (with the <ts>|ok| prefix) and currently dies on line 1 — then make it green. Also add an err-line round-trip test (write → hydrate-reads-it → replay-skips-it).

Open question to settle with the user first: ADR-0034 has no plan doc (unlike Phases 23). It is smaller; a lightweight phased pass in one session may suffice. The user said we can "continue in this session afterwards with the ADR-0034 plan" — so the immediate next action is to produce that plan (or confirm a plan-less test-first pass), then implement.

§5. Other tracked deferred items (nothing lost)

  • ADR-0006 auto-snapshot / undo (U-series) — surfaced by 3k's N/A matrix row; implement for both DSL and SQL worker handlers so parity is real, not vacuous.
  • M4 — execution-time mode side-channel (three-way Mode threaded Action→worker, for mode-dependent output). Needs its own ADR (ADR-0033 Amendment 3; requirements.md M4). Not a prerequisite for anything above.
  • Phase 4 — DDL as SQL (CREATE/DROP/ALTER TABLE, CREATE/DROP INDEX). The next ADR-0030 roadmap phase, but no ADR exists yet (latest is 0034) — needs its own ADR before implementation.
  • blob value literalsrc/dsl/value.rs has no blob literal yet; the 3k all-types test inserts NULL for blob (type still round-trips). Pre-existing gap.
  • Q1 / Q2 (SQL subset completeness; polished out-of-subset rejection message naming the construct) — multi-phase, still [ ]; the 3k OOS tests assert rejection only, not message quality (Q2 is "Implementation pending").
  • Cosmetic: tests/sql_*.rs helper names (run_sqlinsert etc.) keep their dev-word-era spelling though they parse the real words.

§6. Process pins (unchanged, still binding)

  • Confirm every commit. Propose the message; wait for the go-ahead. (The 3k commit 380c423 and the acceptance flip were both user-approved.)
  • Push is the user's step. Never push; never prompt about it.
  • No AI attribution in commits (global rule).
  • Probe, don't reason. This session's catalog sub-agents fabricated test names and mis-attributed dispatch/inherited- diagnostic rows; every matrix row was re-verified by reading the actual test. The /runda round caught a mode mismatch the same way. Reproduce/print before concluding.
  • Escalate ADR-vs-implementation mismatches; never classify work "out of scope" without user confirmation. Both 3k findings (I7, auto-snapshot) were escalated, not silently resolved.

§7. How to take over

  1. Read, in order: this file → docs/handoff/20260523-phase-3-verification.md (the Phase-3 close-out) → docs/adr/0034-history-journal-and-replay-filter.md (the next job) → CLAUDE.mddocs/requirements.md.
  2. Baseline:
    cargo test    # expect 1645 passing / 0 failing / 0 skipped / 1 ignored
    cargo clippy --all-targets -- -D warnings   # clean
    
  3. Start ADR-0034 per §4: settle plan-vs-no-plan with the user, then a test-first pass beginning with the failing replay history.log reproduction.
  4. Escalate anything not settled in ADR-0034; the user wants mismatches surfaced, not silently fixed.