documentation cleanse, sprints work and planning. remaining non EF DAL migration to EF

This commit is contained in:
master
2026-02-25 01:24:07 +02:00
parent b07d27772e
commit 4db038123b
9090 changed files with 4836 additions and 2909 deletions

View File

@@ -0,0 +1,12 @@
{
"capturedAtUtc": "2026-02-11T11:11:11.9939653Z",
"previousFailures": [
"GET /graphs/jobs returned 400 for lowercase enum values.",
"POST /graphs/hooks/completed returned 403 due default webhook security config requirements."
],
"retestResults": [
"GET /graphs/jobs with type=Build\u0026status=Pending returned 200 and listed pending build job.",
"POST /graphs/hooks/completed for Build and Overlay returned 200 and persisted completed state metadata."
],
"verdict": "pass"
}

View File

@@ -0,0 +1,37 @@
{
"capturedAtUtc": "2026-02-11T11:11:11.9518627Z",
"filesChecked": [
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/GraphBuildJobRequest.cs",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/GraphOverlayJobRequest.cs",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/GraphJobService.cs",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/InMemoryGraphJobStore.cs",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/CartographerWebhookClient.cs",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/GraphJobEndpointExtensions.cs",
"src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/GraphJobs/GraphJobServiceTests.cs",
"src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/GraphJobs/GraphJobEndpointsTests.cs",
"src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/GraphJobs/CartographerWebhookClientTests.cs"
],
"found": [
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/GraphBuildJobRequest.cs",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/GraphOverlayJobRequest.cs",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/GraphJobService.cs",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/InMemoryGraphJobStore.cs",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/CartographerWebhookClient.cs",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/GraphJobEndpointExtensions.cs"
],
"missing": [
"src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/GraphJobs/GraphJobServiceTests.cs",
"src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/GraphJobs/GraphJobEndpointsTests.cs",
"src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/GraphJobs/CartographerWebhookClientTests.cs"
],
"sourceCoverage": 66.67,
"declarations": [
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs\\CartographerWebhookClient.cs:12:internal sealed class CartographerWebhookClient : ICartographerWebhookClient",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs\\GraphBuildJobRequest.cs:8:public sealed record GraphBuildJobRequest",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs\\GraphJobEndpointExtensions.cs:10:public static class GraphJobEndpointExtensions",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs\\GraphJobService.cs:9:internal sealed class GraphJobService : IGraphJobService",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs\\GraphOverlayJobRequest.cs:8:public sealed record GraphOverlayJobRequest",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs\\InMemoryGraphJobStore.cs:8:internal sealed class InMemoryGraphJobStore : IGraphJobStore"
],
"verdict": "partial"
}

View File

@@ -0,0 +1,40 @@
{
"capturedAtUtc": "2026-02-11T11:11:11.9561376Z",
"project": "src/Scheduler/StellaOps.Scheduler.WebService/StellaOps.Scheduler.WebService.csproj",
"buildCommand": "dotnet build src/Scheduler/StellaOps.Scheduler.WebService/StellaOps.Scheduler.WebService.csproj -c Release",
"buildResult": "pass",
"testProject": "src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/StellaOps.Scheduler.WebService.Tests.csproj",
"testCommand": "dotnet test src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/StellaOps.Scheduler.WebService.Tests.csproj -c Release --no-build",
"testResult": "pass",
"testsRun": 125,
"testsPassed": 125,
"testsFailed": 0,
"codeReview": {
"filesReviewed": [
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/GraphJobService.cs",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/GraphJobEndpointExtensions.cs",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/InMemoryGraphJobStore.cs",
"src/Scheduler/StellaOps.Scheduler.WebService/GraphJobs/CartographerWebhookClient.cs",
"src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/GraphJobServiceTests.cs",
"src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/GraphJobEndpointTests.cs",
"src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/CartographerWebhookClientTests.cs"
],
"checklist": {
"nonTrivialImplementation": true,
"logicMatchesFeature": true,
"unitTestsCoverCoreBehavior": true,
"assertionsAreMeaningful": true
},
"notes": [
"GraphJobService enforces transitions through GraphJobStateMachine and ensures completion metadata normalization.",
"Graph endpoints enforce scope checks and tenant resolution before delegating to GraphJobService.",
"Endpoint and service tests cover auth failure paths, creation/listing, completion paths, idempotency, and webhook client behavior."
]
},
"warnings": [
"Feature doc references test files under GraphJobs/ subfolder, while current tests are in src/Scheduler/__Tests/StellaOps.Scheduler.WebService.Tests/. Tier 0 recorded as partial due stale paths."
],
"errors": [
]
}

