389 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Markdown
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			389 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Markdown
		
	
	
		
			Executable File
		
	
	
	
	
# 7 · High‑Level Architecture — **Stella Ops**
 | 
						||
 | 
						||
---
 | 
						||
 | 
						||
## 0 Purpose & Scope  
 | 
						||
 | 
						||
Give contributors, DevOps engineers and auditors a **complete yet readable map** of the Core:
 | 
						||
 | 
						||
* Major runtime components and message paths.  
 | 
						||
* Where plug‑ins, CLI helpers and runtime agents attach.  
 | 
						||
* Technology choices that enable the sub‑5 second SBOM goal.  
 | 
						||
* Typical operational scenarios (pipeline scan, mute, nightly re‑scan, etc.).  
 | 
						||
 | 
						||
Anything enterprise‑only (signed PDF, custom/regulated TLS, LDAP, enforcement) **must arrive as a plug‑in**; the Core never hard‑codes those concerns.
 | 
						||
---
 | 
						||
## 1 Component Overview  
 | 
						||
 | 
						||
| # | Component | Responsibility |
 | 
						||
|---|-----------|---------------|
 | 
						||
| 1 | **API Gateway** | REST endpoints (`/scan`, `/quota`, **`/token/offline`**); token auth; quota enforcement |
 | 
						||
| 2 | **Scan Service** | SBOM parsing, Delta‑SBOM cache, vulnerability lookup |
 | 
						||
| 3 | **Policy Engine** | YAML / (optional) Rego rule evaluation; verdict assembly |
 | 
						||
| 4 | **Quota Service** | Per‑token counters; **333 scans/day**; waits & HTTP 429 |
 | 
						||
| 5 | **Client‑JWT Issuer** | Issues 30‑day offline tokens; bundles them into OUK |
 | 
						||
| 5 | **Registry** | Anonymous internal Docker registry for agents, SBOM uploads |
 | 
						||
| 6 | **Web UI** | React/Blazor SPA; dashboards, policy editor, quota banner |
 | 
						||
| 7 | **Data Stores** | **Redis** (cache, quota) & **MongoDB** (SBOMs, findings, audit) |
 | 
						||
| 8 | **Plugin Host** | Hot‑load .NET DLLs; isolates community plug‑ins |
 | 
						||
| 9 | **Agents** | `sbom‑builder`, `Stella CLI` scanner CLI, future `StellaOpsAttestor` |
 | 
						||
 | 
						||
 | 
						||
