Phase 1 of docs/plans/write-commands-reverse-engineering.md is purely
discovery — static IL inspection, public-API enumeration, scope
elimination — and produces no DB writes. Phase 2 requires extending
NativeTraceHarness with a write scenario AND explicit operator approval
per the plan's safety rule §1, so it is deferred to a separate session.
Phase 1 findings recorded inline in the plan's status header:
1. §3.4 ModifyData/DeleteData eliminated — no managed wrapper exists.
`methods` returns zero hits for EditValue, ModifyValue, EditData,
DeleteData, ModifyData, OverwriteData. Per the plan's own §3.4
disposition rule, this op is REST/SMC-only.
2. §4.a native serializer tokens identified for Phase 2:
Public managed-wrapper write API in ArchestrA.HistorianAccess:
- AddTag (0x0600619A)
- AddStreamedValue × 3 overloads (0x0600618C/D/E)
- AddNonStreamedValue × 2 overloads (0x0600618F/90)
- DeleteTags (0x060061A4)
- AddRevisionValuesBegin / AddRevisionValue / AddRevisionValuesEnd
/ AddRevisionValues (0x06006175-77, 0x0600617F)
— covers the bulk-modify use case the eliminated ModifyData would
have served. Worth folding into Phase 2 scope.
Native serializers:
- CTagUtil.ConvertTagMetadataToHistorianTag (0x060055CE) — 412 IL
instructions; builds CTagMetadata for analog/discrete/string.
Calls every CTagMetadata accessor we'd need to surface
(Min/MaxRaw, Min/MaxEU, Unit, Message0/1, MaxLength,
IntegralDivisor, DefaultTagRate, RolloverValue) plus all the
CDataType predicates already decoded.
- CHistoryConnectionWCF.AddStreamValuesToHistorian (0x0600404C)
— confirms the on-wire shape matches our existing
IHistoryServiceContract2.AddStreamValues2 declaration.
3. Chicken-and-egg resolved: the first §3.1 EnsT2 test creates the
sandbox tag itself, so no SMC step is needed.
4. Open question §8.6 answered — the wrapper exposes both
AddStreamedValue and AddNonStreamedValue, so the SDK should
eventually surface both real-time and backfill write modes.
Phase 2 next steps recorded inline in the plan as a 5-item executable
checklist (extend harness with --scenario write, capture, decode
EnsT2(analog) + AddS2 bytes, implement public surface, gated live
tests).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
docs/plans/write-commands-reverse-engineering.md (425 lines):
Plan for adding WriteValueAsync (AddS2 stream values), EnsureTags2 for
analog/discrete/string tags, and DelT for sandbox cleanup. Hard safety
rules center on a dedicated sandbox tag gated by env var, time-bounded
writes, SQL ground-truth verification per session, explicit rollback.
Five-step RE workflow mirrors the read/event decode (static IL discovery
-> instrument-wcf-writemessage capture -> instrument-wcf-readmessage
capture -> byte/IL alignment -> managed serializer + golden-byte tests).
Risks call out auth-chain unknowns, parameter-name-mismatch class,
silent-success failure modes, History-vs-Storage service question.
docs/plans/store-forward-cache-reverse-engineering.md (501 lines):
Plan for replacing the synthesized GetStoreForwardStatusAsync with a
real implementation. Architecture investigation already partially
answered via IL inspection during planning: ArchestrA.HistorianAccess.
GetStoreForwardStatus (token 0x06006187) reads an in-process C struct
via calli to mdas_GetStorageStatus, kept current by server-pushed WCF
callbacks (IStatusServiceContract2.SetStoreForwardEvent). CSFConnection.
GetSFPipeName indicates a separate Named Pipe sidecar exists when SF
is configured. Five parallelizable discovery workstreams, six concrete
RE steps with cited tokens, eight risks, eight success criteria.
Both plans deliberately produce no code changes and no captures. They
exist so the next implementer can start with full context.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>