Conversation
Replaces AppShell.tsx's feature-first sidebar with a 72px project rail (Rail.tsx): one door per registered project (2-letter initials, last-active-first), each door's glow tied to that project's RunState plus a placeholder night-run badge, a right-click pin/unpin affordance with pinned-only+overflow rail logic past 5 projects, and the Settings entry point moved to a gear icon at the rail's foot. Covers prd-rail-corridor-shell Phase 1 in full (4 queued loops, run as one combined overnight batch).
suprie
marked this pull request as ready for review
August 12, 2026 03:28
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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.
Summary
Replaces
AppShell.tsx's feature-first sidebar with a 72px project rail (Rail.tsx): one door per registered project (2-letter initials, last-active-first), each door's glow tied to that project'sRunStateplus a placeholder night-run badge, a right-click pin/unpin affordance with pinned-only+overflow rail logic past 5 projects, and the Settings entry point moved to a gear icon at the rail's foot. Coversprd-rail-corridor-shellPhase 1 in full (4 queued loops, run as one combined overnight batch).What changed
src/components/layout/Rail.tsx— 72px door strip, right-click pin/unpin context menu, overflow door, settings gear at the footsrc/lib/rail.ts— pure door-selection logic (doorInitials,sortByLastActive,selectRailDoors,hasActiveOrQueuedRun), covered bytests/frontend/rail.test.mjssrc/hooks/useNightRunStatuses.ts— pollsgetRunStatusper visible door every 5s for the night-run badgesrc-tauri/src/config.rs+commands/project.rs+lib.rs— newpinned: boolonProjectEntry+set_project_pinnedcommand, mirroring the existingautonomousflagsrc/components/layout/AppShell.tsx— sidebar replaced with<Rail />; brand mark + "Local only vX" footer dropped, version badge moved into the shared headersrc/router.tsx— removed the now-deadonNavClick/handleNavClickplumbing (its only branch,/import, had no live nav link left after the earlier Dashboard redesign)docs/epics/selasar-revamp/prd-rail-corridor-shell.md— Phase 1 checklist checked, Design section's open questions resolved.loopdeck/loops.md,.loopdeck/decisions.md— session bookkeepingPRD
docs/epics/selasar-revamp/prd-rail-corridor-shell.md (Phase 1 — Project rail)
Decisions
boolfield mirroringautonomous; the night-run badge derives from an active/queued.loopdeck/run-plan.yaml, an explicit placeholder pendingprd-detail-drawer's spike.**Verdict:** PASS/WARN/BLOCKeven if already stated earlier in the turn.prd-assign-loop-idcomplete: real-file round-trip test added, frontend e2e stays an honest gap (accepted): round-trips against this repo's own real PRD file; frontend click-through stays unverifiable without a DOM test harness this repo doesn't have.Test plan
cargo fmt --check— cleancargo clippy --lib -- -D warnings— cleancargo test --lib— 596 passed, 0 failed, 8 ignored (unchanged; no new Rust tests, matching the untestedset_project_autonomousprecedent forset_project_pinned)npx tsc --noEmit— cleannpm run build— cleannpm run test:frontend— 8 passed (1 pre-existing + 7 new intests/frontend/rail.test.mjs)npm run tauri devand confirm the rail renders one door per project, right-click opens pin/unpin, and crossing 5 projects collapses to pinned+overflow — no_electron/Playwright driver exists in this repo, so this wasn't verified live (same documented gap as every prior UI-only loop in.loopdeck/loops.md)Verify Verdict
PRD Verification —
docs/epics/selasar-revamp/prd-rail-corridor-shell.mdVerdict: PASS
No
## Acceptance Criteriasection in this PRD; verified against Phase 1's own checklist items verbatim (the exact scope this run's 4 loops targeted). No commits existed yet on this branch at verify time, so the changed-file set was the working-tree diff, not a committed diff.Railcomponent (72px icon strip, one door per project, 2-letter initials) replacingAppShell.tsx's current sidebar markup.src/components/layout/Rail.tsx:133—w-[72px];:82—doorInitials(project.name)(src/lib/rail.ts:7, first 2 chars uppercased);src/components/layout/AppShell.tsx:58—<Rail />replacing the old<aside>sidebarRunState(working/waiting/done/idle) plus a distinct night-run indicator, reusing the state derivation already inAttentionPanel.tsx/useAttentionItems.Rail.tsx:19-24,34-39— tone/text maps keyed byRunState;:54,77— readsproject.run_statedirectly off the sameProjectEntry.run_statefieldAttentionPanel.tsx:78already reads (no duplicate derivation added);:86-94— distinctMoon-badge night-run indicatorRail.tsx:70-73— right-clickonContextMenuopens the menu;:98-108— Pin/Unpin item callingsetPinned;src/lib/rail.ts:29-42—selectRailDoors(≤5 shows all / pinned-only+overflow / fallback to 5-most-recent past 5 with no pins), covered by 5 assertions intests/frontend/rail.test.mjs/settingsroute.Rail.tsx:155-166— gearSettingsiconLinkat the rail's foot;src/router.tsx:150—/settingsroute untouchedNon-goals audit
ProjectDetailpage (no overlay drawer added); pin persistence stayed a single bool field; the night-run indicator stayed a badge, not the full drawer experienceprd-night-run-surfacesowns.Roll-up: PASS — 0 FAIL, 0 PARTIAL, 4 PASS.
Run metadata
selasar-revamp/build-a-rail-component-72px-icon-strip-one-door-per-project-2-letter— "Build aRailcomponent (72px icon strip, one door per project, 2-letter" (selasar-revamp / prd-rail-corridor-shell / Phase 1 — Project rail)selasar-revamp/wire-each-door-s-glow-color-to-that-project-s-runstate— "Wire each door's glow color to that project'sRunState" (selasar-revamp / prd-rail-corridor-shell / Phase 1 — Project rail)selasar-revamp/add-a-pin-unpin-affordance-per-project-and-rail-logic-that-shows-all— "Add a pin/unpin affordance per project, and rail logic that shows all" (selasar-revamp / prd-rail-corridor-shell / Phase 1 — Project rail)selasar-revamp/move-the-settings-entry-point-to-a-gear-icon-at-the-rail-s-foot— "Move the settings entry point to a gear icon at the rail's foot," (selasar-revamp / prd-rail-corridor-shell / Phase 1 — Project rail)