Captures this session's three committed fixes (flag-completion dash, table-alias validity, `:` one-shot live feedback), the two investigated-as-designed findings (comma-FROM, aggregate-without-GROUP BY), and points the next session at the filed enhancement issues (#26 seed-count hint, #27 bottom status line, #28 add-column relationship prose) plus the standing roadmap.
6.1 KiB
Session handoff — 2026-06-12 (67)
Sixty-seventh handover. Continues directly from handoff-66 (ADR-0048
seed Phase 2, committed). This was a manual-testing pass: the user
exercised the app, found several rough edges, and we triaged each into
fix now vs file an issue. Net result: three bug fixes committed
and three enhancement issues filed.
§1. State at handoff
Branch: main. Working tree clean; all work committed. Unpushed
(push is the user's step).
Tests: 2407 passing / 0 failing / 0 skipped / 1 ignored (the
long-standing friendly doctest). Clippy clean (nursery, all
targets). +7 over handoff-66's 2400.
Commits since handoff-65:
f7155ce fix(input): thread the `:` one-shot escape into live SQL feedback
4cacb82 fix(completion): don't flag a table alias used before its FROM clause
c3e0103 fix(completion): flag-aware partial so a dash completes flags, not keywords
30b2677 docs: ADR-0048 Phase 2 implemented + handoff 66
a12facc feat(seed): set override clause + column-fill (ADR-0048 Phase 2)
(a12facc/30b2677 are the Phase-2 work documented in handoff-66.)
§2. Bug fixes this session (all committed, all tested)
-
c3e0103— flag completion ate the dash. Typing a flag at a flag position (add 1:n relationship … -) offered theonkeyword and, on accept, produced-on/---create-fk: the partial-token walk stopped at-, so the dash was outside the replaced range. Fix: flag-aware partial detection (a dash-prefixed token at a word boundary is a flag-in-progress, gated on a flag being expected sowhere x = -5stays a number) + a unified flag matcher (trim_start_matches('-')). Affected all flags. 4 tests + 2 partial-flag snapshots updated (they'd captured the latent bug). -
4cacb82— table alias flagged as an unknown column. In a SELECT, the projection (sum(ol.count*…)) can reference an alias whoseFROM … OrderLines olsits after the cursor. The candidate engine recovers that via the §10.6 full-input lookahead (ADR-0032), butinvalid_ident_at_cursoronly walked text before the cursor — soolmatched no scope and got a red "ERR" overlay on an otherwise valid query. Fix: give the validity check the same full-input lookahead and bail when the partial prefix-matches a binding's alias or table. 1 test. -
f7155ce— the:one-shot escape broke live SQL feedback. Submission strips the:(ADR-0003), but the live feedback kept it in the buffer handed to the walker, which bailed at the:. Effect: under:, Tab completed nothing and a valid query could flash[ERR]— while the same line in fullmode advancedworked. (The hint already stripped it, hence "hint shows the name but Tab does nothing".) Fix: one sharedApp::feedback_view()(the:-stripped SQL + mapped cursor + stripped offset) routed through completion (with areplaced_rangeoffset shift), the validity verdict, and rendering (newrender_input_runs_feedbackhighlights/overlays the view shifted by the offset; the:renders as plain text); the ambient hint was consolidated onto it (removing the duplicatestrip_one_shot_prefix). 3 tests + the 9 existing colon tests still green.
§3. Investigated, no code change (working as designed)
- Comma-
FROMimplicit join (select … from A, B, C) is deliberately rejected — ADR-0032 §11 / OOS-3: "comma-FROM teaches habits we do not want to encourage;CROSS JOINcovers the same shape explicitly." The explicit equivalent (CROSS JOIN … WHERE …) works. sum(…)returning one row with noGROUP BYis correct SQL (the aggregate collapses the result to one row; SQLite/the playground allow the non-aggregated columns where Postgres would error). The user's query neededgroup by o.id. Verified (1 row).
§4. Open issues filed this session — next session's candidates
All on git.lazyeval.net/oli/rdbms-playground, label enhancement:
- #26 —
seed <table>hint omits the optional count. A complete command's optional positional number has no Tab candidate, so it's invisible.IntroProsedoesn't fit (it only fires for incomplete required slots; the completing Seq match clears the hint). Needs a way to advertise optional positional non-keyword args. (I attempted + reverted this during Phase 2; see the analysis in the issue.) - #27 — Bottom status line: keybindings-only, context- and
state-aware. Per-nav-focus keybindings (Input vs sidebar), include
transient states (Tab-cycle, history) — user preference — and add
mode advancedto the empty-input hint. May warrant a small ADR. - #28 — Reconsider relationship prose in
add column(incidental DDL) confirmations. Currently by design (ADR-0044 §1 keeps prose, not diagrams, for incidental DDL). User preference: do NOT show theReferences:/Referenced by:block in the add-column confirmation at all — focus on the change just made. This revisits a decided area → land as a new ADR superseding the relevant part of ADR-0016 §5 / ADR-0044 §1; confirm scope (justadd column, or all incidental DDL).
§5. Other open work (unchanged from handoff-66 §6)
seed is feature-complete (requirements.md SD1 [x], SD2 [x]).
Remaining roadmap, user's call:
- H2
hint— the last A1 gap (its own ADR). - TT5 CI — test infra exists; no CI workflow yet.
- TT4 PTY (Tier-4) — ADR-0008 specifies it; not wired.
- Larger: V4 journal, tutorial/lesson system (each needs an ADR).
A possible quick follow-up: a friendlier "use an explicit JOIN"
parse-error for comma-FROM (point 1) — not filed; mention if wanted.
§6. How to take over
- Read handoffs 65 → 66 → 67,
CLAUDE.md,docs/requirements.md. seedPhase 2 is done (ADR-0048 Status block is current). The manual-testing fixes (§2) are committed and green.- Pick from §4 (filed issues #26/#27/#28) or §5 (roadmap). #28 is a decision/ADR; #27 is UX (maybe ADR); #26 is a hint-system enhancement.
- Consider a
cargo sweepat this milestone (target/grows across sessions).