{ "planPath": "docs/plans/2026-06-19-followups-batch.md", "designPath": "docs/plans/2026-06-19-followups-batch-design.md", "executionState": "COMPLETE", "base": "master f57aa8fa", "branchAtExecution": "feat/followups-batch", "branchCreatedFrom": "master ad359c5c", "outcome": { "codeTasks": "T1-T6 all complete; 11 commits; full-solution build 0 errors; all touched suites green; per-task + final integration review READY TO MERGE", "liveVerify": "T5 fully verified live (inline New script -> dropdown shows new script label). T4 substantially verified (picker opens, live gateway browse works, edited alarm+scale+isHistorized config commits); final Use-this-address pick-and-assert blocked by the Galaxy object browser's href=# name-links navigating away under browser automation (pre-existing picker quirk, unrelated to the SetFullName change; preservation covered by 6 unit tests).", "findings": "T6 (B1) production already shipped bb59fd4e 2026-06-15 (like #400); delivered missing behavioural test coverage instead. Stray throwaway script SC-ff9c2a3a7044 'vtag-livecheck script' (blank, unbound) left in dev DB during T5 verify; Scripts page has no delete affordance.", "reconsiderGates": "T7 BUILT+SHIPPED (FB-7, master 30c9821f). T8 NOT built (awaiting explicit go-ahead). T9/T10 DONE (FB-9/FB-10, live-verified). T11 PARTIAL: Phase B native-alarm pipeline PROVEN live 2026-06-19 (Galaxy! ConditionId-prefix finding); Phase C HistoryRead + H6 ack->AVEVA + AbLegacy/FOCAS/TwinCAT probes remain AVEVA/hardware/no-local-target deferred." }, "tasks": [ { "id": 1, "ref": "A1", "subject": "OpcUaClient history session-capture-before-gate race fix", "classification": "standard", "status": "completed", "commits": [ "eb328e57", "eede0c92" ], "parallelizableWith": [ 2, 3, 4, 5, 6 ], "group": "A-actionable" }, { "id": 2, "ref": "A2", "subject": "Client.CLI enable/disable command (H4 client path)", "classification": "standard", "status": "completed", "commits": [ "88d5ba45", "f81fa768" ], "parallelizableWith": [ 1, 3, 4, 5, 6 ], "group": "A-actionable" }, { "id": 3, "ref": "A3", "subject": "Cert-audit minor review nits (unreachable fallthrough comment + single PkiStoreRoot read)", "classification": "trivial", "status": "completed", "commits": [ "6223bc97" ], "parallelizableWith": [ 1, 2, 4, 5, 6 ], "group": "A-actionable" }, { "id": 4, "ref": "B2", "subject": "AdminUI: preserve edited alarm fields on Galaxy address re-pick", "classification": "small", "status": "completed", "commits": [ "2dd723e1", "e047af05" ], "liveVerify": "substantial (picker+gateway-browse+config-commit confirmed; final pick-and-assert blocked by object-browser href quirk; preservation unit-tested)", "parallelizableWith": [ 1, 2, 3, 5, 6 ], "group": "B-deferred" }, { "id": 5, "ref": "B3", "subject": "AdminUI: refresh script dropdown label after inline create", "classification": "small", "status": "completed", "commits": [ "da57c307", "d8254630" ], "liveVerify": "PASS (inline New script -> dropdown label = new script)", "parallelizableWith": [ 1, 2, 3, 4, 6 ], "group": "B-deferred" }, { "id": 6, "ref": "B1", "subject": "Write-outcome residuals: Bad-quality blip + AuditWriteUpdateEvent + sync fail-fast", "classification": "standard", "status": "completed", "commits": [ "36eb14e8", "85afb678" ], "note": "production already shipped bb59fd4e 2026-06-15; delivered missing behavioural test coverage + private->internal seam", "parallelizableWith": [ 1, 2, 3, 4, 5 ], "group": "B-deferred" }, { "id": 7, "ref": "B4", "subject": "F10b surgical DataType/IsArray in-place writes", "classification": "standard", "status": "closed", "gate": "RECONSIDER \u2014 previously decided against (dirty); do NOT build without explicit go-ahead", "group": "B-reconsider", "notes": "CLOSED 2026-08-10: decided against, user-confirmed. Rebuild path is correct (just heavy); surgical swap adds a client-visible atomicity window + ModelChangeEvent surface + mandatory live-gate for a rare edit. Re-open trigger: operator complaints about rebuild churn on data-type edits." }, { "id": 8, "ref": "B5", "subject": "Alarm-severity SetSeverity surgical update", "classification": "small", "status": "closed", "gate": "RECONSIDER \u2014 operationally invisible (alarm engine overwrites); do NOT build without explicit go-ahead", "group": "B-reconsider", "notes": "CLOSED 2026-08-10: decided against, user-confirmed. Operationally invisible - the alarm engine overwrites authored severity on first eval (re-verified: OtOpcUaNodeManager still projects engine-computed severity)." }, { "id": 9, "ref": "C1", "subject": "Modbus-Int64 full live authoring on docker-dev", "classification": "verify", "status": "completed", "note": "VERIFIED PASS 2026-08-10 on docker-dev (rig rebuilt to master 481f4343, image parity asserted across all 6 nodes). Authored Int64 raw tag TASK9-INT64 (RawPath pymodbus/plc/Task9Int64, TagConfig region=HoldingRegisters address=200 dataType=Int64 BigEndian) via ConfigDb + headless deploy API; deployment b4d7c8be sealed (Status=2). Node advertises DataType i=8 (Int64), ValueRank -1, Good, on BOTH :4840 and :4841; value 347340207162261544 is the exact BigEndian decode of HR200-203=(1234,20,30,40). Value-change propagation proven by driving HR203 via FC06 (observed via subscribe on both centrals; registers restored after). Fixture caveat: the standard profile has NO naturally-churning 4-register span (HR100 is isolated; spans over it return ILLEGAL DATA ADDRESS), so churn was externally driven. No product gap. Tag row left in place, deployed and serving, consistent with prior gate rows.", "group": "C-verify" }, { "id": 10, "ref": "C2", "subject": "S7 + AbCip Test-Connect probe happy-path live-verify", "classification": "verify", "status": "completed", "note": "VERIFIED PASS 2026-08-10: DriverProbeHandshakeE2eTests 12/12 passed, 0 skipped (S7_Green_AgainstSim, AbCip_Green_AgainstSim with 'CIP session OK' proving a real authored-tag read, AbCip_WithNoAuthoredTags_ReportsTheControllerReachable, plus Modbus/OpcUaClient/local-rig/Galaxy legs \u2014 mxaccessgw on 10.100.0.48 happened to be reachable). Correction to the task's premise: skip-gating is pure TCP reachability (DockerFixtureAvailability.IsReachable), NOT env vars, and the checked-in defaults already point at 10.100.0.35 \u2014 runnable from macOS directly; the 'needs Windows-VM fixtures' note was stale. S7 fixture started then removed (net zero); AbCip was already up (5 days) and left as found.", "group": "C-verify" }, { "id": 11, "ref": "C3", "subject": "Device-gated proofs (H6 ack->AVEVA, AbLegacy/TwinCAT/FOCAS probe) - trimmed 2026-08-10", "classification": "blocked", "status": "partial", "note": "Live-assessed 2026-06-19 (gateway 10.100.0.48:5120 reachable from this Mac, so the 'all blocked' label was partly stale). OUTCOMES: (Phase B T9) DONE \u2014 native-alarm PIPELINE proven end-to-end live on docker-dev: authored a Galaxy alarm tag (FullName=Galaxy!TestArea.TestMachine_001.TestAlarm001, alarm{alarmType:OffNormalAlarm,severity:750}) -> Galaxy driver opened the native-alarm subscription (previously-gated path) -> gateway transition materialised Part 9 condition GalaxyNativeAlarm (ns=2;s=EQ-55297329838d/GalaxyNativeAlarm) carrying the EXACT gateway raise time 2026-05-24T16:04:10.856Z, surfaced via ConditionRefresh. KEY FINDING: ConditionId match REQUIRES the 'Galaxy!' source prefix on the authored FullName (without it every transition is silently dropped). Severity 700 = MapSeverity(750) (MediumHigh bucket), not a bug. Net state Inactive/Unacked because the gateway replays weeks-old historical raises -> a fresh Active-state + live /alerts row needs an alarm triggered on the AVEVA side. (Phase C T7) DEFERRED config+data-gated \u2014 confirmed the historized Galaxy node materialises + server HistoryRead path returns GoodNoData/0-values with ServerHistorian.Enabled=false (correct NullHistorianDataSource degrade); live data needs enabling ServerHistorian + Wonderware sidecar on 10.100.0.48 + actual stored history (synthetic ref has none). (H6 ack->AVEVA) DEFERRED \u2014 ack SEND reachable but Galaxy AckMsg is write-only/fire-and-forget; confirming it LANDED needs AVEVA-side observation on 10.100.0.48. (AbLegacy/FOCAS/TwinCAT probe) DEFERRED \u2014 no local sims running + no live-target probe harness; TwinCAT(ADS) genuinely has no rig target. Rig restored (alarm tag removed, Galaxy back to value-only).", "group": "C-blocked", "notes": "Trimmed 2026-08-10: Phase C T7 removed (Wonderware sidecar target retired in the HistorianGateway cutover; HistoryRead-vs-real-AVEVA proven by the cutover live gate read leg + #491 read-back; historization is driver-agnostic so no Galaxy-specific leg remains). Phase B T9 removed (equivalent proof live via dcb0be65 - Part 9 condition + /alerts row end-to-end; already ruled by the 2026-06-18 backlog audit sC). Remaining, genuinely gated: H6 native-ack->AVEVA (needs an ack of a REAL Galaxy native alarm reaching AVEVA event history - the cutover gate proved SendEvent transport, not this composition) and the AbLegacy/TwinCAT/FOCAS probe happy-paths (PLC5/SLC sim, ADS target, CNC+FWLIB)." } ], "lastUpdated": "2026-06-19" }