9.0 KiB
Session handoff — 2026-06-12 (68)
Sixty-eighth handover. Continues directly from handoff-67 (which
triaged a manual-testing pass into fixes + filed issues). This was an
issue-burndown session: six Gitea issues closed across five
commits, each landed with the full phased workflow + a /runda +
Devil's-Advocate pass before commit. Net: six issues closed, five
commits, +29 tests, zero regressions.
§1. State at handoff
Branch: main. Working tree clean; all work committed.
Five unpushed commits (push is the user's step).
Tests: 2436 passing / 0 failing / 0 skipped / 1 ignored (the
long-standing friendly doctest). Clippy clean (nursery, all
targets). Breakdown: 1730 lib + 506 integration (it) + 200
typing-surface-matrix. +29 over handoff-67's 2407.
Commits since handoff-67:
ee3ccd8 feat(hint): advertise the optional seed count in the hint panel (#26)
deb0948 feat(seed): year-as-int + conventional choice-set heuristics (#33, #34)
fde50ce fix(ui): mark sidebar focus with an accent colour, not bold (#25)
3d4a0fd fix(render): trim IEEE-754 noise from displayed decimal arithmetic (#32)
7e4bc12 fix(completion): treat a bare in-scope table alias as an alias, not an unknown column (#31)
§2. Issues closed this session (all committed, all tested, all /runda-reviewed)
Each closed on git.lazyeval.net/oli/rdbms-playground with a summary
comment. The /runda pass earned its keep on every one — see the
"DA caught" notes.
-
#31 (
7e4bc12) — bare table alias treated as unknown column. A bare in-scope table alias in a SQL expression (… GROUP BY o,oaliasingFROM Orders o) gotno such column o on table …and zero completions. Now: completion offers each FROM source's qualifier (alias-if-present-else-table) at a baresql_expr_identslot; thematched.len()==0arm emits a targetedalias_used_as_column/table_used_as_columnhint after the projection-alias check. DA caught two real bugs pre-commit: a DSL leak (the hint fired for simple-modeexpr_columnrefs, which have notable.columnsyntax) and wrong advice for an aliased-table-by-real-name — both fixed by gating onrole == "sql_expr_ident"+ matching the effective qualifier. ADR-0032 Amendment 3. -
#32 (
3d4a0fd) — decimal aggregation float noise.decimalis exact TEXT, but SQLite has no decimal type, so arithmetic coerces to IEEE-754 double;sum(price*qty)rendered298.59999999999997. Nowformat_real_display(db.rs) rounds REAL to 15 sig figs for display only, wired intoformat_cell. DA caught a real regression: I'd also wired it intorender_value, which is a canonical identity key for the uniqueness dry-runs (dry_run_unique,check_uniqueness_collisions) — rounding there would report collisions the exact-valued engine wouldn't. Revertedrender_valueto exact; locked with a regression test. CSV/FK-key/EXPLAIN paths stay exact. ADR-0005 Amendment 1. -
#25 (
fde50ce) — sidebar focus accent colour, not bold. Bold box-drawing glyphs render broken in asciinema casts.panel_border_stylenow uses a non-bold accent colour (theme.mode_simple); bold stays fine on text spans. DA caught that the issue's "Tier-2 snapshots need re-accepting" was wrong —render_to_stringis text-only, so no snapshot changed. Added a render-level test that inspects the actual border cells. User visually confirmed. ADR-0046 Amendment 1. -
#33 + #34 (
deb0948) — seed heuristics: year-as-int + choice sets. Two additive D7 catalogue rules. #33:year/*_year/published/founded→ boundedintyear (1950–2025, or thedob-style birth window 1945–2007 forbirth/born/dob); newYearRecent/YearBirthgenerators. Placed after the quantity rule soyear_countstays a count. #34: type-gatedPickFromsets forpriority/prio,severity,rating/stars;statusdeliberately excluded (user-confirmed on the issue — values too domain-specific).priorityleftENUM_TOKENS. A userIN-CHECK still wins. DA/process caught that I'd skipped reading the issue comments (where thestatusdecision + a website cast note lived) — lesson: always read issue comments. Also closed a pre-existing column-fill integration-test gap. ADR-0048 Amendment 1. -
#26 (
ee3ccd8) — optionalcountadvertised in the hint panel. Atseed <table> ▮onlyset/--seedchips showed; the optional row count (a bare positional number) was invisible, and the priorIntroProseattempt was reverted becausepending_hint_modeis cleared by the trailing optionals. Nowwalk_optionalstashes a skipped inner'sIntroProsekey into a newWalkContext.surviving_intro_hint(key + position) before the empty match clears it; a position guard (pos == cursor) stops it leaking past a laterset …clause or once the count is given. Tab still cycles the keywords. Prose mentions the count,.columncolumn-fill,set, and--seed(user-chosen scope). DA caught a coverage gap (advanced-mode path untested — seed runs in both modes); added the test. ADR-0022 Amendment 7.
§3. Open issues — next session's candidates
Four open, all on git.lazyeval.net/oli/rdbms-playground. All four
are interaction/UX design changes that need a decision or two from the
user up front — none is a pure mechanical fix. Read each issue body
and its comments before starting (the #33/#34 lesson).
-
#28 — Reconsider relationship prose in
add column(incidental DDL) confirmations (enhancement). Revisits a decided area → needs a new ADR superseding the relevant part of ADR-0016 §5 / ADR-0044 §1. User preference (from the issue): do not show theReferences:/Referenced by:block in the add-column confirmation. Confirm scope with the user (justadd column, or all incidental DDL). The highest-ceremony of the four. -
#27 — Bottom status line: keybindings-only, context- and state-aware; add
mode advancedto empty hint (enhancement). Per-nav-focus keybindings (Input vs sidebar), including transient states (Tab-cycle, history) per user preference. May warrant a small ADR. Touchessrc/ui.rsrendering + the nav-focus model (ADR-0046). -
#29 — Command input keystroke support. Esc / double-Esc to clear a partly-typed command; possibly Ctrl-A/Ctrl-E (Home/End). Relates to the deferred I1b readline shortcuts (
requirements.md). Needs a key-set decision from the user before coding. -
#30 — History brings back all commands in both modes. Advanced-mode history entries can't replay in simple mode; proposal: if we can distinguish them, prepend
:to reuse advanced history from simple mode. Interaction design; touches the input-history + mode model (ADR-0003).
No strong ordering. #28 is the only one that must produce an ADR. #29 is closest to "small once the key-set is decided." #27 and #30 are medium UX work.
§4. Carried-over follow-up (not a main-branch task)
- Website
seedcast re-record (from #34's comment thread). Thewebsitebranch ships aseedcast exercising aticketstable withpriority; now thatprioritycollapses tolow/medium/high, the cast should be re-recorded (cd website && pnpm casts seed, needs a../target/debugbinary) so the table tightens. The issue comment notes it is likely redundant — casts get a full re-record sweep before publication. Tracked on thewebsitebranch, not here.website/is not in themaintree.
§5. Other open roadmap (unchanged from handoff-67 §5)
seed is feature-complete (requirements.md SD1/SD2 [x], now with
the #33/#34 catalogue refinements noted inline). User's call:
- H2
hint— the last A1 gap (its own ADR). - TT5 CI — test infra exists; no CI workflow yet (the
cibranch exists — check its state before starting). - TT4 PTY (Tier-4) — ADR-0008 specifies it; not wired.
- Larger: V4 journal, tutorial/lesson system (each needs an ADR).
§6. How to take over
- Read handoffs 66 → 67 → 68,
CLAUDE.md,docs/requirements.md. - Confirm green baseline:
cargo test(expect 2436 pass / 1 ignored)cargo clippy --all-targets(clean).
- Pick from §3 (#28/#27/#29/#30). For each, read the issue body AND its comments before designing, and escalate the design fork to the user before coding — all four have genuine UX decisions. #28 needs a new ADR.
- Follow the project workflow: phased (requirements → divergent →
eval → execute → verify), test-first (failing test before the fix),
/runda+ DA pass before every commit, ADR amendment for any decided-area change + the README index-upkeep rule, and confirm the commit message with the user before committing. - Consider a
cargo sweepat this milestone (target/grows across sessions; see CLAUDE.md "Build hygiene").