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 @@
Docker version 29.1.5, build 0e6fee6

View File

@@ -0,0 +1,8 @@
xUnit.net v3 In-Process Runner v3.2.1+a9cfb80929 (64-bit .NET 10.0.3)
StellaOps.Attestor.Infrastructure.Tests.DefaultDsseCanonicalizerTests
StellaOps.Attestor.Infrastructure.Tests.HttpRekorClientTests
StellaOps.Attestor.Infrastructure.Tests.HttpRekorTileClientTests
StellaOps.Attestor.Infrastructure.Tests.InMemoryAttestorEntryRepositoryTests
StellaOps.Attestor.Infrastructure.Tests.RekorBackendResolverTests
StellaOps.Attestor.Infrastructure.Tests.Verification.RekorVerificationJobIntegrationTests

View File

@@ -0,0 +1,10 @@
xUnit.net v3 In-Process Runner v3.2.1+a9cfb80929 (64-bit .NET 10.0.3)
StellaOps.Attestor.Tests.Rekor.RekorInclusionProofTests
StellaOps.Attestor.Tests.Rekor.RekorReceiptGenerationTests
StellaOps.Attestor.Tests.Rekor.RekorReceiptVerificationTests
StellaOps.Attestor.Types.Tests.AttestationGoldenSamplesTests
StellaOps.Attestor.Types.Tests.Determinism.AttestationDeterminismTests
StellaOps.Attestor.Types.Tests.GeneratorOutputTests
StellaOps.Attestor.Types.Tests.Integration.SbomAttestationSignVerifyIntegrationTests
StellaOps.Attestor.Types.Tests.SmartDiffSchemaValidationTests

View File

@@ -0,0 +1 @@
f35d4c4cb7e76b6dfc3d6a2d7741c040f894756358362308dd0ae753a4982fb4

View File

@@ -0,0 +1,59 @@
{
"type": "source",
"module": "devops",
"feature": "postgresql-backend-for-rekor-metadata",
"runId": "run-001",
"capturedAtUtc": "2026-02-11T12:04:57.6995553Z",
"filesChecked": [
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Rekor/RekorInclusionProof.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Rekor/EnhancedRekorProofBuilder.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Rekor/EnhancedRekorProofBuilder.Build.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Rekor/EnhancedRekorProofBuilder.Validate.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Pipeline/RekorEntry.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Verification/RekorInclusionVerificationStep.cs",
"devops/database/postgres/cluster-production.yaml",
"devops/database/postgres/cluster-staging.yaml",
"devops/database/postgres/pooler-production.yaml",
"devops/database/postgres/pooler-staging.yaml",
"devops/compose/docker-compose.stella-ops.yml"
],
"found": [
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Rekor/RekorInclusionProof.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Rekor/EnhancedRekorProofBuilder.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Rekor/EnhancedRekorProofBuilder.Build.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Rekor/EnhancedRekorProofBuilder.Validate.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Pipeline/RekorEntry.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Verification/RekorInclusionVerificationStep.cs",
"devops/database/postgres/cluster-production.yaml",
"devops/database/postgres/cluster-staging.yaml",
"devops/database/postgres/pooler-production.yaml",
"devops/database/postgres/pooler-staging.yaml",
"devops/compose/docker-compose.stella-ops.yml"
],
"missing": [
],
"declarationChecks": [
{
"pattern": "record RekorInclusionProof",
"found": true,
"sample": "src/Attestor/__Libraries/StellaOps.Attestor.ProofChain\\Rekor\\RekorInclusionProof.cs:14:public sealed record RekorInclusionProof"
},
{
"pattern": "class EnhancedRekorProofBuilder",
"found": true,
"sample": "src/Attestor/__Libraries/StellaOps.Attestor.ProofChain\\Rekor\\EnhancedRekorProofBuilder.cs:12:public sealed partial class EnhancedRekorProofBuilder\nsrc/Attestor/__Libraries/StellaOps.Attestor.ProofChain\\Rekor\\EnhancedRekorProofBuilder.Validate.cs:12:public sealed partial class EnhancedRekorProofBuilder\nsrc/Attestor/__Libraries/StellaOps.Attestor.ProofChain\\Rekor\\EnhancedRekorProofBuilder.Build.cs:12:public sealed partial class EnhancedRekorProofBuilder"
},
{
"pattern": "record RekorEntry",
"found": true,
"sample": "src/Attestor/__Libraries/StellaOps.Attestor.ProofChain\\Pipeline\\RekorEntry.cs:6:public sealed record RekorEntry"
},
{
"pattern": "class RekorInclusionVerificationStep",
"found": true,
"sample": "src/Attestor/__Libraries/StellaOps.Attestor.ProofChain\\Verification\\RekorInclusionVerificationStep.cs:14:public sealed class RekorInclusionVerificationStep : IVerificationStep"
}
],
"verdict": "pass"
}

