diff --git a/src/DodoSSH.Client.App/Views/KeychainScreen.axaml b/src/DodoSSH.Client.App/Views/KeychainScreen.axaml
index f8a86c9..2c264cc 100644
--- a/src/DodoSSH.Client.App/Views/KeychainScreen.axaml
+++ b/src/DodoSSH.Client.App/Views/KeychainScreen.axaml
@@ -26,503 +26,613 @@
when somebody is in a team — but it is still not a selector, because every table on this screen already
spans every keychain this session holds a key for and each row names its own. What it carries instead is
the one keychain question with an answer: where a new item is filed.
+
+ ── v5b — Keychain.dc.html ──────────────────────────────────────────────────────────────────────────────
+ A fidelity pass over the shape above, not a new one. What moved:
+
+ ◆ THE HEADER. "Keychain" 33 bold, a count chip, and on the right a "Host keys" ghost button — the
+ design's own doorway to the pins screen, wired to the shell's existing ShowScreenCommand via
+ $parent[Window] since this screen's own DataContext is the vault rather than the shell — and one
+ "+ New key" accent button rather than the five GENERATE / + SSH KEY / + PASSWORD / + TAG / + BUCKET
+ buttons the toolbar used to spread across the table's own header. ◆ DECIDED DEVIATION: the design draws
+ one button because its mock has one "add" concept; this application has five, and folding five capabilities
+ into one visible button without losing any of them means the button opens a menu naming all five, in the
+ same order the old toolbar had them, rather than guessing which one the design's single button "really"
+ meant. GENERATE keeps its own tooltip; the strip's own essay comment about why it lost the word KEY is now
+ moot — the width pressure that produced it left with the buttons.
+
+ ◆ THE RAIL. 200px, Sidebar-bg, KEYCHAIN tracked label, category rows restyled to Button.cat's own idiom
+ (unchanged binding, new width). Below the divider: SCOPES stays — this session's current vault, named,
+ since that fact is real and the design's mock is a single-vault sample with nothing to show it — and then
+ NEW ITEMS FILE TO, the design's own wording for the picker this screen already had as "NEW ITEMS GO TO".
+ Adopted rather than kept: nothing in this file's own essay comments ever defended "GO TO" over "FILE TO",
+ and the comment above the picker already says "where a new item is filed" — the design's word was this
+ screen's own vocabulary already.
+
+ ◆ THE TABLE. A 44px sub-toolbar (the section summary, left; a 240px filter box, right — this table had no
+ filter box before, and the design's has one) and tracked column headers. The design's own five are
+ NAME/TYPE/VAULT/USED BY/MODIFIED; MODIFIED is dropped — VaultItem carries no timestamp of any kind (id,
+ secret, version, three sync flags — see docs/design-import-gaps.md) — and USED BY is real for a key or a
+ credential (which hosts authenticate with it, the same fact VaultViewModel.HostsBoundTo already computes
+ for the deletion warning) and empty for a tag (its own host count already covers the same ground) or a
+ bucket (nothing in this codebase resolves a host's authentication to an object store). Rows: a type glyph,
+ the mono name, the type word, and the vault chip — VaultItemRowViewModel.VaultBadge, empty except where
+ more than one vault is in play, the same convention every other list in this application follows.
+
+ ◆ THE DETAIL PANE, 300px. PUBLIC KEY draws when the selected key has one stored. FINGERPRINT is not
+ drawn at all — this codebase has never computed one; see docs/design-import-gaps.md's own recorded gap,
+ "no algorithm field, no fingerprint, and computing either means parsing armour the type stores verbatim."
+ USED BY draws real host rows — the same HostsBoundTo scan, with each host's own two-state dot — only for
+ a key or a credential, and only while at least one host actually authenticates with the selected item; the
+ "in use · N hosts" chip beside the vault chip is gated the same way. The action buttons keep their
+ existing commands and their existing honesty: COPY PUBLIC KEY only for a key, MOVE only where
+ CanMoveSelectedItem says there is somewhere to move to, DELETE always. "Choose something on the left…"
+ stays as the empty state, restyled.
-->
-
+
-
-
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
-
-
-
+
+
+
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
+
-
-
+
+
+
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/DodoSSH.Client.App/Views/LogsScreen.axaml b/src/DodoSSH.Client.App/Views/LogsScreen.axaml
index b415474..635f4ba 100644
--- a/src/DodoSSH.Client.App/Views/LogsScreen.axaml
+++ b/src/DodoSSH.Client.App/Views/LogsScreen.axaml
@@ -18,136 +18,237 @@
The connections list shows anything still open at the top, marked "still open" rather than with a dash. A
dash would read as a missing recording, and the two are opposite facts — an entry is written once, when a
connection closes, so a live session is deliberately not in the vault yet.
+
+ ── v5b — Logs.dc.html ──────────────────────────────────────────────────────────────────────────────────
+ A fidelity pass, not a new shape. What moved:
+
+ ◆ THE HEADER. "Logs" 33 bold plus the two-segment CONNECTIONS/KEYCHAIN control, restyled onto
+ Border.navtrack/Button.navseg — the same h31 track the rail's own SSH/SFTP/S3 switcher already uses,
+ reused rather than redrawn, since it is the identical shape at the identical size. Two segments and not
+ three: LOGS is the screen's own title, not a tab, so the design's own two — CONNECTIONS and KEYCHAIN —
+ are the whole of what this screen switches between, exactly matching LogSection's own two values. No
+ deviation to record here. On the right: a mono status sentence — LogsViewModel.HeaderStatusLine, which
+ shows a refresh error when there is one and otherwise the fact this screen's own header comment already
+ states about whichever log is showing — and REFRESH, unchanged.
+
+ ◆ THE BODY. A bordered radius-12 container on Pane bg wraps each table now, in place of the plain
+ background either one drew before. Tracked column headers are unchanged — HOST/ADDRESS/LASTED/KIND/
+ STARTED/FROM for connections, ITEM/TYPE/WHAT/FIELDS/WHEN for keychain activity, both already matching the
+ design exactly. Rows keep their real two-state host dot (green only for a session genuinely open right
+ now, per HasVisible on ConnectionLogRowViewModel.IsLive — never a third colour) and their existing
+ "failed"/"host key refused" amber badges. WHAT, on the activity table, is now a small coloured chip rather
+ than plain text — green for created, purple for a plain change, red for deleted — reading the same
+ ActivityOperation this screen already resolved to a word; a chip rather than a fabricated new fact.
+
+ ◆ THE FOOTER. Logs.dc.html's own lock-glyph sentence — "Both logs are ordinary synced keychain items —
+ end-to-end encrypted. The server learns only that rows exist and when they were written." — verified
+ against this file's own header remark above and ADR 0001 before shipping it: both are true, so the
+ sentence is drawn as literal text rather than reworded.
-->
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/src/DodoSSH.Client.App/Views/SnippetsScreen.axaml b/src/DodoSSH.Client.App/Views/SnippetsScreen.axaml
index 2e2327c..2bcdc33 100644
--- a/src/DodoSSH.Client.App/Views/SnippetsScreen.axaml
+++ b/src/DodoSSH.Client.App/Views/SnippetsScreen.axaml
@@ -10,245 +10,357 @@
The list and the writing belong to the vault, as every other item kind's do; this screen is the filter,
the editor and the insert over the top. See SnippetsViewModel.
- The two buttons at the bottom right are the whole safety design, and their wording is load-bearing.
- A terminal is one input stream with no notion of being at a prompt — the remote may be inside vi, or at
- a sudo password prompt with echo off — so this application cannot say "run this command", only "type
- this into whatever is there". RUN appears solely for a snippet whose own flag says it runs, which makes
- that a decision taken once while writing it rather than a button beside every one of them.
+ The two buttons at the bottom right of the detail pane are the whole safety design, and their wording is
+ load-bearing. A terminal is one input stream with no notion of being at a prompt — the remote may be
+ inside vi, or at a sudo password prompt with echo off — so this application cannot say "run this
+ command", only "type this into whatever is there". RUN appears solely for a snippet whose own flag says
+ it runs, which makes that a decision taken once while writing it rather than a button beside every one
+ of them.
+
+ ── v5b — Snippets.dc.html ──────────────────────────────────────────────────────────────────────────────
+ A fidelity pass, not a new shape. What moved:
+
+ ◆ THE SCREEN'S OWN TITLE. The design renames this screen "Snips" — adopted here on screen, matching the
+ nav rail, which already says Snips (see NavRail.axaml's own remark on the mock's wording for this
+ destination).
+
+ ◆ THE HEADER. "Snips" 33 bold, a count chip, the existing filter box restyled to 280px, and a
+ "+ New snip" accent button in place of the old ghost "+ NEW SNIPPET" — same NewCommand.
+
+ ◆ THE LIST. Card rows rather than a flat list — radius 10, Track fill and an accent ring on the selected
+ one, Track on hover — with a { } glyph, the mono name, the "runs immediately" chip (real: it is
+ RunsOnInsert, already tracked per snippet), the vault chip, and the mono command preview beneath. No
+ modified date: SnippetSecret carries none, and neither does any other item kind — VaultItem is (id,
+ secret, version, three sync flags) and nothing else; see docs/design-import-gaps.md. The bottom action
+ row keeps EDIT / MOVE TO VAULT… / DELETE, restyled and DELETE now danger-coloured to match.
+
+ ◆ THE DETAIL/EDITOR SIDEBAR, widened to 340px per the design. Two modes exist as they always have — the
+ editor while IsEditing, the selected snippet's own facts and its insert controls otherwise — because the
+ two are genuinely different forms doing different things, not a cosmetic split; merging them would let
+ somebody fixing a typo re-file a snippet by leaving a vault picker where they found it. VAULT draws a
+ lock glyph beside the vault name, per the design. "Runs on insert"/"runs immediately" keeps this screen's
+ own longer caption rather than the design's shorter one — it states the operational consequence
+ ("typed at the prompt and waits for you") where the design's states only the rationale for having the
+ setting once; both are true, the existing one is more actionable. The insert button keeps its own dynamic
+ label — "TYPE INTO {tab}" or "NO TERMINAL OPEN" — over the design's static "Type into terminal", because
+ naming the destination tab is a fact the design's caption does not carry and this screen already had.
+ Its own caption similarly stays: it names vi and a sudo prompt with echo off as the two ways "at a
+ prompt" can be wrong, which is more than the design's own sentence says.
+
+ ◆ THE DELETE CONFIRMATION. Snippets.dc.html's own modal — vault-wide reach, a tombstone, no undo — is
+ exactly what VaultViewModel.HowFarADeletionGoes already says for every other kind of item, so
+ SnippetsViewModel.RequestDelete/ConfirmDelete/CancelDelete say it in the same words. Additive next to the
+ existing uncounted DeleteCommand rather than a change to it — that command is what the phone's own DELETE
+ row still calls, with no confirmation card on that screen to answer one; see SnippetsViewModel's own
+ remarks on both commands.
-->
-
+
+
+
+
+
+
+
-
+
-
-
-
-
+
+
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
+
+
+
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
+
-
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+