# SCAN DAC full-bench campaign, 2026-09-30

These runs used SCAN's `mlxA` and `mlxB` namespaces across its physical mlx5
loopback DAC (`scan/mlx5-DAC/same-host-netns`). The two endpoints share a host,
memory system, and scheduler. This topology is accepted as Stage 5 for this
campaign by [the operational contract](CONTRACT_OPERATIONAL.md). Each physical
run retained positive TX-counter deltas on both ports and a canonical FIX wire
audit. The [raw evidence](evidence/scan-dac-20260930/) includes manifests,
per-run samples, process logs, wire dumps, counter snapshots, and summaries.

## Report profile: .NET

The report profile offered 10,000 operations/s with 1,000 excluded warmups and
10,000 measured samples in each of three independent process pairs per flow.
Both libhft arms passed every row and the independent
[comparison gate](evidence/scan-dac-20260930/comparison-gate.json).

| Engine | `nos_er` p99 µs | `md` p99 µs | `md_nos_er` p99 µs | `tick_to_trade` p99 µs | Result |
|---|---:|---:|---:|---:|---|
| [.NET Pure](evidence/scan-dac-20260930/dotnet-pure-report/summary.csv) | 33.706 | 40.442 | 69.356 | 28.728 | four `S5 pass` rows |
| [.NET Native](evidence/scan-dac-20260930/dotnet-native-report/summary.csv) | 28.871 | 38.468 | 70.903 | 26.404 | four `S5 pass` rows |

Every control row contains 30,000 measured samples, three canonical audits,
positive physical TX counters, and measured rates of 9,989–9,991/s. The p99
figures above are the summaries' means of the three per-run p99s, not a
pooled-sample percentile. For `tick_to_trade`, the .NET Pure initiator is the
feed/sample owner; the independent gate reads that side's raw series.

| Peer | Physical result | Reason it remains diagnostic |
|---|---|---|
| [QuickFIX/n](evidence/scan-dac-20260930/quickfix-n-report/summary.csv) | Four canonical flows; 30,000 samples each; positive TX deltas | Achieved 725–1,803/s, below the 9,500/s floor; scheduler p99 also fails. |
| [FIX Antenna .NET Core](evidence/scan-dac-20260930/fixantenna-report/summary.csv) | Four canonical flows; 30,000 samples each; positive TX deltas | Achieved 2,217–5,033/s, below the 9,500/s floor; some scheduler gates also fail. |

The comparison gate reports `blocked` and has zero publishable pairs. The
control p99s therefore must not be presented as a .NET competitive ranking.
The host originals are under `~/archive/libhft/fullbench/scan-dotnet-pure/`,
`scan-dotnet-native/`, `scan-quickfix-n/`, and `scan-fixantenna-stage5/` on SCAN.

## Physical-link tiny diagnostics

The [Philadelphia-fast tiny summary](evidence/scan-dac-20260930/philadelphia-fast-tiny/summary.csv)
records 20 measured samples, one run, and 100/s offered rate per flow. All
four wire audits and port-counter checks passed. `nos_er`, `md`, and
`md_nos_er` passed the tiny gate. `tick_to_trade` reached 92.631/s, outside
the ±5% rate gate, so that tiny row failed. No Philadelphia-fast SCAN report
profile was completed in this bundle.

The [native tiny summary](evidence/scan-dac-20260930/native-tiny-summary.csv)
likewise records 20 samples and one run at 100/s. NexusFIX and libtrading
passed all four tiny physical and canonical gates. QuickFIX C++ passed
`tick_to_trade`, but its acceptor crashed with exit code 139 while stopping
after the other three flows. Their samples and wire dumps were retained; the
controller marked those rows `not-audited` and failed, so they cannot be
promoted. The [native report](evidence/scan-dac-20260930/native-tiny-report.md)
has all twelve rows. Every tiny run is `S5 diag` because it has only one short
run, even where its diagnostic gate passed.

The next campaign work is a three-run, 10,000-sample physical report for
Philadelphia-fast and the native engines, a repaired QuickFIX C++ shutdown,
the root-installed Artio and QuickFIX/J DAC adapters, and a high-priority HP
Solarflare repeat. Those runs need their own evidence and gates before any
status promotion.
