Opening a non-existent entry now shows "Entry not found" instead of rendering a broken empty board. Tree navigation commands now give clear feedback when focus is on wrong pane or sidebar is collapsed. Co-Authored-By: Claude Opus 4.6 <[email protected]>
45 KiB
TUI v2 UI Refresh Plan (Mockup-Aligned)
Status: Active (2026-03-02)
Branch target: beta
Primary references: UI_mockups/PNG/*.png, UI_mockups/SeedPass_UI-Board.pdf
Latest audit reference: docs/tui_v2_mockup_gap_audit_2026-03-02.md
Execution plan reference: docs/tui_v2_integration_execution_plan_2026-03-02.md
1) Purpose
Translate the mockup direction into an implementation-ready, multi-session plan for Textual TUI v2 while preserving SeedPass's green visual identity.
This plan is intentionally detailed so future sessions can continue implementation without re-discovery.
2) Design Direction We Are Targeting
From the mockups, the desired direction is:
- Table-first operations with high information density.
- Persistent left "seed/account tree" navigation column.
- Large, contextual lower "inspector board" that changes by selected entry kind.
- Persistent bottom action strip for discoverability.
- Strong framed layout (hard borders, segmented panels, explicit labels).
- Black/neutral structure language, but with SeedPass green theme colors.
3) Visual System Contract (Keep Green Theme)
Use the existing TUI v2 palette as baseline (already present in src/seedpass/tui_v2/app.py):
- Base background:
#080a0c - Panel background:
#0d1114 - Header/footer background:
#0b0f13 - Primary text:
#daf2e5 - Secondary text:
#97b8a6 - Border default:
#1a3024 - Border emphasis:
#274533 - Accent/action:
#2abf75 - Focus highlight:
#58f29d
Rules:
- Keep semantic role colors stable (focus, warning, success, muted).
- Use contrast through brightness and border weight, not unrelated hues.
- Keep monochrome mockup geometry and spacing, but render in green palette.
4) Information Architecture (Target Layout)
Target screen structure:
- Top status ribbon:
- fingerprint
- managed users count
- entries count
- active kind/filter
- last sync timestamp
- Main split:
- Left: seed/account tree + context summary.
- Right:
- Top: search + filter controls + dense entry table/grid.
- Bottom: contextual inspector board for selected entry.
- Bottom action strip:
- Global shortcuts always visible.
- Context shortcuts appended for selected kind and mode.
5) Interaction Model Contract
Primary modes:
- Browse Mode:
- Grid-focused.
- Fast navigation/search/filter/sort.
- Inspect Mode:
- Inspector board-focused.
- Entry-specific actions (reveal/copy/export/edit/link).
- Edit Mode:
- Existing document editor/entry mutation mode.
Behavior rules:
- Selected row always drives inspector board content.
- Locked vault state must be visible in status ribbon and action strip.
- Sensitive actions reflect state chips:
HIDDEN,REVEALED,COPIED,LOCKED
- If no selection exists, inspector shows onboarding or "select entry" guidance.
6) Component-Level Spec
6.1 Left Navigation Tree
Goal: match mockup's persistent profile/seed hierarchy.
Requirements:
- Always visible.
- Shows active profile + managed-account context.
- Supports keyboard traversal and selection.
- Selection changes filter context for center grid.
Initial fallback (if full tree data unavailable):
- Render static grouped sections from currently available services.
- Keep widget contract stable so backing data can be enriched later.
6.2 Top Entry Grid
Goal: table-like view similar to mockups.
Columns (target):
- Index num
- Entry num
- Title
- Kind
- Tags (truncated)
- Date modified
- Archive/blacklist status
Rules:
- Compact row density by default.
- Overflow truncation with consistent ellipsis behavior.
- Sort indicators shown in header (even if only one active sort initially).
- Keyboard row selection must stay smooth on large datasets.
6.3 Inspector Board (Lower Panel)
Goal: board-style details by entry kind, matching mockup families.
Common board header:
- Entry label + kind.
- Modified timestamp.
- Archive/blacklist status.
- Index/entry IDs.
- Right-side primary action button area (
Edit, etc).
Common board body:
- Field blocks with labels.
- Copy/export/reveal controls as command hints/buttons.
- Notes area.
- Tags panel (right rail when space permits).
6.4 Bottom Action Strip
Goal: persistent discoverability.
Global segment examples:
[S]ettings[A]dd Entry[C]reate Seed[R]emove Seed[H]ide/Reveal Sensitive[E]xport[I]mport[B]ackup
Context segment examples:
- Password: copy password, copy username, reveal, qr.
- 2FA: copy code, refresh code, show qr.
- SSH/PGP: copy public/private, export key.
- Nostr: copy npub/nsec, show public/private qr.
7) Entry-Type Board Templates (Implementation Contract)
Each entry kind gets a formatter/template function returning a structured board text payload.
Template priority order:
password/stored_passwordnote/documentseed/managed_accounttotpsshpgpnostrkey_value- fallback generic JSON board
Per-kind minimum fields:
- Password/stored password:
- password (masked by default), username, url, tags, notes
- Note/document:
- content preview, tags, notes, file type (document)
- Seed/managed account:
- seed phrase hidden/reveal state, derivation/index metadata where available, tags, notes
- TOTP:
- current code, period, digits, secret hidden/reveal, qr support
- SSH:
- public key, private key hidden/reveal, export hints
- PGP:
- fingerprint, public key, private key hidden/reveal, export hints
- Nostr:
- npub, nsec hidden/reveal, public/private qr modes
8) Keyboard and Command Mapping Plan
Keep existing keybinds; add stronger discoverability and zone consistency.
Add/confirm mappings:
- Zone focus:
1left tree2top grid3inspector board
- Mode emphasis:
Taboptional focus advanceShift+Tabreverse focus (if Textual behavior allows cleanly)
- Inspector actions:
- keep
vreveal andgqr globally - add board-level shortcuts to status/action strip text
- Palette aliases:
- add board/action aliases where needed to mirror strip labels.
9) Delivery Plan (Phased Slices)
Phase 1: Shell Restructure (Layout only)
Deliver:
- Split right pane into top grid + lower inspector board.
- Add top status ribbon and bottom action strip scaffolding.
- Keep existing data behavior unchanged.
Exit criteria:
- Layout visually resembles mockup structure.
- Existing interaction tests still pass.
- No regression in reveal/qr/session behavior.
Phase 2: Grid Modernization
Deliver:
- Table-style header row and compact rows.
- Column alignment/truncation rules.
- Sort indicator placeholders and active filter badges.
Exit criteria:
- Large-list navigation remains performant.
- Paging/search/filter actions remain deterministic.
Phase 3: Inspector Board Templates (Core Kinds)
Deliver:
- Board templates for password, note/document, seed, totp.
- Sensitive-state chips + action hints.
- Context-aware action strip additions.
Exit criteria:
- Selected entry shows board instead of raw JSON for covered kinds.
- Reveal/qr flows are explicit and test-covered.
Phase 4: Inspector Board Templates (Advanced Kinds)
Deliver:
- SSH/PGP/Nostr/key_value boards.
- Copy/export affordance text and command parity hints.
- Managed-account board treatment.
Exit criteria:
- All major kinds render purpose-built boards.
- No loss of existing palette command capability.
Phase 5: Tree Navigation and Polish
Deliver:
- Left tree visual and keyboard behavior.
- Compact vs expanded density mode.
- Final visual polish against mockups (in green theme).
Exit criteria:
- Tree + grid + board flow is coherent end-to-end.
- User walkthrough of top daily workflows feels parity+ with legacy.
10) Testing and Quality Gates Per Slice
Mandatory per slice:
- Update/extend Textual interaction tests in:
src/tests/test_tui_v2_textual_interactions.pysrc/tests/test_tui_v2_action_matrix.py
- Run:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py
- If app logic paths changed meaningfully, run:
scripts/tui2_coverage_gate.sh
- Update docs:
- this file
docs/tui_v2_legacy_parity_matrix.mddocs/dev_control_center.md(if priorities shift)
11) Non-Goals (for this refresh)
- Replacing Textual runtime stack.
- Reworking core service/data model APIs for cosmetic UI concerns.
- Introducing non-deterministic behavior in entry rendering.
- Removing legacy TUI fallback before explicit cutover decision.
12) Session Handoff Checklist
Before ending any session touching this refresh:
- Mark phase/slice progress in this document.
- Record what was implemented and what remains.
- Add test evidence and known regressions.
- Append summary to
memory-update.md.
Current next slice (recommended): Phase 5 - Interactive tree navigation + final visual polish.
13) Progress Update
2026-03-02 - Phase 1 scaffold (initial pass) landed
Implemented in src/seedpass/tui_v2/app.py:
- Added top status ribbon (
#top-ribbon) with live summary:
- fingerprint
- managed session indicator
- visible entry count
- active kind/archive filters
- lock/session state
- last sync summary
- Added structural section framing:
Entry Gridheading above center list/search areaInspector Boardheading above right detail area
-
Added persistent bottom action strip (
#action-strip) with keyboard hint rail. -
Preserved all existing command behavior and service-layer flows.
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
28 passed.
Notes:
- This is a layout/chrome scaffold only; no table/board template conversion yet.
- Next slice should implement Phase 2 grid modernization without regressing interaction tests.
2026-03-02 - Phase 2 grid modernization (initial pass) landed
Implemented in src/seedpass/tui_v2/app.py:
- Upgraded center section heading to a multi-line table scaffold:
- column header row (
Idx,Entry,Title,Kind,Meta,Arch) - sort-indicator placeholder row
- live page/row counts
- Updated entry list row formatter to aligned, dense table-style rows:
- fixed-width columns for index/entry/title/kind/meta/archive.
- meta column now uses URL or username preview when present.
- Kept behavior and command flows unchanged (visual/data-presentational slice only).
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
28 passed.
Next recommended slice:
- Phase 3 inspector board templates for core kinds (
password,document/note,seed,totp).
2026-03-02 - Phase 3 inspector board templates (core kinds) landed
Implemented in src/seedpass/tui_v2/app.py:
- Replaced raw JSON detail rendering for core kinds with structured board layouts:
password/stored_passworddocument/noteseed/managed_accounttotp
- Added reusable board helpers:
- entry kind normalization
- common board header (label/kind/id/modified/archived)
- tags and notes normalization
- Added secure-by-default board copy:
- sensitive values remain hidden in board body
- reveal/QR actions remain the explicit path for sensitive disclosure
- Kept fallback generic JSON board for non-templated kinds to preserve coverage while templates are expanded.
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
28 passed.
Next recommended slice:
- Phase 4 inspector board templates for advanced kinds (
ssh,pgp,nostr,key_value) and stronger action-strip context hints.
2026-03-02 - Phase 4 advanced actions (copy workflow) landed
Implemented in src/seedpass/tui_v2/app.py:
- Added palette command:
copy <field> (optional: confirm)
- Added kind-aware copy field resolution for:
password/stored_password:password,username,urlseed/managed_account:seed|phrasetotp:code,secretssh:public,privatepgp:private,fingerprintnostr:npub,nseckey_value:key,valuedocument/note:content|text
-
Sensitive copy targets now require explicit confirmation (
confirm) before clipboard action. -
Updated command reference/help coverage to include
copy.
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
29 passed.
Next recommended slice:
- Extend Phase 4 with explicit file export actions for advanced key kinds (SSH/PGP/Nostr material export paths with confirmation and tests).
2026-03-02 - Phase 4 advanced actions (export workflow) landed
Implemented in src/seedpass/tui_v2/app.py:
- Added palette command:
export-field <field> <path> (optional: confirm)
- Reused kind-aware field resolution from copy workflow and added file export writing:
- supports same kind/field matrix as
copy. - writes UTF-8 payloads to absolute or relative paths (relative paths resolve from cwd).
-
Sensitive export targets now require explicit confirmation (
confirm) before writing. -
Updated command discoverability/help:
- palette placeholder
- help summary
- full palette reference
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
29 passed.
Next recommended slice:
- Continue Phase 5 polish: left tree navigation model + compact/expanded density toggle and final visual alignment pass to mockups.
2026-03-02 - Phase 5 polish (density + profile tree scaffold) landed
Implemented in src/seedpass/tui_v2/app.py:
- Added density controls:
- keybind:
d(toggle compact/comfortable) - palette:
density <compact|comfortable> - top ribbon, left panel, and grid heading now show active density mode
- Added left-panel profile tree scaffold:
- new
Profilessection in left panel - shows known profiles from profile service when available
- marks active fingerprint line
- Expanded command discoverability:
- palette placeholder/help/reference include
densitycommand.
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
29 passed.
Next recommended slice:
- Continue Phase 5 by adding explicit keyboard navigation inside the left profile tree and wiring profile-selection actions to update active context.
2026-03-02 - Phase 5 polish (interactive profile tree navigation) landed
Implemented in src/seedpass/tui_v2/app.py:
- Added keyboard bindings for left profile tree interactions:
Up/Down: move profile cursorCtrl+O: open/switch to selected profile
- Added palette command aliases:
profile-tree-nextprofile-tree-prevprofile-tree-open
- Updated left-panel rendering:
- cursor marker (
▶) and active profile marker (*) now render together - status text confirms selection movement and profile-switch outcomes
- Wired profile mutation commands to refresh tree state:
profile-switchprofile-addprofile-removeprofile-rename
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
31 passed.
Next recommended slice:
- Final visual alignment pass to mockups (spacing, headers, action strip hierarchy) and semantic indicator readability polish.
14) Current Status Snapshot
Completed:
- Phase 1 shell restructure scaffold.
- Phase 2 grid modernization baseline.
- Phase 3 core inspector board templates.
- Phase 4 advanced inspector actions (
copy,export-fieldwith confirm gates). - Phase 5 initial polish (
densitycontrols + profile tree scaffold). - Phase 5 interactive profile tree navigation and open/switch behavior.
Remaining (active queue):
- Final alignment pass to mockup spacing/rhythm.
- Semantic-state indicator readability pass in ribbon/action strip for upcoming dense-status scenarios.
- Continue board-by-board card/action fidelity polish (Password/Stored Password -> Note/2FA -> SSH/PGP/Nostr).
- Run focused TUI tests and coverage gate after each polish slice.
16) Progress Update (2026-03-02, Slice: Action Rail + Hotkey Reliability)
Implemented:
- Bottom action strip upgraded to a two-line persistent rail:
- line 1: stable global controls
- line 2: entry-kind contextual controls
- Status bar upgraded to a two-line presentation for better readability:
- mode/pane + stable shortcut hint
- latest status message
- Center-pane focus behavior changed to list-first:
action_focus_centernow focuses#entry-listinstead of#search- on launch, focus defaults to
#entry-list
- This restores expected immediate hotkey behavior for
v/gwithout requiring a manual focus fix. - Top ribbon readability pass:
- compacted status labels (
FP,M,E,K,SEM,Sync) - semantic mode shortened (
kw|hyb|sem) - fingerprint and sync strings truncated for narrow terminals
- Responsive narrow-screen fallback:
- auto-compact mode when terminal width is narrow
- link context side panel collapses in compact mode to preserve inspector readability
- action strip now signals compact mode (
Compact: links hidden)
- Board-fidelity refresh (current slice):
- Password/Stored Password boards now use explicit board titles and refined action/field lines
- Note/Document board now uses explicit board title with clearer preview labeling
- 2FA board action labels clarified (
Copy Code,Reveal Secret,QR)
- Added compact-layout regression test:
test_tui2_textual_compact_layout_hides_link_panel_and_can_restore
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
31 passed. - Added regression coverage:
test_tui2_textual_default_focus_keeps_sensitive_hotkeys_active
17) Progress Update (2026-03-02, Slice: SSH/PGP/Nostr Card Fidelity)
Implemented:
- Inspector header readability tweak:
- changed
Edit: [e]toEdit: e(avoids markup-style ambiguity in Textual render output).
- SSH board polish:
- explicit
SSH Boardtitle - metadata row moved directly under title
- public-key preview line added (truncated for dense layout)
- action rows grouped as public/private operations
- PGP board polish:
- explicit
PGP Boardtitle - metadata-first structure + retained fingerprint prominence
- action rows grouped as public/private operations
- Nostr board polish:
- explicit
Nostr Boardtitle - metadata-first structure + npub/nsec lines
- QR public/private actions shown together
- Added board-fidelity regression coverage:
test_tui2_textual_ssh_pgp_nostr_boards_show_action_fidelity
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
32 passed.
Artifacts:
artifacts/ui_eval/current_tui2_after32_ssh.pngartifacts/ui_eval/current_tui2_after32_pgp.pngartifacts/ui_eval/current_tui2_after32_nostr.png
18) Progress Update (2026-03-02, Slice: Seed Board Fidelity)
Implemented:
- Seed-family board specialization:
seednow renders asBIP-39 Seed Boardmanaged_accountnow renders asManaged Account Seed Board
- Seed metadata fidelity:
- word count now falls back to deriving from
seed_phrasewhenwordsis absent - index metadata remains explicit in the board
- Seed action affordances aligned to sensitive workflow:
Reveal Seed,QR Seed,Copy Seed(confirm),Export Seed(confirm)- clear command hints for confirm-gated copy/export/reveal flows
- Added board-fidelity regression coverage:
test_tui2_textual_seed_and_managed_seed_boards_show_fidelity
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
33 passed.
Artifacts:
artifacts/ui_eval/current_tui2_after33_seed.pngartifacts/ui_eval/current_tui2_after33_managed_seed.png
19) Progress Update (2026-03-02, Slice: Spacing/Rhythm + Compact Action Strip)
Implemented:
- Layout rhythm tuning:
- top work area increased (
#top-workfrom5frto6fr) - inspector area increased (
#rightfrom4frto5fr) - left rail slightly narrowed (
#leftfrom34to32) - inspector side rail slightly narrowed (
#inspector-sidefrom30to28)
- Compact-mode action-strip readability:
- compact global row now uses shorter labels (
Ctrl+P,1/2/3,p/n,f/h) - very narrow widths apply abbreviated context text (
Rev,Arch,cfm)
- Responsive state tracking:
- stores viewport width and adapts action-strip wording accordingly.
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
33 passed.
Artifacts:
artifacts/ui_eval/current_tui2_after34_password.pngartifacts/ui_eval/current_tui2_after34_note.pngartifacts/ui_eval/current_tui2_after34_totp.pngartifacts/ui_eval/current_tui2_after34_ssh.pngartifacts/ui_eval/current_tui2_after34_pgp.pngartifacts/ui_eval/current_tui2_after34_nostr.pngartifacts/ui_eval/current_tui2_after34_seed.pngartifacts/ui_eval/current_tui2_after34_managed_seed.png
20) Progress Update (2026-03-02, Slice: Micro-Alignment Tightening)
Implemented:
- Tightened top-frame rhythm to better mirror mockup structure:
- reduced top-ribbon vertical gap
- removed extra right-panel top gap
- Increased dense-table feel in center column:
- reduced grid heading height and spacing
- removed quick-jump extra bottom spacing
- Tightened panel rhythm in left column:
- slightly narrower tree rail
- reduced activity panel height and top gap
- Improved inspector rhythm:
- removed extra spacing under inspector heading
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
33 passed.
21) Progress Update (2026-03-02, Slice: Header/Action Consistency Sweep)
Implemented:
- Note/Document board consistency upgrades:
- now includes common metadata line:
Kind | Modified | Archived - now includes common ID line:
Index Num* | Entry Num
- 2FA board consistency upgrades:
- now includes common metadata line:
Kind | Modified | Archived - now includes common ID line:
Index Num* | Entry Num
- Added regression coverage:
test_tui2_textual_note_and_totp_boards_include_common_metadata
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
34 passed.
Artifacts:
artifacts/ui_eval/current_tui2_after35_password.svgartifacts/ui_eval/current_tui2_after35_note.svgartifacts/ui_eval/current_tui2_after35_totp.svgartifacts/ui_eval/current_tui2_after35_ssh.svgartifacts/ui_eval/current_tui2_after35_pgp.svgartifacts/ui_eval/current_tui2_after35_nostr.svgartifacts/ui_eval/current_tui2_after35_seed.svgartifacts/ui_eval/current_tui2_after35_managed_seed.svg
22) Progress Update (2026-03-02, Slice: Final Table/Header Micro-Copy)
Implemented:
- Grid heading copy cleanup:
- removed ambiguous duplicate naming and standardized columns to:
Sel | Id | Entry# | Label | Kind | Meta | Arch
- Board footer action wording normalized across kinds:
- consistent verb-first labels with key hints, e.g.
Edit (e),Archive (a),Reveal (v),QR (g),Save (Ctrl+S),Cancel (Esc).
- Seed/advanced command hints retained where explicit command forms are needed:
copy seed confirmexport-field seed <path> confirmqr private confirm
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
34 passed.
Artifacts:
artifacts/ui_eval/current_tui2_after36_password.svgartifacts/ui_eval/current_tui2_after36_note.svgartifacts/ui_eval/current_tui2_after36_totp.svgartifacts/ui_eval/current_tui2_after36_ssh.svgartifacts/ui_eval/current_tui2_after36_pgp.svgartifacts/ui_eval/current_tui2_after36_nostr.svgartifacts/ui_eval/current_tui2_after36_seed.svgartifacts/ui_eval/current_tui2_after36_managed_seed.svg
23) Progress Update (2026-03-02, Slice: 2FA Copy URL Parity Closure)
Implemented:
- Added first-class 2FA URL copy command:
2fa-copy-url <entry_id>
- Added TOTP URL support to generic copy flow:
copy url confirm(for selected TOTP entry) now resolves otpauth URI.
- Surfaced URL copy affordance in 2FA UI text:
- 2FA inspector board action row now includes
Copy URL(confirm). - 2FA board command hint row now includes
2fa-copy-url <entry_id>.
- Updated palette discoverability text:
- command palette placeholder, help reference, and quick-help example include
2fa-copy-url.
- Added/updated regression coverage:
- extended 2FA board tests to assert:
- successful URL copy
- usage and input validation for
2fa-copy-url - board command hint visibility
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
34 passed.
Strict closeout impact:
- 2FA board moved from
OpentoMinor Gap(functional parity closed; visual polish remains).
24) Progress Update (2026-03-02, Slice: Compact Discoverability + Board Polish)
Implemented:
- Compact-mode notes/tags discoverability upgrade:
- when compact mode collapses the right notes/tags panel, inspector boards now render notes/tags inline for discoverability.
- Applied inline notes/tags fallback across core boards:
- password/stored_password, note/document, seed/managed_account, totp, ssh, pgp, nostr.
- Password + Note polish:
- password board now has explicit
Credentialssection. - note board now uses clearer
Content Previewheading and flow.
- Added compact discoverability regression assertions:
- extended
test_tui2_textual_compact_layout_hides_link_panel_and_can_restoreto verify inline notes/tags content.
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
34 passed.
Artifacts:
artifacts/ui_eval/current_tui2_after38_note_compact.svg
25) Progress Update (2026-03-02, Slice: Viewport Balance Adaptation)
Implemented:
- Added viewport-height adaptive layout balancing:
- short viewports (
height < 32): keeps inspector usable and hides activity panel to recover space. - standard viewports: balanced default (
top-work/ inspector sizing) with activity visible. - tall viewports (
height >= 52): increases table density while preserving inspector legibility.
- Keeps compact-mode width behavior and height behavior coordinated via unified responsive update path.
- Added viewport-balance regression coverage:
test_tui2_textual_viewport_balance_hides_activity_on_short_height
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
35 passed.
Artifacts:
artifacts/ui_eval/current_tui2_after39_note_compact_short.svgartifacts/ui_eval/current_tui2_after39_note_standard.svg
26) Progress Update (2026-03-02, Slice: Typography/Icon Polish)
Implemented:
- Added consistent kind icons in inspector board titles/headers for stronger visual scanning:
- password, note/document, 2FA, seed/managed seed, SSH, PGP, Nostr now include their kind icon in board title lines.
- Applied icon-enhanced shared entry-header format for template-based boards.
- Preserved command and behavior parity while improving visual hierarchy.
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
35 passed.
Artifacts:
artifacts/ui_eval/current_tui2_after40_password.svgartifacts/ui_eval/current_tui2_after40_note.svgartifacts/ui_eval/current_tui2_after40_totp.svgartifacts/ui_eval/current_tui2_after40_ssh.svgartifacts/ui_eval/current_tui2_after40_pgp.svgartifacts/ui_eval/current_tui2_after40_nostr.svgartifacts/ui_eval/current_tui2_after40_seed.svgartifacts/ui_eval/current_tui2_after40_managed_seed.svg
15) Mockup Board Parity Audit (2026-03-02)
Source set reviewed:
UI_mockups/PNG/UI Board.pngUI_mockups/PNG/Password Board.pngUI_mockups/PNG/Stored Password Board.pngUI_mockups/PNG/Note Board.pngUI_mockups/PNG/2FA Board.pngUI_mockups/PNG/BIP-39 Seed Board.pngUI_mockups/PNG/SSH Board.pngUI_mockups/PNG/PGP Board.pngUI_mockups/PNG/Nostr Board.png
15.1 Shared Layout Contract (from all mockups)
Expected:
- Dense table-first upper region with always-visible rows and explicit separators.
- Persistent left hierarchy tree with compact, high-signal metadata.
- Lower inspector with:
- shared header row (
label,kind,modified, blacklist/archive, index/entry) - field cards
- right-side secondary card (tags/notes/links/sensitive)
- Bottom action rail with stable global actions + contextual actions.
Current status:
- Implemented in structure, but still needs spacing/density tuning to keep both:
- sufficient table rows visible
- full inspector card content visible in same viewport
15.2 Board-by-Board Functional + Layout Parity
| Mockup board | Required field/layout traits | Required actions | TUI v2 status |
|---|---|---|---|
| UI Board | Dense table, left tree, bottom rail | search/filter/paging/navigation | Minor Gap |
| Password | password/username/url/tags + notes side panel | copy password, create new, edit, reveal/qr | Minor Gap |
| Stored Password | password/username/url/tags + notes side panel | copy password, edit, reveal/qr | Minor Gap |
| Note | large content area + tags side card | edit/save/cancel/export | Minor Gap |
| 2FA | code field + URL field + notes/tags side card | copy code, copy URL, reveal/qr, 2FA board | Done |
| BIP-39 Seed | seed field + notes + tags side card | reveal/confirm, qr, copy/export with confirm | Done |
| SSH | public/private rows + notes/tags side card | copy public/private, export public/private, reveal private | Done |
| PGP | public/private rows + notes/tags side card | copy/export public/private, reveal private | Done |
| Nostr | npub/nsec rows + notes/tags side card | copy npub/nsec, qr public/private, reveal nsec | Done |
15.3 Closeout Status Definitions (Strict)
Done: matching layout and actions with no user-visible parity gap in normal viewport.Minor Gap: core behaviors present; remaining differences are visual rhythm/density or secondary affordance polish.Open: missing required interaction from mockup contract.
15.4 Strict Closeout Notes (2026-03-02)
UI Board-> Minor Gap:
- structure is correct (left tree + table + inspector + action rail), but table density and lower board visibility balance still need final tuning.
Password/Stored Password-> Minor Gap:
- core actions and fields are present; remaining gap is closer card geometry fidelity to mockup.
Note-> Minor Gap:
- edit/save/export flow is complete; remaining gap is larger content-card visual weighting compared to mockup.
2FA-> Done:
- code/URL copy, reveal, QR, and board workflows are now first-class and discoverable.
BIP-39 Seed-> Done:
- reveal/QR/copy/export confirm workflows are present with board-level affordances.
SSH/PGP/Nostr-> Done:
- required copy/export/reveal/QR workflows are present with explicit board action affordances.
15.5 Current Priority Gap Order (derived from strict closeout)
- Keep strict
Opencount at zero by preserving 2FA copy-URL parity. - Final visual card/rhythm pass for remaining
Minor Gapboards (UI Board,Password,Stored Password,Note). - Final action-rail wording polish to match mockup verbs.
15.6 Immediate Next Slice (strict closeout coupled)
- Final card geometry pass for Password/Stored Password/Note.
- Final UI-board density pass (table rows + lower inspector balance).
- Final action-strip verb/microcopy polish.
- Re-run focused suite and capture
after41artifacts.
27) Progress Update (2026-03-02, Slice: Strict Closeout Scoring Pass)
Scoring method:
Done: no user-visible functional parity gap and mockup-consistent action discoverability in normal viewport.Minor Gap: functional parity met, but visual/rhythm mismatch remains.Open: required interaction missing.
Current strict closeout scoreboard:
Done(5/9):2FA,BIP-39 Seed,SSH,PGP,Nostr.Minor Gap(4/9):UI Board,Password,Stored Password,Note.Open(0/9).
Evidence basis:
- Focused validation gate:
35 passedin current run set. - Artifact set:
artifacts/ui_eval/current_tui2_after40_*.svg. - Dedicated parity regressions in
src/tests/test_tui_v2_textual_interactions.pyfor:
- default hotkey focus
- compact discoverability
- board fidelity (
SSH/PGP/Nostr,Seed/Managed Seed,Note/2FA metadata) - viewport balance behavior
28) Detailed UX Audit (2026-03-02, Pre-Implementation Writeup)
Scope:
- Compare current TUI v2 runtime states against mockup set in
UI_mockups/PNG/*.png. - Focus on:
- context-aware inspector behavior
- left tree structure fidelity
- per-board layout transitions and function-driven UI changes
Evidence captured:
- Runtime state dump:
artifacts/ui_eval/audit_20260302/state_dump.txt
- Board screenshots (vector snapshots):
artifacts/ui_eval/audit_20260302/*.svg
28.1 Key User-Reported Concerns: Validation
- Concern: inspector panel appears open/populated all the time.
- Confirmed behavior in current v2:
- first row is auto-selected on load (
Selected: #0 ...in state dump), - inspector is therefore always populated by design.
- first row is auto-selected on load (
- Mockup intent:
- inspector content is contextual and should feel state-driven, not always-active by default.
- Status:
- Functional but not matching UX intent; should be revised to delayed/populated-on-explicit-selection behavior.
- Concern: left tree does not reflect fingerprint/managed-account hierarchy.
- Confirmed behavior in current v2:
- left panel shows profile list scaffold with shallow pseudo-tree lines from profile fingerprints.
- managed accounts are not rendered as child nodes in this structure.
- Mockup intent:
- deep hierarchical seed/account tree with clear parent-child grouping.
- Status:
- Partial scaffold only; structural data model + renderer need expansion.
28.2 Board-by-Board Layout/Function Transition Audit
UI Board (global layout):
- Present:
- top ribbon, left rail, center grid, lower inspector, bottom action strip.
- Missing vs mockup:
- tree depth and semantic grouping on left.
- denser table row packing with richer column semantics (mockup includes blacklist/date emphasis).
- true “inspect mode” transition behavior (instead of always-populated inspector at startup).
Password / Stored Password:
- Present:
- board titles, metadata, credentials rows, action affordances, right notes/tags side panel.
- Gaps:
- visual card geometry still less segmented than mockup (mockup uses stronger field-card framing and right notes dominance).
- “create new”/copy controls are textual chips, not distinct button blocks with stronger visual separation.
Note Board:
- Present:
- content preview, metadata, edit/export actions, notes/tags panel, compact inline fallback.
- Gaps:
- mockup shows stronger large-content card emphasis with clearer right notes pane ratio.
- current board remains text-first and less panelized.
2FA Board:
- Present:
- copy code, copy URL, reveal, QR, dedicated 2FA board commands and hints.
- Gaps:
- visual treatment of URL/code cards not yet equivalent to mockup’s framed field blocks.
BIP-39 Seed Board:
- Present:
- reveal/QR/copy/export confirm paths, word-count/index metadata, managed vs non-managed board variants.
- Gaps:
- card visual hierarchy still lighter than mockup’s framed block style.
SSH / PGP / Nostr:
- Present:
- required copy/export/reveal/QR action coverage and metadata lines.
- Gaps:
- action chips and field block segmentation still not as bold as mockup button/card composition.
28.3 Layout State Changes (Function-Driven) vs Mockup Expectations
Current implemented state transitions:
- Selection changes board content.
- Compact width hides side notes/links panel and now inlines notes/tags.
- Short height hides activity panel to preserve core content area.
- 2FA board toggles into dedicated live-code table view.
Still needed to match mockup behavior intent:
- Startup with no forced selection state (or a true neutral “select entry” inspect state).
- Explicit browse-mode vs inspect-mode layout emphasis:
- browse: denser table, reduced inspector prominence
- inspect: fuller lower board prominence after explicit open/select action
- Left tree deep hierarchy with managed-account child nodes and clearer expand/collapse semantics.
28.4 Font Size Request Constraint
- Terminal font size itself is controlled by the terminal emulator, not Textual app CSS.
- App-side equivalent for “smaller font feel” is:
- tighter spacing/margins/heights,
- shorter labels,
- denser row/column presentation,
- reduced decorative padding.
- Next implementation slices should target this density path to effectively fit more content per viewport.
29) Progress Update (2026-03-03, Slice: Password/Stored Password/Note Card Geometry)
Completed:
- Password and Stored Password inspector boards now use stronger card sections:
CredentialsQuick Actions
- Note/Document board now uses the same card section framing:
ContentQuick Actions
- Increased note preview payload from 120 to 180 chars for better content-card parity in standard density.
Code references:
src/seedpass/tui_v2/app.py(_board_card, password/stored_password board, note/document board)
Regression coverage:
- Updated note board metadata test to assert card framing.
- Added password board card-section regression test.
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
57 passed.
Remaining strict-closeout slice order unchanged:
- Final UI-board density pass (table rows + lower inspector balance)
- Final action-strip verb/microcopy polish
30) Progress Update (2026-03-03, Slice: UI-Board Density Rebalance)
Completed:
- Dense/high-res layout now rebalances vertical space by context:
- Idle (no selected entry, no editor, no 2FA board):
top-work=9fr,right=3fr - Active inspect/edit/2FA:
top-work=8fr,right=4fr
- Added explicit layout rebalance hook so selection and pane-mode transitions re-apply split without requiring window resize.
- Rebalance path wired through:
- page render transitions (empty/non-empty)
- entry selection/open flow
- right-pane mode switches (view/edit/2FA)
Code references:
src/seedpass/tui_v2/app.py(_update_responsive_layout,_refresh_layout_balance,_set_right_pane_mode,_render_current_page,_show_entry)
Regression coverage:
- Added dense-mode split behavior test:
test_tui2_textual_hires_density_rebalances_idle_vs_selected
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
58 passed.
Remaining strict-closeout slice:
- Final action-strip verb/microcopy polish.
31) Progress Update (2026-03-03, Slice: Action-Strip Verb/Microcopy Polish)
Completed:
- Context row wording standardized to verb-first labels with key hints:
Reveal (v)QR (g)Edit (e)/Edit Doc (e)Archive (a)Save (Ctrl+S)2FA Board (6)
- Managed account row now retains explicit session controls while matching the same style:
managed-loadmanaged-exit- plus reveal/qr/edit/archive with key hints.
- Click routing remains compatible after copy update:
- row-2 parser now recognizes both symbol-led and verb-led tokens (
v/Reveal,g/QR, etc.).
Code references:
src/seedpass/tui_v2/app.py(_update_action_strip,_action_strip_context_action)
Regression coverage:
- Updated action-strip click + context-update tests to assert verb-led labels.
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
58 passed.
32) Progress Update (2026-03-03, Slice: Universal Card Framing)
Completed:
- Extended
_board_cardframing to all remaining inspector boards:- TOTP:
Parameters(period/digits/code/secret) +Quick Actions - SSH:
Keys(public/private) +Quick Actions - PGP:
Keys(fingerprint/public/private) +Quick Actions - Nostr:
Keys(npub/nsec) +Quick Actions - Seed/Managed Account:
Seed Info(phrase/word count/index) +Quick Actions
- TOTP:
- All boards now use consistent card-section visual language matching the Password/Note treatment from Slice 29.
Code references:
src/seedpass/tui_v2/app.py(TOTP, SSH, PGP, Nostr, Seed board sections)
Regression coverage:
- Updated SSH/PGP/Nostr board test to assert
+- Keysand+- Quick Actionscard framing. - Updated Seed/Managed Seed board test to assert
+- Seed Infoand+- Quick Actionscard framing. - Updated TOTP board test to assert
+- Parametersand+- Quick Actionscard framing.
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
58 passed.
Strict closeout impact:
- All 9 board types now have consistent card-section framing.
- SSH/PGP/Nostr/Seed boards moved from visual-gap to card-parity with Password/Note.
33) Progress Update (2026-03-03, Slice: Board Density Tightening)
Completed:
- Removed redundant plain-text section headers above card frames:
- "Login Fields", "Document Fields", "2FA Fields", "Seed Fields", "Key Material", "Operations"
- Card titles (
Credentials,Content,Parameters,Seed Info,Keys,Quick Actions) are self-descriptive.
- Removed "Compact: Notes/Tags shown inline." noise line from compact mode boards.
- Capped note/document preview length from 180 to 100 chars to prevent oversized Content cards.
Density improvement:
- Password board: ~21 lines -> 17 lines (-4 lines per board).
- All boards save 2-3 lines from removed section headers.
- Note board Content card width reduced by ~45%.
Code references:
src/seedpass/tui_v2/app.py(all board sections +_notes_tags_panel_hint)
Regression coverage:
- Updated assertions from section headers to card-frame prefixes.
- Removed "Compact:" noise assertion.
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
58 passed.
34) Progress Update (2026-03-03, Slice: Action Strip + Hint Line Tightening)
Completed:
- Normal-mode global action strip now uses verb-first labels with key hints:
Settings (Shift+S),Add (Shift+A),Seed+ (Shift+C), etc.- Added
Cmd (Ctrl+P)to normal mode for discoverability parity with compact/dense modes.
- Shortened Seed board Actions hint:
- Before:
copy seed confirm | export-field seed <path> confirm - After:
Copy Seed (confirm) | Export (confirm)
- Before:
- Shortened TOTP board Actions hint:
- Before:
2fa-copy <id> | 2fa-copy-url <id> - After:
Copy Code (Ctrl+P) | Copy URL (Ctrl+P)
- Before:
- Action hints now consistently use user-facing verbs instead of raw palette commands.
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
58 passed.
35) Progress Update (2026-03-03, Slice: Final Micro-Polish)
Completed:
- Added max-width cap (72 chars) to
_board_cardrenderer:- Content cards no longer stretch across the full viewport.
- Long rows are truncated with ellipsis character.
- Note board max line width reduced from ~112 to 76 chars.
- Capitalized Nostr action hint:
- Before:
qr private confirm - After:
QR Private (confirm)
- Before:
- Compact mode global strip now uses verb-first labels:
- Before:
S Settings A Add C Create Seed R Remove Seed H Hide/Reveal E Export I Import B Backup Ctrl+P Cmd Compact - After:
Settings (S) Add (A) Seed+ (C) Seed- (R) Reveal (H) Export (E) Import (I) Backup (B) Cmd (Ctrl+P)
- Before:
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
58 passed.
36) Progress Update (2026-03-03, Slice: UX Bug Fixes from Walkthrough)
Completed:
- Fixed
open <non-existent-id>showing broken empty board:- Now checks for empty dict (not just None) from retrieve_entry.
- Shows clear "Entry #N not found" message in inspector.
- Clears selection state so action strip doesn't show stale context.
- Fixed tree navigation silently ignoring commands when focus is on wrong pane:
profile-tree-next,profile-tree-prev,profile-tree-opennow show "Focus left pane first (press 1)" instead of silently returning.- Also shows "Sidebar is collapsed. Press Ctrl+B to expand." when sidebar is collapsed.
Regression coverage:
- Added
test_tui2_textual_open_nonexistent_entry_shows_not_found. - Added
test_tui2_textual_tree_nav_feedback_when_wrong_pane.
Validation:
poetry run pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py- Result:
60 passed.