UI Content Requirements — Personal Workstation

Requirements-only UI interview. Establishes data, actions, states, and constraints per screen without committing to layout or component decisions.
Source: specs/user-flow-personal-workstation.md (approved 2026-06-10) • Interview conducted 2026-06-10

Evidence Coverage

SourceStatusKey Inputs
specs/user-flow-personal-workstation.mdPrimary10 screens, state matrices, entry points, failure paths, wireframe notes
research/positioning.mdReadCompetitive framing, core differentiators, zero-inbound networking
research/journey-map.mdReadAha moment, onboarding flow, mobile approval routing
research/icp.mdReadSolo developer persona, 5–12 agents, multi-repo workflow
research/concept-brief-gblock-party-personal.mdReadBYO-client model, PWA, managed infrastructure
Existing codebaseN/ANo code exists — greenfield project in research/planning phase

Gate 1: Is the evidence base sufficient for UI content requirements?

Assumptions Manifest

Confirmed During Interview

#AssumptionSource
1Solo developer managing 5–12 AI coding agents — no team/collaboration features[from spec]
2Three access modes: Dashboard (A), Terminal (B), IDE (C)[from spec]
3PWA — installable on mobile and desktop, service worker for push[from spec]
4BYO-client — users connect providers via OAuth (where supported) or API key, using their own subscriptions and billing[from spec]
5GitHub App installation is sole auth mechanism — identity via GitHub OAuth, repo access via GitHub App installation grants (user selects all or specific repos)[from spec]
610 screens: S1–S10 as defined in user flow map[from spec]
7S3 Agent Board is home after auth — all screens reachable from it[inferred]
8S4 Start Agent is a modal overlay (not a separate route) — triggered from S3, tab bar "+" button on any screen, or mobile bottom nav[interview]
9S7 Approval appears in three contexts: standalone mobile view, inline in S5, and indicator on S3[interview]
10Mobile header is minimal; QR on mobile is for sharing to tablet/other phone[interview]
11Browser-like tab navigation on all web views (desktop + tablet): pinned tabs (Agent Board, Approvals), dynamic tabs (agent sessions, diffs), and a persistent + button to open S4 Start Agent modal from any screen — can live as sidebar or top bar[interview]
12Custom hotkeys for session switching (Ctrl+1..N), session switching only[interview]
13Open tabs persist across devices (server-tracked, not client-local)[interview]
14WebSocket for real-time agent status, stdout streaming, approval notifications[from spec]
15Server-canonical state — all devices see the same state[from spec]
16Mobile uses bottom nav (Agent Board, Approvals, Settings, + Start Agent) and hamburger for open tabs[interview]
17Provider auth is hybrid OAuth/API-key per provider: OpenAI supports "Sign in with ChatGPT" subscription passthrough (prefer OAuth, API key fallback); Anthropic bans subscription OAuth in third-party tools (always API key). Auth method is provider-determined, not user-chosen.[interview]

Gate 2: Are the assumptions and confidence levels correct?

Global Shell

Desktop Header Revised

ElementData / EntityCardinalityNotes
App name / logoStatic brand markOneLinks to S3 Agent Board
Notification bellUnread notification count badgeOne (aggregate)Opens notification inbox. Currently surfaces approval notifications; extensible to org/team notifications in the future. Approvals pinned tab remains the primary approval queue — bell is for cross-cutting notifications.
Running agent countCount of agents in "running" stateOne (aggregate)At-a-glance status indicator
Settings gearNavigation triggerOneOpens S10 Settings
Share buttonOpens share modalOneModal includes: share by link (short-lived pre-authenticated deep link), email teammate (future — teams/org support), and QR code for mobile/tablet handoff
User avatar / account menuGitHub profile image, session controlsOneLogout, session info

Tab Bar (All Web Views — Desktop + Tablet) Revised

