# Provider workload migration and canonical artifact discovery

## Inputs and source changes

The .NET structure owner explicitly released provider-smoke and its four
SDK references in `docs/WIP_AGENT_CLAIMS.md` on 2026-10-03. Fullbench moved the
workload from `engine/dotnet/tools/provider-smoke` to
`bench/dotnet/fixbench/provider-smoke`. Original source pin:
`cb0205b50d1f8ca24ff80cb60d38e00523d87774`, preserved on private origin at
`s/codex-fullbench-provider-move-source-20261004`.

All twelve C# workload files are byte-identical at that pin. Only the project
references change. Both applications use the owning harness props and the
effective, separately supplied `LibhftDotnetSource`. MultiClient records both
source roots as assembly metadata and reads those exact sources. All 501
original assertion lines, test method names and original fixture assertions
are retained. The managed pump's explicit external fixture override remains.

Current build, smoke, parity, conformance and comprehensiveness callers use the
new workload path. PGO/BOLT defaults name the development harness or the sibling
`libhft-benchmarks` of a standalone SDK. Missing training inputs still refuse
before compilation; explicit projects/commands still win. The old SDK manifest
exclusion is removed because the workload no longer lives in that tree.
Sealed root installers, prepared payloads and historical records retain their
old paths and source pins.

Canonical artifact discovery pin:
`63dbba0a2676f1df0f88237b89277cb6787ca403`, preserved at
`s/codex-fullbench-canonical-artifacts-source-20261004`. Lazy source discovery
uses the owning structural layout for check/emit/fold comparison. Twenty-five
original function ASTs and all four generated wire outputs remain identical.
The only provider delta after the qualified workload pin removes a host name
from one comment; the original comment remains under `internal/bench/dotnet`.
No executable workload statement changes in that delta.

## Actual HP qualification

Before each foreground job, host CPU reservations, active compiler/runtime
processes and memory were inspected. Work used high-priority `shared` leases
through `host-cpu-slot`, with a busy job queued through `wait`. These are
functional checks on shared CPUs; they do not satisfy quiet timing admission.

The complete selection contains 760 manifest files plus three templates:
**763 harness files**, with exact Git executable modes. The separately supplied
raw public SDK selection contains **670 files**. Neither source tree has its
own `.git`; an unrelated enclosing Git/development tree contains a refusing
SDK trap. Outputs stay below the session build root.

At the workload pin, HP actually completed:

- Three MSBuild default/explicit/trailing-separator source and output cases.
- Explicit missing SDK refusal.
- All four existing native optimized-build control tests, with zero skips.
- A fresh native SDK build using its normal Makefile: `-j2`, `-O3`,
  `-march=native`, `-mtune=native`, open edition and `WITH_SSL=0`. No library
  relocation flag was supplied; the normal standalone SDK output suffix was
  used. The build exports 203 `hftnet_*` symbols.
- A fresh Release ProviderSmoke build against that SDK.
- **213 MultiClient tests passed, zero failed and zero skipped.** Their
  original TRX result and the generated source metadata are retained.

The read-only continuation used the same source trees and compiled products,
without rebuilding or rerunning the passing suite. It verified the concatenated
MSBuild metadata values, refused an explicit absent native library, then ran
all four native loopback flows: warmup 5, one run, 20 samples each. Every flow
loads `hftnet ABI 69`, passes actual instrument registry calls, retains its raw
binary and reports lost/stale/skipped all zero. These small closed-loop controls
have `stability=INSUFFICIENT`; their percentiles are diagnostic. The loopback
tick task retains its existing combined sink and does not establish the
server-owned full-session tick fixture or physical/report admission.

Both full source manifests were independently checked after execution:
every byte and file mode unchanged, no extra source outputs. The qualified
native library and complete ProviderSmoke runtime are sealed separately in
the private archive. Both source materializations and their build products
were removed only after this verification.

At the canonical artifact pin, a fresh complete 763-file source archive,
without an SDK, completed six actual CLI operations: check, compare, emit-all,
check again, vectors and missing-own-helper refusal. All five extraction-source
comparisons match. The unrelated parent's fixture sentinel remains unchanged;
emit-all preserves all archive bytes and modes. Its source materialization is
also removed after verification.

Local checks additionally pass the 34 publication/max-cap/launcher tests,
68 scenario tests using pytest and four optimized-build tests. Local command
entry mistakes are not counted as failed benchmark samples or passing runs.

## Retained failures and continuations

