Files
SeedPass/memory-update.md
T

739 lines
53 KiB
Markdown

# Memory Update (2026-03-01)
## Nostr backup failure observability
- `handle_post_to_nostr()` previously printed only a generic `❌ Sync failed…` when `sync_vault()` returned `None`, even if `nostr_client.last_error` had useful detail.
- `PasswordManager.sync_vault_async()` swallowed exceptions and returned `None` without reliably setting `nostr_client.last_error`, making root-cause diagnosis hard from CLI.
## Changes made
- Updated `sync_vault_async()` to copy exception text into `nostr_client.last_error` before returning `None`.
- Updated `handle_post_to_nostr()` to include `nostr_client.last_error` in user-visible failure output and log line when available.
- Added regression tests:
- `test_handle_post_failure_shows_nostr_error`
- `test_sync_vault_sets_last_error_on_exception`
## Testing note
- Could not run pytest in this environment because `pytest` is not installed (`python3 -m pytest` -> `No module named pytest`).
## Nostr namespace reset workflow
- Added Nostr Settings menu actions for profile-scoped reset operations:
- `8. Reset Nostr sync state` clears `manifest_id`, `delta_since`, and `last_sync_ts` while preserving `nostr_account_idx`.
- `9. Start fresh Nostr namespace (new key index)` increments `nostr_account_idx`, clears sync metadata, and reinitializes the Nostr client when available.
- This provides a first-class path for users who want to ignore legacy Nostr history and publish/retrieve only new data under current deterministic behavior.
- Added tests for both handlers and menu dispatch to prevent regressions.
## Documentation updates for Nostr reset workflow
- Added `docs/nostr_namespace_reset.md` documenting menu options `8` (reset sync state) and `9` (start fresh namespace), plus validation steps for robust publish/restore.
- Linked the new guide from `docs/nostr_setup.md`, `docs/README.md`, and root `README.md`.
- Exposed the guide in website docs navigation via `landing/docs.html` (`Nostr Namespace Reset`).
## Nostr sync failure after namespace increment
- Root-cause pattern: when profile `offline_mode` is enabled, `sync_vault_async()` exits early and previously returned `None` without a helpful message, so UI showed only `❌ Sync failed…`.
- Fixes:
- `PasswordManager.sync_vault_async()` now sets `nostr_client.last_error` for early-return cases (`offline_mode`, missing encrypted index, and missing publish result).
- `main.handle_post_to_nostr()` now explicitly reports offline mode when no detailed error is present.
- Regression tests added:
- `src/tests/test_post_sync_messages.py::test_handle_post_failure_offline_mode_message`
- `src/tests/test_background_vault_sync_paths.py::test_sync_vault_async_sets_offline_error`
- Verified with local venv:
- `./.venv/bin/pytest -q src/tests/test_post_sync_messages.py`
- `./.venv/bin/pytest -q src/tests/test_background_vault_sync_paths.py`
## Entry model expansion: document kind + universal date fields
- Added a new `document` entry kind across core enum, TUI, API, CLI, and agent secret resolution.
- Added universal `date_added` and `date_modified` fields for all entry kinds.
- Creation now sets both fields.
- Modification preserves `date_added` and updates `date_modified`.
- Legacy entries are normalized in `_load_index()` by deriving date fields from `modified_ts`/`updated`.
- TUI now supports `Document` creation via a built-in line editor with basic commands (`p`, `a`, `i <n>`, `e <n>`, `d <n>`, `w`, `q`).
- Added document-specific display and edit flows in manager/display services.
## Sync/policy compatibility notes
- Updated deterministic merge kind matrix to include document fields (`content`, `file_type`) for equal-timestamp backfill behavior.
- Agent defaults now include `document` in non-private allow-kinds, and agent secret resolution returns document content for `document` entries.
## Tests and docs
- Added/updated tests for:
- document entry roundtrip and CLI add command
- universal date field presence/update semantics across all entry kinds
- API create/modify behavior for `document`
- large document Nostr sync roundtrip
- Added `docs/entry_types.md` and updated README/docs index and sync conflict docs.
- Verified with:
- `./.venv/bin/pytest -q src/tests/test_cli_entry_add_commands.py src/tests/test_entry_add.py src/tests/test_entry_types_roundtrip.py src/tests/test_modify_entry_validation.py src/tests/test_api.py src/tests/test_api_new_endpoints.py src/tests/test_full_sync_roundtrip.py`
- Result: `141 passed`.
## Document file import/export workflows
- Added document file I/O at core layer:
- `EntryManager.import_document_file(path, ...)`
- `EntryManager.export_document_file(index, output_path=None, overwrite=False)`
- Added TUI support:
- `Add Entry > Document` now supports `New Document` and `Import Document File`.
- Document entry actions now include `Export Document to File`.
- Added automation surfaces:
- CLI: `entry import-document`, `entry export-document`
- API: `POST /api/v1/entry/document/import`, `POST /api/v1/entry/{id}/document/export`
- Regression coverage added for core file roundtrip, CLI commands, and API endpoints.
## Agent document import/export commands
- Added dedicated agent CLI commands:
- `seedpass agent document-import --file <path>`
- `seedpass agent document-export <query>` (or `--entry-id`)
- Enforcement model for both commands:
- Requires `--fingerprint` and non-interactive auth broker password resolution.
- Denies unless policy `allow_export_import` is enabled.
- Denies unless `document` kind is policy-allowed (`allow_kinds` / kind export check).
- Supports scoped token enforcement with operation scopes (`import` for import, `export` for export).
- Export honors approval gates when policy requires `export` approval.
- Emits structured JSON responses and append-only audit events for granted/denied outcomes.
- Discovery updates:
- Added `document_io` command hints to `agent bootstrap-context` payload.
- Added `document_io` section to `seedpass capabilities --format json` security features.
- Added CLI tests for:
- token-scoped agent document import success path
- token-scoped agent document export success path
- bootstrap context includes document command hints
- Environment note: could not run pytest in this shell because `pytest` is unavailable (`python3 -m pytest` reports module missing).
## Test environment note (2026-03-01)
- Repo `.venv` already had `pytest` and `typer`; upgraded to `pytest 9.0.2` and `typer 0.24.1`.
- New agent document I/O tests initially failed due mocked policy normalization (empty `rules` caused normalized `allow_kinds` to become empty).
- Fixed tests by adding explicit allow rule for `document` in mocked policies.
- Verification run:
- `.venv/bin/pytest -q src/tests/test_document_file_io.py src/tests/test_cli_entry_add_commands.py src/tests/test_api_new_endpoints.py src/tests/test_entry_types_roundtrip.py src/tests/test_full_sync_roundtrip.py src/tests/test_cli_agent_mode.py`
- Result: `150 passed`.
## Full-suite regression repair after document rollout
- Ran full suite after enabling agent document I/O and found 12 regressions (mostly stale tests).
- Fixed regressions by updating tests for:
- new document add-menu option/mocks (`handle_add_document`),
- expanded `EntryService.modify_entry` kwargs,
- universal `date_added`/`date_modified` and `custom_fields` fields in entry expectations,
- `list_entries(sort_by="updated")` relying on `modified_ts`,
- legacy decrypt fallback monkeypatches to accept `salt` argument and revised iteration-call expectations.
- Verification: `.venv/bin/pytest -q src/tests` => `891 passed, 11 skipped`.
## Knowledge graph links integration (entry relationships)
- Added first-class graph edges to every entry via shared `links` field (list of `{target_id, relation, note}`).
- Implemented core link operations in `EntryManager`:
- `add_link(entry_id, target_id, relation, note)`
- `remove_link(entry_id, target_id, relation=None)`
- `get_links(entry_id)` with resolved target label/kind.
- Added normalization/defaulting for `links` in index load path, including cache-return normalization to prevent stale in-memory schemas.
- Extended `modify_entry(..., links=...)` to allow full links replacement with validation.
- Search now matches link metadata (`relation`, `note`) and linked target labels, enabling graph-style discovery from existing index scans.
- Sync conflict equal-timestamp union now includes `links` alongside `tags` and `custom_fields` for deterministic convergence.
- Added API endpoints:
- `GET /api/v1/entry/{id}/links`
- `POST /api/v1/entry/{id}/links`
- `DELETE /api/v1/entry/{id}/links`
and `PUT /api/v1/entry/{id}` now accepts `links`.
- Added CLI graph commands:
- `seedpass entry link-add`
- `seedpass entry links`
- `seedpass entry link-remove`
plus `entry modify --links-json`.
- Documentation updated in `README.md`, `docs/entry_types.md`, and `docs/sync_conflict_contract.md`.
- Validation:
- Focused suite: `140 passed`
- Full suite: `895 passed, 11 skipped`.
## Website/docs refresh for graph features
- Added dedicated graph docs page: `docs/entry_graph.md`.
- Updated docs indexes/navigation:
- `docs/README.md` now lists `entry_graph.md`.
- `landing/docs.html` sidebar now includes `Entry Graph`.
- Updated landing page feature cards (`landing/index.html`) to highlight:
- Entry Graph Links
- Graph-Aware Entry Ops CLI commands
- Updated docs cross-links:
- `docs/entry_types.md` points to `docs/entry_graph.md`.
- Updated README feature bullets to include Entry Graph Links.
## Landing graph example + help-hint refresh
- Added a visual graph snippet block to landing architecture section (`landing/index.html`) showing linked entries and graph query behavior.
- Styled graph snippet in `landing/style.css` (`.graph-snippet`) to match the terminal UI aesthetic.
- Expanded help/discovery surfaces for users and agents:
- `seedpass capabilities` now includes a `knowledge_graph` security feature block with CLI/API graph commands and sync/search behavior.
- Capabilities API discovery now lists `/api/v1/entry/{id}/links`.
- Capabilities text output now explicitly mentions graph links and document workflows.
- Capabilities `help_hints` now include graph/document command pointers.
- `agent bootstrap-context` now includes `commands.knowledge_graph` hints.
- Root CLI help string now mentions document I/O and entry graph links.
- Verification:
- `.venv/bin/pytest -q src/tests/test_typer_cli.py -k "capabilities_text or capabilities_json" src/tests/test_cli_agent_mode.py -k "bootstrap_context"`
- Result: `2 passed`.
## TUI v2 scaffold kickoff on beta
- Added `docs/tui_v2_plan.md` with phased migration plan, risk controls, and testing strategy for Textual-based TUI v2.
- Added experimental CLI command `seedpass tui2` and diagnostics mode `seedpass tui2 --check`.
- Added new runtime-check/launcher scaffold package at `src/seedpass/tui_v2/`.
- Updated discoverability/docs surfaces:
- `docs/README.md` includes `tui_v2_plan.md`
- `landing/docs.html` includes `TUI v2 Plan`
- `README.md` discovery snippet includes `seedpass tui2 --check`
- `capabilities` root commands/help hints include `tui2`
- Validation:
- `py_compile` for updated modules
- `pytest` capabilities tests (`2 passed`)
- `.venv` smoke run confirms `seedpass tui2 --check` emits runtime diagnostics.
- 2026-03-01: TUI v2 phase 1 moved from placeholder to functional read-only Textual shell. `seedpass tui2` now passes a lazy `entry_service_factory` so vault/service init only happens when Textual is actually available, preventing unnecessary prompts on unavailable runtimes.
- Added focused CLI tests in `src/tests/test_typer_cli.py` for `tui2 --check`, unavailable + no fallback exit path, and legacy fallback fingerprint forwarding.
- 2026-03-01: TUI v2 phase 2 slice added in `seedpass/tui_v2/app.py`: archive/restore action (`a`), document editor mode (`e`) with save/cancel (`Ctrl+S`/`Esc`), and a persistent status line for operation feedback.
- Document editor uses `TextArea` when available and falls back to single-line input if unavailable, keeping runtime compatibility across Textual versions.
- 2026-03-01: TUI v2 gained `Ctrl+P` command palette with command parsing (`help`, `open`, `search`, `filter`, `archive/restore`, `edit-doc/save-doc/cancel-edit`, `link-add`, `link-rm`, `refresh`).
- Added a graph links panel in the right view that renders current entry links via `EntryService.get_links` and updates after palette link mutations.
- 2026-03-01: TUI v2 graph navigation expanded with relation-aware link filtering (`l` or `link-filter`) and quick neighbor traversal (`[`/`]` to change selected link, `o` or `link-open` to jump to target entry).
- Link panel now tracks selection state and displays active relation filter + selected link position to support KB-style navigation in large graphs.
- 2026-03-01: Phase 4 kickoff added `docs/tui_v2_parity_checklist.md` and linked it in docs indexes (`docs/README.md`, `landing/docs.html`) to track legacy-vs-v2 cutover readiness.
- TUI v2 large-vault UX/perf pass: entry list pagination (200/page, `p`/`n`, palette `page-next/page-prev/page <n>`) and document detail preview truncation (`content_truncated`) to avoid rendering extremely large payloads in the detail pane.
- 2026-03-01: TUI v2 error/recovery pass added unified failure recording (`_record_failure`) and retry workflow (`x` key + palette `retry`) across init/search/select/link/save/archive paths.
- Recovery hints are now included in status messages (for example, "Press 'x' to retry") and Phase 4 docs mark error/recovery flow work complete.
- 2026-03-01: Added `docs/tui_v2_cutover_decision.md` with explicit recommendation to keep legacy default for next release, required cutover gates, staged rollout, and rollback plan for switching `seedpass` default to TUI v2.
- Updated phase tracking docs to mark the cutover timing decision item complete and linked the memo in docs indexes.
- 2026-03-01: Began cutover-gate automation by extracting testable TUI v2 helpers (`parse_palette_command`, `pagination_window`, `truncate_entry_for_display`) from `tui_v2/app.py`.
- Added `src/tests/test_tui_v2_helpers.py` with coverage for palette parsing edge cases, pagination normalization, and large-vault pagination smoke sizes up to 50k rows.
- 2026-03-01: Added Textual interaction tests in `src/tests/test_tui_v2_textual_interactions.py` for pagination/search, document edit+save, link add/remove + neighbor open, and retry-after-failure.
- Introduced a test hook in `launch_tui2(..., app_hook=...)` so tests can capture and pilot the Textual app instance without starting a live terminal run.
- 2026-03-01: Added CI-like large-vault validation with explicit thresholds in `src/tests/test_tui_v2_large_vault_validation.py` (10k rows standard, 50k rows under `--stress`).
- Added docs `docs/tui_v2_large_vault_validation.md` with exact commands and budgets; parity checklist now marks large-vault CI-like validation complete.
- 2026-03-01: Added deterministic TUI v2 parity scenarios across entry kinds in `src/tests/test_tui_v2_parity_scenarios.py` (kind filters, archive/restore roundtrip, non-document edit guard).
- Completed help/docs alignment gate: updated `seedpass tui2` help text, capabilities hints for keybindings/palette (`Ctrl+P`, `p/n`, `x`), and docs discoverability commands (`seedpass tui2 --help/--check`).
- 2026-03-01: Switched default root CLI interactive routing to TUI v2 in `seedpass.cli.main` (when no subcommand), with automatic legacy fallback when Textual runtime is unavailable.
- Added explicit one-release override flag `--legacy-tui` and updated test coverage (`test_typer_cli.py`) for default TUI v2 launch, forced legacy path, and root fallback behavior.
- 2026-03-01: UX pass for TUI v2 added help overlay (`?`), quick jump input (`j`), pane focus switching (`1/2/3`) with visual focus borders, mode-tagged status line, and an activity log panel of recent actions.
- Added document dirty-state UX improvements (`Edit mode [*]` marker, no-op save guard) and updated Textual interaction/parity tests for Textual 8-compatible action-driven control paths.
- 2026-03-01: Visual polish pass for TUI v2 updated panel styling hierarchy (stronger status/pane contrast), refined left-panel summaries, improved help overlay readability, and added labeled headers for entry/detail and links sections.
- UI copy now emphasizes current selection/filter context while keeping deterministic action affordances unchanged; full TUI-focused test slice remains green.
- 2026-03-01: Reduced TUI v2 status noise by deduplicating repeated status messages before appending to status bar/activity log.
- Verified critical coverage gate against existing full coverage artifact (`artifacts/coverage/coverage.json`): all default threshold modules pass (main/core manager/core encryption/core migrations).
## 2026-03-01 Determinism test infrastructure hardening
- Added a dedicated determinism lane with `scripts/run_determinism_tests.sh` and wired `scripts/run_ci_tests.sh` to run it by default (`DETERMINISM_GATE=1`, disable with `DETERMINISM_GATE=0`).
- Added pytest marker support for determinism (`pyproject.toml`, `src/tests/conftest.py`) and a `--determinism-only` selector that skips non-determinism tests.
- Expanded deterministic regression vectors in `src/tests/test_deterministic_artifact_regression.py`:
- pinned entropy-stream SHA-256 vectors for indexes `0,1,352,1024`
- pinned password outputs for policy variants (default, safe specials, no specials, exclude ambiguous, restricted special charset)
- Marked existing deterministic suites so they run in the determinism lane: password helpers/policy plus seed, SSH, PGP, and Nostr determinism tests.
- Verified determinism lane now executes 23 focused tests and fails fast on derivation drift.
## 2026-03-01 Determinism gates + cross-process + size-tier sync tests
- Added `scripts/check_determinism_suite.py` and wired it into `scripts/run_determinism_tests.sh`.
- Determinism gate now enforces both a minimum test count (`DETERMINISM_MIN_TESTS`, default 25) and required determinism files, preventing accidental suite erosion.
- Added unit tests for determinism gate parser logic in `src/tests/test_check_determinism_suite.py`.
- Added cross-process determinism regression in `src/tests/test_cross_process_determinism.py`; derives artifacts in separate Python processes and asserts exact JSON identity.
- Expanded size-tier sync integrity coverage:
- `src/tests/test_document_file_io.py` includes large document import/export and portable backup restore invariance checks (hash/equality).
- `src/tests/test_full_sync_roundtrip.py` includes parameterized large document Nostr sync roundtrip with content hash checks.
- `src/tests/test_nostr_snapshot.py` includes chunk hash and gzip roundtrip integrity across multiple payload size tiers.
- Current determinism lane status after updates: 43 passed, 916 skipped.
## 2026-03-01 TUI v2 agent harness + deep coverage expansion
- Added `scripts/ai_tui2_agent_test.py` as a deterministic agent-style TUI v2 harness using Textual pilot mode; emits timestamped JSON reports in `artifacts/agent_tui2_test/`.
- Added test/process documentation: `docs/agent_test_format.md` with repeatable commands for TUI v2, legacy interactive harness, CLI/CUI, API, and determinism gate runs.
- Fixed legacy harness invalid-input regression after Document type addition: in `scripts/ai_tui_agent_test.py`, Add Entry invalid choice now uses `99` instead of `9`.
- Added `src/tests/test_tui_v2_action_matrix.py` to exercise broad TUI v2 action and palette paths (including guards/failure/retry/event handlers).
- Fixed a real TUI v2 help-overlay bug in `src/seedpass/tui_v2/app.py` where `[/]` text triggered Textual markup parsing errors (`MarkupError`).
- Latest TUI v2 focused coverage run:
- Command: test helper/interactions/parity/large-vault/action-matrix suites with `--cov=seedpass.tui_v2.app`
- Result: 25 passed, 2 skipped
- Coverage: 86% for `src/seedpass/tui_v2/app.py` (up from ~57%).
- Harness validation results:
- `scripts/ai_tui2_agent_test.py --scenario extended`: passed
- `scripts/ai_tui_agent_test.py --scenario core`: passed
## 2026-03-01 Installer + TUI v2 preflight fix (gray-screen mitigation)
- Root cause found for "blank/gray screen" reports: TUI v2 was initializing `PasswordManager` inside Textual mount via `entry_service_factory`, so password/setup prompts could occur behind the Textual screen and appear as a frozen UI.
- Updated `src/seedpass/cli/__init__.py` to pre-initialize entry service before launching Textual (`_prime_tui2_service`), then pass the ready service into `launch_tui2`.
- Added explicit fallback/error behavior:
- default `seedpass`: preflight failures now fall back to legacy TUI with details.
- `seedpass tui2 --no-fallback-legacy`: preflight failures now return exit code 1 with a clear error.
- Updated installer `scripts/install.sh` to run `seedpass tui2 --check` after install and warn when Textual runtime is unavailable, plus print a legacy fallback hint for users seeing blank/gray startup.
- Added regression coverage in `src/tests/test_typer_cli.py` for preflight behavior and adapted existing TUI launch tests to mock preflight service creation.
## 2026-03-01 TUI v2 parity slice: reveal + QR integration
- Added Textual TUI v2 sensitive-data actions:
- Keybindings: `v` reveal selected secret, `g` show QR.
- Palette commands: `reveal`, `qr`.
- Implemented reveal support for entry kinds: `password`, `seed`, `managed_account`, `totp`.
- Implemented QR rendering in-app (ASCII QR panel) for:
- TOTP (`otpauth://` payload)
- Seed / managed account seed (SeedQR digit payload)
- Added a dedicated `#secret-detail` panel in the right pane and reset-on-selection behavior to avoid stale secret display.
- Extended core `EntryService` API with deterministic seed retrieval methods used by TUI v2:
- `get_seed_phrase(entry_id)`
- `get_managed_account_seed(entry_id)`
- Added/updated tests for helper QR rendering, TUI reveal/QR workflows, and service wrappers; targeted suite passed.
## 2026-03-01 TUI v2 parity slice: SSH/PGP/Nostr + secret mode behavior
- Extended TUI v2 sensitive reveal support to additional kinds: `ssh`, `pgp`, and `nostr`.
- Added legacy-aligned confirmation semantics in TUI v2:
- `reveal confirm` required for high-risk reveals (`seed`, `managed_account`, `ssh`, `pgp`).
- `qr private confirm` required for Nostr private-key QR rendering.
- Added `qr` mode parsing (`qr [public|private] [confirm]`) and retained default safe behavior (`public` for Nostr).
- Integrated secret-mode behavior into TUI reveal flow:
- when secret mode is enabled, reveal copies sensitive value to clipboard and avoids on-screen plaintext output for that reveal.
- Expanded `EntryService` API for TUI parity and safe abstraction from manager internals:
- `get_ssh_key_pair`, `get_pgp_key`, `get_nostr_key_pair`
- `get_secret_mode_enabled`, `get_clipboard_clear_delay`, `copy_to_clipboard`
- Added/updated tests covering confirmation-gated flows, Nostr private QR confirmation, and secret-mode clipboard behavior.
## 2026-03-01 TUI v2 visual alignment with landing page
- Updated Textual TUI v2 default styling to mirror landing-page palette tokens:
- background: `#080a0c` / panel: `#0d1114`
- primary text: `#97b8a6` / bright text: `#daf2e5`
- accent borders/focus: `#58f29d`, `#2abf75`, `#274533`, `#1a3024`
- Styled Header/Footer/Input/ListView/ListItem focus/selection states to reduce default Textual blue and align with SeedPass mint-green terminal aesthetic.
- Added website-style icon semantics into TUI copy and sensitive panel titles (key/mobile/network/lock/bolt/document/users/seed mappings) to improve visual continuity between landing and app.
## 2026-03-01 Legacy launch ergonomics
- Added explicit CLI command `seedpass legacy` to launch the legacy interactive TUI directly, in addition to existing global flag `--legacy-tui`.
- Refactored legacy launch path through a shared helper in `seedpass.cli` so root fallback, `--legacy-tui`, `tui2` fallback, and `legacy` command all use consistent behavior and fingerprint forwarding.
- Added CLI regression tests for `seedpass legacy` with and without `--fingerprint`.
- Updated discoverability docs in `README.md` and `docs/README.md`.
## 2026-03-01 KB scale stress coverage + launch docs
- Added `src/tests/test_kb_scale_stress.py` for large-index KB validation:
- sort/tag/search across `10k` entries (and `100k` with `--stress`)
- high-degree graph link validation (`1k` edges standard, `5k` edges stress)
- Added `src/tests/test_tui_v2_kb_scale_stress.py` for Textual large-index interaction validation:
- pagination/navigation/search/filter behavior at `10k` rows standard and `50k` rows under `--stress`
- Added docs `docs/kb_scale_validation.md` with exact commands for standard and `--stress` runs.
- Updated launch documentation to clearly show all interactive launch modes:
- default (`seedpass`), explicit v2 (`seedpass tui2`), and legacy (`seedpass legacy` / `seedpass --legacy-tui`).
## 2026-03-01 TUI v2 parity backlog prioritization
- TORCH latest daily/weekly memory snapshots are mostly scheduler metadata; TUI parity priorities should continue to be driven by `docs/tui_v2_plan.md`, `docs/tui_v2_parity_checklist.md`, and direct legacy-vs-v2 code diff.
- Highest-impact remaining parity gaps identified:
1) Add-entry workflows for all kinds in TUI v2
2) Retrieve/action parity (notes/custom fields/tags/edit field-level variants/document export/QR submenus)
3) 2FA codes live board parity with timer + secret-mode clipboard behavior
4) Settings/profile/nostr operational parity in TUI v2
5) CI smoke gate for `seedpass tui2 --check` still marked open in plan
## 2026-03-01 TUI v2 parity tracking + Phase A add-entry slice
- Added a dedicated continuation tracker `docs/tui_v2_parity_backlog.md` and linked it from:
- `docs/tui_v2_plan.md`
- `docs/tui_v2_parity_checklist.md`
- `docs/README.md`
- Landed TUI v2 command-palette add-entry flows in `src/seedpass/tui_v2/app.py`:
- `add-password <label> <length> [username] [url]`
- `add-totp <label> [period] [digits] [secret]`
- `add-key-value <label> <key> <value>`
- `add-document <label> <file_type> <content>`
- Added usage validation and post-create behavior:
- strict argument/typing checks with status feedback
- refresh + selection focus to created entry (or nearest match for TOTP)
- retry wiring through existing `x` recovery path on service failures
- Extended Textual tests:
- `src/tests/test_tui_v2_textual_interactions.py` now includes add-command success and validation-error scenarios.
- `src/tests/test_tui_v2_action_matrix.py` test service now implements add methods and exercises add-command guards/success paths.
- Validation run:
- `.venv/bin/pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_tui_v2_helpers.py`
- Result: `24 passed`.
- Updated backlog checkoffs (Phase A): password/TOTP/key-value/document creation + validation/post-create focus are now marked complete; remaining work is SSH/PGP/Nostr/Seed/Managed Account creation flows and downstream parity phases.
## 2026-03-01 TUI v2 parity Phase A completion (remaining add kinds)
- Extended TUI v2 command palette add workflows in `src/seedpass/tui_v2/app.py` for remaining entry kinds:
- `add-ssh <label> [index]`
- `add-pgp <label> [index] [key_type] [user_id]`
- `add-nostr <label> [index]`
- `add-seed <label> [words] [index]`
- `add-managed-account <label> [index]`
- Added argument validation and status hints for all new commands, including integer checks for index/words arguments and retry integration on service failures.
- Updated discoverability text in palette/help/filter hints to include the new add command set.
- Expanded test doubles and coverage:
- `src/tests/test_tui_v2_textual_interactions.py`: success + validation coverage for all add commands (existing and new).
- `src/tests/test_tui_v2_action_matrix.py`: guard paths and success paths for new add commands.
- Validation run repeated after formatting:
- `.venv/bin/pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_tui_v2_helpers.py`
- Result: `24 passed`.
- Backlog update:
- `docs/tui_v2_parity_backlog.md` Phase A is now fully checked off.
- Next priority to start: Phase B retrieve/action parity (notes/custom fields/tags/field-level edits/document export/nostr QR submenu behaviors).
## 2026-03-01 TUI v2 parity Phase B slice: notes/tags/custom fields/document export
- Added retrieve/action parity commands to TUI v2 palette in `src/seedpass/tui_v2/app.py`:
- `notes-set <text>` / `notes-clear`
- `tag-add <tag>` / `tag-rm <tag>` / `tags-set <comma-list>` / `tags-clear`
- `field-add <label> <value> [hidden-token]` / `field-rm <label>`
- `doc-export [output_path]` (selected document only)
- Introduced helper paths for selected-entry mutation:
- `_selected_entry_payload()` for reliable selected entry fetch/guarding
- `_apply_selected_modify(...)` to centralize modify->reload->reselect->retry behavior
- Added/extended tests:
- `src/tests/test_tui_v2_textual_interactions.py` adds success + validation coverage for notes/tags/custom fields/doc export.
- `src/tests/test_tui_v2_action_matrix.py` now exercises new command guards and paths.
- Fake services in both test files now implement `export_document_file(...)`.
- Validation:
- `.venv/bin/pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_tui_v2_helpers.py`
- Result: `26 passed`.
- UI-status formatting note for Textual markup:
- Bracketed usage strings like `[hidden]`/`[output_path]` get treated as markup and partially disappear in status rendering.
- Switched those usage strings to plain text `(optional: ...)` format.
- Backlog updates in `docs/tui_v2_parity_backlog.md`:
- Checked off Phase B items for notes, tags, custom fields, document export, and Nostr public/private QR submenu parity.
- Remaining Phase B gap: field-level edit parity for non-document kinds.
## 2026-03-01 TUI v2 parity Phase B slice: field-level edits for non-document kinds
- Added palette commands in `src/seedpass/tui_v2/app.py`:
- `set-field <name> <value>` (alias `field-set`)
- `clear-field <name>` (alias `field-clear`)
- Implemented kind-aware field edit allowlists and validation:
- password: `label/notes/username/url/length`
- totp: `label/notes/period/digits`
- key_value: `label/notes/key/value`
- document: `label/notes/file_type/content`
- other kinds: `label/notes`
- Integer coercion/validation added for `length/period/digits` with explicit status errors.
- Added shared selected-entry modify helpers to keep behavior deterministic and consistent:
- `_selected_entry_payload()`
- `_apply_selected_modify(...)`
- Expanded tests:
- `src/tests/test_tui_v2_textual_interactions.py` adds success + validation tests for set/clear field workflows across password/totp/key_value.
- `src/tests/test_tui_v2_action_matrix.py` includes command guard and action-path coverage for new commands.
- Validation:
- `.venv/bin/pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_tui_v2_helpers.py`
- Result: `28 passed`.
- Backlog update:
- `docs/tui_v2_parity_backlog.md` now marks Phase B field-level edit parity complete.
- Phase B is effectively complete in tracker and next focus should move to Phase C (dedicated 2FA board parity).
## 2026-03-01 TUI v2 parity Phase C: dedicated 2FA board
- Added dedicated 2FA board mode in `src/seedpass/tui_v2/app.py`:
- keybind: `6` (`action_toggle_totp_board`)
- palette commands: `2fa-board`, `2fa-hide`, `2fa-refresh`, `2fa-copy <entry_id>`
- Added right-pane board widget `#totp-board` and visibility switching helpers.
- Added live refresh/timer behavior:
- app interval tick (`set_interval(1.0, _tick_totp_board)`) updates board while visible
- per-row remaining seconds (`rem`) based on each TOTP period
- Added board display semantics for deterministic/imported split:
- source column (`det` / `imp`) from `deterministic` flag fallback to secret presence
- Added secret-mode behavior for board:
- board masks visible codes as `******` when secret mode is enabled
- `2fa-copy` copies actual code to clipboard and reports clear-delay status
- Updated help/filter/palette discoverability text with new 2FA board commands.
- Test coverage added/expanded:
- `src/tests/test_tui_v2_textual_interactions.py`:
- `test_tui2_textual_2fa_board_view_timer_and_copy`
- `test_tui2_textual_2fa_board_secret_mode_and_validation`
- `src/tests/test_tui_v2_action_matrix.py` command matrix includes 2FA command guards/actions
- Validation:
- `.venv/bin/pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_tui_v2_helpers.py`
- Result: `30 passed`.
- Backlog update: all Phase C checkbox items now marked complete in `docs/tui_v2_parity_backlog.md`.
## 2026-03-01 TUI v2 parity Phase D slice: profile + settings palette plumbing
- Extended `launch_tui2(...)` to accept optional `profile_service_factory` and `config_service_factory`, in addition to entry service factory.
- Updated CLI preflight wiring (`src/seedpass/cli/__init__.py`) so TUI v2 receives entry/profile/config services from a single initialized manager when available, while preserving existing monkeypatch compatibility in CLI tests.
- Added new TUI v2 palette commands in `src/seedpass/tui_v2/app.py`:
- `profiles-list`
- `profile-switch <fingerprint> [password]`
- `setting-secret <on|off> [delay]`
- `setting-offline <on|off>`
- `setting-quick-unlock <on|off>`
- Added toggle parsing helper for robust boolean token handling (`on/off/true/false/...`).
- Added Textual interaction test fakes for profile/config services and new command coverage:
- `test_tui2_textual_profiles_and_settings_palette_commands`
- `test_tui2_textual_profiles_and_settings_palette_validation`
- Expanded action-matrix command coverage to include new profile/settings command guard paths.
- Validation run:
- `.venv/bin/pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_tui_v2_helpers.py src/tests/test_typer_cli.py`
- Result: `86 passed`.
- Backlog update (`docs/tui_v2_parity_backlog.md`):
- marked `secret mode / quick unlock / offline toggles` complete.
- profile switch/add/remove/list/rename remains open because only list/switch command-path parity is currently implemented; add/remove/rename UX flows still pending.
## 2026-03-01 TUI v2 parity Phase D slice: profile lifecycle + relay/sync command paths
- Extended TUI launch wiring to accept optional `nostr_service_factory` and `sync_service_factory` in `launch_tui2(...)`.
- Updated CLI preflight service bundle (`src/seedpass/cli/__init__.py`) to pass entry/profile/config/nostr/sync services from a shared manager when available, while preserving monkeypatch compatibility in CLI tests.
- Added new palette commands in `src/seedpass/tui_v2/app.py`:
- profile lifecycle: `profile-add`, `profile-remove <fingerprint>` (plus existing `profiles-list`, `profile-switch`)
- relays/sync: `relay-list`, `relay-add <url>`, `relay-rm <index>`, `sync-now`, `sync-bg`
- Added Textual interaction fakes + coverage for new service surfaces:
- fake profile service now supports add/remove
- new fake nostr service for relay list/add/remove
- new fake sync service for sync-now/bg paths
- Expanded command matrix coverage to include new profile/relay/sync guard-path commands.
- Validation:
- `.venv/bin/pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_tui_v2_helpers.py src/tests/test_typer_cli.py`
- Result: `86 passed`.
- Backlog status update:
- Phase D rows for profile and relay/sync remain open because profile rename and relay reset parity are still missing.
- Added explicit progress note in `docs/tui_v2_parity_backlog.md` documenting currently landed command coverage.
## 2026-03-01 TUI v2 parity Phase D completion slice: profile rename + relay reset
- Service-layer additions in `src/seedpass/core/api.py`:
- `ProfileService.rename_profile(fingerprint, name)` using fingerprint manager naming support.
- `NostrService.reset_relays()` to restore default relays, persist config/state, and update active Nostr client relay list.
- TUI palette additions in `src/seedpass/tui_v2/app.py`:
- `profile-rename <fingerprint> <name>`
- `relay-reset`
- Existing profile/relay command set now covers:
- profiles: list/switch/add/remove/rename
- relays/sync: list/add/remove/reset + sync-now/sync-bg
- Test updates:
- `src/tests/test_tui_v2_textual_interactions.py` fakes now implement `rename_profile` and `reset_relays`; success/validation tests assert both command paths.
- `src/tests/test_tui_v2_action_matrix.py` matrix guard coverage includes `profile-rename` and `relay-reset`.
- Validation:
- `.venv/bin/pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_tui_v2_helpers.py src/tests/test_typer_cli.py`
- Result: `86 passed`.
- Backlog update:
- `docs/tui_v2_parity_backlog.md` now marks both `profile switch/add/remove/list/rename` and `relay view/add/remove/reset + sync controls` complete.
- Remaining Phase D open items are `inactivity timeout + KDF settings` and checksum/import-export utility actions.
## 2026-03-01 TUI v2 parity Phase D completion slice: inactivity/KDF + checksum/export utilities
- Extended TUI launch dependency injection to include optional `utility_service_factory` and `vault_service_factory`.
- CLI preflight bundle (`src/seedpass/cli/__init__.py`) now provides utility/vault services to TUI v2 when manager-backed services are available.
- Added new settings commands in `src/seedpass/tui_v2/app.py`:
- `setting-timeout <seconds>`
- `setting-kdf-iterations <n>`
- `setting-kdf-mode <mode>`
- Added utility/export commands:
- `checksum-verify`
- `checksum-update`
- `db-export <path>`
- `db-import <path>`
- `totp-export <path>`
- `parent-seed-backup [path] [password]`
- Added support commands to existing profile/relay set:
- `profile-rename <fingerprint> <name>` and `relay-reset` (wired to new service methods).
- Service-layer additions in `src/seedpass/core/api.py`:
- `ProfileService.rename_profile(...)`
- `NostrService.reset_relays()`
- Test coverage updates:
- `src/tests/test_tui_v2_textual_interactions.py` now has fakes and assertions for all new settings/checksum/export/profile-rename/relay-reset commands.
- `src/tests/test_tui_v2_action_matrix.py` command matrix includes guard path invocations for the new commands.
- Validation:
- `.venv/bin/pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_tui_v2_helpers.py src/tests/test_typer_cli.py`
- Result: `86 passed`.
- Backlog update:
- `docs/tui_v2_parity_backlog.md` now marks all Phase D items complete.
- Remaining backlog focus shifts to Phase E release/CI closure work.
## 2026-03-01 TUI v2 parity Phase E: CI smoke + docs/help closure
- Added dedicated CI smoke script for TUI v2 runtime diagnostics:
- `scripts/tui2_check_smoke.sh`
- Executes `seedpass tui2 --check` when CLI binary is available, otherwise falls back to Typer `CliRunner` invocation.
- Validates JSON output keys (`status`, `backend`, `textual_available`, `message`) and backend value (`textual`).
- Includes `python`/`python3` fallback handling for portability.
- Wired CI smoke gate into default CI test runner:
- `scripts/run_ci_tests.sh` now runs `./scripts/tui2_check_smoke.sh` before determinism/full test suite.
- Added explicit workflow smoke step for Poetry matrix:
- `.github/workflows/tests.yml` includes `poetry run seedpass tui2 --check`.
- Phase E docs/status updates:
- `docs/tui_v2_parity_backlog.md` marks all Phase E closure items complete and includes release notes.
- `docs/tui_v2_plan.md` marks the CI smoke command item complete in Phase 0.
- `docs/tui_v2_parity_checklist.md` adds closure notes for CI smoke and retained legacy fallback paths.
- Validation run:
- `scripts/tui2_check_smoke.sh` => `tui2 --check smoke: ok`
- `bash -n scripts/tui2_check_smoke.sh scripts/run_ci_tests.sh` => clean
- `.venv/bin/pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_tui_v2_helpers.py src/tests/test_typer_cli.py` => `86 passed`.
## 2026-03-02 TUI v2 UX fixes: stale selection panel, clipped nav/help, and sensitive feedback clarity
- Reproduced screenshot-reported UX issues in TUI v2:
- Left panel could show stale `Selected: (none)` even while entry details were loaded.
- Left panel command text could clip/wrap aggressively and hide actionable hints.
- Sensitive reveal/QR confirmation paths could appear like no-op when only status line changed.
- QR output could become visually distorted by line wrapping in the secret panel.
- Fixes implemented in `src/seedpass/tui_v2/app.py`:
- `_show_entry(...)` now refreshes the filters panel immediately so selected state is always in sync.
- Added `on_list_view_highlighted(...)` to keep selected entry aligned with list highlight navigation.
- Left filters pane now uses `height: 1fr` + `overflow: auto` to prevent clipping.
- Secret panel now sets `text-wrap: nowrap` to preserve QR matrix geometry.
- Footer top border removed to avoid visual crowding at the bottom status/footer region.
- Filters/nav action copy trimmed to avoid forced line wraps in narrow terminals.
- Confirmation-required reveal/QR actions now also write explicit instructions into `#secret-detail`.
- Added regression coverage in `src/tests/test_tui_v2_textual_interactions.py`:
- `test_tui2_textual_filters_panel_tracks_selected_entry` ensures left-panel selected summary updates after opening a different entry.
- Validation:
- `pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_tui_v2_helpers.py` -> `33 passed`.
- `python scripts/ai_tui2_agent_test.py --scenario core --verbose` -> `[PASS] core`.
## 2026-03-02 Hardening checklist execution (post TUI v2 UX patch)
- Completed requested hardening items in repo workspace:
1) CI-equivalent run via `scripts/run_ci_tests.sh`: PASS.
- Determinism gate: `43 passed, 950 skipped`.
- Full suite: `977 passed, 16 skipped`.
2) Installer smoke (`beta`) via `scripts/installer_smoke_unix.sh`:
- `mode=tui`: PASS.
- `mode=both`: PASS (GUI intentionally skipped in headless runtime).
3) Parity bug-bash harnesses:
- `scripts/ai_tui2_agent_test.py --scenario extended --verbose`: PASS.
- `scripts/ai_tui_agent_test.py --scenario extended --verbose`: PASS.
- Added release note document: `docs/beta_hardening_2026-03-02.md` with checklist commands, results, and residual operational warning about stale launcher binaries on PATH.
- Practical note: Installer repeatedly warns about stale `/home/user/.local/bin/seedpass` entries; this does not fail install but can obscure which binary users are executing.
## 2026-03-02 Next parity slice: keyboard-path managed-account sensitive actions
- Added explicit keyboard-path TUI v2 regression coverage for managed-account sensitive actions.
- New test in `src/tests/test_tui_v2_textual_interactions.py`:
- `test_tui2_textual_managed_account_keyboard_reveal_and_qr`
- Validates pressing `v` triggers confirmation-required reveal messaging for managed-account entries.
- Validates pressing `g` renders managed-account QR payload after list focus is set.
- Note on test ergonomics:
- Search input can capture keystrokes by default; test now focuses `#entry-list` before keybinding presses to exercise app-level binding path reliably.
- Validation run:
- `pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_tui_v2_helpers.py` -> `34 passed`.
## 2026-03-02 Centralized dev planning doc added
- Added `docs/dev_control_center.md` as the single decision-layer document for what to work on next.
- The control center now links plan, parity, security, QA, and hardening documents and includes a prioritized next-step queue.
- Added `docs/README.md` “Start Here” link pointing to `dev_control_center.md`.
- Pre-slice health verification executed first:
- remote sync check on `origin/beta` (no new remote commits)
- `scripts/run_ci_tests.sh` pass with full suite: `979 passed, 16 skipped`, coverage `85.65%`.
## 2026-03-02 Slice A implementation progress: managed-account session parity
- Added parity matrix doc: `docs/tui_v2_legacy_parity_matrix.md` and linked it from control-center/readme docs.
- Implemented managed-account session controls in TUI v2 palette:
- `managed-load (optional: entry_id)`
- `managed-exit`
- Added core service wrappers in `src/seedpass/core/api.py`:
- `EntryService.load_managed_account(entry_id)`
- `EntryService.exit_managed_account()`
- Added tests:
- `src/tests/test_tui_v2_textual_interactions.py` (session command behavior + validation)
- `src/tests/test_tui_v2_action_matrix.py` (command matrix coverage)
- `src/tests/test_core_api_services.py` (service wrapper calls)
- Validation:
- `pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_core_api_services.py`
- Result: `86 passed`.
- Updated matrix priorities: next parity target is explicit Nostr maintenance commands (`reset sync state`, `fresh namespace`).
## 2026-03-02 Next gap landed: Nostr maintenance parity in TUI v2
- Implemented two legacy Nostr maintenance equivalents in TUI v2 palette:
- `nostr-reset-sync-state`
- `nostr-fresh-namespace`
- Added service-layer methods in `src/seedpass/core/api.py` (`NostrService`):
- `reset_sync_state()`
- `start_fresh_namespace()`
- includes runtime sync-state clearing and account index management.
- Added/updated tests:
- `src/tests/test_tui_v2_textual_interactions.py` (happy path + unavailable/usage validation)
- `src/tests/test_tui_v2_action_matrix.py` (command matrix coverage)
- `src/tests/test_core_api_services.py` (service method behavior)
- Validation:
- `pytest -q src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_core_api_services.py`
- Result: `88 passed`.
- Updated planning docs:
- `docs/tui_v2_legacy_parity_matrix.md` marks Nostr maintenance parity as implemented.
- `docs/dev_control_center.md` now points to archived-only view/filter as the next parity target.
## 2026-03-02 Next parity slice landed: archived view/filter parity in TUI v2
- Added archive-scope support across TUI v2 entry browsing with three modes:
- `active` (default, excludes archived entries)
- `all` (includes active + archived)
- `archived` (archived-only)
- TUI v2 updates in `src/seedpass/tui_v2/app.py`:
- new keybinding: `h` (`action_cycle_archive_scope`)
- new palette command: `archive-filter <active|all|archived>`
- left filter panel now shows `Archive: <scope>`
- search loads now pass archive scope to service search.
- Core wrapper updates in `src/seedpass/core/api.py`:
- `EntryService.search_entries(...)` now accepts
- `include_archived: bool = False`
- `archived_only: bool = False`
- wrapper filters archived rows deterministically on top of entry-manager search results.
- UX parity fix bundled:
- palette `archive`/`restore` branch now returns correctly after success.
- archive/restore flows preserve selected-entry context when an archived item leaves the active view, enabling immediate restore roundtrip without forced reselection.
- Test coverage updates:
- `src/tests/test_core_api_services.py`: archive include/exclude/only behavior for `EntryService.search_entries`.
- `src/tests/test_tui_v2_textual_interactions.py`: new archive-scope interaction test.
- updated TUI fake services across
- `test_tui_v2_textual_interactions.py`
- `test_tui_v2_action_matrix.py`
- `test_tui_v2_kb_scale_stress.py`
- `test_tui_v2_parity_scenarios.py`
to accept archive-scope args.
- Validation run:
- `pytest -q src/tests/test_core_api_services.py src/tests/test_tui_v2_textual_interactions.py src/tests/test_tui_v2_action_matrix.py src/tests/test_tui_v2_kb_scale_stress.py src/tests/test_tui_v2_parity_scenarios.py`
- Result: `96 passed, 1 skipped`.
- Planning docs updated:
- `docs/tui_v2_legacy_parity_matrix.md` marks archived-only view parity implemented.
- `docs/dev_control_center.md` next target updated to dedicated `npub` utility command parity.
## 2026-03-02 Next parity slice landed: dedicated Nostr npub utility command
- Implemented utility-style Nostr pubkey command in TUI v2 palette:
- `npub`
- alias: `nostr-pubkey`
- Behavior in `src/seedpass/tui_v2/app.py`:
- validates no-arg usage (`Usage: npub`)
- requires Nostr service availability and `get_pubkey()` support
- fetches active profile pubkey and renders it in `#secret-detail`
- includes QR payload rendering for `nostr:<npub>` when QR runtime is available
- status line reports `Displayed active Nostr pubkey`
- Help/discovery text updated to include `npub` in palette placeholder/help/actions copy.
- Test coverage updates:
- `src/tests/test_tui_v2_textual_interactions.py`
- success path in profiles/settings command flow (`npub` status + panel assertion)
- unavailable service path (`Nostr service unavailable`)
- invalid usage path (`npub now` -> `Usage: npub`)
- `src/tests/test_tui_v2_action_matrix.py`
- matrix command-path coverage invokes `npub`.
- Parity docs update:
- `docs/tui_v2_legacy_parity_matrix.md` now marks `Display npub` as Implemented.
- `docs/dev_control_center.md` progress notes now include `npub` parity completion and shift next target to checklist closure.
## 2026-03-02 Parity checklist closure: full legacy workflow coverage
- Executed parity bug-bash harnesses for both interactive stacks:
- `python scripts/ai_tui2_agent_test.py --scenario extended --verbose`
- Result: `PASS`
- Report: `artifacts/agent_tui2_test/20260302T135526Z/report.json`
- `python scripts/ai_tui_agent_test.py --scenario extended --verbose`
- Result: `PASS`
- Report: `artifacts/agent_tui_test/20260302T135526Z/report.json`
- Updated parity documentation:
- `docs/tui_v2_parity_checklist.md`
- status changed to parity-complete on `beta`
- `Full legacy workflow coverage` changed from `Pending` to `Yes`
- added evidence section with exact commands and report paths.
- `docs/dev_control_center.md`
- removed parity-closure pending state
- shifted priority stack to post-parity cutover readiness (testing gates, Nostr resilience, cutover memo, supply-chain readiness).
## 2026-03-02 Testing-gate hardening: TUI v2 + service coverage thresholds
- Added dedicated focused gate script: `scripts/tui2_coverage_gate.sh`.
- Gate behavior:
- uses `.venv/bin/python` when available (fallback `python`/`python3`)
- checks Textual runtime availability before running focused TUI v2 coverage suite
- runs focused tests with coverage output: `artifacts/coverage/coverage.tui2_gate.json`
- enforces thresholds via `scripts/check_critical_coverage.py --no-default-thresholds`:
- `src/seedpass/tui_v2/app.py >= 78%`
- `src/seedpass/core/api.py >= 85%`
- writes machine-readable result to `artifacts/coverage/critical_gate.tui2.json`.
- Strengthened default critical-coverage policy:
- `scripts/check_critical_coverage.py` default thresholds now include:
- `src/seedpass/core/api.py = 85%`.
- CI runner hardening:
- `scripts/run_ci_tests.sh` now enables `CRITICAL_COVERAGE_GATE` by default (`1`).
- adds JSON output for full-suite gate: `artifacts/coverage/critical_gate.full.json`.
- adds focused TUI v2 gate call controlled by `TUI2_COVERAGE_GATE` (default `1`).
- coverage-gate Python invocation now uses `python`/`python3` fallback resolution.
- Test/doc updates:
- `src/tests/test_check_critical_coverage.py` includes assertion for new default API threshold.
- docs updated in:
- `docs/ai_agent_tui_testing.md`
- `docs/security_readiness_checklist.md`
- `docs/dev_control_center.md`
- Validation run (this slice):
- `pytest -q src/tests/test_check_critical_coverage.py` -> `9 passed`
- `./scripts/tui2_coverage_gate.sh` -> PASS
- `src/seedpass/core/api.py: 86.64%`
- `src/seedpass/tui_v2/app.py: 79.87%`
- `python3 scripts/check_critical_coverage.py artifacts/coverage/coverage.json --json-output artifacts/coverage/critical_gate.full.json` -> PASS.
## 2026-03-02 Nostr resilience deterministic failure-mode suite expansion
- Added new deterministic resilience tests in `src/tests/test_nostr_resilience_failure_modes.py` targeting `PasswordManager` Nostr sync error paths.
- New covered scenarios:
- `sync_vault_async` returns `None` and sets explicit error when encrypted index bytes are unavailable.
- `sync_vault_async` preserves relay/publish error text when `publish_snapshot` fails to produce an event ID.
- `sync_vault_async` sets fallback publish failure error when no relay error text is provided.
- `sync_index_from_nostr_async` emits warning notification when snapshot fetch returns no result and client has `last_error`.
- `sync_index_from_nostr_async` emits warning notification on snapshot-fetch exceptions.
- Validation run:
- `pytest -q src/tests/test_nostr_resilience_failure_modes.py src/tests/test_background_vault_sync_paths.py src/tests/test_post_sync_messages.py src/tests/test_offline_mode_behavior.py`
- Result: `16 passed`.
- Docs updated:
- `docs/security_readiness_checklist.md` now includes `test_nostr_resilience_failure_modes.py` under Nostr resilience evidence.
- `docs/dev_control_center.md` progress notes updated to reflect deterministic Nostr resilience suite expansion.