ElementBehaviorPersistence
Pinned: Agent BoardAlways present, not closeableServer-persisted
Pinned: ApprovalsAlways present, not closeable. Badge shows pending approval count.Server-persisted
Dynamic: Agent session tabsOpens when user clicks into an agent (S5/S6). Closeable.Server-persisted across devices
Dynamic: Diff review tabsOpens when user enters S9 for a specific agent. Closeable.Server-persisted across devices
+ New AgentAlways present, pinned to the right end of the tab row (VS Code / Windows Terminal convention). Opens S4 Start Agent modal from any screen — user does not need to navigate to S3 first.N/A (action trigger)

Mobile Shell Revised

ElementLocationBehavior
Notification bellTop header (always visible)Minimal — unread count badge on bell icon
Hamburger menuTop headerOpens drawer listing all open dynamic tabs (agent sessions, diffs). Hidden on the Agent Board screen — the board itself already displays all sessions, and Approvals is one bottom-nav tap away, so the tab drawer adds no value there. Appears only when the user is inside a detail view (S5/S6/S9) and needs to switch between open tabs.
Agent BoardBottom navPinned — always visible
ApprovalsBottom navPinned — with badge
SettingsBottom navPinned
+ Start AgentBottom navOpens S4 Start Agent modal

Custom Hotkeys

States

StateTriggerBehavior
UnauthenticatedNo valid sessionNo shell shown — only S1 Auth
Connection lostWebSocket heartbeat timeoutBanner in header: "Reconnecting..." with auto-retry
Zero agentsNo agents configuredTab bar shows pinned tabs only, no dynamic tabs

S1 — GitHub Authentication Revised

Data Fields Revised

FieldTypeSource
GitHub identityGitHub App installation + OAuth web flow for user authGitHub API
Permissions grantedFine-grained: repository contents (read/write), user email (read)GitHub App installation prompt
Repository scopeUser-selected: "All repositories" or "Only select repositories"GitHub App installation prompt
Session tokenJWT or secure cookieGenerated server-side post-OAuth

User Actions

States

StateTriggerDisplay
InitialFirst visit or session expired"Login with GitHub" button
RedirectingUser clicked loginBrief loading indicator as browser redirects to GitHub
Callback processingGitHub redirects backSkeleton loading — straight-through routing to S3 or S2
Auth errorOAuth failed (denied scopes, network error)Error message with retry option
QR token expiredOne-time token from QR has expiredFalls back to standard OAuth login

Constraints Revised

S2 — Setup Wizard Revised

Data Fields Revised

FieldTypeCardinalityRequired?
Discovered reposList of GitHub repos populated from GitHub App installation grants (user controls scope: all repos or selected repos during installation)ManyAuto — populated from user's GitHub App grants
Provider credentialsPer-provider auth — OAuth ("Sign in with ChatGPT") where supported, API key entry where notMany (one per provider)At least one
Provider auth method indicatorPer-provider badge: "OAuth" or "API Key" — shown next to each provider so user knows what to expectManySystem-generated
Notification preferencesPush notification opt-in, email fallback toggleFewOptional (defaults available)
Infrastructure statusHealth check results per tool and connectivity — rendered inline as status indicators within the Setup Summary, not a standalone viewManySystem-generated

User Actions Revised

Flow Structure Revised

Multi-step wizard with progress indicator:

  1. Step 1 — Provider Auth: Connect model providers — OAuth where supported (e.g., "Sign in with ChatGPT"), API key entry where required (e.g., Anthropic). Auth method badge shown per provider. Validation on completion. At least one provider required.
  2. Step 2 — Notifications: Three options: push notifications, email notifications, or off.
  3. Step 3 — Setup Summary: Read-only confirmation of everything configured. Three groups: (1) Repos — list of GitHub repos from App installation grants, (2) Connected Providers — each provider with auth method badge (OAuth / API Key) and connectivity status, (3) Notification Setting — the preference chosen in Step 2. Health check runs automatically in the background; results appear inline as status indicators next to each provider and repo entry. "Finish Setup" CTA at the bottom.

States Revised

