feat(tui): catch the dashboard up to the schema #33
Reference in New Issue
Block a user
Delete Branch "feat/tui-overhaul"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Five columns shipped to
route_decisionsacross recent merges and nonereached the dashboard. The decision table had no timestamp at all.
The load-bearing part is the drift test, not the columns
tests/test_tui_schema_drift.pydiffsPRAGMA table_info(route_decisions)against two explicit registries —
SCHEMA_TO_MODEL_KEYS(the surfacingdecision) and
UNSURFACED_COLUMNS(deliberately not shown, empty today).A new column must land in one or the other or the test fails naming the
column, in both directions.
Live proof the drift is real:
tests/test_route_decisions.py's ownhand-maintained column list had already drifted, missing
request_id. Fixedhere.
Catch-up
timefirst (shortHH:MM:SSlocal — the date is almostalways today and would crowd out
selected),profileafterctx, andflexbecomesflags, composing the flex label with anEmarker forepsilon-greedy picks. An exploratory pick is a random sample, not the
ranking's judgement, and must be distinguishable.
profile,exploration,pinch_original_tokens,pinch_final_tokens,request_id,session_key.profilerenders blank rather than the literal"None", which in a densetable reads as a real profile name.
Quota panel (unblocked by #30)
Leads with
balance $X left · burn $Y/h · runway ~Nh; the plan-percentage baris demoted. Wired outside the plan-configured gate on purpose — the credit
balance is meaningful whether or not a kWh plan is set.
burn/runwayare legitimatelyNonewhen the segment is too short toextrapolate. On the live deployment that is the current state, so it is
the first thing an operator sees, not an edge case: the lead says
burn n/aand
#quota-notecarriesrunway_noteverbatim. Tests assert it is neverblank, never a bare
0, neverNone.Warning-class tripwire
tests/test_tui_warnings.pyregisters all 10 classes (including PR #31'scapability sub-ceiling and both rejection prefixes) and asserts both
directions: every registered class fires against a fixture that provokes all
ten, and every emitted warning is registered — the second failing with the
RAW warning text, because the point is that nobody knew the class existed.
That is the 2026-09-04 vision-ceiling failure mode: computed correctly, never
displayed.
Verification
local_energy.enabledboth true and false.textualstill imported only by TUI modules.config/config.local.yamlbyte-identical (cc3d4c2a…).dispatcher.py,routing.py,admin.py,tui_screens.py,tui_sse.pyand
config/config.yamluntouched..omo/evidence/tui-overhaul/.Known interaction
classifier-fallback-cascadeadds a degraded-source warning class. When itlands,
test_every_emitted_warning_belongs_to_a_registered_classwill failuntil a matcher is added — that is the tripwire working. The fix is one
matcher entry, not disabling the test.