Add aligned users table

This commit is contained in:
2026-10-26 23:41:24 +02:00
parent ecc5c83d78
commit 6d8d6d572d
3 changed files with 608 additions and 61 deletions
+79 -1
View File
@@ -3465,12 +3465,90 @@ HEAD to `18f28ee` while M11.1 was underway; the review covered committed and
uncommitted M11 inputs. This team created no commit. No Alpine, VM or
production behavior is claimed. Stop after this milestone.
### Milestone 12 — Aligned, responsive client table
Status: accepted (2026-10-26T21:39:45Z). M11 is accepted; M9 remains
retired and unaccepted. The user requested this scoped presentation change.
#### Outcome and scope
Render client records with Ratatui's native `Table` and explicit column
constraints. Show `State`, `Name`, `Public key`, `Mode`, and `Allowed IPs`
headers when width permits. Keep columns aligned across short/long and Unicode
aliases, supported and inspection-only peers, and all draft states. Truncate
predictably by terminal cell width. At narrow widths prioritize State and Name,
then omit or shrink secondary columns while preserving Enter access to full
peer details. Retain diagnostics, document-level issue rows, draft-removal
information, selected-row highlight, keyboard navigation, and the M10 bottom
shortcut panel. This milestone changes rendering only; parser, projection,
validation, persistence, allocation, restart and VPN behavior are unchanged.
#### Context and steps
`src/tui/render.rs::render_list` currently builds variable-length `ListItem`
strings, so columns drift with alias/state length. `UiState` and
`src/tui/terminal.rs` select real peers by `peer_index`; draft-removal and
document-issue rows are appended after peer rows and are not peer selections.
Keep that row order and mapping when replacing the widget with `Table`.
`detail_lines` already retains full peer public key, alias, routes and issues.
The list must continue escaping untrusted display text. Use the existing
approved `ratatui` dependency and its terminal-width APIs; do not add a direct
Unicode-width crate or literal tab delimiters.
| Task | Owner | Scope and expected result | State |
| --- | --- | --- | --- |
| M12.1 | implementer | Replace list rendering with responsive Ratatui Table, preserve peer selection mapping, state/diagnostic information and footer; add focused mixed-width/Unicode/long-route/empty/narrow tests. | complete: render 20/20, terminal 8/8, TUI workflow 6/6 on final integrated source |
| M12.2 | reviewer / repairer | Fresh independent review of layout, truncation, details access, draft/document rows and navigation; repair and re-review actionable findings. | complete: R1–R4 repaired and independently re-reviewed closed; no remaining actionable finding |
| M12.3 | coordinator | Verify integrated files, run focused and Rust completion gates, record evidence and accept only if criteria pass. | complete: all Rust completion gates passed; source fingerprints/results in [M12 evidence](docs/evidence/milestone-12.md) |
#### Acceptance and validation
- [x] M12-A1: native Table has the five requested headers at ordinary width;
row columns align across mixed alias lengths, states, duplicate aliases,
supported and inspection-only peers, with no literal tabs.
- [x] M12-A2: Unicode aliases and long values truncate at display-cell
boundaries without corrupting adjacent columns; full peer alias, public key,
routes and diagnostic explanations remain in details.
- [x] M12-A3: 120×30, 80×24, 40×8, 34×8 and below-minimum layouts retain
visible State/Name at supported sizes, adapt or omit secondary columns,
preserve the M10 footer and readable resize fallback.
- [x] M12-A4: Up/Down highlight and Enter-to-details stay tied to the selected
peer (including unsupported/malformed peers), without enabling mutation;
empty lists, draft additions/removals and document issues remain readable
and do not disturb selection alignment.
- [x] M12-A5: focused synthetic render/navigation tests and applicable Rust
completion gates pass; independent review closes actionable findings.
Planned checks: `cargo test --locked tui::render`,
`cargo test --locked tui::terminal`, `cargo test --locked --test tui_workflow`,
`cargo fmt --all -- --check`, `cargo clippy --locked --all-targets -- -D
warnings`, `cargo test --locked`, `cargo build --locked --release`, and
`git diff --check`. Synthetic Ratatui/PTY evidence only; no Alpine, VM,
production, or live VPN checks are required for this presentation change.
#### Outcome
Accepted for scoped TUI presentation. **M12-R1 (P2, closed):** compact bordered table hid all peers;
repair uses a borderless compact table with a visible selected row and footer.
**M12-R2 (P2, closed):** empty/document-only views falsely highlighted row
zero; selection is now `None`. **M12-R3 (P2, closed):** five columns omitted
the two-cell marker budget; repair and buffer assertions cover the right edge.
Independent re-review closed R1–R3. **M12-R4 (P2, closed):** at widths 72–78 the
five-column threshold activated before the `Allowed IPs` header fit. Repair
uses the full-header minimum width and buffer tests at 72/78/79/80;
independent re-review closed R4 with no remaining finding. Final focused tests,
format, Clippy, locked full suite, release build and diff check passed on the
source in [M12 evidence](docs/evidence/milestone-12.md). Synthetic UI/PTY
evidence does not establish physical terminal, Alpine or systemd behavior.
Stop after this milestone; do not resume VM work, commit or deploy.
## Current progress and resume point
- Bounded TUI maintenance (2026-10-26): repaired list arrows opening client details. Up/Down now only move the highlight; Enter opens details and Esc returns. Initial navigation follows the renderer's first-row highlight. Independent review closed NAV-001 with no remaining scoped findings; validation is recorded in [navigation repair evidence](docs/evidence/tui-navigation.md). This does not advance M9 or supply VM/Alpine acceptance evidence; prior artifact identities remain historical after this Rust change.
- Milestones 1–8 are accepted; milestone 9 is retired by user direction and unaccepted. Its real systemd/D-Bus checks remain unverified and are not a prerequisite to M10.
- Milestone 10 is accepted: the styled keyboard quick reference passed independent review, focused synthetic/PTY checks and Rust completion gates.
- Milestone 11 is accepted for valid but unsupported AllowedIPs route presentation; focused and full Rust gates and independent re-review passed. Real systemd/D-Bus and IPv6 behavior remain unverified.
- Milestone 12 is accepted: native responsive client table, independent R4 closure and all scoped Rust gates passed; source and synthetic UI/PTY evidence are linked above.
- The approved dependency list is in [DEPENDENCIES.md](docs/DEPENDENCIES.md); container testing methodology is in [TESTING.md](docs/TESTING.md).
- Milestone 1 is expanded and the Rust environment is pinned.
- Milestone 2 delivered a lossless in-memory WireGuard configuration editor, versioned metadata, and behavioral preservation tests.
@@ -3483,7 +3561,7 @@ production behavior is claimed. Stop after this milestone.
- Milestone 8 delivered reviewed opt-in Alpine Testcontainers coverage for real IPv4 WireGuard peers, application lifecycle, saved/runtime separation, restoration, import/reissue, backup failures and the real Rustix reader. Host gates and three fresh real-container runs passed on one stable source fingerprint; M8-A1–A10 accepted. Real IPv6 behavior is unverified by user-authorized scope.
- Milestone 9 is retired and unaccepted: the reviewed disposable VM preparation and guarded first start did not establish Debian/systemd acceptance. The exact VM was powered off after the user stopped work. M9.2–M9.3 were not started; M9-A1–A9 are unchecked.
- Next action: stop after M11 and await user direction. Do not restart the VM, access production, commit, or deploy.
- Next action: stop after M12 and await user direction. Do not restart the VM, access production, commit, or deploy.
## Plan maintenance