save checkpoint: save features

This commit is contained in:
master
2026-02-12 10:27:23 +02:00
parent dca86e1248
commit 5bca406787
8837 changed files with 1796879 additions and 5294 deletions

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
]
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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}

View File

@@ -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"}

View File

@@ -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"}

View File

@@ -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}

View File

@@ -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"}

View File

@@ -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}

View File

@@ -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}}

View File

@@ -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"}

View File

@@ -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}

View File

@@ -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"}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -0,0 +1 @@
{"status":"degraded","timestamp":"2026-02-11T18:37:50.2729911+00:00","lifterStatus":"unavailable","lifterWarm":false,"lifterPoolStats":{},"cacheStatus":"unavailable","cacheEnabled":false}

View File

@@ -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}}

View File

@@ -0,0 +1 @@
{"title":"Invalid iterations","status":400,"detail":"Iterations must be between 1 and 1000"}

View File

@@ -0,0 +1 @@
{"enabled":false,"hits":0,"misses":0,"evictions":0,"hitRate":0,"keyPrefix":"","cacheTtlSeconds":0}

View File

@@ -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"}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}