C3: DelTep extended-property delete — live server-accept test blocked by native single-connection working-set #4
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
The extended-property DELETE (
DelTep) wire format is captured and the serializer isgolden-verified, but there is no live integration test proving the server accepts the delete,
because the SDK's per-service WCF channel cannot reproduce the native single-connection working-set
the server requires. This issue tracks closing that test gap (or formally deciding it stays
unexposed).
Current state — the code IS covered
DelTepinBuff is captured and decoded(
docs/reverse-engineering/wcf-add-tag-extended-properties.md§Delete).…Protocol.SerializeDeleteRequestproduces the exact bytes;WcfTagExtendedPropertyWriteProtocolTestsgolden-verifies it.
HistorianClientdeliberately exposes no public delete to avoid a silently-failing write API.The private scaffolding (
HistorianWcfTagWriteOrchestrator.DeleteTagExtendedPropertiesAsync, thePrimeThenDeletehelper) exists for follow-up.Blocker
The native
DeleteTagExtendedPropertiesByNamegate requires the sameHistorianAccesssessionthat read-synced the property (a per-connection working set); the capture only works via a
cross-session prime trick (
scripts/Capture-DeleteTagExtendedProperties.ps1). Over the SDK'sper-service WCF channels the server returns the "not in working set" rejection, so a live delete is
not accepted — hence no integration test
(
tests/AVEVA.Historian.Client.Tests/HistorianClientIntegrationTests.cs:627–631).What's needed
HistorianAccesssession acrossGetTepByNm→DelTep(reproducing the native working-set), or prove per-service channelsstructurally cannot.
gone) and expose a guarded public delete.
so it is no longer carried as an open "gap."
Acceptance criteria
DelTepround-trip test + a documented public delete surface, or aclosing note in the §Delete doc that per-service channels cannot satisfy the working-set gate (with
the evidence), flipping this from "deferred" to "won't-expose".
References
docs/reverse-engineering/wcf-add-tag-extended-properties.md§Delete (§"Why the SDK delete isserver-blocked", §"the cross-session trick").
tests/AVEVA.Historian.Client.Tests/HistorianClientIntegrationTests.cs:627–631.scripts/Capture-DeleteTagExtendedProperties.ps1,scripts/decode-del-tep-capture.py.pending.mdC3 (the serializer is golden-verified therevia the carried-over vendored test; only this live-accept test is deferred).
https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
Investigation complete — requires transport-level connection multiplexing (deferred by design)
The question "can the SDK reproduce the native single-connection working-set for DelTep?" is now
answered: no, not without transport-level connection multiplexing.
(
WcfTagExtendedPropertyWriteProtocolTests) — byte-identical to the server-accepted native bytes.HistorianAccesssession; itsGetTepByNmseeds a per-connection working set that thesame-connection
DelTepconsults.channel held open across the delete (
HistorianWcfTagWriteOrchestrator.PrimeThenDelete) does notsatisfy the server's per-connection check, which fails with
SErrorException.HistorianClientdeliberately exposes no public delete (avoids a silently-failingwrite API).
Conclusion: a known design limitation, not a protocol-evidence gap. Closing the investigation;
exposing delete would require connection multiplexing (a substantial transport refactor) and can be
reopened as a feature request if wanted. Documented in
docs/reverse-engineering/wcf-add-tag-extended-properties.md §Delete. (HistorianGatewaypending.mdC3 notes the serializer is golden-verified and only the live-accept test is deferred.)
https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii