You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Part of the v1.3.0 lookup feature. Design: docs/superpowers/specs/2026-07-10-lookup-columns-design.md (on release/v1.3.0). Builds on the LOOKUP qualifier issue.
Scope
grid-opencolumnTypes entries gain lookup + resolved options
Grid.ts: lookup columns edit via <select>; static cells keep showing the stored value (labels only inside the dropdown — the grid must not disagree with LIST/report output)
cellValidation.ts: membership check (exact, case-sensitive), running client-side and in Session's authoritative grid-edit re-check — the established two-sided pattern
REPLACE enforces membership on columns that declare a lookup (additive: no existing column declares one, so no existing program changes behavior)
Server re-resolves table lookups at write time (client lists may be stale)
Unresolvable/over-ceiling lookup: free text + warn, membership not enforced; APPEND RECORD still leaves NULL
Tests
Vitest: membership accept/reject via grid-edit and REPLACE; degradation cases (dropped source table must not lock the column)
Playwright: grid dropdown asserted with toBeInViewport() (the demos/overtime.prg — Overtime Tracking demo #46 clipping trap — a <select> inside an overflow: hidden cell); a rejected off-list REPLACE; screenshot inspected before believing it works
Part of the v1.3.0 lookup feature. Design:
docs/superpowers/specs/2026-07-10-lookup-columns-design.md(onrelease/v1.3.0). Builds on the LOOKUP qualifier issue.Scope
grid-opencolumnTypesentries gainlookup+ resolvedoptionsGrid.ts: lookup columns edit via<select>; static cells keep showing the stored value (labels only inside the dropdown — the grid must not disagree with LIST/report output)cellValidation.ts: membership check (exact, case-sensitive), running client-side and in Session's authoritativegrid-editre-check — the established two-sided patternREPLACEenforces membership on columns that declare a lookup (additive: no existing column declares one, so no existing program changes behavior)APPEND RECORDstill leaves NULLTests
toBeInViewport()(the demos/overtime.prg — Overtime Tracking demo #46 clipping trap — a<select>inside anoverflow: hiddencell); a rejected off-list REPLACE; screenshot inspected before believing it works