Files

10 KiB
Raw Permalink Blame History

Session handoff — 2026-06-14 (69)

Sixty-ninth handover. Continues from handoff-68 (an issue-burndown that closed #25/#26/#31/#32/#33/#34). This session closed the four remaining open issues — #29, #28, #27, #30 — each landed with the full phased workflow + /runda + Devil's-Advocate passes before commit, and each producing a new ADR. Net: four issues closed, four commits, four new ADRs (00490052), +63 tests, zero regressions, the tracker is now empty.

The four interlock: #29 added the input-field readline keys, #27 advertises them in a state-aware status strip, and #30's history recall now respects modes. #30 also turned into a real architecture change (journaling relocation) — read §2.4 carefully before touching that area.

§1. State at handoff

Branch: main. Working tree clean; all work committed. The two most recent commits are local (normal working state — push is the user's step).

Tests: 2471 passing / 0 failing / 0 skipped / 1 ignored (the long-standing friendly doctest). Clippy clean (nursery, all targets). Breakdown: 1771 lib + 500 integration (it) + 200 typing-surface-matrix. +35 over handoff-68's 2436 (net: #29 +22, #28 +0, #27 +9, #30 +4 — its new history.rs/app.rs/iteration6 tests minus the 15 retired worker-journaling tests; trust the live cargo test count).

Commits this session:

4aeea55 feat(history): mode-tagged history + top-of-chain journaling (#30)
eceedc1 feat(ui): context- and state-aware bottom keybinding strip (#27)
8ac3537 feat(render): incidental-DDL confirmations show structure only, no relationships (#28)
66c8bda feat(input): readline keymap — Esc-clear + Ctrl-A/E/W/K/U (#29)

Open Gitea issues: none. tea issues list --state open is empty.

§2. Issues closed this session (all committed, tested, /runda-reviewed)

Each closed on git.lazyeval.net/oli/rdbms-playground with a summary comment.

2.1 — #29 (66c8bda) — input-field readline keymap (ADR-0049)

Implements the deferred I1b readline shortcuts: Esc clears a partly-typed command (only when no completion memo is alive — the memo wins first, ADR-0022); Ctrl-A/Ctrl-E = Home/End; Ctrl-W deletes the previous word (readline-style, UTF-8 safe); Ctrl-K/Ctrl-U kill to end/start. Cursor-only keys leave history nav intact; buffer-mutating keys end it. DA caught the need for the Ctrl-O+Esc (sidebar nav-exit) interaction not to clear the draft — locked with a regression test. requirements.md I1b → [x].

2.2 — #28 (8ac3537) — incidental-DDL confirmations: structure-only (ADR-0050)

Incidental-DDL confirmation echoes (create table, add/drop/ rename/change column, add/drop index) now render structure only — no References: / Referenced by: block. Relationship-subject surfaces (show table, add/drop relationship) keep their ADR-0044 diagrams. The prose renderer (relationship_prose_lines + cols_disp) was deleted. Supersedes ADR-0044 §1's incidental-DDL prose clause and the relationship-block half of ADR-0016 §5 (both annotated).

2.3 — #27 (eceedc1) — context- and state-aware keybinding strip (ADR-0051)

The bottom status line is now keystrokes-only and state-selected by priority (sidebar focus / completion-memo / history-nav / editing / default). The editing state surfaces the #29 keys (closing ADR-0049's deferred advertisement). Mode-switch advertisements left the strip; the empty-input hint gained a simple-mode `mode advanced` for SQL pointer (advanced mode shows none — user decision). New App::is_browsing_history() exposes the private history_cursor. 15 full-panel snapshots re-accepted.

2.4 — #30 (4aeea55) — mode-tagged history + top-of-chain journaling (ADR-0052) ← read before touching journaling

Closed both the feature (advanced history reusable in simple mode) and the bug (the : one-shot prefix lost across sessions). Two halves:

  1. Mode-tagged history. The history.log status token gains an optional :adv suffix (ok / ok:adv / err / err:adv); source stays last + canonical so replay is unaffected. The in-memory ring (still Vec<String>) stores advanced entries in their : -prefixed simple-mode runnable form; recall strips the : in advanced mode and keeps it in simple; hydration reconstructs the prefix from the tag. App commands journal simple and are excluded from the ring's advanced flag, so they recall bare.

  2. Journaling relocation (the architecture change). Success journaling moved out of the worker to the dispatch layer (spawn_dsl_dispatch / run_replay / the app-command sites), next to the already-top-level failure journaling — so the submission mode is in scope with no worker plumbing. finalize_persistence now writes only the state sources (yaml/csv); the journal write is best-effort (the command is already committed — consistent with the failure path). Amends ADR-0015 §6 (history.log out of the worker tx; commit-db-last scopes yaml/csv/db only), ADR-0034 (status tag + journaling location), ADR-0040 (journal-write best-effort, not fatal).

    Two DA findings, both resolved: (a) the app-command advanced flag must exclude app commands (else : save as diverges); (b) the spawn journals on outcome.is_ok(), so journaling is now uniform — read commands that didn't journal before (show tables/show relationships/ show indexes, show relationship <name>, explain) now do, matching ADR-0034 §1. User-confirmed as the more-correct behaviour (harmless on replay — reads/explain don't mutate).

    Test migration: 15 worker-level journaling tests were retired (the worker no longer journals — their yaml/csv/operation assertions were kept) and re-covered at the new layer: history.rs status-tag + :-reconstruct; app.rs recall matrix; the cross-session regression advanced_command_journalled_then_hydrated_recalls_with_colon_in_simple in iteration6_resume_history; the replay tests cover run_replay journaling.

    Plan: docs/plans/20260613-issue-30-top-of-chain-journaling.md.

§3. Next session — start here

The user's stated plan for the next session, in order:

  1. Pick up the ADR-0052 follow-up (below).
  2. Check for any newly-filed open issues (tea issues list --state open) — none at handoff, but check fresh.
  3. Then take on remaining open tasks from the general requirements (docs/requirements.md) — see §5.

The ADR-0052 follow-up — unwind the vestigial worker source plumbing

When journaling moved out of the worker, the source that the worker threaded purely for journaling became dead. To avoid orphaning the param across ~28 handlers, the refactor left it in place as vestigial:

  • finalize_persistence(conn, persistence, _source, changes) — the _source param is now unused (kept so its ~28 callers still pass source, which they otherwise also use for snapshot_then).
  • do_rebuild_from_text(conn, _persistence, _source, project_path) — both _persistence and _source vestigial.
  • Three thin read-only wrappers in db.rsdo_describe_table_request, do_query_data_request, do_run_select_request — now just delegate to their non-_request twin (do_describe_table / do_query_data / do_run_select) with vestigial _persistence / _source params and one caller each (db.rs Request arms ~2409 / ~2749 / ~2759).

The cleanup: remove _source from finalize_persistence + drop the arg at its ~28 callers (the callers keep source for snapshot_then, so only the finalize_persistence(...) call loses the arg); remove the _persistence/_source params from do_rebuild_from_text; and inline the three *_request wrappers at their single call sites (replace do_describe_table_request(conn, persistence, source, name) with do_describe_table(conn, &name), etc.), deleting the wrappers. Purely mechanical, compiler-guided, no behaviour change. Establish the green baseline first (cargo test), then verify nothing moved.

§4. Carried-over follow-up (website branch, not main)

  • Website seed cast re-record (from #34, handoff-68 §4) — still tracked on the website branch, not here. Likely redundant (full re-record sweep before publication).

§5. Remaining roadmap — docs/requirements.md (next session's §3-step 3)

With the issue tracker empty, the next work comes from the document-based requirements. Open / partial items worth weighing (the user picks):

  • H2 hint — the last A1 gap (contextual help for the current command); its own ADR. (requirements.md H2.)
  • TT5 CI — runs all tiers on Linux/macOS/Windows; no CI workflow yet (a ci branch reportedly exists — check its state first). Couples with D1D3 (cross-platform prebuilt binaries + Homebrew/Scoop).
  • TT4 PTY (Tier-4) — ADR-0008 specifies the PTY harness + four critical flows; still not wired (no PTY deps/tests).
  • I1 multi-line input (Ctrl-Enter submits, Enter inserts newline) and I5 / B3 in-flight cancellation (Ctrl-C cancels a running command).
  • V4 session journal — scrollable per-session log + Markdown export (the bigger UX project; own ADR).
  • TU1 tutorial / lesson system — design + ADR pending (acknowledged in scope).
  • Smaller partials: C3a modify relationship (drop+add covers it today), C4 m:n convenience, V3 ER-diagram export, the NFR-* performance/visual targets (mostly unmeasured), N4 global rolling history (OOS for v1).

No strong ordering — these are the user's call. Several need a new ADR (H2, V4, TU1); CI/release (TT5/D1D3) is the most "shippable-product" track if that's the priority.

§6. How to take over

  1. Read handoffs 67 → 68 → 69, CLAUDE.md, docs/requirements.md.
  2. Confirm green baseline: cargo test (expect 2471 pass / 1 ignored)
    • cargo clippy --all-targets (clean).
  3. tea issues list --state open — pick up anything new first.
  4. Then the ADR-0052 follow-up (§3), then requirements (§5).
  5. Follow the project workflow: phased (requirements → divergent → eval → execute → verify), test-first, /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.
  6. Consider a cargo sweep at this milestone (target/ grows across sessions; see CLAUDE.md "Build hygiene"). (sweep.timestamp was removed this session.)