frontend styling fixes

This commit is contained in:
master
2026-02-15 12:00:34 +02:00
parent e9aeadc040
commit ab794e167c
860 changed files with 30149 additions and 27297 deletions

View File

@@ -0,0 +1,142 @@
# Live E2E API Verification - Full Platform Sweep
**Date**: 2026-02-15
**Scope**: 37 HTTP web services that previously lacked Tier 2a (live API) verification
**Method**: Docker Compose full stack (`devops/compose/docker-compose.stella-ops.yml`), 61 containers
**Network**: Tested from inside Docker `stellaops` network via `alpine/curl` container
## Phase 0: Docker Teardown & Clean Rebuild
- Full `docker compose down -v --remove-orphans` + `docker system prune -af --volumes` (reclaimed 24.48 GB)
- Fixed `src/Directory.Build.props` NuGet.config case sensitivity (`nuget.config` -> `NuGet.config`) for Linux Docker builds
- All 60 images rebuilt successfully via `devops/docker/build-all.sh`
- Stack started with `docker compose up -d`
- Created external network `stellaops_frontdoor`
## Inline Fixes Applied During Verification
| # | Service | Issue | Root Cause | Fix |
|---|---------|-------|-----------|-----|
| 1 | **Findings Ledger** | Exit 139, missing `ledger_projection_offsets` table | Database migrations not applied | Applied all 9 SQL files from `src/Findings/StellaOps.Findings.Ledger/migrations/` |
| 2 | **Excititor** | Exit 139 (SIGSEGV) during auth middleware init | Bare `AddAuthentication()` without schemes + GET endpoints with `[FromBody]` inference | Removed unused auth middleware; added `[FromServices]` to `EvidenceEndpoints.cs` and `MirrorRegistrationEndpoints.cs` |
| 3 | **Policy Engine** | 500 on all requests | Missing `Authority:ResourceServer:Authority` URL config | Added `STELLAOPS_POLICY_ENGINE_PolicyEngine__ResourceServer__Authority` env var |
| 4 | **Policy Gateway** | 500 on all requests | Missing `PolicyGateway:ResourceServer:Authority` URL config | Added `PolicyGateway__ResourceServer__Authority` env var |
| 5 | **Symbols** | 500 on HTTPS /health | Missing `Authority:ResourceServer:Authority` URL config | Added `Authority__ResourceServer__Authority` env var |
| 6 | **OpsMemory** | 500 on /healthz, endpoint routing failure | `TimeProvider` and `IGuidProvider` not registered in DI | Added `builder.Services.AddDeterminismDefaults()` in Program.cs |
| 7 | **Excititor** (compose) | `profiles: ["code-fix-pending"]` blocked startup | Docker profile excluded from default | Removed profiles line from compose |
| 8 | **Excititor** (compose) | Missing env vars | No Redis, Authority, IssuerDirectory config | Added `ConnectionStrings__Redis`, `Excititor__Authority__BaseUrls__default`, `IssuerDirectory__Client__BaseAddress` |
## Final Results: Health Check Sweep
### Healthy (200) - 28 services
| # | Service | Container | Health Endpoint | Protocol | Status |
|---|---------|-----------|-----------------|----------|--------|
| 1 | Policy Engine | stellaops-policy-engine | `/healthz` | HTTP | 200 |
| 2 | Policy Gateway | stellaops-policy | `/healthz` | HTTP | 200 |
| 3 | Signer | stellaops-signer | `/` | HTTP | 200 (ready message) |
| 4 | Findings Ledger | stellaops-findings-ledger-web | `/healthz` | HTTP | 200 |
| 5 | Concelier | stellaops-concelier | `/health` | HTTP | 200 |
| 6 | Excititor | stellaops-excititor | `/excititor/status` | HTTP | 200 |
| 7 | VexHub | stellaops-vexhub-web | `/health` | HTTPS | 200 |
| 8 | VexLens | stellaops-vexlens-web | `/health` | HTTP | 200 |
| 9 | AdvisoryAI | stellaops-advisory-ai-web | `/health` | HTTP | 200 |
| 10 | Orchestrator | stellaops-orchestrator | `/healthz` | HTTP | 200 |
| 11 | TaskRunner | stellaops-taskrunner-web | `/v1/task-runner/deprecations` | HTTP | 200 |
| 12 | Scheduler | stellaops-scheduler-web | `/healthz` | HTTP | 200 |
| 13 | Replay | stellaops-replay-web | `/healthz` | HTTP | 200 |
| 14 | Integrations | stellaops-integrations-web | `/health` | HTTP | 200 |
| 15 | Graph API | stellaops-graph-api | `/healthz` | HTTP | 200 |
| 16 | Cartographer | stellaops-cartographer | `/healthz` | HTTP | 200 |
| 17 | BinaryIndex | stellaops-binaryindex-web | `/health` | HTTP | 200 |
| 18 | SbomService | stellaops-sbomservice | `/healthz` | HTTP | 200 |
| 19 | Doctor | stellaops-doctor-web | `/healthz` | HTTP | 200 |
| 20 | OpsMemory | stellaops-opsmemory-web | `/health` | HTTPS | 200 |
| 21 | Notifier | stellaops-notifier-web | `/healthz` | HTTP | 200 |
| 22 | Notify | stellaops-notify-web | `/healthz` | HTTP | 200 |
| 23 | RiskEngine | stellaops-riskengine-web | `/risk-scores/providers` | HTTPS | 200 |
| 24 | Symbols | stellaops-symbols | `/health` | HTTPS | 200 |
| 25 | PacksRegistry | stellaops-packsregistry-web | `/healthz` | HTTP | 200 |
| 26 | RegistryToken | stellaops-registry-token | `/healthz` | HTTP | 200 |
| 27 | SmRemote | stellaops-smremote | `:8080/health` | HTTP | 200 |
| 28 | IssuerDirectory | stellaops-issuer-directory | Docker TCP check | TCP | healthy |
### Auth Required (401) - 2 services
| Service | Container | Endpoint | Note |
|---------|-----------|----------|------|
| ExportCenter | stellaops-export | HTTPS `/healthz` | Returns 401 - health endpoint behind auth middleware |
| TimelineIndexer | stellaops-timeline-indexer-web | HTTPS `/healthz` | Returns 401 - health endpoint behind auth middleware |
These services are running and responding - they just require a valid JWT token for all endpoints including health.
### Service Unavailable (503) - 1 service
| Service | Container | Endpoint | Note |
|---------|-----------|----------|------|
| Unknowns | stellaops-unknowns-web | `/health` | Reports "Unhealthy" - likely dependency check failing |
### No Health Endpoint Registered (404) - 4 services
| Service | Container | Docker Status | Note |
|---------|-----------|---------------|------|
| Attestor | stellaops-attestor | healthy (TCP) | App starts with zero mapped routes - no endpoints registered |
| ReachGraph | stellaops-reachgraph-web | healthy (TCP) | 404 on all tested paths via HTTPS |
| Timeline | stellaops-timeline-web | healthy (TCP) | 500 on HTTPS /health (likely auth config needed) |
| AirGap Controller | stellaops-airgap-controller | healthy (TCP) | 404 on all tested paths |
### Unreachable (000) - 1 service
| Service | Container | Docker Status | Note |
|---------|-----------|---------------|------|
| Evidence Locker | stellaops-evidence-locker-web | healthy (TCP) | Kestrel binds to container-specific IP, not 0.0.0.0; requests don't reach app even from inside network |
## API Endpoint Testing (Tier 2a)
Beyond health checks, key API endpoints were tested for all healthy services:
| Service | Endpoint | Code | Interpretation |
|---------|----------|------|----------------|
| Findings Ledger | `/vuln/ledger/events` | 405 | Method Not Allowed (POST only) |
| Findings Ledger | `/ledger/export/findings` | 401 | Auth required |
| Concelier | `/concelier/observations` | 500 | Internal error (no data) |
| Excititor | `/excititor/status` | 200 | Returns status JSON |
| VexHub | `/vex/stats` | 404 | Endpoint not found |
| Orchestrator | `/api/v1/audit` | 404 | Endpoint not found |
| TaskRunner | `/v1/task-runner/deprecations` | 200 | Returns deprecation data |
| Scheduler | `/api/v1/schedules` | 404 | Endpoint not found |
| Replay | `/v1/replay/tokens` | 405 | Method Not Allowed (POST only) |
| ExportCenter | `/api/v1/export/profiles` | 401 | Auth required |
| Integrations | `/api/v1/integrations` | 500 | Internal error |
| Graph API | `/graph/search` | 405 | Method Not Allowed (POST only) |
| Cartographer | `/readyz` | 200 | Ready check passes |
| BinaryIndex | `/api/v1/resolve/vuln` | 405 | Method Not Allowed (POST only) |
| SbomService | `/readyz` | 200 | Ready check passes |
| SbomService | `/entrypoints` | 400 | Bad Request (needs params) |
| Doctor | `/api/v1/doctor/checks` | 401 | Auth required |
| Notifier | `/api/v2/notify/templates` | 400 | Bad Request (needs params) |
| RiskEngine | `/risk-scores/providers` | 200 | Returns provider list |
| SmRemote | `:8080/status` | 200 | Returns status info |
| SmRemote | `:8080/hash` | 405 | Method Not Allowed (POST only) |
| PacksRegistry | `/api/v1/packs` | 500 | Internal error (no data) |
| RegistryToken | `/token` | 401 | Auth required |
## Summary
| Category | Count | Percentage |
|----------|-------|------------|
| Healthy (200) | 28 | 75.7% |
| Auth Required (401) | 2 | 5.4% |
| Service Unavailable (503) | 1 | 2.7% |
| No Health Endpoint (404) | 4 | 10.8% |
| Unreachable (000) | 1 | 2.7% |
| Server Error (500) | 1 | 2.7% |
| **Total** | **37** | **100%** |
### Notes
- 401 and 405 responses on business endpoints are expected (auth-gated and POST-only endpoints)
- 404 services (Attestor, ReachGraph, AirGap Controller) are running per Docker TCP health checks but have no registered HTTP routes
- Services bind to internal Docker DNS names via `TryAddStellaOpsLocalBinding`, making host-side port mapping unreliable for some services
- All testing performed from inside the `stellaops` Docker network using `alpine/curl` container
- 8 services were fixed inline during this verification session