You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
As a Station administrator, I need a dedicated Station Bot administration area in the Station UI so that I can choose a Discord guild, see which bot features are enabled for it, and navigate quickly to the correct configuration screen without hunting through unrelated app pages.
Definition of Done
A new Station frontend route exists for Station-Bot administration with authenticated, permission-gated access
The Station-Bot nav entry, route, and dashboard entry surfaces are hidden when the current user lacks the required Station-Bot admin permissions; direct navigation still fails closed with a clear unauthorized state
The shell reflects the initial role model for this milestone: station_super_admin, guild_owner, guild_admin, and guild_member
The page includes guild selection for multi-guild bot deployments and does not assume a single-server install
The shell shows an overview of all currently implemented bot administration domains verified in code: verification, nominations, manufacturing, automation, exec hangar, station timer, runtime controls, and delegated guild-access/support state
The shell shows current health/availability signals: read-only mode, last successful sync/read, downstream Station-Bot availability, and per-domain validation/drift warnings returned by the Station backend
The shell supports entry from the dashboard portlet expand/fullscreen affordance with the relevant guild context preselected
The shell routes into child screens without full-page reload or duplicate data bootstrap code
A user without the required Station permission for bot administration cannot access the Station Bot administration route and does not see a nav link to it
When the bot is connected to multiple guilds, switching guild context updates the visible guild-scoped settings without losing operator/global settings context
The overview clearly distinguishes guild-scoped domains from operator/global domains
If Station-Bot is unavailable, the shell still renders with a prominent degraded-state banner rather than crashing or spinning indefinitely
If Station-Bot is in read-only mode, the shell shows that state clearly before the admin attempts any mutation
If the user has only guild-scoped access, operator-only tabs and sections are hidden rather than rendered as faux-editable controls
If the current user is in super-admin support mode, the shell shows a persistent visible banner identifying the target guild and impersonated context
If the shell is opened from the dashboard portlet, the relevant guild is already selected rather than forcing the user to re-pick context
Technical Elaboration
This issue is the frontend frame for the epic, not the per-domain forms themselves.
Recommended route shape:
/admin/station-bot
Child routes or tabs for:
overview
verification
nominations
manufacturing
automation
exec-hangar
station-timer
runtime
guild-access
Recommended page structure:
Header with selected guild, bot connectivity state, read-only badge, last sync timestamp, and current effective admin context
Summary cards for each domain with status indicators such as Configured, Missing required IDs, Globally disabled, Drift detected, Runtime only, or Support Mode
Left-nav or tabbed navigation into the detailed administration pages from the child stories
Shared data loader + context provider so child pages do not each re-implement bootstrap fetch logic
The shell should consume the normalized backend contract created in the foundation issue and the permission model defined in #242, rendering product-facing groupings rather than raw bot DTOs.
Because the current Station architecture treats Station-Bot as a separate service, the shell must handle these states explicitly:
Bot reachable and synced
Bot reachable but returned validation errors for one or more domains
Bot unreachable / timed out
Bot reachable but Station lacks permission for mutation
Bot in read-only mode
Station user session expired or downstream Station-Bot auth unhealthy
Super-admin support impersonation active
Design Elaboration
This should feel like an administration console, not a generic CRUD page.
The overview exists to answer four questions immediately:
Am I allowed to be here?
Which guild am I editing?
Which bot features are configured vs incomplete?
Is the bot healthy enough to accept changes right now?
When support mode is active, there is a fifth question: Am I acting as support inside a customer guild right now? The shell should answer that unmistakably.
User Story
As a Station administrator, I need a dedicated Station Bot administration area in the Station UI so that I can choose a Discord guild, see which bot features are enabled for it, and navigate quickly to the correct configuration screen without hunting through unrelated app pages.
Definition of Done
station_super_admin,guild_owner,guild_admin, andguild_memberpnpm typecheckpassesAcceptance Criteria
Technical Elaboration
This issue is the frontend frame for the epic, not the per-domain forms themselves.
Recommended route shape:
/admin/station-botoverviewverificationnominationsmanufacturingautomationexec-hangarstation-timerruntimeguild-accessRecommended page structure:
Configured,Missing required IDs,Globally disabled,Drift detected,Runtime only, orSupport ModeThe shell should consume the normalized backend contract created in the foundation issue and the permission model defined in
#242, rendering product-facing groupings rather than raw bot DTOs.Because the current Station architecture treats Station-Bot as a separate service, the shell must handle these states explicitly:
Design Elaboration
This should feel like an administration console, not a generic CRUD page.
The overview exists to answer four questions immediately:
When support mode is active, there is a fifth question:
Am I acting as support inside a customer guild right now?The shell should answer that unmistakably.Parent Epic: #231
Depends on: #232, #241, #242
Blocks: #234, #235, #236, #237, #238, #239, #240, #243, #244, #245