# Non-analog tag create over 2020 WCF — GATED (HCAL R1.13) **Status: ⛔ bounded out (2026-06-21). No non-analog (string / discrete / wide-integer) tag-create path is reachable on 2020 — the native managed client rejects every non-analog type *client-side*, before any WCF op, so there is no wire format to capture and nothing to implement against.** `EnsureTagAsync` stays analog-only (Float, Double, Int2, UInt2, Int4, UInt4); unsupported types throw `ProtocolEvidenceMissingException` from `HistorianTagWriteProtocol.GetAnalogDataTypeCode`. ## What R1.13 asked for Create string / discrete (non-analog) tags via `History.EnsureTags`, with a distinct `CTagMetadata` variant. The roadmap flagged it "⚠ native AddTag rejected some types — confirm server path first; may be GATED." ## Findings (live-probed against the local 2020 Historian) 1. **No discrete/boolean data type exists.** The native `ArchestrA.HistorianDataType` enum (`current/aahClientManaged.dll`, dumped via `enum-dump`) has exactly 12 members: `Int1, Int2, UInt2, Int4, UInt4, Float, Double, SingleByteString, DoubleByteString, Event, Structure`. There is no `Discrete`/`Boolean`, and no `Int8`/`UInt8`/`UInt1`/`Guid`/`FileTime` (those are SDK-only extensions in `Models/HistorianDataType`, recovered from the C++ `CDataType` predicate IL — they are not settable on the managed `HistorianTag`). 2. **Tag type is data-type-derived, not separately settable.** `ArchestrA.HistorianTag` (`--dump-type-members`) has **no** `TagType` property — only `TagDataType`. It does carry the discrete/string-shaped fields (`MessageOn`/`MessageOff`, `RolloverValue`, dead-band/interpolation), and the type exposes `ValidateAnalog*`, `ValidateDiscreteGeneralProperties`, and `ValidateDiscreteAndStringStorageProperties` — but the analog-vs-discrete-vs-string decision is made internally from the data type, with no way to request "discrete." 3. **Native AddTag rejects every non-analog type client-side.** Driving the native `HistorianAccess.AddTag(HistorianTag, …)` (harness `write` scenario, `--write-data-type`) against the live server: | Data type | AddTag.Success | ErrorCode | ErrorType | |---|---|---|---| | SingleByteString | **false** | ValidationFailed | CustomError | | DoubleByteString | **false** | ValidationFailed | CustomError | | Int1 | **false** | ValidationFailed | CustomError | | Int8 / UInt8 | n/a | *not in the native enum* | — | | Float (control) | true | Success | — | The error — `ErrorType=CustomError`, `ErrorCode=ValidationFailed`, `ErrorDescription="Transaction validation failed"` — is raised by the client's own `Validate*` chain **before any WCF message is sent** (the wrapper even auto-populates discrete defaults `MessageOn=ON`/`MessageOff=OFF`, then fails validation). So the native client never emits a non-analog `EnsT2`/`AddTag` request. ## Why it's not deliverable here Because the native client refuses non-analog types client-side, **no wire request exists to reverse-engineer** — there is no captured `CTagMetadata` variant for string or discrete tags, and the SDK does not guess wire bytes. The rejection is not string-specific: `Int1` (a non-string integer outside the analog set `{Float, Double, Int2, UInt2, Int4, UInt4}`) fails identically, so the boundary is "the analog set" rather than "strings only." Creating string/discrete tags on 2020 evidently goes through a different subsystem (e.g. the configuration editor / SQL config path), not this client's `AddTag`. R1.13 is closed as GATED, consistent with the mission note that these types "fail at native AddTag — likely require a different path and are intentionally not supported." ## Probe commands (read-only / sandbox-guarded) ``` dotnet run --project tools\AVEVA.Historian.ReverseEngineering -- enum-dump current\aahClientManaged.dll HistorianDataType dotnet run --project tools\AVEVA.Historian.ReverseEngineering -- dnlib-method current\aahClientManaged.dll HistorianTag.ValidateDataType # native AddTag probe (sandbox tag must start with RetestSdkWrite; --write-skip-add-value avoids the blocked value path): dotnet run --project tools\AVEVA.Historian.NativeTraceHarness -- --scenario write --server-name localhost --tcp-port 32568 \ --write-sandbox-tag RetestSdkWriteNADoubleByteString --write-data-type DoubleByteString --write-skip-add-value ```