feat(shell): three-pane shell + always-on right metadata rail (E3 · #183) - #193
Merged
Conversation
) 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.
Owner
Author
Live GUI verification (demo fork) — all three rail bodies + two bugs caught & fixedDrove the unlocked app ( Rail states verified
Bugs caught in live QA (fixed here)
fmt clean · Screenshots (home / activity-tx / activity-pending) attached below. |
Owner
Author
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



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_0sibling (never collapsible); the main column staysflex_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::Projectremoved 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 fromagent_policy) and a light "This agent" body (reusesagent_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_rowgains a loudWarnvalue for the unverified-read downgrade (DESIGN §Trust rule 9).welcome.rs— sharedper_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)
min_w_0+ truncate).ActivityRecordno 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)
origin_header/agent_mark), human = amber. AmbiguousApp-origin requests (foreground vs. browser bridge, no domain on the record) render a neutral header, never a false amber human signal.agent_policy; no hardcoded/invented number, and "denied"/"no limit" never masquerade as "0 ETH".warntag in the rail Status row (never quietly "verified").Definition of Done
cargo fmt --all --check— cleanjust check— green (clippy-D warnings, both default +tray, plus signerddev-signerd-bin)cargo test --workspace— 406 passed, 2 ignoredCargo.toml/Cargo.lockuntouched)activity_reviewingfocus, copy/doc fixes).GUI evidence — before/after screenshots (home / activity / tx) off
just demoper 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.