CLAUDE.md: document cross-platform status
Verified 2026-05-04: - SDK builds on Debian 13 with .NET 10 SDK 10.0.203 - ProbeAsync over RemoteTcpCertificate works from Linux - RemoteTcpIntegrated fails on Linux due to a WCF-level limitation (NetTcpBinding + Windows TcpClientCredentialType is BCL-Windows-only), not a HistorianSspiClient issue - Authenticated reads over the cert path with explicit creds are wired but await live verification Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -89,6 +89,28 @@ End-to-end chain working from a pure managed .NET 10 client: `Hist.GetV → Hist
|
|||||||
|
|
||||||
`EnsureTagAsync` and `DeleteTagAsync` chain follow the same pattern as reads but require Open2 with `NativeIntegratedWriteEnabledConnectionMode = 0x401` (Process | Write | IntegratedSecurity) — the read-path's `0x402` (read-only) makes the server return err 132 `OperationNotEnabled` silently. The analog Float `CTagMetadata` payload is 144 bytes with a leading `0x4E` marker byte and a 2-byte trailer `FE xx` where the second byte is the ApplyScaling flag (`00` for false / `01` for true). The `IHistoryServiceContract2` surface has no `UpdateTags` operation — distinct MinRaw/MaxRaw persistence is achieved entirely by toggling that one byte in the EnsT2 payload, not via a follow-up call. See `docs/reverse-engineering/handoff.md` and the `WriteDiag` env-gated diagnostic helper in `HistorianWcfTagWriteOrchestrator` for capture details.
|
`EnsureTagAsync` and `DeleteTagAsync` chain follow the same pattern as reads but require Open2 with `NativeIntegratedWriteEnabledConnectionMode = 0x401` (Process | Write | IntegratedSecurity) — the read-path's `0x402` (read-only) makes the server return err 132 `OperationNotEnabled` silently. The analog Float `CTagMetadata` payload is 144 bytes with a leading `0x4E` marker byte and a 2-byte trailer `FE xx` where the second byte is the ApplyScaling flag (`00` for false / `01` for true). The `IHistoryServiceContract2` surface has no `UpdateTags` operation — distinct MinRaw/MaxRaw persistence is achieved entirely by toggling that one byte in the EnsT2 payload, not via a follow-up call. See `docs/reverse-engineering/handoff.md` and the `WriteDiag` env-gated diagnostic helper in `HistorianWcfTagWriteOrchestrator` for capture details.
|
||||||
|
|
||||||
|
### Cross-platform status (verified 2026-05-04)
|
||||||
|
|
||||||
|
The SDK builds and runs on Linux (Debian 13, .NET 10 SDK 10.0.203). `HistorianSspiClient` was rewritten on top of `System.Net.Security.NegotiateAuthentication` so the only remaining Windows-only surface is in WCF itself:
|
||||||
|
|
||||||
|
- ✅ **Build** — clean on Linux (no platform-specific compile errors after the
|
||||||
|
P/Invoke removal).
|
||||||
|
- ✅ **`ProbeAsync` over `RemoteTcpCertificate`** from a Debian client
|
||||||
|
(10.100.0.35) against the Windows Historian (10.100.0.48) — TLS handshake
|
||||||
|
succeeds, server returns its version.
|
||||||
|
- ⚠️ **`RemoteTcpIntegrated`** fails on Linux at the WCF transport layer
|
||||||
|
(`SecurityNegotiationException → AuthenticationException`). `NetTcpBinding`
|
||||||
|
with `SecurityMode.Transport` + `TcpClientCredentialType.Windows` requires
|
||||||
|
Windows-only auth code in WCF that isn't ported to .NET on Linux. This is
|
||||||
|
a hard WCF limitation, not a `HistorianSspiClient` issue. The
|
||||||
|
`HistorianWcfBindingFactory.CreateMdasNetNamedPipeBinding` and
|
||||||
|
`CreateMdasNetTcpWindowsBinding` methods carry a `#pragma warning disable
|
||||||
|
CA1416` documenting this.
|
||||||
|
- ⏳ **Authenticated reads over `RemoteTcpCertificate` from Linux** — wired
|
||||||
|
to use NegotiateAuthentication's GSSAPI/NTLM path (`gss-ntlmssp` installed
|
||||||
|
on Debian), but live verification requires an explicit Windows credential
|
||||||
|
(`HISTORIAN_USER` / `HISTORIAN_PASSWORD`) which hasn't been exercised yet.
|
||||||
|
|
||||||
### Remaining gaps
|
### Remaining gaps
|
||||||
|
|
||||||
Smaller, isolated items — none block the production read surface:
|
Smaller, isolated items — none block the production read surface:
|
||||||
|
|||||||
Reference in New Issue
Block a user