Spec 047 §14 Phase 1 exit gate item 3 requires the external assembly to
publish with PublishTrimmed=true and IsAotCompatible=true with zero
new trim/AOT warnings beyond the Reactor.dll baseline, and macros
L13 (SplitLibrary_MixedTree) and L14 (SplitLibrary_MixedTree_AOT)
must run on both Phase 0 baseline machines.
Deferred for execution on the baseline machines. The code lands in
this PR; the publish + macro runs land in a follow-up PR run on the
Phase 0 baseline hardware (LAPTOP-4MEP83VI ARM64-native and
CPC-ander-YTZ3O x64-native — see baseline-results/machines.md).
tests/external_proof/Reactor.External.TestControl/Reactor.External.TestControl.csprojhas<PublishTrimmed>true</PublishTrimmed>and<IsAotCompatible>true</IsAotCompatible>set. Per the per-csproj report:"No conflict observed at compile/test time; the 1.17 publish gate will exercise these end-to-end."
MarqueeControl.csissealed partialper CsWinRT1028 guidance, which is the right call for a WinRT-ABI-projected type in an AOT-compatible library.
# On each baseline machine:
dotnet publish tests/external_proof/Reactor.External.TestControl/Reactor.External.TestControl.csproj \
-c Release -r win-x64 -p:PublishAot=true \
-p:PublishTrimmed=true \
> docs/specs/047/phase1-results/<machine>/<date>/aot-publish-log.txt 2>&1
Diff the warning count against
docs/specs/047/baseline-results/<machine>/trim-warnings-count.txt
(populated during the Phase 0 baseline runs).
Hard fail condition: any IL2xxx or IL3xxx warning that does not appear in the baseline log.
L13 (SplitLibrary_MixedTree, JIT) and L14 (SplitLibrary_MixedTree_AOT,
AOT-published) are listed in spec §15.4. The scenarios mount a tree with
≥ 50% external-assembly element types (using MarqueeElement from
Reactor.External.TestControl) and measure per-element cost.
The implementation pattern follows the existing macros under
tests/stress_perf/. The relevant new scaffolds are:
tests/stress_perf/StressPerf.SplitLibrary(new) — drives the mixed-tree scenario across Direct / ReactorToday / ReactorV2 variants.tests/stress_perf/StressPerf.SplitLibrary.Aot(new) — Native-AOT publish profile of the above.
Both are stubbed in this PR: the projects exist (or will, in the 1.18 macro catch-up PR) with shared scenario code; the actual run + JSON-Lines output happens on baseline hardware.
Per spec §14 Phase 1 exit gate item 3 + the L13 condition in the task file:
- AOT publish (L14): zero new warnings vs Reactor.dll baseline.
- L13 vs all-in-core: ≤ +10% per-element cost vs the equivalent tree built entirely from in-core element types.
The per-baseline-machine publish + macro runs require:
- Physical / VM access to the named hardware (
LAPTOP-4MEP83VI,CPC-ander-YTZ3O). - The environment isolation runbook from spec §15.5 (foregrounded windows per stress_perf window throttling, AC power, fixed refresh rate, no background load).
- Multi-run aggregation through
tools/spec047-aggregator.
None of these can be faked in CI without first standing up dedicated
baseline runners — that infrastructure is itself Phase 1 work, captured
in docs/specs/047/macro-suite-status.md.