Platform Service (StellaOps.Platform.WebService)

Verification status (2026-09-26, DOC-2 of SPRINT_20260926_001): the security read model, legacy alias list, data model, analytics ingestion and analytics sections below were corrected against commit 942a18727c; the analytics sections were rewritten for the PCD-127 withdrawal on 2026-09-30. The remaining route-level detail was not re-verified line by line; architecture.mdand its Evidence table are authoritative.

Purpose

Provide a single, deterministic aggregation layer for cross-service UX workflows (health, quotas, onboarding, preferences and search availability) so the Console UI and CLI do not fan out to multiple modules directly.

Non-goals

Responsibilities

API surface (v1)

Health aggregation

Quota aggregation

Onboarding

Preferences

Metadata

Localization

Stella Assistant

Release Orchestrator ownership and topology projection

CM-6 boundary statements are verified against d3358c84319b0da835e944d70f360f7df526d9c5. Re-verify with rg -n "ProjectReference Include=.*ReleaseOrchestrator" src/Platform -g '*.csproj', rg -n "topology-snapshot" src/Platform src/ReleaseOrchestrator src/Router devops, and rg -n "release\.(regions|environments|targets|agents)" src/Platform/StellaOps.Platform.WebService -g '*.cs'.

Notification admin routing

Synthetic compatibility harnesses

QA fixture readback

Advanced assurance case summary

Advanced assurance scenario transactions

API surface (v2)

Global context

The context region/environment PUT routes are setup-admin convergence APIs for operator-managed installs. They let setup scripts and local lab preparation add real deployment regions and environments without direct SQL.

PUT /api/v2/context/regions/{regionId} accepts:

{
  "displayName": "Local Lab",
  "sortOrder": 5,
  "enabled": true
}

PUT /api/v2/context/environments/{environmentId} accepts:

{
  "regionId": "local-lab",
  "environmentType": "development",
  "displayName": "Customer TEST Lab",
  "sortOrder": 6,
  "enabled": true
}

Both routes require platform.context.write. Region IDs and environment IDs are normalized to lower-case route IDs. Environment upsert requires the referenced region to already exist. Validation failures use deterministic error codes such as region_id_required, region_not_found, environment_id_required, environment_type_required, and environment_type_invalid.

Releases read model

Topology inventory read model

Security read model (not a Platform surface)