```mermaid
 | 
						||
flowchart TD
 | 
						||
    subgraph "External Actors"
 | 
						||
        DEV["Developer / DevSecOps / Manager"]
 | 
						||
        CI["CI/CD Pipeline (e.g., Stella CLI)"]
 | 
						||
        K8S["Kubernetes Cluster (e.g., Zastava Agent)"]
 | 
						||
    end
 | 
						||
 | 
						||
    subgraph "Stella Ops Runtime"
 | 
						||
        subgraph "Core Services"
 | 
						||
            CORE["Stella Core<br>(REST + gRPC APIs, Orchestration)"]
 | 
						||
            REDIS[("Redis<br>(Cache, Queues, Trivy DB Mirror)")]
 | 
						||
            MONGO[("MongoDB<br>(Optional: Long-term Storage)")]
 | 
						||
            POL["Mute Policies<br>(OPA & YAML Evaluator)"]
 | 
						||
            REG["StellaOps Registry<br>(Docker Registry v2)"]
 | 
						||
            ATT["StellaOps Attestor<br>(SLSA + Rekor)"]
 | 
						||
        end
 | 
						||
 | 
						||
        subgraph "Agents & Builders"
 | 
						||
            SB["SBOM Builder<br>(Go Binary: Extracts Layers, Generates SBOMs)"]
 | 
						||
            SA["Stella CLI<br>(Pipeline Helper: Invokes Builder, Triggers Scans)"]
 | 
						||
            ZA["Zastava Agent<br>(K8s Webhook: Enforces Policies, Inventories Containers)"]
 | 
						||
        end
 | 
						||
 | 
						||
        subgraph "Scanners & UI"
 | 
						||
            TRIVY["Trivy Scanner<br>(Plugin Container: Vulnerability Scanning)"]
 | 
						||
            UI["Web UI<br>(Vue3 + Tailwind: Dashboards, Policy Editor)"]
 | 
						||
            CLI["Stella CLI<br>(CLI Helper: Triggers Scans, Mutes)"]
 | 
						||
        end
 | 
						||
    end
 | 
						||
 | 
						||
    DEV -->|Browses Findings, Mutes CVEs| UI
 | 
						||
    DEV -->|Triggers Scans| CLI
 | 
						||
    CI -->|Generates SBOM, Calls /scan| SA
 | 
						||
    K8S -->|Inventories Containers, Enforces Gates| ZA
 | 
						||
 | 
						||
    UI -- "REST" --> CORE
 | 
						||
    CLI -- "REST/gRPC" --> CORE
 | 
						||
    SA -->|Scan Requests| CORE
 | 
						||
    SB -->|Uploads SBOMs| CORE
 | 
						||
    ZA -->|Policy Gates| CORE
 | 
						||
 | 
						||
    CORE -- "Queues, Caches" --> REDIS
 | 
						||
    CORE -- "Persists Data" --> MONGO
 | 
						||
    CORE -->|Evaluates Policies| POL
 | 
						||
    CORE -->|Attests Provenance| ATT
 | 
						||
    CORE -->|Scans Vulnerabilities| TRIVY
 | 
						||
 | 
						||
    SB -- "Pulls Images" --> REG
 | 
						||
    SA -- "Pulls Images" --> REG
 | 
						||
    ZA -- "Pulls Images" --> REG
 | 
						||
 | 
						||
    style DEV fill:#f9f,stroke:#333
 | 
						||
    style CI fill:#f9f,stroke:#333
 | 
						||
    style K8S fill:#f9f,stroke:#333
 | 
						||
    style CORE fill:#ddf,stroke:#333
 | 
						||
    style REDIS fill:#fdd,stroke:#333
 | 
						||
    style MONGO fill:#fdd,stroke:#333
 | 
						||
    style POL fill:#dfd,stroke:#333
 | 
						||
    style REG fill:#dfd,stroke:#333
 | 
						||
    style ATT fill:#dfd,stroke:#333
 | 
						||
    style SB fill:#fdf,stroke:#333
 | 
						||
    style SA fill:#fdf,stroke:#333
 | 
						||
    style ZA fill:#fdf,stroke:#333
 | 
						||
    style TRIVY fill:#ffd,stroke:#333
 | 
						||
    style UI fill:#ffd,stroke:#333
 | 
						||
    style CLI fill:#ffd,stroke:#333
 | 
						||
```
 | 
						||
 | 
						||
* **Developer / DevSecOps / Manager** – browses findings, mutes CVEs, triggers scans.  
 | 
						||
* **Stella CLI** – generates SBOMs and calls `/scan` during CI.  
 | 
						||
* **Zastava Agent** – inventories live containers; Core ships it in *passive* mode only (no kill).  
 | 
						||
 | 
						||
### 1.1 Client‑JWT Lifecycle (offline aware)
 | 
						||
 | 
						||
1. **Online instance** – user signs in → `/connect/token` issues JWT valid 12 h.  
 | 
						||
2. **Offline instance** – JWT with `exp ≈ 30 days` ships in OUK; backend
 | 
						||
   **re‑signs** and stores it during import.  
 | 
						||
3. Tokens embed a `tier` claim (“Free”) and `maxScansPerDay: 333`.  
 | 
						||
4. On expiry the UI surfaces a red toast **7 days** in advance.
 | 
						||
 | 
						||
---
 | 
						||
 | 
						||
## 2 · Component Responsibilities (runtime view)
 | 
						||
 | 
						||
| Component                  | Core Responsibility                                                                                        | Implementation Highlights                                 |
 | 
						||
| -------------------------- | ---------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- |
 | 
						||
| **Stella Core**            | Orchestrates scans, persists SBOM blobs, serves REST/gRPC APIs, fans out jobs to scanners & policy engine. | .NET {{ dotnet }}, CQRS, Redis Streams; pluggable runner interfaces. |
 | 
						||
| **SBOM Builder**           | Extracts image layers, queries Core for *missing* layers, generates SBOMs (multi‑format), uploads blobs.   | Go binary; wraps Trivy & Syft libs.                       |
 | 
						||
| **Stella CLI**          | Pipeline‑side helper; invokes Builder, triggers scan, streams progress back to CI/CD.                      | Static musl build.                                        |
 | 
						||
| **Zastava Agent**          | K8s admission webhook enforcing policy verdicts before Pod creation.                                       | Rust for sub‑10 ms latencies.                             |
 | 
						||
| **UI**                     | Angular 17 SPA for dashboards, settings, policy editor.                                                    | Tailwind CSS; Webpack module federation (future).         |
 | 
						||
