Only the ast_proof leg was unowned: wwdump -a / wwdump_ww -a dump
byte-id plus the ordered dot-over-structlit-over-tname node shape for
a trailing op on a qualified struct literal (inexpressible as a
runtime scenario while the #77 literal-temporary cgen gap holds; the
multilevel row pins the source-order a.b.C tname flatten). The three
build/run scenarios are owned by the r84_qualstruct_* fixtures plus
the test-data-byteid blanket — their vestigial want_exit fields were
already dead in the carrier.
954_tuprecv_run, 956_tuprecv_f64_run and 956_modqualdestr_run shared
one retained dimension: w6c_ww compiles the destructure shape cleanly
AND emits no asserttyped stderr diagnostic (#121 A-narrow / #6a-A
stamp nets) — a channel neither test/lang nor the fixture protocol
has. All 11 rows fold into one observer with the drew-C4 non-vacuity
self-check on the shared predicate. Owned legs cited, not duplicated:
value rows + byte-id ride test/lang/tuprecv_test.ww,
test/lang/tuprecv_f64_test.ww and the test-lang-byteid blanket; the
modqual values + byte-id ride the r956_modqual_* fixtures and
test-data-byteid — those four rows compile the fixture files in place
so probe and fixture cannot drift. Bundled: one file, one concern
(the wwstage stamp-absence dimension).
826_alias_tuple_coerce, 944_alias_accept_run and
944_variant_chain_b95_run all reduced to the same irreducible shape: a
LIVE per-stage asymmetry (probed at HEAD) no symmetric fixture or
@test can host. Ported under the DIVERGE discipline — both sides
asserted loud (826 neg_0: cstage "not assignable to declared pair"
vs wwstage over-accept; #96: cstage runs vs w6c_ww "unsupported
address-of shape"; #277: cstage runs vs ww_ww "deferred #277"), so
a fix on either side fails the row and demands graduation. Owned legs
cited, not duplicated: r826_alias_tuple_* byte rows ride
test-data-byteid, 826's neg_1 went symmetric at HEAD and moves to a
//ww:error fixture per the audit split, the 944 value/reject corpora
live in test/lang/{alias_accept,variant_chain_b95}_test.ww and the
alias_*/vchain_* fixtures. Bundled: one file, one concern (held
divergence pins).
Both carriers were already slim: the r76_def_widen_* byte-id legs are
owned by the test-data-byteid blanket, 783's positive byte rows by the
r78_amp_fn_assign_* fixtures plus that same blanket, and its symmetric
non-tagged rejects by the corpus //ww:error fixtures. The unowned
remainder is three cstage-only loud-rejects (the 760 narrowing def-ref
and 783's two tagged-slot rows); the wwstage over-accepts (no def-init
assignability check; #214 void-variant leniency) are documented at the
site per the residual audit, never asserted as desired — the rows
graduate to //ww:error fixtures when the wwstage side tightens.
Bundled: one file, one concern (cstage-reject pins awaiting wwstage
graduation).
wwiroundtrip pins the @packed re-emit through a real -I tree on both
driver stages (importer-side layout exit 91), strengthened with the
`struct @packed {` needle in the retained sepwork pk2.wwi (a
single-file two-package form emits no .wwi, so the tree is
irreducible). identityreject pins the stage asymmetry as a DIVERGE
row: cstage rejects with "not assignable" (packed is type identity,
harec types.c:621), wwstage builds+runs through the documented
#224/#10 nominal-lossy leniency; a wwstage tighten fails the row and
demands graduation to a //ww:error fixture. The 15 layout/runtime
value rows are fixture-shaped and move to the declarative corpus per
the residual audit port split.
test/misc hosts the residual mixed-shape observers (divergence pins,
stamp/stderr probes, .wwi trees) on testenv, wired into test-compiler
beside the sep/xmod/asm families; its rule declares both full
per-stage toolchains plus the wwdump twins for the coming files.
The 689 port keeps the both-driver run-exit-6 backstop and the
per-stage absolute DATAW row count (linker dedup and byte-id sweeps
are both blind to a symmetric double-emit).
The 18 active rows keep compile + cs==ws byte-id and the tab-anchored
ADDQ $N,SP cleanup markers with both polarities (mem-class rows must
contain their slot's cleanup; the exactly-48B boundary row must not).
The per-row driver build+run legs (incl. the uninit-global zero-box
exit 91) move to the r929 run fixture corpus per the residual audit
port split; the four buildfail rows were already dead here, owned by
the r929_memarg_reject_* fixtures.
The 13 active rows keep compile + cs==ws byte-id and the hidden-RDI
"(BP), DI" presence/absence polarity (present iff sret-class; the two
exactly-32B boundary rows must stay register). The per-row driver
build+run legs move to the r926 run fixture corpus per the residual
audit port split; the seven buildfail rows were already dead here,
owned by the r926_sret_reject_* fixtures.
The five symmetric rows compile their r764_amp_fn_ident_* fixture
sources in place (runtime owned by those fixtures; pre-fix junk-store
still exits 0, so the LEAQ window is the discriminator) and keep the
cs==ws byte-id leg. The cross-module row stays cstage-only pending
#184; its wwstage/byte-id legs graduate with that task.
asmgate_test.ww absorbs 530_w6a_parsenum and 989_datargate_run: the
strtoll-semantics identity rows plus the bare-minus reject against
both assemblers with cross-stage .o byte-identity, and the undefined
DATAR-slot loud reject (no .o written) with the defined-slot
byte-identical ok path. The w6a_ww skip gates drop: the Make target
declares both assemblers.
archive_test.ww absorbs 610_arch and 632_w6l_manyflags: archive
member selectivity through a load-bearing undefined @symbol extern
(link exit 0, run exit 7), and the -L capacity table {1,64,65,100,
128} against both w6l and w6l_ww with an ET_EXEC check per leg. ar is
/usr/bin/ar via runcommand; the junk -L flags are real argv entries
instead of a 16KB shell string.
link_test.ww absorbs 600_w6l and 620_data_link: ET_EXEC on the
trivial pipeline, writable-global read/write runs, the exact
two-PT_LOAD R+X/R+W split, the single-PT_LOAD no-DATAW invariant 992
depends on, and the BSS filesz trim (filesz 1 < memsz 32, loader
zero-fill). Strengthened: the ldd staticness proxy is replaced by a
direct no-PT_INTERP phdr scan.
elfobj_test.ww (test/object, on testenv) absorbs 500_w6a, 510_dataw,
and 520_datar: ELF64 header magic/class over the 4 inline programs,
DATAW section/symbol layout plus the 6-section no-DATAW legacy
invariant 991 depends on, and the DATAR .rela.data reloc through
link and run. Strengthened: the reloc symbol is resolved to
'greeting' (declared but never implemented in the C carrier).
728 -> test/asm/matchdispatch_test.ww. The distinct-CMPQ-tag
collection window over TEXT b.next preserved on both stages.
Strengthened: per-row byte-id legs added -- the C header claimed a
cmp -s its code never ran; all three rows verify green.
719/724/744/746 -> test/asm/dataemit_test.ww. Exact DATAW payload
needles, the produce-window zero-init and MOVQ-load count floors,
and the strdef inline-pair want/anti windows preserved with their
per-row byte-id legs.
720/723/727/743 -> test/asm/callarg_test.ww. Ordered PUSHQ windows,
tag-synth + stack-overflow-cleanup needles and the variadic
eightbyte store-count floors preserved. Strengthened: 720's
4-variant row gains the byte-id leg the C skipped behind the
then-open #22 zero-init gate — #22 landed (724 pins the fix), and
the leg verifies green on both stages.
718/721/730 -> test/asm/sret_test.ww. Frame-size and max--K(BP)
stomp sentinels, line-adjacency sret triangle (hidden-RDI, return-
the-pointer, no-AX-capture, forwarding reload) and narrow-trailing-
field windows preserved, including 718's #15 byte-id gate on the
three-return row. 718's whole-suite ww_ww-executable gate dropped
with the other skip gates (the Make target declares the tools).
726/731/732/733/734/735/745/747 -> test/asm/modshadow_test.ww, one
@test per carrier, every want/anti window, occurrence floor and
byte-id leg preserved. New ASM_WW_TESTS block runs the test/asm
observers under test-compiler beside the residual carriers.
test/xmod/typecheck_test.ww replaces 989_callarg_typecheck.c and
989_tagged_subset_reject.c. Preserved: both -T __wwtests reservation
faces (both stages, diagnostic required), the shape-mismatch collision
(both stages), the cstage-only same-shape #37 pin, and both tagged
leaf-bridge xmod rows. Not ported, owned elsewhere per the audit: the
carriers' twelve ordinary call-arg rows (r989_callarg_* fixtures) and
the three w6c-vs-w6c_ww byte-id rows (test-data-byteid over
r989_tagsubset_{flatten_subset,slice_subset,nested_wrap}).
test/xmod/label_test.ww replaces 706_fnlabel_mangle.c and
750_mklabel_modscoped.c with every assertion preserved (fnlabelmangle
fixture run-112 both stages; three mklabel rows with run exits and
module-qualified label needles). Strengthened: fnlabel adds the
cs==ww sepwork .s byte-id the carrier never asserted.
test/xmod/m1_test.ww replaces 989_m1mangle_run.c and
989_m1usehint_run.c with every assertion preserved (5 tree rows +
2 usehint rows, both stages, plus the leaf_collision byte-id leg;
concat order strengthened from shell glob to byte-sorted listdir).
test/xmod/collide_test.ww replaces 989_fnptrcollide_run.c and
989_barefn_collide_run.c with every assertion preserved (build-reject
both stages; run-exit 9 + exactly-one TEXT main.run/aa.run + cs==ww).
Makefile grows the XMOD_WW_TESTS block mirroring SEP_WW_TESTS, wired
into test-compiler.
944_alias_cgen_b5_run.c -> alias_g73_heapfill (//ww:compile), joining
its migrated alias_* siblings. The carrier's stated fixture blocker
('//ww:compile links') is stale: the COMPILE cell runs the bare
frontend, no link. The live #24 field(SB) deref-read leak enters
DATABYTEID_DIVERGED, upgrading the carrier's silent byte-id waiver
with a graduation tripwire.
839_xmod_nominal_typeeqast.c -> r839_xmod_nominal_match (run-exit 42),
r839_xmod_a6_concrete (run), r839_xmod_incompat_concrete (error
'not assignable'), r839_xmod_distinct_alias (error 'ambiguous
without nominal layout').
r839_xmod_nominal_match enters DATABYTEID_DIVERGED: the carrier waived
byte-id for the pre-existing cross-module tagged-return spill
divergence; the DIVERGED row makes it loud-on-fix instead. The
typeeqast-layer discriminator itself stays with the lib byteid gate
(test/byteid/libbyteid_test.ww), as the carrier documented.
m3sep_test.ww drives the raw w6c/w6a/w6l toolchains (+_ww twins) over
hand-composed //ww:module units splicing produced .wwi bytes: the
bodies==.wwi keystone on both stages per package (mid/root/smid) with
determinism, rule-10 and the value-global DATA guard; the end-to-end
i32 chain (exit 59) with final-exe byte-id; and the #49 str-label /
#53 export-leaf link legs (exits 160/140) with their .s needle
proofs. Each @test re-produces its .wwi cold instead of sharing the
carrier's single scratch dir (same claims, sharper isolation).
septest_test.ww keeps all five rows (pass/fail run-exits, the
userman + badsig @test rejects, the collide_run user-fn-run coexist)
plus the full-sepwork .s/.wwi byte-id sweep and the -T synth
TEXT-main / CALL-test.run presence needles, both driver stages. The
pass/fail run-exit rows overlap package_test ownership but stay:
retiring them would drop audit-listed assertions from this gate. The
attest_* data fixtures remain in test/wcc/data (also consumed by the
911_attest_* carriers).
sepscratch_test.ww pins the #59 build_one_sep scratch ownership on
both driver stages: build -o keeps <stem>.sepwork, `run` leaves no
/tmp/ww_run_<pid> root, and a foreign pre-existing .sepwork is
refused with exit exactly 1, sentinel intact. The C fork/execl pid
capture becomes `sh -c 'echo $$ ...; exec <drv> run ...'` -- exec
keeps the shell's pid and passes the full driver path as argv[0].
seplink_test.ww carries the .a substrate legs (root-as-.o layout, .a
byte-id + 3x determinism, the #31 masked-dup PASS-3 reject with its
non-vacuity flip), the loud dependency-cycle reject with byte-equal
cs/ww stderr, and the w6l/w6l_ww bare-main duplicate-symbol reject
(achievable substring parity per the filed message divergence).
sepimport_test.ww re-hosts the #98 colo srcd-shadow `ww test` gate,
the #99 imported-dep bare-main mangle count, the #23/#30 modfn
coexist byte-id (incl. the cross-layout vbu order pin), and the
#58/#50 scopelookuptype mod-preference rows over the checked-in and
synthesized module trees. slttypepref's ww_ww-absent skip gate is
dropped: the Make target declares both drivers (mangle_test
precedent).
Birth test/sep/ (single-file ww observers on test/testenv, run by the
new SEP_WW_TARGETS pattern rule under test-compiler) with
sepbuild_test.ww: the build_one_sep real-chain gate incl. the
bodies==.wwi keystone recompile, the #69 root-without--I contract, the
#70 aggregate-def .wwi prototypes, and the #95 spread-marker
round-trip. Every carrier assertion has a successor row; the C
cleanup-accounting ledgers collapse into testenv.clean.
Four ww tests carry the last eight native byteid carriers' assertions:
asmwindow (753 convwrap beta/main/alpha order + window polarity, 754
slice stride + negative scale scan, 755 amp-dot-idx four rows, 758
first-CALL-line extraction + tab-framed disp literals, direct
w6c/w6c_ww never ww build), freenoop (930 byte-id strengthened to
per-stream compare + negative 'free' grep), structabi (946 param/ret
MOVSD windows with polarity tables and SEND/RECV agreement), mangle
(989_m1mangle needles + concat byte-id, glob order strengthened to
byte-lexicographic). Dead want/stage_mask row fields documented, not
invented into runtime legs; the w6c_ww-absent skip gates drop because
the Make target declares the tools.
BYTEID_WRAPPER_SOURCES, its bins, and test-native-byteid are deleted —
the native byte/artifact partition is EMPTY (11 -> 0 this session);
docs counts move to 123 carriers.
25 renames (git mv, content untouched). _test.ww is what the package
coordinator's test detection and the sep loader's canonical exclusion
key on; the old *test.ww spellings survived only through the
line-leading-@test compatibility scan. Consumers updated in place:
LIBRARY_TESTS, the libbyteid roster, the 901/974/975/976 carriers that
copy or invoke these files, and the check.c/check.ww + path/ftos
comments that cite them. Closes the open-driver-work migration bullet.
test/byteid/wwi_test.ww carries every assertion of both carriers: the
M2 producer gate (ascii/strings/getopt driver-combined positives with
byte-id + wwdump -a re-parse, the synth decl-kind/type-node sweep with
the #47 @symbol round-trip, the #48 types export-def gate, and the
negative private-nominal leak with both-stage identical reject
diagnostics), plus the #11 wwileaf decl-less-leaf rows (package-line
leaf, cross-stage .wwi byte-id, importer resolution + .s byte-id).
Byteid carriers 10 -> 8; docs counts move; the byteid ww target gains
the wwdump prereq its re-parse legs invoke.
test/testenv (package testenv) is the shared plumbing for ww-native
test drivers — subprocess launch with captured output, file IO, string
search, byte-sorted directory listing, scratch ownership — lifted from
the proven package_test.ww idiom; a utility, not a framework.
test/byteid/libbyteid_test.ww carries every assertion of the retired C
carrier: the 44-entry roster (fixtures + sentinel-guarded import probes
+ the zero-dep root-only build), both-stage sep builds with the
resolved-unit proof, per-package .s concat compare with the empty-concat
guard, the ID/DIVERGE/WWREJECT pin discipline, and the lib/ corpus
completeness scan (negative-verified against a planted un-enrolled
module). Concat order strengthened from shell-glob to explicit
byte-lexicographic. The roster fills by cursor-driven field writes
because append() rejects struct-call-result sources (#34).
Byteid carriers 11 -> 10; docs counts move; test-byteid runs the ww
test via the wwtest/ pattern with WW_TEST_REPO.
One phony target per test file so -jN parallelizes both suites, each
file building in its own persistent workdir so only changed packages
recompile. Tests always execute — the workdir caches builds, never
results. Lang tests keep their exact historical invocation (no -I);
library tests keep -I lib/ww. Warm -j4: test-library 19.0s -> 1.0s,
test-lang 19.8s -> 2.0s.
Cold populate, full-skip rerun, surgical staleness (one package's
artifacts deleted), and a 0-byte .o poison drill each build the w6a
graph through a persistent workdir and must be byte-identical to a
classic fresh-scratch build, on both driver stages, plus the
cross-stage clean compare. Wired into test-all; the inner-loop targets
stay untaxed.
Per-binary source lists corrected against the real import closures
(strace of each cold sep build): every wwstage tool gains
lib/types/types.ww, wwdump_ww/w6c_ww gain lib/math/{floats,math}.ww and
drop the no-longer-imported lib/fmt/fmt.ww, ww_ww drops
lib/strconv/strconv.ww, and WWTEST_SRC gains the strconv split plus
math. Wrapper test binaries link only libwcc.a — the runtime tools they
exec move to the run targets that launch them, so a .ww edit no longer
relinks 111 carrier binaries. test-compiler-smoke declares the
w6a_ww/w6l_ww/ww_ww fleet its WW cell actually drives (latent
fresh-clone gap); test-package replaces the blanket all with its exact
tool set; test-lang/test-library name the cstage subset they invoke.
The five wwstage tools, wwtest, wwfixture, both exec-test binaries, and
the package-test binary move off the per-invocation mktemp workspace to
one persistent ww-build workdir per target under out/wwbuild/, publishing
into out/bin by one atomic mv. Package artifacts now survive across
rebuilds and reuse on exact content identity, so a toolchain-source
touch rebuilds in seconds instead of five from-scratch sep builds; the
per-target split keeps -jN recipe concurrency race-free. Rebuilt
binaries verified byte-identical to the mktemp-path builds for all ten
targets.
Ten of the thirteen were already fully twinned — their runtime rows
migrated in earlier waves (r56_def_*, r79_*, r78_*, r926_*,
r989_m1union_*) and the carriers survived only for a cstage-vs-wwstage
byte-compare the blanket test-data-byteid comparator owns once the
source is a corpus fixture. The other three needed their remaining
inline sources added first: r756_* (4, alias-chain unwrap),
r844_bid_src (size(u64) untyped-int compare), r989_structframe_* (3,
struct-local frame layout). Every new fixture was verified both-stage:
compile exit 0 twice, .s byte-identical, runtime exit as pinned.
The five ww_ww-driver-leg carriers among them (785/786/789/790/
m1union) follow the 815/940/951 precedent: content identity owned by
their corpus twins, driver-leg identity owned by 989_lib_byteid's
sweep. Byte/artifact partition 24 -> 11; carriers 147 -> 134; corpus
pin 1495/2990; the stale 915 sweep figure in the docs corrected to
the true 1,157 non-error count.
Wwstage-driver-leg byte identity gets one owner. The three carriers'
content identity is already blanket-owned by their r815_/r940_/r951_
corpus twins via test-data-byteid; their only non-redundant assertion
was the ww_ww driver leg, which 989_lib_byteid's 43-unit sweep covers
apart from the zero-dep root-only edge — folded in as a new probe row
(44 units). r940 fixture comments re-cited off the retired carrier.
The four graduated pin families byte-compared under test-data-byteid
but their original fixtures masked the miscompiles at runtime (lone
frame slot, dead code path, pointer accident). Add the discriminating
programs as run fixtures: adjacent-element clobber for the 2-byte
deref store, second-variant match dispatch for fn-type dedup, payload
integrity across the tagged widen of a padded struct, and base64
clear() actually zeroing its buffers. Corpus pins move to 1,229
fixtures / 137 run / 766 run-exit / 2,458 cells with the new identity
hash; the data-byteid floor moves to 915.
The N_TFN arm stamped only size and return, so every fn tinfo carried
a nil param chain and typeeq judged any two same-return fn types
equal: tagged-union dedup collapsed (*fn(A) T | *fn(B) T) to a bare
8-byte pointer and match read the pointer word as a tag, falling
through every arm for a real second-variant value. Build the tparam
chain like cstage's N_TFN resolve (bare ... sets the FFI variadic
flag; a Hare T... param wraps to []T with a per-param variadic bit
that typeeq now compares, mirroring cstage type_eq). Graduates the
four r76_typeeq_fn pins; the DATABYTEID_DIVERGED ledger is empty.
cstage types the binding ty_u8; the wwstage single-binder arm peeled
the element only for slice/array iterables, so a str scrutinee fell to
the N_FORRANGE fallback decl and exprtype stamped the binding str.
The stamp-keyed call-arg marshal then pushed the 3-word str ABI for a
1-word scalar, and an uncast compare on the binding was falsely
rejected. Route str through the same synthetic-N_LET binder with a u8
element. Graduates r940_str_forrange_arg.
cgwidentaggedstorebp's struct-ident arms (local and module-global)
counted copy bytes from structinfo.totsize, the round-8 slot width, so
a struct whose natural size is not a multiple of 8 took the MOVQ word
loop and copied the source slot's dirty pad bytes over the zero-fill
the arm itself just established; the width-true tail emitter beneath
was dead code. cstage keys the same copy on su->size. Route both arms
through copysrcnatsize (the stamped-tinfo natural size, #71).
Graduates r71_tagged_return_scratch_mixed.