StateTriggerDisplay
Step activeUser on current wizard stepCurrent step form + progress indicator showing position
Validating keyUser entered an API keyInline spinner + "Validating..." on the field
Key validAPI key validated successfullyGreen check on field
Key invalidAPI key validation failedRed error message inline
OAuth redirectingUser clicked provider OAuth button (e.g., "Sign in with ChatGPT")Browser redirecting to provider — spinner or "Redirecting to [provider]..." indicator
OAuth connectedProvider OAuth succeeded — callback receivedGreen check with provider badge showing "OAuth" and subscription tier (e.g., "ChatGPT Plus")
Health check runningStep 3 startedSummary loaded; inline spinners next to each provider/repo while connectivity is verified
Health check failedOne or more tools unreachableFailed items show inline warning icon + retry link within the summary. "Finish Setup" remains enabled.
CompleteAll steps doneAll items show final status. "Finish Setup" CTA enabled at bottom of summary.

Constraints Revised

S3 — Agent Board

Data Fields — Agent Card (Canonical)

FieldTypeDefault Visible?Customizable?
Agent name / labelString (user-assigned or auto-generated)YesNo (always shown)
Status badgeEnum: running, idle, waiting, error, starting, completeYesNo (always shown)
Tool nameString (Claude Code, Codex, Aider, etc.)YesYes
RepositoryString (owner/repo)YesYes
BranchStringNoYes
Elapsed timeDuration since agent startedYesYes
Stdout previewLast line of parsed stdoutYesYes
Token usageNumeric (tokens consumed)NoYes
Token costCurrency estimateNoYes
Files changed countNumericNoYes
Last activity timestampRelative time ("2m ago")NoYes

Card Customization

User Actions

Approval Indicator on S3

States

StateTriggerDisplay
EmptyNo agents configured"Start your first agent" CTA + quick-start guide
All runningAll agents actively processingGrid of cards with live stdout preview, elapsed time
Mixed statusAgents in various statesCards sorted by priority
Approval pendingOne or more agents waitingWaiting cards highlighted, badge visible on Approvals tab and notification bell
All completeAll agents finishedCompletion summaries, "Review diffs" CTA prominent
Connection lostWebSocket heartbeat timeoutBanner: "Reconnecting..." — last-known state shown

Relationships

S4 — Start Agent Modal

Trigger Points Revised

Data Fields — Primary

FieldTypeRequired?Source
RepositoryDropdown (auto-populated from GitHub App installation grants)YesGitHub API
ToolDropdown (headless-viable tools available in workspace)YesWorkspace config
Initial promptTextarea (free text)YesUser input
BranchText field or dropdownNo (defaults to main/master)GitHub API + user input

Data Fields — Advanced (Collapsible Section)

FieldTypeRequired?Notes
Agent labelText fieldNoCustom name for the agent session (auto-generated if empty)
Prompt templateDropdown of saved templatesNoPre-fills the initial prompt textarea
Resource tierDropdown (light / standard / heavy)NoControls CPU/memory allocation
Working directoryText field (path within repo)NoDefaults to repo root
Environment variablesKey-value pairsNoInjected into agent process environment

User Actions

States

StateTriggerDisplay
ReadyModal opened, data loadedAll fields enabled, Start button enabled when required fields filled
Loading reposModal opened, fetching repo listSkeleton loaders in repo picker
LaunchingUser clicked StartSpinner on button, fields disabled
ErrorLaunch failedError message with retry, fields re-enabled
Tool unavailableSelected tool not in workspaceWarning with link to S10 to install tool

Constraints

S5 — Agent Detail (Structured)

Data Fields

FieldTypeCardinalityUpdate Frequency
Agent name / labelStringOneStatic
StatusEnum: running, idle, waiting, error, starting, completeOneReal-time
Tool + repo + branchStringsOne eachStatic per session
Parsed stdoutStructured text stream (Multica-style parsing)StreamingReal-time
Task progressStep indicators (if tool supports structured progress)ManyReal-time
File change listList of filenames with change type (added/modified/deleted)ManyReal-time as agent modifies files
Token usageNumeric (running total)OnePeriodic
Elapsed timeDurationOneContinuous
Inline approval card (S7)Approval request with diff previewZero or oneEvent-driven

User Actions

States