| **Redis**                  | Cache, queue, Trivy‑DB mirror, layer diffing.                                                              | Single instance or Sentinel.                              |
 | 
						||
| **MongoDB** (opt.)         | Long‑term SBOM & policy audit storage (> 180 days).                                                        | Optional; enabled via flag.                               |
 | 
						||
| **StellaOps.Registry**     | Anonymous read‑only Docker v2 registry with optional Cosign verification.                                  | `registry :2` behind nginx reverse proxy.                 |
 | 
						||
| **StellaOps.MutePolicies** | YAML/Rego evaluator, policy version store, `/policy/*` API.                                                | Embeds OPA‑WASM; falls back to `opa exec`.                |
 | 
						||
| **StellaOpsAttestor**      | Generate SLSA provenance & Rekor signatures; verify on demand.                                             | Side‑car container; DSSE + Rekor CLI.                     |
 | 
						||
 | 
						||
All cross‑component calls use dependency‑injected interfaces—no
 | 
						||
intra‑component reach‑ins.
 | 
						||
 | 
						||
---
 | 
						||
 | 
						||
## 3 · Principal Backend Modules & Plug‑in Hooks  
 | 
						||
 | 
						||
| Namespace       | Responsibility                                     | Built‑in Tech / Default | Plug‑in Contract                                  |
 | 
						||
| --------------- | -------------------------------------------------- | ----------------------- | ------------------------------------------------- |
 | 
						||
| `configuration` | Parse env/JSON, health‑check endpoint              | .NET {{ dotnet }} Options | `IConfigValidator`                                |
 | 
						||
| `identity`      | Embedded OAuth2/OIDC (OpenIddict 6)                | MIT OpenIddict          | `IIdentityProvider` for LDAP/SAML/JWT gateway     |
 | 
						||
| `pluginloader`  | Discover DLLs, SemVer gate, optional Cosign verify | Reflection + Cosign     | `IPluginLifecycleHook` for telemetry              |
 | 
						||
| `scanning`      | SBOM‑ & image‑flow orchestration; runner pool      | Trivy CLI (default)     | `IScannerRunner` – e.g., Grype, Copacetic, Clair  |
 | 
						||
| `feedser` (vulnerability ingest/merge/export service) | Nightly NVD merge & feed enrichment                | Hangfire job            | drop-in `*.Schedule.dll` for OSV, GHSA, NVD 2.0, CNNVD, CNVD, ENISA, JVN and BDU feeds |
 | 
						||
| `tls`           | TLS provider abstraction                           | OpenSSL                 | `ITlsProvider` for custom suites (incl. **SM2**, where law or security requires it) |
 | 
						||
| `reporting`     | Render HTML/PDF reports                            | RazorLight              | `IReportRenderer`                                 |
 | 
						||
| `ui`            | Angular SPA & i18n                                 | Angular {{ angular }}   | new locales via `/locales/{lang}.json`            |
 | 
						||
| `scheduling`    | Cron + retries                                     | Hangfire                | any recurrent job via `*.Schedule.dll`            |
 | 
						||
 | 
						||
```mermaid
 | 
						||
classDiagram
 | 
						||
    class configuration
 | 
						||
    class identity
 | 
						||
    class pluginloader
 | 
						||
    class scanning
 | 
						||
    class feedser
 | 
						||
    class tls
 | 
						||
    class reporting
 | 
						||
    class ui
 | 
						||
    class scheduling
 | 
						||
 | 
						||
    class AllModules
 | 
						||
 | 
						||
    configuration ..> identity : Uses
 | 
						||
    identity ..> pluginloader : Authenticates Plugins
 | 
						||
    pluginloader ..> scanning : Loads Scanner Runners
 | 
						||
    scanning ..> feedser : Triggers Feed Merges
 | 
						||
    tls ..> AllModules : Provides TLS Abstraction
 | 
						||
    reporting ..> ui : Renders Reports for UI
 | 
						||
    scheduling ..> feedser : Schedules Nightly Jobs
 | 
						||
 | 
						||
    note for scanning "Pluggable: ISScannerRunner<br>e.g., Trivy, Grype"
 | 
						||
    note for feedser "Pluggable: *.Schedule.dll<br>e.g., OSV, GHSA Feeds"
 | 
						||
    note for identity "Pluggable: IIdentityProvider<br>e.g., LDAP, SAML"
 | 
						||
    note for reporting "Pluggable: IReportRenderer<br>e.g., Custom PDF"
 | 
						||
```
 | 
						||
 | 
						||
