docs(plans): add Transport (Component #24) implementation plan

30-task plan covering ScadaLink.Transport project, AES-256-GCM bundle
encryption, IAuditCorrelationContext for BundleImportId threading,
TreeView checkbox-selection mode + TemplateFolderTree wrapper, two
Central UI wizard pages, EF migration, integration tests, README +
cross-reference updates. Single shipping slice, no feature flag.
This commit is contained in:
Joseph Doherty
2026-05-24 03:43:18 -04:00
parent 1b02f33829
commit 1bc98e10a1
2 changed files with 1701 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,36 @@
{
"planPath": "docs/plans/2026-05-24-transport.md",
"tasks": [
{"id": 7, "subject": "T0: Bundle DTOs in Commons", "status": "pending"},
{"id": 8, "subject": "T1: Transport interfaces", "status": "pending"},
{"id": 9, "subject": "T2: BundleImportId column on AuditLogEntry", "status": "pending"},
{"id": 10, "subject": "T3: EF migration AddBundleImportIdToAuditLog", "status": "pending", "blockedBy": [9]},
{"id": 11, "subject": "T4: IAuditCorrelationContext scoped service", "status": "pending"},
{"id": 12, "subject": "T5: AuditService reads correlation context", "status": "pending", "blockedBy": [9, 11]},
{"id": 13, "subject": "T6: ScadaLink.Transport project skeleton", "status": "pending"},
{"id": 14, "subject": "T7: TransportOptions", "status": "pending", "blockedBy": [13]},
{"id": 15, "subject": "T8: BundleSecretEncryptor (AES-256-GCM + PBKDF2)", "status": "pending", "blockedBy": [13]},
{"id": 16, "subject": "T9: ManifestBuilder + ManifestValidator", "status": "pending", "blockedBy": [13]},
{"id": 17, "subject": "T10: EntitySerializer + DTOs + secret carving", "status": "pending", "blockedBy": [13]},
{"id": 18, "subject": "T11: BundleSerializer (ZIP packer + reader)", "status": "pending", "blockedBy": [15, 16, 17]},
{"id": 19, "subject": "T12: DependencyResolver", "status": "pending", "blockedBy": [13]},
{"id": 20, "subject": "T13: BundleSessionStore", "status": "pending", "blockedBy": [13]},
{"id": 21, "subject": "T14: BundleExporter.ExportAsync", "status": "pending", "blockedBy": [18, 19]},
{"id": 22, "subject": "T15: BundleImporter.LoadAsync", "status": "pending", "blockedBy": [18, 20]},
{"id": 23, "subject": "T16: BundleImporter.PreviewAsync (diff engine)", "status": "pending", "blockedBy": [22]},
{"id": 24, "subject": "T17: BundleImporter.ApplyAsync (transactional)", "status": "pending", "blockedBy": [12, 23]},
{"id": 25, "subject": "T18: Host registration + appsettings binding", "status": "pending", "blockedBy": [24]},
{"id": 26, "subject": "T19: TreeView checkbox-selection mode", "status": "pending"},
{"id": 27, "subject": "T20: TemplateFolderTree wrapper + Templates.razor refactor", "status": "pending", "blockedBy": [26]},
{"id": 28, "subject": "T21: TransportExport.razor wizard", "status": "pending", "blockedBy": [21, 27]},
{"id": 29, "subject": "T22: TransportImport.razor wizard", "status": "pending", "blockedBy": [24, 27]},
{"id": 30, "subject": "T23: NavMenu Export/Import entries", "status": "pending", "blockedBy": [28, 29]},
{"id": 31, "subject": "T24: Audit log Bundle Import filter", "status": "pending", "blockedBy": [9]},
{"id": 32, "subject": "T25: Integration round-trip test", "status": "pending", "blockedBy": [24]},
{"id": 33, "subject": "T26: Integration conflict + rollback tests", "status": "pending", "blockedBy": [24]},
{"id": 34, "subject": "T27: Component-Transport.md design doc", "status": "pending"},
{"id": 35, "subject": "T28: README + cross-reference updates", "status": "pending"},
{"id": 36, "subject": "T29: Manual cluster verification checklist", "status": "pending", "blockedBy": [25, 29, 30, 31, 32, 33, 34, 35]}
],
"lastUpdated": "2026-05-24T00:00:00Z"
}