plans/ held 58 documents and exactly one said whether it was open. The rest
mixed finished work, reviews of shipped work, parked specs and genuinely
pending ones, with nothing distinguishing them, so "how many plans are in
the queue" had no answer short of reading all 58.
Now `grep -H '^Status:' plans/*.md` is the answer:
50 done 3 in progress 2 planned 2 reference 1 parked
Statuses were derived rather than guessed: CLAUDE.md's own built list and
"What's NOT built yet" section, plus checking the subject exists in the
code. A review of work that shipped counts as done -- it records what was
found, it is not a request for anything. `reference` separates the two docs
that are conventions rather than work items (admin-design-standards,
admin-work-framework), which otherwise read as permanently-open plans.
The vocabulary is deliberately five words. A larger one invites "mostly
done" and "blocked-ish", which is how the directory became unreadable.
test_plans_declare_status.py keeps it from rotting: a new plan without a
marker fails, as does an unknown status, one buried below the eighth line,
or an open status with no reason -- "planned" alone is the state that rots,
since nobody can tell later whether it waits on a decision, a dependency,
or just nobody's turn.
Also updates the sweep plan with what landed and what did not, including
that #9 was not a defect.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VRQXz5SYZYVWscxS1QqF6U
76 lines
3.6 KiB
Markdown
76 lines
3.6 KiB
Markdown
# Plan: tui-panel-polish
|
|
|
|
Status: done -- current TUI panels
|
|
|
|
**What you'll get:** All 5 panels get consistent bordered containers with
|
|
visible gaps. Verdict Mix popup goes from 40→50 chars so the table renders
|
|
properly.
|
|
|
|
**Why:** Panels are flat widgets (`<Static title>\n<DataTable>`) with no
|
|
containers, no margins. Only the quota panel uses a `Vertical` container.
|
|
Boring fix: wrap everything in `Vertical{border, margin-top: 1}` — same
|
|
pattern that already works for quota.
|
|
|
|
**Not doing:** No Grid, no Horizontal, no Footer, no colors/themes, no new
|
|
features, no backend changes.
|
|
|
|
**Effort:** Short | **Risk:** Low | **Files:** `tui.py` + `tui_screens.py` only
|
|
|
|
## Todos
|
|
|
|
| # | Scope |
|
|
|---|-------|
|
|
| 1 | Wrap all 5 panels in bordered `Vertical` containers with `margin-top: 1` on 4 new ones |
|
|
| 2 | CSS: `.panel-title` margin 1→2, add `margin-top: 1` selectors for new containers |
|
|
| 3 | `VerdictMixScreen` width: 50 (was 40) |
|
|
| 4 | Warnings render: target inner `#warnings-content` `Static` instead of `#warnings-panel` |
|
|
| 5 | `python -m pytest tests/test_tui.py -v` — fix DOM mismatches |
|
|
| 6 | Import smoke test: all 3 modules, exit 0 |
|
|
|
|
## Success criteria
|
|
|
|
1. All 5 panels bordered consistently
|
|
2. ≥1-line gap between each panel border
|
|
3. Warnings panel matches border style
|
|
4. `VerdictMixScreen` table renders without cramped wrapping
|
|
5. `tests/test_tui.py` — 0 failures
|
|
6. No new lint warnings
|
|
|
|
---
|
|
|
|
## Quick sanity check against the current code (not a full review — flagging one gap before execution)
|
|
|
|
Verified the plan's diagnosis directly against `tui.py`/`tui_screens.py`,
|
|
since it's cheap and this is about to be executed:
|
|
|
|
- **Confirmed accurate:** only `quota-panel` is wrapped in a `Vertical`
|
|
today (`tui.py:209`); the other four panels really are a bare
|
|
`Static(..., classes="panel-title")` immediately followed by a
|
|
`DataTable`/`Static` with no wrapping container (`tui.py:212-219`).
|
|
`VerdictMixScreen { width: 40; }` is exact (`tui_screens.py:83`).
|
|
- **Todo 4 is necessary, not optional:** `#warnings-panel` is currently the
|
|
`Static` itself (`tui.py:219`), and two call sites type it as `Static`
|
|
directly — `query_one("#warnings-panel", Static).can_focus = True`
|
|
(`tui.py:317`) and the render path at `tui.py:527`. Once todo 1 makes
|
|
`#warnings-panel` the new *outer* `Vertical` container (to keep the
|
|
`_panels`/number-key focus list at `tui.py:194-200` pointing at the right
|
|
id), both of those call sites break unless they're repointed at a new
|
|
inner `#warnings-content` `Static` — todo 4 catches exactly this, good.
|
|
|
|
- **One thing the plan doesn't address:** `DataTable` already has its own
|
|
border today — `DataTable { border: round $primary; ... }`
|
|
(`tui.py:145-149`), a blanket rule hitting all three table panels
|
|
(decision/model/category). `#quota-panel` gets its border from the
|
|
*wrapping* `Vertical` (`tui.py:150-154`), and its children
|
|
(`quota-progress`/`quota-legend`) have no border of their own — so quota
|
|
has exactly one border today. If todo 1 wraps the three `DataTable`
|
|
panels in a new bordered `Vertical` without also dropping the
|
|
`DataTable`'s own `border: round $primary`, those three panels will end
|
|
up with two nested rounded borders (the new wrapper's + the table's
|
|
existing one), while quota and warnings get one — the opposite of success
|
|
criterion 1 ("bordered consistently"). Worth folding into todo 1 or 2:
|
|
either remove the border from the blanket `DataTable` rule (letting the
|
|
new wrapper supply it uniformly) or give the wrapper no border for those
|
|
three and rely on the table's own — either works, but the plan should say
|
|
which before execution rather than leaving it to be discovered mid-todo.
|