Files
claude@clouddev1 ac41938365 chore: handoff
2026-05-18 22:07:54 +00:00

7.8 KiB

Session handoff — 2026-05-18 (16)

Sixteenth handover. This session was a design run: three interlocking ADRs were designed and committed — ADR-0026 (complex WHERE expressions), ADR-0027 (input-field validity indicator), ADR-0028 (query plans / EXPLAIN QUERY PLAN) — plus one small code fix (the with pk column-spec syntax).

Headline: nothing from the three ADRs is implemented yet. This was deliberate design-ahead, chosen by the user. The next session's job is implementation, and ADR-0026 is the keystone — start there (see §3).

State at handoff

Branch: main. Working tree clean. Four commits since handoff-15 (f4eedf3), all local — the user pushes asynchronously, so do not treat them as blocking:

d9a98bb Grammar: with-pk column specs use name(type), matching add column
9aa7e2e docs: add ADR-0028 — query plans (EXPLAIN QUERY PLAN)
032a050 docs: add ADR-0027 — input-field validity indicator
6e42a11 docs: add ADR-0026 — complex WHERE expressions

Tests: 1039 passing, 0 failing, 1 ignored (cargo test) — unchanged from handoff-15's baseline. The with pk fix is syntax-only, so the count did not move. The ignored test is the long-standing ```ignore doc-test in src/friendly/mod.rs. Typing-surface matrix: 152 cells (two renamed, none added/removed).

Clippy: clean (cargo clippy --all-targets -- -D warnings).

§1. What shipped

ADR-0026 — Complex WHERE expressions (6e42a11)

The C5a design. A stratified, recursive expression grammarAND / OR / NOT, comparisons (= != <> < <= > >=), LIKE, IS [NOT] NULL, IN, BETWEEN, parentheses — for update / delete / show data filters. show data gains an optional where and an optional limit <n> (a limit implies an implicit primary-key ORDER BY).

Key decisions (settled with the user — do not re-litigate):

  • In-grammar recursion (option B). A new Subgrammar(&'static Node) Node variant lets the grammar reference a fragment (incl. itself); the expression grammar is stratified to avoid left recursion. Not the opaque-leaf / pass-through approach.
  • MatchedPath stays flat. The expression fragment carries its own AST-fragment builder, invoked by the walker as it recurses — structured output "selectively", only where the grammar is recursive. A new recursive Expr AST.
  • SQL generation is parameterised (?-bound, type-converted literals); no raw-text pass-through. The displayed SQL renders literals inline and <> for inequality.
  • Permissive type handling. Type-mismatched comparisons and = NULL are flagged (highlight + hint), never block submission, and still run — this relaxes the current bind-time rejection.

ADR-0027 — Input-field validity indicator (032a050)

A debounced [ERR] / [WRN] marker at the input row's right edge, summarising — before submit — whether the current command would run. Backed by a walker diagnostics-severity model: ERROR = known to fail (parse error, unknown table/column); WARNING = valid but likely not intended (type mismatch, = NULL). Advisory only — never blocks submission. ~1 s debounce; the marker strip is reserved unconditionally (6 columns). Needs a new warning theme colour. The WARNING severity has no triggers until ADR-0026 is implemented.

ADR-0028 — Query plans (9aa7e2e)

QA1 + QA2. An explain prefix command over show data / update / delete running EXPLAIN QUERY PLAN (which never executes — so explaining a destructive command is safe). Renders an annotated tree; engine detail text verbatim; an annotation taxonomy (full scan / index search / covering index / PK lookup / automatic index — the standout teaching moment / temp B-tree). Introduces a styled-output-line mechanismOutputLine gains optional per-span styling, realising the per-span theming ADR-0016 deferred (its OOS-3). The explained SQL is shown above the tree as standard, copy-pasteable SQL.

with-pk grammar fix (d9a98bb)

create table … with pk column specs changed from name:type to name(type), matching add column's col(type) — column-type syntax is now consistent across the DSL. One grammar node (COL_SPEC: :( … )); build_create_table was unaffected (reads columns by role). Swept the test suite, the friendly catalog's usage templates, ADR-0009's example, and requirements.md. The : separating table from column in add column / drop column is unchanged.

Docs

  • New docs/simple-mode-limitations.md — a running list of what simple-mode DSL queries cannot express that advanced SQL can, seeded from ADR-0026 §10. It feeds the future Q4 SQL-subset spec. Grow it as new boundaries surface.
  • requirements.md: C5a [~][ ]; QA1 / QA2 updated and the stale QA1 note reconciled; new S6 (the validity indicator) and a new Documentation section with DOC1.

§2. Notes for the next agent

  • This session produced no implementation of the three ADRs. Each ADR has an ## Implementation notes section with a step-by-step build order — follow it.
  • The three ADRs interlock. ADR-0026's Subgrammar node is reused by ADR-0028's explain. ADR-0027's "general mechanism, single current consumer" shape is echoed by ADR-0028's styled-output-line mechanism.
  • Loose end: CLAUDE.md's "Things deliberately deferred" list still says QA1 "needs its own QA2 rendering ADR" — that ADR (0028) now exists. Reconcile the CLAUDE.md list against ADRs 0026/0027/0028 when convenient (a small edit).
  • The two follow-up ADRs the validity-indicator discussion spawned are done — ADR-0027 is the indicator ADR; the with pk fix is the other. No tracked follow-ups remain open from this session.

§3. What's next — implement ADR-0026 first

The three ADRs must be implemented. Recommended order:

  1. ADR-0026 (C5a) — the keystone. Its build order: (1) the Subgrammar node; (2) the expression grammar fragment + Expr AST + the fragment-builder; (3) wire into update / delete / show data; (4) Expr → parameterised SQL + implicit PK ORDER BY for limit; (5) schema-aware type-mismatch / = NULL flagging in the walker; (6) typing-surface matrix cells.
  2. ADR-0027 and ADR-0028 — in either order after 0026. ADR-0027's WARNING severity and ADR-0028's index-flipping plan payoff both depend on 0026's show data … where.

Other open clusters (unchanged from handoff-15 §4):

  • Snapshot / undo (U1/U2) — designed in ADR-0006, not built.
  • Constraints (C3NOT NULL / UNIQUE / CHECK / DEFAULT). CHECK can now reuse ADR-0026's expression grammar — the ordering problem that paused the constraints discussion this session is resolved.
  • m:n convenience (C4), modify relationship (C3a), table rename (C1).
  • Friendly error layer (H1), seeding (SD1), CI (TT5), session log + Markdown export (V4), multi-line input (I1), tutorials (TU1).

Prioritisation is a user product decision — ask.

§4. How to take over

  1. Read this file, then handoff-15 for the chain.
  2. Read CLAUDE.md — the working-style rules. This session escalated every design fork to the user before drafting each ADR.
  3. Read the three new ADRs — 0026, 0027, 0028 — including each one's ## Implementation notes. Then docs/simple-mode-limitations.md.
  4. Read docs/requirements.md — reconciled this session.
  5. Run cargo test — 1039 passing, 0 failing, 1 ignored.
  6. Run cargo clippy --all-targets -- -D warnings — clean.
  7. Start implementing ADR-0026 (§3). The three ADRs are design-complete; the forks are settled in the ADR text — build to them, don't re-open them.