**When remaining = 0:**  
 | 
						||
API returns `429 Too Many Requests`, `Retry‑After: <UTC‑midnight>` (sequence omitted for brevity).
 | 
						||
 | 
						||
---
 | 
						||
 | 
						||
## 4 · Data Flows  
 | 
						||
 | 
						||
### 4.1 SBOM‑First (≤ 5 s P95)  
 | 
						||
 | 
						||
Builder produces SBOM locally, so Core never touches the Docker
 | 
						||
socket.
 | 
						||
Trivy path hits ≤ 5 s on alpine:3.19 with warmed DB.
 | 
						||
Image‑unpack fallback stays ≤ 10 s for 200 MB images.
 | 
						||
 | 
						||
```mermaid
 | 
						||
sequenceDiagram
 | 
						||
    participant CI as CI/CD Pipeline (Stella CLI)
 | 
						||
    participant SB as SBOM Builder
 | 
						||
    participant CORE as Stella Core
 | 
						||
    participant REDIS as Redis Queue
 | 
						||
    participant RUN as Scanner Runner (e.g., Trivy)
 | 
						||
    participant POL as Policy Evaluator
 | 
						||
 | 
						||
    CI->>SB: Invoke SBOM Generation
 | 
						||
    SB->>CORE: Check Missing Layers (/layers/missing)
 | 
						||
    CORE->>REDIS: Query Layer Diff (SDIFF)
 | 
						||
    REDIS-->>CORE: Missing Layers List
 | 
						||
    CORE-->>SB: Return Missing Layers
 | 
						||
    SB->>SB: Generate Delta SBOM
 | 
						||
    SB->>CORE: Upload SBOM Blob (POST /scan(sbom))
 | 
						||
    CORE->>REDIS: Enqueue Scan Job
 | 
						||
    REDIS->>RUN: Fan Out to Runner
 | 
						||
    RUN->>RUN: Perform Vulnerability Scan
 | 
						||
    RUN-->>CORE: Return Scan Results
 | 
						||
    CORE->>POL: Evaluate Mute Policies
 | 
						||
    POL-->>CORE: Policy Verdict
 | 
						||
    CORE-->>CI: JSON Verdict & Progress Stream
 | 
						||
    Note over CORE,CI: Achieves ≤5s P95 with Warmed DB
 | 
						||
```
 | 
						||
 | 
						||
### 4.2 Delta SBOM
 | 
						||
 | 
						||
Builder collects layer digests.
 | 
						||
`POST /layers/missing` → Redis SDIFF → missing layer list (< 20 ms).
 | 
						||
SBOM generated only for those layers and uploaded.
 | 
						||
 | 
						||
### 4.3 Feedser Harvest & Export
 | 
						||
 | 
						||
```mermaid
 | 
						||
sequenceDiagram
 | 
						||
    participant SCHED as Feedser Scheduler
 | 
						||
    participant CONN as Source Connector Plug-in
 | 
						||
    participant FEEDSER as Feedser Core
 | 
						||
    participant MONGO as MongoDB (Canonical Advisories)
 | 
						||
    participant EXPORT as Exporter (JSON / Trivy DB)
 | 
						||
    participant ART as Artifact Store / Offline Kit
 | 
						||
 | 
						||
    SCHED->>CONN: Trigger window (init/resume)
 | 
						||
    CONN->>CONN: Fetch source documents + metadata
 | 
						||
    CONN->>FEEDSER: Submit raw document for parsing
 | 
						||
    FEEDSER->>FEEDSER: Parse & normalize to DTO
 | 
						||
    FEEDSER->>FEEDSER: Merge & deduplicate canonical advisory
 | 
						||
    FEEDSER->>MONGO: Write advisory, provenance, merge_event
 | 
						||
    FEEDSER->>EXPORT: Queue export delta request
 | 
						||
    EXPORT->>MONGO: Read canonical snapshot/deltas
 | 
						||
    EXPORT->>EXPORT: Build deterministic JSON & Trivy DB artifacts
 | 
						||
    EXPORT->>ART: Publish artifacts / Offline Kit bundle
 | 
						||
    ART-->>FEEDSER: Record export state + digests
 | 
						||
```
 | 
						||
 | 
						||
### 4.4 Identity & Auth Flow
 | 
						||
 | 
						||
OpenIddict issues JWTs via client‑credentials or password grant.
 | 
						||
An IIdentityProvider plug‑in can delegate to LDAP, SAML or external OIDC
 | 
						||
