diff --git a/archreview/plans/R2-07-surgical-pure-adds-plan.md.tasks.json b/archreview/plans/R2-07-surgical-pure-adds-plan.md.tasks.json index 356b451c..6effe9be 100644 --- a/archreview/plans/R2-07-surgical-pure-adds-plan.md.tasks.json +++ b/archreview/plans/R2-07-surgical-pure-adds-plan.md.tasks.json @@ -54,10 +54,11 @@ { "id": "T6", "subject": "Phase 1: MANDATORY live-/run gate on docker-dev (rebuild BOTH centrals; Client.CLI subscribe survives +1-tag deploy; kind=PureAdd rebuild=False) \u2014 Phase 1 shippable boundary", - "status": "pending", + "status": "deferred-live", "blockedBy": [ "T5" - ] + ], + "note": "docker-dev live /run surgical-path; serial heavy pass \u2014 F10b inertness risk, MUST run (subscribe survives +1-tag deploy; central log kind=PureAdd, rebuild=False; new node browsable/Good)." }, { "id": "T7", diff --git a/archreview/plans/STATUS.md b/archreview/plans/STATUS.md index 5d12857e..5b219e85 100644 --- a/archreview/plans/STATUS.md +++ b/archreview/plans/STATUS.md @@ -178,6 +178,8 @@ what the unit leg cannot; (c) migrate the 3 xunit v2 holdouts once Akka ships an | **R2-11** | 01/C-1, 01/P-1 + 05/CONV-2, UNDER-1, UNDER-6 | `r2/11-tagconfig-consolidation` (off `46fedda3`) | first `2e14fe1f` … (24 task commits) | **Code-complete, offline-verified.** **Part 1 (C-1/P-1):** single `TagConfigIntent.Parse` + `DeviceConfigIntent` in Commons replace the four byte-parity TagConfig parse copies (composer/artifact/walker/DraftValidator) — composer now parses once per tag (P-1); a permanent `Runtime.Tests/TagConfigCorpusParityTests` (30-blob corpus) guards compose≡decode; `grep "MUST parse identically" src/` = 0. **Part 2 (CONV-2):** shared strict-capable `TagConfigJson` readers in Core.Abstractions replace the six copy-pasted `ReadEnum`s; all six driver parsers gain `Inspect()` warnings + honour the `writable` key (FOCAS **forced read-only**, 05/UNDER-1); FOCAS equipment tags run the capability-matrix pre-flight (05/UNDER-6); Modbus probe parses the factory DTO shape (`timeoutMs` no longer dropped). New `EquipmentTagConfigInspector` in ControlPlane + `AdminOperationsActor` deploy-gate wiring with `Deployment:TagConfigValidationMode` (**Warn default | Error opt-in**), proven through the actor (F10b consuming test). AdminUI: `writable` checkbox in the six typed editors. **Phase-C follow-up (deferred, recorded here):** flip the runtime parsers to strict (typo'd enum ⇒ `BadNodeIdUnknown` instead of wrong-width `Good`) once fleets have run `Error` mode clean — behavior change deliberately not shipped in this plan. **Deferred (T22/T24):** docker-dev `/run` of one typed editor's Writable checkbox + whole-solution serial sweep. | +| **R2-07 (Phase 1)** | 03/P1 (action #7, surgical pure-adds) | `r2/07-surgical-pure-adds` (off `1a698cbb`) | `bb226f45`… (T1–T6) | **Phase 1 code-complete, offline-verified.** New pure `AddressSpaceChangeClassifier` (Empty/AttributeOnly/PureAdd/PureRemove/AddRemoveMix/Rebuild; first-match-wins, default-closed Rebuild; the F10b tag/vtag surgical-eligibility predicates moved here as `internal static`). `AddressSpaceApplier.Apply` routes by kind: **PureAdd/AttributeOnly skip `RebuildAddressSpace`** (the idempotent Materialise passes create exactly the added nodes; existing subscriptions survive) — PureRemove/AddRemoveMix still full-rebuild until Phases 2/3. Adds are announced via a new `ComputeAddAnnouncements`+`AnnounceAddedNodes` (dedup affected-parent set → existing guard-covered `RaiseNodesAddedModelChange`), fired by `OpcUaPublishActor` after the 4 Materialise passes gated on `!outcome.RebuildCalled`. `MaterialiseAlarmCondition` made idempotent (skip-if-present-and-same-kind ⇒ keeps the condition NodeState alive across a pure-add). Apply log carries `kind={Kind}`. **NO new sink members in Phase 1.** OpcUaServer.Tests 321/321, Runtime.Tests 398/398 (incl. flipped add-rebuild pins → pure-add-no-rebuild + new ordering/rebuild-skips-announce publish-actor tests). **Deferred-live (T5, T6):** the over-the-wire `SubscriptionSurvivalTests` (authored + compiles; NOT run — `*.IntegrationTests` memory constraint) and the docker-dev live-`/run` gate (subscribe survives a +1-tag deploy; central log `kind=PureAdd, rebuild=False`; new node browsable/Good) — MUST run in the serial heavy pass (F10b inertness risk). Phases 2 (pure-removes) + 3 (mixed) still pending. | + **Report anchor drifts to fold into the next report refresh** (from the R2-02 verification pass): (1) `01-core-composition.md` U-6 anchor `DriverResilienceOptions.cs:23-25` → the two bulkhead properties sat at `:23` and `:29` (now deleted); (2) `01-core-composition.md` U-6 anchor