The first outer checker failed **after** the fresh SDK/provider builds and all
213 tests passed: it searched the generated C# metadata source for an unsplit
long path, while MSBuild correctly emitted concatenated literals. The original
receipt retains `status=fail`. The read-only continuation parses those actual
literals and checks their normalized values; it neither modifies the source
nor reclassifies the original receipt.

The first continuation's lease preflight used `set -e` before a CPU status
command that returns nonzero for a busy pool. It stopped before executing the
checker. The v2 continuation retains that original preflight log and permits
status inspection to return nonzero before using the normal run/wait queue.

The canonical loader's initial local proposal treated any `bench/tools`
directory as shared support; development has a different ordinary tools
directory there. Its exact failed source and traceback are retained. The
corrected loader checks the actual shared support markers and then refuses a
missing own helper. No canonical value, field form or ordering changed.

Earlier local entry mistakes were a unittest invocation without the load-tool
import path, `--check` instead of the canonical `check` subcommand, and running
a pytest file directly despite its `monkeypatch` fixture. Correct entrypoints
pass the checks listed above. A normal preservation-branch push was rejected
after prior rebases; unique immutable source branches were pushed instead,
without force or rewriting another session's code.

## Retention and admission

Original/continuation maps, commands, logs, TRX, source metadata and four raw
sample binaries are under
`evidence/provider-workload-migration-20261004/`. Source tarballs and the
qualified runtime tarball stay in the private archive, not the website record:
`~/archive/libhft/provider-workload-migration-20261004/`.

Both HP and SCAN now retain the sealed 134-file provider-workload archive.
Each shared lease was acquired before archive bytes were sent, and both
hosts verified the same seal
`a66f8f2f0dd3faf47e3185081b4ba532b77a59983a33352e63902edebc5999a8`.
Exact replication receipts and lease logs are retained with this evidence.

The three earlier commercial-boundary capsules also reached SCAN on
2026-10-04. The shared low-priority lease was acquired before sending bytes;
all three archive seals verified. The original interrupted queue log remains
retained, with the separate successful continuation receipt included here.

This checkpoint supplies no Stage 5 promotion, fresh SDK release attestation
or standalone harness release. D/OrdType requires the pending user decision.
Stage 2 and preserved old rankings/raw records are unchanged. QFJ v4 and Artio
v9 still lack confirmed root installation receipts on both DAC hosts. The
website repository can import these diagnostic records; live upload remains
subject to the previously rejected automatic approval review.

## Integration with concurrent main

`original-harness`: 757 of 763 qualified inputs remain byte-identical.
Changed inputs: `cpp/fixbench/tools/open_source_fix_engines/prepare_stage2_dependencies.py`, `cpp/fixbench/tools/open_source_fix_engines/test_stage2_engine_inputs.py`, `docs/MICROBENCH_INPUTS.md`, `dotnet/fixbench/README.md`, `dotnet/fixbench/provider-smoke/Program.cs`, `load/canonical_spec.py`.
`original-sdk`: 666 of 670 qualified inputs remain byte-identical.
Changed inputs: `native/cpp/include/libhft/FixSocket.h`, `native/cpp/include/libhft/FixSocketSsl.h`, `src/Libhft/SessionSettings.cs`, `tests/Libhft.Tests/SessionSettingsQuickFixTests.cs`.
`canonical-harness`: 759 of 763 qualified inputs remain byte-identical.
Changed inputs: `cpp/fixbench/tools/open_source_fix_engines/prepare_stage2_dependencies.py`, `cpp/fixbench/tools/open_source_fix_engines/test_stage2_engine_inputs.py`, `docs/MICROBENCH_INPUTS.md`, `dotnet/fixbench/README.md`.

The source map and every changed hash are retained in `final-integration-inputs.json` in the private archive. New SDK source changes are not qualified by the older compiled runtime. The claims-file conflict was resolved from current main, removing only this session’s fulfilled provider request; other sessions’ retired claims were not restored.

## Fresh matching runtime after integration

Because concurrent main changed four actual SDK inputs (including the two
socket headers), HP performed a fresh matching build at
`28f276e2ed6c58b7e99478ebf34b563ce09a9dfc` (the exact full pin is recorded in
the receipt). The complete 763-file harness and 670-file raw public SDK again
pass all source/output cases, four optimized-build controls, missing SDK and
native refusals, fresh native/managed builds, **213 MultiClient tests with
zero skips**, and four twenty-sample native loopback flows. This run uses a
high-priority shared lease and preserves its own raw binaries and compiled
runtime, independently of the original generation and continuation. Every
source byte/mode remains unchanged and the fresh materialization is removed.
This qualifies these matching inputs functionally, with the same explicit
physical/fixture/timing/release exclusions above. Evidence is in `integrated/`.
