Skip to content

feat(shell): three-pane shell + always-on right metadata rail (E3 · #183) - #193

Merged
hellno merged 3 commits into
mainfrom
hellno/three-pane-right-rail
Jul 4, 2026
Merged

feat(shell): three-pane shell + always-on right metadata rail (E3 · #183)#193
hellno merged 3 commits into
mainfrom
hellno/three-pane-right-rail

Conversation

@hellno

@hellno hellno commented Jul 3, 2026

Copy link
Copy Markdown
Owner

E3 · Three-pane shell + always-on right rail

Adds the always-on ~300px right metadata rail as the shell's third pane (sidebar · main · rail), contextual to the focused object, and drops the Projects layer. Part of the v4 request-origin IA epic (#179).

Closes #183. Refs #179.

What changed

  • shell.rs — three-pane layout. The rail is a fixed-width (RAIL_W = 300) flex_shrink_0 sibling (never collapsible); the main column stays flex_1 + min_w_0, so content overflows neither edge (the no-horizontal-overflow invariant).
  • shell_chrome.rs — sidebar regrouped to Wallets · Agents · Connections. Connections is a list-only reserved slot (quiet empty state; deep editing deferred, ADR-0001 / Epic: Dapp connectivity — own the transport (ADR 0001) #44). Selection::Project removed everywhere (enum, sidebar, palette scope line, breadcrumb, render_project_home).
  • shell_rail.rs (new) — the rail dispatcher + the "This wallet" body (identity object + honest facts + the live Agent caps ledger from agent_policy) and a light "This agent" body (reuses agent_policy_rows).
  • activity_view.rs — the Activity rail: a selected/reviewed pending request's compact clear-signing, else the latest transaction's receipt, else a quiet "No activity yet." It is strictly read-only — approve/deny stay on the feed, so the no-blind-approve invariant is untouched and no new ⌘K action is needed.
  • widgets.rs — wire the E1 rail primitives (meta_rail/meta_section/meta_obj/kv_row/origin_header/status_glyph); #[allow(dead_code)] removed where fully wired. kv_row gains a loud Warn value for the unverified-read downgrade (DESIGN §Trust rule 9).
  • welcome.rs — shared per_tx_cap_display() renders the Send cap honestly ("denied" / "no limit" / figure), never a false "0 ETH". Fixes the same latent bug in the wallet-home agent card.
  • main.rs — window widened to 1200×760 (min 1100×560) so the 460px confirm card (CONFIRM_W) never clips beside the 248 sidebar + 300 rail (248+300+460+padding ≤ 1100).

"Rail" fidelity checklist (docs/research/13-v4-build-plan.md)

  • Right rail always present (not collapsible), ~300px, hairline-left; content contextual to focus.
  • Three-pane renders at app width — no horizontal overflow; rows clamp (min_w_0 + truncate).
  • Projects layer dropped; sidebar groups are Wallets · Agents · Connections.
  • Rail updates on selection; no "Nothing selected." while a row is selected.
  • "This wallet" body: identity + sync/verified/network + the agent cap ledger. (USD value and block/fee are intentionally omitted — the app/engine holds no USD figure and ActivityRecord no block/fee; the honesty rule forbids inventing them. The golden ref's "Connections" count is likewise omitted until the browser bridge lands.)

Trust invariants (unchanged)

  • Rail is read-only — it resolves no record (no blind-approve); approve/deny + the arm-delay confirm stay on the feed.
  • Two signal colors only — agent = cyan (origin_header/agent_mark), human = amber. Ambiguous App-origin requests (foreground vs. browser bridge, no domain on the record) render a neutral header, never a false amber human signal.
  • Cap enforcement is real — every cap comes from the live agent_policy; no hardcoded/invented number, and "denied"/"no limit" never masquerade as "0 ETH".
  • Unverified reads render the loud warn tag in the rail Status row (never quietly "verified").

Definition of Done

  • cargo fmt --all --check — clean
  • just check — green (clippy -D warnings, both default + tray, plus signerd dev-signerd-bin)
  • cargo test --workspace406 passed, 2 ignored
  • No new/changed dependencies (Cargo.toml/Cargo.lock untouched)
  • Adversarial review: a 4-lens verify-looped workflow + a codex GPT-5 xhigh cross-model pass vs the golden ref + the Rail checklist; all confirmed findings applied (per-tx honesty, loud unverified status, neutral App-origin header, trailing Agents section, activity_reviewing focus, copy/doc fixes).

⚠️ Pending before merge

GUI evidence — before/after screenshots (home / activity / tx) off just demo per E0's recipe. Synthetic input can't drive the GPUI app under an agent shell, so these need a human to drive the unlocked app for capture. Holding merge until they're attached.

hellno added 3 commits July 3, 2026 14:56
)

Add the always-on ~300px right metadata rail as the shell's third pane
(sidebar · main · rail), contextual to the focused object, and drop the
Projects layer.

- shell.rs: three-pane layout; the rail is a fixed-width flex_shrink_0
  sibling (never collapsible), main stays flex_1 + min_w_0 so content
  overflows neither edge.
- shell_chrome.rs: sidebar regrouped to Wallets · Agents · Connections
  (Connections = a list-only reserved slot; deep editing deferred #44).
  Selection::Project removed across shell/palette/welcome/breadcrumb.
- shell_rail.rs (new): the rail dispatcher + the "This wallet" body
  (identity + honest facts + the live agent cap ledger) and a light
  "This agent" body.
- activity_view.rs: the Activity rail — a selected/reviewed pending
  request's compact clear-signing, else the latest transaction's
  receipt, else a quiet empty state. Read-only (approve/deny stay on
  the feed -> no blind-approve). App-origin requests render a neutral
  header (never a false amber human signal).
- widgets.rs: wire the E1 rail primitives (meta_rail/meta_section/
  meta_obj/kv_row/origin_header/status_glyph); kv_row gains a loud Warn
  value for the unverified-read downgrade (DESIGN Trust rule 9).
- welcome.rs: shared per_tx_cap_display() renders a Send cap honestly
  ("denied" / "no limit" / figure), never a false "0 ETH".
- main.rs: widen the window (1200x760, min 1100x560) so the 460px
  confirm card never clips beside the two chrome columns.

Colors via theme.*/amber/agent; sizes via tokens; two signal colors
only. Reviewed adversarially (4-lens workflow + codex GPT-5 xhigh) vs
the golden ref + the Rail fidelity checklist.

Closes #183. Refs #179.
Live GUI verification of the E3 rail caught the identity object clipping the
wallet address to a second ellipsis (`0xf39F……` instead of `0xf39F…2266`) —
the same defect the E2 masthead follow-up fixed (#192). Root cause: the sub's
`truncate()` gives it a 0 min-content, so the text column sized to the shorter
name and clipped the wider mono address. Pin the column with `flex_1` so it
fills the row's remaining width; a short address now renders in full and only
genuinely over-wide content still clamps (overflow-safe).

fmt clean; just check green (both feature configs); cargo test --workspace green.
…ays put)

The 3-pane row used `size_full` (height:100%) as a sibling of the fixed title
bar, so an over-tall surface (the wallet home, whose internal scroll is an
imperfect TODO) stretched the row past the window — pushing the sidebar footer
(Activity + Settings) and the bottom status strip off-screen on the home
surface but not on Activity. That's the jarring "Settings comes and goes
between screens" bug. Make the row a proper flex child (`flex_1` + `min_h_0`)
so it fills exactly the space below the title bar and never grows: over-tall
content now scrolls inside the middle column and the three panes stay
full-height on every surface. Verified in the app (home now shows Activity +
Settings + status strip, matching Activity).

fmt clean; just check green (both feature configs); cargo test --workspace green.
@hellno

hellno commented Jul 4, 2026

Copy link
Copy Markdown
Owner Author

Live GUI verification (demo fork) — all three rail bodies + two bugs caught & fixed

Drove the unlocked app (just demo, Sepolia fork @ block 10822990) and captured every rail state. The three-pane shell renders exactly to the golden ref, and live QA surfaced two real defects that are now fixed on this branch:

Rail states verified

  • This wallet (home) — identity + Balance / Synced / Status: Not verified (loud amber) / Network, the live Agent caps ledger (Kyoto daily · Per-transaction 0.1 ETH, honest — not a false "0"), and Agents: 1 active.
  • This transaction (Activity, executed shield) — Kyoto (cyan mark) · shield · confirmed · green status_glyph · "moved 0.02 ETH to your private balance" · Time · Hash.
  • Pending request (Activity, over-cap send) — Kyoto proposes (cyan) · Sending 0.5 ETH → 0x7099…79C8 · over per-tx cap · "This can't be undone." Read-only: approve/deny stay on the feed row (⌘↵ / x), never in the rail.
  • Sidebar: Wallets · Agents · Connections ("No connected sites yet"), no Projects. STOP reachable on Activity; status strip carries the loud NOT VERIFIED.

Bugs caught in live QA (fixed here)

  1. meta_obj clipped the rail address to 0xf39F…… (dropping the trust-critical last 4 chars) — same class as the E2 masthead clip (fix(identity): masthead address no longer clips its last chars (E2 follow-up) #192). Fixed with flex_1 on the object's text column; now renders the full 0xf39F…2266.
  2. The 3-pane row used size_full, so an over-tall home surface stretched the row and pushed the sidebar footer (Settings) + the status strip off-screen on home but not Activity — the "Settings comes and goes" jump. Fixed by clamping the row (flex_1 + min_h_0).

fmt clean · just check green (both feature configs) · cargo test --workspace 406 passed · no dep changes.

Screenshots (home / activity-tx / activity-pending) attached below.

@hellno

hellno commented Jul 4, 2026

Copy link
Copy Markdown
Owner Author
image image image

@hellno
hellno merged commit 85136bc into main Jul 4, 2026
5 checks passed
hellno added a commit that referenced this pull request Jul 5, 2026
#193)

E3 (#193, three-pane rail) landed on main and (a) added a `warn: Hsla` param to
kv_row for its loud KvValue::Warn downgrade, and (b) edited the doc/allow comments
on kv_row / Origin / origin_header. Resolution: pass `warn` (= theme.warning) at
E5's two kv_row call sites in commit_view; merge the comments to credit both the E3
rail and the E5 review; drop the now-unnecessary #[allow(dead_code)] on Origin (E5
constructs all three variants incl. Dapp). activity_view.rs + welcome.rs auto-merged.
just check green (both configs + signerd); app 69 + contract 100 tests pass, incl.
the no-blind-approve and shield-cap regressions.
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.

E3 · Three-pane shell + always-on right rail

1 participant