dohertj2 dohertj2
  • Joined on 2026-02-20
dohertj2 pushed to main at dohertj2/3yearplan 2026-04-17 11:54:48 -04:00
bed8c8e12b Remove equipment protocol survey — driver list confirmed by v2 team
dohertj2 pushed to main at dohertj2/3yearplan 2026-04-17 11:37:02 -04:00
f53a775968 Mark corrections-doc C1 (driver list pre-survey) as RESOLVED — the OtOpcUa team has confirmed all seven v2 drivers (Modbus TCP including DL205, AB CIP, AB Legacy, S7, TwinCAT, FOCAS, OPC UA Client) plus Galaxy/MXAccess by direct knowledge of the equipment estate; the survey is no longer a v2 prerequisite. TwinCAT and AB Legacy specifically called out as committed by known Beckhoff and SLC/MicroLogix legacy installations. Survey may still inform long-tail driver scoping and per-site capacity planning per the handoff's Long-tail drivers section, but the v2 driver list is fixed. Recommends the handoff's "Core library scope is driven by the survey" wording be updated to reflect that the v2.0 core library is pre-committed by direct equipment-estate knowledge, with the survey informing only long-tail driver scoping. Captured as lmxopcua decision #128 (2026-04-17).
dohertj2 pushed to v2 at dohertj2/lmxopcua 2026-04-17 11:36:33 -04:00
2a6c9828e4 Confirm the v2 driver list as fixed (decision #128) and remove the Equipment Protocol Survey from the v2 prerequisites — the seven committed drivers (Modbus TCP including DL205, AB CIP, AB Legacy, S7, TwinCAT, FOCAS, OPC UA Client) plus Galaxy/MXAccess are confirmed by direct knowledge of the equipment estate (TwinCAT and AB Legacy specifically called out by the OtOpcUa team based on known Beckhoff installations and SLC/MicroLogix legacy equipment); the survey may still inform long-tail driver scoping and per-site capacity planning but adding/removing drivers from the v2 implementation list is now out of scope. Phase-1 implementation doc loses the survey row from its Out-of-Scope table.
dohertj2 pushed to v2 at dohertj2/lmxopcua 2026-04-17 11:26:38 -04:00
592fa79e3c Add Phase 0 + Phase 1 detailed implementation plans under docs/v2/implementation/ with a phase-gate model so the work can be verified for compliance to the v2 design as it lands. Three-gate structure per phase (entry / mid / exit) with explicit compliance-check categories: schema compliance (live DB introspected against config-db-schema.md DDL via xUnit), decision compliance (every decision number cited in the phase doc must have at least one code/test citation in the codebase, verified via git grep), visual compliance (Admin UI screenshots reviewed side-by-side against ScadaLink CentralUI's equivalent screens), behavioral compliance (per-phase end-to-end smoke test that always passes at exit, never "known broken fix later"), stability compliance (cross-cutting protections from driver-stability.md wired up and regression-tested for Tier C drivers), and documentation compliance (any deviation from v2 design docs reflected back as decision-log updates with explicit "supersedes" notes). Exit gate requires two-reviewer signoff and an exit-gate-{phase}.md record; silent deviation is the failure mode the gates exist to make impossible to ship. Phase 0 doc covers the mechanical LmxOpcUa → OtOpcUa rename with 9 tasks, 7 compliance checks, and a completion checklist that gates on baseline test count parity. Phase 1 doc covers the largest greenfield phase — 5 work streams (Core.Abstractions, Configuration project with EF Core schema + stored procs + LiteDB cache + generation-diff applier, Core with GenericDriverNodeManager rename + IAddressSpaceBuilder + driver isolation, Server with Microsoft.Extensions.Hosting replacing TopShelf + credential-bound bootstrap, Admin Blazor Server app mirroring ScadaLink CentralUI verbatim with LDAP cookie auth + draft/diff/publish workflow + UNS structure management + equipment CRUD + release-reservation and merge-equipment operator flows) — with task-level acceptance criteria, a 14-step end-to-end smoke test, and decision citation requirements for #1-125. New decisions #126-127 capture the gate model and per-phase doc structure. Cross-references added to plan.md Reference Documents section.
dohertj2 pushed to main at dohertj2/3yearplan 2026-04-17 11:12:42 -04:00
c3587b2efa Update equipment identifier model per v2 hardening addendum
dohertj2 pushed to main at dohertj2/3yearplan 2026-04-17 11:11:39 -04:00
8a6c227dbc Add same-day addendum to OtOpcUa corrections doc noting four v2 design defects an adversarial review surfaced after the corrections doc was filed (one critical: cross-cluster namespace binding, three high: namespace state bypassing publish boundary, ZTag/SAPID rollback-reuse hazard, operator-supplied EquipmentId minting duplicate identities) — all four closed in lmxopcua v2 branch at commit a59ad2e (decisions #122–125). Two of the fixes refine claims this corrections doc made (C4 multi-identifier model: EquipmentId is now system-generated not operator-supplied; D3 ACL location: ExternalIdReservation precedent shows some cross-generation invariants need non-versioned tables) so plan-team awareness matters; the other two (same-cluster namespace invariant, Namespace generation-versioning) are purely internal correctness with no handoff relevance, included for audit trail.
dohertj2 pushed to v2 at dohertj2/lmxopcua 2026-04-17 11:10:26 -04:00
a59ad2e0c6 Harden v2 design against the four findings from the 2026-04-17 Codex adversarial review of the db schema and admin UI: (1) DriverInstance.NamespaceId now enforces a same-cluster invariant in three layers (sp_ValidateDraft cross-table check using the new UX_Namespace_Generation_LogicalId_Cluster composite index, server-side namespace-selection API scoping that prevents bypass via crafted requests, and audit-log entries on cross-cluster attempts) so a draft for cluster A can no longer bind to cluster B's namespace and leak its URI into A's endpoint; (2) the Namespace table moves from cluster-level to generation-versioned with append-only logical-ID identity and locked NamespaceUri/Kind across generations so admins can no longer disable a namespace that a published driver depends on outside the publish/diff/rollback flow, the cluster-create workflow opens an initial draft containing the default namespaces instead of writing namespace rows directly, and the Admin UI Namespaces tab becomes hybrid (read-only over published, click-to-edit opens draft) like the UNS Structure tab; (3) ZTag/SAPID fleet-wide uniqueness moves from per-generation indexes (which silently allow rollback or re-enable to reintroduce duplicates) into a new ExternalIdReservation table that sits outside generation versioning, with sp_PublishGeneration reserving atomically via MERGE under transaction lock so a different EquipmentUuid attempting the same active value rolls the whole publish back, an FleetAdmin-only sp_ReleaseExternalIdReservation as the only path to free a value for reuse with audit trail, and a corresponding Release-reservation operator workflow in the Admin UI; (4) Equipment.EquipmentId is now system-generated as 'EQ-' + first 12 hex chars of EquipmentUuid, never operator-supplied or editable, removed from the Equipment CSV import schema entirely (rows match by EquipmentUuid for updates or create new equipment with auto-generated identifiers when no UUID is supplied), with a new Merge-or-Rebind-equipment operator workflow handling the rare case where two UUIDs need to be reconciled — closing the corruption path where typos and bulk-import renames were minting duplicate identities and breaking downstream UUID-keyed lineage. New decisions #122-125 with explicit "supersedes" notes for the earlier #107 (cluster-level namespace) and #116 (operator-set EquipmentId) frames they revise.
dohertj2 pushed to main at dohertj2/3yearplan 2026-04-17 10:05:09 -04:00
68dbc014da Integrate OtOpcUa v2 implementation corrections into plan
dohertj2 pushed to main at dohertj2/3yearplan 2026-04-17 09:56:10 -04:00
9b2acfe699 Add OtOpcUa implementation corrections (2026-04-17) capturing mismatches between the otopcua-handoff and the v2 design work in lmxopcua/docs/v2/: 2 framing inaccuracies (native-OPC-UA-needs-no-driver, single-endpoint-per-cluster), 3 missing constraints (namespace ACLs not yet planned in the data path, schemas-repo dependencies blocking equipment-class templates, per-node ApplicationUri trust-pinning as a pre-cutover certificate-distribution step), 6 architectural decisions to revisit (driver list committed pre-survey, Tier A/B/C process-isolation model with Galaxy + FOCAS out-of-process, Polly v8+ resilience, 5-identifier equipment model with MachineCode/ZTag/SAPID alongside UUID, missing tier 1/2/3 consumer cutover plan, per-building cluster pattern interactions at Warsaw), 4 resolved TBDs (pilot class = FANUC CNC, schemas-repo format = JSON Schema, ACL location = central config DB co-located with topology, enterprise shortname still unresolved), and 4 new TBDs (UUID-generation authority, System Platform IO Aveva-pattern validation as Year 1/2 research, multi-cluster site addressing at Warsaw, cluster-endpoint mental model). Format follows the handoff's Sending-Corrections-Back protocol (what plan says / what was found / what plan should say).
dohertj2 pushed to main at dohertj2/3yearplan 2026-04-17 09:30:24 -04:00
8428b7c186 Fix ScadaBridge accuracy per design repo review
dohertj2 pushed to main at dohertj2/3yearplan 2026-04-17 09:21:26 -04:00
fc3e19fde1 Add OtOpcUa implementation handoff document
dohertj2 pushed to v2 at dohertj2/lmxopcua 2026-04-17 09:21:09 -04:00
449bc454b7 Ignore .claude/ so per-developer Claude Code settings, runtime lock files (scheduled_tasks.lock), and background-agent transcripts stop appearing in git status — these are local IDE state, not project artifacts.
dohertj2 created branch v2 in dohertj2/lmxopcua 2026-04-17 09:19:22 -04:00
dohertj2 pushed to v2 at dohertj2/lmxopcua 2026-04-17 09:19:22 -04:00
a1e79cdb06 Draft v2 multi-driver planning docs (docs/v2/) so Phase 0–5 work has a complete reference: rename to OtOpcUa, migrate to .NET 10 x64 (Galaxy stays .NET 4.8 x86 out-of-process), add seven new drivers behind composable capability interfaces (Modbus TCP / DL205, AB CIP, AB Legacy, S7, TwinCAT, FOCAS, OPC UA Client), introduce a central MSSQL config DB with cluster-scoped immutable generations and per-node credential binding, deploy as two-node site clusters with non-transparent redundancy and minimal per-node overrides, classify drivers by stability tier (A pure-managed / B wrapped-native / C out-of-process Windows service) with Tier C deep dives for both Galaxy and FOCAS, define per-driver test data sources (libplctag ab_server, Snap7, NModbus in-proc, TwinCAT XAR VM, FOCAS TCP stub plus native FaultShim) plus a 6-axis cross-driver test matrix, and ship a Blazor Server admin UI mirroring ScadaLink CentralUI's Bootstrap 5 / LDAP cookie auth / dark-sidebar look-and-feel — 106 numbered decisions across six docs (plan.md, driver-specs.md, driver-stability.md, test-data-sources.md, config-db-schema.md, admin-ui.md), DRAFT only and intentionally not yet wired to code.
dohertj2 pushed to main at dohertj2/3yearplan 2026-04-17 09:15:35 -04:00
d89c23a659 Add ScadaBridge design repo link (repo name: scadalink-design)
dohertj2 pushed to main at dohertj2/3yearplan 2026-04-17 09:15:02 -04:00
f46a9da0d8 Add links document with LmxOpcUa repo reference
dohertj2 pushed to main at dohertj2/3yearplan 2026-04-17 09:13:52 -04:00
fcd8d24d60 Add README with plan overview, architecture, and document index
dohertj2 created branch main in dohertj2/3yearplan 2026-04-17 09:12:43 -04:00
dohertj2 pushed to main at dohertj2/3yearplan 2026-04-17 09:12:43 -04:00
ec1dfe59e4 Initial commit: 3-year shopfloor IT/OT transformation plan
dohertj2 created repository dohertj2/3yearplan 2026-04-17 09:11:32 -04:00