Categories
Implementation Specs (157)
- 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
Anomaly Detection Agent - Implementation Tasks
Overview
Implementation of a generic anomaly detection agent system. The system is fully domain-agnostic: all domain knowledge (what database to query, what KPIs to monitor, what thresholds to use) comes from plain text prompts stored in MonitorSpec.SystemPrompt. The agent uses MCP tools (mysql_query via benborla/mcp-server-mysql) to access data and formulates its own SQL queries based on the prompt instructions.
Architecture:
- MonitorSpec - plain text instructions (system prompt) describing what to monitor
- Agent - single generic
AnomalyDetectorAgentusingIChatClient(LLM) + MCP tools - MCP Tools -
McpToolProviderconnects to MySQL via stdio transport, exposes tools to the agent - emit_conclusion - custom tool the agent calls to report structured findings
- Orchestrator - loads spec, runs agent, emits alerts, records history
Tech Stack:
- .NET 10, Aspire-based solution
- AWS Bedrock (Claude) via
IChatClient(registered inKds.Ai.AgentsCommon) Microsoft.Extensions.AI/Microsoft.Agents.AIv1.0.0-preview- MySQL via
benborla/mcp-server-mysqlMCP server (stdio transport) - EF Core with MySQL for internal state (MonitorSpec, MonitorRun, AlertEvent)
Task Checklist
Phase 1: Infrastructure & Data Layer
- [x] TASK1.1 - Create MonitorSpec entity (sealed, MonitorState enum, no StoreGuid/MonitorType)
- [x] TASK1.2 - Create MonitorRun entity (sealed, ICollection\<AlertEvent\> via many-to-many join table)
- [x] TASK1.3 - Create EF migration (via Add-Migration.ps1, auto-applies at AppHost startup)
- [x] TASK1.4 - Create McpToolProvider using official MCP C# SDK (StdioClientTransport)
Phase 2: Agent Core
- [x] TASK 2.1 - Create IAnomalyDetectorAgent interface and result types (generic, no domain DTOs)
- [x] TASK 2.2 - Create AnomalyDetectorAgent implementation (agentic loop + emit_conclusion tool)
Phase 3: MonitorSpec System
- [x] TASK 3.1 - Create IMonitorSpecRepository interface (name-based, MonitorState)
- [x] TASK 3.2 - Implement EfMonitorSpecRepository (sealed, ExecuteUpdateAsync)
- [x] TASK 3.3 - Create MonitorSpecSeeder + ExamplePrompts (generic, no factory)
Phase 4: Runtime Orchestration
- [x] TASK 4.1 - Create IMonitorRunOrchestrator interface (no ExecuteAllActiveAsync, no store/type)
- [x] TASK 4.2 - Implement MonitorRunOrchestrator (sealed, single agent, AlertEvents collection)
- [x] TASK 4.3 - Create AlertEmitter (sealed, name-based dedup, generic findings)
- [x] TASK 4.4 - Create MonitorRunRepository (sealed, no GetByStore, no alertEventId param)
Phase 5: CLI Integration
- [ ] TASK 5.1 - Create RunAnomalyDetectorCommand (--name/--spec-id, set-state, no --store)
- [ ] TASK 5.2 - Wire up DI (McpToolProvider, AnomalyDetectorAgent, no deleted services)
- [ ] TASK 5.3 - Add enhanced CLI options (history, stats, json output)
Phase 6: Testing & Validation
- [ ] TASK 6.1 - Create mock testing infrastructure (FakeChatClient, FakeMcpToolProvider, ScriptedAgentScenarios)
- [ ] TASK 6.2 - Add integration and unit tests using fakes
- [ ] TASK 6.3 - Test against real KDSDev with sample data
Deleted Tasks (for reference)
The following tasks existed in the original numbering scheme (before renumbering) and were deleted because the system is generic. These numbers no longer correspond to any current files:
- ~~Old TASK 2.1~~ IKdsDataAccessService - deleted (agent uses MCP tools directly)
- ~~Old TASK 2.2~~ McpKdsDataAccessService - deleted (no typed data access layer)
- ~~Old TASK 2.3~~ PrepTimeQueryBuilder - deleted (agent formulates its own SQL)
- ~~Old TASK 2.4~~ KDSDev connection config - deleted (MCP config is in TASK 1.4)
- ~~Old TASK 3.3~~ Hardcoded prep-time system prompt - deleted (prompts are plain text in MonitorSpec)
- ~~Old TASK 3.4~~ Hardcoded tool definitions wrapping IKdsDataAccessService - deleted (agent uses MCP tools)
- ~~Old TASK 3.5~~ PrepTimeFeaturePanel DTOs - deleted (no typed domain models)
Dependency Graph
Phase 1 (Infrastructure)
|-- 1.1 MonitorSpec Entity
|-- 1.2 MonitorRun Entity
|-- 1.3 Migration <-- (depends on 1.1, 1.2)
+-- 1.4 McpToolProvider
Phase 2 (Agent Core) <-- depends on 1.1, 1.4
|-- 2.1 IAnomalyDetectorAgent + Result Types
+-- 2.2 AnomalyDetectorAgent <-- (depends on 2.1, 1.4)
Phase 3 (MonitorSpec) <-- depends on 1.1
|-- 3.1 IMonitorSpecRepository
|-- 3.2 EfMonitorSpecRepository <-- (depends on 3.1)
+-- 3.3 MonitorSpecSeeder + ExamplePrompts <-- (depends on 3.1)
Phase 4 (Orchestration) <-- depends on Phase 2, Phase 3
|-- 4.1 IMonitorRunOrchestrator
|-- 4.2 MonitorRunOrchestrator <-- (depends on 4.1, 2.1, 3.1, 4.3, 4.4)
|-- 4.3 AlertEmitter
+-- 4.4 MonitorRunRepository
Phase 5 (CLI) <-- depends on Phase 4
|-- 5.1 RunAnomalyDetectorCommand <-- (depends on 4.1, 3.1, 3.3)
|-- 5.2 DI Wiring
+-- 5.3 Enhanced CLI Options
Phase 6 (Testing) <-- depends on all
|-- 6.1 Fakes (FakeChatClient, FakeMcpToolProvider)
|-- 6.2 Integration + Unit Tests <-- (depends on 6.1)
+-- 6.3 Real TestingRecommended Session Order
| Session | Tasks | Description |
|---|---|---|
| 1 | 1.1, 1.2, 1.3 | Data entities + migration |
| 2 | 1.4 | McpToolProvider setup |
| 3 | 2.1, 2.2 | Agent interface + implementation |
| 4 | 3.1, 3.2, 3.3 | MonitorSpec repository + seeder |
| 5 | 4.1, 4.2, 4.3, 4.4 | Orchestration layer |
| 6 | 5.1, 5.2, 5.3 | CLI integration |
| 7 | 6.1, 6.2, 6.3 | Testing |
Key Design Decisions
Generic System (No Domain Models in Code)
The system contains zero domain-specific code:
- No
PrepTimeHourlyStats,OrderTypeBreakdown, or other typed DTOs - No
IKdsDataAccessServiceorPrepTimeQueryBuilder - No
IAnomalyDetectorAgentFactoryorMonitorTypediscriminator - All domain knowledge lives in
MonitorSpec.SystemPromptas plain text
Single Agent, No Factory
There is one AnomalyDetectorAgent class. Different monitors are distinguished by their MonitorSpec.SystemPrompt, not by different agent classes. No factory pattern.
MCP-Driven Data Access
The agent accesses data through MCP tools provided by McpToolProvider. The LLM formulates SQL queries based on the system prompt instructions. No code-level query building.
MonitorState Enum (Not Boolean)
MonitorSpec.State uses a 4-value enum (Draft, Active, Paused, Archived) instead of bool IsEnabled.
Many-to-Many Alert Relationship
MonitorRun has ICollection<AlertEvent> AlertEvents via a join table, not a single Guid? AlertEventId FK. One run can detect multiple anomalies resulting in multiple alerts.
Reference: KDSDev Orders Table Schema
create table orders
(
guid varchar(36) not null primary key,
store_guid varchar(36) not null,
destination varchar(255) null,
external_id varchar(199) not null,
guest_table varchar(199) null,
is_priority tinyint default 0 not null,
items_count int default 0 not null,
order_type varchar(199) null,
pos_terminal varchar(199) null,
preparation_time int null,
server_name varchar(199) null,
user_info varchar(199) null,
done tinyint default 0 not null,
create_time int not null,
update_time int not null,
upload_time int default 1 null,
is_deleted tinyint default 0 not null,
update_device varchar(36) null,
phone tinytext null,
create_local_time int default 0 null,
is_hidden tinyint default 0 not null,
customer_guid varchar(36) null,
smart_order_start_time int default 0 null,
order_messages varchar(255) not null,
customer_name varchar(60) null,
seat int null,
order_status int null
)Note: This schema is provided as reference for writing example prompts. The agent code does not reference these columns - only the MonitorSpec's plain text prompt does.