diff --git a/docs/handoff/20260612-handoff-68.md b/docs/handoff/20260612-handoff-68.md new file mode 100644 index 0000000..ec65611 --- /dev/null +++ b/docs/handoff/20260612-handoff-68.md @@ -0,0 +1,173 @@ +# 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. + +1. **#31 (`7e4bc12`) — bare table alias treated as unknown column.** + A bare in-scope table alias in a SQL expression (`… GROUP BY o`, + `o` aliasing `FROM Orders o`) got `no such column o on table …` and + zero completions. Now: completion offers each FROM source's + *qualifier* (alias-if-present-else-table) at a bare `sql_expr_ident` + slot; the `matched.len()==0` arm emits a targeted + `alias_used_as_column` / `table_used_as_column` hint after the + projection-alias check. **DA caught** two real bugs pre-commit: a + DSL leak (the hint fired for simple-mode `expr_column` refs, which + have no `table.column` syntax) and wrong advice for an + aliased-table-by-real-name — both fixed by gating on + `role == "sql_expr_ident"` + matching the *effective qualifier*. + ADR-0032 Amendment 3. + +2. **#32 (`3d4a0fd`) — decimal aggregation float noise.** `decimal` + is exact TEXT, but SQLite has no decimal type, so arithmetic + coerces to IEEE-754 double; `sum(price*qty)` rendered + `298.59999999999997`. Now `format_real_display` (db.rs) rounds REAL + to 15 sig figs **for display only**, wired into `format_cell`. + **DA caught** a real regression: I'd also wired it into + `render_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. Reverted `render_value` to exact; locked with a + regression test. CSV/FK-key/EXPLAIN paths stay exact. ADR-0005 + Amendment 1. + +3. **#25 (`fde50ce`) — sidebar focus accent colour, not bold.** Bold + box-drawing glyphs render broken in asciinema casts. + `panel_border_style` now 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_string` is text-only, so no snapshot changed. Added a + render-level test that inspects the actual border *cells*. + User visually confirmed. ADR-0046 Amendment 1. + +4. **#33 + #34 (`deb0948`) — seed heuristics: year-as-int + choice + sets.** Two additive D7 catalogue rules. **#33:** `year`/`*_year`/ + `published`/`founded` → bounded `int` year (1950–2025, or the + `dob`-style birth window 1945–2007 for `birth`/`born`/`dob`); new + `YearRecent`/`YearBirth` generators. Placed *after* the quantity + rule so `year_count` stays a count. **#34:** type-gated `PickFrom` + sets for `priority`/`prio`, `severity`, `rating`/`stars`; `status` + **deliberately excluded** (user-confirmed on the issue — values too + domain-specific). `priority` left `ENUM_TOKENS`. A user `IN`-CHECK + still wins. **DA/process caught** that I'd skipped reading the issue + *comments* (where the `status` decision + a website cast note lived) + — **lesson: always read issue comments**. Also closed a + pre-existing column-fill integration-test gap. ADR-0048 Amendment 1. + +5. **#26 (`ee3ccd8`) — optional `count` advertised in the hint panel.** + At `seed