Spec: docs/superpowers/specs/2026-08-23-web-ui-rewrite-design.md § What this deletes.
Depends on #537 (parity) and #540. Last issue in the milestone, deliberately.
Removes keel/commands/tui.py (5,063 lines) and tests/commands/test_tui.py (4,369) — ~9,432 lines, which answers #525 ("keel/commands/ is 23,188 lines — larger than the engine it drives") directly.
"But SSH" is not a reason, and keel's own documentation refutes it three ways
- There is no server deployment profile. The four profiles are trading profiles — live, paper, paper-hourly, paper-equities — not topologies.
- A headless live cycle already fails closed. Confirm mode "waits for a typed
y at a terminal" (docs/operator-runbook.md:365).
- No remote surface exists at all — "Notify-only, by design. There is no remote control surface — no command, query or capability arrives through notifications, ever" (
docs/operator-runbook.md:864).
And granting a headless host anyway, ssh -L 8765:127.0.0.1:8765 host forwards the web interface to a local browser: full UI, encrypted by SSH, still a secure context because it is localhost at the reading end, no curses anywhere. keel status covers the rest from a plain shell. windows-curses is unmaintained besides — the desktop PRD already noted D2 would remove the need for it.
Why deletion is safe structurally
tui.py imports from keel.commands.{activity,admission,status} — it is a front-end over the shared report builders, not their owner. Removing it never touches what the web UI reads.
Two gates, and they are why this is last
Gate 1 — parity. D2 (#435) requires parity with the TUI's read surface before the write surface widens. tests/commands/test_tui.py is the specification of what is being ported: it records what each screen shows and when. #537's PR carries the parity checklist against it; this issue verifies against that checklist, not against memory.
Gate 2 — nobody gets stranded. Once the TUI is gone the browser is the only interactive surface. Everything previously reachable only through it must be reachable through the browser — with the #436 GUI human gate where a capability increases — or deliberately CLI-only. Otherwise a non-technical user hits a step that needs a terminal, which undoes the point of the exercise.
Enumerate against keel capabilities and confirm coverage. Do not assume it.
Also removed
help_console.py's glossary reader, once #539 has moved documentation to outbound links and the TUI is no longer a consumer.
Acceptance
Spec:
docs/superpowers/specs/2026-08-23-web-ui-rewrite-design.md§ What this deletes.Depends on #537 (parity) and #540. Last issue in the milestone, deliberately.
Removes
keel/commands/tui.py(5,063 lines) andtests/commands/test_tui.py(4,369) — ~9,432 lines, which answers #525 ("keel/commands/is 23,188 lines — larger than the engine it drives") directly."But SSH" is not a reason, and keel's own documentation refutes it three ways
yat a terminal" (docs/operator-runbook.md:365).docs/operator-runbook.md:864).And granting a headless host anyway,
ssh -L 8765:127.0.0.1:8765 hostforwards the web interface to a local browser: full UI, encrypted by SSH, still a secure context because it is localhost at the reading end, no curses anywhere.keel statuscovers the rest from a plain shell.windows-cursesis unmaintained besides — the desktop PRD already noted D2 would remove the need for it.Why deletion is safe structurally
tui.pyimports fromkeel.commands.{activity,admission,status}— it is a front-end over the shared report builders, not their owner. Removing it never touches what the web UI reads.Two gates, and they are why this is last
Gate 1 — parity. D2 (#435) requires parity with the TUI's read surface before the write surface widens.
tests/commands/test_tui.pyis the specification of what is being ported: it records what each screen shows and when. #537's PR carries the parity checklist against it; this issue verifies against that checklist, not against memory.Gate 2 — nobody gets stranded. Once the TUI is gone the browser is the only interactive surface. Everything previously reachable only through it must be reachable through the browser — with the #436 GUI human gate where a capability increases — or deliberately CLI-only. Otherwise a non-technical user hits a step that needs a terminal, which undoes the point of the exercise.
Enumerate against
keel capabilitiesand confirm coverage. Do not assume it.Also removed
help_console.py's glossary reader, once #539 has moved documentation to outbound links and the TUI is no longer a consumer.Acceptance
tui.pyandtest_tui.pyare gone;keel tuino longer exists as a command.keel capabilitiesis reachable through the browser or is documented as intentionally CLI-only — enumerated, not assumed.windows-cursesis dropped from dependencies wherever it appears.keel/commands/line count is recorded before and after, and keel/commands/ is 23,188 lines — larger than the engine it drives #525 is updated with the result.