wip: doctor/cli/docs/api to vector db consolidation; api hardening for descriptions, tenant, and scopes; migrations and conversions of all DALs to EF v10

This commit is contained in:
master
2026-02-23 15:30:50 +02:00
parent bd8fee6ed8
commit e746577380
1424 changed files with 81225 additions and 25251 deletions

View File

@@ -17,15 +17,24 @@ Provide foundational data models, storage, and validation for Golden Set definit
4. **Air-Gap Ready**: Validation supports offline mode without external lookups
5. **Human-Readable**: YAML as primary format for git-friendliness
## DAL Technology
- **Primary**: EF Core v10 DbContext (`EfCore/Context/GoldenSetDbContext.cs`) with 3 entities (definitions, targets, audit_log) in `golden_sets` schema.
- **Compiled model**: `EfCore/CompiledModels/GoldenSetDbContextModel` generated for runtime performance.
- **Legacy**: `PostgresGoldenSetStore` still uses NpgsqlDataSource directly (deferred from EF Core conversion). Mixed DAL acceptable per cutover strategy.
- **SQL migrations remain authoritative**: EF models are scaffolded FROM the SQL schema, never the reverse.
## Dependencies
- `BinaryIndex.Contracts` - Shared contracts and DTOs
- `Npgsql` - PostgreSQL driver
- `Npgsql.EntityFrameworkCore.PostgreSQL` - EF Core Npgsql provider
- `Microsoft.EntityFrameworkCore` - EF Core v10
- `YamlDotNet` - YAML serialization
- `Microsoft.Extensions.*` - DI, Options, Logging, Caching
## Required Reading
- `docs/modules/binary-index/golden-set-schema.md`
- `docs-archived/implplan/SPRINT_20260110_012_001_BINDEX_golden_set_foundation.md`
- `docs/db/EF_CORE_MODEL_GENERATION_STANDARDS.md`
## Test Strategy
- Unit tests in `StellaOps.BinaryIndex.GoldenSet.Tests`

View File

