Files
lmxopcua/docs/plans/2026-06-19-followups-batch.md.tasks.json
T

182 lines
10 KiB
JSON

{
"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"
}