StateTriggerDisplay
StreamingAgent actively producing outputLive parsed output, progress indicators, file list updating
Waiting for inputAgent paused for approvalInline S7 approval card, prompt injection visible
IdleAgent finished current taskCompletion summary, "Assign next task" CTA
ErrorAgent crashedError details, stack trace, retry/restart buttons
ReconnectingWebSocket dropped"Reconnecting..." overlay, buffered output replays on reconnect

Relationships

S6 — Agent Terminal

Data Fields

FieldTypeNotes
Terminal outputRaw terminal stream (xterm.js rendering)Full ANSI/escape code support via WebSocket to tmux
Agent name / statusString + enumShown in tab title or minimal header
Keyboard inputKeystroke stream to tmux sessionSub-100ms echo target

User Actions

Desktop Layout

Mobile Layout

States

StateTriggerDisplay
ConnectedWebSocket attached to tmux sessionLive terminal, full interactivity
ReconnectingWebSocket dropped"Reconnecting..." overlay, auto-retry
Session endedAgent process terminatedTerminal frozen with last output, "Agent stopped" indicator

Constraints

S7 — Approval Request

Three Rendering Contexts

ContextWhereWhenOptimized For
Standalone mobileDedicated view via push notification deep linkUser taps notification on phoneQuick one-tap approve/reject, large touch targets
Inline in S5Embedded card within Agent DetailUser is already viewing the agentContext — agent output visible alongside approval
Indicator on S3Agent card badge/highlight on Agent BoardApproval pending for an agentVisibility — user sees pending approvals at a glance

Data Fields

FieldTypeCardinality
Agent nameStringOne
Wait durationDuration since approval requestedOne
DescriptionAgent's explanation of what it wants to doOne
Diff preview3–5 lines of diff context, expandable to fullOne (expandable)
Risk assessmentAgent-generated risk level (if available)Zero or one
Proposed actionWhat the agent will do if approvedOne

User Actions

ActionTypeNotes
ApprovePrimary positive actionAgent resumes immediately. Sub-second delivery via internal API.
RejectPrimary negative actionReveals rejection reason textarea. Agent receives feedback.
Modify / redirectCompound actionPreset responses ("retry different approach", "skip this file", "proceed cautiously") + free-text textarea for custom instructions
DeferNeutral actionLeave for later — agent remains paused, approval stays in queue
Expand diffNavigationExpand from 3–5 line preview to full diff view

Approval Queue

States

StateTriggerDisplay
PendingAgent requested, user hasn't actedFull approval card with actions
ReviewingUser expanded full diffFull diff viewer with agent context
ApprovedUser approvedBrief confirmation, auto-return to previous context
RejectedUser rejected with feedbackRejection sent, agent adjusts
ExpiredConfigurable timeout elapsedGrayed card, still actionable or auto-rejected per settings

Constraints

Gate 3: Are the screen requirements for S1 through S7 accurate and complete?

S8 — Async Recap

Data Fields

FieldTypeCardinality
Time windowDuration since last interactionOne
Event timelineChronological list of eventsMany
Completed tasksList of agents that finished workMany
Pending approvalsCount + summary of waiting approvalsMany
ErrorsAgents that encountered errors during absenceMany
PRs createdList of pull requests auto-created by agentsMany
Urgent itemsErrors + expired approvals — highlighted subsetMany

Event Types

User Actions

States

StateTriggerDisplay
Activity summaryUser returns after absence (> threshold)Timeline of events with urgent items at top
Nothing newAgents were idle during absence"All quiet" message, direct navigation to S3
Urgent itemsErrors or expired approvalsUrgent items highlighted with distinct styling at top
DismissedUser clicked "Got it"Redirect to S3; recap accessible from history

Constraints

S9 — Diff Review

Data Fields

FieldTypeCardinality
File treeHierarchical list of changed filesMany (nested)
Diff contentUnified or side-by-side diff per fileOne per file
Commit historyList of commits from agent sessionMany
Agent contextAgent name, tool, repo, branchOne
Inline commentsUser-authored comments on specific lines/hunksMany
Change statisticsLines added/removed, files changedOne (aggregate)

User Actions

States