without Core changes.
 | 
						||
---
 | 
						||
## 5 · Runtime Helpers  
 | 
						||
 | 
						||
| Helper    | Form                                  | Purpose                                                            | Extensible Bits                            |
 | 
						||
|-----------|---------------------------------------|--------------------------------------------------------------------|-------------------------------------------|
 | 
						||
| **Stella CLI** | Distroless CLI                       | Generates SBOM, calls `/scan`, honours threshold flag              | `--engine`, `--pdf-out` piped to plug‑ins |
 | 
						||
| **Zastava** | Static Go binary / DaemonSet         | Watches Docker/CRI‑O events; uploads SBOMs; can enforce gate       | Policy plug‑in could alter thresholds     |
 | 
						||
 | 
						||
---
 | 
						||
 | 
						||
## 6 · Persistence & Cache Strategy  
 | 
						||
 | 
						||
| Store          | Primary Use                                   | Why chosen                     |
 | 
						||
|----------------|-----------------------------------------------|--------------------------------|
 | 
						||
| **MongoDB**    | Feedser canonical advisories, merge events, export state | Deterministic canonical store with flexible schema |
 | 
						||
| **Redis 7**    | CLI quotas, short-lived job scheduling, layer diff cache | Sub-1 ms P99 latency for hot-path coordination |
 | 
						||
| **Local tmpfs**| Trivy layer cache (`/var/cache/trivy`)        | Keeps disk I/O off hot path    |
 | 
						||
 | 
						||
```mermaid
 | 
						||
flowchart LR
 | 
						||
    subgraph "Persistence Layers"
 | 
						||
        REDIS[(Redis: Quotas & Short-lived Queues<br>Sub-1ms P99)]
 | 
						||
        MONGO[(MongoDB: Canonical Advisories<br>Merge Events & Export State)]
 | 
						||
        TMPFS[(Local tmpfs: Trivy Layer Cache<br>Low I/O Overhead)]
 | 
						||
    end
 | 
						||
 | 
						||
    CORE["Stella Core"] -- Queues & SBOM Cache --> REDIS
 | 
						||
    CORE -- Long-term Storage --> MONGO
 | 
						||
    TRIVY["Trivy Scanner"] -- Layer Unpack Cache --> TMPFS
 | 
						||
 | 
						||
    style REDIS fill:#fdd,stroke:#333
 | 
						||
    style MONGO fill:#dfd,stroke:#333
 | 
						||
    style TMPFS fill:#ffd,stroke:#333
 | 
						||
```
 | 
						||
 | 
						||
---
 | 
						||
 | 
						||
## 7 · Typical Scenarios  
 | 
						||
 | 
						||
| #       | Flow                       | Steps                                                                                           |
 | 
						||
|---------|----------------------------|-------------------------------------------------------------------------------------------------|
 | 
						||
| **S‑1** | Pipeline Scan & Alert     | Stella CLI → SBOM → `/scan` → policy verdict → CI exit code & link to *Scan Detail*                |
 | 
						||
| **S‑2** | Mute Noisy CVE            | Dev toggles **Mute** in UI → rule stored in Redis → next build passes                           |
 | 
						||
| **S‑3** | Nightly Re‑scan           | `SbomNightly.Schedule` re‑queues SBOMs (mask‑filter) → dashboard highlights new Criticals       |
 | 
						||
| **S‑4** | Feed Update Cycle         | `Feedser (vulnerability ingest/merge/export service)` refreshes feeds → UI *Feed Age* tile turns green |
 | 
						||
| **S‑5** | Custom Report Generation  | Plug‑in registers `IReportRenderer` → `/report/custom/{digest}` → CI downloads artifact         |
 | 
						||
 | 
						||
```mermaid
 | 
						||
sequenceDiagram
 | 
						||
    participant DEV as Developer
 | 
						||
    participant UI as Web UI
 | 
						||
    participant CORE as Stella Core
 | 
						||
    participant REDIS as Redis
 | 
						||
    participant RUN as Scanner Runner
 | 
						||
 | 
						||
    DEV->>UI: Toggle Mute for CVE
 | 
						||
    UI->>CORE: Update Mute Rule (POST /policy/mute)
 | 
						||
    CORE->>REDIS: Store Mute Policy
 | 
						||
    Note over CORE,REDIS: YAML/Rego Evaluator Updates
 | 
						||
 | 
						||
    alt Next Pipeline Build
 | 
						||
        CI->>CORE: Trigger Scan (POST /scan)
 | 
						||
        CORE->>RUN: Enqueue & Scan
 | 
						||
        RUN-->>CORE: Raw Findings
 | 
						||
        CORE->>REDIS: Apply Mute Policies
 | 
						||
        REDIS-->>CORE: Filtered Verdict (Passes)
 | 
						||
        CORE-->>CI: Success Exit Code
 | 
						||
    end
 | 
						||
```
 | 
						||
 | 
						||
