Built Word Documents (.docx):
Spensara Overview (.docx)
Capability Assessment (.docx)
Brink POS Ingestion Analysis (.docx)
The Borg Ingestion Architecture (.docx)
Categories
Implementation Specs (157)
Detailed engineering and feature implementation specifications.
- specs/AnomalyDetection/TASK1.1.md
- specs/AnomalyDetection/TASK1.2.md
- specs/AnomalyDetection/TASK1.3.md
- specs/AnomalyDetection/TASK1.4.md
- specs/AnomalyDetection/TASK2.1.md
- specs/AnomalyDetection/TASK2.2.md
- specs/AnomalyDetection/TASK3.1.md
- specs/AnomalyDetection/TASK3.2.md
- specs/AnomalyDetection/TASK3.3.md
- specs/AnomalyDetection/TASK4.1.md
- specs/AnomalyDetection/TASK4.2.md
- specs/AnomalyDetection/TASK4.3.md
- specs/AnomalyDetection/TASK4.4.md
- specs/AnomalyDetection/TASK5.1.md
- specs/AnomalyDetection/TASK5.2.md
- specs/AnomalyDetection/TASK5.3.md
- specs/AnomalyDetection/TASK6.1.md
- specs/AnomalyDetection/TASK6.2.md
- specs/AnomalyDetection/TASK6.3.md
- specs/AnomalyDetection/TASKS.md
- specs/ApiServicePostgresTestStability/TASK.md
- specs/BackendDatabaseConsolidation/TASK.md
- specs/BackendDatabaseConsolidation/TASK1.1.md
- specs/BackendDatabaseConsolidation/TASK1.2.md
- specs/BackendDatabaseConsolidation/TASK1.3.md
- specs/BackendDatabaseConsolidation/TASK2.1.md
- specs/BackendDatabaseConsolidation/TASK2.2.md
- specs/BackendDatabaseConsolidation/TASK2.3.md
- specs/BackendDatabaseConsolidation/TASK3.1.md
- specs/BackendDatabaseConsolidation/TASK3.2.md
- specs/BackendDatabaseConsolidation/TASK4.1.md
- specs/BackendDatabaseConsolidation/TASK4.2.md
- specs/BackendDatabaseConsolidation/TASK4.3.md
- specs/BackendDatabaseConsolidation/TASK5.1.md
- specs/BackendDatabaseConsolidation/TASK5.2.md
- specs/BrinkLaborGetShiftsStaging/TASK.md
- specs/BrinkPosOrdersFirstEtlJob/TASK.md
- specs/BrinkPosOrdersFirstEtlJob/TASK0.md
- specs/BrinkPosOrdersFirstEtlJob/TASK1.md
- specs/BrinkPosOrdersFirstEtlJob/TASK2.1.md
- specs/BrinkPosOrdersFirstEtlJob/TASK2.2.md
- specs/BrinkPosOrdersFirstEtlJob/TASK2.3.md
- specs/BrinkPosOrdersFirstEtlJob/TASK2.4.md
- specs/BrinkPosOrdersFirstEtlJob/TASK2.md
- specs/BrinkPosOrdersFirstEtlJob/TASK3.1.md
- specs/BrinkPosOrdersFirstEtlJob/TASK3.2.md
- specs/BrinkPosOrdersFirstEtlJob/TASK3.3.md
- specs/BrinkPosOrdersFirstEtlJob/TASK3.4.md
- specs/BrinkPosOrdersFirstEtlJob/TASK3.md
- specs/BrinkPosOrdersFirstEtlJob/TASK4.1.md
- specs/BrinkPosOrdersFirstEtlJob/TASK4.2.md
- specs/BrinkPosOrdersFirstEtlJob/TASK4.3.md
- specs/BrinkPosOrdersFirstEtlJob/TASK4.4.md
- specs/BrinkPosOrdersFirstEtlJob/TASK4.md
- specs/BrinkPosOrdersFirstEtlJob/TASK5.1.md
- specs/BrinkPosOrdersFirstEtlJob/TASK5.2.md
- specs/BrinkPosOrdersFirstEtlJob/TASK5.3.md
- specs/BrinkPosOrdersFirstEtlJob/TASK5.4.md
- specs/BrinkPosOrdersFirstEtlJob/TASK5.md
- specs/BrinkPosOrdersFirstEtlJob/TASK6.1.md
- specs/BrinkPosOrdersFirstEtlJob/TASK6.2.md
- specs/BrinkPosOrdersFirstEtlJob/TASK6.3.md
- specs/BrinkPosOrdersFirstEtlJob/TASK6.4.md
- specs/BrinkPosOrdersFirstEtlJob/TASK6.md
- specs/BrinkPosOrdersFirstEtlJob/TASK7.md
- specs/BrinkPosOrdersFirstEtlJob/TASK8.md
- specs/BrinkPosOrdersFirstEtlJob/TASK9.md
- specs/BrinkSettings2ToStaging/TASK.MD
- specs/CuratedToS3Stage/TASK.md
- specs/CuratedToS3Stage/TASK0.md
- specs/CuratedToS3Stage/TASK1.md
- specs/CuratedToS3Stage/TASK2.md
- specs/CuratedToS3Stage/TASK3.md
- specs/CuratedToS3Stage/TASK4.md
- specs/CustomerCredentialCustomHeaders/TASK.md
- specs/CustomerCredentialCustomHeaders/TASK1.1.md
- specs/CustomerCredentialCustomHeaders/TASK1.2.md
- specs/CustomerCredentialCustomHeaders/TASK2.1.md
- specs/CustomerCredentialCustomHeaders/TASK2.2.md
- specs/CustomerCredentialCustomHeaders/TASK3.1.md
- specs/CustomerCredentialTriggeredProvisioning/TASK.md
- specs/CustomerCredentialTriggeredProvisioning/TASK1.1.md
- specs/CustomerCredentialTriggeredProvisioning/TASK1.2.md
- specs/CustomerCredentialTriggeredProvisioning/TASK2.1.md
- specs/CustomerCredentialTriggeredProvisioning/TASK2.2.md
- specs/CustomerCredentialTriggeredProvisioning/TASK3.1.md
- specs/CustomerCredentialTriggeredProvisioning/TASK3.2.md
- specs/CustomerCredentialTriggeredProvisioning/TASK4.1.md
- specs/EtlSourceAdapterFramework/TASK.md
- specs/EtlSourceAdapterFramework/TASK0.md
- specs/EtlSourceAdapterFramework/TASK1.md
- specs/EtlSourceAdapterFramework/TASK2.md
- specs/EtlSourceAdapterFramework/TASK3.md
- specs/EtlSourceAdapterFramework/TASK4.md
- specs/EtlSourceAdapterFramework/TASK5.md
- specs/EtlSourceAdapterFramework/TASK6.md
- specs/KdsCdcDebeziumIntegration/TASK.md
- specs/KdsCdcDebeziumIntegration/TASK1.md
- specs/KdsCdcDebeziumIntegration/TASK2.md
- specs/KdsCdcDebeziumIntegration/TASK3.md
- specs/KdsCdcDebeziumIntegration/TASK4.md
- specs/KdsCdcDebeziumIntegration/TASK5.md
- specs/KdsCdcDurableRelationRouting/TASK.md
- specs/KdsCdcDurableRelationRouting/TASK1.md
- specs/KdsCdcDurableRelationRouting/TASK2.md
- specs/KdsCdcDurableRelationRouting/TASK3.md
- specs/KdsCdcDurableRelationRouting/TASK4.md
- specs/KdsCdcDurableRelationRouting/TASK5.md
- specs/KdsCdcIngestion/TASK.md
- specs/KdsCdcIngestion/TASK1.md
- specs/KdsCdcIngestion/TASK2.md
- specs/KdsCdcIngestion/TASK3.md
- specs/KdsCdcIngestion/TASK4.md
- specs/KdsCdcIngestion/TASK5.md
- specs/KdsCdcIngestion/TASK6.md
- specs/KdsCdcIngestion/TASK7.md
- specs/KdsCdcIngestion/TASK8.md
- specs/KdsCdcIngestion/TASK9.md
- specs/KdsCdcReplayExecution/TASK.md
- specs/KdsCdcReplayExecution/TASK1.md
- specs/KdsCdcReplayExecution/TASK2.md
- specs/KdsCdcReplayExecution/TASK3.md
- specs/KdsCdcReplayExecution/TASK4.md
- specs/KdsMonitorServingContractMigration/TASK.md
- specs/KdsMonitorServingContractMigration/TASK1.1.md
- specs/KdsMonitorServingContractMigration/TASK1.2.md
- specs/KdsMonitorServingContractMigration/TASK2.1.md
- specs/KdsMonitorServingContractMigration/TASK2.2.md
- specs/KdsMonitorServingContractMigration/TASK3.1.md
- specs/KdsMonitorServingContractMigration/TASK3.2.md
- specs/RedshiftFoundation/TASK.md
- specs/RedshiftFoundation/TASK1.1.md
- specs/RedshiftFoundation/TASK1.2.md
- specs/RedshiftFoundation/TASK1.3.md
- specs/RedshiftFoundation/TASK1.4.md
- specs/RedshiftFoundation/TASK2.1.md
- specs/RedshiftFoundation/TASK2.2.md
- specs/RedshiftFoundation/TASK3.1.md
- specs/RedshiftFoundation/TASK3.2.md
- specs/RedshiftFoundation/TASK3.3.md
- specs/RedshiftSyntheticDataFeed/TASK.md
- specs/RedshiftSyntheticDataFeed/TASK1.1.md
- specs/RedshiftSyntheticDataFeed/TASK1.2.md
- specs/RedshiftSyntheticDataFeed/TASK1.3.md
- specs/RedshiftSyntheticDataFeed/TASK2.1.md
- specs/RedshiftSyntheticDataFeed/TASK2.2.md
- specs/RedshiftSyntheticDataFeed/TASK3.1.md
- specs/RedshiftSyntheticDataFeed/TASK3.2.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK1.1.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK1.2.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK2.1.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK2.2.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK2.3.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK3.1.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK3.2.md
- specs/SingleStoreRedshiftRuntimeReadPath/TASK4.1.md
TASK 1.2: Create MonitorRun Entity for Execution History
Summary
Create the MonitorRun entity that tracks each execution of a monitor, including status, timing, results, and any alerts generated.
Dependencies
- TASK 1.1 (MonitorSpec entity must exist for foreign key relationship)
Files to Create
1. backend/Kds.Ai.Data/Enums/MonitorRunStatus.cs
csharp
namespace Kds.Ai.Data.Enums;
public enum MonitorRunStatus
{
/// <summary>
/// Run is queued but not yet started
/// </summary>
Pending,
/// <summary>
/// Run is currently executing
/// </summary>
Running,
/// <summary>
/// Run completed successfully (may or may not have found anomalies)
/// </summary>
Completed,
/// <summary>
/// Run failed due to an error
/// </summary>
Failed,
/// <summary>
/// Run was cancelled before completion
/// </summary>
Cancelled
}2. backend/Kds.Ai.Data/Entities/MonitorRun.cs
csharp
using Kds.Ai.Data.Enums;
namespace Kds.Ai.Data.Entities;
public sealed class MonitorRun
{
public Guid Id { get; set; }
/// <summary>
/// Foreign key to the monitor specification
/// </summary>
public Guid MonitorSpecId { get; set; }
/// <summary>
/// Navigation property to the monitor spec
/// </summary>
public MonitorSpec MonitorSpec { get; set; } = null!;
/// <summary>
/// Current status of the run
/// </summary>
public MonitorRunStatus Status { get; set; }
/// <summary>
/// When the run started
/// </summary>
public DateTimeOffset StartedAt { get; set; }
/// <summary>
/// When the run completed (null if still running)
/// </summary>
public DateTimeOffset? CompletedAt { get; set; }
/// <summary>
/// The time window being analyzed (start)
/// </summary>
public DateTimeOffset AnalysisWindowStart { get; set; }
/// <summary>
/// The time window being analyzed (end)
/// </summary>
public DateTimeOffset AnalysisWindowEnd { get; set; }
/// <summary>
/// JSON summary of findings and analysis
/// </summary>
public string? ResultSummary { get; set; }
/// <summary>
/// Error message if the run failed
/// </summary>
public string? ErrorMessage { get; set; }
/// <summary>
/// Number of anomalies detected in this run
/// </summary>
public int AnomaliesDetected { get; set; }
/// <summary>
/// Navigation property to the emitted alerts (one per detected anomaly)
/// </summary>
public ICollection<AlertEvent> AlertEvents { get; set; } = [];
/// <summary>
/// Total tokens used by LLM during this run (for cost tracking)
/// </summary>
public int? TokensUsed { get; set; }
/// <summary>
/// Duration of the run in milliseconds
/// </summary>
public long? DurationMs { get; set; }
}3. backend/Kds.Ai.Data/Configurations/MonitorRunConfiguration.cs
csharp
using Kds.Ai.Data.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Kds.Ai.Data.Configurations;
public sealed class MonitorRunConfiguration : IEntityTypeConfiguration<MonitorRun>
{
public void Configure(EntityTypeBuilder<MonitorRun> builder)
{
builder.ToTable("MonitorRuns");
builder.HasKey(x => x.Id);
builder.Property(x => x.Status)
.IsRequired()
.HasMaxLength(50);
builder.Property(x => x.StartedAt)
.IsRequired();
builder.Property(x => x.ResultSummary)
.HasColumnType("longtext");
builder.Property(x => x.ErrorMessage)
.HasMaxLength(2000);
// Relationships
builder.HasOne(x => x.MonitorSpec)
.WithMany(x => x.Runs)
.HasForeignKey(x => x.MonitorSpecId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasMany(x => x.AlertEvents)
.WithMany()
.UsingEntity("MonitorRunAlertEvents");
// Indexes
builder.HasIndex(x => x.MonitorSpecId);
builder.HasIndex(x => x.Status);
builder.HasIndex(x => x.StartedAt);
builder.HasIndex(x => new { x.MonitorSpecId, x.StartedAt });
}
}Files to Modify
4. backend/Kds.Ai.Data/KdsAiDbContext.cs
Add DbSet property:
csharp
public DbSet<MonitorRun> MonitorRuns => Set<MonitorRun>();Note: Configuration is automatically applied via ApplyConfigurationsFromAssembly - no manual registration needed.
Acceptance Criteria
- [ ]
MonitorRunStatusenum created with all specified values - [ ]
MonitorRunentity created with all specified properties - [ ] Fluent API configuration follows project conventions (sealed class, no data annotations)
- [ ] Foreign key relationship to MonitorSpec with cascade delete
- [ ] Many-to-many relationship to AlertEvents via join table
MonitorRunAlertEvents - [ ] No explicit enum conversion (handled globally by
ConfigureConventions) - [ ] DbSet registered in
KdsAiDbContext - [ ] Solution builds without errors
Notes
- A single MonitorRun can detect multiple anomalies and emit multiple AlertEvents
- The many-to-many relationship uses a join table
MonitorRunAlertEvents TokensUsedandDurationMsare for observability/cost trackingAnalysisWindowStart/Endtrack what time period was analyzed (independent of when the run happened)- Configurations are auto-discovered via
ApplyConfigurationsFromAssembly