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 4.1: Create IMonitorRunOrchestrator Interface
Summary
Define the interface for the orchestrator that coordinates the complete anomaly detection execution flow: loading specs, running the agent, and emitting results.
Dependencies
- TASK 1.2 (MonitorRun entity)
- TASK 2.1 (AnomalyDetectionResult)
Files to Create
1. backend/Kds.Ai.AnomalyDetector/Orchestration/IMonitorRunOrchestrator.cs
csharp
using Kds.Ai.Data.Entities;
namespace Kds.Ai.AnomalyDetector.Orchestration;
/// <summary>
/// Orchestrates the execution of monitor runs, coordinating between
/// MonitorSpec loading, agent execution, and result emission
/// </summary>
public interface IMonitorRunOrchestrator
{
/// <summary>
/// Execute a monitor run by MonitorSpec ID
/// </summary>
/// <param name="monitorSpecId">The ID of the MonitorSpec to run</param>
/// <param name="analysisTime">Point in time to analyze (default: now)</param>
/// <param name="options">Execution options</param>
/// <param name="ct">Cancellation token</param>
/// <returns>The completed MonitorRun record</returns>
Task<MonitorRun> ExecuteAsync(
Guid monitorSpecId,
DateTimeOffset? analysisTime = null,
RunOptions? options = null,
CancellationToken ct = default);
/// <summary>
/// Execute a monitor run with a provided MonitorSpec
/// (useful for testing or one-off runs without database storage)
/// </summary>
/// <param name="spec">The MonitorSpec to execute</param>
/// <param name="analysisTime">Point in time to analyze (default: now)</param>
/// <param name="options">Execution options</param>
/// <param name="ct">Cancellation token</param>
/// <returns>The completed MonitorRun record</returns>
Task<MonitorRun> ExecuteAsync(
MonitorSpec spec,
DateTimeOffset? analysisTime = null,
RunOptions? options = null,
CancellationToken ct = default);
/// <summary>
/// Execute all active monitors (State == Active)
/// </summary>
/// <param name="analysisTime">Point in time to analyze</param>
/// <param name="options">Execution options</param>
/// <param name="ct">Cancellation token</param>
/// <returns>List of completed MonitorRun records</returns>
Task<IReadOnlyList<MonitorRun>> ExecuteAllActiveAsync(
DateTimeOffset? analysisTime = null,
RunOptions? options = null,
CancellationToken ct = default);
}
/// <summary>
/// Options for controlling monitor execution
/// </summary>
public record RunOptions
{
/// <summary>
/// If true, run the analysis but don't emit alerts or save to database
/// </summary>
public bool DryRun { get; init; } = false;
/// <summary>
/// If true, suppress alert emission even if anomaly detected
/// </summary>
public bool SuppressAlerts { get; init; } = false;
/// <summary>
/// Override the analysis window start time
/// </summary>
public DateTimeOffset? WindowStart { get; init; }
/// <summary>
/// Override the analysis window end time
/// </summary>
public DateTimeOffset? WindowEnd { get; init; }
/// <summary>
/// Maximum execution time before timeout
/// </summary>
public TimeSpan? Timeout { get; init; }
/// <summary>
/// Callback for progress reporting
/// </summary>
public IProgress<RunProgress>? Progress { get; init; }
/// <summary>
/// Default options
/// </summary>
public static RunOptions Default => new();
/// <summary>
/// Options for dry-run testing
/// </summary>
public static RunOptions TestRun => new()
{
DryRun = true,
SuppressAlerts = true
};
}
/// <summary>
/// Progress information during monitor execution
/// </summary>
public record RunProgress
{
/// <summary>
/// Current phase of execution
/// </summary>
public required RunPhase Phase { get; init; }
/// <summary>
/// Human-readable message
/// </summary>
public required string Message { get; init; }
/// <summary>
/// Progress percentage (0-100) if applicable
/// </summary>
public int? ProgressPercent { get; init; }
}
/// <summary>
/// Phases of monitor execution
/// </summary>
public enum RunPhase
{
Initializing,
LoadingSpec,
RunningAgent,
AnalyzingResults,
EmittingAlerts,
SavingResults,
Completed,
Failed
}Interface Design Rationale
Multiple Entry Points
- By ID: Standard case - load spec from DB and run
- By Spec: Testing/ad-hoc without DB
- All Active: Scheduled batch runs (monitors with
State == Active)
RunOptions
Flexible options enable:
- DryRun: Test without side effects
- SuppressAlerts: Run analysis without notification
- Window Override: Custom time ranges for historical analysis
- Timeout: Prevent runaway executions
- Progress: UI/logging integration
Removed from Old Design
ExecuteAllByTypeAsync(monitorType)- removed because MonitorSpec no longer hasMonitorTypeExecuteForStoreAsync(storeGuid)- removed because MonitorSpec no longer hasStoreGuidSkipPreflightoption - removed because preflight checks were domain-specific (data freshness); the agent can decide in its own reasoning whether data is fresh enough
Progress Reporting
The IProgress<RunProgress> pattern allows:
- CLI progress indicators
- UI status updates
- Logging integration
- Debugging long-running operations
Acceptance Criteria
- [ ]
IMonitorRunOrchestratorinterface created - [ ] All execution methods defined
- [ ]
RunOptionsrecord with all options - [ ]
RunProgressandRunPhasefor progress tracking - [ ] No references to
MonitorType,StoreGuid, orIsEnabled - [ ] Uses
ExecuteAllActiveAsync(not by type/store) - [ ] Static factory methods for common option sets
- [ ] XML documentation complete
- [ ] Solution builds without errors
Notes
- Implementation in TASK 4.2
- Consider adding
CancelAsync(Guid runId)for aborting runs - May want
GetRunStatusAsync(Guid runId)for polling - The return type is
MonitorRunentity - consider a DTO if needed