0b537b5dec
CLAUDE.md — a new "How a deploy reaches that address space" block under the v3 Batch 4 address-space section. The blanket ChangedRawTags/ChangedUnsReferenceVariables => Rebuild rule is gone, so the doc now names both halves explicitly: what still rebuilds (alarm-bearing raw-tag deltas, raw-tag identity changes, raw container renames/removals, changed equipment/alarms) and what is now surgical (non-alarm attribute deltas, every UnsReferenceDelta). Also records the three semantics that are easy to break by accident: mirror repair rides UnsReferenceVariable's inherited backing fields (omitting a newly-inherited field silently reopens the staleness), a degraded non-rebuild apply deliberately does not advance _lastApplied, and the raw-realm announce gap is no longer neutral now that surgical adds keep subscriptions alive. CLAUDE.md ConfigSource — the RevisionHash == SHA-256(artifact bytes) paragraph is still true and stays; it gains the clause that the blob is gzip-compressed since 2026-08-15 and the hash covers the COMPRESSED bytes, which is precisely why the fetcher, cache and serve path were untouched. docs/Uns.md + docs/Raw.md — one section each on what a deploy now tears down, from the authoring surface's point of view, including the mirror repair semantics (identity-preserving backing edits update in place and keep their MonitoredItems; re-points and effective-name edits remove+recreate that one node). docs/Configuration.md — "Artifact compression (2026-08-15)" under ConfigSource/ ConfigServe: gzip inside the hashed bytes, magic-sniffed on read, pre-upgrade uncompressed rows still parse, plus the two operational facts an operator needs. The first deploy after upgrade re-hashes every revision (same config, new bytes, new RevisionHash) so it is a one-time full re-dispatch rather than a no-op; and rollout is ordered — nodes must run artifact-sniffing code BEFORE central starts emitting compressed blobs, since a pre-upgrade node handed a gzip artifact fails the apply and keeps last-known-good until it is upgraded. Plan doc — a "Follow-ups (recorded, not implemented)" section covering the seven items surfaced during implementation and review: the raw-realm announce gap, the RemoveEquipmentSubtree dangling-inverse-edge exposure, the missing end-to-end test for a degraded remove-bearing apply's ratcheted rebuild, the scripted-alarm thin-plan-ids-against-rich-rows blindness, the absent monotonic dispatch sequence, LocalDb store ordering under concurrent StoreAsync, and threading the in-hand blob through RestoreApplied. tasks.json — all nine tasks completed. Docs only; no source changes.
16 lines
1.1 KiB
JSON
16 lines
1.1 KiB
JSON
{
|
|
"planPath": "docs/plans/2026-08-15-surgical-deploys.md",
|
|
"tasks": [
|
|
{"id": 1, "subject": "Task 1: Direct mode threads the already-read blob", "status": "completed"},
|
|
{"id": 2, "subject": "Task 2: DeploymentArtifact.Open() — parse once", "status": "completed"},
|
|
{"id": 3, "subject": "Task 3: Actors consume Open()", "status": "completed", "blockedBy": [1, 2]},
|
|
{"id": 4, "subject": "Task 4: Classifier — surgical eligibility for raw-tag and UNS-reference deltas", "status": "completed"},
|
|
{"id": 5, "subject": "Task 5: Applier — apply the new surgical deltas", "status": "completed", "blockedBy": [4]},
|
|
{"id": 6, "subject": "Task 6: Delta materialisation", "status": "completed", "blockedBy": [5]},
|
|
{"id": 7, "subject": "Task 7: Blocking I/O off the host mailbox", "status": "completed", "blockedBy": [3]},
|
|
{"id": 8, "subject": "Task 8: Compressed artifact blob", "status": "completed", "blockedBy": [2]},
|
|
{"id": 9, "subject": "Task 9: Full verification + docs", "status": "completed", "blockedBy": [3, 6, 7, 8]}
|
|
],
|
|
"lastUpdated": "2026-08-15T22:30:00Z"
|
|
}
|