11 KiB
ADDED Requirements
Requirement: Platform generates server-scoped run packages
The platform SHALL let an authorized operator generate a run package for a selected server instance and target platform using the server's single current run key stored encrypted in the platform database.
Scenario: Operator generates run from server actions
- WHEN an authorized operator selects generate executor for a server instance and chooses a supported OS/architecture
- THEN platform MUST create or reuse the server's current encrypted run key, write that key into the generated package config, create a distribution record with key generation, build/download artifact, checksum metadata, and audit event, and MUST NOT return the raw key in the API response
Scenario: Operator downloads generated run package
- WHEN an authorized operator downloads a generated run artifact
- THEN platform MUST authorize access by server scope and return the secret-bearing package through artifact/download APIs without exposing raw host paths, direct sockets, or database credentials in package metadata
Requirement: Run and client-manager keys are isolated singletons
Run executors and plugin-declared client managers SHALL use different authentication secrets, and each server/component SHALL have exactly one current active key stored encrypted in the platform database.
Scenario: Client manager is generated after run
- WHEN a plugin-declared client-manager package is generated for a server that already has a run package
- THEN platform MUST create or reuse the server's current encrypted client-manager key and MUST NOT reuse, reveal through API metadata, or derive it from the run key
Scenario: Component key reset is requested
- WHEN an operator resets a server's run key or client-manager key
- THEN platform MUST replace the encrypted database key for that component, increment the key generation, revoke all packages generated with prior generations, and record an audit event identifying the component kind without logging raw key material
Scenario: Old package authenticates after reset
- WHEN a run or client-manager package generated before the latest key reset attempts to authenticate
- THEN platform MUST reject the old key and require the operator to regenerate and redeploy the corresponding run or client-manager package
Requirement: Plugins declare runtime profiles
Game plugins SHALL declare runtime profiles that describe how run or external transports can discover, control, observe, and connect to the game server using logical keys instead of raw credentials or host paths.
Scenario: Plugin declares server discovery and transports
- WHEN a plugin manifest declares runtime profiles with discovery probes, lifecycle actions, dependency probes, log sources, FTP/rsync, SQL, RCON, or client-manager bindings
- THEN plugin validation MUST accept only known profile fields and platform MUST preserve the declarations for server setup and action gating
Scenario: Plugin manifest includes unsafe runtime details
- WHEN a plugin manifest embeds raw run keys, client-manager keys, FTP passwords, database DSNs, RCON passwords, absolute host paths, direct sockets, or arbitrary shell scripts in runtime profiles
- THEN plugin validation and platform registration MUST reject the manifest before it becomes installable
Requirement: Server runtime bindings resolve plugin profiles
Server instances SHALL bind plugin-declared logical runtime keys to operator-provided local or remote settings before run-dependent actions are enabled.
Scenario: Run discovers an existing server
- WHEN run registers for a server instance with complete runtime bindings and the plugin declares discovery probes
- THEN run MUST evaluate the probes locally, report logical discovery status, version, and health, and MUST NOT return raw host paths or secret values to platform_web or plugin pages
Scenario: Required binding is missing
- WHEN an operator opens server actions for a runtime profile that requires unbound install root, service name, FTP profile, SQL profile, RCON profile, or client-manager profile
- THEN platform MUST mark dependent actions unavailable and explain the missing logical binding without exposing internal storage details
Requirement: Plugins control third-party startup behavior
Third-party game program startup and shutdown SHALL be driven by plugin-declared lifecycle profiles and server runtime bindings, not hardcoded platform game logic.
Scenario: Local process server starts through run
- WHEN a plugin declares a local process lifecycle profile and the server runtime binding is complete
- THEN run MUST start or stop the third-party program through the declared bounded action template and stream stdout/stderr through the log channel
Scenario: Hosted server has no local lifecycle control
- WHEN a plugin declares an FTP-only, FTP+RCON, or custom-client runtime profile without local process lifecycle
- THEN platform MUST hide or deny local start/stop actions and expose only the declared remote or client-manager actions
Requirement: Dependency checks and installs are typed
Run SHALL check dependencies through plugin-declared probes and SHALL install missing dependencies only through approved, typed, reviewable install plans.
Scenario: Dependency check reports missing runtime
- WHEN run evaluates plugin-declared dependency probes and a required runtime, service, package, toolchain, Steam app, Java runtime, Docker runtime, or OS package is missing
- THEN platform MUST show dependency status and a reviewable install plan if the plugin declares one for the target platform
Scenario: Dependency install is approved
- WHEN an authorized operator approves a dependency install plan
- THEN platform MUST queue a bounded run job using typed package/download steps, checksum or source metadata where provided, and must reject arbitrary shell snippets
Requirement: Client-manager packages are plugin-declared builds
The platform SHALL support plugin-declared client-manager build profiles for companion executables that require source checkout, configuration injection, and compilation before download.
Scenario: SCUM-style client manager is generated
- WHEN a plugin declares a client-manager build profile with repository, revision policy, supported target platform, build system, config template, and output artifact paths
- THEN platform MUST create a build job that checks out the approved source, injects redacted configuration from secret refs, produces a downloadable artifact, and redacts secrets from build logs
Scenario: Unsupported client-manager target is requested
- WHEN an operator requests a client-manager build for an OS/architecture not declared by the plugin profile
- THEN platform MUST reject the request before cloning source or creating a credential
Requirement: Online run endpoints self-update through platform jobs
The platform SHALL update online run endpoints by queuing a bounded self-update job that references an approved artifact and checksum instead of sending raw shell commands.
Scenario: Online run accepts update
- WHEN an assigned run endpoint is online and supports self-update
- THEN platform MUST queue an update job, and run MUST download the artifact, verify checksum or signature metadata, stage the replacement, report progress, and restart or swap only after verification succeeds
Scenario: Update verification fails
- WHEN run cannot verify or stage the update artifact
- THEN run MUST keep the current executable, report a bounded failure result, and preserve heartbeat or last-known status without leaking local paths or credentials
Requirement: Run exposes multi-channel transport capabilities
Run SHALL provide declared server operations through separate control, job, log, artifact/file, FTP/rsync, SQL, and RCON channels or adapters while preserving priority and bounded payload rules.
Scenario: Long file transfer is active
- WHEN run is transferring a large file, FTP payload, rsync payload, or artifact chunk
- THEN heartbeat, job ack/result, cancellation polling, and log ingest MUST continue independently without waiting for transfer completion
Scenario: Undeclared transport operation is requested
- WHEN a plugin page or platform caller requests FTP, SQL, RCON, file, or process work not declared by the plugin runtime profile and run capabilities
- THEN platform MUST deny the request before creating a job and MUST return only a safe error
Requirement: Live and historical logs are platform-mediated
Platform_web SHALL show live and historical server logs through platform APIs backed by run log ingest, log checkpoints, and plugin-declared log sources.
Scenario: Live log tail is opened
- WHEN an operator opens live logs for a server with an online run endpoint
- THEN platform_web MUST read from platform log APIs and display sequenced log entries from run without direct run sockets or raw file paths
Scenario: Historical log backfill is requested
- WHEN an operator requests older logs for a declared process, file, FTP, SQL, or plugin-specific log source
- THEN platform MUST queue or serve a backfill using per-source checkpoints, cursors, or file fingerprints and MUST avoid embedding large log bodies in job result payloads
Requirement: Server action menu reflects declared availability
The server list and server detail action menu SHALL show generate run, download run, push run update, generate client manager, dependency check, install dependency, live logs, and historical logs only when the current user and plugin/runtime state permit them.
Scenario: Actions are available
- WHEN a server has a plugin with runtime profiles, complete bindings, and the current user has the required permissions
- THEN platform_web MUST render the applicable actions using the existing game-operations console style and call platform APIs rather than plugin-owned direct endpoints
Scenario: Actions are unavailable
- WHEN a server lacks a required plugin declaration, binding, online run status, build profile, or user permission
- THEN platform_web MUST hide or disable the action with a safe reason and MUST NOT render raw credentials, host paths, direct sockets, or secret refs beyond redacted identifiers
Requirement: Distribution and control events are audited
The platform SHALL audit run generation, run download, credential reset, run update, dependency install, client-manager build, client-manager download, and transport operation requests.
Scenario: Sensitive operation completes
- WHEN a sensitive distribution or control operation succeeds, fails, or is denied
- THEN platform MUST record actor, server instance, plugin ID, component kind, operation, result, artifact ID or job ID where applicable, and redacted reason without raw secret material