# Rust classic mapped/HA store provider restoration — 2026-10-19

## Scope and baseline

The private store companion registered durable FIXP replay, but its classic
mapped journal and HA implementation modules were disconnected after the
physical split. `SessionSettings::store_with_extensions` could describe those
requests without selecting a working private factory.

Baseline source: `5f3d11d4c`. The frozen external regression is
`private/rust/libhft-rust-pro-store/tests/classic_provider.rs`, SHA-256
`d8cfea5146c81888950ade925bca1729c2df1c64357a9a3d902f7e0fa23eeaf7`.
Its actual baseline Cargo command returns 101: **0 passed / 5 failed /
0 ignored**. All five failures report unavailable classic mapped/HA selection.
The same fixture is unchanged in the qualified candidate.

## Implementation and review

`ProStoreProvider` now registers classic FIX factories for `MmapStore` and
`HighAvailability` alongside its existing durable FIXP factory. It selects the
native mapped journal, deferred HA mapped/async-file/QuickFIX stores, and the
corresponding learned-peer wrappers. Explicit registry selection retains the
existing durability settings, byte-identity naming, SubID restrictions, identity
hashing and legacy pathname preference. Implicit `store()` selection remains
unavailable for private stores.

The OSS change makes exactly four existing typed admission methods public:
`FileStore` and `QuickFixFileStore` each expose `validate_options` and
`open_if_unlocked`. Two documentation comments explain deferred validation.
The writer-fence, recovery and error implementations are unchanged. Typed
contention remains distinct from filesystem/recovery failure.

A rustfmt-normalised comparison confirms that all three reconnected classic
implementation bodies are unchanged after adjusting imports. The six private
pathname helpers match their existing OSS counterparts. The archived review
script also reverses the four visibility changes and two comments and requires
the OSS file to match the baseline exactly.

The 56 classic implementation unit tests now compile beside the 13 existing
FIXP implementation tests. Their selected-store fixtures use the OSS-owned
erased store contract. Two sparse replay helpers retain exact event/cancellation
assertions but cannot read dependency-private test counters; their original
counter assertions are preserved under `qualification/classic-store-gates`.
A bounded subprocess additionally checks huge sparse ranges and cancellation
through all four selected HA modes. This run does not measure the dependency's
internal slot-read counts.

The complete-package run also found stale extracted test adapters. Four
integration targets had obsolete `cfg(libhft_pro)` gates/imports; they now run
against the private companion. Sparse wire tests explicitly construct/configure
a session with the selected store. A FIXP injected-wire fixture resets its
public child state, keeping finalization history in the same acceptor owner;
it does not call the engine-private TCP recycling method. Selected FIXP recovery
fixtures sync their files directly because `ReplayStore` has no concrete flush
method; native flush behavior has separate implementation/durable-image tests.
No production lifecycle, configuration, initiator or conformance-runner edit is
included.

## Qualification

Qualified source: `ae49412a79f029c4b2b5bafdb1585fe733059d14`.
Complete private companion on Scan:

| Target group | Passed |
| --- | ---: |
| Native implementation unit tests | 69 |
| Frozen classic provider regressions | 5 |
| Bounded selected HA sparse replay | 1 |
| Configured acceptor contract shared with OSS | 99 |
| Ordered admin/gap-fill contract shared with OSS | 48 |
| Remaining FIXP/native integration targets | 51 |
| **Total** | **273** |

The complete Cargo command returns 0 with zero failed, ignored or filtered
tests. Strict all-target Clippy and warnings-denied Rustdoc also return 0.
All 278 selected source/configuration/documentation hashes match before and
after qualification. Targeted rustfmt, whitespace and OSS export scrub checks
pass. Compilation and tests use one Cargo job/test thread, an out-of-tree
session target, a shared CPU lease, memory/process guard and command deadline.
No heavy build runs on BEELINK2.

## Evidence and remaining work

`~/archive/libhft/rust-classic-store-provider-20261019/` retains the failing
baseline, unchanged frozen regression, intermediate failures, complete passing
logs, commands and toolchain, source snapshot/bundle, before/after hashes,
normalised source review and publication mapping. SHA256SUMS covers the retained
files; copies are verified on the other hosts before scratch is removed.

These results qualify the store companion and manual selected-store session
construction. Historical engine-level fragments under
`qualification/classic-store-gates` remain outside Cargo targets. Automatic
private-store selection by higher-level lifecycle entry points still needs
explicit integration with those owners. The classic mapped journal retains its
existing 32-bit on-disk sequence fields and refuses wider values. This slice
does not claim full Rust parity or a new hardware/network benchmark.