View File

@@ -0,0 +1,88 @@
{
"type": "api",
"baseUrl": "http://127.0.0.1:10191",
"capturedAtUtc": "2026-02-11T11:09:09.7727384Z",
"requests": [
{
"description": "Unauthorized graph build creation without graph scope",
"method": "POST",
"path": "/graphs/build",
"expectedStatus": 401,
"actualStatus": 401,
"result": "pass",
"requestCapturedAtUtc": "2026-02-11T11:09:09.7864656Z",
"responseSnippet": "{\"error\":\"Missing required header \u0027X-Scopes\u0027.\"}"
},
{
"description": "Create graph build job with required scopes and metadata",
"method": "POST",
"path": "/graphs/build",
"expectedStatus": 201,
"actualStatus": 201,
"result": "pass",
"requestCapturedAtUtc": "2026-02-11T11:09:09.8934314Z",
"responseSnippet": "{\"id\":\"gbj_019c4c640797731db856d27a662d0679\",\"tenantId\":\"tenant-alpha\",\"kind\":\"build\",\"status\":\"pending\",\"payload\":{\"schemaVersion\":\"scheduler.graph-build-job@1\",\"id\":\"gbj_019c4c640797731db856d27a662d0679\",\"tenantId\":\"tenant-alpha\",\"sbomId\":\"sbom-alpha\",\"sbomVersionId\":\"sbom-alpha-v1\",\"sbomDigest\":\"sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\"status\":\"pending\",\"trigger\":\"sbom-version\",\"attempts\":0,\"createdAt\":\"2026-02-11T11:09:09.9110063+00:00\",\"metadata\":{\"purpose\":\"graph-job-dtos\",\"source\":\"tier2-api-check\"}}}"
},
{
"description": "Query build jobs by type and pending status",
"method": "GET",
"path": "/graphs/jobs?type=Build\u0026status=Pending\u0026limit=10",
"expectedStatus": 200,
"actualStatus": 200,
"result": "pass",
"requestCapturedAtUtc": "2026-02-11T11:09:09.9698148Z",
"responseSnippet": "{\"jobs\":[{\"id\":\"gbj_019c4c640797731db856d27a662d0679\",\"tenantId\":\"tenant-alpha\",\"kind\":\"build\",\"status\":\"pending\",\"payload\":{\"schemaVersion\":\"scheduler.graph-build-job@1\",\"id\":\"gbj_019c4c640797731db856d27a662d0679\",\"tenantId\":\"tenant-alpha\",\"sbomId\":\"sbom-alpha\",\"sbomVersionId\":\"sbom-alpha-v1\",\"sbomDigest\":\"sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\"status\":\"pending\",\"trigger\":\"sbom-version\",\"attempts\":0,\"createdAt\":\"2026-02-11T11:09:09.9110063+00:00\",\"metadata\":{\"purpose\":\"graph-job-dtos\",\"source\":\"tier2-api-check\"}}}]}"
},
{
"description": "Complete build job and persist correlation/result metadata",
"method": "POST",
"path": "/graphs/hooks/completed",
"expectedStatus": 200,
"actualStatus": 200,
"result": "pass",
"requestCapturedAtUtc": "2026-02-11T11:09:10.0085419Z",
"responseSnippet": "{\"id\":\"gbj_019c4c640797731db856d27a662d0679\",\"tenantId\":\"tenant-alpha\",\"kind\":\"build\",\"status\":\"completed\",\"payload\":{\"schemaVersion\":\"scheduler.graph-build-job@1\",\"id\":\"gbj_019c4c640797731db856d27a662d0679\",\"tenantId\":\"tenant-alpha\",\"sbomId\":\"sbom-alpha\",\"sbomVersionId\":\"sbom-alpha-v1\",\"sbomDigest\":\"sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\"graphSnapshotId\":\"graph_snap_final\",\"status\":\"completed\",\"trigger\":\"sbom-version\",\"attempts\":1,\"correlationId\":\"corr-graph-001\",\"createdAt\":\"2026-02-11T11:09:09.9110063+00:00\",\"startedAt\":\"2026-02-11T11:09:10.0085419+00:00\",\"completedAt\":\"2026-02-11T11:09:10.0085419+00:00\",\"metadata\":{\"purpose\":\"graph-job-dtos\",\"resultUri\""
},
{
"description": "Reject invalid completion payload using non-terminal status",
"method": "POST",
"path": "/graphs/hooks/completed",
"expectedStatus": 400,
"actualStatus": 400,
"result": "pass",
"requestCapturedAtUtc": "2026-02-11T11:09:10.0745915Z",
"responseSnippet": "{\"error\":\"Completion requires status completed, failed, or cancelled.\"}"
},
{
"description": "Create overlay job tied to graph snapshot and overlay key",
"method": "POST",
"path": "/graphs/overlays",
"expectedStatus": 201,
"actualStatus": 201,
"result": "pass",
"requestCapturedAtUtc": "2026-02-11T11:09:10.0792293Z",
"responseSnippet": "{\"id\":\"goj_019c4c640845784fb1f5ea951fa49dd4\",\"tenantId\":\"tenant-alpha\",\"kind\":\"overlay\",\"status\":\"pending\",\"payload\":{\"schemaVersion\":\"scheduler.graph-overlay-job@1\",\"id\":\"goj_019c4c640845784fb1f5ea951fa49dd4\",\"tenantId\":\"tenant-alpha\",\"graphSnapshotId\":\"graph_snap_final\",\"overlayKind\":\"policy\",\"overlayKey\":\"policy@2026-02-11\",\"subjects\":[\"artifact/service-a\"],\"status\":\"pending\",\"trigger\":\"policy\",\"attempts\":0,\"createdAt\":\"2026-02-11T11:09:10.0857155+00:00\",\"metadata\":{}}}"
},
{
"description": "Complete overlay job and confirm overlay lag metrics endpoint availability",
"method": "POST",
"path": "/graphs/hooks/completed",
"expectedStatus": 200,
"actualStatus": 200,
"result": "pass",
"requestCapturedAtUtc": "2026-02-11T11:09:10.1255124Z",
"responseSnippet": "{\"id\":\"goj_019c4c640845784fb1f5ea951fa49dd4\",\"tenantId\":\"tenant-alpha\",\"kind\":\"overlay\",\"status\":\"completed\",\"payload\":{\"schemaVersion\":\"scheduler.graph-overlay-job@1\",\"id\":\"goj_019c4c640845784fb1f5ea951fa49dd4\",\"tenantId\":\"tenant-alpha\",\"graphSnapshotId\":\"graph_snap_final\",\"overlayKind\":\"policy\",\"overlayKey\":\"policy@2026-02-11\",\"subjects\":[\"artifact/service-a\"],\"status\":\"completed\",\"trigger\":\"policy\",\"attempts\":1,\"correlationId\":\"corr-overlay-001\",\"createdAt\":\"2026-02-11T11:09:10.0857155+00:00\",\"startedAt\":\"2026-02-11T11:09:10.1249989+00:00\",\"completedAt\":\"2026-02-11T11:09:10.1249989+00:00\",\"metadata\":{\"resultUri\":\"oras://cartographer/overlays/policy@2026-02-11\"}}}"
},
{
"description": "Fetch overlay lag metrics with graph read scope",
"method": "GET",
"path": "/graphs/overlays/lag",
"expectedStatus": 200,
"actualStatus": 200,
"result": "pass",
"requestCapturedAtUtc": "2026-02-11T11:09:10.1529795Z",
"responseSnippet": "{\"tenantId\":\"tenant-alpha\",\"pending\":0,\"running\":0,\"completed\":1,\"failed\":0,\"cancelled\":0,\"minLagSeconds\":0.0313215,\"maxLagSeconds\":0.0313215,\"averageLagSeconds\":0.0313215,\"recentCompleted\":[{\"jobId\":\"goj_019c4c640845784fb1f5ea951fa49dd4\",\"completedAt\":\"2026-02-11T11:09:10.1249989+00:00\",\"lagSeconds\":0.0313215,\"correlationId\":\"corr-overlay-001\",\"resultUri\":\"oras://cartographer/overlays/policy@2026-02-11\"}]}"
}
],
"verdict": "pass"
}