up
Some checks failed
Concelier Attestation Tests / attestation-tests (push) Has been cancelled
Policy Simulation / policy-simulate (push) Has been cancelled
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Signals CI & Image / signals-ci (push) Has been cancelled
Signals Reachability Scoring & Events / reachability-smoke (push) Has been cancelled
Signals Reachability Scoring & Events / sign-and-upload (push) Has been cancelled
Docs CI / lint-and-preview (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled
Scanner Analyzers / Discover Analyzers (push) Has been cancelled
Scanner Analyzers / Build Analyzers (push) Has been cancelled
Scanner Analyzers / Test Language Analyzers (push) Has been cancelled
Scanner Analyzers / Validate Test Fixtures (push) Has been cancelled
Scanner Analyzers / Verify Deterministic Output (push) Has been cancelled

This commit is contained in:
StellaOps Bot
2025-12-13 09:37:15 +02:00
parent e00f6365da
commit 6e45066e37
349 changed files with 17160 additions and 1867 deletions

View File

@@ -32,10 +32,12 @@ public class CallgraphIngestionServiceTests
var parser = new StubParser("java");
var resolver = new StubParserResolver(parser);
var options = Microsoft.Extensions.Options.Options.Create(new SignalsOptions());
var reachabilityStore = new InMemoryReachabilityStoreRepository(_timeProvider);
var service = new CallgraphIngestionService(
resolver,
_artifactStore,
_repository,
reachabilityStore,
_normalizer,
options,
_timeProvider,
@@ -70,6 +72,15 @@ public class CallgraphIngestionServiceTests
stored.Metadata!["schemaVersion"].Should().Be("1.0");
stored.Metadata!["analyzer.name"].Should().Be("stub");
stored.Artifact.GraphHash.Should().Be(response.GraphHash);
var storedNodes = await reachabilityStore.GetFuncNodesByGraphAsync(response.GraphHash, CancellationToken.None);
storedNodes.Should().HaveCount(1);
storedNodes[0].SymbolId.Should().Be("com/example/Foo.bar:(I)V");
var storedEdges = await reachabilityStore.GetCallEdgesByGraphAsync(response.GraphHash, CancellationToken.None);
storedEdges.Should().HaveCount(1);
storedEdges[0].SourceId.Should().Be("com/example/Foo.bar:(I)V");
storedEdges[0].TargetId.Should().Be("com/example/Foo.bar:(I)V");
}
private sealed class StubParser : ICallgraphParser

View File

@@ -88,6 +88,79 @@ public class ReachabilityScoringServiceTests
Assert.False(string.IsNullOrWhiteSpace(fact.Metadata?["fact.digest"]));
}
[Fact]
public async Task RecomputeAsync_ComputesUncertaintyRiskScoreUsingConfiguredEntropyWeights()
{
var callgraph = new CallgraphDocument
{
Id = "cg-2",
Language = "java",
Component = "demo",
Version = "1.0.0",
Nodes = new List<CallgraphNode>
{
new("main", "Main", "method", null, null, null),
new("svc", "Svc", "method", null, null, null),
new("target", "Target", "method", null, null, null)
},
Edges = new List<CallgraphEdge>
{
new("main", "svc", "call"),
new("svc", "target", "call")
}
};
var callgraphRepository = new InMemoryCallgraphRepository(callgraph);
var factRepository = new InMemoryReachabilityFactRepository();
var options = new SignalsOptions();
options.Scoring.ReachableConfidence = 0.8;
options.Scoring.RuntimeBonus = 0.1;
options.Scoring.UncertaintyEntropyMultiplier = 1.0;
options.Scoring.UncertaintyBoostCeiling = 0.3;
var cache = new InMemoryReachabilityCache();
var eventsPublisher = new RecordingEventsPublisher();
var unknowns = new InMemoryUnknownsRepository();
unknowns.Stored.Add(new UnknownSymbolDocument
{
SubjectKey = "demo|1.0.0",
CallgraphId = callgraph.Id,
SymbolId = "sym:unknown",
Reason = "fixture",
CreatedAt = DateTimeOffset.Parse("2025-12-13T00:00:00Z")
});
var service = new ReachabilityScoringService(
callgraphRepository,
factRepository,
TimeProvider.System,
Options.Create(options),
cache,
unknowns,
eventsPublisher,
NullLogger<ReachabilityScoringService>.Instance);
var request = new ReachabilityRecomputeRequest
{
CallgraphId = callgraph.Id,
Subject = new ReachabilitySubject { Component = "demo", Version = "1.0.0" },
EntryPoints = new List<string> { "main" },
Targets = new List<string> { "target" },
RuntimeHits = new List<string> { "svc", "target" }
};
var fact = await service.RecomputeAsync(request, CancellationToken.None);
Assert.NotNull(fact.Uncertainty);
Assert.Equal("T2", fact.Uncertainty!.AggregateTier);
Assert.Contains(fact.Uncertainty.States, state => state.Code == "U1");
Assert.Equal(0.26325, fact.Score, 5); // 0.405 base score * (1 - 0.35 unknowns penalty ceiling)
Assert.Equal(0.62775, fact.RiskScore, 5); // 0.405 base score * (1 + 0.25 tier modifier + 0.3 entropy boost ceiling)
Assert.Equal(fact.RiskScore, fact.Uncertainty.RiskScore ?? 0.0, 5);
}
private sealed class InMemoryCallgraphRepository : ICallgraphRepository
{
private readonly CallgraphDocument document;