# QuickFIX/J explicit JVM thread placement

2026-10-12. A separate diagnostic for the
[full-bench plan](../../../docs/bench/PLAN_FULL_BENCH.md), using the unchanged
default canonical v2 driver and six stock SDK JARs.

## Placement and scope

An external wrapper observes only its own JVM child's threads and records
every affinity change. Inside the existing disjoint endpoint masks, it puts
the main application thread on the first CPU, MINA processors on the second,
the QuickFIX/J message processor on the third, and remaining threads on the
fourth. Server CPUs are 10–13 and client CPUs are 14–17. It refuses a thread
whose previous affinity escapes the endpoint mask. The wrapper itself
inherits that mask and polls every two milliseconds; this diagnostic includes
that monitoring cost. It forwards termination and reaps its child.

The wrapper SHA-256 is
`c89494fe175e0af4abed02b79d844414206a80246bf80b2973d2d462535487c3`.
The unchanged 805-file driver source inventory is
`uncommitted-quickfixj-canonical-f71779e072b99eda4efb58c286f3984981f141cd385b5408785627b5cd40521e`.
Source, classes, launcher, dictionary and dependencies are verified unchanged.
There is no new compilation, SDK patch or default configuration change.

## Actual HP results

Twelve functional pairs pass complete original-wire, owner and administration
audits, including zero and repeated warmups. A high-priority exclusive lease
then completes twelve full localhost pairs: 1,000 excluded warmups, 10,000
measured cycles and a 10,000/s offer. All complete fixtures and owner folds
pass, retaining 120,000 primary/delay samples and 330,000 application frames
per peer in the full cohort.

| Flow | Achieved cycles/s across three runs | Failed timing gates |
|---|---:|---|
| NOS/ER | 4,626–4,784 | rate, delay, full stability |
| MD | 3,809–3,870 | rate, delay, full stability |
| Mixed | 2,276–2,359 | rate, delay |
| Tick | 4,460–4,607 | rate, delay |

The unchanged independent reader reproduces all twelve complete receipts,
raw quantiles/extrema and failed decisions exactly. Original bytes/modes and
reader sources remain unchanged, with no new sockets. Forty-eight retained
affinity logs cover both peers of all 24 actual pairs and prove successful
child exits and placement within the original masks.

Thread placement improves some rates and percentiles over the earlier
default cohort, but still fails every flow's required rate/delay gates.
These measurements remain localhost diagnostics. No physical Stage 5 result,
historical grade or public comparison is promoted.

## Immutable retention

[Import](evidence/quickfixj-canonical-thread-affinity-20261012/import-receipt.json)
and [seal](evidence/quickfixj-canonical-thread-affinity-20261012/retention-seal.json)
retain **398 files / 177,549,980 bytes**, seal SHA-256
`e96863f4ccba428bd18a7ca222973cf120cfe0a7ccf00aaf628e2d9090b7e2fd`.
The supplement includes the exact wrapper, helpers, source/runtime manifests,
all original samples/frames, process logs, independent replay and 48 affinity
logs. Across functional and full cohorts it retains 120,240 primary/delay
samples and 330,700 application frames per peer. Both host copies verify the
sealed originals.

## Migration-report regression repaired

The canonical session and capture classes belong to the migration reports'
default source subject. Their addition increased the scanned Java files from
five to seven and the combined source occurrences from 141 to 151, including
16 autofix and 129 scaffold occurrences. The pinned inventory assertions now
reflect that subject. All 25 focused constructor/readiness self-tests pass;
the existing constructor classifications and executable patch checks remain
asserted.