@@ -0,0 +1,136 @@
// <auto-generated />
using System;
using System.Reflection;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using StellaOps.BinaryIndex.GoldenSet.EfCore.Models;
#pragma warning disable 219, 612, 618
#nullable disable
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.CompiledModels
{
[EntityFrameworkInternal]
public partial class GoldenSetAuditLogEntityType
{
public static RuntimeEntityType Create(RuntimeModel model, RuntimeEntityType baseEntityType = null)
{
var runtimeEntityType = model.AddEntityType(
"StellaOps.BinaryIndex.GoldenSet.EfCore.Models.GoldenSetAuditLogEntity",
typeof(GoldenSetAuditLogEntity),
baseEntityType,
propertyCount: 8,
namedIndexCount: 2,
keyCount: 1);
var id = runtimeEntityType.AddProperty(
"Id",
typeof(Guid),
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("Id", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<Id>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
valueGenerated: ValueGenerated.OnAdd,
sentinel: Guid.Empty);
id.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
id.AddAnnotation("Relational:ColumnName", "id");
id.AddAnnotation("Relational:DefaultValueSql", "gen_random_uuid()");
var goldenSetId = runtimeEntityType.AddProperty(
"GoldenSetId",
typeof(string),
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("GoldenSetId", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<GoldenSetId>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
goldenSetId.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
goldenSetId.AddAnnotation("Relational:ColumnName", "golden_set_id");
var action = runtimeEntityType.AddProperty(
"Action",
typeof(string),
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("Action", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<Action>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
action.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
action.AddAnnotation("Relational:ColumnName", "action");
var actorId = runtimeEntityType.AddProperty(
"ActorId",
typeof(string),
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("ActorId", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<ActorId>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
actorId.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
actorId.AddAnnotation("Relational:ColumnName", "actor_id");
var oldStatus = runtimeEntityType.AddProperty(
"OldStatus",
typeof(string),
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("OldStatus", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<OldStatus>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
nullable: true);
oldStatus.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
oldStatus.AddAnnotation("Relational:ColumnName", "old_status");
var newStatus = runtimeEntityType.AddProperty(
"NewStatus",
typeof(string),
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("NewStatus", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<NewStatus>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
nullable: true);
newStatus.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
newStatus.AddAnnotation("Relational:ColumnName", "new_status");
var details = runtimeEntityType.AddProperty(
"Details",
typeof(string),
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("Details", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<Details>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
nullable: true);
details.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
details.AddAnnotation("Relational:ColumnName", "details");
details.AddAnnotation("Relational:ColumnType", "jsonb");
var timestamp = runtimeEntityType.AddProperty(
"Timestamp",
typeof(DateTime),
propertyInfo: typeof(GoldenSetAuditLogEntity).GetProperty("Timestamp", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetAuditLogEntity).GetField("<Timestamp>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
valueGenerated: ValueGenerated.OnAdd,
sentinel: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
timestamp.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
timestamp.AddAnnotation("Relational:ColumnName", "timestamp");
timestamp.AddAnnotation("Relational:DefaultValueSql", "NOW()");
var key = runtimeEntityType.AddKey(
new[] { id });
runtimeEntityType.SetPrimaryKey(key);
key.AddAnnotation("Relational:Name", "audit_log_pkey");
var idx_audit_golden_set = runtimeEntityType.AddIndex(
new[] { goldenSetId },
name: "idx_audit_golden_set");
var idx_audit_timestamp = runtimeEntityType.AddIndex(
new[] { timestamp },
name: "idx_audit_timestamp");
idx_audit_timestamp.AddAnnotation("Relational:IsDescending", new[] { true });
var idx_audit_actor = runtimeEntityType.AddIndex(
new[] { actorId },
name: "idx_audit_actor");
return runtimeEntityType;
}
public static void CreateAnnotations(RuntimeEntityType runtimeEntityType)
{
runtimeEntityType.AddAnnotation("Relational:FunctionName", null);
runtimeEntityType.AddAnnotation("Relational:Schema", "golden_sets");
runtimeEntityType.AddAnnotation("Relational:SqlQuery", null);
runtimeEntityType.AddAnnotation("Relational:TableName", "audit_log");
runtimeEntityType.AddAnnotation("Relational:ViewName", null);
runtimeEntityType.AddAnnotation("Relational:ViewSchema", null);
Customize(runtimeEntityType);
}
static partial void Customize(RuntimeEntityType runtimeEntityType);
}
}

View File

@@ -0,0 +1,9 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore.Infrastructure;
using StellaOps.BinaryIndex.GoldenSet.EfCore.CompiledModels;
using StellaOps.BinaryIndex.GoldenSet.EfCore.Context;
#pragma warning disable 219, 612, 618
#nullable disable
[assembly: DbContextModel(typeof(GoldenSetDbContext), typeof(GoldenSetDbContextModel))]

View File

@@ -0,0 +1,48 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using StellaOps.BinaryIndex.GoldenSet.EfCore.Context;
#pragma warning disable 219, 612, 618
#nullable disable
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.CompiledModels
{
[DbContext(typeof(GoldenSetDbContext))]
public partial class GoldenSetDbContextModel : RuntimeModel
{
private static readonly bool _useOldBehavior31751 =
System.AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue31751", out var enabled31751) && enabled31751;
static GoldenSetDbContextModel()
{
var model = new GoldenSetDbContextModel();
if (_useOldBehavior31751)
{
model.Initialize();
}
else
{
var thread = new System.Threading.Thread(RunInitialization, 10 * 1024 * 1024);
thread.Start();
thread.Join();
void RunInitialization()
{
model.Initialize();
}
}
model.Customize();
_instance = (GoldenSetDbContextModel)model.FinalizeModel();
}
private static GoldenSetDbContextModel _instance;
public static IModel Instance => _instance;
partial void Initialize();
partial void Customize();
}
}

View File

@@ -0,0 +1,34 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#pragma warning disable 219, 612, 618
#nullable disable
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.CompiledModels
{
public partial class GoldenSetDbContextModel
{
private GoldenSetDbContextModel()
: base(skipDetectChanges: false, modelId: new Guid("b25d0a3e-8c4f-4e9b-a6d2-e7f1c3b82945"), entityTypeCount: 3)
{
}
partial void Initialize()
{
var definition = GoldenSetDefinitionEntityType.Create(this);
var target = GoldenSetTargetEntityType.Create(this);
var auditLog = GoldenSetAuditLogEntityType.Create(this);
GoldenSetDefinitionEntityType.CreateAnnotations(definition);
GoldenSetTargetEntityType.CreateAnnotations(target);
GoldenSetAuditLogEntityType.CreateAnnotations(auditLog);
AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
AddAnnotation("ProductVersion", "10.0.0");
AddAnnotation("Relational:MaxIdentifierLength", 63);
}
}
}

View File

@@ -0,0 +1,202 @@
// <auto-generated />
using System;
using System.Reflection;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using StellaOps.BinaryIndex.GoldenSet.EfCore.Models;
#pragma warning disable 219, 612, 618
#nullable disable
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.CompiledModels
{
[EntityFrameworkInternal]
public partial class GoldenSetDefinitionEntityType
{
public static RuntimeEntityType Create(RuntimeModel model, RuntimeEntityType baseEntityType = null)
{
var runtimeEntityType = model.AddEntityType(
"StellaOps.BinaryIndex.GoldenSet.EfCore.Models.GoldenSetDefinitionEntity",
typeof(GoldenSetDefinitionEntity),
baseEntityType,
propertyCount: 15,
namedIndexCount: 4,
keyCount: 1);
var id = runtimeEntityType.AddProperty(
"Id",
typeof(string),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("Id", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<Id>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
afterSaveBehavior: PropertySaveBehavior.Throw);
id.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
id.AddAnnotation("Relational:ColumnName", "id");
var component = runtimeEntityType.AddProperty(
"Component",
typeof(string),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("Component", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<Component>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
component.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
component.AddAnnotation("Relational:ColumnName", "component");
var contentDigest = runtimeEntityType.AddProperty(
"ContentDigest",
typeof(string),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("ContentDigest", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<ContentDigest>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
contentDigest.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
contentDigest.AddAnnotation("Relational:ColumnName", "content_digest");
var status = runtimeEntityType.AddProperty(
"Status",
typeof(string),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("Status", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<Status>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
status.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
status.AddAnnotation("Relational:ColumnName", "status");
var definitionYaml = runtimeEntityType.AddProperty(
"DefinitionYaml",
typeof(string),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("DefinitionYaml", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<DefinitionYaml>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
definitionYaml.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
definitionYaml.AddAnnotation("Relational:ColumnName", "definition_yaml");
var definitionJson = runtimeEntityType.AddProperty(
"DefinitionJson",
typeof(string),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("DefinitionJson", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<DefinitionJson>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
definitionJson.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
definitionJson.AddAnnotation("Relational:ColumnName", "definition_json");
definitionJson.AddAnnotation("Relational:ColumnType", "jsonb");
var targetCount = runtimeEntityType.AddProperty(
"TargetCount",
typeof(int),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("TargetCount", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<TargetCount>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
sentinel: 0);
targetCount.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
targetCount.AddAnnotation("Relational:ColumnName", "target_count");
var authorId = runtimeEntityType.AddProperty(
"AuthorId",
typeof(string),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("AuthorId", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<AuthorId>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
authorId.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
authorId.AddAnnotation("Relational:ColumnName", "author_id");
var createdAt = runtimeEntityType.AddProperty(
"CreatedAt",
typeof(DateTime),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("CreatedAt", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<CreatedAt>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
valueGenerated: ValueGenerated.OnAdd,
sentinel: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
createdAt.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
createdAt.AddAnnotation("Relational:ColumnName", "created_at");
createdAt.AddAnnotation("Relational:DefaultValueSql", "NOW()");
var reviewedBy = runtimeEntityType.AddProperty(
"ReviewedBy",
typeof(string),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("ReviewedBy", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<ReviewedBy>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
nullable: true);
reviewedBy.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
reviewedBy.AddAnnotation("Relational:ColumnName", "reviewed_by");
var reviewedAt = runtimeEntityType.AddProperty(
"ReviewedAt",
typeof(DateTime?),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("ReviewedAt", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<ReviewedAt>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
nullable: true);
reviewedAt.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
reviewedAt.AddAnnotation("Relational:ColumnName", "reviewed_at");
var sourceRef = runtimeEntityType.AddProperty(
"SourceRef",
typeof(string),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("SourceRef", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<SourceRef>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
sourceRef.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
sourceRef.AddAnnotation("Relational:ColumnName", "source_ref");
var tags = runtimeEntityType.AddProperty(
"Tags",
typeof(string[]),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("Tags", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<Tags>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
tags.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
tags.AddAnnotation("Relational:ColumnName", "tags");
var schemaVersion = runtimeEntityType.AddProperty(
"SchemaVersion",
typeof(string),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("SchemaVersion", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<SchemaVersion>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
schemaVersion.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
schemaVersion.AddAnnotation("Relational:ColumnName", "schema_version");
var updatedAt = runtimeEntityType.AddProperty(
"UpdatedAt",
typeof(DateTime),
propertyInfo: typeof(GoldenSetDefinitionEntity).GetProperty("UpdatedAt", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetDefinitionEntity).GetField("<UpdatedAt>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
valueGenerated: ValueGenerated.OnAdd,
sentinel: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
updatedAt.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
updatedAt.AddAnnotation("Relational:ColumnName", "updated_at");
updatedAt.AddAnnotation("Relational:DefaultValueSql", "NOW()");
var key = runtimeEntityType.AddKey(
new[] { id });
runtimeEntityType.SetPrimaryKey(key);
key.AddAnnotation("Relational:Name", "definitions_pkey");
var idx_goldensets_component = runtimeEntityType.AddIndex(
new[] { component },
name: "idx_goldensets_component");
var idx_goldensets_status = runtimeEntityType.AddIndex(
new[] { status },
name: "idx_goldensets_status");
var idx_goldensets_digest = runtimeEntityType.AddIndex(
new[] { contentDigest },
name: "idx_goldensets_digest",
unique: true);
var idx_goldensets_created = runtimeEntityType.AddIndex(
new[] { createdAt },
name: "idx_goldensets_created");
idx_goldensets_created.AddAnnotation("Relational:IsDescending", new[] { true });
var idx_goldensets_component_status = runtimeEntityType.AddIndex(
new[] { component, status },
name: "idx_goldensets_component_status");
return runtimeEntityType;
}
public static void CreateAnnotations(RuntimeEntityType runtimeEntityType)
{
runtimeEntityType.AddAnnotation("Relational:FunctionName", null);
runtimeEntityType.AddAnnotation("Relational:Schema", "golden_sets");
runtimeEntityType.AddAnnotation("Relational:SqlQuery", null);
runtimeEntityType.AddAnnotation("Relational:TableName", "definitions");
runtimeEntityType.AddAnnotation("Relational:ViewName", null);
runtimeEntityType.AddAnnotation("Relational:ViewSchema", null);
Customize(runtimeEntityType);
}
static partial void Customize(RuntimeEntityType runtimeEntityType);
}
}

View File

@@ -0,0 +1,138 @@
// <auto-generated />
using System;
using System.Reflection;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using StellaOps.BinaryIndex.GoldenSet.EfCore.Models;
#pragma warning disable 219, 612, 618
#nullable disable
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.CompiledModels
{
[EntityFrameworkInternal]
public partial class GoldenSetTargetEntityType
{
public static RuntimeEntityType Create(RuntimeModel model, RuntimeEntityType baseEntityType = null)
{
var runtimeEntityType = model.AddEntityType(
"StellaOps.BinaryIndex.GoldenSet.EfCore.Models.GoldenSetTargetEntity",
typeof(GoldenSetTargetEntity),
baseEntityType,
propertyCount: 9,
namedIndexCount: 1,
keyCount: 1);
var id = runtimeEntityType.AddProperty(
"Id",
typeof(Guid),
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("Id", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<Id>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
valueGenerated: ValueGenerated.OnAdd,
sentinel: Guid.Empty);
id.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
id.AddAnnotation("Relational:ColumnName", "id");
id.AddAnnotation("Relational:DefaultValueSql", "gen_random_uuid()");
var goldenSetId = runtimeEntityType.AddProperty(
"GoldenSetId",
typeof(string),
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("GoldenSetId", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<GoldenSetId>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
goldenSetId.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
goldenSetId.AddAnnotation("Relational:ColumnName", "golden_set_id");
var functionName = runtimeEntityType.AddProperty(
"FunctionName",
typeof(string),
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("FunctionName", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<FunctionName>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
functionName.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
functionName.AddAnnotation("Relational:ColumnName", "function_name");
var edges = runtimeEntityType.AddProperty(
"Edges",
typeof(string),
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("Edges", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<Edges>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
valueGenerated: ValueGenerated.OnAdd);
edges.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
edges.AddAnnotation("Relational:ColumnName", "edges");
edges.AddAnnotation("Relational:ColumnType", "jsonb");
edges.AddAnnotation("Relational:DefaultValueSql", "'[]'::jsonb");
var sinks = runtimeEntityType.AddProperty(
"Sinks",
typeof(string[]),
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("Sinks", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<Sinks>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
sinks.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
sinks.AddAnnotation("Relational:ColumnName", "sinks");
var constants = runtimeEntityType.AddProperty(
"Constants",
typeof(string[]),
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("Constants", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<Constants>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
constants.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
constants.AddAnnotation("Relational:ColumnName", "constants");
var taintInvariant = runtimeEntityType.AddProperty(
"TaintInvariant",
typeof(string),
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("TaintInvariant", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<TaintInvariant>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
nullable: true);
taintInvariant.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
taintInvariant.AddAnnotation("Relational:ColumnName", "taint_invariant");
var sourceFile = runtimeEntityType.AddProperty(
"SourceFile",
typeof(string),
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("SourceFile", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<SourceFile>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
nullable: true);
sourceFile.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
sourceFile.AddAnnotation("Relational:ColumnName", "source_file");
var sourceLine = runtimeEntityType.AddProperty(
"SourceLine",
typeof(int?),
propertyInfo: typeof(GoldenSetTargetEntity).GetProperty("SourceLine", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(GoldenSetTargetEntity).GetField("<SourceLine>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
nullable: true);
sourceLine.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
sourceLine.AddAnnotation("Relational:ColumnName", "source_line");
var key = runtimeEntityType.AddKey(
new[] { id });
runtimeEntityType.SetPrimaryKey(key);
key.AddAnnotation("Relational:Name", "targets_pkey");
var idx_targets_golden_set = runtimeEntityType.AddIndex(
new[] { goldenSetId },
name: "idx_targets_golden_set");
var idx_targets_function = runtimeEntityType.AddIndex(
new[] { functionName },
name: "idx_targets_function");
return runtimeEntityType;
}
public static void CreateAnnotations(RuntimeEntityType runtimeEntityType)
{
runtimeEntityType.AddAnnotation("Relational:FunctionName", null);
runtimeEntityType.AddAnnotation("Relational:Schema", "golden_sets");
runtimeEntityType.AddAnnotation("Relational:SqlQuery", null);
runtimeEntityType.AddAnnotation("Relational:TableName", "targets");
runtimeEntityType.AddAnnotation("Relational:ViewName", null);
runtimeEntityType.AddAnnotation("Relational:ViewSchema", null);
Customize(runtimeEntityType);
}
static partial void Customize(RuntimeEntityType runtimeEntityType);
}
}

View File

@@ -0,0 +1,109 @@
using Microsoft.EntityFrameworkCore;
using StellaOps.BinaryIndex.GoldenSet.EfCore.Models;
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.Context;
/// <summary>
/// EF Core DbContext for the GoldenSet module.
/// Covers tables in the golden_sets schema.
/// </summary>
public partial class GoldenSetDbContext : DbContext
{
private readonly string _schemaName;
public GoldenSetDbContext(DbContextOptions<GoldenSetDbContext> options, string? schemaName = null)
: base(options)
{
_schemaName = string.IsNullOrWhiteSpace(schemaName)
? "golden_sets"
: schemaName.Trim();
}
public virtual DbSet<GoldenSetDefinitionEntity> Definitions { get; set; }
public virtual DbSet<GoldenSetTargetEntity> Targets { get; set; }
public virtual DbSet<GoldenSetAuditLogEntity> AuditLogs { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var schemaName = _schemaName;
// =====================================================================
// golden_sets.definitions
// =====================================================================
modelBuilder.Entity<GoldenSetDefinitionEntity>(entity =>
{
entity.HasKey(e => e.Id).HasName("definitions_pkey");
entity.ToTable("definitions", schemaName);
entity.HasIndex(e => e.Component, "idx_goldensets_component");
entity.HasIndex(e => e.Status, "idx_goldensets_status");
entity.HasIndex(e => e.ContentDigest, "idx_goldensets_digest").IsUnique();
entity.HasIndex(e => e.CreatedAt, "idx_goldensets_created").IsDescending();
entity.HasIndex(e => new { e.Component, e.Status }, "idx_goldensets_component_status");
entity.Property(e => e.Id).HasColumnName("id");
entity.Property(e => e.Component).HasColumnName("component");
entity.Property(e => e.ContentDigest).HasColumnName("content_digest");
entity.Property(e => e.Status).HasColumnName("status");
entity.Property(e => e.DefinitionYaml).HasColumnName("definition_yaml");
entity.Property(e => e.DefinitionJson).HasColumnType("jsonb").HasColumnName("definition_json");
entity.Property(e => e.TargetCount).HasColumnName("target_count");
entity.Property(e => e.AuthorId).HasColumnName("author_id");
entity.Property(e => e.CreatedAt).HasDefaultValueSql("NOW()").HasColumnName("created_at");
entity.Property(e => e.ReviewedBy).HasColumnName("reviewed_by");
entity.Property(e => e.ReviewedAt).HasColumnName("reviewed_at");
entity.Property(e => e.SourceRef).HasColumnName("source_ref");
entity.Property(e => e.Tags).HasColumnName("tags");
entity.Property(e => e.SchemaVersion).HasColumnName("schema_version");
entity.Property(e => e.UpdatedAt).HasDefaultValueSql("NOW()").HasColumnName("updated_at");
});
// =====================================================================
// golden_sets.targets
// =====================================================================
modelBuilder.Entity<GoldenSetTargetEntity>(entity =>
{
entity.HasKey(e => e.Id).HasName("targets_pkey");
entity.ToTable("targets", schemaName);
entity.HasIndex(e => e.GoldenSetId, "idx_targets_golden_set");
entity.HasIndex(e => e.FunctionName, "idx_targets_function");
entity.Property(e => e.Id).HasDefaultValueSql("gen_random_uuid()").HasColumnName("id");
entity.Property(e => e.GoldenSetId).HasColumnName("golden_set_id");
entity.Property(e => e.FunctionName).HasColumnName("function_name");
entity.Property(e => e.Edges).HasColumnType("jsonb").HasDefaultValueSql("'[]'::jsonb").HasColumnName("edges");
entity.Property(e => e.Sinks).HasColumnName("sinks");
entity.Property(e => e.Constants).HasColumnName("constants");
entity.Property(e => e.TaintInvariant).HasColumnName("taint_invariant");
entity.Property(e => e.SourceFile).HasColumnName("source_file");
entity.Property(e => e.SourceLine).HasColumnName("source_line");
});
// =====================================================================
// golden_sets.audit_log
// =====================================================================
modelBuilder.Entity<GoldenSetAuditLogEntity>(entity =>
{
entity.HasKey(e => e.Id).HasName("audit_log_pkey");
entity.ToTable("audit_log", schemaName);
entity.HasIndex(e => e.GoldenSetId, "idx_audit_golden_set");
entity.HasIndex(e => e.Timestamp, "idx_audit_timestamp").IsDescending();
entity.HasIndex(e => e.ActorId, "idx_audit_actor");
entity.Property(e => e.Id).HasDefaultValueSql("gen_random_uuid()").HasColumnName("id");
entity.Property(e => e.GoldenSetId).HasColumnName("golden_set_id");
entity.Property(e => e.Action).HasColumnName("action");
entity.Property(e => e.ActorId).HasColumnName("actor_id");
entity.Property(e => e.OldStatus).HasColumnName("old_status");
entity.Property(e => e.NewStatus).HasColumnName("new_status");
entity.Property(e => e.Details).HasColumnType("jsonb").HasColumnName("details");
entity.Property(e => e.Timestamp).HasDefaultValueSql("NOW()").HasColumnName("timestamp");
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

View File

@@ -0,0 +1,32 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.Context;
/// <summary>
/// Design-time factory for EF Core CLI tooling (scaffold, optimize).
/// </summary>
public sealed class GoldenSetDesignTimeDbContextFactory
: IDesignTimeDbContextFactory<GoldenSetDbContext>
{
private const string DefaultConnectionString =
"Host=localhost;Port=55433;Database=postgres;Username=postgres;Password=postgres;Search Path=golden_sets,public";
private const string ConnectionStringEnvironmentVariable =
"STELLAOPS_GOLDENSET_EF_CONNECTION";
public GoldenSetDbContext CreateDbContext(string[] args)
{
var connectionString = ResolveConnectionString();
var options = new DbContextOptionsBuilder<GoldenSetDbContext>()
.UseNpgsql(connectionString)
.Options;
return new GoldenSetDbContext(options);
}
private static string ResolveConnectionString()
{
var fromEnvironment = Environment.GetEnvironmentVariable(ConnectionStringEnvironmentVariable);
return string.IsNullOrWhiteSpace(fromEnvironment) ? DefaultConnectionString : fromEnvironment;
}
}

View File

@@ -0,0 +1,16 @@
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.Models;
/// <summary>
/// EF Core entity for golden_sets.audit_log table.
/// </summary>
public partial class GoldenSetAuditLogEntity
{
public Guid Id { get; set; }
public string GoldenSetId { get; set; } = null!;
public string Action { get; set; } = null!;
public string ActorId { get; set; } = null!;
public string? OldStatus { get; set; }
public string? NewStatus { get; set; }
public string? Details { get; set; }
public DateTime Timestamp { get; set; }
}

View File

@@ -0,0 +1,23 @@
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.Models;
/// <summary>
/// EF Core entity for golden_sets.definitions table.
/// </summary>
public partial class GoldenSetDefinitionEntity
{
public string Id { get; set; } = null!;
public string Component { get; set; } = null!;
public string ContentDigest { get; set; } = null!;
public string Status { get; set; } = null!;
public string DefinitionYaml { get; set; } = null!;
public string DefinitionJson { get; set; } = null!;
public int TargetCount { get; set; }
public string AuthorId { get; set; } = null!;
public DateTime CreatedAt { get; set; }
public string? ReviewedBy { get; set; }
public DateTime? ReviewedAt { get; set; }
public string SourceRef { get; set; } = null!;
public string[] Tags { get; set; } = null!;
public string SchemaVersion { get; set; } = null!;
public DateTime UpdatedAt { get; set; }
}

View File

@@ -0,0 +1,17 @@
namespace StellaOps.BinaryIndex.GoldenSet.EfCore.Models;
/// <summary>
/// EF Core entity for golden_sets.targets table.
/// </summary>
public partial class GoldenSetTargetEntity
{
public Guid Id { get; set; }
public string GoldenSetId { get; set; } = null!;
public string FunctionName { get; set; } = null!;
public string Edges { get; set; } = null!;
public string[] Sinks { get; set; } = null!;
public string[] Constants { get; set; } = null!;
public string? TaintInvariant { get; set; }
public string? SourceFile { get; set; }
public int? SourceLine { get; set; }
}

View File

@@ -10,6 +10,17 @@
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="Migrations\**\*.sql" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
<ItemGroup>
<!-- Prevent automatic compiled-model binding so non-default schemas can build runtime models. -->
<Compile Remove="EfCore\CompiledModels\GoldenSetDbContextAssemblyAttributes.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" PrivateAssets="all" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" />
<PackageReference Include="Microsoft.Extensions.Http" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
@@ -17,6 +28,7 @@
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" />
<PackageReference Include="Microsoft.Extensions.Options.DataAnnotations" />
<PackageReference Include="Npgsql" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" />
<PackageReference Include="YamlDotNet" />
</ItemGroup>

View File

@@ -7,3 +7,6 @@ Source of truth: `docs/implplan/SPRINT_20260130_002_Tools_csproj_remediation_sol
| QA-BINARYINDEX-VERIFY-024 | BLOCKED | SPRINT_20260211_033 run-001: blocked because required module-local AGENTS is missing for `src/BinaryIndex/__Tests/StellaOps.BinaryIndex.GoldenSet.Tests` (repo AGENTS rule 5). |
| REMED-05 | TODO | Remediation checklist: docs/implplan/audits/csproj-standards/remediation/checklists/src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.GoldenSet/StellaOps.BinaryIndex.GoldenSet.md. |
| REMED-06 | DONE | SOLID review notes captured for SPRINT_20260130_002. |
| BINARY-EF-02 | DONE | SPRINT_20260222_090: EF Core model baseline scaffolded (3 entities, golden_sets schema). |
| BINARY-EF-04 | DONE | SPRINT_20260222_090: Compiled model (6 files) generated. |
| BINARY-EF-05 | DONE | SPRINT_20260222_090: Build/tests validated (261 pass, 0 fail). Module docs updated. |