{ "planPath": "docs/plans/2026-06-26-otopcua-historian-gateway-integration.md", "tasks": [ { "id": 0, "subject": "Task 1: Consume gateway packages + scaffold Gateway driver project", "status": "completed", "blockedBy": [] }, { "id": 1, "subject": "Task 2: HistoryAggregateType->RetrievalMode mapper (matrix-guarded)", "status": "completed", "blockedBy": [ 0 ] }, { "id": 2, "subject": "Task 3: DriverDataType->HistorianDataType mapper + write-gap fallbacks (matrix-guarded)", "status": "completed", "blockedBy": [ 0 ] }, { "id": 3, "subject": "Task 4: HistorianSample/Aggregate->DataValueSnapshot + quality mapper", "status": "completed", "blockedBy": [ 0 ] }, { "id": 4, "subject": "Task 5: HistorianEvent->HistoricalEvent mapper (+ severity)", "status": "completed", "blockedBy": [ 0 ] }, { "id": 5, "subject": "Task 6: AlarmHistorianEvent->HistorianEvent mapper (SendEvent)", "status": "completed", "blockedBy": [ 0 ] }, { "id": 6, "subject": "Task 7: GatewayHistorianDataSource read paths (raw/processed/at-time)", "status": "completed", "blockedBy": [ 1, 3 ] }, { "id": 7, "subject": "Task 8: GetHealthSnapshot via Probe/GetConnectionStatus", "status": "completed", "blockedBy": [ 6 ] }, { "id": 8, "subject": "Task 9: Reshape ServerHistorianOptions to gateway form", "status": "completed", "blockedBy": [ 0 ] }, { "id": 9, "subject": "Task 10: Swap AddServerHistorian factory in Program.cs (READ CUTOVER)", "status": "completed", "blockedBy": [ 6, 8 ] }, { "id": 10, "subject": "Task 11: ReadEventsAsync alarm-history on the data source", "status": "completed", "blockedBy": [ 6, 4 ] }, { "id": 11, "subject": "Task 12: GatewayAlarmHistorianWriter (SendEvent + outcome mapping)", "status": "completed", "blockedBy": [ 9, 5 ] }, { "id": 12, "subject": "Task 13: Swap AddAlarmHistorian factory in Program.cs", "status": "completed", "blockedBy": [ 11 ] }, { "id": 13, "subject": "Task 14: IHistorianProvisioning + GatewayTagProvisioner (EnsureTags)", "status": "completed", "blockedBy": [ 9, 2 ] }, { "id": 14, "subject": "Task 15: Hook provisioning into AddressSpaceApplier.Apply()", "status": "completed", "blockedBy": [ 13 ] }, { "id": 15, "subject": "Task 16: FasterLog historization outbox store", "status": "completed", "blockedBy": [ 9 ] }, { "id": 16, "subject": "Task 17: ContinuousHistorizationRecorder actor", "status": "completed", "blockedBy": [ 15, 9 ] }, { "id": 17, "subject": "Task 18: Wire recorder into DI + hosted lifecycle", "status": "completed", "blockedBy": [ 16 ] }, { "id": 18, "subject": "Task 19: Retire Wonderware historian projects", "status": "completed", "blockedBy": [ 9, 12, 17, 19 ] }, { "id": 19, "subject": "Task 20: Env-gated live validation vs wonder-sql-vd03", "status": "completed", "blockedBy": [ 9, 10, 12, 17 ] }, { "id": 20, "subject": "Task 21: Documentation (CLAUDE.md, appsettings, README)", "status": "completed", "blockedBy": [ 18 ] } ], "lastUpdated": "2026-07-27", "closureNote": "Shipped as PR #423 and live-validated against the gateway on wonder-sql-vd03. Marked complete 2026-07-27 (deferment.md \u00a78.5)." }