Promote Kurumajiku as a compiler-owned class TU - #2004
Conversation
✅ PR validation — PassedCommitted merge introduces no reconstruction or attribution regression. Full merge validation
Byte-verified means the range carries Warnings: 5 address range(s) left the byte-verified set while enrolled totals held steady: ov047:0x021111a0-0x021111f0, ov047:0x021111f0-0x02111254, ov047:0x02111254-0x02111268, ov047:0x02111268-0x02111280, ov047:0x02111280-0x021112bc; 4 more function(s) now claim a match that nothing compiles; enroll them in a delinks.txt to have the ROM build check them. Per-file link-check detailAll 1 changed file(s) compile to the ROM byte-for-byte with correct relocation targets.
The private worker commits a test merge, builds the stock ROM profile, compares every executable module, measures matched and source-built code, checks contributor lineage, and verifies affected relocations. The mod profile is opt-in and is not part of this merge gate. |
c0c9353 to
81d2348
Compare
732b017 to
56a2611
Compare
Review: KEEP AND FIX (the content is right; the base is not)Reviewed at The delinks and symbols work is correct, and I verified it against the cartridgeDelinks collapse. The five per-function One entry, marked
So the failure mode this project cannot otherwise self-detect — a range losing The
This PR genuinely needs #2001. That is not just stacking convenience.I did not expect to find this, so it is worth stating plainly. Landed on main as-is, this entry's 200 bytes of data would be counted as source-linked code, and 284 bytes of real Same story for the compile path: Why it cannot land as written1. It is stacked on an orphan. 2. It conflicts with main. The baseline conflict is the dangerous one. This branch carries 1957 entries; main carries 2565. Resolving it whole-file toward this branch drops 608 banked entries — and a shrunken baseline is permissive, so nothing downstream would report it. Union by key, never 3. Three These are the first 4. Standalone landing is a different PR. Under main's tooling those three identities read as What I did not verifyI did not build. Order of operations
Read-only review against the main checkout; no worktree, no build. |
56a2611 to
6a884b2
Compare
81d2348 to
832cc40
Compare
6a884b2 to
ef16a30
Compare
832cc40 to
43243bf
Compare
Gatekeeper re-review — content clean, blocked only on #2001I re-verified this branch independently rather than inheriting the earlier read. No changes are needed to the content. Everything blocking it is mechanical. What I verified
One thing that will be misreadThe live validator comment (updated 16:55, current head) still says "5 address range(s) left the byte-verified set", Landing sequence — unchanged, and the order is forced
One unanswered ask, carried forwardThis branch's Stays a draft until #2001 lands. Nothing for the author to do here except step 1. |
|
Retargeted this PR from Why, and why now: this repo auto-deletes head branches on merge. When #2001 merges, What changed as a side effect: against Nothing here needs action from the author yet. #2001 still has an open blocking review; |
Separability from #2001: measured, and the answer is not separableI wanted to know whether this PR could land ahead of #2001's Group B, since Group B has two required Same invocation both rows —
15 unlicensed The coupling is one line of delinks, not the manifest
This PR's delinks add Three things I had flagged as blockers that are not
What this means for orderingStay stacked on #2001's Group B. Do not retarget this to main — it will fail the ROM build, and One alternative I did not test, so treat it as unverified: this could in principle be re-cut Also note this PR is currently DIRTY and needs a rebase regardless; when Group B lands squashed, No byte claim beyond the two rombuild runs above. Nothing here was pushed or modified. |
You are unblocked. Measured against today's main — and I had the mechanism wrong.Group B landed as #2054, squashed into Two rows, identical invocation —
|
unmodified main 7b4eeabfb |
main + this PR's build inputs only | |
|---|---|---|
| verdict | ROM-build analysis: PASS |
ROM-build analysis: PASS |
| module fidelity | 106/106 exact, 100.000000% |
106/106 exact, 100.000000% |
| source-built functions | 11,088 | 11,088 |
| reproducing / mismatching | 11,088 / 0 | 11,088 / 0 |
| source-owned data | 0 | 200 bytes |
| source-owned data claims | (line absent — zero) | 1 (reproducing 1, mismatching 0) |
Previously this same promotion failed at step [3/6] with 15 unlicensed .data sections. It now
builds clean. Function count is unchanged at 11,088 — the five functions survive the merge into one TU
— and exactly 200 bytes (0xC8, matching your claimed .data 0x02112258..0x02112320) move out of
"no complete source entry reaches this" and into source-owned. intactTus = ["ov047/daObjKm3_Kurumajiku_c"], intactTuLinkVerification.ok = true.
Correcting myself: objisolate is not what lifted the refusal
In my earlier comment on this PR I wrote that objisolate.py's rebias_object_symbols was "exactly
what lifts" the objisolate.py:328 refusal. That was wrong, and I want it on the record here rather
than quietly superseded. The refusal is not lifted — it is never reached. Main's
rombuild.py:_isolate (line 344) now short-circuits before isolate_many ever runs:
intact = (intact_tus or {}).get(rel.replace("\\", "/"))
if intact is not None:
prepared, _evidence = TP.prepare_intact_object(obj.read_bytes(), intact)
obj.write_bytes(prepared); return Nonerebias_object_symbols is necessary but not sufficient — it is called from inside
tu_production.prepare_intact_object. What actually admits your .data claim is the trio of the new
intact-object route in _isolate, prepare_intact_object, and the fail-closed
rombuild.intact_tu_policies() gate, which demands production_mode: intact-object, a promoted src/
path, both .text and non-text claims, a green scratch-data-verified proof, a matching ROM SHA-256,
and a symbol-error inventory identical to the baseline. Your manifest entry satisfies all of them
unchanged.
Your promotion is the first real exerciser of #2054's data-claim path
Worth knowing, because it retires a caveat I published on #2054. That PR's rework-2 diagnostics had to
ship with a synthetic fixture — measured across all 106 delinks.txt, source-owned non-.text was
0 bytes tree-wide, so the new loop had nothing real to iterate. Your PR is the first one that does:
sourceDataClaims = 1
reproducingDataClaims = 1
reproducingDataClaimBytes = 200
mismatchingDataClaims = 0
What to drop on rebase
git diff origin/main..43243bfb currently touches 271 files / −14,289 lines — that is this branch
reverting main's newer work. Rebase, do not merge. Of your 25 commits (18 tools: + 2 metadata:
- 5
tu:), all 18tools:commits are now dead weight. Line-level check of your added lines
against main:
- Byte-identical to main, drop outright:
objisolate.py,test_objisolate.py,tiers.py,
tu_promote.py,test_tu_production.py,test_tu_promote.py - Fully subsumed (0 added lines missing from main):
rombuild.py(219),tiers_ratchet.py(157),
test_tiers_ratchet.py(164),test_rombuild.py(111),rombuild_check.py(68),
test_rombuild_check.py(30) - Near-total:
tubuild.py203/208,tu_production.py187/188,test_tubuild.py133/147. The
residue is only stale signature variants (rom_inputs=None, control_tools=None,config_root=...)
that Group B of #2001, re-cut on current main: intact-TU production, with the two review regressions fixed #2054's re-cut rewrote — superseded, not missing.
So: drop every tools/** and .github/** change; drop config/converted-baseline.json and
attribution.json and regenerate them against main rather than carrying yours forward; keep only
the 5 tu: commits — manifest, delinks, symbols, header, the promoted source, and the five deletions.
The five files I brought across were verified to have zero drift on main since your merge-base
25cfc1363, so nothing you wrote has been overwritten:
config/arm9/overlays/ov047/{delinks,symbols}.txt,
config/tu_manifest.d/ov047/daObjKm3_Kurumajiku_c.json, include/daObjKm3_Kurumajiku_c.h,
src/actors/daObjKm3_Kurumajiku_c.cpp.
Not verified — do not read this as a merge approval
- Only
rombuild.py -j 16 --no-romwas run. Noeligible.py, noromdata_check.py, no
tiers_ratchet.py --check, nopremerge_check.py, no unit suites. - I deliberately excluded
config/converted-baseline.json, so whether your ratchet entries are
still correct is unknown. Given that TU promotion now scores per-member (path#symbol) on main,
they most likely need regenerating rather than rebasing. - The mechanism claim above comes from reading main's
_isolate, not from a negative experiment — I
did not re-prove that the old isolator still refuses. - Pre-existing tree state, not yours: the 8-step baseline control emits
[7/8] dsd check symbols --failwith 9 errors (overlay_100,data_020ad524,func_01ff98f4,_deq, …). The intact-TU
gate reported zero new symbol errors, so this is ambient and not a regression from your change.
Rebase, regenerate the metadata, take it out of draft, and I will run the full gate set on the merge
tree. Nothing was pushed to your branch and nothing here was merged.
Promotes ov047/daObjKm3_Kurumajiku_c from five intake files into one production C++ translation unit. One mwccarm invocation now owns the D1/D0 pair, InitResources, CleanupResources, RickshawBs_Spawn, the resource descriptor, type-name string, SpawnInfo, and vtable storage. Per-symbol contributor credit is preserved through the prerequisite branch.
Validation after restacking onto current main and the refreshed #2001:
The class's own _ZTI21daObjKm3_Kurumajiku_c remains separately gap-owned because mwccarm emits it in a different section order than retail. That is the remaining metadata debt; no .init, .ctor, or .bss ownership changes are claimed.
Stacked on and dependent upon #2001. This remains draft/parked for the requested ctor/dtor migration pacing even after validation turns green; it is not being marked ready or merged automatically.