```mermaid
 | 
						||
sequenceDiagram
 | 
						||
    participant CRON as SbomNightly.Schedule
 | 
						||
    participant CORE as Stella Core
 | 
						||
    participant REDIS as Redis Queue
 | 
						||
    participant RUN as Scanner Runner
 | 
						||
    participant UI as Dashboard
 | 
						||
 | 
						||
    CRON->>CORE: Re-queue SBOMs (Mask-Filter)
 | 
						||
    CORE->>REDIS: Enqueue Filtered Jobs
 | 
						||
    REDIS->>RUN: Fan Out to Runners
 | 
						||
    RUN-->>CORE: New Scan Results
 | 
						||
    CORE->>UI: Highlight New Criticals
 | 
						||
    Note over CORE,UI: Focus on Changes Since Last Scan
 | 
						||
```
 | 
						||
---
 | 
						||
 | 
						||
## 8 · UI Fast Facts  
 | 
						||
 | 
						||
* **Stack** – Angular 17 + Vite dev server; Tailwind CSS.  
 | 
						||
* **State** – Signals + RxJS for live scan progress.  
 | 
						||
* **i18n / l10n** – JSON bundles served from `/locales/{lang}.json`.  
 | 
						||
* **Module Structure** – Lazy‑loaded feature modules (`dashboard`, `scans`, `settings`); runtime route injection by UI plug‑ins (road‑map Q2‑2026).  
 | 
						||
 | 
						||
---
 | 
						||
 | 
						||
## 9 · Cross‑Cutting Concerns  
 | 
						||
 | 
						||
* **Security** – containers run non‑root, `CAP_DROP:ALL`, read‑only FS, hardened seccomp profiles.  
 | 
						||
* **Observability** – Serilog JSON, OpenTelemetry OTLP exporter, Prometheus `/metrics`.  
 | 
						||
* **Upgrade Policy** – `/api/v1` endpoints & CLI flags stable across a minor; breaking changes bump major.  
 | 
						||
 | 
						||
---
 | 
						||
 | 
						||
## 10 · Performance & Scalability  
 | 
						||
 | 
						||
| Scenario        | P95 target | Bottleneck      | Mitigation                                      |
 | 
						||
|-----------------|-----------:|-----------------|-------------------------------------------------|
 | 
						||
| SBOM‑first      | ≤ 5 s      | Redis queue     | More CPU, increase `ScannerPool.Workers`        |
 | 
						||
| Image‑unpack    | ≤ 10 s     | Layer unpack    | Prefer SBOM path, warm Docker cache             |
 | 
						||
| High concurrency| 40 rps     | Runner CPU      | Scale Core replicas + side‑car scanner services |
 | 
						||
 | 
						||
---
 | 
						||
 | 
						||
## 11 · Future Architectural Anchors  
 | 
						||
 | 
						||
* **ScanService micro‑split (gRPC)** – isolate heavy runners for large clusters.  
 | 
						||
* **UI route plug‑ins** – dynamic Angular module loader (road‑map Q2‑2026).  
 | 
						||
* **Redis Cluster** – transparently sharded cache once sustained > 100 rps.  
 | 
						||
 | 
						||
---
 | 
						||
 | 
						||
## 12 · Assumptions & Trade‑offs  
 | 
						||
 | 
						||
Requires Docker/CRI‑O runtime; .NET 9 available on hosts; Windows containers are out‑of‑scope this cycle.  
 | 
						||
Embedded auth simplifies deployment but may need plug‑ins for enterprise IdPs.  
 | 
						||
Speed is prioritised over exhaustive feature parity with heavyweight commercial scanners.
 | 
						||
 | 
						||
---
 | 
						||
 | 
						||
## 13 · References & Further Reading  
 | 
						||
 | 
						||
* **C4 Model** – <https://c4model.com>  
 | 
						||
* **.NET Architecture Guides** – <https://learn.microsoft.com/dotnet/architecture>  
 | 
						||
* **OSS Examples** – Kubernetes Architecture docs, Prometheus design papers, Backstage.  
 | 
						||
 | 
						||
*(End of High‑Level Architecture v2.2)*
 |