documentation cleanse, sprints work and planning. remaining non EF DAL migration to EF
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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": [
|
||||
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
Reference in New Issue
Block a user