Feature-composition corpus V1

September 14, 2026 · View on GitHub

Status: bounded acceptance inventory for issue #103.

Audience: compiler contributors and release reviewers.

Schema: semaprax.feature-composition-corpus.v1.

This is the bounded acceptance inventory for issue #103. A row names a real owning test and the independent facts it preserves. It does not turn a backend/profile that rejects a source shape into execution support, and it does not normalize semantic status, ordered events, values, or live-owner counts away.

The checked inventory in tests/project/standard_library/composition_inventory.rs protects every row below against deletion, duplicate identity, lost module registration, a missing owner test, or a missing document row. The inventory only binds the matrix to its real executable owners; it never replaces those owners' runtime observers with a text scan.

Executable rows

Row identityFinite selectionRequired observationsOwning executable gate
scalar.fixed-status-v115 stable declarationsexact returned values or status domain/code; native O0/O2 and Core Wasm transcript equalitytests/scalar_status_backend_equivalence.rs::native_o0_o2_and_core_wasm_share_exact_scalar_status_results
scalar.view-origin-context-v17: whole/ranged view × if/while/match (6), plus growing range in whileexact scalar value for interpreter, native O0/O2, Core Wasm; every selected case returnedview_ownership_composition::view_ownership_composition_agrees_across_interpreter_native_and_core_wasm
scalar.view-ownership-route-v12: borrowed versus own Bytes transfersame value on interpreter and native O0/O2view_ownership_composition::ownership_route_agrees_across_interpreter_and_native
scalar.view-call-boundary-v18: whole/ranged × direct/forwarded borrow × if/loopexact value and per-case backend agreementview_call_boundary_composition::borrowed_view_call_matrix_agrees_across_interpreter_native_and_core_wasm
scalar.lazy-checked-failure-v12: false && (7 / 0) and `true(7 / 0)`
scalar.seeded-differential-v116 fixed PR seeds; 64 frontend/interpreter sweep; 256 explicitly provisioned campaign seedscanonical source, graph/verification result, exact observations, selected lane command and tool identity; discrepancy report includes seed, source and minimized reproducerdifferential::{fixed_seeds_agree_across_every_available_lane,the_frontend_and_reference_interpreter_agree_on_a_wider_seed_sweep,bounded_campaign_agrees_across_every_available_lane}
project.imported-offset-view-v11 imported std.bytes offset/range fixtureexact value 328, nonzero offset and byte oracle, zero retained Core-Wasm ownersstandard_library::imported_view_composition::imported_std_bytes_view_composition_agrees_across_project_backends
project.owned-cursor-contract-v11 decode → quote → checked-contract fixture, run twice through entry and test routessticky contract status; native O0/O2 failure; Core-Wasm zero owners and exact drops [3, 2, 1, 6, 5, 4]standard_library::owned_failure_composition::owned_cursor_chain_settles_before_sticky_contract_failure_on_project_backends
generic.result-allocation-rejection-v11 result-allocation injection after two input leavesallocation failure, zero live allocations/handles on all engines; exact input release order [1, 0] on interpreter/Core-Wasmsettlement_corpus::allocation_rejection_order::result_allocation_rejection_preserves_ordered_input_release
generic.boundary-input-v17 base carrier shapes plus every nonterminal trace-injection ordinalzero/one/embedded-NUL/two-leaf/exact-max/over-max-count/over-max-byte input boundaries, sticky status, canonical result bytes, retained trace and live-resource factssettlement_corpus::native_o0_and_o2_agree_with_interpreter_and_wasm_across_the_shared_settlement_corpus

The source rejection rows are distinct from successful execution rows: view_call_boundary_composition::borrowed_view_return_is_rejected_with_stable_diagnostic pins SPX-T264; differential::shadowing_is_rejected_rather_than_generated pins SPX-T209. Neither is counted as support for the rejected shape.

Deterministic replay and mutation controls

The seeded row uses fixed values rather than sampling. A mismatch is rendered by differential/report.rs with the compiler revision/version, tool paths, commands, source, seed, lane classification, and a structure-preserving minimized source. differential/shrink.rs has a fixed predicate budget and the owning test proves that a real divide-by-zero classification survives reduction.

The corpus has independent negative controls: tampered value/failure/abort observations go through the real differential comparator; a wrong Core-Wasm view observation is rejected; the imported Project and owned-cursor Core-Wasm observers reject a perturbed value/drop sequence; the generic allocation row rejects forward release order. The project inventory additionally proves its own duplicate and missing-row checks fail. These controls mutate observed data or test-only expected data, never production compiler code.

Provisioning and bounds

The required Linux ci.yml scalar backend step provisions/arms the fixed scalar and view matrix. The dispatch-only .github/workflows/feature-composition-corpus.yml provisions Rust, clang and Node, asserts those tools exist, sets SEMAPRAX_DIFFERENTIAL_SEEDS=256, and runs the ignored broad campaign with an exact selector and SEMAPRAX_DIFFERENTIAL_REQUIRE_ALL=1. That opt-in requires the exact three generated backend lanes (native O0, native O2, Core Wasm) for every seed; a missing tool or unavailable lane is a failure of that workflow, never parity.

Core-Wasm is deliberately absent from scalar.view-ownership-route-v1: Public Scalar Export Profile V1 rejects non-Value ownership/Bytes transfer in an entire module. There is no admitted per-function byte-view dispatch route to substitute. The exact corpus source is pinned as SPX-W115 by view_ownership_composition::scalar_export_profile_refuses_ownership_transfer_with_spx_w115. Extending that profile is a separate backend/product decision. The native command-line Project fixtures are Unix-only. This inventory makes neither a non-Linux native execution claim nor a hosted-run claim from local results.