View File

@@ -0,0 +1,28 @@
{
"type": "build",
"module": "devops",
"feature": "postgresql-backend-for-rekor-metadata",
"runId": "run-001",
"capturedAtUtc": "2026-02-11T12:04:57.6995553Z",
"project": "src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/StellaOps.Attestor.ProofChain.csproj",
"additionalProjects": [
"src/Attestor/__Libraries/StellaOps.Attestor.Persistence/StellaOps.Attestor.Persistence.csproj",
"src/Attestor/__Tests/StellaOps.Attestor.Types.Tests/StellaOps.Attestor.Types.Tests.csproj",
"src/Attestor/__Tests/StellaOps.Attestor.Infrastructure.Tests/StellaOps.Attestor.Infrastructure.Tests.csproj"
],
"buildResult": "pass",
"testResult": "pass",
"testsRun": 57,
"testsPassed": 57,
"testsFailed": 0,
"logs": [
"evidence/01-build-proofchain.txt",
"evidence/01a-build-persistence.txt",
"evidence/01b-build-types-tests.txt",
"evidence/01c-build-infra-tests.txt",
"evidence/02-test-rekor-inclusion-proof.txt",
"evidence/02a-test-rekor-receipt-generation.txt",
"evidence/02b-test-rekor-receipt-verification.txt",
"evidence/02c-test-rekor-verification-job-integration.txt"
]
}

View File

@@ -0,0 +1,28 @@
{
"type": "integration",
"module": "devops",
"feature": "postgresql-backend-for-rekor-metadata",
"runId": "run-001",
"capturedAtUtc": "2026-02-11T12:04:57.6995553Z",
"testHarness": "PostgreSQL schema apply and metadata table/index validation via dockerized postgres + focused Rekor proof tests",
"testsRun": 57,
"testsPassed": 57,
"testsFailed": 0,
"behaviorVerified": [
"Rekor inclusion proof, receipt generation, and receipt verification behaviors pass in focused Attestor test suites.",
"Rekor verification job integration behavior passes for persistence/queue flow.",
"PostgreSQL schema applies successfully and materializes required tables for proofchain.rekor_entries and attestor.rekor_submission_queue.",
"Required queue and entry indexes exist for ordered dequeue and lookup workloads."
],
"logs": [
"evidence/02-test-rekor-inclusion-proof.txt",
"evidence/02a-test-rekor-receipt-generation.txt",
"evidence/02b-test-rekor-receipt-verification.txt",
"evidence/02c-test-rekor-verification-job-integration.txt",
"evidence/03-tier2-apply-initial-schema.txt",
"evidence/03a-tier2-required-tables.txt",
"evidence/03b-tier2-queue-indexes.txt",
"evidence/03c-tier2-rekor-entry-indexes.txt"
],
"verdict": "pass"
}

View File

@@ -0,0 +1,5 @@
{
"approved": true,
"reason": "Failure stack traces and SQL inspection consistently show schema/table mismatch in Rekor-linkage methods; fix aligns table usage and ensures required columns/indexes exist.",
"revisedRootCause": "Repository Rekor-linkage SQL paths targeted excititor.vex_observations while the store creates and persists data in vex.observations, causing relation-not-found and unreachable linkage rows in persistence tests."
}

View File

