{ "planPath": "docs/plans/2026-08-06-clusterclient-to-grpc.md", "executionModel": "opus-subagents; sequential within a worktree, 1A and 1B concurrent in separate worktrees (git worktree add ../OtOpcUa-1B feat/grpc-central-ack); 1A merges first, 1B rebases; stop at each phase DoD (PR/merge user-owned)", "worktrees": {}, "tasks": [ { "id": 0, "subject": "Task 0.1: mesh_transport.proto + contract lock", "phase": "0", "branch": "feat/grpc-phase0-contract-auth", "classification": "standard", "parallelizableWith": [ "0.3 (batch, same agent)" ], "status": "completed", "commit": "c0ccfa27", "review": "spec ✅ + code ✅" }, { "id": 1, "subject": "Task 0.2: DTO mapper + round-trip goldens", "phase": "0", "branch": "feat/grpc-phase0-contract-auth", "classification": "high-risk", "parallelizableWith": [], "status": "completed", "blockedBy": [ 0 ], "commit": "545413a8", "review": "spec ✅ + code ✅ (serial)" }, { "id": 2, "subject": "Task 0.3: MeshTransportOptions + validators + SplitTopology relaxation", "phase": "0", "branch": "feat/grpc-phase0-contract-auth", "classification": "standard", "parallelizableWith": [ "0.1 (batch, same agent)" ], "status": "completed", "commit": "aa21f61f", "review": "spec ✅ + code ✅" }, { "id": 3, "subject": "Task 0.4: node-side MeshCommandAuthInterceptor", "phase": "0", "branch": "feat/grpc-phase0-contract-auth", "classification": "high-risk", "parallelizableWith": [ "0.5 (batch, same agent)" ], "status": "completed", "blockedBy": [ 2 ], "commit": "fbda015c + fixes 24e55d33/a4631410", "review": "spec ✅ + code ✅ (opus, fix loop closed)" }, { "id": 4, "subject": "Task 0.5: IMeshPskProvider + CentralCommandAuthInterceptor", "phase": "0", "branch": "feat/grpc-phase0-contract-auth", "classification": "high-risk", "parallelizableWith": [ "0.4 (batch, same agent)" ], "status": "completed", "blockedBy": [ 2 ], "commit": "68a416e4 + fixes 24e55d33/a4631410", "review": "spec ✅ + code ✅ (opus, fix loop closed); 4 items gated on Phase 1A — see tracking §Phase 1A security register" }, { "id": 5, "subject": "Task 0.6: rig config + FleetStatus issue + docs stub + Phase 0 gate", "phase": "0", "branch": "feat/grpc-phase0-contract-auth", "classification": "small", "parallelizableWith": [], "status": "completed", "blockedBy": [ 0, 1, 2, 3, 4 ], "commit": "23555ed0", "review": "code ✅", "gate": "PASS 4/4; issues #542 #543 filed" }, { "id": 6, "subject": "Task 1A.1: NodeCommandGrpcService on the telemetry listener", "phase": "1A", "branch": "feat/grpc-node-command", "classification": "standard", "parallelizableWith": [ "1B.1 (other worktree)" ], "status": "completed", "blockedBy": [ 5 ], "commit": "64774652", "review": "spec ✅ + code ✅" }, { "id": 7, "subject": "Task 1A.2: MeshGrpcCommandDialer + third branch in CentralCommunicationActor (+ security register items 1-2)", "phase": "1A", "branch": "feat/grpc-node-command", "classification": "high-risk", "parallelizableWith": [ "1B.2 (other worktree)" ], "status": "completed", "blockedBy": [ 6 ], "commit": "14d21496+6a862011 + fixes 48dc2120/86633f14", "review": "spec ✅ + code ✅ (opus; I-2 fixed via gate-follows-endpoint decision)" }, { "id": 8, "subject": "Task 1A.3: 1A live gate (central pair flipped, rig-only, reverted)", "phase": "1A", "branch": "feat/grpc-node-command", "classification": "small", "parallelizableWith": [], "status": "completed", "blockedBy": [ 7 ], "commit": "gate records 410c2e29/e3a0ddbc; boot fixes c0475f2d/e54883a8", "gate": "run 1 FAIL (defect 4) -> run 2 PASS 8/8; issues #544 #545 #546 filed" }, { "id": 9, "subject": "Task 1B.1: CentralCommandGrpcService + admin validator rule", "phase": "1B", "branch": "feat/grpc-central-ack", "classification": "standard", "parallelizableWith": [ "1A.1 (other worktree)" ], "status": "completed", "blockedBy": [ 5 ], "commit": "14dd07d2 (rebased 7e7df337)", "review": "spec ✅ + code ✅" }, { "id": 10, "subject": "Task 1B.2: GrpcApplyAckSender + node-side wiring", "phase": "1B", "branch": "feat/grpc-central-ack", "classification": "high-risk", "parallelizableWith": [ "1A.2 (other worktree)" ], "status": "completed", "blockedBy": [ 9 ], "commit": "a5a789d4 + fixes e54711a2/4d607575 (rebased 308c6aaa/667639e6/07bc1878)", "review": "spec ✅ + code ✅ (opus, serial; 1 Critical fixed: per-endpoint deadline; fix loop closed)" }, { "id": 11, "subject": "Task 1B.3: 1B live gate (site-a flipped, rig-only, reverted; rebase on 1A first)", "phase": "1B", "branch": "feat/grpc-central-ack", "classification": "small", "parallelizableWith": [], "status": "completed", "blockedBy": [ 8, 10 ], "commit": "gate record a397cdad (rebase fixup 4a2a3d3a)", "gate": "PASS 7/7 incl. 4b hang drill (~10s failover, per-endpoint deadline proven live)" }, { "id": 12, "subject": "Phase 2: baseline reproduction + full-rig cutover + soak + kill drills", "phase": "2", "branch": "(rig commit)", "classification": "high-risk", "parallelizableWith": [], "status": "completed", "blockedBy": [ 8, 11, 16 ], "commit": "caf2eec6 (cutover) + gate records 1bb3a937/bcc91268/eaf14e01+final; role-scoping pin 2e06dfe5+027f0403", "gate": "PASS 8/8 + baseline reproduced + PSK negatives; soak 135min 14/14 cycles denied=0/unauth=0; full suite exit 0 on cutover SHA", "note": "Targeted-test policy applies (see plan Phase 2 header): per-task runs targeted; ONE full-suite run at the phase DoD." }, { "id": 13, "subject": "Task 3.1: delete ClusterClient (code + HOCON + config + tests, ordered)", "phase": "3", "branch": "feat/grpc-phase3-deletion", "classification": "high-risk", "parallelizableWith": [], "status": "completed", "blockedBy": [ 12 ], "commit": "0db40a5e..4d2dfb5b (7 steps) + review fix cd713557", "review": "spec ✅ (all KEEPs verified, boundary assert falsifiable) + code ✅ Approved (1 Important fixed: dead MeshPaths full-path constants collapsed)", "note": "Grep-gates clean: CentralContactPoints=0; clusterclient|receptionist = historical/fail-closed mentions only. MeshClusterClientBoundaryTests deleted in step 1 (compile ripple), replacement MeshGrpcBoundaryTests landed step 7 as planned; MeshRouterDispatchTests needed no change (mode-agnostic); MeshCommActorPathTests reshaped not retired." }, { "id": 14, "subject": "Task 3.2: docs sweep (Configuration/Redundancy/Telemetry/CLAUDE.md + scadaproj index)", "phase": "3", "branch": "feat/grpc-phase3-deletion", "classification": "small", "parallelizableWith": [], "status": "completed", "blockedBy": [ 13 ], "commit": "406b1ae5 + review fixes 8e25ed55; scadaproj index 0e416ca on scadaproj main, pushed", "review": "docs-accuracy ✅ Approved (every key/port/behavior/merge-state claim verified against source; 2 pre-existing Minor stalenesses fixed)" }, { "id": 15, "subject": "Phase 4: terminal live gate on post-deletion image (8 checks, provenance-guarded)", "phase": "4", "branch": "(master)", "classification": "high-risk", "parallelizableWith": [], "status": "completed", "completionNotes": "Gate PASSED 8/8 on master @ 0b194003 (provenance-guarded post-deletion image); record d0ac6fc5 — ClusterClient-to-gRPC program CLOSED. Status corrected from pending 2026-08-07 (truth sweep).", "blockedBy": [ 14 ] }, { "id": 16, "subject": "Task 2.0 (MUST FIX): PreStart-race logging honest — quiet on heal, loud on permanent absence", "phase": "2", "branch": "(master, post-1B-merge, pre-flip)", "classification": "small", "parallelizableWith": [], "status": "completed", "blockedBy": [ 8, 11 ], "commit": "a94eb8a3 + review fixes d7c9ead6", "review": "code ✅ (sonnet; 1 Important fixed: non-vacuous once-per-incarnation pin; re-review APPROVED)", "note": "Both gates: race fires ~every admin boot, two FALSE Errors; soak error-grep impossible without this. Targeted tests only (ControlPlaneStarterOrderTests + CentralCommunicationActorTests)." } ], "lastUpdated": "2026-08-06" }