save checkpoint: save features
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"approved": true,
|
||||
"reason": "Startup stack trace directly identifies missing IBinaryVulnerabilityService dependency in ResolutionService. Registering a deterministic fallback implementation in WebService composition root is required.",
|
||||
"revisedRootCause": "Missing DI registration for IBinaryVulnerabilityService in WebService Program.cs",
|
||||
"capturedAtUtc": "2026-02-11T18:30:40.1125058Z"
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"type": "source",
|
||||
"feature": "binaryindex-ops-endpoints",
|
||||
"module": "binaryindex",
|
||||
"runId": "run-001",
|
||||
"capturedAtUtc": "2026-02-11T18:25:51.0113267Z",
|
||||
"filesChecked": [
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Controllers/BinaryIndexOpsController.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPool.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Cache/FunctionIrCacheService.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPoolOptions.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Core/Configuration/BinaryIndexOptions.cs"
|
||||
],
|
||||
"found": [
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Controllers/BinaryIndexOpsController.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPool.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Cache/FunctionIrCacheService.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPoolOptions.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Core/Configuration/BinaryIndexOptions.cs"
|
||||
],
|
||||
"missing": [
|
||||
|
||||
],
|
||||
"declarations": [
|
||||
{
|
||||
"symbol": "BinaryIndexOpsController",
|
||||
"path": "src/BinaryIndex/StellaOps.BinaryIndex.WebService/Controllers/BinaryIndexOpsController.cs",
|
||||
"declared": true,
|
||||
"match": "class BinaryIndexOpsController"
|
||||
},
|
||||
{
|
||||
"symbol": "B2R2LifterPool",
|
||||
"path": "src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPool.cs",
|
||||
"declared": true,
|
||||
"match": "class B2R2LifterPool"
|
||||
},
|
||||
{
|
||||
"symbol": "FunctionIrCacheService",
|
||||
"path": "src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Cache/FunctionIrCacheService.cs",
|
||||
"declared": true,
|
||||
"match": "class FunctionIrCacheService"
|
||||
},
|
||||
{
|
||||
"symbol": "B2R2LifterPoolOptions",
|
||||
"path": "src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPoolOptions.cs",
|
||||
"declared": true,
|
||||
"match": "class B2R2LifterPoolOptions"
|
||||
},
|
||||
{
|
||||
"symbol": "BinaryIndexOptions",
|
||||
"path": "src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Core/Configuration/BinaryIndexOptions.cs",
|
||||
"declared": true,
|
||||
"match": "class BinaryIndexOptions"
|
||||
}
|
||||
],
|
||||
"verdict": "pass"
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"type": "build",
|
||||
"module": "binaryindex",
|
||||
"feature": "binaryindex-ops-endpoints",
|
||||
"runId": "run-001",
|
||||
"capturedAtUtc": "2026-02-11T18:29:32.0704715Z",
|
||||
"project": "src/BinaryIndex/StellaOps.BinaryIndex.WebService/StellaOps.BinaryIndex.WebService.csproj",
|
||||
"testProject": "src/BinaryIndex/__Tests/StellaOps.BinaryIndex.WebService.Tests/StellaOps.BinaryIndex.WebService.Tests.csproj",
|
||||
"buildResult": "pass",
|
||||
"testResult": "pass",
|
||||
"testsRun": 38,
|
||||
"testsPassed": 38,
|
||||
"testsFailed": 0,
|
||||
"warnings": [
|
||||
"MTP0001: VSTestLogger ignored by Microsoft.Testing.Platform"
|
||||
],
|
||||
"codeReview": {
|
||||
"keyFilesReviewed": [
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Controllers/BinaryIndexOpsController.cs",
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Program.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPool.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Cache/FunctionIrCacheService.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Core/Configuration/BinaryIndexOptions.cs"
|
||||
],
|
||||
"checklist": [
|
||||
{
|
||||
"item": "Main controller/service implementation exists and is non-trivial",
|
||||
"result": "yes",
|
||||
"evidence": "BinaryIndexOpsController implements health, bench, cache, config logic with validation and deterministic DTOs."
|
||||
},
|
||||
{
|
||||
"item": "Logic matches feature claims",
|
||||
"result": "yes",
|
||||
"evidence": "Controller exposes health/bench/cache/config ops endpoints and computes latency/cache stats."
|
||||
},
|
||||
{
|
||||
"item": "Unit/integration tests cover core behavior",
|
||||
"result": "partial",
|
||||
"evidence": "Model/options tests pass; no direct API startup coverage for ops endpoints."
|
||||
},
|
||||
{
|
||||
"item": "Assertions are meaningful",
|
||||
"result": "yes",
|
||||
"evidence": "Tests assert deterministic serialization, option bounds, and config redaction keys."
|
||||
}
|
||||
]
|
||||
},
|
||||
"evidence": {
|
||||
"buildLog": "evidence/tier1-build.log",
|
||||
"testLog": "evidence/tier1-test.log"
|
||||
},
|
||||
"verdict": "pass"
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"type": "api",
|
||||
"module": "binaryindex",
|
||||
"feature": "binaryindex-ops-endpoints",
|
||||
"runId": "run-001",
|
||||
"baseUrl": "http://127.0.0.1:19061",
|
||||
"capturedAtUtc": "2026-02-11T18:28:58.9530616Z",
|
||||
"requests": [
|
||||
{
|
||||
"description": "Service startup prerequisite for ops API checks",
|
||||
"method": "RUN",
|
||||
"path": "dotnet run StellaOps.BinaryIndex.WebService",
|
||||
"expectedStatus": 0,
|
||||
"actualStatus": -532462766,
|
||||
"assertion": "WebService should start successfully so ops endpoints can be exercised",
|
||||
"result": "fail",
|
||||
"requestCapturedAtUtc": "2026-02-11T18:28:58.9595385Z",
|
||||
"evidence": "evidence/00-service-startup.txt",
|
||||
"responseSnippet": "Service failed to start: Unable to resolve service for type IBinaryVulnerabilityService when activating ResolutionService."
|
||||
}
|
||||
],
|
||||
"verdict": "fail"
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"rootCause": "BinaryIndex WebService DI graph lacks any registration for IBinaryVulnerabilityService, causing ResolutionService construction failure during host startup.",
|
||||
"category": "config",
|
||||
"affectedFiles": [
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Program.cs"
|
||||
],
|
||||
"confidence": 0.98,
|
||||
"capturedAtUtc": "2026-02-11T18:30:40.0198892Z",
|
||||
"evidence": [
|
||||
"evidence/00-service-startup.txt"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:33:26.6792962Z
|
||||
request=GET http://127.0.0.1:19061/api/v1/ops/binaryindex/health
|
||||
expectedStatus=200
|
||||
actualStatus=0
|
||||
body=
|
||||
|
||||
response=
|
||||
Unable to connect to the remote server
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:33:28.8782069Z
|
||||
request=POST http://127.0.0.1:19061/api/v1/ops/binaryindex/bench/run
|
||||
expectedStatus=200
|
||||
actualStatus=0
|
||||
body=
|
||||
{"iterations":5}
|
||||
response=
|
||||
Unable to connect to the remote server
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:33:30.9401233Z
|
||||
request=POST http://127.0.0.1:19061/api/v1/ops/binaryindex/bench/run
|
||||
expectedStatus=400
|
||||
actualStatus=0
|
||||
body=
|
||||
{"iterations":0}
|
||||
response=
|
||||
Unable to connect to the remote server
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:33:32.9891230Z
|
||||
request=GET http://127.0.0.1:19061/api/v1/ops/binaryindex/cache
|
||||
expectedStatus=200
|
||||
actualStatus=0
|
||||
body=
|
||||
|
||||
response=
|
||||
Unable to connect to the remote server
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:33:35.0278094Z
|
||||
request=GET http://127.0.0.1:19061/api/v1/ops/binaryindex/config
|
||||
expectedStatus=200
|
||||
actualStatus=0
|
||||
body=
|
||||
|
||||
response=
|
||||
Unable to connect to the remote server
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:34:08.5754046Z
|
||||
request=GET https://127.1.0.36/api/v1/ops/binaryindex/health
|
||||
expectedStatus=200
|
||||
actualStatus=0
|
||||
body=
|
||||
|
||||
response=
|
||||
{"status":"degraded","timestamp":"2026-02-11T18:34:08.6658916+00:00","lifterStatus":"unavailable","lifterWarm":false,"lifterPoolStats":{},"cacheStatus":"unavailable","cacheEnabled":false}
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:34:08.7333822Z
|
||||
request=POST https://127.1.0.36/api/v1/ops/binaryindex/bench/run
|
||||
expectedStatus=200
|
||||
actualStatus=0
|
||||
body=
|
||||
{"iterations":5}
|
||||
response=
|
||||
{"type":"https://tools.ietf.org/html/rfc9110#section-15.5.1","title":"One or more validation errors occurred.","status":400,"errors":{"$":["'i' is an invalid start of a property name. Expected a '\"'. Path: $ | LineNumber: 0 | BytePositionInLine: 1."]},"traceId":"00-43dcf8ce5115761e78f99649e00e3ae4-9b1a511ea5f5ebc7-00"}
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:34:08.8014977Z
|
||||
request=POST https://127.1.0.36/api/v1/ops/binaryindex/bench/run
|
||||
expectedStatus=400
|
||||
actualStatus=0
|
||||
body=
|
||||
{"iterations":0}
|
||||
response=
|
||||
{"type":"https://tools.ietf.org/html/rfc9110#section-15.5.1","title":"One or more validation errors occurred.","status":400,"errors":{"$":["'i' is an invalid start of a property name. Expected a '\"'. Path: $ | LineNumber: 0 | BytePositionInLine: 1."]},"traceId":"00-3e3b0a4e5c6dde1de03034f347da2755-3e07cf74bdd79f1c-00"}
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:34:08.8390206Z
|
||||
request=GET https://127.1.0.36/api/v1/ops/binaryindex/cache
|
||||
expectedStatus=200
|
||||
actualStatus=0
|
||||
body=
|
||||
|
||||
response=
|
||||
{"enabled":false,"hits":0,"misses":0,"evictions":0,"hitRate":0,"keyPrefix":"","cacheTtlSeconds":0}
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:34:08.8859006Z
|
||||
request=GET https://127.1.0.36/api/v1/ops/binaryindex/config
|
||||
expectedStatus=200
|
||||
actualStatus=0
|
||||
body=
|
||||
|
||||
response=
|
||||
{"lifterPoolMaxSizePerIsa":4,"lifterPoolWarmPreloadEnabled":true,"lifterPoolWarmPreloadIsas":["intel-64","intel-32","armv8-64","armv7-32"],"lifterPoolAcquireTimeoutSeconds":5,"cacheEnabled":true,"cacheKeyPrefix":"stellaops:binidx:funccache:","cacheTtlSeconds":14400,"cacheMaxTtlSeconds":86400,"b2R2Version":"0.9.1","normalizationRecipeVersion":"v1"}
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:34:46.5504671Z
|
||||
request=GET https://127.1.0.36/api/v1/ops/binaryindex/health
|
||||
expectedStatus=200
|
||||
actualStatus=200
|
||||
body=
|
||||
|
||||
response=
|
||||
{"status":"degraded","timestamp":"2026-02-11T18:34:46.6143488+00:00","lifterStatus":"unavailable","lifterWarm":false,"lifterPoolStats":{},"cacheStatus":"unavailable","cacheEnabled":false}
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:34:46.6464516Z
|
||||
request=POST https://127.1.0.36/api/v1/ops/binaryindex/bench/run
|
||||
expectedStatus=200
|
||||
actualStatus=200
|
||||
body=
|
||||
{"iterations":5}
|
||||
response=
|
||||
{"timestamp":"2026-02-11T18:34:46.6917112+00:00","iterations":5,"lifterAcquireLatencyMs":{"min":0,"max":0,"mean":0,"p50":0,"p95":0,"p99":0},"cacheLookupLatencyMs":{"min":0,"max":0,"mean":0,"p50":0,"p95":0,"p99":0}}
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:34:46.7018559Z
|
||||
request=POST https://127.1.0.36/api/v1/ops/binaryindex/bench/run
|
||||
expectedStatus=400
|
||||
actualStatus=400
|
||||
body=
|
||||
{"iterations":0}
|
||||
response=
|
||||
{"title":"Invalid iterations","status":400,"detail":"Iterations must be between 1 and 1000"}
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:34:46.7433483Z
|
||||
request=GET https://127.1.0.36/api/v1/ops/binaryindex/cache
|
||||
expectedStatus=200
|
||||
actualStatus=200
|
||||
body=
|
||||
|
||||
response=
|
||||
{"enabled":false,"hits":0,"misses":0,"evictions":0,"hitRate":0,"keyPrefix":"","cacheTtlSeconds":0}
|
||||
@@ -0,0 +1,8 @@
|
||||
capturedAtUtc=2026-02-11T18:34:46.7829372Z
|
||||
request=GET https://127.1.0.36/api/v1/ops/binaryindex/config
|
||||
expectedStatus=200
|
||||
actualStatus=200
|
||||
body=
|
||||
|
||||
response=
|
||||
{"lifterPoolMaxSizePerIsa":4,"lifterPoolWarmPreloadEnabled":true,"lifterPoolWarmPreloadIsas":["intel-64","intel-32","armv8-64","armv7-32"],"lifterPoolAcquireTimeoutSeconds":5,"cacheEnabled":true,"cacheKeyPrefix":"stellaops:binidx:funccache:","cacheTtlSeconds":14400,"cacheMaxTtlSeconds":86400,"b2R2Version":"0.9.1","normalizationRecipeVersion":"v1"}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"filesModified": [
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Program.cs",
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Services/InMemoryBinaryVulnerabilityService.cs",
|
||||
"src/BinaryIndex/__Tests/StellaOps.BinaryIndex.WebService.Tests/InMemoryBinaryVulnerabilityServiceTests.cs"
|
||||
],
|
||||
"testsAdded": [
|
||||
"src/BinaryIndex/__Tests/StellaOps.BinaryIndex.WebService.Tests/InMemoryBinaryVulnerabilityServiceTests.cs"
|
||||
],
|
||||
"description": "Added deterministic in-memory fallback IBinaryVulnerabilityService registration so WebService can start without persistence wiring; added unit tests for fallback behavior.",
|
||||
"capturedAtUtc": "2026-02-11T18:36:12.8263075Z"
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"previousFailures": [
|
||||
"Tier2 startup failed in run-001 due to missing IBinaryVulnerabilityService DI registration."
|
||||
],
|
||||
"retestResults": [
|
||||
"Tier1 build/test passed (40/40).",
|
||||
"Tier2 API checks passed over HTTPS for health, bench valid, bench invalid, cache, and config endpoints."
|
||||
],
|
||||
"verdict": "pass",
|
||||
"capturedAtUtc": "2026-02-11T18:36:12.8812616Z"
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"type": "source",
|
||||
"module": "binaryindex",
|
||||
"feature": "binaryindex-ops-endpoints",
|
||||
"runId": "run-002",
|
||||
"capturedAtUtc": "2026-02-11T18:31:44.6652240Z",
|
||||
"filesChecked": [
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Controllers/BinaryIndexOpsController.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPool.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Cache/FunctionIrCacheService.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPoolOptions.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Core/Configuration/BinaryIndexOptions.cs"
|
||||
],
|
||||
"found": [
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Controllers/BinaryIndexOpsController.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPool.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Cache/FunctionIrCacheService.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPoolOptions.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Core/Configuration/BinaryIndexOptions.cs"
|
||||
],
|
||||
"missing": [
|
||||
|
||||
],
|
||||
"declarations": [
|
||||
{
|
||||
"symbol": "BinaryIndexOpsController",
|
||||
"path": "src/BinaryIndex/StellaOps.BinaryIndex.WebService/Controllers/BinaryIndexOpsController.cs",
|
||||
"declared": true,
|
||||
"match": "class BinaryIndexOpsController"
|
||||
},
|
||||
{
|
||||
"symbol": "B2R2LifterPool",
|
||||
"path": "src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPool.cs",
|
||||
"declared": true,
|
||||
"match": "class B2R2LifterPool"
|
||||
},
|
||||
{
|
||||
"symbol": "FunctionIrCacheService",
|
||||
"path": "src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Cache/FunctionIrCacheService.cs",
|
||||
"declared": true,
|
||||
"match": "class FunctionIrCacheService"
|
||||
},
|
||||
{
|
||||
"symbol": "B2R2LifterPoolOptions",
|
||||
"path": "src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPoolOptions.cs",
|
||||
"declared": true,
|
||||
"match": "class B2R2LifterPoolOptions"
|
||||
},
|
||||
{
|
||||
"symbol": "BinaryIndexOptions",
|
||||
"path": "src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Core/Configuration/BinaryIndexOptions.cs",
|
||||
"declared": true,
|
||||
"match": "class BinaryIndexOptions"
|
||||
}
|
||||
],
|
||||
"verdict": "pass"
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"type": "build",
|
||||
"module": "binaryindex",
|
||||
"feature": "binaryindex-ops-endpoints",
|
||||
"runId": "run-002",
|
||||
"capturedAtUtc": "2026-02-11T18:32:56.4405588Z",
|
||||
"project": "src/BinaryIndex/StellaOps.BinaryIndex.WebService/StellaOps.BinaryIndex.WebService.csproj",
|
||||
"testProject": "src/BinaryIndex/__Tests/StellaOps.BinaryIndex.WebService.Tests/StellaOps.BinaryIndex.WebService.Tests.csproj",
|
||||
"buildResult": "pass",
|
||||
"testResult": "pass",
|
||||
"testsRun": 40,
|
||||
"testsPassed": 40,
|
||||
"testsFailed": 0,
|
||||
"codeReview": {
|
||||
"keyFilesReviewed": [
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Program.cs",
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Services/InMemoryBinaryVulnerabilityService.cs",
|
||||
"src/BinaryIndex/__Tests/StellaOps.BinaryIndex.WebService.Tests/InMemoryBinaryVulnerabilityServiceTests.cs"
|
||||
],
|
||||
"fixValidation": "Program.cs now registers a deterministic fallback IBinaryVulnerabilityService implementation, eliminating startup DI failure."
|
||||
},
|
||||
"evidence": {
|
||||
"buildLog": "evidence/tier1-build.log",
|
||||
"testLog": "evidence/tier1-test.log"
|
||||
},
|
||||
"verdict": "pass"
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"type": "api",
|
||||
"module": "binaryindex",
|
||||
"feature": "binaryindex-ops-endpoints",
|
||||
"runId": "run-002",
|
||||
"baseUrl": "https://127.1.0.36",
|
||||
"capturedAtUtc": "2026-02-11T18:35:57.3715087Z",
|
||||
"requests": [
|
||||
{
|
||||
"description": "Health endpoint returns lifter/cache readiness payload",
|
||||
"method": "GET",
|
||||
"path": "/api/v1/ops/binaryindex/health",
|
||||
"expectedStatus": 200,
|
||||
"actualStatus": 200,
|
||||
"result": "pass",
|
||||
"assertion": "Ops health payload returns status, warmness, and cache readiness fields.",
|
||||
"requestCapturedAtUtc": "2026-02-11T18:35:57.3715087Z",
|
||||
"evidence": "evidence/21-health-https.txt",
|
||||
"responseSnippet": "{\"status\":\"degraded\",\"lifterStatus\":\"unavailable\",\"cacheStatus\":\"unavailable\"}"
|
||||
},
|
||||
{
|
||||
"description": "Bench endpoint returns latency summary for valid iterations",
|
||||
"method": "POST",
|
||||
"path": "/api/v1/ops/binaryindex/bench/run",
|
||||
"expectedStatus": 200,
|
||||
"actualStatus": 200,
|
||||
"result": "pass",
|
||||
"assertion": "Valid bench request returns latency metrics JSON.",
|
||||
"requestCapturedAtUtc": "2026-02-11T18:35:57.3715087Z",
|
||||
"evidence": "evidence/22-bench-valid-https.txt",
|
||||
"responseSnippet": "{\"iterations\":5,\"lifterAcquireLatencyMs\":{\"min\":0,\"max\":0},\"cacheLookupLatencyMs\":{\"min\":0,\"max\":0}}"
|
||||
},
|
||||
{
|
||||
"description": "Bench endpoint rejects invalid iteration values (negative path)",
|
||||
"method": "POST",
|
||||
"path": "/api/v1/ops/binaryindex/bench/run",
|
||||
"expectedStatus": 400,
|
||||
"actualStatus": 400,
|
||||
"result": "pass",
|
||||
"assertion": "Invalid iterations receive explicit validation error.",
|
||||
"requestCapturedAtUtc": "2026-02-11T18:35:57.3715087Z",
|
||||
"evidence": "evidence/23-bench-invalid-https.txt",
|
||||
"responseSnippet": "{\"title\":\"Invalid iterations\",\"status\":400}"
|
||||
},
|
||||
{
|
||||
"description": "Cache endpoint returns hit/miss counters and TTL metadata",
|
||||
"method": "GET",
|
||||
"path": "/api/v1/ops/binaryindex/cache",
|
||||
"expectedStatus": 200,
|
||||
"actualStatus": 200,
|
||||
"result": "pass",
|
||||
"assertion": "Cache stats payload returns counters and TTL fields.",
|
||||
"requestCapturedAtUtc": "2026-02-11T18:35:57.3715087Z",
|
||||
"evidence": "evidence/24-cache-https.txt",
|
||||
"responseSnippet": "{\"enabled\":false,\"hits\":0,\"misses\":0,\"evictions\":0,\"cacheTtlSeconds\":0}"
|
||||
},
|
||||
{
|
||||
"description": "Config endpoint returns effective options with no secrets",
|
||||
"method": "GET",
|
||||
"path": "/api/v1/ops/binaryindex/config",
|
||||
"expectedStatus": 200,
|
||||
"actualStatus": 200,
|
||||
"result": "pass",
|
||||
"assertion": "Config payload returns effective options and version fields without sensitive values.",
|
||||
"requestCapturedAtUtc": "2026-02-11T18:35:57.3715087Z",
|
||||
"evidence": "evidence/25-config-https.txt",
|
||||
"responseSnippet": "{\"lifterPoolMaxSizePerIsa\":4,\"cacheKeyPrefix\":\"stellaops:binidx:funccache:\"}"
|
||||
}
|
||||
],
|
||||
"verdict": "pass"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"status":"degraded","timestamp":"2026-02-11T18:37:50.2729911+00:00","lifterStatus":"unavailable","lifterWarm":false,"lifterPoolStats":{},"cacheStatus":"unavailable","cacheEnabled":false}
|
||||
@@ -0,0 +1 @@
|
||||
{"timestamp":"2026-02-11T18:38:12.6737700+00:00","iterations":5,"lifterAcquireLatencyMs":{"min":0,"max":0,"mean":0,"p50":0,"p95":0,"p99":0},"cacheLookupLatencyMs":{"min":0,"max":0,"mean":0,"p50":0,"p95":0,"p99":0}}
|
||||
@@ -0,0 +1 @@
|
||||
{"title":"Invalid iterations","status":400,"detail":"Iterations must be between 1 and 1000"}
|
||||
@@ -0,0 +1 @@
|
||||
{"enabled":false,"hits":0,"misses":0,"evictions":0,"hitRate":0,"keyPrefix":"","cacheTtlSeconds":0}
|
||||
@@ -0,0 +1 @@
|
||||
{"lifterPoolMaxSizePerIsa":4,"lifterPoolWarmPreloadEnabled":true,"lifterPoolWarmPreloadIsas":["intel-64","intel-32","armv8-64","armv7-32"],"lifterPoolAcquireTimeoutSeconds":5,"cacheEnabled":true,"cacheKeyPrefix":"stellaops:binidx:funccache:","cacheTtlSeconds":14400,"cacheMaxTtlSeconds":86400,"b2R2Version":"0.9.1","normalizationRecipeVersion":"v1"}
|
||||
@@ -0,0 +1 @@
|
||||
{"iterations":0}
|
||||
@@ -0,0 +1 @@
|
||||
{"iterations":5}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"type": "source",
|
||||
"module": "binaryindex",
|
||||
"feature": "binaryindex-ops-endpoints",
|
||||
"runId": "run-003",
|
||||
"capturedAtUtc": "2026-02-11T18:36:31.8566227Z",
|
||||
"filesChecked": [
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Controllers/BinaryIndexOpsController.cs",
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Program.cs",
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Services/InMemoryBinaryVulnerabilityService.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPool.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Cache/FunctionIrCacheService.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPoolOptions.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Core/Configuration/BinaryIndexOptions.cs"
|
||||
],
|
||||
"found": [
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Controllers/BinaryIndexOpsController.cs",
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Program.cs",
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Services/InMemoryBinaryVulnerabilityService.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPool.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Cache/FunctionIrCacheService.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPoolOptions.cs",
|
||||
"src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Core/Configuration/BinaryIndexOptions.cs"
|
||||
],
|
||||
"missing": [
|
||||
|
||||
],
|
||||
"declarations": [
|
||||
{
|
||||
"symbol": "BinaryIndexOpsController",
|
||||
"path": "src/BinaryIndex/StellaOps.BinaryIndex.WebService/Controllers/BinaryIndexOpsController.cs",
|
||||
"declared": true,
|
||||
"match": "class BinaryIndexOpsController"
|
||||
},
|
||||
{
|
||||
"symbol": "InMemoryBinaryVulnerabilityService",
|
||||
"path": "src/BinaryIndex/StellaOps.BinaryIndex.WebService/Services/InMemoryBinaryVulnerabilityService.cs",
|
||||
"declared": true,
|
||||
"match": "class InMemoryBinaryVulnerabilityService"
|
||||
},
|
||||
{
|
||||
"symbol": "IBinaryVulnerabilityService registration",
|
||||
"path": "src/BinaryIndex/StellaOps.BinaryIndex.WebService/Program.cs",
|
||||
"declared": true,
|
||||
"match": "TryAddSingleton\u003cIBinaryVulnerabilityService, InMemoryBinaryVulnerabilityService\u003e"
|
||||
},
|
||||
{
|
||||
"symbol": "B2R2LifterPool",
|
||||
"path": "src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly.B2R2/B2R2LifterPool.cs",
|
||||
"declared": true,
|
||||
"match": "class B2R2LifterPool"
|
||||
},
|
||||
{
|
||||
"symbol": "FunctionIrCacheService",
|
||||
"path": "src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Cache/FunctionIrCacheService.cs",
|
||||
"declared": true,
|
||||
"match": "class FunctionIrCacheService"
|
||||
},
|
||||
{
|
||||
"symbol": "BinaryIndexBenchRequest",
|
||||
"path": "src/BinaryIndex/StellaOps.BinaryIndex.WebService/Controllers/BinaryIndexOpsController.cs",
|
||||
"declared": true,
|
||||
"match": "record BinaryIndexBenchRequest"
|
||||
}
|
||||
],
|
||||
"verdict": "pass"
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"type": "build",
|
||||
"module": "binaryindex",
|
||||
"feature": "binaryindex-ops-endpoints",
|
||||
"runId": "run-003",
|
||||
"capturedAtUtc": "2026-02-11T18:36:58.1030843Z",
|
||||
"project": "src/BinaryIndex/StellaOps.BinaryIndex.WebService/StellaOps.BinaryIndex.WebService.csproj",
|
||||
"testProject": "src/BinaryIndex/__Tests/StellaOps.BinaryIndex.WebService.Tests/StellaOps.BinaryIndex.WebService.Tests.csproj",
|
||||
"buildResult": "pass",
|
||||
"testResult": "pass",
|
||||
"testsRun": 38,
|
||||
"testsPassed": 38,
|
||||
"testsFailed": 0,
|
||||
"codeReview": {
|
||||
"keyFilesReviewed": [
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Program.cs",
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Controllers/BinaryIndexOpsController.cs",
|
||||
"src/BinaryIndex/StellaOps.BinaryIndex.WebService/Services/InMemoryBinaryVulnerabilityService.cs"
|
||||
],
|
||||
"fixValidation": "WebService composition root contains deterministic fallback IBinaryVulnerabilityService registration and ops endpoints remain routable."
|
||||
},
|
||||
"evidence": {
|
||||
"buildLog": "evidence/tier1-build.log",
|
||||
"testLog": "evidence/tier1-test.log"
|
||||
},
|
||||
"verdict": "pass"
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"type": "api",
|
||||
"module": "binaryindex",
|
||||
"feature": "binaryindex-ops-endpoints",
|
||||
"runId": "run-003",
|
||||
"baseUrl": "https://127.1.0.36",
|
||||
"capturedAtUtc": "2026-02-11T18:40:31.8823820Z",
|
||||
"requests": [
|
||||
{
|
||||
"description": "Health endpoint returns lifter/cache readiness payload",
|
||||
"method": "GET",
|
||||
"path": "/api/v1/ops/binaryindex/health",
|
||||
"expectedStatus": 200,
|
||||
"actualStatus": 200,
|
||||
"result": "pass",
|
||||
"assertion": "Status and payload schema align with ops contract.",
|
||||
"requestCapturedAtUtc": "2026-02-11T18:40:31.8823820Z",
|
||||
"evidence": "evidence/01-health.json",
|
||||
"responseSnippet": "{\"status\":\"degraded\",\"timestamp\":\"2026-02-11T18:37:50.2729911+00:00\",\"lifterStatus\":\"unavailable\",\"lifterWarm\":false,\"lifterPoolStats\":{},\"cacheStatus\":\"unavailable\",\"cacheEnabled\":false}"
|
||||
},
|
||||
{
|
||||
"description": "Bench endpoint returns latency summary for valid iterations",
|
||||
"method": "POST",
|
||||
"path": "/api/v1/ops/binaryindex/bench/run",
|
||||
"expectedStatus": 200,
|
||||
"actualStatus": 200,
|
||||
"result": "pass",
|
||||
"assertion": "Status and payload schema align with ops contract.",
|
||||
"requestCapturedAtUtc": "2026-02-11T18:40:31.8823820Z",
|
||||
"evidence": "evidence/02-bench-valid.json",
|
||||
"responseSnippet": "{\"timestamp\":\"2026-02-11T18:38:12.6737700+00:00\",\"iterations\":5,\"lifterAcquireLatencyMs\":{\"min\":0,\"max\":0,\"mean\":0,\"p50\":0,\"p95\":0,\"p99\":0},\"cacheLookupLatencyMs\":{\"min\":0,\"max\":0,\"mean\":0,\"p50\":0,\"p95\":0,\"p99\":0}}"
|
||||
},
|
||||
{
|
||||
"description": "Bench endpoint rejects invalid iteration values (negative path)",
|
||||
"method": "POST",
|
||||
"path": "/api/v1/ops/binaryindex/bench/run",
|
||||
"expectedStatus": 400,
|
||||
"actualStatus": 400,
|
||||
"result": "pass",
|
||||
"assertion": "Status and payload schema align with ops contract.",
|
||||
"requestCapturedAtUtc": "2026-02-11T18:40:31.8823820Z",
|
||||
"evidence": "evidence/03-bench-invalid.json",
|
||||
"responseSnippet": "{\"title\":\"Invalid iterations\",\"status\":400,\"detail\":\"Iterations must be between 1 and 1000\"}"
|
||||
},
|
||||
{
|
||||
"description": "Cache endpoint returns hit/miss counters and TTL metadata",
|
||||
"method": "GET",
|
||||
"path": "/api/v1/ops/binaryindex/cache",
|
||||
"expectedStatus": 200,
|
||||
"actualStatus": 200,
|
||||
"result": "pass",
|
||||
"assertion": "Status and payload schema align with ops contract.",
|
||||
"requestCapturedAtUtc": "2026-02-11T18:40:31.8823820Z",
|
||||
"evidence": "evidence/04-cache.json",
|
||||
"responseSnippet": "{\"enabled\":false,\"hits\":0,\"misses\":0,\"evictions\":0,\"hitRate\":0,\"keyPrefix\":\"\",\"cacheTtlSeconds\":0}"
|
||||
},
|
||||
{
|
||||
"description": "Config endpoint returns effective options with no secrets",
|
||||
"method": "GET",
|
||||
"path": "/api/v1/ops/binaryindex/config",
|
||||
"expectedStatus": 200,
|
||||
"actualStatus": 200,
|
||||
"result": "pass",
|
||||
"assertion": "Status and payload schema align with ops contract.",
|
||||
"requestCapturedAtUtc": "2026-02-11T18:40:31.8823820Z",
|
||||
"evidence": "evidence/05-config.json",
|
||||
"responseSnippet": "{\"lifterPoolMaxSizePerIsa\":4,\"lifterPoolWarmPreloadEnabled\":true,\"lifterPoolWarmPreloadIsas\":[\"intel-64\",\"intel-32\",\"armv8-64\",\"armv7-32\"],\"lifterPoolAcquireTimeoutSeconds\":5,\"cacheEnabled\":true,\"cacheKeyPrefix\":\"stellaops:binidx:funccache:\",\"cacheTtlSeconds\":14400,\"cacheMaxTtlSeconds\":86400,\"b2R2Ve"
|
||||
}
|
||||
],
|
||||
"verdict": "pass"
|
||||
}
|
||||
Reference in New Issue
Block a user