@@ -0,0 +1,84 @@
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\Statements\InTotoStatementSnapshotTests.cs:168: public void VexVerdictStatement_VexVerdictId_HasCorrectFormat()
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\Statements\InTotoStatementSnapshotTests.cs:402: VexVerdictId = $"sha256:{new string('d', 64)}"
src/Excititor\__Tests\StellaOps.Excititor.Persistence.Tests\PostgresVexObservationStoreTests.cs:192: public async Task UpdateRekorLinkageAsync_RoundTripsLinkageAndLookupByUuid()
src/Excititor\__Tests\StellaOps.Excititor.Persistence.Tests\PostgresVexObservationStoreTests.cs:223: var updated = await _store.UpdateRekorLinkageAsync(
src/Excititor\__Tests\StellaOps.Excititor.Persistence.Tests\PostgresVexObservationStoreTests.cs:228: var fetched = await _store.GetByRekorUuidAsync(
src/Excititor\__Tests\StellaOps.Excititor.Persistence.Tests\PostgresVexObservationStoreTests.cs:250: public async Task UpdateRekorLinkageAsync_ReturnsFalseForUnknownObservation()
src/Excititor\__Tests\StellaOps.Excititor.Persistence.Tests\PostgresVexObservationStoreTests.cs:261: var updated = await _store.UpdateRekorLinkageAsync(
src/Excititor\__Tests\StellaOps.Excititor.Persistence.Tests\PostgresVexObservationStoreTests.cs:273: public async Task GetPendingRekorAttestationAsync_ReturnsOnlyUnlinkedObservationsOrderedByCreatedAt()
src/Excititor\__Tests\StellaOps.Excititor.Persistence.Tests\PostgresVexObservationStoreTests.cs:287: await _store.UpdateRekorLinkageAsync(_tenantId, "obs-pending-2", linkage, CancellationToken.None);
src/Excititor\__Tests\StellaOps.Excititor.Persistence.Tests\PostgresVexObservationStoreTests.cs:290: var pending = await _store.GetPendingRekorAttestationAsync(_tenantId, 10, CancellationToken.None);
src/Excititor\__Tests\StellaOps.Excititor.Persistence.Tests\PostgresVexObservationStoreTests.cs:291: var limited = await _store.GetPendingRekorAttestationAsync(_tenantId, 1, CancellationToken.None);
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\ContentAddressedIdTests.cs:125:public class VexVerdictIdTests
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\ContentAddressedIdTests.cs:132: var id = new VexVerdictId(digest);
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\ContentAddressedIdGeneratorTests.cs:115: public void ComputeVexVerdictId_SameInput_ProducesSameId()
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\ContentAddressedIdGeneratorTests.cs:119: var id1 = _generator.ComputeVexVerdictId(predicate);
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\ContentAddressedIdGeneratorTests.cs:120: var id2 = _generator.ComputeVexVerdictId(predicate);
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\ContentAddressedIdGeneratorTests.cs:127: public void ComputeVexVerdictId_DifferentStatus_ProducesDifferentId()
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\ContentAddressedIdGeneratorTests.cs:132: var id1 = _generator.ComputeVexVerdictId(predicate1);
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\ContentAddressedIdGeneratorTests.cs:133: var id2 = _generator.ComputeVexVerdictId(predicate2);
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\ContentAddressedIdGeneratorTests.cs:149: var vexVerdictId = CreateTestVexVerdictId();
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\ContentAddressedIdGeneratorTests.cs:163: var vexVerdictId = CreateTestVexVerdictId();
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\ContentAddressedIdGeneratorTests.cs:181: var vexVerdictId = CreateTestVexVerdictId();
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\ContentAddressedIdGeneratorTests.cs:199: var vexVerdictId = CreateTestVexVerdictId();
src/Attestor\__Tests\StellaOps.Attestor.ProofChain.Tests\ContentAddressedIdGeneratorTests.cs:317: private static VexVerdictId CreateTestVexVerdictId() =>
src/Excititor\__Libraries\StellaOps.Excititor.Persistence\Postgres\Repositories\PostgresVexObservationStore.cs:707: public async ValueTask<bool> UpdateRekorLinkageAsync(
src/Excititor\__Libraries\StellaOps.Excititor.Persistence\Postgres\Repositories\PostgresVexObservationStore.cs:760: public async ValueTask<IReadOnlyList<VexObservation>> GetPendingRekorAttestationAsync(
src/Excititor\__Libraries\StellaOps.Excititor.Persistence\Postgres\Repositories\PostgresVexObservationStore.cs:800: public async ValueTask<VexObservation?> GetByRekorUuidAsync(
src/Attestor\StellaOps.Attestor\StellaOps.Attestor.WebService\Contracts\Proofs\ProofDtos.cs:33: public required string VexVerdictId { get; init; }
src/Attestor\StellaOps.Attestor\StellaOps.Attestor.Tests\Api\ProofsApiContractTests.cs:42: VexVerdictId = $"sha256:{new string('c', 64)}",
src/Attestor\StellaOps.Attestor\StellaOps.Attestor.Tests\Api\ProofsApiContractTests.cs:71: VexVerdictId = "sha256:789xyz",
src/Attestor\StellaOps.Attestor\StellaOps.Attestor.Tests\Api\ProofsApiContractTests.cs:117: VexVerdictId = $"sha256:{new string('c', 64)}",
src/Attestor\StellaOps.Attestor\StellaOps.Attestor.Tests\Api\ProofsApiContractTests.cs:149: VexVerdictId = $"sha256:{new string('c', 64)}",
src/Attestor\StellaOps.Attestor\StellaOps.Attestor.Tests\Api\ProofsApiContractTests.cs:265: VexVerdictId = $"sha256:{new string('c', 64)}",
src/Excititor\__Libraries\StellaOps.Excititor.Core\Storage\InMemoryVexStores.cs:713: public ValueTask<bool> UpdateRekorLinkageAsync(
src/Excititor\__Libraries\StellaOps.Excititor.Core\Storage\InMemoryVexStores.cs:743: public ValueTask<IReadOnlyList<VexObservation>> GetPendingRekorAttestationAsync(
src/Excititor\__Libraries\StellaOps.Excititor.Core\Storage\InMemoryVexStores.cs:766: public ValueTask<VexObservation?> GetByRekorUuidAsync(
src/Attestor\StellaOps.Attestor\StellaOps.Attestor.Core.Tests\Delta\DeltaAttestationServiceTests.cs:40: Summary = new VexDeltaSummary
src/Excititor\__Libraries\StellaOps.Excititor.Core\Observations\IVexObservationStore.cs:82: ValueTask<bool> UpdateRekorLinkageAsync(
src/Excititor\__Libraries\StellaOps.Excititor.Core\Observations\IVexObservationStore.cs:95: ValueTask<IReadOnlyList<VexObservation>> GetPendingRekorAttestationAsync(
src/Excititor\__Libraries\StellaOps.Excititor.Core\Observations\IVexObservationStore.cs:107: ValueTask<VexObservation?> GetByRekorUuidAsync(
src/Excititor\__Libraries\StellaOps.Excititor.Core\Observations\VexDeltaModels.cs:366:public sealed record VexDeltaSummary
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Statements\VexVerdictStatement.cs:68: public required string VexVerdictId { get; init; }
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Statements\ProofSpineStatement.cs:50: public required string VexVerdictId { get; init; }
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Statements\VerdictOutputs.cs:26: public required string VexVerdictId { get; init; }
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Assembly\ProofSpineRequest.cs:30: public required VexVerdictId VexVerdictId { get; init; }
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexProofIntegrator.cs:11:public sealed partial class VexProofIntegrator
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexProofIntegrator.cs:25: var payload = new VexVerdictProofPayload
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexProofIntegrator.cs:33: VexVerdictId = "", // Will be computed
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexProofIntegrator.cs:41: payload = payload with { VexVerdictId = vexId };
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexProofIntegrator.Metadata.cs:8:/// Extended metadata generation methods for VexProofIntegrator.
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexProofIntegrator.Metadata.cs:10:public sealed partial class VexProofIntegrator
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexProofIntegrator.Metadata.cs:16: public static (VexVerdictStatement Statement, VexVerdictProofPayload ProofPayload) GenerateWithProofMetadata(
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexProofIntegrator.Metadata.cs:25: var proofPayload = new VexVerdictProofPayload
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexProofIntegrator.Metadata.cs:33: VexVerdictId = "", // Will be computed
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexProofIntegrator.Metadata.cs:41: proofPayload = proofPayload with { VexVerdictId = vexId };
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexVerdictProofPayload.cs:8:public sealed record VexVerdictProofPayload
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexVerdictProofPayload.cs:29: public required string VexVerdictId { get; init; }
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexProofIntegrator.Helpers.cs:8:/// Helper methods for VexProofIntegrator.
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexProofIntegrator.Helpers.cs:10:public sealed partial class VexProofIntegrator
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexProofIntegrator.Helpers.cs:76: private static VexVerdictPayload ConvertToStandardPayload(VexVerdictProofPayload proofPayload)
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Generators\VexProofIntegrator.Helpers.cs:86: VexVerdictId = proofPayload.VexVerdictId
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Identifiers\ContentAddressedIdGenerator.cs:43: public VexVerdictId ComputeVexVerdictId(VexPredicate predicate)
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Identifiers\ContentAddressedIdGenerator.cs:46: var canonical = CanonicalizeVersioned(predicate with { VexVerdictId = null });
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Identifiers\ContentAddressedIdGenerator.cs:47: return new VexVerdictId(HashSha256Hex(canonical));
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Identifiers\ContentAddressedIdGenerator.cs:54: VexVerdictId vexVerdictId)
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Identifiers\IContentAddressedIdGenerator.cs:13: VexVerdictId ComputeVexVerdictId(VexPredicate predicate);
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Identifiers\IContentAddressedIdGenerator.cs:19: VexVerdictId vexVerdictId);
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Identifiers\VexVerdictId.cs:3:public sealed record VexVerdictId(string Digest) : ContentAddressedId("sha256", Digest)
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Identifiers\VexVerdictId.cs:7: public new static VexVerdictId Parse(string value) => new(Sha256IdParser.Parse(value, "VEXVerdictID"));
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\ProofSpinePredicate.cs:18: public required string VexVerdictId { get; init; }
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\VexDeltaStatement.cs:2:// VexDeltaStatement.cs
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\VexDeltaStatement.cs:13:public sealed record VexDeltaStatement
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\VexAttestationPredicate.cs:56: public VexMergeTrace? MergeTrace { get; init; }
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\VexDeltaPredicate.cs:46: public ImmutableArray<VexDeltaStatement> Added { get; init; } = [];
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\VexDeltaPredicate.cs:52: public ImmutableArray<VexDeltaStatement> Removed { get; init; } = [];
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\VexDeltaPredicate.cs:58: public ImmutableArray<VexDeltaChange> Changed { get; init; } = [];
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\VexDeltaPredicate.cs:64: public required VexDeltaSummary Summary { get; init; }
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\VexMergeTrace.cs:2:// VexMergeTrace.cs
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\VexMergeTrace.cs:13:public sealed record VexMergeTrace
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\VexPredicate.cs:26: public string? VexVerdictId { get; init; }
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\VexDeltaSummary.cs:2:// VexDeltaSummary.cs
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\VexDeltaSummary.cs:13:public sealed record VexDeltaSummary
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\VexDeltaChange.cs:2:// VexDeltaChange.cs
src/Attestor\__Libraries\StellaOps.Attestor.ProofChain\Predicates\VexDeltaChange.cs:13:public sealed record VexDeltaChange

View File

@@ -0,0 +1 @@
87fe0bf8f98a270f3a165c5135376873633672f840f5f6579273dabab3f048ba

View File

@@ -0,0 +1 @@
/var/run/postgresql:5432 - accepting connections

View File

@@ -0,0 +1,8 @@
CREATE SCHEMA
CREATE SCHEMA
CREATE SCHEMA
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
INSERT 0 2

View File

@@ -0,0 +1,42 @@
SET
ALTER TABLE
CREATE INDEX
CREATE INDEX
CREATE INDEX
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
ALTER TABLE
CREATE INDEX
COMMENT
COMMENT
ALTER TABLE
CREATE INDEX
CREATE INDEX
COMMENT
COMMENT
COMMENT
COMMENT
ALTER TABLE
CREATE INDEX
CREATE INDEX
COMMENT
COMMENT
COMMENT
CREATE TABLE
CREATE INDEX
CREATE INDEX
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT

View File

@@ -0,0 +1,20 @@
 table_schema | table_name | column_name
--------------+-----------------------------+-----------------------
excititor | vex_observations | rekor_entry_body_hash
excititor | vex_observations | rekor_entry_kind
excititor | vex_observations | rekor_inclusion_proof
excititor | vex_observations | rekor_integrated_time
excititor | vex_observations | rekor_linked_at
excititor | vex_observations | rekor_log_index
excititor | vex_observations | rekor_log_url
excititor | vex_observations | rekor_tree_root
excititor | vex_observations | rekor_tree_size
excititor | vex_observations | rekor_uuid
excititor | vex_statement_change_events | rekor_entry_id
excititor | vex_statement_change_events | rekor_log_index
vexhub | vex_statements | rekor_inclusion_proof
vexhub | vex_statements | rekor_integrated_time
vexhub | vex_statements | rekor_log_index
vexhub | vex_statements | rekor_uuid
(16 rows)

View File

@@ -0,0 +1,10 @@
 schemaname | tablename | indexname
------------+-----------------------------+---------------------------------------
excititor | vex_observations | idx_vex_observations_pending_rekor
excititor | vex_observations | idx_vex_observations_rekor_log_index
excititor | vex_observations | idx_vex_observations_rekor_uuid
excititor | vex_statement_change_events | idx_vex_change_events_rekor
vexhub | vex_statements | idx_vexhub_statements_rekor_log_index
vexhub | vex_statements | idx_vexhub_statements_rekor_uuid
(6 rows)

View File

@@ -0,0 +1,11 @@
UPDATE 1
observation_id | rekor_uuid | rekor_log_index
----------------+-----------------+-----------------
obs-linked | uuid-obs-linked | 7001
(1 row)
observation_id | rekor_uuid
----------------+------------
obs-pending |
(1 row)

View File

@@ -0,0 +1,42 @@
SET
ALTER TABLE
CREATE INDEX
CREATE INDEX
CREATE INDEX
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
ALTER TABLE
CREATE INDEX
COMMENT
COMMENT
ALTER TABLE
CREATE INDEX
CREATE INDEX
COMMENT
COMMENT
COMMENT
COMMENT
ALTER TABLE
CREATE INDEX
CREATE INDEX
COMMENT
COMMENT
COMMENT
CREATE TABLE
CREATE INDEX
CREATE INDEX
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT

View File

@@ -0,0 +1,5 @@
 observation_id | rekor_uuid | rekor_log_index | rekor_log_url
----------------+-----------------+-----------------+--------------------------
obs-linked | uuid-obs-linked | 7001 | https://rekor.local.test
(1 row)

View File

@@ -0,0 +1 @@
stella-vex-rekor-tier2-run001

View File

@@ -0,0 +1,12 @@
{
"filesModified": [
"src/Excititor/__Libraries/StellaOps.Excititor.Persistence/Postgres/Repositories/PostgresVexObservationStore.cs",
"src/Excititor/__Tests/StellaOps.Excititor.Persistence.Tests/PostgresVexObservationStoreTests.cs"
],
"testsAdded": [
"PostgresVexObservationStoreTests.UpdateRekorLinkageAsync_RoundTripsLinkageAndLookupByUuid",
"PostgresVexObservationStoreTests.UpdateRekorLinkageAsync_ReturnsFalseForUnknownObservation",
"PostgresVexObservationStoreTests.GetPendingRekorAttestationAsync_ReturnsOnlyUnlinkedObservationsOrderedByCreatedAt"
],
"description": "Added missing behavioral coverage for Rekor linkage repository methods and fixed Postgres store schema consistency by using vex.observations with ensured Rekor columns/indexes."
}

View File

@@ -0,0 +1,13 @@
{
"previousFailures": [
"PostgresVexObservationStoreTests.UpdateRekorLinkageAsync_RoundTripsLinkageAndLookupByUuid",
"PostgresVexObservationStoreTests.UpdateRekorLinkageAsync_ReturnsFalseForUnknownObservation",
"PostgresVexObservationStoreTests.GetPendingRekorAttestationAsync_ReturnsOnlyUnlinkedObservationsOrderedByCreatedAt"
],
"retestResults": [
"dotnet build StellaOps.Excititor.Persistence.csproj: pass",
"dotnet test StellaOps.Excititor.Persistence.Tests.csproj: pass (54/54)",
"dotnet test StellaOps.Excititor.Attestation.Tests.csproj: pass (17/17)"
],
"verdict": "pass"
}

View File

@@ -0,0 +1,85 @@
{
"type": "source",
"module": "devops",
"feature": "vex-rekor-linkage",
"runId": "run-001",
"capturedAtUtc": "2026-02-11T12:24:12.2576938Z",
"filesChecked": [
"devops/database/migrations/V20260117__vex_rekor_linkage.sql",
"src/Excititor/__Libraries/StellaOps.Excititor.Persistence/Postgres/Repositories/PostgresVexObservationStore.cs",
"src/Excititor/__Libraries/StellaOps.Excititor.Core/Observations/IVexObservationStore.cs",
"src/Excititor/__Tests/StellaOps.Excititor.Persistence.Tests/PostgresVexObservationStoreTests.cs",
"src/Excititor/__Tests/StellaOps.Excititor.Attestation.Tests/VexRekorAttestationFlowTests.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Generators/VexProofIntegrator.Helpers.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Generators/VexProofIntegrator.Metadata.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Generators/VexVerdictProofPayload.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Identifiers/VexVerdictId.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Predicates/VexDeltaChange.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Predicates/VexDeltaStatement.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Predicates/VexDeltaSummary.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Predicates/VexMergeTrace.cs",
"devops/compose/docker-compose.stella-ops.yml"
],
"found": [
"devops/database/migrations/V20260117__vex_rekor_linkage.sql",
"src/Excititor/__Libraries/StellaOps.Excititor.Persistence/Postgres/Repositories/PostgresVexObservationStore.cs",
"src/Excititor/__Libraries/StellaOps.Excititor.Core/Observations/IVexObservationStore.cs",
"src/Excititor/__Tests/StellaOps.Excititor.Persistence.Tests/PostgresVexObservationStoreTests.cs",
"src/Excititor/__Tests/StellaOps.Excititor.Attestation.Tests/VexRekorAttestationFlowTests.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Generators/VexProofIntegrator.Helpers.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Generators/VexProofIntegrator.Metadata.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Generators/VexVerdictProofPayload.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Identifiers/VexVerdictId.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Predicates/VexDeltaChange.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Predicates/VexDeltaStatement.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Predicates/VexDeltaSummary.cs",
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/Predicates/VexMergeTrace.cs",
"devops/compose/docker-compose.stella-ops.yml"
],
"missing": [
],
"declarationChecks": [
{
"pattern": "class PostgresVexObservationStore",
"found": true,
"sample": "16:public sealed class PostgresVexObservationStore : RepositoryBase\u003cExcititorDataSource\u003e, IVexObservationStore"
},
{
"pattern": "UpdateRekorLinkageAsync",
"found": true,
"sample": "731: public async ValueTask\u003cbool\u003e UpdateRekorLinkageAsync("
},
{
"pattern": "GetPendingRekorAttestationAsync",
"found": true,
"sample": "784: public async ValueTask\u003cIReadOnlyList\u003cVexObservation\u003e\u003e GetPendingRekorAttestationAsync("
},
{
"pattern": "GetByRekorUuidAsync",
"found": true,
"sample": "824: public async ValueTask\u003cVexObservation?\u003e GetByRekorUuidAsync("
},
{
"pattern": "UpdateRekorLinkageAsync_RoundTripsLinkageAndLookupByUuid",
"found": true,
"sample": "192: public async Task UpdateRekorLinkageAsync_RoundTripsLinkageAndLookupByUuid()"
},
{
"pattern": "GetPendingRekorAttestationAsync_ReturnsOnlyUnlinkedObservationsOrderedByCreatedAt",
"found": true,
"sample": "273: public async Task GetPendingRekorAttestationAsync_ReturnsOnlyUnlinkedObservationsOrderedByCreatedAt()"
},
{
"pattern": "record VexVerdictProofPayload",
"found": true,
"sample": "8:public sealed record VexVerdictProofPayload"
},
{
"pattern": "record VexVerdictId",
"found": true,
"sample": "3:public sealed record VexVerdictId(string Digest) : ContentAddressedId(\"sha256\", Digest)"
}
],
"verdict": "pass"
}

View File

@@ -0,0 +1,31 @@
{
"type": "build",
"module": "devops",
"feature": "vex-rekor-linkage",
"runId": "run-001",
"capturedAtUtc": "2026-02-11T12:21:56.6069262Z",
"project": "src/Excititor/__Libraries/StellaOps.Excititor.Persistence/StellaOps.Excititor.Persistence.csproj",
"additionalProjects": [
"src/Attestor/__Libraries/StellaOps.Attestor.ProofChain/StellaOps.Attestor.ProofChain.csproj",
"src/Excititor/__Tests/StellaOps.Excititor.Persistence.Tests/StellaOps.Excititor.Persistence.Tests.csproj",
"src/Excititor/__Tests/StellaOps.Excititor.Attestation.Tests/StellaOps.Excititor.Attestation.Tests.csproj"
],
"buildResult": "pass",
"testResult": "pass",
"testsRun": 71,
"testsPassed": 71,
"testsFailed": 0,
"retestPerformed": true,
"errors": [
],
"logs": [
"evidence/01-build-attestor-proofchain.txt",
"evidence/01a-build-excititor-persistence.txt",
"evidence/01b-build-excititor-persistence-tests.txt",
"evidence/02-test-postgres-vex-observation-store.txt",
"evidence/02a-test-vex-rekor-attestation-flow.txt",
"evidence/01c-build-excititor-persistence-retest.txt",
"evidence/02b-test-excititor-persistence-fullsuite-retest.txt"
]
}

View File

@@ -0,0 +1,30 @@
{
"type": "integration",
"module": "devops",
"feature": "vex-rekor-linkage",
"runId": "run-001",
"capturedAtUtc": "2026-02-11T12:21:56.6069262Z",
"testHarness": "Excititor persistence behavioral tests plus dockerized PostgreSQL migration replay and SQL linkage queries.",
"testsRun": 71,
"testsPassed": 71,
"testsFailed": 0,
"behaviorVerified": [
"Rekor linkage repository methods update/read/pending-path behavior passes in Postgres-backed persistence tests, including positive and negative cases.",
"VEX-Rekor attestation flow tests pass for success and no-linkage scenarios.",
"Migration V20260117 adds required Rekor linkage columns and indexes on excititor.vex_observations, excititor.vex_statement_change_events, and vexhub.vex_statements.",
"Linked observation lookup and pending (unlinked) observation query behavior works via direct SQL interactions.",
"Reapplying migration preserves existing linkage fields for previously linked observations (idempotent migration behavior)."
],
"logs": [
"evidence/02b-test-excititor-persistence-fullsuite-retest.txt",
"evidence/02a-test-vex-rekor-attestation-flow.txt",
"evidence/03b-tier2-setup-baseline-schema.txt",
"evidence/03c-tier2-apply-vex-rekor-migration.txt",
"evidence/03d-tier2-migration-columns.txt",
"evidence/03e-tier2-migration-indexes.txt",
"evidence/03f-tier2-positive-negative-linkage-queries.txt",
"evidence/03g-tier2-reapply-migration.txt",
"evidence/03h-tier2-preserved-linkage-after-rerun.txt"
],
"verdict": "pass"
}

View File

@@ -0,0 +1,9 @@
{
"rootCause": "Repository Rekor-linkage SQL paths targeted excititor.vex_observations while the store creates and persists data in vex.observations, causing relation-not-found and unreachable linkage rows in persistence tests.",
"category": "bug",
"affectedFiles": [
"src/Excititor/__Libraries/StellaOps.Excititor.Persistence/Postgres/Repositories/PostgresVexObservationStore.cs",
"src/Excititor/__Tests/StellaOps.Excititor.Persistence.Tests/PostgresVexObservationStoreTests.cs"
],
"confidence": 0.99
}