Files
mxaccess/design
Joseph Doherty 4ed1355761 design/followups: rewrite F2/F3/F10/F11 with concrete next-step recipes
Each remaining open followup now lists the precise "Concrete next
step" to close it — what to capture, where to write the fixture,
which file to edit. Future sessions (or anyone without the project
context) can pick up any of these and execute without guessing.

F2 (NTLM verify_signature server→client):
  Status: awaiting wire-fixture capture. M2 wave 3 (callback exporter)
  is closed under F15, so the path is wired — instrument
  CallbackExporter to hex-dump inbound StatusReceived bytes during a
  live subscribe, save under tests/fixtures/m2-status-frame/, port
  verify_signature mirroring `sign` but using the server-to-client
  sub-keys per [MS-NLMP] §3.4.4, add `subtle = "2"` for constant-time
  MAC compare.

F3 (cross-domain NTLM Type1/2/3 fixture):
  Status: permanently out-of-scope on this host (no second AD
  domain). Documented the lab-environment requirements and the
  capture procedure for whoever provisions the two-domain harness.

F10 (IObjectExporter::ResolveOxid2 opnum 4):
  Status: awaiting capture or .NET helper. Two paths documented —
  extend MxNativeClient.Probe with --probe-resolve-oxid2 OR hand-roll
  the layout from [MS-DCOM] §3.1.2.5.1.4 and validate later.

F11 (IRemUnknown::RemAddRef + RemRelease):
  Status: same shape as F10. Document either probe extension or
  structural port from [MS-DCOM] §3.1.1.5.6 (REMINTERFACEREF[]).

No code changes in this commit — purely sharpening the followup
specs so each one's resolution recipe is self-contained.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 03:18:36 -04:00
..

design/ — Rust port architectural plan

This folder is the design contract for the Rust replacement of AVEVA/Wonderware MXAccess. It is the gap between the .NET reference in src/ and the Rust crates that will be written under a sibling rust/ workspace (per CLAUDE.md).

The folder is structured as a small set of focused documents. Read in order; each builds on the previous.

File Purpose
00-overview.md Mission, two-layer goal, architectural principles, non-goals
10-raw-layer.md Byte-accurate raw MXAccess layer (codec + transport + session)
20-async-layer.md Idiomatic Tokio async layer on top of the raw layer
30-crate-topology.md Cargo workspace, crates, dependencies, build/test commands
40-protocol-invariants.md Bill of materials: IIDs, opnums, envelope/handle bytes
50-error-model.md MxStatus, error types, panic/cancellation policy
60-roadmap.md Milestones M0..M6, validation strategy
70-risks-and-open-questions.md Parity gaps, unproven flows, cross-platform constraints
dependencies.md Cross- and within-milestone parallelism map; agent budget per phase
review.md Adversarial review log (BLOCKER/MAJOR/MINOR/NIT findings, all resolved)
prompt.md /loop driver prompt for autonomous M2M6 execution
followups.md Open / resolved deferred work items; auto-triaged by prompt.md Step 0 (created on first /loop run if missing)

The design is grounded in the .NET reference at src/ and the protocol artifacts in docs/, analysis/, and captures/. Do not introduce protocol behavior in these documents that is not already proven in the reference. When adding a new claim about wire format, cite either:

  • a .cs file path in src/MxNativeCodec/, src/MxNativeClient/, or src/MxAsbClient/, or
  • a docs/*.md spec file, or
  • a captures/0NN-frida-* directory or analysis/frida/*.tsv row.

This folder is documentation, not code. When the Rust workspace is created, the design here is the contract it must satisfy. When evidence in captures/ invalidates a design decision here, update the design first, then the code.

Reading order

  • New contributor: 00 → 30 → 10 → 40 → 20 → 50 → 60 → 70.
  • Protocol question: 40 first, then the relevant section of 10.
  • API question: 20 first, then 50.
  • Planning a milestone: 60 first, cross-reference 70 for blockers.
  • Scheduling concurrent work: dependencies.md for the per-phase parallelism map.
  • Driving M2M6 autonomously via /loop: prompt.md (and the followups.md triage log it maintains).