StateTriggerDisplay
ReviewingUser opened diff for an agentFile tree + diff viewer, action buttons
CommentingUser adding inline commentsComment textarea appears at selected line
SubmittingUser clicked approve/create PRSpinner, "Creating PR..." message
SubmittedPR created successfullySuccess message with PR link
ConflictMerge conflict detectedConflict markers shown, option to resolve in S6 terminal

Constraints

S10 — Settings Revised

Data Fields — Sections

SectionDataCardinality
Tools & Provider AuthPer-tool config: OAuth connection or API key, enabled/disabled, health status indicatorMany (one per tool)
NotificationsPush notification toggle, email fallback, notification sound, approval timeoutFew
GitHub AppConnected account, installation grants (all vs. selected repos), re-authorize linkOne
Infrastructure StatusBackend connectivity, tunnel status, resource usage (CPU/memory/disk)One (live)
Card CustomizationToggle-able field list for S3 agent cards~10 fields
HotkeysKey binding map for session switching (Ctrl+1..N)Many
Tab PreferencesTab bar position (top/sidebar), behavior settingsFew
Approval PresetsEditable list of preset approval responses for S7Many
Danger ZoneReset workspace, revoke access, delete all dataFew

User Actions

States

StateTriggerDisplay
NormalSettings page openedAll sections with current values
SavingUser changed a settingInline save indicator on changed field
ValidatingAPI key enteredSpinner + "Validating..." on field
Health check runningUser triggered health checkPer-tool progress indicators
Danger confirmationUser clicked destructive actionConfirmation dialog with consequences described

Constraints

Gate 4: Are the screen requirements for S8 through S10 accurate and complete?

Prototype-First Boundary

First Clickable Journey

S1 Auth → S3 Agent Board (mock data, 3–5 agents in various states) → S4 Start Agent (form submits but uses fixture) → S5 Agent Detail (fake streaming stdout) → S7 Approval (approve action with mock response)

Fixture / Fake Data

Infrastructure to Mock Visually (Not Implement)

Deferred from Prototype

Questions Prototype Must Answer

Gate 5: Is the prototype boundary well-scoped?

Proposed File Changes

ActionPathDescription
Createspecs/ui-requirements-personal-workstation.mdContent requirements spec — all screens, data, actions, states, constraints
Createui-requirements-personal-workstation-interview.mdInterview log — questions asked, options presented, user decisions

Gate 6: Are the proposed file changes approved?

Coverage Checkpoint

CategoryCoverageStatus
Global Shell (desktop + mobile)Header, tab bar, bottom nav, hotkeys, connection statesComplete
S1 AuthGitHub App installation + OAuth flow, QR auto-auth, error statesComplete
S2 Setup WizardMulti-step flow, API keys, notifications, health checkComplete
S3 Agent BoardCard fields, customization, sort/filter/group, approval indicators, 6 statesComplete
S4 Start AgentPrimary + advanced fields, 5 statesComplete
S5 Agent DetailParsed stdout, file list, inline approval, prompt injection, 5 statesComplete
S6 Terminalxterm.js, split/full-screen, desktop/mobile, 3 statesComplete
S7 Approval3 contexts, 4 actions with presets, queue, 5 statesComplete
S8 Async RecapTimeline, event types, urgent items, 4 statesComplete
S9 Diff ReviewUnified/split, file tree, inline comments, PR creation, 5 statesComplete
S10 Settings9 sections, all config consolidated, auto-save, danger zoneComplete
Prototype boundaryFirst journey, fixture data, mocked infra, deferred items, validation questionsComplete
Responsive behaviorDesktop vs mobile noted per screen; mobile shell definedComplete
AccessibilityNot covered (requirements-only — deferred to full UI interview or UX variations)Deferred
Data relationshipsAgent→Repo, Agent→Tool, Agent→Approvals documentedComplete

Open Risks

Gate 7: Is the coverage checkpoint satisfactory?

Compile Review

Use Compile Feedback to send concerns or clarification requests before answering every gate, or Compile Answers for final approval once all required gate questions are answered. The compiled YAML always includes any optional section feedback you set.