documentation cleanse, sprints work and planning. remaining non EF DAL migration to EF
This commit is contained in:
@@ -0,0 +1,136 @@
|
||||
{
|
||||
"module": "scanner",
|
||||
"feature": "base-image-detection-and-recommendations",
|
||||
"runId": "run-001",
|
||||
"tier": 0,
|
||||
"capturedAtUtc": "2026-02-12T07:25:35.6353745Z",
|
||||
"filesChecked": [
|
||||
{
|
||||
"expected": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/IBaseImageDetector.cs",
|
||||
"status": "found_exact",
|
||||
"resolvedPath": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/IBaseImageDetector.cs"
|
||||
},
|
||||
{
|
||||
"expected": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/BaseImageDetector.cs",
|
||||
"status": "found_exact",
|
||||
"resolvedPath": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/BaseImageDetector.cs"
|
||||
},
|
||||
{
|
||||
"expected": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/ILayerDigestResolver.cs",
|
||||
"status": "found_exact",
|
||||
"resolvedPath": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/ILayerDigestResolver.cs"
|
||||
},
|
||||
{
|
||||
"expected": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/LayerDigestResolver.cs",
|
||||
"status": "found_exact",
|
||||
"resolvedPath": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/LayerDigestResolver.cs"
|
||||
},
|
||||
{
|
||||
"expected": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/LayerProvenance.cs",
|
||||
"status": "found_exact",
|
||||
"resolvedPath": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/LayerProvenance.cs"
|
||||
},
|
||||
{
|
||||
"expected": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Reuse/ILayerReuseDetector.cs",
|
||||
"status": "found_exact",
|
||||
"resolvedPath": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Reuse/ILayerReuseDetector.cs"
|
||||
},
|
||||
{
|
||||
"expected": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Reuse/LayerReuseDetector.cs",
|
||||
"status": "found_exact",
|
||||
"resolvedPath": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Reuse/LayerReuseDetector.cs"
|
||||
},
|
||||
{
|
||||
"expected": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/ManifestServiceCollectionExtensions.cs",
|
||||
"status": "found_exact",
|
||||
"resolvedPath": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/ManifestServiceCollectionExtensions.cs"
|
||||
}
|
||||
],
|
||||
"found": [
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/IBaseImageDetector.cs",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/BaseImageDetector.cs",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/ILayerDigestResolver.cs",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/LayerDigestResolver.cs",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/LayerProvenance.cs",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Reuse/ILayerReuseDetector.cs",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Reuse/LayerReuseDetector.cs",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest/ManifestServiceCollectionExtensions.cs"
|
||||
],
|
||||
"missing": [
|
||||
|
||||
],
|
||||
"symbolsChecked": [
|
||||
{
|
||||
"symbol": "IBaseImageDetector",
|
||||
"status": "found",
|
||||
"evidence": [
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\ManifestServiceCollectionExtensions.cs:29: services.AddSingleton\u003cIBaseImageDetector, BaseImageDetector\u003e();",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Reuse\\LayerReuseDetector.cs:19: private readonly IBaseImageDetector _baseImageDetector;",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Reuse\\LayerReuseDetector.cs:25: IBaseImageDetector baseImageDetector,"
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "BaseImageDetector",
|
||||
"status": "found",
|
||||
"evidence": [
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\ManifestServiceCollectionExtensions.cs:29: services.AddSingleton\u003cIBaseImageDetector, BaseImageDetector\u003e();",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Resolution\\BaseImageDetector.cs:13:public sealed class BaseImageDetector : IBaseImageDetector",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Resolution\\BaseImageDetector.cs:19: private readonly ILogger\u003cBaseImageDetector\u003e _logger;"
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "ILayerDigestResolver",
|
||||
"status": "found",
|
||||
"evidence": [
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\ManifestServiceCollectionExtensions.cs:30: services.AddSingleton\u003cILayerDigestResolver, LayerDigestResolver\u003e();",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Reuse\\LayerReuseDetector.cs:18: private readonly ILayerDigestResolver _layerResolver;",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Reuse\\LayerReuseDetector.cs:24: ILayerDigestResolver layerResolver,"
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "LayerDigestResolver",
|
||||
"status": "found",
|
||||
"evidence": [
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\ManifestServiceCollectionExtensions.cs:30: services.AddSingleton\u003cILayerDigestResolver, LayerDigestResolver\u003e();",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Resolution\\LayerDigestResolver.cs:17:public sealed class LayerDigestResolver : ILayerDigestResolver",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Resolution\\LayerDigestResolver.cs:23: private readonly ILogger\u003cLayerDigestResolver\u003e _logger;"
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "LayerProvenance",
|
||||
"status": "found",
|
||||
"evidence": [
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Resolution\\LayerProvenance.cs:8:public sealed record LayerProvenance",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Resolution\\LayerProvenance.cs:87: public ImmutableArray\u003cLayerProvenance\u003e Layers { get; init; } = [];",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Resolution\\LayerDigestResolver.cs:64: var layers = new List\u003cLayerProvenance\u003e();"
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "ILayerReuseDetector",
|
||||
"status": "found",
|
||||
"evidence": [
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\ManifestServiceCollectionExtensions.cs:39: services.AddSingleton\u003cILayerReuseDetector, LayerReuseDetector\u003e();",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Reuse\\LayerReuseDetector.cs:11:public sealed class LayerReuseDetector : ILayerReuseDetector",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Reuse\\ILayerReuseDetector.cs:6:public interface ILayerReuseDetector"
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "LayerReuseDetector",
|
||||
"status": "found",
|
||||
"evidence": [
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Reuse\\LayerReuseDetector.cs:11:public sealed class LayerReuseDetector : ILayerReuseDetector",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Reuse\\LayerReuseDetector.cs:20: private readonly ILogger\u003cLayerReuseDetector\u003e _logger;",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\Reuse\\LayerReuseDetector.cs:22: public LayerReuseDetector("
|
||||
]
|
||||
},
|
||||
{
|
||||
"symbol": "ManifestServiceCollectionExtensions",
|
||||
"status": "found",
|
||||
"evidence": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest\\ManifestServiceCollectionExtensions.cs:11:public static class ManifestServiceCollectionExtensions"
|
||||
}
|
||||
],
|
||||
"symbolsMissing": [
|
||||
|
||||
],
|
||||
"verdict": "pass"
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"module": "scanner",
|
||||
"feature": "base-image-detection-and-recommendations",
|
||||
"runId": "run-001",
|
||||
"tier": 1,
|
||||
"capturedAtUtc": "2026-02-12T07:38:20.1629309Z",
|
||||
"project": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/StellaOps.Scanner.Manifest.csproj",
|
||||
"testProject": "src/Scanner/__Tests/StellaOps.Scanner.Core.Tests/StellaOps.Scanner.Core.Tests.csproj",
|
||||
"buildResult": "pass",
|
||||
"testResult": "pass",
|
||||
"targetedTestRunner": "src/Scanner/__Tests/StellaOps.Scanner.Core.Tests/bin/Release/net10.0/StellaOps.Scanner.Core.Tests.exe",
|
||||
"targetedTestFilter": "class=StellaOps.Scanner.Core.Tests.BaseImageRecommendationTests",
|
||||
"targetedTestsRun": 5,
|
||||
"targetedTestsPassed": 5,
|
||||
"targetedTestsFailed": 0,
|
||||
"codeReview": {
|
||||
"mainClassImplemented": true,
|
||||
"logicMatchesFeatureClaims": true,
|
||||
"unitTestsCoverCoreBehavior": true,
|
||||
"assertionsMeaningful": true,
|
||||
"notes": [
|
||||
"BaseImageDetector now includes deterministic fuzzy fallback (nearest layer index + lexical tie-break).",
|
||||
"IBaseImageDetector now exposes recommendation and bulk recommendation contracts.",
|
||||
"BaseImageMatchEngine ranks exact/fuzzy matches with deterministic scoring and rationale."
|
||||
]
|
||||
},
|
||||
"knownNonBlockingFailures": [
|
||||
"Full Core test suite still has pre-existing unrelated failures in CanonicalSerializationPerfSmokeTests.Serialization_ScalesLinearlyWithSize and TestKitExamples.SnapshotAssert_Example."
|
||||
],
|
||||
"logs": [
|
||||
"tier1-build-manifest.log",
|
||||
"tier1-build-core-tests.log",
|
||||
"tier1-tests-base-image.log",
|
||||
"tier1-known-core-fullsuite-failure.log"
|
||||
],
|
||||
"verdict": "pass"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"project": "src/Scanner/__Libraries/StellaOps.Scanner.Manifest/StellaOps.Scanner.Manifest.csproj",
|
||||
"exitCode": 0,
|
||||
"log": "tier1-build-StellaOps.Scanner.Manifest.log"
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"tier": 1,
|
||||
"type": "code_review",
|
||||
"capturedAtUtc": "2026-02-12T07:30:36.3020226Z",
|
||||
"checklist": {
|
||||
"mainClassServiceNonTrivial": true,
|
||||
"logicMatchesFeatureDescription": false,
|
||||
"unitTestsExerciseCoreBehavior": false,
|
||||
"testsAssertMeaningfulOutcomes": false
|
||||
},
|
||||
"findings": [
|
||||
{
|
||||
"severity": "high",
|
||||
"message": "Feature claim requires fuzzy matching and bulk detection support, but IBaseImageDetector contract exposes only single-layer exact detection and registration/query methods.",
|
||||
"evidence": [
|
||||
"docs/features/unchecked/scanner/base-image-detection-and-recommendations.md:10",
|
||||
"docs/features/unchecked/scanner/base-image-detection-and-recommendations.md:15",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/IBaseImageDetector.cs:15",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/IBaseImageDetector.cs:23",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/IBaseImageDetector.cs:31",
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/IBaseImageDetector.cs:41"
|
||||
]
|
||||
},
|
||||
{
|
||||
"severity": "medium",
|
||||
"message": "No direct Scanner test coverage was found for BaseImageDetector/LayerDigestResolver/LayerReuseDetector behaviors.",
|
||||
"evidence": [
|
||||
"docs/qa/feature-checks/runs/scanner/base-image-detection-and-recommendations/run-001/tier1-test-discovery.log"
|
||||
]
|
||||
},
|
||||
{
|
||||
"severity": "medium",
|
||||
"message": "LayerDigestResolver still has TODO for zstd layer support, leaving media-type coverage incomplete for diffID computation.",
|
||||
"evidence": [
|
||||
"src/Scanner/__Libraries/StellaOps.Scanner.Manifest/Resolution/LayerDigestResolver.cs:294"
|
||||
]
|
||||
}
|
||||
],
|
||||
"verdict": "fail",
|
||||
"category": "missing_code"
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"project": "(discovery)",
|
||||
"exitCode": 0,
|
||||
"failed": 0,
|
||||
"passed": 0,
|
||||
"skipped": 0,
|
||||
"total": 0,
|
||||
"log": "tier1-test-discovery.log"
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"module": "scanner",
|
||||
"feature": "base-image-detection-and-recommendations",
|
||||
"runId": "run-001",
|
||||
"tier": 2,
|
||||
"type": "integration",
|
||||
"capturedAtUtc": "2026-02-12T07:38:20.1629309Z",
|
||||
"testCommand": "src/Scanner/__Tests/StellaOps.Scanner.Core.Tests/bin/Release/net10.0/StellaOps.Scanner.Core.Tests.exe -class StellaOps.Scanner.Core.Tests.BaseImageRecommendationTests",
|
||||
"testsRun": 5,
|
||||
"testsPassed": 5,
|
||||
"testsFailed": 0,
|
||||
"steps": [
|
||||
{
|
||||
"description": "Positive path: exact base-image recommendation from ordered layer prefix.",
|
||||
"expected": "Exact match with confidence 1.0 is returned.",
|
||||
"actual": "RankMatches_ReturnsExactRecommendationWithConfidenceOne passed.",
|
||||
"result": "pass",
|
||||
"evidence": "BaseImageRecommendationTests.RankMatches_ReturnsExactRecommendationWithConfidenceOne",
|
||||
"stepCapturedAtUtc": "2026-02-12T07:38:20.1629309Z"
|
||||
},
|
||||
{
|
||||
"description": "Positive path: fuzzy recommendation for partially modified base image.",
|
||||
"expected": "Fuzzy recommendation is returned with confidence \u003e= 0.55 and \u003c 1.0.",
|
||||
"actual": "RankMatches_ReturnsFuzzyRecommendationWhenMajorityOfLayersOverlap passed.",
|
||||
"result": "pass",
|
||||
"evidence": "BaseImageRecommendationTests.RankMatches_ReturnsFuzzyRecommendationWhenMajorityOfLayersOverlap",
|
||||
"stepCapturedAtUtc": "2026-02-12T07:38:20.1629309Z"
|
||||
},
|
||||
{
|
||||
"description": "Negative path: no overlap should return no recommendations.",
|
||||
"expected": "Empty recommendation list.",
|
||||
"actual": "RankMatches_ReturnsEmptyWhenNoKnownLayersOverlap passed.",
|
||||
"result": "pass",
|
||||
"evidence": "BaseImageRecommendationTests.RankMatches_ReturnsEmptyWhenNoKnownLayersOverlap",
|
||||
"stepCapturedAtUtc": "2026-02-12T07:38:20.1629309Z"
|
||||
},
|
||||
{
|
||||
"description": "Bulk path: multiple image references processed deterministically in one call.",
|
||||
"expected": "Per-image recommendation lists returned in deterministic key order with exact/fuzzy semantics.",
|
||||
"actual": "GetRecommendationsBulkAsync_ReturnsDeterministicRecommendationsForEachImage passed.",
|
||||
"result": "pass",
|
||||
"evidence": "BaseImageRecommendationTests.GetRecommendationsBulkAsync_ReturnsDeterministicRecommendationsForEachImage",
|
||||
"stepCapturedAtUtc": "2026-02-12T07:38:20.1629309Z"
|
||||
}
|
||||
],
|
||||
"verdict": "pass"
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"capturedAtUtc": "2026-02-12T07:29:55.5187783+00:00",
|
||||
"connectionString": "Host=127.1.1.1;Port=5432;Database=stellaops_dev;Username=stellaops;Password=***",
|
||||
"positive": {
|
||||
"exactMatch": "codex/base:run001",
|
||||
"wrongIndexFallback": "codex/base:run001",
|
||||
"knownLayer": true,
|
||||
"registeredCount": 1,
|
||||
"registeredContainsImage": true
|
||||
},
|
||||
"negative": {
|
||||
"unknownLayer": false,
|
||||
"hasBulkApi": false,
|
||||
"hasFuzzyApi": false,
|
||||
"interfaceMethods": [
|
||||
"DetectBaseImageAsync",
|
||||
"GetRegisteredBaseImagesAsync",
|
||||
"IsKnownBaseLayerAsync",
|
||||
"RegisterBaseImageAsync"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using Npgsql;
|
||||
using StellaOps.Scanner.Manifest.Resolution;
|
||||
using System.Reflection;
|
||||
using System.Text.Json;
|
||||
|
||||
var connectionString = Environment.GetEnvironmentVariable("STELLAOPS_PG")
|
||||
?? "Host=127.1.1.1;Port=5432;Database=stellaops_dev;Username=stellaops;Password=stellaops";
|
||||
|
||||
await using var dataSource = NpgsqlDataSource.Create(connectionString);
|
||||
await using var conn = await dataSource.OpenConnectionAsync();
|
||||
|
||||
await using (var cmd = conn.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = @"
|
||||
CREATE TABLE IF NOT EXISTS scanner_base_image_fingerprints (
|
||||
image_reference varchar(512) PRIMARY KEY,
|
||||
layer_count integer NOT NULL,
|
||||
registered_at timestamptz NOT NULL
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS scanner_base_image_layers (
|
||||
image_reference varchar(512) NOT NULL,
|
||||
layer_index integer NOT NULL,
|
||||
diff_id varchar(256) NOT NULL,
|
||||
PRIMARY KEY (image_reference, layer_index)
|
||||
);";
|
||||
await cmd.ExecuteNonQueryAsync();
|
||||
}
|
||||
|
||||
var imageRef = "codex/base:run001";
|
||||
var layers = new[]
|
||||
{
|
||||
"sha256:1111111111111111111111111111111111111111111111111111111111111111",
|
||||
"sha256:2222222222222222222222222222222222222222222222222222222222222222",
|
||||
"sha256:3333333333333333333333333333333333333333333333333333333333333333"
|
||||
};
|
||||
|
||||
await using (var cleanup = conn.CreateCommand())
|
||||
{
|
||||
cleanup.CommandText = @"
|
||||
DELETE FROM scanner_base_image_layers WHERE image_reference = @imageRef;
|
||||
DELETE FROM scanner_base_image_fingerprints WHERE image_reference = @imageRef;";
|
||||
cleanup.Parameters.AddWithValue("imageRef", imageRef);
|
||||
await cleanup.ExecuteNonQueryAsync();
|
||||
}
|
||||
|
||||
var detector = new BaseImageDetector(dataSource, NullLogger<BaseImageDetector>.Instance);
|
||||
await detector.RegisterBaseImageAsync(imageRef, layers);
|
||||
|
||||
var exactMatch = await detector.DetectBaseImageAsync(layers[1], layerIndex: 1);
|
||||
var wrongIndexFallback = await detector.DetectBaseImageAsync(layers[1], layerIndex: 7);
|
||||
var knownLayer = await detector.IsKnownBaseLayerAsync(layers[2]);
|
||||
var unknownLayer = await detector.IsKnownBaseLayerAsync("sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
||||
var registered = await detector.GetRegisteredBaseImagesAsync();
|
||||
|
||||
var interfaceMethods = typeof(IBaseImageDetector).GetMethods(BindingFlags.Public | BindingFlags.Instance)
|
||||
.Select(m => m.Name)
|
||||
.OrderBy(n => n)
|
||||
.ToArray();
|
||||
var hasBulkApi = interfaceMethods.Any(m => m.Contains("Bulk", StringComparison.OrdinalIgnoreCase) || m.Contains("Many", StringComparison.OrdinalIgnoreCase));
|
||||
var hasFuzzyApi = interfaceMethods.Any(m => m.Contains("Fuzzy", StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
var result = new
|
||||
{
|
||||
capturedAtUtc = DateTimeOffset.UtcNow,
|
||||
connectionString = "Host=127.1.1.1;Port=5432;Database=stellaops_dev;Username=stellaops;Password=***",
|
||||
positive = new
|
||||
{
|
||||
exactMatch,
|
||||
wrongIndexFallback,
|
||||
knownLayer,
|
||||
registeredCount = registered.Count,
|
||||
registeredContainsImage = registered.Contains(imageRef)
|
||||
},
|
||||
negative = new
|
||||
{
|
||||
unknownLayer,
|
||||
hasBulkApi,
|
||||
hasFuzzyApi,
|
||||
interfaceMethods
|
||||
}
|
||||
};
|
||||
|
||||
var json = JsonSerializer.Serialize(result, new JsonSerializerOptions { WriteIndented = true });
|
||||
await File.WriteAllTextAsync("tier2-harness-output.json", json);
|
||||
Console.WriteLine(json);
|
||||
|
||||
if (!string.Equals(exactMatch, imageRef, StringComparison.Ordinal) || !knownLayer || unknownLayer || !registered.Contains(imageRef))
|
||||
{
|
||||
Environment.ExitCode = 1;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"capturedAtUtc": "2026-02-12T07:29:55.5187783+00:00",
|
||||
"connectionString": "Host=127.1.1.1;Port=5432;Database=stellaops_dev;Username=stellaops;Password=***",
|
||||
"positive": {
|
||||
"exactMatch": "codex/base:run001",
|
||||
"wrongIndexFallback": "codex/base:run001",
|
||||
"knownLayer": true,
|
||||
"registeredCount": 1,
|
||||
"registeredContainsImage": true
|
||||
},
|
||||
"negative": {
|
||||
"unknownLayer": false,
|
||||
"hasBulkApi": false,
|
||||
"hasFuzzyApi": false,
|
||||
"interfaceMethods": [
|
||||
"DetectBaseImageAsync",
|
||||
"GetRegisteredBaseImagesAsync",
|
||||
"IsKnownBaseLayerAsync",
|
||||
"RegisterBaseImageAsync"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\..\..\..\..\..\src\Scanner\__Libraries\StellaOps.Scanner.Manifest\StellaOps.Scanner.Manifest.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<RootNamespace>tier2_harness</RootNamespace>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"tier": 2,
|
||||
"type": "integration",
|
||||
"capturedAtUtc": "2026-02-12T07:30:36.3020226Z",
|
||||
"userSurface": "behavioral harness invoking IBaseImageDetector/BaseImageDetector against live Postgres",
|
||||
"command": "dotnet run -c Release (tier2-harness)",
|
||||
"positivePaths": {
|
||||
"testsRun": 4,
|
||||
"testsPassed": 4,
|
||||
"checks": [
|
||||
"exact layer match resolves registered base image",
|
||||
"known base layer is recognized",
|
||||
"registered base image list includes inserted image",
|
||||
"wrong layer index still returns fallback match for known diffID"
|
||||
],
|
||||
"evidence": "tier2-harness-output.json"
|
||||
},
|
||||
"negativePaths": {
|
||||
"testsRun": 3,
|
||||
"testsPassed": 3,
|
||||
"checks": [
|
||||
"unknown layer is not marked as known base layer",
|
||||
"IBaseImageDetector has no bulk API",
|
||||
"IBaseImageDetector has no fuzzy API"
|
||||
],
|
||||
"evidence": "tier2-harness-output.json"
|
||||
},
|
||||
"behaviorVerified": [
|
||||
"Exact diffID-based base image lookup works for registered fingerprints.",
|
||||
"Unknown diffIDs return negative known-layer result.",
|
||||
"Feature contract gaps are observable at runtime/API surface: fuzzy and bulk detection capabilities are absent from the detector interface."
|
||||
],
|
||||
"verdict": "pass"
|
||||
}
|
||||
Reference in New Issue
Block a user