Skip to content

feat(identity): name the entity — kill the "Wallet" label (E2 · #182) - #191

Merged
hellno merged 1 commit into
mainfrom
hellno/kill-wallet-label-e2
Jul 3, 2026
Merged

feat(identity): name the entity — kill the "Wallet" label (E2 · #182)#191
hellno merged 1 commit into
mainfrom
hellno/kill-wallet-label-e2

Conversation

@hellno

@hellno hellno commented Jul 3, 2026

Copy link
Copy Markdown
Owner

E2 · Identity & naming (#182, part of the v4 epic #179)

Kills the literal word Wallet as a UI entity/view label. Wallets and the agent now carry a real, renamable name/handle, and the breadcrumb names the focused entity.

Golden ref: designs/deckard-v4.html data-s="home". Contract + fidelity checklist: docs/research/13-v4-build-plan.md (Wallet home).

What changed

  • names.rs (new) — deterministic default wallet name from the account address (dependency-free FNV-1a over a curated codename list led by Meridian) + auto-assigned agent handles from a rotating city list (index 0 = Kyoto, retiring the Atlas placeholder). A reflective source-scan test asserts the retired entity labels ("Wallet"/"Atlas") render nowhere.
  • Breadcrumb names the entity (Meridian / Kyoto / Personal), dropping the Personal › prefix; an action surface appends › <view> (e.g. Meridian › Send). view_label no longer returns "Wallet".
  • Wallet-home identity masthead via the shared page_header primitive (mark + name + mono address subtitle, above the hero); page_header gains an optional mono subtitle so addresses stay mono per DESIGN.
  • Agent mark migration — sidebar / breadcrumb / wallet-home presence / agent surface / activity feed moved off the fixed-A shell_chrome::agent_squircle onto the handle-aware widgets::agent_mark; agent_squircle retired. Sidebar wallet row now shows the name.
  • Renamable — persisted Settings.wallet_name / agent_handle fields edited via Settings inputs (replacing the dead display_name setting; a serde alias migrates the old value on upgrade), with Shell::wallet_name / Shell::agent_handle as the single source of truth. New ⌘K commands Rename wallet / Rename agent open + focus the field (palette_commands.rs + run_palette_command).
  • Tokens — added MARK_SM (16); all identity marks now use the MARK_SM/MD/LG + RADIUS_ROW ladder (no magic px). Dropped the dead_code allows on agent_mark + page_header as their first call sites were wired.

Wallet-home fidelity checklist — E2-owned items

Definition of Done

  • cargo fmt --all --check — clean
  • just check — green (workspace clippy -D warnings, deckard-app --features tray, deckard-signerd --features dev-signerd-bin)
  • cargo test --workspace406 passed, 2 ignored (adds the reflective label scan, the naming determinism/rotation tests, and a settings-migration test)
  • No Cargo.toml / Cargo.lock changes

Adversarial review

Cross-model pass with Codex GPT-5 (xhigh) on the diff vs the golden ref + DESIGN: no P0/P1. The P2 (settings migration data-loss) and two P3s (token drift on the project/feed marks, scan-precision) are folded in. The scan is intentionally an exact-token match — DESIGN + the golden ref use the word descriptively (Wallets group, This wallet rail, Wallet name field), so a substring match would false-positive; only the standalone "Wallet" entity label is banned.

Do not touch (honored)

Clear-signing / cap / STOP / no-blind-approve semantics unchanged; the sidebar Projects layer + right rail (E3) and holdings/hero meta (E4) are out of scope.

⚠️ Screenshots

GUI dev + tests were done headless. Per the E0 recipe (docs/dev/driving-the-app.md), a just demo app launched under an agent shell can't be made OS-active, so before/after wallet-home screenshots need a foreground drive: just demo → unlock (passphrase deckard-demo) → capture home (masthead + breadcrumb) and ⌘K → Rename wallet. To be attached.

Closes #182. Part of #179.

Identity is named (DESIGN §"Identity is named"; golden ref data-s="home"):
wallets and the agent carry a real name/handle, and the literal word Wallet
never appears as an entity or view label.

- names.rs (new): deterministic default wallet name from the account address
  (dependency-free FNV-1a; a curated codename list led by "Meridian") and
  auto-assigned agent handles from a rotating city list (index 0 = "Kyoto",
  retiring the fixed "Atlas" placeholder). A reflective source-scan test asserts
  the retired entity labels ("Wallet"/"Atlas") are rendered nowhere.
- Rename mechanism: two persisted Settings fields (wallet_name / agent_handle)
  edited via Settings inputs (replacing the dead "Display name" setting;
  wallet_name carries a serde alias so an upgrade migrates the old value instead
  of dropping it), with Shell::wallet_name / Shell::agent_handle as the single
  source of truth and new ⌘K commands "Rename wallet" / "Rename agent" that open
  and focus the field.
- Breadcrumb names the focused entity (Meridian / Kyoto / Personal), dropping the
  `Personal ›` prefix; an action surface appends `› <view>` (e.g. Meridian › Send).
- Wallet-home identity masthead via the shared page_header primitive (mark + name
  + mono address subtitle above the hero); page_header gains an optional mono
  subtitle for addresses.
- Migrate the sidebar / breadcrumb / wallet-home presence / agent surface /
  activity feed off the fixed-`A` shell_chrome::agent_squircle onto the
  handle-aware widgets::agent_mark, then retire agent_squircle. Sidebar wallet
  row now shows the name; all identity marks use the tokens ladder (MARK_SM/MD/LG
  + RADIUS_ROW).
- tokens: add MARK_SM (16, the inline row/chip mark). Wire the first call sites of
  agent_mark + page_header (dropping their dead_code allows).

Reviewed with a cross-model adversarial pass (Codex GPT-5 xhigh): no P0/P1; the
P2 (settings migration data-loss) and two P3s (token drift, scan-precision doc)
are folded in.

Do-not-touch honored: clear-signing / cap / STOP / no-blind-approve semantics
unchanged; the sidebar Projects layer + right rail (E3) and holdings $/hero meta
(E4) are out of scope. DoD: fmt clean; `just check` green (both feature configs +
signerd); `cargo test --workspace` green (406 passed).

Part of #179. Closes #182.
@hellno
hellno merged commit b9d6398 into main Jul 3, 2026
5 checks passed
@hellno
hellno deleted the hellno/kill-wallet-label-e2 branch July 3, 2026 11:02
@hellno

hellno commented Jul 3, 2026

Copy link
Copy Markdown
Owner Author

GUI verification (driven live via just qa + scripts/deckard-drive.sh)

Screenshots captured on the QA fast-unlock vault (anvil account 0 → deterministic name Meridian). Saved locally at .context/shots/ (gitignored) — drag them into this thread to attach.

  • unlocked.png — wallet home (the money shot): breadcrumb M · Meridian (entity name only, no Personal ›, no "Wallet"); identity masthead Meridian + mono address above the hero; sidebar WALLETS › Meridian (named) + AGENTS › Kyoto with the cyan agent_mark + status dot; bottom agent presence K · Kyoto · acting.
  • e2-settings-names.png — Settings (breadcrumb Meridian › Settings): shows the › <view> trailing segment on an action surface.
  • Activity (breadcrumb Meridian › Activity): the origin subtitle reads "What Kyoto and you did this session" — the handle-named prose (was "Atlas").

Everything E2 renders correctly. One minor regression spotted while driving — the masthead address clipped to 0xf39F…22… (my truncate() on the page_header subtitle) — fixed in follow-up #192 (now renders the full 0xf39F…2266).

Note: anvil isn't running under the agent shell, so the hero reads "Syncing…"/"No balances yet" — irrelevant to identity naming.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

E2 · Identity & naming

1 participant