/api/v2/security/* and /api/risk/aggregated-status are served by StellaOps.Findings.Security, not by Platform (Program.cs no longer maps them). See the Findings dossier for the contract.

Integrations read model

Analytics (SBOM lake) — withdrawn

Withdrawn 2026-09-30 (SPRINT_20260928_004 PCD-127). Platform no longer maps /api/analytics/* (suppliers, licenses, vulnerabilities, backlog, attestation coverage and the two trend series) and no longer runs the analytics maintenance lane. The read model was the analytics schema, which Findings owns (stellaops_findings); the Findings VulnCorrelation host that ingested it was removed and its ingestion library is wired into no service, and Platform may not read another service’s schema (PCD-58), so every route could only answer 503 analytics_not_configured. The Console SBOM Lake page and the analytics CLI command group were withdrawn in the same change. Nothing replaces the surface; reviving it needs a Findings-owned ingestion path and read API first. The sources are kept for audit under src/__Obsoleted/Platform/StellaOps.Platform.WebService/PCD-127/.

NIS2 telemetry effectiveness

The queue/metrics dependency is verified against b382f26c9fab6cb5e6b1170dd13da3495405e562 in Program.cs, Nis2EffectivenessNotifyThresholdEmitter.cs and Nis2AreaMetricsService.GetAreaReportAsync. Re-verify the candidate configuration with node tools/scripts/validate/check-platform-notify-queue.cjs --self-test and --root .; run Nis2NotifyQueueCompositionTests and adjacent Nis2TelemetryEndpointsTests through tools/scripts/test-targeted-xunit.ps1. The read-only tools/scripts/qa/verify-platform-notify-config.cjs proves the complete model delta without starting a container; its receipt deliberately does not authorize execution.

Crypto provider catalog admin (SPRINT_20260503_008)

Legacy alias compatibility (/api/v1/*)

Data model

Tables created by the Platform migration stream (src/Platform/__Libraries/StellaOps.Platform.Persistence/Migrations/Platform/), grouped by purpose:

099_v3_retire_unused_platform_tables.sql drops the retired platform.identity_provider_configs, the release.release_* and release.run_* projections, and the release.integration_* health tables. The former release.security_* projections are not part of Platform’s stream; the security read model belongs to Findings.Security.

Startup migration convergence

Dependencies

Runtime boundary policy

Security and scopes

Determinism and offline posture

Analytics ingestion and maintenance

Platform hosts neither. SPRINT_20260703_001 PAC-5 relocated ingestion and vulnerability correlation to the Findings module (src/Findings/__Libraries/StellaOps.Findings.VulnCorrelation.*, wired into no service), and the analytics maintenance lane was withdrawn with the analytics surface (PCD-127). Platform binds no Platform:AnalyticsIngestion or Platform:AnalyticsMaintenance section and no Platform:Cache:AnalyticsSeconds key.

Observability

Gateway exposure

The Platform Service is exposed via Gateway and registered through Router discovery. It does not expose direct ingress outside Gateway in production.

Setup Wizard

The Platform Service owns the installation-scoped setup wizard used by /setup-wizard/wizard for first-run control-plane bootstrap and later reconfiguration checks.

The migrations step uses the same Platform-owned PostgreSQL connection contract as service startup: STELLAOPS_POSTGRES_PLATFORM_CONNECTION first, then Platform:Storage:PostgresConnectionString (environment spelling Platform__Storage__PostgresConnectionString). Both probe and apply fail before opening a database connection when those inputs are absent or blank. Generic, module-derived, and schema-derived aliases are unsupported. The step converges only Platform’s migration module; each other service owns its startup migrations.

Connection contract verified against source commit c9c282c305 (2026-10-03). Re-verify with pwsh ./tools/scripts/test-targeted-xunit.ps1 -Project src/Platform/__Tests/StellaOps.Platform.WebService.Tests/StellaOps.Platform.WebService.Tests.csproj -Class "*PlatformSetupMigrationConnectionTests" -BuildProjectReferences and the PlatformMigrationOwnershipIntegrationTests class in the same project.

Current runtime behavior:

API surface (v1)

Sessions

Session payloads distinguish:

Steps

Definitions

Setup step identifiers

Step IDTitleRequiredDepends OnNotes
databasePostgreSQL DatabaseYes-Probe verifies reachability. Apply records convergence against the current runtime connection.
cacheValkey / Redis SetupYes-Probe verifies cache reachability. Apply records convergence against the current runtime connection.
migrationsDatabase MigrationsYesdatabaseProbe reports Platform’s pending migration state. Apply can converge only Platform’s own module; ReleaseOrchestrator migrates and reports its own database from its own host.
adminAdmin BootstrapYesmigrationsProbe validates bootstrap prerequisites. Apply ensures the bootstrap admin exists.
cryptoCryptographyYesadminProbe validates the requested regional crypto profile and emits soft warnings for unmet NIS2/DORA/CRA prerequisites. Apply records the canonical Crypto:* and Compliance:* installation defaults.
sourcesAdvisory & VEX SourcesNoadminProbe validates mirror or manual source selections. Apply persists source enablement through Concelier and schedules initial aggregation for newly enabled sources.

The API accepts exactly the step ids it emits (the table above, plus master-key). The former aliases authority, users, cryptography, masterkey and the enum-name spelling valkey were removed on 2026-09-27; an unknown step id answers 400 Invalid Step with the list of supported steps.

Former tenant-onboarding steps such as vault, scm, registry, notify, environments, agents, telemetry, llm, and settingsstore are no longer valid setup targets. Platform returns explicit handoff guidance to the authenticated onboarding surfaces instead.

Setup session states

StatusDescription
NotStartedSetup not begun
InProgressSetup in progress
CompletedAll steps completed
CompletedPartialRequired steps completed, optional skipped
FailedRequired step failed
AbandonedSetup abandoned by user

Setup step states

StatusDescription
PendingNot yet started
PassedCompleted successfully
FailedValidation failed
SkippedExplicitly skipped (optional steps only)
CurrentReserved contract value for active-step projections
BlockedReserved contract value for dependency failures

Anonymous posture

Security and scopes

Offline posture