docs: mark multi-value (List) attribute feature complete; document DataType.List + ElementDataType in Component-Commons
MV-15 integration checkpoint: full solution builds 0/0; feature-targeted tests green across Commons, TemplateEngine, SiteRuntime, DataConnectionLayer, Communication, Transport, ManagementService, CLI, CentralUI (255 tests).
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
# Structured Multi-Value Attribute — Design
|
# Structured Multi-Value Attribute — Design
|
||||||
|
|
||||||
**Date:** 2026-06-16
|
**Date:** 2026-06-16
|
||||||
**Status:** Approved (brainstorming) — ready for implementation plan
|
**Status:** Implemented (MV-1 … MV-15, branch `feature/multivalue-attribute`) — full solution builds clean; feature-targeted tests green across Commons, TemplateEngine, SiteRuntime, DataConnectionLayer, Communication, Transport, ManagementService, CLI, and CentralUI.
|
||||||
**Branch:** `feature/multivalue-attribute`
|
**Branch:** `feature/multivalue-attribute`
|
||||||
|
|
||||||
## Problem
|
## Problem
|
||||||
|
|||||||
@@ -2,22 +2,23 @@
|
|||||||
"planPath": "docs/plans/2026-06-16-multivalue-attribute.md",
|
"planPath": "docs/plans/2026-06-16-multivalue-attribute.md",
|
||||||
"designDoc": "docs/plans/2026-06-16-multivalue-attribute-design.md",
|
"designDoc": "docs/plans/2026-06-16-multivalue-attribute-design.md",
|
||||||
"branch": "feature/multivalue-attribute",
|
"branch": "feature/multivalue-attribute",
|
||||||
|
"status": "complete",
|
||||||
"tasks": [
|
"tasks": [
|
||||||
{"id": 77, "ref": "MV-1", "subject": "Type model — DataType.List + ElementDataType companion", "class": "standard", "status": "pending"},
|
{"id": 77, "ref": "MV-1", "subject": "Type model — DataType.List + ElementDataType companion", "class": "standard", "status": "completed", "commits": ["70fa0e7"]},
|
||||||
{"id": 78, "ref": "MV-2", "subject": "AttributeValueCodec + tests", "class": "standard", "status": "pending", "blockedBy": [77]},
|
{"id": 78, "ref": "MV-2", "subject": "AttributeValueCodec + tests", "class": "standard", "status": "completed", "commits": ["8bd8079", "492b41f"]},
|
||||||
{"id": 79, "ref": "MV-3", "subject": "EF mapping + idempotent migration", "class": "high-risk", "status": "pending", "blockedBy": [77]},
|
{"id": 79, "ref": "MV-3", "subject": "EF mapping + idempotent migration", "class": "high-risk", "status": "completed", "commits": ["4a4b3d6"]},
|
||||||
{"id": 80, "ref": "MV-4", "subject": "Flatten carries ElementDataType", "class": "small", "status": "pending", "blockedBy": [77]},
|
{"id": 80, "ref": "MV-4", "subject": "Flatten carries ElementDataType", "class": "small", "status": "completed", "commits": ["02aff24", "492b41f"]},
|
||||||
{"id": 81, "ref": "MV-5", "subject": "Semantic validation for List attributes", "class": "standard", "status": "pending", "blockedBy": [77, 78]},
|
{"id": 81, "ref": "MV-5", "subject": "Semantic validation for List attributes", "class": "standard", "status": "completed", "commits": ["872ce2b", "6ef6bab"]},
|
||||||
{"id": 82, "ref": "MV-6", "subject": "Script-accessor encode boundary", "class": "small", "status": "pending", "blockedBy": [78]},
|
{"id": 82, "ref": "MV-6", "subject": "Script-accessor encode boundary", "class": "small", "status": "completed", "commits": ["a1d464b"]},
|
||||||
{"id": 83, "ref": "MV-7", "subject": "InstanceActor decode (load + set + override)", "class": "high-risk", "status": "pending", "blockedBy": [77, 78, 80, 82]},
|
{"id": 83, "ref": "MV-7", "subject": "InstanceActor decode (load + set + override)", "class": "high-risk", "status": "completed", "commits": ["7f97780", "ad6bfc8"]},
|
||||||
{"id": 84, "ref": "MV-8", "subject": "DCL OPC UA array read coercion", "class": "standard", "status": "pending", "blockedBy": [77, 78]},
|
{"id": 84, "ref": "MV-8", "subject": "DCL OPC UA array read coercion", "class": "standard", "status": "completed", "commits": ["4765706", "96e817a"]},
|
||||||
{"id": 85, "ref": "MV-9", "subject": "StreamRelayActor canonical-JSON encode", "class": "small", "status": "pending", "blockedBy": [78]},
|
{"id": 85, "ref": "MV-9", "subject": "StreamRelayActor canonical-JSON encode", "class": "small", "status": "completed", "commits": ["ba414cb"]},
|
||||||
{"id": 86, "ref": "MV-10", "subject": "ManagementActor add/update attribute handlers", "class": "standard", "status": "pending", "blockedBy": [77, 78, 81]},
|
{"id": 86, "ref": "MV-10", "subject": "ManagementActor add/update attribute handlers", "class": "standard", "status": "completed", "commits": ["1525670", "0164f8a"]},
|
||||||
{"id": 87, "ref": "MV-11", "subject": "CLI --element-type + JSON --value", "class": "standard", "status": "pending", "blockedBy": [86]},
|
{"id": 87, "ref": "MV-11", "subject": "CLI --element-type + JSON --value", "class": "standard", "status": "completed", "commits": ["85db457", "100540b"]},
|
||||||
{"id": 88, "ref": "MV-12", "subject": "Transport DTO + importer field", "class": "small", "status": "pending", "blockedBy": [77]},
|
{"id": 88, "ref": "MV-12", "subject": "Transport DTO + importer field", "class": "small", "status": "completed", "commits": ["e7e34b2", "492b41f"]},
|
||||||
{"id": 89, "ref": "MV-13", "subject": "Central UI — TemplateEdit list editor", "class": "standard", "status": "pending", "blockedBy": [86]},
|
{"id": 89, "ref": "MV-13", "subject": "Central UI — TemplateEdit list editor", "class": "standard", "status": "completed", "commits": ["ba7331e", "100540b"]},
|
||||||
{"id": 90, "ref": "MV-14", "subject": "Central UI — InstanceConfigure override list editor", "class": "standard", "status": "pending", "blockedBy": [86]},
|
{"id": 90, "ref": "MV-14", "subject": "Central UI — InstanceConfigure override list editor", "class": "standard", "status": "completed", "commits": ["ae2e1ef", "ca9ee5e"]},
|
||||||
{"id": 91, "ref": "MV-15", "subject": "Integration verification + docs/README sync", "class": "standard", "status": "pending", "blockedBy": [77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90]}
|
{"id": 91, "ref": "MV-15", "subject": "Integration verification + docs/README sync", "class": "standard", "status": "completed"}
|
||||||
],
|
],
|
||||||
"lastUpdated": "2026-06-16"
|
"lastUpdated": "2026-06-16"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ Referenced by all component libraries and the Host.
|
|||||||
|
|
||||||
Commons must define shared primitive and utility types used across multiple components, including but not limited to:
|
Commons must define shared primitive and utility types used across multiple components, including but not limited to:
|
||||||
|
|
||||||
- **`DataType` enum**: Enumerates the data types supported by the system (e.g., Boolean, Int32, Float, Double, String, DateTime, Binary).
|
- **`DataType` enum**: Enumerates the data types supported by the system: Boolean, Int32, Float, Double, String, DateTime, Binary, and **List** (a homogeneous multi-value attribute). A `List` attribute carries a companion `ElementDataType` (one of the scalar types — String, Int32, Float, Double, Boolean, DateTime; not Binary, not nested List) on `TemplateAttribute` / `InstanceAttributeOverride` and the flattened `ResolvedAttribute`. List values are stored and transmitted as a canonical JSON array via the `AttributeValueCodec` helper (scalars keep their historical invariant-culture string form); the `ElementDataType` is fixed by the defining level and cannot be changed on a derived template or instance override.
|
||||||
- **`RetryPolicy`**: A record or immutable class describing retry behavior (max retries, fixed delay between retries).
|
- **`RetryPolicy`**: A record or immutable class describing retry behavior (max retries, fixed delay between retries).
|
||||||
- **`Result<T>`**: A discriminated result type that represents either a success value or an error, enabling consistent error handling across component boundaries without exceptions.
|
- **`Result<T>`**: A discriminated result type that represents either a success value or an error, enabling consistent error handling across component boundaries without exceptions.
|
||||||
- **`InstanceState` enum**: Enabled, Disabled.
|
- **`InstanceState` enum**: Enabled, Disabled.
|
||||||
|
|||||||
Reference in New Issue
Block a user