[{"timestamp":"2026-10-16T21:20:13Z","commit_sha":"7138dfc6c2956edb5a2954032e3d5c9f5e30a9ba","commit_message":"Update field-movement fixture for kwlnGetCamera rename\n\neafa665e renamed func_00457120 to kwlnGetCamera, so the fixture's\ncamera-frame substitution silently stopped matching and the extracted\nhost witness no longer linked. Free checks has failed on every push\nsince. Assert the substitution so the next rename fails with a clear\nmessage instead of a link error.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2885912,"complete_code_percent":91.94129,"complete_data":0,"complete_data_percent":100,"total_units":645,"complete_units":596}},{"timestamp":"2026-10-16T12:16:05Z","commit_sha":"3fab65d18b2f5f600a50c950a2035066b9e7c722","commit_message":"Name the sprite frame-counter family and EffSpriteUpdate\n\nfunc_004a5fc0 is the sprite update (230 lines, uses EffSpriteRGBA and\nEffSpriteFrame). It reads the frame counter at +0x2C and resets it when the\ncycle wraps. Its three +0x2C callers are renamed:\nfunc_004a5f90 -> EffSpriteClearFrameCount (sets +0x2C to 0),\nfunc_004a5fa0 -> EffSpriteIncrementFrameCount (++ +0x2C),\nfunc_004a6b90 -> EffSpriteAdvanceFrame (++ +0x2C, then EffSpriteUpdate).\nExterns in promoted/code1_004a.c and the prose mention in code1_004b.c move\nto the new names. The handoff doc cites EffSpriteUpdate with a was-cite.\n\nOwner verify 187/187 MATCH across the four TUs; elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T12:13:49Z","commit_sha":"61bda69a22cf46d16c2d18e19d175204445c9555","commit_message":"Name the rank-up hold, lerp and step helpers in cmmRankUp\n\nfunc_00251FC0 sets or clears the hold bit on each active rank-up entry\n(cmmRankUpSetEntryHold) [inferred]. func_00252230 linearly interpolates\ntwo sprite states (cmmRankUpLerpState). func_00252710 and func_00252A60 are\nthe per-frame sprite and effect steps (cmmRankUpStepSprite,\ncmmRankUpStepEffect) [inferred]. func_00255B00 is the timed step that\ndispatches to two phase functions (cmmRankUpStepTimed). Callers in\ncomuTimerSequence_inferred_002519e0.c and promoted/code1_0025.c are renamed.\nOwner verify: 38/38 MATCH; lint unchanged (46, 6, 25). Local only; gate\npending.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T12:10:22Z","commit_sha":"e5294b14a8f61a1edd9da95001887f5ed1dfa8ac","commit_message":"Name the deal layout runs 1-3 after the btlShuffleSeq dispatch\n\nbtlShuffleSeq1Run (code1_0037 func_00379f90), btlShuffleSeq2Run (func_0037ad10)\nand btlShuffleSeq3Run (func_0037bc80) are the state 0/1/2 deal state machines\ndispatched by btlShuffleSeqCardTask, beside btlShuffleSeq4Run and\nbtlShuffleSeq5Run. Caller renames in btlShuffleSeq.c. Owner verify 34/34 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T12:09:49Z","commit_sha":"8cb816c7fcdb895128f7ac5637b552228d4e75b8","commit_message":"Name y_misc vector, colour, easing, clamp, list cursor, digit and tag helpers\n\nBatch Y1 (callee-first) of the y_misc_inferred unit: fclMakeVec2, fclMakeVec3,\nfclMakeBoundsPacket, fclMakeDrawColor and fclPackRgba (the packing constructors\ndeclared in include/fcl_draw_types.h, fcl_bounds_packet.h and fcl_color.h),\nfclGetWorkPointer, fclEaseInterpolate, fclAnchorOffset, fclAddClamped,\nfclSubClamped, yListStepIndex, yListAdvanceCursorScroll,\nyListRetreatCursorScroll, fclMinS32, fclMaxS32, fclDecimalDigitCount,\nfclVec3Subtract, datItemPriceCompare (the qsort comparator in\ninclude/list_item_internal.h), fclExpandNameTags, fclTagTextLength and\nmapSymbolTaskUpdate. Intents marked [inferred]. Callers and prototypes across\nthe tree are renamed by the same map (Fcl, Kosaka, Yajima, Camp, Battle and\npromoted units). Left as func_ with reasons: func_002b2950/002b2960 (a global\nmode flag with no established name), func_002b32a0 (select with unclear\nmeaning), func_002b3050 (list page step, argument roles unclear),\nfunc_002b3960 (dispatch through jtbl_008873EC[0]).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T12:04:44Z","commit_sha":"efbc529dd30bbb00b57196a598184249652b89ae","commit_message":"Name the rank-up queue, task and copy helpers in cmmRankUp\n\nfunc_00251D80 runs the rank-up work queue (cmmRankUpRunQueue),\nfunc_00251E60 queues it (cmmRankUpEnqueueTask), func_00251EC0 releases the\nwork handle (cmmRankUpDestroy), func_00251F00 creates the work block and\nchild task (cmmRankUpCreate), func_00252050 copies the state snapshot\n(cmmRankUpCopyState) and func_0025B0F0 draws the sprite\n(cmmRankUpDrawSprite). Callers in comuTimerSequence_inferred_002519e0.c and\npromoted/code1_0025.c are renamed. Intents are [inferred] where the callee is\nunidentified. The unused extern in code1_0025.c is removed. Owner verify:\n38/38 MATCH; lint unchanged (cmmRankUp 46, comuTimerSequence 6, code1_0025\n25). comuTimerSequence keeps an s32 extern with a lint allow, because it\nstores the returned v0 (retail keeps it). Local only; gate pending.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T12:02:54Z","commit_sha":"e8da75abef410d9a83b932feacd326b7bf169d91","commit_message":"Name ambient flag and area cue helpers and the rain task from code1_0018\n\nPure renames, no codegen change:\n- func_00182390 -> FldAmbientFlagClear, func_001823c0 -> FldAmbientFlagPtr\n- func_00182310 -> FldSlotBroadcastState (writes state to active slots)\n- func_001823d0 -> FldAmbientTrigger (area/position test, plays ambient cue)\n- func_00182bc0 -> FldRainUpdate, func_001837f0 -> FldRainDestroy,\n  func_001838d0 -> FldRainTaskCreate (rain PTank task; body comment names rain)\n- func_00182b40 -> FldRainRenderStateSet, func_001839e0 -> FldRainRenderStateReset\n- callers in Kosaka field, promoted and tools/m2c_bulk.py regex patches updated","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:59:57Z","commit_sha":"b7340442dc87469519f91a80362b99d774e6bbd3","commit_message":"Name func_004a5910 WindCreateKindEntryAlt\n\nSame role as WindCreateKindEntry in effPolygonWind.c: both allocate a Wind\nkind entry through WindAllocKindEntry. The bodies differ. This copy reads\nthe kind index at +0x38 directly with no kind switch, and does not resolve\nthe relative pointer through mdlEffectResolveRelPtrB. The Alt suffix keeps\nboth symbols distinct. Declaration updated in effect_instance_internal.h\nand the extern in mdlEffect.c.\n\nOwner verify 178/178 MATCH; elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:56:14Z","commit_sha":"8a0d0fc1428af4a614db71fbccf3551c84e61364","commit_message":"Name the band resource update step FldStepUpdateBandRes\n\nBatch S4 of code1_0015: func_0015bae0 is the per-step update of the band\nresource lists (tile position, rotation by frame angle, show or hide by band).\nIts caller in src/Kosaka/k_command.c (KosakaTU lane) is renamed too. Intent\nmarked [inferred].","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:51:45Z","commit_sha":"ff0f8da86f97f9d3b6ffb6e66c1b3bef8965ddbd","commit_message":"Name the Wind kind-table instance functions in mdlEffect.c\n\nThe functions at 004a58b0-004a5b90 use the object layout that\nWindAllocKindEntry (effPolygonWind.c) produces: kind index at +0x38, counter\nat +0x34, child at +0x3C, and the 0x1C-byte kind table D_00714130. They take\nWindInstance Destroy, Stop, Advance, UpdateIfActive and AdvanceAndUpdate names,\nand WindSetFirstQuad, WindSetSecondQuad, WindSetUniformScale and WindSetVec3\nfor the quad and float writers. func_004a5910 stays address-named:\nWindCreateKindEntry already names a definition in effPolygonWind.c, so renaming\nit here would duplicate the symbol. func_004a5b60 (+0x30 writer) stays too.\n\nOwner verify 178/178 MATCH; elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:49:29Z","commit_sha":"bbe87a29cdfcc81a3257c18dae5410796ba3ccbb","commit_message":"Name the shuffle side-quad, menu batch and wave draws\n\nbtlShuffleDrawSideQuads (func_00385970), btlShuffleDrawMenuBatch (func_00386c00)\nand btlShuffleDrawWave (func_00389e10). Names follow the probe-archive notes that\nthe file cites for each function (Shuffle_side_quads, Menu_shuffle_batch,\nShuffle_wave). Owner verify on code1_0038.c.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:47:22Z","commit_sha":"b7b4f21b13f90f526ece671c7c877e62e6492475","commit_message":"Name the event node, resource and cut-in helpers in evtMain\n\nfunc_00286780 creates the type-10 event node (evtNodeCreate). func_002871A0\nenables or disables the scene resources of the event's nodes\n(evtSetNodeResourcesEnabled). func_00287310 applies the resource state\n(evtRefreshNodeResources). func_00287360 updates the cut-in polygon\n(evtUpdateCutin). func_00287D90 steps the model layers for the selected\nchoice (evtStepLayerByChoice). func_00288020 syncs event nodes with the\nresource manager (evtSyncResManagerNodes). Prototypes in\ninclude/scene_event_internal.h and callers in evtEvent, evtLoadSave,\nmt_misc_inferred_002962f0 and cmmCommunity are renamed. Intents are\n[inferred] where the callee is unidentified. measured/history notes keep\ntheir old names. Owner verify: 109/109 MATCH. Local only; gate pending.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:42:50Z","commit_sha":"6e2c46c4a32054b67aee9bc2e0024d15ff320dba","commit_message":"Name the nmMesWindow message-slot and digit helpers from nmCmdList\n\n- nmCmdList_inferred_*.c: 15 functions named from their bodies. D_00882F40 is a five-slot\n  table of message records (id at +0, status at +4, flag at +5, next at +8, result at +0xD).\n  Digit drawing: nmMesWindowShowNumber (entrance when mode 0, else retrace),\n  nmMesWindowSetNumber (no entrance; tens hidden below 10), nmMesWindowSetNumberColor.\n  Record and slot management: nmMesWindowResetRecords, nmMesWindowClearSlotTable,\n  nmMesWindowSlotResult, nmMesWindowSlotStatus, nmMesWindowRestartSlot,\n  nmMesWindowDestroySlot, nmMesWindowResetCurrent, nmMesWindowSetSlotString.\n  State machines: nmMesWindowStepCurrent and nmMesWindowStepSlot, with the\n  nmMesWindowStepCurrentRelease and nmMesWindowStepSlotRelease wrappers.\n- Collision-checked. Callers renamed in 33 files (y_fclCombine*, cmmRankUp, shdPersona,\n  shdScript, cmpPersona, frFont, btl*, y_timeLimit, code1_* and fcl_draw_task.h).\n  The three measured history comments that cite the old addresses are kept as written.\n- Owner verify: 682/682 MATCH across the changed .c files; status changes vs baseline: 0.\n  elig_debug clean on the three nmCmdList_inferred files checked.\n- Remote gate: pending for this commit.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:42:42Z","commit_sha":"f13cb1b6caf62e76368a2bd1f327a79b98db023c","commit_message":"Name the Thunder, Ring and LineNova instance functions in mdlEffect.c\n\nTUCensus moved these blocks from code1_0049 and code1_004b into mdlEffect.c\nunder their address names. The Thunder and Ring kind-table functions\n(kind index at +0x2C for Thunder, +0x38 for Ring; table stride 0x18) take\nThunderInstance*, RingInstance* and RingSet* names. The LineNova lifecycle\nfunctions (kind index +0x18, counter +0x14, table D_00714650) take\nLineNovaInstance* names. Callers in effPolygonRing.c already use the Ring\nnames. Field-only writers at +0x20/+0x24/+0x30 remain address-named.\n\nOwner verify 194/194 MATCH across mdlEffect.c and effPolygonRing.c; elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:38:24Z","commit_sha":"2b0b369ef0d88acc974ee9d618f74b15818c570e","commit_message":"TUCensus: move 12 battle sound functions from mdlEffect_inferred_001fa660.c into btlSound.c\n\nThe 001fa660 run (battle sound and voice routines, btlSound includes and callers) was filed under mdlEffect. Moved 12 functions (001fa720-001fb360) to the end of src/Battle/btlSound.c in address order. Held in the source file (12): 001fa660, 001fa7a0, 001faaa0, 001faaf0, 001fab40, 001fab90, 001fabe0, 001fac30, 001fac80, 001fad10, 001fadc0, 001fae10; each reads iGpffffb3ac, declared Battle* in btlSound.c and u8* in the bucket, so the dest declaration cannot change without changing existing callers. Owner verify: 12 moved MATCH; elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:35:43Z","commit_sha":"c4e13a46043cf34b1608aff33261affc98da3270","commit_message":"Name field filter, enemy table, party model and slot pool helpers from code1_0016\n\nPure renames, no codegen change:\n- func_001605a0 -> FldFilterLoadFile (\"field/FILTER.FLD\", then K_FldFilter_InitQuads)\n- func_00161510 -> FldEnemyOpenTable (\"field/table/enemy.bin\")\n- func_001615a0 -> FldEnemyLoadTable (copies table record, destroys handle)\n- func_001614d0 -> FldFilterGetEntry, func_00161500 -> FldFilterSetIndex\n- func_00160680 -> FldFilterResetRenderState, func_001607e0 -> FldFilterApplyColour\n- func_00162120 -> FldStateTablesClear\n- func_00162200 -> FldPartyModelRelease, func_001622d0 -> FldSlotTablesReset\n- func_00162330 -> FldSlotFindFree (4 slots), func_00162390 -> FldObjFindFree (15 slots)\n- func_00162510 -> FldRoomIsListed (field/room whitelist)\n- func_00162680 -> FldPartyModelGet\n- func_001623f0 -> FldDayEventActive (day-phase table check)\n- callers across Event, Kernel, Kosaka and promoted TUs updated","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:33:58Z","commit_sha":"fa3f51c949a03d3c709d42f99d3d5d76b66c6274","commit_message":"Name the script codefunc handlers and the interpreter loop\n\nFollows the CodeFunc_<Op> convention of the neighbouring handlers:\nfunc_0029BF30 is CodeFunc_Mul, func_0029BFB0 CodeFunc_Neg, func_0029C130\nCodeFunc_Not, and func_0029C750 CodeFunc_JumpIfFalse [inferred]. The shared\nbinary operator body (func_0029B1B0) is scrBinaryOp and the dispatch loop\n(func_0029CB00) is scrRunCodeLoop; its callers in scrScriptProcess.c are\nrenamed. Owner verify: 65/65 MATCH. Local only; gate pending.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:25:19Z","commit_sha":"0c67816fb46164b63429776cec18c2c301f4ea43","commit_message":"Name the nLine line-effect functions from the layer record\n\n- nLine.c: 28 functions named from their bodies. The layer table (20 records of 0x54 bytes:\n  positions, colours, eased offsets) drives the effect.\n  Setup and state: nLineInit, nLineSetDefaultDuration, nLineInitRecords, nLineGetCurrentSet,\n  nLineSelectSet, nLineSelectSetImmediate, nLineSetActive, nLineIsIdle, nLineUpdate,\n  nLineWrapRecord, nLineRollStyle.\n  Drawing: nLineDrawSet, nLineDrawCurrent, nLineDrawRecords, nLineEmitQuad, nLineFlushLayer,\n  nLineDrawEffect, nLineDrawBatch, nLineDrawFullFrame, nLineDrawScaledFrame, nLineDrawBand,\n  nLineDrawWaveStrip, nLineDrawFrameAt, nLineBuildDecoration.\n  Sweeps: nLineSweepHorizontal and nLineSweepVertical, with nLineSweepHorizontalAlt and\n  nLineSweepVerticalAlt for the opposite edge scan. Each Alt has the same algorithm as its\n  partner, so the Alt suffix follows the duplicate precedent.\n- Collision-checked. Callers renamed in 18 files (cmpMain.c, cmpConfig.c, cmpPersona.c,\n  cmpSkill.c, cmpEquip.c, shdPersona.c, k_fldUnit.c, h_malloc_inferred_001400f0.c, kwln_inferred\n  and promoted code1_0010/0012/0013/0014/0022/0034/0035/0036). The measured history comment that\n  cites func_0034bd60 is kept as written (restored after a first pass changed it).\n- Owner verify: 562/562 MATCH across the touched .c files; the single non-MATCH row\n  (func_00100008) is ASM in the baseline. Statuses changed against the baseline: 0.\n  elig_debug clean on nLine.c.\n- Remote gate: pending for this commit.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:21:15Z","commit_sha":"8658c9ddc1b6120eeec04c1c3f0ceebf224369e6","commit_message":"Name shop number draw, panel layout and list scroll thumb (Fcl batch 16)\n\nfclDrawNumber draws a digit string at a precomputed position with a colour (used by\nthe shop and combine draws). fclShopLayoutPanels positions and fades the three shop\npanel sprites. fclShopDrawScrollThumb sizes and places the list scroll thumb from the\nlist count and index. Callers in y_fclShopDraw.c and y_fclCombine.c updated.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:20:42Z","commit_sha":"606f31fd40975ca080b7cba1b08cf250eb7252cb","commit_message":"Name the battle-shuffle view, card and effect task callbacks\n\nCreate/step/destroy names come from the task registrations: btlShuffleDrawView\n(func_00388bd0, step func_00388b40, destroy func_00388ba0), btlShuffleDrawCard\n(func_0038cec0, step func_0038ce30, destroy func_0038ce90), and btlShuffleEffStep\n(func_0038d660, registered by the named btlShuffleEffSpawn). btlShuffleDrawCardReset\nand btlShuffleDrawCardActivate come from their bodies. Caller renames in the\nbtlShuffle* TUs and code1_0037. Owner verify 198/198 MATCH; the 3 ASM entries\n(func_0038fb50/fd30/fe90) are pre-existing INCLUDE_ASM.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:17:03Z","commit_sha":"bb31dfed77d2a44cfedf2755a8b6ca0572b039c0","commit_message":"TUCensus p3_twin batch C: insert 125 bucket functions into mdlEffect.c\n\nMoves 125 p3_twin functions from code1_0020/002b/0048/0049/004a/004b into src/Graphics/Model/mdlEffect.c, in address order. Held in the buckets (14): 00185370, 00489e80, 0049a810, 00485ae0, 004ade80, 00494680, 004a6dc0, 004a5de0, 004a5ef0, 004b18e0, 004b1a00, 004b2780, 004b12e0, 00498d20; each conflicts with a dest prototype, typed global or header the dest cannot take without changing existing callers. Re-applied on origin ace86013 (identifier and comment changes only versus the gated a1035a05). Owner verify: all 125 MATCH; elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886872,"complete_code_percent":91.97187,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":598}},{"timestamp":"2026-10-16T11:14:40Z","commit_sha":"ace8601334e07c3046d2ad9ed220165a7fb044d5","commit_message":"Name the config overlay task helpers in cmpConfig\n\nfunc_0035C690..func_0035E720 are the config overlay: the task creator\n(cmpConfigCreate), the detail step flag tests (cmpConfigIsStepDone,\ncmpConfigIsStepCancelled, cmpConfigIsFlagsSynced), state reset and table\nmode (cmpConfigInitState, cmpConfigSetMode), value and option setters\n(cmpConfigSetValue, cmpConfigToggleOption, cmpConfigSetOption), the phase\nadvance, the per-frame update, draw, graph and arrow drawing, the sprite\nfree and the task update. Callers in code1_0012, code1_0035, code1_0036 and\nevtPMFileReader are renamed (rename-only). Intent comments are above each\nmarker; measured/MATCHED history blocks keep the old names. Owner verify:\n201/201 first-party MATCH. Local only; gate pending.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2888840,"complete_code_percent":92.03457,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":597}},{"timestamp":"2026-10-16T11:11:32Z","commit_sha":"79c5f46345c6bf27b246566d9818b02be8f3830e","commit_message":"Document the src/rw naming rules in architecture\n\nCopies in src/rw keep address names when src/renderware binds that address\nthrough a #define alias or defines it by name, since a second RenderWare\nname would describe the same function twice. Other src/rw functions take\nRenderWare or driver names only with retail evidence and a matching body.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2888840,"complete_code_percent":92.03457,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":597}},{"timestamp":"2026-10-16T11:08:10Z","commit_sha":"6d51e1cc98801ff9ff94b27d391f8f035693c645","commit_message":"Name list-box entry draw helper\n\nPure rename, no codegen change:\n- func_0046ec70 -> sdkLboxDrawEntries (walks visible node window, draws each entry by type via context callbacks; called from sdkLboxUpdate)","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2888840,"complete_code_percent":92.03457,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":597}},{"timestamp":"2026-10-16T11:07:00Z","commit_sha":"4c84173f456b59ff489826dd99a44c9b3d8e82c6","commit_message":"Name the equip, camp main, party panel and system Camp functions\n\nEquip menu: init, item-list build, update, draw, selection, tab step, mode.\nCamp main: the camp task create, step, destroy and the per-frame menu update,\nplus the default table index setter. Asset loader task: create, step, destroy.\nParty panel: task create, step, destroy, row draw, row motion setter, HP/SP\ngauge draw. System menu: init, selection, mode. Caller renames in the promoted\nTUs code1_0013, code1_0015, code1_0017, code1_0036. Owner verify 166/166 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2888840,"complete_code_percent":92.03457,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":597}},{"timestamp":"2026-10-16T11:02:14Z","commit_sha":"4ae18085665819cb4b59adcc007c527f58c94d45","commit_message":"Name the y_draw sprite flag setters, render presets and queue callbacks\n\n- func_002b6120 -> fclSpriteSetMode (u8 at +0x154), func_002b6130 -> fclSpriteSetOrder (u32 at\n  +0x188), func_002b6140 -> fclSpriteSetHidden (u8 at +0x184). The y_fclCombine externs name\n  their parameters mode, order and hidden, and the callers pass those values.\n- func_002b6180 -> fclSpriteApplySkyPresetA and func_002b6260 -> fclSpriteApplySkyPresetB. The\n  two bodies share the same table calls and differ only in RpSkyRenderStateSet(3, ...)\n  (0x71009 vs 0x7C003), so the A/B suffix records that difference.\n- func_002b6da0 -> fclSpriteApplyMaskedPreset (applies the masked preset, then emits the masked\n  tag pair). func_002b6ea0 -> fclSpriteEmitTagPair (a one-line wrapper around\n  mdlEffectEmitTagPair). Both are queued by fclSpriteStartPanelLayout.\n- Collision-checked. Callers renamed in y_fclCombine.c, y_fclCombineDraw.c, y_CmbCardEff.c.\n  Measured history comments are not edited (checked in the diff). generated/ is not touched.\n\nOwner verify: 204/204 MATCH on the four touched files, no status changes\nagainst the baseline (0 changed). elig_debug passes. decomp_lint: 0 errors.\nRemote gate: pending for this commit; it will be gated once the stack below it is green.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2888840,"complete_code_percent":92.03457,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":597}},{"timestamp":"2026-10-16T10:54:56Z","commit_sha":"fe224e7a50135dac6071612026b6661f23da9106","commit_message":"mdlEffect.c: make RwMatrix a complete type ahead of p3_twin moves\n\nThe opaque RwMatrixTag forward typedef becomes the full 64-byte matrix layout used by rw/plcore/bamatrix.h (same tag, same field offsets as btl_shuffle_draw_internal.h). Existing functions only use pointers to it; all 53 owner rows stay MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2888840,"complete_code_percent":92.03457,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":597}},{"timestamp":"2026-10-16T10:48:23Z","commit_sha":"24932c7341b1666b58b282e300a58eb7658d4e57","commit_message":"Name the message window pool helpers in nmCmdList\n\nThe func_002BAAC0..func_002BC060 family wraps itfMesWindow* over a five-slot\nwindow pool (D_00882F40) and the current-window record (DAT_00882F60).\nNames follow what each body does: open/acquire/close/release a window,\nfind a free slot, bind a record and style, set the current or slot param,\nflag, string, refresh request, running state, and the current anim value.\nCallers in the Battle, Camp, Event/Fcl, Yajima, cmmRankUp, shd* and promoted\nfiles are renamed (rename-only). Prototypes and externs follow. The stale\ncomment in cmmMisc.c names the new callee. MATCHED history blocks in\ny_fclCombine.c and code1_0013.c keep their old names. Owner verify: 746/746\nfirst-party MATCH. elig clean. Lint: cmmRankUp 46, cmmMisc 10, y_fclCombine\n40 (baseline). Remaining H011 findings predate the rename (same mismatches\nunder the old names). Local only; not pushed (see CI note on 1bb19b54).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2890328,"complete_code_percent":92.08198,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":597}},{"timestamp":"2026-10-16T10:48:15Z","commit_sha":"1805323642329abdb5a30bdccdc65491680c6e00","commit_message":"Name the hit-flag AI queries and define the action hit flag constants\n\nbtlAction flags (+0x18) get BTL_ACTION_FLAG_CALLBACK_PENDING, HIT_CRITICAL\n(0x800), HIT_LANDED (0x1000) and DOWN (0x2000); the packet targetFlags get\nBTL_HIT_RESULT_LANDED (0x2) and BTL_HIT_RESULT_CRITICAL (0x4). The values come\nfrom datCalcHitResult's own comment (4 = critical, 2 = roll lands, marked\ninferred) and from btlTargetApplyHpSpChange, which sets each action bit from\nthe matching targetFlags bit or from BTL_STATUS_DOWN. Setter in\nbtlTargetApplyHpSpChange uses the constants (same values).\n\nfunc_001E3F10 (AI 0x20BA) -> btlScriptIsSideUnitHitFlagged,\nfunc_001E3FD0 (AI 0x20D6) -> btlScriptIsSideUnitLandedFlagged,\nfunc_001E4090 (AI 0x20D7) -> btlScriptIsSideUnitCriticalFlagged.\nOwner verify MATCH (324 results).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2890328,"complete_code_percent":92.08198,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":597}},{"timestamp":"2026-10-16T10:43:59Z","commit_sha":"499f70dd177120cd448cdd23debef2949f5ac2b4","commit_message":"Name func_002b6590 as fclSpriteCreateDrawTask\n\n- func_002b6590 -> fclSpriteCreateDrawTask. It creates the 0x100-byte sprite draw task under\n  a parent (update fclSpriteUpdateAndDrawTask, destroy fclSpriteDestroyTask) with the slot at\n  +4 and the tint word at +0. y_smap.c creates two of these, slots 0xC and 0xD, for map symbols.\n- Collision-checked. Callers in y_smap.c and y_draw.c (intent comment on the destroy callback).\n  The \"measured\" history comment that cites the old name is kept as written, and generated/\n  stays untouched.\n\nOwner verify: 94/94 MATCH on y_draw.c and y_smap.c, no status changes against\nthe baseline (0 changed). elig_debug passes. decomp_lint: 0 errors.\nRemote gate: not run for this commit yet. The loadable-image SHA1 is currently red on origin/main\n(see the 1bb19b54 rename fix), so pushing waits for that fix.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2890328,"complete_code_percent":92.08198,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":597}},{"timestamp":"2026-10-16T10:42:17Z","commit_sha":"fc086aedc699ebed0f4ee56bcafb25460eca3022","commit_message":"Name camera distance setter and orbit update\n\nPure renames, no codegen change:\n- func_0016e8e0 -> FldCameraSetDistance (camera position step with distance, re-aim)\n- func_0016ec90 -> FldCameraUpdateOrbit (view matrix copy, offset by distance, re-aim)\n- callers in k_command.c and k_fldEvent.c updated","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2890328,"complete_code_percent":92.08198,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":597}},{"timestamp":"2026-10-16T10:38:49Z","commit_sha":"38e5e61283c3e9f6a78686313d9473fc6e5489d8","commit_message":"Name combine-event scene update and destroy callbacks (Fcl batch 15)\n\nfclCombineEventSceneUpdate loads the field scene and waits on the spawned task;\nfclCombineEventSceneDestroy runs the work destroy through jtbl. Both are the\nupdate/destroy pair of the second CombineEventWatchProc registration.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2890328,"complete_code_percent":92.08198,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":597}},{"timestamp":"2026-10-16T10:29:09Z","commit_sha":"bcc5f2c092e1559c90cc1f1b3638ad59f0aaa593","commit_message":"Name the scaled slot record builder mdlBuildScaledSlotRecords\n\nfunc_00477810 becomes mdlBuildScaledSlotRecords: for each nonzero counter at arg1+0x198 it fills two 0xA4-byte records from arg1's scale terms (inverted +0x184/+0x188) and sets flag 0x10. Caller and the mdlSetTrackScaleRange comment renamed; generated copy keeps its address name.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2890328,"complete_code_percent":92.08198,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":597}},{"timestamp":"2026-10-16T10:19:45Z","commit_sha":"09c4cbbdedf74adff209637e9015370a58ef7523","commit_message":"Restore func_0016ea30 at the frame +0x24 setter call\n\nThe fld rename pass mapped func_0016ea30 to FldFrame_BindTypedRes by taking the\nfirst named definition after its marker, which skipped the unnamed setter at\n0x0016ea30 and grabbed the next function (0x0016ea40, FldFrame_BindTypedRes,\nu8*/u16). That made the k_fldEnvironment setter call (f32 arg, writes frame\n+0x24) call the wrong function: the verify WRONG CALLEE row and a loadable image\nSHA1 mismatch at vram 0x154efc (jal 0x16ea40 vs retail 0x16ea30). Restore the\nname at the setter call site and its extern in both k_fldEnvironment copies.\nThe setter has no established name, so it stays func_0016ea30.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2890328,"complete_code_percent":92.08198,"complete_data":0,"complete_data_percent":100,"total_units":648,"complete_units":597}},{"timestamp":"2026-10-16T09:32:15Z","commit_sha":"ff3625ce695af37adea4c924c5495b71222c569f","commit_message":"Name task record destroy, ticker start and title music stream step (batch 12)\n\ntaskRecordDestroy runs the record's jump-table destroy on task+0x38 and clears\nD_007242B0 (calendar.c uses it as its destroy callback). tickerStartTask starts the\n0xF ticker task (Kernel/Kwln and code1_0010 call it). titleMusicStreamStep steps the\ntitle music stream and reports its progress (called from the title loader update).\nCallers updated in calendar.c, Kwln, code1_0010; code1_0012.c hand-edited.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2890328,"complete_code_percent":92.08198,"complete_data":0,"complete_data_percent":100,"total_units":651,"complete_units":600}},{"timestamp":"2026-10-16T09:27:39Z","commit_sha":"925388360a21055675e142fb18a40e5684b760c9","commit_message":"Name the shop item detail, stat, indicator, cue and label helpers\n\nfunc_002D5040 draws the item stat block (fclShopDrawStats). func_002D8200\nslides the shop indicator by 4 units (fclShopSlideIndicator). func_002DF020\ndraws the item detail block (fclShopDrawItemDetail). func_002DFE00 plays the\nitem cue, cue 8 for special items (fclShopPlayItemCue). func_002DFF90 is the\ntwo-parameter-set sound helper (fclShopPlaySoundParams). func_002E0080 draws\nan item name label (fclShopDrawItemText). Owner verify: 38/38 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2890328,"complete_code_percent":92.08198,"complete_data":0,"complete_data_percent":100,"total_units":651,"complete_units":600}},{"timestamp":"2026-10-16T09:22:57Z","commit_sha":"38db41e60eae62a3d8e7d9c5faa842cecb32014f","commit_message":"Name sprite pack, resource prepare, field map and calibration handlers\n\nPure renames, no codegen change:\n- func_0025ef20 -> sdkSpritePackCreate, func_0025f230 -> sdkSpritePackDestroy\n- func_00266b70 -> mtSceneBuildSpriteTable, func_00267510 -> mtSceneSpriteTableTaskDestroy\n- func_0015f660 -> mtSceneResListPrepareAll\n- K_Cmd_CAL_CAPTURE_STATE, K_Cmd_CAL_RESTORE_STATE, K_Cmd_AREA_TRACK_PLAY,\n  K_Cmd_RES_LIST_PREPARE, K_Cmd_FLD_MAP_STEP, K_Cmd_FLD_MAP_RESET","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2890328,"complete_code_percent":92.08198,"complete_data":0,"complete_data_percent":100,"total_units":651,"complete_units":600}},{"timestamp":"2026-10-16T09:21:52Z","commit_sha":"60ffe58520d14dd9674d8dce2719774a67d03702","commit_message":"Name seven more functions from their bodies and callers (g_data.c, y_draw.c)\n\ng_data.c entry-field getters (the 68-byte entry at D_007242A0), named only where\ncallers show the meaning:\n- func_001069a0 -> datItemGrantedSkill (u32 at +0x24; datCalcSkillCost and\n  PTDatCalcHasSkill compare the result with skill ids).\n- func_00106a00 -> datItemAccessoryPercent (u16 at +0x2A; DCDamageAccessoryFraction\n  uses it as the percentage).\n- func_001069d0 -> datItemValue (u16 at +0x28; code1_0013 reads it as itemValue).\n- func_00106a60 -> datEntryCategoryMask (u32 at +0x30; y_list.c tests it against\n  its filter).\n\ny_draw.c (fclSprite prefix):\n- func_002b6820 -> fclSpriteTestRecordFlag (test-side twin of fclSpriteSetRecordFlag).\n- func_002b7cd0 -> fclSpriteUpdateCulling (sets or clears the cull flag from the\n  screen margins).\n- func_002b9ab0 -> fclSpriteBuildCornerQuads (four corner quads from the fixed\n  inputs at +0x1F4-+0x200).\n\nCallers renamed in datCalc.c, code1_0013.c, code1_0021.c, y_fclShopDraw.c, y_list.c\n(extern prototypes and calls). Each new name has an intent comment above its FUN marker.\nLeft unnamed: the other GDataEntry getters (+0x00/+0x08/+0x0A/+0x0E/+0x10/+0x12/+0x34/\n+0x38/+0x39/+0x3C/+0x40), which no caller names clearly enough.\n\nOwner verify: 516/516 MATCH, no status changes against the baseline.\nelig_debug passes on all seven .c files. decomp_lint: 0 errors.\nStatus changes against the baseline: 0.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2890328,"complete_code_percent":92.08198,"complete_data":0,"complete_data_percent":100,"total_units":651,"complete_units":600}},{"timestamp":"2026-10-16T09:21:34Z","commit_sha":"2504cf589676794be31da1174d11baf02c90ea41","commit_message":"Move 6 inferred runs (17 functions) out of code1_004b and code1_0052 into Graphics Model and Effect *_inferred*.c files\n\nOwner verify 17/17 MATCH. Elig clean on all touched files. The new effMisc_inferred_0052d9a0.c is added to config/gcc_units.txt.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2890328,"complete_code_percent":92.08198,"complete_data":0,"complete_data_percent":100,"total_units":651,"complete_units":600}},{"timestamp":"2026-10-16T09:17:59Z","commit_sha":"9593bc36ab77449a1e874217a1b551225b8dbe4e","commit_message":"Name title slot-settled check, state init and flagged-ID collector (batch 11)\n\ntitleSlotsSettled returns 1 once all 11 slots pass their threshold; titleStateInit\nzeroes the 0x1BE8-byte title state block and sets its defaults; titleCollectFlaggedIds\nscans the 0x300 IDs and records the flagged ones. Callers in cmpMain.c and code1_0013.c\nupdated; code1_0012.c hand-edited (parse-skipped).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T09:14:49Z","commit_sha":"0bd5756adf81d5878ed6093b22fecda692d5c304","commit_message":"Name the DOWN-mirror AI query and the action run-now predicate\n\nfunc_001E4150 (AI 0x20D8) -> btlScriptIsSideUnitDownFlagged: tests unit +0x18\nbit 0x2000, which btlTarget.c sets exactly when BTL_STATUS_DOWN is in the\nstatus word. func_001B0E90 -> btlActionCanRunNow: returns 1 when the action has\nits +0x28 flag or the battle is not in the 0x8 gate, otherwise compares the\naction with btlActionGetActive (+0x2CC) and btlActionGetQueueSecond (+0x2A0).\nOwner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T09:13:15Z","commit_sha":"dc1dff87d6815da07e06e70b22419d4fe94e180b","commit_message":"Name the item shop update callback and item list row draw\n\nfunc_00332BB0 is the item shop task update callback (fclItemShopUpdate):\nstate 0 requests the shop sprite load, later frames draw the screen.\nfunc_0033C490 draws the item list rows (fclItemShopDrawList). All references\nin y_fclItemShopDraw.c are updated. Owner verify: 9/9 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T09:08:59Z","commit_sha":"8aad4492105a11fc4c8d27a5f8d951806aba0981","commit_message":"Name sdkSnd stream, mdlEffect sequence, ring and command handlers\n\nPure renames, no codegen change:\n- func_0045c510 -> sdkSndStopStreamSlot, func_0045aa90 -> sdkSndStopStream\n- func_0045c640 -> sdkSndStartStreamSlot, func_0045af60 -> sdkSndStartStream\n- func_004b1590 -> mdlEffectSeqStart, func_004b15d0 -> mdlEffectSeqStop,\n  func_004b1600 -> mdlEffectSeqStep\n- mtScenePayloadAt -> rbRingNextNode, mtSceneByteOffset -> mtSceneBytePairAt\n- Common handlers: K_Cmd_MDL_EFFECT_SEQ_START/STOP, K_Cmd_SND_STREAM_START/STOP_CH0/CH1","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T09:07:48Z","commit_sha":"17ed438322a746e43a70ef59e8181867ca0d685c","commit_message":"Name radar panel, radar animation steps and title phase wait (batch 9)\n\nradarDrawPanel draws the radar panel; radarStepSlotAnimA/B and radarStepPairAnim\nadvance their counters and animate their slots via radarAnimateValue (A is the\nradar step called from Camp, and B and PairAnim are its helpers); radarPushHistoryValue\nstores a slot value and keeps the previous one as history; titleAdvanceWait is the\nphase wait (advances 0 to 1, returns ready for 0 or 1). Callers in cmpMain.c and\ncode1_0013.c updated; code1_0012.c hand-edited (parse-skipped).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T09:01:32Z","commit_sha":"fcedbfef77d71aab41e922afbcb909465abac7f4","commit_message":"Name the primitive interpolation, rectangle, point and batch helpers\n\nRenames 17 func_ helpers in src/Graphics/primitive.c (quaternion slerp,\ntime interpolation, matrix conversion, entry-table serialization, delta,\ncompose and descriptor registration) and src/Graphics/Primitive/\nsdkPrimitive.c (rectangle queue and draw, point draw, transformed-vertex\nbuild, batch execute, transformed draw and batch queue variants).\nPure renames across the callers: itfMsgProcedure_Window, cmmRankUp,\nsfl_data_inferred, mt_scene, btlResultSimple, kwln, code1_0012/0022/\n0025/0033/0045, mc.c, cldDayChange, comuTimerSequence, Kosaka k_command,\nshdPersona, primitive_inferred_0045ed60, and the two primitive headers.\nDocs carry was-cites. Owner verify 475/475 first-party MATCH on the\ntouched set; elig clean on both owner files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T09:01:13Z","commit_sha":"d82b58c5e46bf74dd47e679797afd469a36ec1f7","commit_message":"Name the model sound record, slot and app binding helpers\n\nRenames 10 func_ helpers: mdlSE.c record create, slot acquire, entry\nstate fill, loaded query, request load and per-frame record update;\nmdlApp.c object-record binding, secondary text binding, callback\nregistration and startup resource preload. Pure renames across the\ncallers in mdlManager, mdlFile wrappers, Kernel (Kwln), Battle\n(btlUnit), promoted units 0010/0019/0047, and docs with was-cites.\nOwner verify 251/251 first-party MATCH on the touched set; elig clean\non mdlSE.c and mdlApp.c.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:58:48Z","commit_sha":"34523e1e3d965ceae3eafe6c56c6102ae86612bd","commit_message":"Name the item shop task, item panel and discounted price helpers\n\nfunc_0033BDC0/func_0033BE40 are the item shop task destroy and create\n(fclItemShopDestroy/fclItemShopCreate). func_0033CBC0 returns an item price\nafter a percentage discount (fclItemShopDiscountedPrice). func_0033CC40,\nfunc_0033D100 and func_0033D130 are the item panel update, destroy and create\ncallbacks (fclItemShopPanelUpdate/Destroy/Create). code1_002e.c caller\nupdated (rename only). Owner verify: 42/42 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:54:08Z","commit_sha":"70de968006f9f1084224307d463394044ac5ee5e","commit_message":"Name nine more y_draw.c functions from their bodies and callers (fclSprite)\n\ny_draw.c, named with the fclSprite prefix the file already uses:\n- func_002b8200 -> fclSpriteSetAppearance (position, size, colour, scales; enables the sprite).\n- func_002b83e0 -> fclSpriteStartEntrance (alpha, reveal scale, position and colour together).\n- func_002b9f90 -> fclSpriteListCreateChild (child task with a 0x6610-byte list of 48 entries).\n- func_002b8150 -> fclSpriteCreatePanelChild (child task with a 0x130-byte panel; sets +0x124).\n- func_002b67a0 -> fclSpriteSetRecordFlag (set or clear a bit in the record's +0x10 word;\n  the record-level twin of fclSpriteSetFlag).\n- func_002b6850 -> fclSpriteHasDisplayFlags (true when flag bits 1-4 are set).\n- func_002b6560, func_002b8120, func_002b9f60 -> fclSpriteDestroyTask, fclSpriteDestroyPanel,\n  fclSpriteDestroyListTask. Each is the destroy argument of its own creator (checked in the\n  kwlnTaskCreateChild calls at 347, 1201 and 1693).\n\nCallers renamed in y_fclCombine.c, y_fclCombineDraw.c, y_smap.c, nmCmdList_inferred_002ba080.c\nand include/fcl_draw_task.h. Each new name has an intent comment above its FUN marker.\nLeft unnamed: func_002b6590 (sets up three entries, not yet traced), func_002b6820 (flag test),\nfunc_002b6340 (update of the 0x100 task), func_002b7f20 (update of the 0x130 panel).\n\nOwner verify: 210/210 MATCH, no status changes against the baseline.\nelig_debug passes on all five .c files. decomp_lint: 0 errors.\nStatus changes against the baseline: 0.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:53:46Z","commit_sha":"c0848c08e1b67c3de7bb19a3ed196f9fa4284226","commit_message":"Name scene-load ready flag, step table copy and resource flag check\n\nBatch P5 of the code1_0015 pass: FldSceneLoadReady (the load-in-progress flag\nread by the script query), FldStepCopyTableEntry, and MT_Scene_AllResFlagSet\n(checks the list 3 resource flag). Names from bodies and callers, intents\nmarked [inferred]. Callers in code1_0017 and k_fldEvent updated.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:48:58Z","commit_sha":"ad1ab153f7ffc8248c9cd8c79328e057c0cb62d9","commit_message":"Name icon task poll, icon start-and-wait commands and mt_scene static helpers","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:47:23Z","commit_sha":"490f39e801ac1f2f8dee6e5f73b427f3e0fffba9","commit_message":"Name the weighted AI entry picker btlAISelectWeightedEntry\n\nfunc_001DEA90 sums the five weights of the unit's character table, draws a\nrandom value, and returns the selected entry. Renamed at its three call sites\n(btlAICommand.c, btlTarget.c extern and call, promoted/code1_001e.c extern);\nthe P3FES port map comment in btlAICommand.c is updated to match. Owner\nverify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:44:02Z","commit_sha":"f64f2f346cb1512888f4ab0c139eb195326a5478","commit_message":"Name the shop draw task, item panel, sound, row, cursor and item-set helpers\n\nfunc_002CA830/func_002CA770/func_002CAA00/func_002CB6A0/func_002CAA10 become\nfclShopDrawCreate/Destroy/SetMode/IsReady/Number (batch 1). func_002E0300,\nfunc_002E0100 and func_002E02D0 are the item panel create, update and destroy\n(fclShopItemPanelCreate/Update/Destroy); func_002DFEC0 plays a sound through a\nfresh handle (fclShopPlaySound); func_002D7C10 draws the selected row\n(fclShopDrawSelectRow); func_002D83C0 wraps the cursor swing\n(fclShopDrawSwingCursor); func_002DFD00 tests the 18 fixed special item ids\n(fclShopIsSpecialItem). Callers in y_fclItemShopDraw, y_fclShop, fclMisc,\ny_fclTalk and code1_002b are updated. Owner verify: 59/59 and 46/46 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:39:00Z","commit_sha":"c3a0b4fdb571c10b257fa6796be2a48fa6f41c6b","commit_message":"Name fade begin, title loader teardown/file-step and slot-table init (batch 8)\n\nfadeBegin sets the fade busy flag that fadeIsIdle reads. titleLoaderTeardown is the\nloader task destroy (paired with titleStartLoader). titleFileLoadStep steps the loader\nfile read. titleSlotTableInit initialises the 11-slot table from resource lookups.\nCallers in Camp, Kosaka, Main and promoted updated; code1_0012.c hand-edited.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:34:21Z","commit_sha":"a7cff782b3582597e151f55021e701fa2efc8816","commit_message":"Name code1_0015 scene resource, camera, frame-state and fade helpers\n\nBatch P1 of the code1_0015 pass: MT_Scene_SetResVector, MT_Scene_ScaleResColors,\nMT_Scene_CallTaskHook, MT_Scene_ApplyCameraParams, MT_Scene_ResetFrameState,\nMT_Scene_GetFrameState, MT_Scene_SetFadeForState, MT_Scene_BeginValueStep and\nMT_Scene_SetWorkValue, named from their bodies and following the MT_Scene_\nconvention of the resource helpers. Callers in Kosaka field, Yajima, Scene,\nand promoted units updated; three parse-failed field files updated by the\nbounded fallback.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:33:56Z","commit_sha":"4be0179f6f3a7223f5482886c059d0f047e90cae","commit_message":"Name flag setter, flag selector, calendar and assert reporters from their bodies","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:26:46Z","commit_sha":"92e15ae305e4ddaba738fdb5bca13e79619fb45b","commit_message":"Name six more functions from their bodies and callers (mc.c, y_draw.c)\n\nmc.c (3):\n- func_002a4390 -> mcUpdateCardStatus. Refreshes the card status flags from the\n  probe result: error codes 1-4 set 0x2000/0x1000 and arm a 10-frame timer, and\n  the status word sets 0x4000 and 0x8000; always sets 0x80000.\n- func_002a6e30 -> mcDrawCardStatusPulse. Draws the card-status pulse overlay\n  (flag 0x4000 selects the pulsing layout).\n- func_002a7920 -> mcDrawSlotDial. Draws one card-slot dial; the callers loop over\n  the slots, and the active variant draws the digit glyphs and the status at +0x3AC.\n\ny_draw.c (8), named with the fclSprite prefix the file already uses for its\nrecord accessors:\n- func_002b5c90 -> fclSpriteSpawnChild (child task with a 0x190-byte work block).\n- func_002b5db0 -> fclSpriteSetPositionBounds.\n- func_002b5e20 -> fclSpriteSetBaseScale (stores +0x130; fclSpriteResetScale copies it\n  into the four layout scales).\n- func_002b5e30 -> fclSpriteSetCornerColors.\n- func_002b5e90 -> fclSpriteStartMove.\n- func_002b5ef0 -> fclSpriteStartBoundsMove.\n- func_002b5fd0 -> fclSpriteStartBoundsMoveFade.\n- func_002b60f0 -> fclSpriteStartFade.\n\nCallers renamed in y_fclCombine.c, y_fclShopDraw.c, y_CmbCardEff.c, code1_002e.c and\nthe fcl_bounds_packet.h / fcl_draw_task.h prototypes. Each new name has an intent\ncomment above its FUN marker, except where the body is self-explanatory.\nLeft unnamed: func_002b5da0 (duplicates fclSpriteWork), func_002b6120/6130/6140\n(flags at +0x154/+0x188/+0x184; meaning needs caller evidence).\n\nOwner verify: 236/236 MATCH, no status changes against the baseline.\nelig_debug passes on all six .c files. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:24:55Z","commit_sha":"77b1fbeb493b2a464611365320673a076a82bc8d","commit_message":"Name the material-animation list, node and collector helpers\n\nRenames 15 func_ helpers in mdlMatAnim.c from their bodies: list create\nand free, node lookup by table, the scaled, pivot and list-update apply\npasses, node-material copy, the maximum channel duration, the chunk\nloader, the clump walkers that collect, flag and count materials by\nname, and the collector allocator. Intent comments sit above each\nmarker. mdlManager.c callers are renamed by hand (the file does not\nparse for ast_edit). Owner verify 150/150 first-party MATCH; elig and\nlint clean on mdlMatAnim.c.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:20:05Z","commit_sha":"3398e784515683d5119129070402f62010c4b4b9","commit_message":"Name movie player create and handle getter in code1_0046 (batch 6)\n\nmwPlayerCreate creates the player task with its name and resets the handle;\nmwPlayerCreateReset does the same and also clears the 0x1FC flag (used by ed_sr);\nmwPlayerGetCurrent returns the current player handle. Callers in sequenceList.c,\ned_sr.c and code1_0012.c (logo/title setup) updated; code1_0046.c and code1_0012.c\nhand-edited (parse-skipped).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:19:56Z","commit_sha":"655169f7fb45556366be20bdd286320e1da01c07","commit_message":"Name AI unit value lookups and action callback flag helpers\n\nfunc_001E5FD0 (AI 0x20AB) -> btlScriptGetSameSideUnitValue and func_001E6050\n(AI 0x20AC) -> btlScriptGetOppositeSideUnitValue: find a unit by id on the\nactor's side or the other side (side bit 1 << side, or its inverse) and return\nits value. func_001B08D0 / func_001B08F0 -> btlActionSetCallbackPending /\nbtlActionClearCallbackPending: set and clear bit 0 of the action's +0x18\nflags, which makes the battle step dispatch the action's state callback.\nAI index comments kept above the markers. Owner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:14:41Z","commit_sha":"f8fa64b1aa8df77a9bee3f18c70bc999025df2a3","commit_message":"Name code1_0013 radar menu state machines\n\nThe four radar menu state machines are named by the menus they drive, from\ntheir callees: the item-use menu, the transfer menu, the persona menu, and the\nrecipient menu. Their intents are marked [inferred]. Callers in Camp/cmpMain,\nthe Kernel radar file and the code1_0013 comments are updated.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:09:52Z","commit_sha":"423f4e8ab354208d3f8f9b45c2256fcd9d5f1d09","commit_message":"Name the community record value and arcana lookup callees (cross-lane, rename only)\n\nfunc_00107AC0 returns the u16 value at +6 of the community record whose id\nmatches (cmmCommunityRecordValue). func_00107890 returns that value for the\nfirst community with a given arcana that has a record\n(cmmCommunityValueForArcana). Callers span Battle, Event, Main, Script,\ng_data, shdPersona, cmmMisc, cmmScript, and promoted files; rename-only.\nmeasured: history comments keep the old names. Owner verify: 811/811 MATCH\nacross 17 files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T08:05:00Z","commit_sha":"45a93626db70db205382f5c7cbcb93f6dad0ac51","commit_message":"Name action effect-index and linked-unit active helpers\n\nfunc_001A0290 -> btlActionGetEffectIndices: writes the two-entry effect index\npair for an action (default 0,3; a flagged action gives 0x24,-1). Slot-active\nunits pick 1,4 / 2,5 by category or charId. Its caller is in\nbtlAction_inferred_001a1450.c. func_001A05F0 -> btlActionLinkedUnitIsActive:\ntests the action's unit's linked unit (+0xA0C) for the active bit (+0x98 & 2)\nwhen the action's flags 0x1 and 0x10 are set. Owner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:59:33Z","commit_sha":"e2843d5f2f1233db1d731fa259af112b648c0a23","commit_message":"Name the mdlEffect joint, packet, camera, anchor and quad helpers\n\nRenames 28 func_ helpers in mdlEffect.c from their bodies: the joint\ntransform builder and node walkers, self-relative pointer resolvers,\nGS packet emitters, camera origin/aim copies, the anchor projection\nand screen-scale tests, the Catmull-Rom point builder, quad load/store\npairs and the word accessors. Pure renames across every caller\n(promoted units, Effect, Model, Battle, Kernel, Scene, Main callers)\nand the two docs carry (was ...) cites. Owner verify 1324/1324\nfirst-party MATCH on the touched set.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:57:00Z","commit_sha":"f9e53295dff16cf6e008144b8f649278e4a8fa67","commit_message":"Name ten more functions from their bodies and callers (g_data.c, mc.c)\n\ng_data.c (7):\n- func_00106c30 -> datEntryHasFlag. Tests bit (arg1 + 4) of the flag word at +0x30\n  of a g_data entry (callers: code1_0011.c, cmpEquip.c).\n- func_0010f3d0 -> datSetBitmapBit; func_0010f420 -> datTestBitmapBit. The set and\n  test pair for the bitmap D_0079BCD8, bit index arg1 + arg0 * 8 (caller:\n  btlTarget_inferred_001f1030.c).\n- func_00104a60 -> datLoadEntryTable. Reads the entry table from disc with\n  H_Cdvd_ReadSync and builds the in-memory copy at iGpffffb1ac (callers:\n  y_fclShop.c).\n- func_00104900 -> datCloneEntryBlock. Copies one entry and its record lists into\n  a new heap block (callers: code1_0034.c, y_fclModel.c).\n- func_00104c50 -> datEntryTableUseBuiltin. Points the entry table at the built-in\n  copy D_0079BF00; init.c calls it when the disc load fails.\n- func_00108cb0 -> datFreeTaskWork. The destroy callback of the community task\n  created in cmmCommunity.c; it frees the task's work block.\n\nmc.c (3):\n- func_002a66d0 -> mcDrawCircleFan. Builds a 40-segment ring around a centre and\n  draws it as a fan (or as a strip when bit 4 of the mode is set).\n- func_002a7710 -> mcSeedEntryTable. Re-randomises the table entries when arg0 is\n  nonzero and seeds the four fixed entries when the table is empty.\n- func_002a6b10 -> mcDrawFadedColor. Sets the colour with alpha arg2 and draws it\n  through func_0045d6e0 only when alpha is nonzero.\n\nCallers renamed in 12 further files (cmmCommunity, init.c, y_fclShop, y_fclModel,\ncmpEquip, btlAICommand, btlEffect, btlTarget, code1_0011/001f/0034) and the\nmc.c and g_data.c definitions. Each new name has an intent comment above its\nFUN marker. Rename only.\n\nOwner verify: 583/583 MATCH, no status changes against the baseline.\nelig_debug src/g_data/g_data.c and src/Kernel/mc.c pass. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:54:39Z","commit_sha":"7ccbba7c721c79387ad435bf75e60eefef0e3e54","commit_message":"Name the CDVD load spawner and its destroy callback\n\nfunc_0025C230 spawns a CDVD load task under the parent for a nonzero resource\nid, storing two load parameters (cmmSpawnCdvdLoad); func_0025C100 is the\ntask's destroy callback, which unlinks and clears the scene resources in its\nlist and destroys the CDVD handle (cmmCdvdLoadDestroy). Callers in cmmScript.c\nand the destroy reference in cmmRankUp.c are updated. Owner verify: 77/77\nMATCH across the two files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:51:03Z","commit_sha":"a73805ba35f82faf0684005eec14a8cf80072d27","commit_message":"Name code1_0011 default-state reset, carry-over and state setters\n\nBatch N of the code1_0011 pass, which finishes the bucket's named\ndefinitions: the persistent-state carry-over across a reset, the new-game\ndefault-state reset, the cleared-word getter (its g_data caller stores it as\nthe cleared flag), the state-table byte setter, the state-image pending\nsetter, the scheduler teardown wrapper, and the script-handle release callback\n(registered by kwln). Cross-lane callers in Event/Fcl, Kosaka, Kernel, Main,\nYajima, g_data and promoted units updated.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:50:10Z","commit_sha":"949a3cd959aa502d646dd00f4d9007b1831e8c87","commit_message":"Name resource lookup, pool allocator and movie player helpers (batch 5)\n\nresourceFindByName is the global name-keyed resource lookup (walks the D_00724C08\nlist; called across Camp, Battle, Event, Kernel, Main, Script, shd and promoted).\nresourceLoadSprites loads sprites for each resource; sdkSpriteTransformPoints\ntransforms four points for sdkSpr; poolAlloc is the pool allocator that pairs\nwith poolFree; mwPlayerUpdate is the player task update that spawns its child.\nCallers updated across lanes; code1_0012.c, code1_0046.c and shdPersona.c\nhand-edited (parse-skipped by ast_edit). The itfMesManager.c:1763 comment still\nnames func_0046a430 (left as is).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:45:01Z","commit_sha":"84c214116e0dd8e185782be16a0b090a3c9bd7f8","commit_message":"Name unit motion layer, body-size scale, anchor pose and slot pose helpers\n\nRead in full, then named from their bodies and callers:\n- func_00198380 -> btlUnitUpdateMotionLayer: per-frame update of one unit's\n  model layer weight (+0xA00 layer 0) and walk/rest motion, switched on the\n  option at +0x9DC. Called only from btlUnitUpdateAll.\n- func_0019F1D0 -> btlUnitApplyBodySizeScale: fits the unit's scale (+0x2C) to\n  its size band from radius (+0x90) and height (+0x8C); the low two bits of id\n  (+0xA8) choose max, mid, min or unscaled, and bit 2 of +0x98 is set.\n- func_00194FF0 -> btlUnitGetAnchorPose: writes the unit's grid position,\n  focus position and blended rotation; about 30 callers across battle files.\n- func_001951F0 -> btlUnitGetSlotPose: slot position from the per-kind table\n  at iGpffffb3e0, scaled by the unit and rotated by its quaternion, or placed\n  relative to a target when the mode is 2 (approach distance).\nOwner verify MATCH (354 files/functions across the touched set).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:39:57Z","commit_sha":"7dd44f84c7e33e86efecf3f962a131e1edf50808","commit_message":"Name the mt_misc scene builder mtMiscBuildScene (func_00296850)\n\nThe orchestrator takes a source record and a target: it builds the scene\nnodes, the type 1, 2, 4, 5, and 19 record sets, copies the header words from\narg0+0x90, and allocates per-entry nodes counted at arg0+0x58. Renamed in its\ndefinition (mt_misc_inferred_002962f0.c) and its extern and call in the\npromoted code1_0028.c. The measured: history comment keeps the old name.\nOwner verify: 27/27 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:37:54Z","commit_sha":"1e2e20be5eb12833c87b992a54335666e17a6fd2","commit_message":"Re-apply the small effect renames in code1_004b and the batch 21/22 moved files\n\nTaking upstream's code1_004b.c during the rebase dropped the TLP,\neffMisc and EffBattleAllocWork renames from that unit, and the moved\nmdlEffect_inferred_004b1680.c and _004b1ad0.c still used the old\nfunc_00482800 and func_00482ad0 names. Pure callee renames only,\ndeclared shapes unchanged. Owner verify 216/216 first-party MATCH on\nthe overlap set.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:32:39Z","commit_sha":"8f5717481e5e8d834d6d5c82467da651e1f8dc92","commit_message":"Name pending-date accessors, date setter, discard helper; fix date command names\n\ng_data accessors (callee layer): func_001060d0/e0/f0 read the pending next date\nindex, pending time slot and pending flag; func_00106300/10/20 write them. The\ncode1_0012 advance path consumes them: when the flag is set it applies the\npending date and slot through datSetDateIndex/datSetTimeSlot, then clears the\nflag. func_00106100 sets the date index and the weekday flags.\nfunc_0029e9b0 is a varargs no-op, now scrDiscardArgs.\nHandlers: K_Cmd_DATE_SCHEDULE (sets pending date from month/day, pending slot,\nflag=1); K_Cmd_DATE_IN_RANGE (calIsDayInRange), K_Cmd_DATE_WEEKDAY\n(calGetWeekdayOfDay) and K_Cmd_STRING_DISCARD replace names that did not match\ntheir bodies. No logic change.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:31:04Z","commit_sha":"3a382b825919e133533900ada887b70175911255","commit_message":"Name shdPersona skill-list stage function\n\nBatch K of the shdPersona pass: the skill-list stage that shows the next\nunlocked skill, or moves to the next stage and picks a random skill pair,\nnamed from its body.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:26:24Z","commit_sha":"e7ba03b3f4395e50ff96a23f7f6ca7dd4c631b1c","commit_message":"Name per-frame unit update and look-at update loops\n\nfunc_0019C0D0 -> btlUnitUpdateAll: per-frame pass over the four unit lists\n(follow path, function 0x198380 call, partner mark and persona resource by\nlist index, model light, alpha fade, model matrix). func_0019CFB0 ->\nbtlUnitUpdateAllLookAtTargets: calls btlUnitUpdateLookAtTarget for units with\nthe +0x98 bit 2 set. Both are called from battle.c. Owner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:24:22Z","commit_sha":"34f480fedb1aed19895aa3f864294a1261f13526","commit_message":"Name the message-manager accessor and the mt_misc sound wrappers\n\nfunc_0029D030 returns the message-window manager index from the script\ncontext at +0x130 (scrGetMessageManager; callers in cmmScript.c and\nitfMesManager.c). func_002981F0 requests a sound track through\nsdkSndRequestTrack (mtMiscRequestSoundTrack) and func_00298220 fades a\nsound channel out (mtMiscFadeOutSoundChannel); both are called from\nevtMain.c. Rename-only; the existing argument-count mismatches at the\nevtMain call sites are left as they are. Owner verify: 192/192 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:21:35Z","commit_sha":"8adf4788db47d1c773fe77fbf140d377109154d0","commit_message":"Name title loader, slot-model and sound-start routines in code1_0012 (batch 3)\n\ntaskReleaseSlotModel frees the slot model handle at task+0x38 (pairs with\ntaskPrepareSlotModel). titleDrawScene is the title scene draw (brightness and\ndraw-mode arguments). The title loader: titleStartLoader creates the loader task,\ntitleLoaderReap destroys it and returns its result, titleLoaderDestroy releases\nits model; titleSoundStartStep/Destroy and titleStartSoundTask are the sound-slot\nwait task (hsndSlotIsStarting). Callers in Kosaka/Field/sequenceList.c,\nMain/gameSequence.c and Main/logoDraw.c updated; code1_0012.c hand-edited.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:16:40Z","commit_sha":"9f3cc9fe664ae6e30825a036adf2b1c13a026002","commit_message":"Name shdPersona state, phase, status and display-control helpers\n\nBatch H of the shdPersona pass: the destroy wrapper with its state assert,\nthe phase finisher, the status fill by state, the display-state setter,\nthe panel state setter, the state-block fill, the display-control position\nrefresh, the child handle and colour setters, the opacity store, and the\ndisplay-control handle store, named from their bodies. Callers in Battle,\nEvent, Main, promoted units and the header updated.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:11:59Z","commit_sha":"592b25c6e00cbe9ff1cac2a8ca7bb2431ce2888f","commit_message":"Name persona alpha colour getter\n\nfunc_00195530 -> btlUnitGetPersonaAlphaColor: for a genus-2 (persona) unit it\nreturns the alpha byte from the data row at +0x56, shifted into the top byte\nover white (0xFFFFFF). It returns -1 for other genera. The one caller in\nbtlAction_inferred_001a1450.c uses the value as the colour packet target.\nOwner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:10:41Z","commit_sha":"e12b8822d9af617e54baecb6bc96cf31dab4b972","commit_message":"Name fade, calendar and title routines in code1_0012 (batch 2)\n\nFade (iGpffffb1cc): fadeDrawWipe, fadeDrawMesh, fadeUpdateCallback (the queued callback),\nfadeStatus (renamed from func_00122720; callers in Battle, Event, Fcl, Graphics, Kosaka,\nMain, promoted and Script updated). Calendar: calendarStepTimeSlot (date/time-slot step),\ncalendarSyncFromDate, calendarDrawBackdrop (calendar draw callback; calendarDraw is\nalready taken by calendar.c). Unit panel: drawNumberSprites (digit sprites),\ndrawUnitStatusPanel. Slot models: taskPrepareSlotModel. Title: titleBuildPointRows,\ntitleDrawShadeBars, titleDrawTaskView. code1_0012.c hand-edited (parse-skipped by ast_edit).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:07:10Z","commit_sha":"e836f049aa15afb0caeaac8959f309150bcb8fb1","commit_message":"Name the save-file preparation step H_Memcard_PrepareSaveFileStep\n\n- func_004647c0 -> H_Memcard_PrepareSaveFileStep. A per-frame state machine\n  over sceMc2 async calls: it reads card info, searches for and creates or\n  verifies the save file (returns 2 while busy and 4 when ready), and returns\n  negative codes on error. An intent comment sits above the FUN marker, which\n  cites the worker-10 owner audit. The function remains NONMATCHING and\n  guarded in the source; the audit note is unchanged.\n\nName checked against src/ and include/ first. Callers: src/Kernel/mc.c\n(the extern and mcMemcardStep's switch). The tests/test_build.py strings are\nsynthetic build-tool fixtures and are not changed; docs/*_headstart and\ndocs/probe_archive keep the old name as history.\n\nOwner verify: 32/32 MATCH, no status changes against the baseline.\nelig_debug passes on both files. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:04:12Z","commit_sha":"d21e2b1492fb0da2aabab75cc86360c46ce251f3","commit_message":"Name effect-state predicate, date/task/string command handlers, frame slot buffer\n\nKDraw_IsEffectDone tests the state word (==1) of a task record; callers clear\nthe alpha blend and destroy the task when it is set (fade task in the frame\ncamera path). K_Cmd_DATE_GET/K_Cmd_DATE_CHECK wrap the date index helpers,\nK_Cmd_TASK_DESTROY destroys a linked task in mode 0, K_Cmd_STRING_SET stores\na script string, FldFrame_GetSlotBuffer returns the slot vector buffer at\n+0x2BC. No logic change.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T07:02:32Z","commit_sha":"dba6efab78645b8a1171e1454a5cd7d01ff1f1b5","commit_message":"Move 12 inferred runs out of the promoted buckets into *_inferred*.c files (batch 22)\n\nOwner verify all touched functions MATCH. Elig clean on all touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2886128,"complete_code_percent":91.94817,"complete_data":0,"complete_data_percent":100,"total_units":646,"complete_units":594}},{"timestamp":"2026-10-16T06:57:58Z","commit_sha":"c55f93ca2352b2d43998d60fb680a3ff58095e48","commit_message":"Name calendar range test, day-table value, state image pair and task destroy in code1_0011\n\nBatch G of the code1_0011 pass: the month-day range test, the day-table\nvalue lookup for today and phase, the capture and restore pair for the\npending state image, and the task-hierarchy destroy wrapper, which has\nthe same body as shdPersonaDestroyTask and takes the Alt suffix. Callers\nin code1_0012, shdPersona and the cmm units are updated; comment mentions\nare updated in the same commit.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2879728,"complete_code_percent":91.74428,"complete_data":0,"complete_data_percent":100,"total_units":622,"complete_units":574}},{"timestamp":"2026-10-16T06:57:37Z","commit_sha":"b10d08ef6024c45f7b2a2859c7705405e80291f6","commit_message":"Name the cmmScript fishing round and aim step handlers\n\nfunc_0024F160 is the fishing round step: state 0 resets the round and rolls\nweather and date values, later steps count the catch timer and set the bite\nflag after the third bite (cmmScriptStepFishingRound). func_0024F790 is the\naim step: it clears the catch flags, arms entry 1, picks a random starting\nangle, and steers from the direction input (cmmScriptStepFishingAim). Both\nare registered in cmmScriptEntryUpdate's state machine, whose comment now\nuses the new names. Owner verify: 51/51 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2879728,"complete_code_percent":91.74428,"complete_data":0,"complete_data_percent":100,"total_units":622,"complete_units":574}},{"timestamp":"2026-10-16T06:52:55Z","commit_sha":"772a886f120a6f5644edc7fc7b4eccbc5f1dc035","commit_message":"Name the memory-card probe dialog driver mcCardProbeStep\n\n- func_002a32c0 -> mcCardProbeStep. Runs H_Memcard_ProbeCardStep from state\n  +0xC = 0. A ready card returns 1. The error codes open a dialog and move to\n  the wait states (0xA/0xB). The later states open a second dialog (0xC/0xD)\n  and return 4 when it closes. Four callers in mc.c. An intent comment sits\n  above the FUN marker.\n\nThe name was checked against src/ and include/ before the rename.\nOwner verify: 31/31 MATCH, no status changes against the baseline.\nelig_debug src/Kernel/mc.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2879728,"complete_code_percent":91.74428,"complete_data":0,"complete_data_percent":100,"total_units":622,"complete_units":574}},{"timestamp":"2026-10-16T06:50:52Z","commit_sha":"2e99d541ed4ee474b6ae8bf53c73e9aba20b0c75","commit_message":"Name motion setter, colour packet callbacks and leader/script helpers\n\nfunc_00198920 -> btlUnitSetMotion: writes the motion id (+0x9DA), frame, rate\n(+0x9E0) and option (+0x9DC) into the unit; all callers are updated, and the\nmeasurement comments keep the old name. Colour packet callbacks from\nbtlUnitCreateColorPacket: func_0019B710 -> btlUnitHoldPendingColor (increments\nthe pending count at +0xA0), func_0019B730 -> btlUnitColorPacketUpdate,\nfunc_0019BBC0 -> btlUnitReleasePendingColor (decrements it). func_00193260 ->\nbtlIsLeaderStandardUnit (datCalcIsStandardUnit on the leader, behind the\nbattle flag gates). func_00193630 -> btlScriptSetUnitClass and func_001936A0\n-> btlScriptGetUnitClass (script commands over datCalcSetUnitClass /\ndatCalcUnitClass). Owner verify 362/362 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2879728,"complete_code_percent":91.74428,"complete_data":0,"complete_data_percent":100,"total_units":622,"complete_units":574}},{"timestamp":"2026-10-16T06:44:29Z","commit_sha":"7e1fd3ef8c52045bbba1eb6f09f4aaa71dd3e939","commit_message":"Name fade routines in code1_0012 and their callers\n\nfadeTaskStep and fadeTaskDestroy are the fade task step and its destroy (fade.c\nsource unit, iGpffffb1cc state); fadeQueueCallback queues the fade completion\ncallback; fadeState returns the fade state and fadeIsIdle reports that no fade is\nactive. Callers in Event, Kosaka, Main/OpEd and promoted updated; code1_0012.c\nhand-edited (parse-skipped by ast_edit).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2879728,"complete_code_percent":91.74428,"complete_data":0,"complete_data_percent":100,"total_units":622,"complete_units":574}},{"timestamp":"2026-10-16T06:43:58Z","commit_sha":"7652d062520f4d1e486055b66e06e6691cb1e0e1","commit_message":"Name the cmmScript entry choice, confirm, and month-profile readers\n\nfunc_002502F0 arms the entry and returns a choice (0, 1, or 2) from status\nbits 0x10 and 0x20 once bit 4 is set (cmmScriptPollEntryChoice);\nfunc_00250560 is the yes/no variant on bits 8 and 0x80\n(cmmScriptPollEntryConfirm); func_00250940 returns one of four month-profile\nfields for the current date's record (cmmScriptReadMonthProfile). Comment\nreference in the month-provider block updated. Owner verify: 51/51 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2879728,"complete_code_percent":91.74428,"complete_data":0,"complete_data_percent":100,"total_units":622,"complete_units":574}},{"timestamp":"2026-10-16T06:39:10Z","commit_sha":"2c7950b785b7d56aa5d87b474e6cd220cfc316b6","commit_message":"Move 12 inferred runs out of the promoted buckets into *_inferred*.c files (batch 20)\n\nOwner verify all touched functions MATCH. Elig clean on all touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2879728,"complete_code_percent":91.74428,"complete_data":0,"complete_data_percent":100,"total_units":622,"complete_units":574}},{"timestamp":"2026-10-16T06:36:18Z","commit_sha":"d617c81aa6ce1d8add204df5d733063e6b497d8f","commit_message":"Name the memory-card probe step H_Memcard_ProbeCardStep\n\nRequested by TUCensus, who moved the function into h_memcard_inferred_00466280.c.\n\n- func_00466280 -> H_Memcard_ProbeCardStep. A per-frame state machine: it\n  polls the card info with sceMc2GetInfoAsync, reads the free-block count and\n  formats it with sprintf for display, and returns 100 when the card is ready\n  and negative codes (-1, -4, -5, -9) on error. An intent comment sits above\n  the FUN marker.\n\nThe name was checked for collisions in src/ and include/ before the rename.\nCallers renamed: src/Kernel/mc.c (the extern and the call in func_002a32c0).\nThe generated/ M2C mirror and docs/probe_archive keep the old name as history.\n\nOwner verify: 32/32 MATCH, no status changes against the baseline.\nelig_debug passes on both files. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2869248,"complete_code_percent":91.41039,"complete_data":0,"complete_data_percent":100,"total_units":598,"complete_units":566}},{"timestamp":"2026-10-16T06:34:35Z","commit_sha":"0514469b7fcddfa83d6fd80177f2064ea789ee03","commit_message":"Name clump light/world getters, spipe record accessors, K_Viewer_Create\n\nK_Clump_GetWorld/GetLightA/B/C read the four clump globals (iGpffffba70/74/78/7C).\nK_Spipe_* names follow the record fields read in their bodies: +8 state, +2 id,\n+4 level, +6 kind, +7 bit0 enable, and the state-band thresholds. K_Spipe_Finish\nmarks the record done and clears the global. K_Viewer_Create creates the child\ntask with the K_Viewer update and destroy callbacks.\nNo logic change.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2869248,"complete_code_percent":91.41039,"complete_data":0,"complete_data_percent":100,"total_units":598,"complete_units":566}},{"timestamp":"2026-10-16T06:30:21Z","commit_sha":"c88608fefc17c843b461a943ee89ee83af175445","commit_message":"Name calendar window test and day-flag mask helpers in code1_0011\n\nBatch F of the code1_0011 pass: the day-window flag test, the default\nday-flag setter, and the six-flag mask read, write, capture and restore\nhelpers, named from their bodies. Callers in code1_0012 and the other\nunits updated; comment mentions updated in the same commit.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2869248,"complete_code_percent":91.41039,"complete_data":0,"complete_data_percent":100,"total_units":598,"complete_units":566}},{"timestamp":"2026-10-16T06:29:55Z","commit_sha":"01ab2157ee5262e6ecb45586ce88f175a78fb02b","commit_message":"Name the cmmScript popup-banner and score-display entry callbacks\n\nfunc_0024C460 is the entry step that animates the result popup banner over\nfive frames when flag 2 is set (cmmScriptStepPopupBanner); func_0024D1F0 is\nthe score display step that uses cmmScoreBounce and cmmScoreDisplacement\n(cmmScriptStepScoreDisplay). Both are registered in cmmScriptStartEntries.\nOwner verify: 51/51 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2869248,"complete_code_percent":91.41039,"complete_data":0,"complete_data_percent":100,"total_units":598,"complete_units":566}},{"timestamp":"2026-10-16T06:25:27Z","commit_sha":"249d86b32513518a9813eecc672e82bcd56a19d9","commit_message":"Name script command-timer getter scrGetCmdTimer\n\nfunc_0029D020 -> scrGetCmdTimer: returns cmdTimer at +0x138 of the script\nblock (ScrData, src/Script/scrTraceCode.c). P3FES names the same getter\nscrGetCmdTimer. Fourteen callers across the Battle, Kosaka, Script, Main and\npromoted lanes are updated in place. func_001935F0 (battle.c) is renamed\nbtlScriptHasCmdTimer: it is true when the script command timer is positive,\nthrough the constant-true func_001fc270 check. This supersedes the earlier\nbtlCountIsPositive name. Owner verify 189/189 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2869248,"complete_code_percent":91.41039,"complete_data":0,"complete_data_percent":100,"total_units":598,"complete_units":566}},{"timestamp":"2026-10-16T06:22:40Z","commit_sha":"1ef3ffc663fc192e2044ce9306d04610491eb4cb","commit_message":"Name the object particle create, free, clump, record, draw and resource helpers in effObjectParticle.c","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2869248,"complete_code_percent":91.41039,"complete_data":0,"complete_data_percent":100,"total_units":598,"complete_units":566}},{"timestamp":"2026-10-16T06:20:32Z","commit_sha":"43e02511fc2c7620c9dbd86bc39679dc19b72093","commit_message":"Callee-first batch 3: name 7 table-dispatched and surface-picker functions (pure renames)\n\nCommon command-table handlers resolved to their library names (p4flow Common,\ngroup base 0x0): func_00299890 K_Cmd_BGM (0x6F), func_002998d0 K_Cmd_BGM_STOP\n(0x70), func_00299920 K_Cmd_EVT_SE_PLAY (0x71), func_00299970 K_Cmd_EVT_SE_STOP\n(0x72), func_002999d0 K_Cmd_EVT_SE_PLAY2 (0x73; the body requests a track, the\nlibrary name is kept), func_00299a10 K_Cmd_EVT_SE_STOP2 (0x74). Each carries\na p4flow citation comment. func_0014be50 FldFrame_PickSurfaceAtPoint: picks the\nsurface entry under a point; its one caller is FldEvent_SelectEntryAtPosition\n(promoted k_fldEvent.c). Owner verify: 43/43 MATCH across the three touched C\nfiles.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2869248,"complete_code_percent":91.41039,"complete_data":0,"complete_data_percent":100,"total_units":598,"complete_units":566}},{"timestamp":"2026-10-16T06:16:14Z","commit_sha":"a7baec3b1a1743c2a361bcd8d7663c2742129dda","commit_message":"Name btlTarget/btlFormation evidence residuals\n\nbtlFormationEnterTurn and btlFormationLeaveTurn are the turn packet begin/end hooks\n(+0x68/+0x70) that adjust the work counter at +0xA0; btlFormationClearAttachVector\nis the attach-position callback that zeroes its result; btlTargetClearRecord,\nbtlTargetResetRecordCounter, btlTargetClearResultBuffer, btlTargetInitSpring,\nbtlTargetGetStatusEffectMsgCode, btlTargetClearFlaggedBuffs and btlTargetCancelPlayback\nname the record, counter, result, spring, status-message, buffer and playback helpers.\nCallers across btlAction, btlBoss, btlFormation, btlMain, btlTarget, btlVoice and\npromoted updated; measured comments follow the new names.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2869248,"complete_code_percent":91.41039,"complete_data":0,"complete_data_percent":100,"total_units":598,"complete_units":566}},{"timestamp":"2026-10-16T06:15:33Z","commit_sha":"d5c4a493b12900b4c3ffcb5ba4a62ab3761c14ca","commit_message":"Name the cmmScript entry start, stop, and indexed-value handlers\n\nfunc_00250120 starts the entry tasks (cmmScriptStartEntries), func_002507C0\narms and then fades out the entry channel (cmmScriptStopEntries), and\nfunc_00250870 returns a six-entry table value selected by the record index\n(cmmScriptReadIndexedValue). Owner verify: 51/51 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2869248,"complete_code_percent":91.41039,"complete_data":0,"complete_data_percent":100,"total_units":598,"complete_units":566}},{"timestamp":"2026-10-16T06:13:18Z","commit_sha":"a3f2bdf1dc9295c8a8f21e4134943d7ab0f2b134","commit_message":"Move 12 inferred runs out of code1_0048 into Graphics Model mdlEffect *_inferred*.c files\n\nOwner verify 67/67 MATCH. Elig clean on all touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2869248,"complete_code_percent":91.41039,"complete_data":0,"complete_data_percent":100,"total_units":598,"complete_units":566}},{"timestamp":"2026-10-16T06:10:55Z","commit_sha":"58aca0edf9c6fa8febaf293c613c6c9fd3d6b3fa","commit_message":"Name the mc.c date and location header\n\n- func_002a95c0 -> mcDrawDateAndLocation. Formats the month and day with\n  sprintf, looks up the location name with mcLocationName, draws the name with\n  frFontExDrawTextWithCharWidth, and forwards to mcDrawLocationText. An intent\n  comment sits above the FUN marker.\n\nCallers are in src/Kernel/mc.c only (the extern declaration and the call\nsites). Rename only.\n\nOwner verify: 31/31 MATCH, no status changes against the baseline.\nelig_debug src/Kernel/mc.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T06:09:25Z","commit_sha":"cb0df5e20e77e5aebc83d345817e77b6186fff6d","commit_message":"Name quaternion matrix packet update and factory\n\nfunc_001BA590 -> btlQuatMatrixPacketUpdate: converts the stored quaternion at\n+0..+0xC into a rotation matrix each frame and copies it to the draw list,\nstarting from the battle rotation at iGpffffb3ac+0x20C on frame 0.\nfunc_001BA710 -> btlQuatMatrixPacketCreate: stores the rotation and frame\ncount. The prototype in btl_camera_sequence_internal.h moves with it.\nOwner verify 49/49 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T06:06:38Z","commit_sha":"72b6d064f6fbc049e37af1ec04c65e0e866e600f","commit_message":"Callee-first batch 2: name 7 leaf functions by behaviour (pure renames)\n\nLayer-1 leaves of the unnamed call graph after batch 1. FldMap band predicates\nover the current field: func_0014a190 FldMap_IsInEitherBand, func_0014a200\nFldMap_IsCurrentInBandA, func_0014a270 FldMap_IsCurrentInBandB, func_0014a160\nFldMap_IsCurrentInEitherBand (current field id/room from iGpffff9db0).\nfunc_001026f0 FldShadow_InstallIntcHandler (registers the INTC handler\nFldShadow_PollIntcBit13 and undoes it on failure). func_00266a90\ncldDayChangeMarkDone (sets the done flag on the day-change work record).\nfunc_00299e60 K_Cmd_DATE_DISP: command-table index 0x66 (Common library name\nDATE_DISP; the isOn argument goes to func_001238c0).\n\nEvery caller is renamed in the same change: Kernel, Field, Kosaka, Scene and\npromoted files, the measured pragma comments that name the old functions, and\nthe m2c_bulk.py template that emits the callee name. Owner verify: 411/411 MATCH\nacross the 29 touched C files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T06:02:51Z","commit_sha":"cdeeb43d306f6ae1c8160e4504f20e49ee4ed18e","commit_message":"Name persona block setters, close state, snapshot start and sprite draw\n\nBatch D: shdPersona setters 0x44 and 0x4C4 are named by the field they\nwrite (the old footstep label was not supported by the code; the header\ncomment is corrected). The raw close-transition dump is named by its\nbehaviour and marked for a rewrite. The 15-word snapshot display start is\nshdPersonaBeginDisplay. The cross-file sprite draw in code1_0034 is\nsdkSpriteDrawOnceScaled. Callers in Battle, Event, Main/OpEd, promoted\nunits and the header updated.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T05:56:57Z","commit_sha":"08658c7acd87af72a0a4c2d846a29fdfa05aa9f5","commit_message":"Name the distortion particle alloc, source, texture, record and draw helpers in effDistortParticle.c","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T05:49:32Z","commit_sha":"4781529ca5516dfd511ad9dc6e261ac733369603","commit_message":"Name the one-shot sprite draw helper mtMiscDrawSpriteAt (func_0029E9E0)\n\nThe routine allocates a sprite node from the sprite table at iGpffffb540,\nsets its position, alpha (0xFF minus arg1), and 4096-scaled size, centres\nit when arg2 is 1, then draws and frees the node. Name follows the sdkSprite\nfamily for the calls it makes, with the mtMisc prefix for its mt_misc\ncallers; sdkSpriteDrawOnce is already taken by Kernel/sdkSpr.c. Rename-only\nacross 20 files (Event, Kosaka, Script, promoted). Owner verify: 65/65 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T05:48:41Z","commit_sha":"5cbcf3d9aee43cfce4f4e0a0eda46c2c45540935","commit_message":"Name btlCamera bdd60 encounter-callback suppressor\n\nbtlCameraSuppressEncounterCallback sets bit 1 of the camera word at +0xF8; the\nencounter-callback path in btlCameraApplyView is skipped while that bit is set.\nCalled once at the end of the round's recovery step (btlAction 001b1510 and\npromoted code1_001b updated).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T05:43:37Z","commit_sha":"bb8cff926cb477bcc3b8b510b7d5f7a8fce1e6e6","commit_message":"Name look-at deactivate, colour and rotate-toward packet functions\n\nfunc_0019E5D0 -> btlUnitHoldPendingLookAtDeactivate and func_0019E7A0 ->\nbtlUnitReleasePendingLookAtDeactivate: the init and destroy of the look-at\ndeactivate packet, incrementing and decrementing the unit's pending count\nat +0xA0. func_0019E5F0 -> btlUnitLookAtDeactivatePacketUpdate (resets the\nlook-at blend on the party or enemy lists, or on the single unit).\nfunc_0019BBE0 -> btlUnitCreateColorPacket (packet 0x112, BtlUnitColorWork).\nfunc_00201DB0 -> btlUnitRotateTowardUnitPacketDestroy (releases the pending\ncounts on the unit and its target). Rename-only call-site updates in the\nBattle and promoted lanes. Owner verify 253/253 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T05:42:39Z","commit_sha":"4e0302ac313d16a27eb6b1ea93154e62336c05c1","commit_message":"Name the eff_after history, side-axis, frame-normal, ribbon, trail-mesh, queue and command helpers","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T05:36:15Z","commit_sha":"d8869ad48e4b50fd7816d88c9894e38f3e846907","commit_message":"Name shdPersona display-control, level-up and skill-replace functions\n\nBatch C of the shdPersona pass: 21 functions for the display-control task\n(create, destroy, reconfigure, position, offsets, colour and load state),\nthe level-up route and skill-learn state machine, the skill-replace state\nmachine, and the kwln destroy wrapper, renamed from their bodies. Callers\nin Battle, Camp, Event (y_fclCombine) and promoted units updated.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T05:34:20Z","commit_sha":"ac60949b07c389a86afc51b8175c2e1395dcbc62","commit_message":"Name btlCamera 001d1310 formation-count and slot routines\n\nbtlCameraCountUnitsByBand tallies alive units into four distance bands;\nbtlCameraFindFormationForCounts returns the first formation entry that fits those\ncounts; btlCameraSelectFormationIndex realigns cells and selects a formation;\nbtlCameraSetUnitSlotValue stores a per-slot value for the unit's state;\nbtlCameraAssignFormationSlots assigns party and enemy slots and faces the sides;\nbtlCameraNudgeUnitPair moves a unit pair along its direction. Callers in btlAction,\nbtlFormation, btlUnit and promoted updated; measured comments follow the new names.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T05:29:21Z","commit_sha":"502e8ea71579ec75d7df9053e8ef202681b007e6","commit_message":"Name the unit-record save reset and battle-end commit\n\nfunc_00193AD0 -> btlUnitRecordResetSaveTable: resets the ten 20-byte\nunit-record slots of save chunk 40 (D_0079BE2C); its caller func_0010F4C0\nin src/g_data/g_data.c owns the chunk's save/load copy.\nfunc_00193D30 -> btlUnitRecordCommitPending: walks the four unit-record lists\nand promotes records with the pending bit to the committed bit at battle end.\nAdds BTLUNIT_RECORD_FLAG_PENDING (0x01) and BTLUNIT_RECORD_FLAG_COMMITTED\n(0x04) for the flag byte at packet +0x47. Owner verify 199/199 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T05:22:44Z","commit_sha":"4e9a89066c31e04f834342278448d16dc77b5bc5","commit_message":"Name the tn slot, upload, table-accessor, dispatch and task helpers in tnEffect.c","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T05:16:08Z","commit_sha":"65cb2289b0a74f9517276a4fab0e630eb200294c","commit_message":"Name the action list allocator, tick, destroy and lookups\n\nfunc_001B0930 -> btlActionCreate: allocates a 0x458-byte action, assigns its\nuid and id, and links it at the head of the list at +0x174.\nfunc_001B0A60 -> btlActionListUpdate: walks the list, counts down the\nper-action timer, applies the state transition and unlinks finished actions.\nfunc_001B0BF0 -> btlActionListDestroyAll: unlinks and frees every action.\nfunc_001B0C80 -> btlActionFindByUnit (match on the unit at +0x30) and\nfunc_001B0CC0 -> btlActionFindById (match on the id at +0x08). Rename-only\ncall-site updates in the Graphics, Battle and promoted lanes. Owner verify\n709/709 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T05:14:25Z","commit_sha":"3c5fe8350c105793f4a0abf1bbee9a297b328d81","commit_message":"Name btlSound 001f6100 playback, status-counter and slot-queue routines\n\nPlayback request/cancel/state and handle release; the +0x3F6 status counter\nblock (select, bump, clear, is-high); status cure roll and immunity check; HP/SP\ndelta for a status effect; resist and status-talk voice pickers; slot queue\nreset and advance; the retail select-track dispatch. Call sites across Battle,\npromoted and Graphics/Model updated; measured comments follow the new names.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T05:09:54Z","commit_sha":"bf4f63d2c81eb8eb11e5c0568d319bedd4afe56d","commit_message":"Name shdPersona transition, selection, skill, flag and model functions\n\nBatch B of the shdPersona pass: 30 functions for the open and close\ntransitions, selection tweens and cursor, skill add/replace/pulse/reveal,\nflag setters, model load and create/destroy, quad strips and the first\ndisplay-control helpers, renamed from their bodies. Callers in Battle,\nCamp, Event (y_fclCombine, y_fclCombineDraw) and promoted units updated.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T04:59:44Z","commit_sha":"29e2ec4a08ba780e19e899cfcf1fe05187c8cbe8","commit_message":"Name the geometry block, grid, matrix and texture helpers in effGeometry.c","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T04:57:32Z","commit_sha":"b78793a530d43d65832ae6946177919722f97249","commit_message":"Name the two other memory-card screen frames in mc.c\n\nThe memory-card screen has three per-frame routines. mcRunScreenFrame (the\nintro) is already named. These two complete the set:\n\n- func_002a5630 -> mcRunScreenExitFrame. Fades the frame's alpha from 255 down\n  over frames 10..30, then resets the counter and returns 1 after frame 30.\n  Same layout code as the intro, with the fade in place of the ramp.\n- func_002a5f00 -> mcDrawScreenSettled. The steady frame: full alpha, no ramp\n  or counter, slide step toward the target row, then one final draw and a\n  return of 1.\n\nCallers renamed in src/Kernel/mc.c (6 references).\n\nOwner verify: 31/31 MATCH, no status changes against the baseline.\nelig_debug src/Kernel/mc.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T04:55:02Z","commit_sha":"ca76b3989f331cae21ba034eccc1b27d56020e74","commit_message":"Name radius-list routines in btlTarget_inferred_001ed3a0\n\nbtlTargetResetRadiusState resets the radius list head and its fields;\nbtlTargetAddRadiusNode places a unit's grid cell, sets its radius area and links\nthe node; btlTargetRemoveRadiusNode unlinks a linked node;\nbtlTargetRefreshRadiusNode rebuilds the area when the cell changes. Call sites in\nbattle_inferred_001927c0, btlAction_inferred_001b1510, btlFormation, btlUnit,\nbtlUnit_inferred_0019c0d0/0019d550/0019d670 and code1_0019 updated.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T04:51:09Z","commit_sha":"e6da557e149a577359145f737d6d4761ea0c5333","commit_message":"Name the action queue push, move, sort and requeue helpers\n\nfunc_001b0D70 -> btlActionQueuePush (first empty slot of the 12-entry queue\nat +0x29C); func_001B0E30 -> btlActionActiveListPush (same over +0x2CC).\nfunc_001B0F20 -> btlActionQueueMoveToFront and func_001B0FA0 ->\nbtlActionQueueMoveToBack. func_001B1020 -> btlActionQueueSortByRank (bubble\nsort by battle-stat rank, with a random bonus for enemies when arg0 is set).\nfunc_001B11C0 -> btlActionQueueSortKeepingKind (swap adjacent entries of\ndifferent kinds, keeping arg0's kind in place). func_001B1280 ->\nbtlActionQueueRequeueLeadingEnemies (requeues the leading enemy entries).\nbtlTarget_inferred_001f1030.c is a parse-skipped file; its two call sites\nwere renamed by hand. Owner verify 207/207 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T04:46:11Z","commit_sha":"1d6b1a12ccbb9945c2efbc3166bc798a6f0e9d02","commit_message":"Name NPC model name builder and shuffle-card panel helpers (rename across lanes)\n\nbtlBuildNpcModelName (func_00231380): writes the npc/ or npc2/ model file name for a battle model id, with a variant from its table entry and the flags. btlBossResolveNpcModelName (func_00231550): the boss name resolver's case 5 wrapper. pscModelInitPanel (func_00368d30), pscModelStepAnimation (func_00368e80), pscModelBuildTileVertices (func_0036ae90), pscModelCopyVector (func_0036b630), pscModelEnqueueDrawNode (func_00369470): shuffle-card panel helpers from gc_model_inferred files, called from btlShuffleCard.c. Callers renamed in btlBoss_inferred_002305c0.c and btlShuffleCard.c. Intents added. func_00369440 (callback in Kernel/Kwln/kwln.c) is not renamed here.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T04:44:40Z","commit_sha":"64f1b134cd485e6a84dbe3eed84cb500e914de8c","commit_message":"Name the mt_misc scene-node builder and record collectors\n\nfunc_00294280 builds the scene's fixed event nodes (mtMiscBuildSceneNodes).\nfunc_002962F0, func_00296600 and func_00296720 collect records of type 4,\n5 and 19 into event nodes (mtMiscCollectType4Records,\nmtMiscCollectType5Records, mtMiscCollectType19Records), following the\nmtMiscCollectType1/2Records convention. func_00296850, the orchestrator,\nstays unnamed. Owner verify: 5/5 MATCH on the two files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T04:40:26Z","commit_sha":"714d998c3ee1b7acf2b38aaecf1881a5d82f0306","commit_message":"Name the particle block, record, material-slot, texture, subtype-chain and draw helpers in effParticle.c","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T04:38:06Z","commit_sha":"27bdb9aaad88c07253e57c496d85ae119a4751ae","commit_message":"Name four functions from callers and bodies (mc.c, g_data.c)\n\n- func_002a4f20 -> mcRunScreenFrame. Per-frame body of the memory-card\n  screen: animates a 16-slot window with a wave-driven slide, draws the\n  glyph and meter (mcDrawGlyph, mcAdvanceMeter), and returns 1 after 30\n  frames. Its siblings func_002a5630 and func_002a5f00 are left unnamed\n  until their differing branches are read.\n- func_001064c0 -> datPersonaClearRosterMode. Calls datPersonaSetRosterMode(0).\n- func_00106c80 -> datIdBand. Maps an id to band 0 (below 0x100), 1 (below\n  0x200), or 2 (0x200 and up).\n- func_001060b0 -> datGetDateIndex. Returns D_00797B7A. frFont's month and\n  day helpers (itfMesSetMonthText, itfMesSetDayText) pass it to\n  func_001104d0 to split month and day.\n\nCallers renamed across 44 files (159 references), mostly in other lanes\n(Battle, Kosaka, Event, Graphics, Camp, Script, promoted units). This is a\nrename-only change and touches no behaviour.\n\nOwner verify: 1073/1073 MATCH, no status changes against the baseline.\nelig_debug src/Kernel/mc.c and src/g_data/g_data.c pass. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T04:31:38Z","commit_sha":"5a3b61eda8068ec3bb187776ec14aef1df095ea7","commit_message":"Name placement entry and fade routines in btlEffect_inferred_001d6f20/001d7*\n\nbtlEffectCreatePlacementEntry and btlEffectDestroyPlacementEntry allocate and\nrelease a placement record linked on the global effect list;\nbtlEffectRefreshPlacementState re-places a pending entry; btlEffectApplyFadeCustomColor\napplies a custom fade colour; btlEffectSetFadeLevel and\nbtlEffectCreateFadeLevelPacket set and queue a fade level. Cross-lane call sites\nin btlUnit_*, btlEffect.c, btlBoss and code1_* updated.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T04:30:48Z","commit_sha":"f7d027c8b8197d6a058947088d1be958612bb363","commit_message":"Name the move packet update and its pending hold/release pair\n\nfunc_00196D00 -> btlUnitMovePacketUpdate (move packet update, id 0x10A).\nfunc_00196CE0 -> btlUnitHoldPendingMove and func_001973D0 ->\nbtlUnitReleasePendingMove: init and destroy for btlUnitCreateMovePacket.\nBodies match btlUnitHoldPendingAnim/ReleasePendingAnim (+1/-1 on the\nunit's pending counter at +0xA0), but they belong to a different packet\nkind, so they keep their own names. Owner verify 53/53 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T04:25:34Z","commit_sha":"83943b58efe2f0e564bf68ac900e51ff806d4626","commit_message":"Name the line nova create, destroy, reseed, bind and kind-instance helpers in effLineNova.c","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T04:25:25Z","commit_sha":"896ff1de9bc8b59de5f1dc55a8b278eb5698da7e","commit_message":"Name the event-model manager task functions\n\nfunc_002930E0 / func_002931A0 are the manager task's update and destroy\ncallbacks (evtModelUpdateTask, evtModelTaskDestroy); func_00293270 destroys\nthe named task (evtModelDestroy); func_002932B0 flushes one resource's queued\nnodes (evtModelFlushResource); func_002933A0 and func_00293710 queue motion,\nwith and without a position and angle (evtModelQueueMotion,\nevtModelQueueMotionAt). Parameter names come from the existing prototypes in\nscene_event_internal.h. Owner verify: 59/59 MATCH on evtMain, evtModel, and\nmt_evtCustomEvent_inferred.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T04:19:07Z","commit_sha":"05e4b307120a1a2a5bd4c33806f5c9ea0cc97f4e","commit_message":"Move 12 inferred runs out of code1_0045/0046 into Kosaka k_clump, Graphics primitive *_inferred*.c files\n\nOwner verify 80/80 MATCH. Elig clean on all 13 touched files. Includes a typedef with a trailing __attribute__ that the move now carries (MovieQuadword).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":564,"complete_units":533}},{"timestamp":"2026-10-16T04:15:43Z","commit_sha":"0dfc93a40177b5257e99aa9f0c8b665bf92691cc","commit_message":"Name the motion-state getter and the arc-offset packet\n\nfunc_00198810 -> btlUnitGetMotionState: returns the s16 at +0x9DA when\nflags2 bit 1 is set, else 0; callers pass it as the motion id to\nbtlUnitMotionFrames and switch on it in btlAction.\nfunc_0019a5e0 -> btlUnitCreateArcOffsetPacket (packet id 0x108, hold and\nrelease pair, value stored in the work).\nfunc_0019a370 -> btlUnitPacketArcOffsetUpdate: offsets the unit along its\nrotated facing by an arc of the packet phase; returns 1 when the arc\ncompletes. Owner verify 183/183 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":540,"complete_units":509}},{"timestamp":"2026-10-16T04:12:58Z","commit_sha":"f4f2fd248867c672f4bf2b82799f63a7ff5e643d","commit_message":"Name sfl_data quad helper and rename its callers (rename across lanes)\n\nsflDataDrawQuad (func_00366960): queues a four-point colour quad of a given width and height, with packed RGBA and a transform matrix. Renamed in sfl_data_inferred.c, code1_002a.c, code1_0036.c and seven Yajima y_timeLimit_inferred files. The two measured: comments that mention the old name are kept as history. func_00366380 (the message frame renderer declared in include/message_frame_internal.h) and func_00366c70 (function-pointer state table) stay func_. Intent added.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":540,"complete_units":509}},{"timestamp":"2026-10-16T04:10:47Z","commit_sha":"3033d5c7e3c50daed689bf55a2ff8044a81404b3","commit_message":"Name the ring circle, strip, colour and kind-instance helpers in effPolygonRing.c","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":540,"complete_units":509}},{"timestamp":"2026-10-16T04:05:54Z","commit_sha":"a39183ed9042e9fe6230f56b3e648c7acc3b48d3","commit_message":"Name voice playback state routines in btlTarget_inferred_001f9be0\n\nbtlVoiceResetPlaybackState resets the 0x14-byte playback block and its state\nfields; btlVoiceFreePlaybackBuffers frees the two playback buffers and clears\ntheir flags. Callers in battle_inferred_001927c0.c and code1_0019.c updated.\nThe three empty or constant stubs in that file stay unnamed.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":540,"complete_units":509}},{"timestamp":"2026-10-16T04:01:00Z","commit_sha":"536800dd8cc188ca9edc08d117d9163ba6581ee1","commit_message":"Name the scrCommonCommand task and flag script handlers\n\nfunc_00298D30 destroys the task named D_0063CFA0 (scrDestroyTaskByName),\nfunc_00298D70 pushes datGetFlag of parameter 0 (scrGetFlag), and\nfunc_00299560 destroys a linked task by id (scrDestroyTaskById). Names\nfollow the scrVerb naming used in scrScriptProcess.c. Owner verify: 3/3 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":540,"complete_units":509}},{"timestamp":"2026-10-16T04:00:34Z","commit_sha":"0a254d33c86df0f1449062c73d38b0588617aa87","commit_message":"Name eight frFont text helpers from the 0x270100 run\n\nRequested by MainBattleTU. Each name was checked against its body first.\n\n- func_002706f0 -> itfMesRefreshText. Re-lays out the text work with no\n  string while the frFont mode is 0.\n- func_00270870 -> itfMesSetMonthText; func_00270910 -> itfMesSetDayText.\n  Format the first and second calendar fields from func_001104d0 into the\n  text work.\n- func_002709b0 -> itfMesSetWeekdayText. Copies the weekday name from\n  D_0063BAB0.\n- func_00270780 -> itfMesSetSlotNameText. Copies cmmSlotNameRecord of the\n  active slot in the current group.\n- func_00270a80 -> itfMesSetCommunityNameText. Uses cmmNameRecord; the\n  current community when the key is 0.\n- func_00270b80 -> cmmCommunityScriptAddPoints. Script command that adds\n  points through cmmCommunityAddPoints; the current community when the id\n  is 0.\n- func_00270ca0 -> cmmCommunityScriptAddPointsChecked. Adds points only when\n  cmmCommunityHasRecord is true.\n\nEach name has an Intent comment above its FUN marker.\n\nOwner verify: 17/17 MATCH. No status changes against the baseline.\nelig_debug src/frFont_inferred_00270100.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":540,"complete_units":509}},{"timestamp":"2026-10-16T03:56:51Z","commit_sha":"e66434f3904ca7704a9aac4131296127eced5b5a","commit_message":"Rename the field scene helper externs in fclMisc_inferred_002bd7b0.c\n\nFollow-up to the field helper rename: the split file from the upstream\nFcl move still declared and called func_00144f60/func_00145080.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":540,"complete_units":509}},{"timestamp":"2026-10-16T03:54:27Z","commit_sha":"282bacf54df5dcb1ce2584765b0e5557ed1495ee","commit_message":"Name the track instance, emitter, mode, ribbon and setter helpers in effPolygonTrack.c","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":540,"complete_units":509}},{"timestamp":"2026-10-16T03:51:47Z","commit_sha":"b5256b9c112702d4335723afb978075b30df07db","commit_message":"Name btlEPL allocator pairs and per-frame effect steps\n\nAllocator pairs are named after the object their update routines read:\nbtlEplAllocColorPair (two-V4 pair driven by the colour-pair fade),\nbtlEplAllocColorValueTarget (two-V4 value/target pair from the resource\nmanager) and btlEplAllocColor (one V4 colour), each with its free wrapper.\nThe five per-frame steps are btlEplStepUnitFadeInOut, btlEplStepColorPairFade,\nbtlEplStepUnitRgbaFade, btlEplStepColorValueTargetFade and btlEplStepColorFade.\nEmpty func_001fd780 stays unnamed.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":540,"complete_units":509}},{"timestamp":"2026-10-16T03:48:14Z","commit_sha":"6f0243fbbaeb9de114a25394b7f8b4dd71eff651","commit_message":"Name gc_model panel helpers (rename across lanes)\n\npscBuildModelMatrix (scale, quaternion rotation and translation into a panel matrix), pscPanelSetColor (copies a colour and sets the dirty flag that pscModelDraw checks), pscPanelWriteVertexColors (writes one RGBA into the four vertex colour blocks), pscPanelDrawGrid (copies corner vertices, then draws the 0x138-index triangle list). Callers renamed in pscModel.c, btlShuffleCard.c and the TUCensus split gc_model_inferred_0036ae90.c. Intents added.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":540,"complete_units":509}},{"timestamp":"2026-10-16T03:41:59Z","commit_sha":"dd19d37e420174d62b9789d9176b41d9dcfc8aa7","commit_message":"Retype card handle locals and drop the call-site casts\n\nbtlShuffleEff eff/slot/held, cutinDraw and mt_sceneIcon handle stores,\nand shdEffect handle reads now carry u8 pointer types, so the casts that\nbridged the retype are gone. func_004b1250's caller-side prototype in\nbtlShuffleEff takes void * like its definition. Owner verify: 21/21 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":540,"complete_units":509}},{"timestamp":"2026-10-16T03:38:58Z","commit_sha":"cfbb18ec3be580b82d705ea7852ad052bbe76bb7","commit_message":"Name the btlMain remainder helpers from their bodies\n\nfunc_001b6120 -> btlMainSetupCameraAndEffects: camera snapshot, quaternion\nconversion, palette copy and effect geometry setup (probe note\nBattle_camera_setup_001b6120).\nfunc_001b6a20 -> btlMainSyncSceneDrawColors: copies two colours into SceneDraw\nlist-4 slots when context flag 2 is set.\nfunc_001b6ab0 -> btlMainDrawSkyOverlay: sky render states and colour quad\nwhile the alpha at +0x268 is positive.\nfunc_001b70c0 -> btlUnitUpdateModelLight: per-unit light update from the\nunit's model resource.\nfunc_001b73f0 -> btlMainApplyUnitBaseColors: base colour to one unit, or to\nevery unit in the two team lists when given NULL.\nfunc_001b7520 -> btlMainFieldColorFadePacketUpdate: packet callback that fades\ntwo snapshotted field colours.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":540,"complete_units":509}},{"timestamp":"2026-10-16T03:35:48Z","commit_sha":"da7e06c41ef644359a5ae583249e6a9469ef9662","commit_message":"Move 14 inferred runs out of code1_0036/0045/002b into Event Fcl, Main Panel, Kernel sdkTask *_inferred*.c files\n\nOwner verify 95/95 MATCH on the moved functions. The 0044f4d0 pair is held in code1_0044 (apply copied guard text: COMPILE_ERROR), so sdkDbprt_inferred.c is not committed.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":540,"complete_units":509}},{"timestamp":"2026-10-16T03:33:54Z","commit_sha":"47f6052aab71d11caefd635995d65985d5fe8373","commit_message":"Name formation placement and node-pool routines in btlEffect\n\nEight routines named from their bodies: the formation placement step\n(prepare, step, finish), packet creation, fade-node update and node-pool\nalloc/free. Cross-lane callers updated per the tree-wide rule. The empty\nbtlEffect_inferred_001d6a60 stub stays unnamed.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":517,"complete_units":486}},{"timestamp":"2026-10-16T03:29:19Z","commit_sha":"e71add18951514eefa6851c84bb8716407bb7a3b","commit_message":"Name the category getter and the mc.c meter step\n\n- func_00104ea0 -> datGetCategoryValueById. Returns the category value for\n  unit arg0: D_007973F4[category] for hero id 1, else the per-unit s16 at\n  D_00796D74 + id*0x88 + category*2. Pairs with datSetCategoryValueById, which\n  writes the same slots.\n- func_002a6c30 -> mcAdvanceMeter. Steps the meter counter at +0x3D0 within\n  0..5 (up while flag 0x80000 is set, down otherwise), then draws the four\n  meter cells with the scaled count.\n\nCallers renamed in src/shdScript.c, src/promoted/code1_0011.c, src/Kernel/mc.c,\nand g_data.c (4 files, 10 references).\n\nOwner verify: 218/218 MATCH, no status changes against the baseline.\nelig_debug src/g_data/g_data.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":517,"complete_units":486}},{"timestamp":"2026-10-16T03:23:00Z","commit_sha":"0d809b1fa8d8c47cbdb6a156b5fe9551a58954d0","commit_message":"Name the btlUnit group-bounds and attach-point helpers\n\nfunc_00196040 -> btlUnitGetGroupBounds: centre, radius and top/bottom extent\nof the filtered units in the selected groups; returns the radius.\nfunc_00195b60 -> btlUnitGetAnimBoundsWorldCenterTowardUnit: anim-bounds\nrecord 0xA centre, rotated toward another unit.\nfunc_00195d50 -> btlUnitGetAttachedSphereCenter: attach-matrix point, falling\nback to the sphere centre when no attach matrix is available.\nCall sites in 67 files (btlCamera*, btlEffect_inferred*, btlFormation*,\nbtlAction_inferred_001a1450/001b1510 and btlUnit_inferred*). Comment\nreferences are not rewritten.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":517,"complete_units":486}},{"timestamp":"2026-10-16T03:22:15Z","commit_sha":"b577999cc19149cd9a869730c8e0a408c16ba40c","commit_message":"Name the clump instance loader and the food court task (pure renames)\n\nk_clumpInstance.c: func_001924d0 becomes K_Clump_CreateLoadTask (allocates the\n0x454-byte load state and creates the task); func_001921a0 becomes\nK_Clump_LoadDirUpdate (scans a directory, reads each matching model file,\nloads it through K_Clump_ReadChunks, and releases the clumps in state 5);\nfunc_00191e90 becomes K_Clump_ReadChunks (reads RW chunks: texture dictionaries\nand clumps, filling the clump list); func_00192480 becomes K_Clump_LoadDestroy.\nk_fldFoodCourt.c: func_0018dd40 becomes K_FldFoodCourt_Create, func_0018d950\nK_FldFoodCourt_Update and func_0018dcd0 K_FldFoodCourt_Destroy. Callers:\nK_Clump_CreateLoadTask in k_testMenu.c, and K_FldFoodCourt_Create in\nsrc/promoted/k_sequence.c. A measured comment is updated to the new name.\nOwner verify: 12/12 MATCH across the three files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":517,"complete_units":486}},{"timestamp":"2026-10-16T03:17:36Z","commit_sha":"9a0edbb8fbcc4adf68d235296635d8e24b624f97","commit_message":"Add reasons for unnamed helpers in code1_0025 and code1_0026 (comments only)\n\nfunc_0025ff60 (word-0 task getter used by blur tasks and cmmRankUp/cmmScript on other task types) and the func_0026fba0 family (text setters over DAT words with no established meaning) stay func_ with a one-line reason above each.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":517,"complete_units":486}},{"timestamp":"2026-10-16T03:16:16Z","commit_sha":"24b9a4beba3536bf585b12a52c77eb42c5b5f3da","commit_message":"Name the shuffle task flag helpers in btlShuffle\n\nFive helpers named from their bodies: set and test task flag bits 1 and 4,\nand the phase reset. Call sites updated in src/promoted/code1_0021.c. The two\nsub-record getters at +0x6C and +0x70 stay unnamed (offset-only bodies).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":517,"complete_units":486}},{"timestamp":"2026-10-16T03:12:53Z","commit_sha":"068dfd964c7669dbb955ebaa40c10919f286ff2c","commit_message":"Retype card handles as u8 pointers across Battle, Event, and shared callers\n\nThe card-handle helpers in promoted/code1_004b.c take u8 * (func_004b1130,\nfunc_004b1150, func_004b1290, func_004b13d0, func_004b11b0, func_004b13f0,\nfunc_004b1250). Caller prototypes now match those definitions, which\nclears the H011 declaration-mismatch findings. Call sites that pass or\nstore a handle held in s32 get a (u8 *) or (s32) cast; that is a no-op on\nMIPS. Owner verify: 173/173 first-party MATCH on all seven files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":517,"complete_units":486}},{"timestamp":"2026-10-16T03:10:12Z","commit_sha":"e7ad28b22ff7794ce64e70fdccff1744e07e5ef1","commit_message":"Name the funnel, falling funnel, spiral and kind-table wind helpers in effPolygonWind.c","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":517,"complete_units":486}},{"timestamp":"2026-10-16T03:03:21Z","commit_sha":"7f81da7b52118b9a9dc6fbc9ddbb84edd6afa76f","commit_message":"Name twelve Common-table script command handlers (pure renames)\n\nTwelve handlers in three k_command_inferred_0025* files are group-0 command\ntable entries (0x63D070 in retail SLUS_217.82; Common.json). Their library\nnames are FUNCTION_xxxx placeholders, so each is named from its body and its\ncallees, with the scrCommon* prefix that scrCommonPartyIn already uses:\n0x33 scrCommonGetMonth and 0x34 scrCommonGetDay (func_001104d0 month/day);\n0x43 scrCommonGetRankProgress (datCategoryRankProgress); 0x45\nscrCommonPersonaAddStat, 0x46 scrCommonPersonaAddBonusStat and 0x47\nscrCommonPersonaGetTotalStat (datPersona* stat calls); 0x53\nscrCommonSetItemCount (func_00106620, item count clamped to 99); 0x54\nscrCommonGetCharStat and 0x55 scrCommonSetCharStat (the g_data per-character\nhalfword get/set pair); 0x59 scrCommonNop (returns 1); 0x5a\nscrCommonGetPartyMember (datGetPartyId); 0x5b scrCommonLoadPersonaRecord\n(datPersonaLoadRecord). Owner verify: 23/23 MATCH across the three files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":517,"complete_units":486}},{"timestamp":"2026-10-16T03:00:08Z","commit_sha":"5cde1f90bd424845b14e9e8eb4ddd7cbac311dcb","commit_message":"Name scene path sampler MT_Scene_SamplePath in its moved file (rename only)\n\nOrigin moved the definition from code1_0026.c into mt_sceneFunc_inferred_0026cef0.c under its old name. The declaration in scene_event_internal.h and the mt_sceneFunc.c caller already use MT_Scene_SamplePath.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":517,"complete_units":486}},{"timestamp":"2026-10-16T02:56:13Z","commit_sha":"8987c5a0ef47ea177ec7cf954464d102a01e9b47","commit_message":"Move 12 inferred runs out of code1_0029/002a into Kosaka, Script, Yajima *_inferred*.c files\n\nOwner verify 56/56 MATCH. Elig clean on all 14 touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":517,"complete_units":486}},{"timestamp":"2026-10-16T02:50:51Z","commit_sha":"5f9c659d090e579254354fffa7b8b8e71285ebc6","commit_message":"Name CmbCardEff card-layout state machines\n\nThe nine-state layout machines are named by card count (two through six,\nplus the full twelve-slot variant), matching the dispatcher's phases. Also\ncmbCardApplySlotTransform (position and scale), cmbCardEffSetTween (two-\nkeyframe setter), and cmbFiveSpriteTask (five-sprite task). All callers\nlive in y_CmbCardEff.c.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":493,"complete_units":462}},{"timestamp":"2026-10-16T02:41:50Z","commit_sha":"8a5a31e304f25d9e1eee729adf6caac53daf0f65","commit_message":"Name arcana finders and date-list gate\n\nfunc_00247770 and func_00247820 return the top-ranked community and\npersona of an arcana; func_00247020 tests a pending unlock; func_00247F60\ntests whether a date is absent from the pair list. Script wrapper\nfunc_0024AB70 takes cmmScriptTopPersonaOfArcana. Event, Script, and\npromoted callers are rename-only.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":493,"complete_units":462}},{"timestamp":"2026-10-16T02:34:16Z","commit_sha":"c62771a464aa5314732dc715f5a7ddac88c75af5","commit_message":"Name the persona display-name builder and getter\n\n- func_0010d560 -> datBuildPersonaDisplayName. Copies two 0x12-byte name\n  fields from the hero record (D_007973A0 and D_007973B2) into the scratch\n  buffers, then formats the display name into D_00796E20 with sprintf.\n- func_0010d620 -> datPersonaDisplayName. Returns the composed buffer for\n  hero id 1 and the name table entry D_005E4480[id] for other ids.\n\nLeft unnamed: func_0010d660, func_0010d6d0, and func_0010d740. Each selects\nbetween two name tables (D_005E4540, D_005E4570) and the two name parts, and\nthe sprintf argument order does not settle which part is first. func_0010d6d0\nand func_0010d740 have identical bodies, so one is likely a duplicate.\n\nCallers renamed in src/cmmScript.c, src/itfMesManager.c, promoted\ncode1_0011/0012/0035.c, and g_data.c (6 files, 15 references).\n\nOwner verify: 480/480 MATCH, no status changes against the baseline.\nelig_debug src/g_data/g_data.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":493,"complete_units":462}},{"timestamp":"2026-10-16T02:26:25Z","commit_sha":"2cd583816a3a7640bc75451faf14c8513c22081a","commit_message":"Name func_001959d0 btlUnitGetAnimBoundsWorldCenter\n\nTransforms the unit's BtlUnitAnimBounds centre (record 0) to world space\nwith scale, rotation and position. Callers in btlCamera*, btlEffect_inferred_00200cb0\nand code1_001c updated (call sites only in BattleNamesB's files).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":493,"complete_units":462}},{"timestamp":"2026-10-16T02:18:23Z","commit_sha":"f31b9aece9310189ccb712a337692f3f218be3e6","commit_message":"Name the route and status routines from btlTarget_inferred_001eec60\n\nEleven routines named from their bodies: A* open-list pop, A* path search,\narc route builder, slot value fallback, side battle-stat average, encounter\nroll, move-state code, current-unit id, status-target pick, random candidate\npick and counter-target pick. Call sites updated tree-wide in src/Battle and\nsrc/promoted; generated sources untouched.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":493,"complete_units":462}},{"timestamp":"2026-10-16T02:11:20Z","commit_sha":"3aac33276fdfb8790d1418eb98e042ec5ed501df","commit_message":"Name the polygon flash rotating, radial, textured and box helpers in effPolygonFlash.c","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":493,"complete_units":462}},{"timestamp":"2026-10-16T02:03:36Z","commit_sha":"b08c8080c4c95e19ea4b7abb7951e38a393954b2","commit_message":"Name the shadow camera destructor and atomic projection callback (pure renames)\n\nfunc_001790a0 becomes FldShadow_DestroyCamera: it detaches the camera's frame,\ndestroys that frame and the z-buffer raster, clears the frame-buffer pointer, and\ndestroys the camera. Its only caller is FldShadow's teardown in k_shadow.c.\nfunc_00179f70 becomes FldShadow_ProjectAtomic: it stores the atomic in the\nshadow context and projects its skinned triangles with\nFldShadow_ProjectSkinnedTriangle. It is the RpClumpForAllAtomics callback in\nk_spipe_inferred_00179fc0.c and is declared in include/field_shadow_internal.h.\nThe extern in src/promoted/code1_0017.c is updated to match. Owner verify:\n25/25 MATCH across the three k_spipe/k_shadow files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":493,"complete_units":462}},{"timestamp":"2026-10-16T01:55:59Z","commit_sha":"d8abe24e06e0ff9ed714cd93df55be5805366957","commit_message":"Move 12 inferred runs out of code1_0026/0027 into Scene, Graphics Font, Script itfMes *_inferred*.c files\n\nOwner verify 85/85 MATCH. Elig clean on all 14 touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":493,"complete_units":462}},{"timestamp":"2026-10-16T01:40:23Z","commit_sha":"72db26e483694b57aabf336993bb84172b3fd842","commit_message":"Name script message-stream check cmmScriptHasMsgStreamEntry","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":481,"complete_units":450}},{"timestamp":"2026-10-16T01:32:04Z","commit_sha":"b6d487363c7a62d2600b2b9ada2f15460c031676","commit_message":"Name the g_data.c staged-record API\n\ng_data.c keeps one staged persona record: a 0x30-byte copy at D_0079B6A8 and\nits id at D_0079B6A4. Callers in y_fclCombine.c use it as the combine\nscreen's current record before datPersonaInsertRosterRecord.\n\n- func_00110270 -> datStageRecord (copies 0x30 bytes in, then sets the id)\n- func_001102c0 -> datStageSetId (sets the staged id only)\n- func_001102d0 -> datStagedId (returns the staged id)\n- func_001102e0 -> datStagedRecord (returns the staged record)\n\nCallers renamed in src/Event/Fcl/y_fclCombine.c (extern declarations\nincluded) and g_data.c (2 files, 58 references).\n\nLeft unnamed: func_00109190 (averages 21 u16 entries and scales by 10 at\nits caller; the meaning of the averaged field is not established from the\ncallers), func_00106b80 (id band mapping, used by code1_002b.c), and\nfunc_00105330 (returns D_00797F88[0] ignoring its argument; the field is\nnot identified).\n\nOwner verify: 176/176 MATCH, no status changes against the baseline.\nelig_debug src/g_data/g_data.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":481,"complete_units":450}},{"timestamp":"2026-10-16T01:15:52Z","commit_sha":"b5fdf6017f55c2ef1cebdfc003eaac08d4d40e4d","commit_message":"Name the AI handlers in btlTarget_inferred_001ea360\n\nEleven handlers named from their bodies: action-mode setters, unit-kind flag\ncheck, stored-value getter, formation-sequence queue, camera finishes with a\nstate or a move, and camera-vector stores. AI command indices (0x2103..0x210A,\n0x20BB..0x20C0) stay in the intent comments.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":481,"complete_units":450}},{"timestamp":"2026-10-16T01:08:17Z","commit_sha":"797b96819299198f17e8c6493ddd13088eccaa3c","commit_message":"Name the blur filter slot, draw and ref-object helpers in effBlurFilter.c","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":481,"complete_units":450}},{"timestamp":"2026-10-16T00:52:04Z","commit_sha":"73dab6ff3b7feeba0bcfa934325bec1725ad988a","commit_message":"Move 12 inferred runs out of code1_0024/0025/0026 into Main/Battle/Data, Kosaka, Scene, Script *_inferred*.c files\n\nOwner verify 98/98 MATCH. Elig clean on all 15 touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":481,"complete_units":450}},{"timestamp":"2026-10-16T00:43:32Z","commit_sha":"177e5aa7e31572d90099c7e89631024d50acfcec","commit_message":"Name itfMes window state helpers in code1_0027 (rename only)\n\nitfMesWindowAdvanceRow, itfMesWindowCommitSelection, itfMesWindowPollSelection, itfMesWindowMoveSelection, itfMesWindowFindPressedEntry, itfMesWindowStepTransition, itfMesWindowUpdateLists, itfMesWindowMarkRedraw, itfMesWindowTaskUpdate, itfMesWindowQueueCallback and itfMesWindowFreeAll are named from their bodies and itfMesManager callers. Corrects the op numbers in the itfMesWindowStepState and itfMesWindowStepTransition intents (ops 4, 5, 6, 0xA, 0xB, 0xC and 0x10, 0x11, 0x12).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":470,"complete_units":439}},{"timestamp":"2026-10-16T00:34:55Z","commit_sha":"997231757583cb989253c1dcb78a6a956699f48d","commit_message":"Update cmm accessor names in comments","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":470,"complete_units":439}},{"timestamp":"2026-10-16T00:26:41Z","commit_sha":"fa5b7300aae2e40e9732eb017e55f246f0e76502","commit_message":"Name five more mc.c functions\n\nmc.c is the memory-card icon and sky/location task. Name these five from\ntheir bodies:\n\n- func_002a6680 -> mcQueueDrawJob. Creates a work block with the callback\n  func_002a6650 and appends it to the draw list D_00796370.\n- func_002a6af0 -> mcCurrentSlotValue. Reads the 32-bit value at the slot\n  index in +0x3AC of the work block.\n- func_002a6b60 -> mcDrawGlyph. Draws one character (arg2 & 0xFF) at the\n  position in the work block; the glyph is 0x3D or 0x39 depending on flag 2.\n- func_002a4d10 -> mcAnimateTransition. Eases two rectangles and a colour over\n  20 frames with sinf, using the frame counter at +0x568.\n- func_002a34e0 -> mcMemcardStep. Drives the H_Memcard_* sequence (abort,\n  check card, seq mode) for the memory-card icon task.\n\nLeft unnamed for now (their bodies need more reading): func_002a32c0,\nfunc_002a4390, func_002a4f20, func_002a5630, func_002a5f00, func_002a6b10,\nfunc_002a6c30, func_002a66d0, func_002a6e30, func_002a7710, func_002a7920,\nfunc_002a95c0.\n\nCallers renamed in src/Kernel/mc.c (18 references).\n\nOwner verify: 31/31 MATCH, no status changes against the baseline.\nelig_debug src/Kernel/mc.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":470,"complete_units":439}},{"timestamp":"2026-10-16T00:18:07Z","commit_sha":"cb93825a3c53410cfad2ca7f62ed782aa1782a42","commit_message":"Name three btlUnit helpers by their callers\n\nfunc_00195ea0 -> btlUnitGetHudAnchor: world point used for HUD panels,\ngauges and selection entries (btlPacketBuildHitFlags, transition panel).\nfunc_00195f70 -> btlUnitGetStatusMarkerPoint: point anchoring the\nbad-status marker overlay in the UI loop.\nfunc_001987a0 -> btlUnitSetRandomAnimFrame: random frame below the model\nframe count, then set.\nTouches btlEffect_inferred_00200cb0.c (BattleNamesB): call sites only.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":470,"complete_units":439}},{"timestamp":"2026-10-16T00:07:30Z","commit_sha":"7ce65dee4d3fabd5189b6d7a6c0259d271d3cf57","commit_message":"Name the AI handlers in btlTarget_inferred_001eaa80\n\nEleven handlers named from their bodies: battle-flag set/clear, damage\nsource on/off, side-and-ID check, formation move, no-hit check, side-unit\napply, position-by-index, presentation finish and event packet enqueue.\nAI command indices (0x20C2..0x210B) stay in the intent comments.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":470,"complete_units":439}},{"timestamp":"2026-10-15T23:58:04Z","commit_sha":"9a1f4bfcf41b5f7e5e2460f88f84d92c6c5f1ddc","commit_message":"Name the mdlFile wrapper helpers, layer tick, bucket flush and atomic walker\n\nRename 10 functions to behaviour names (rename only, no retyping). Each gets an intent comment above its FUN_ marker.\n\nmdlFile.c (shared wrapper and table helpers):\n- func_0047DCC0 -> mdlReleaseSharedWrapper: frees the handle at +4, drops the object's count at +0, frees the wrapper.\n- func_0047DE00 -> mdlSetWrapperValue; func_0047DE50 -> mdlClearWrapperHandle.\n- func_0047F2C0 -> mdlApplyMaterialColorRow: colour-row apply callback; writes the target's material colour user data.\n- func_004808B0 -> mdlReleaseU16Ref; func_004808F0 -> mdlRetainU16Ref (u16 count at +8).\n- func_00480910 -> mdlAppendU32Entry: appends to the table indexed by the u16 count at +4.\n\nLayer, atomic and ordering table:\n- func_00473B20 -> mdlAdvanceLayer (mdlManager.c): advances a layer's clock or blend and rebases its pose; returns arg1 when the layer has no animation.\n- func_00477900 -> mdlDoubleAtomicEntryW (mdlManager.c): atomic callback that doubles the fourth float of each table entry. Its volatile values array is kept with its measured note.\n- func_004623A0 -> sdkOtFlushBuckets (promoted/code1_0046.c): walks the ordering-table buckets. Cross-lane pure rename: callers in src/Kosaka/k_shadow.c and src/Main/mainDraw.c.\n\nCallers updated in mdlManager.c, mdlMatAnim.c, k_shadow.c and mainDraw.c. docs/architecture.md, docs/first_party_matching_handoff.md and docs/matching.md carry each old name as '(was ...)'.\n\nOwner verify: 6 touched code files, 240 MATCH, zero non-MATCH rows. Elig clean on all six.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":470,"complete_units":439}},{"timestamp":"2026-10-15T23:48:30Z","commit_sha":"746e6c74f1ed2e05e2b9026f081cc3a370111b84","commit_message":"Name seven Common-table command handlers from the P4 flowscript library (pure renames)\n\nSeven handlers in k_command_inferred_00175f70.c are entries of the group 0\ncommand table (0x63D070 in retail SLUS_217.82; group 0 maps to Common.json).\nThe table's parameter counts match each body, so each index names its handler:\n0x30 CALL_FIELD (4 params), 0x32 CALL_EVENT (3), 0x3b CALL_LMAP (1),\n0x3c CALL_TV (0), 0x3f CALL_DNG_FLOOR (2), 0x4f CALL_TITLE (0),\n0x69 CALL_FOOD_COURT (0). Each is renamed to K_Cmd_<name>. No callers\noutside the file. The architecture note's group-0 range is updated to the new\nfirst name. Owner verify: 17/17 MATCH for the file.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":470,"complete_units":439}},{"timestamp":"2026-10-15T23:39:07Z","commit_sha":"a1e6ebb4605155b2e38a7ea96f0528489f8fd142","commit_message":"Move 12 inferred runs out of code1_0022/0023/0024 into Battle, Main/Battle/Data *_inferred*.c files\n\nOwner verify 140/140 MATCH. Elig clean on all 15 touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":470,"complete_units":439}},{"timestamp":"2026-10-15T23:30:04Z","commit_sha":"97cb4952fab20ddf7006462880fd9c0bd3391b77","commit_message":"Name itfMes op 8 wrapper itfMesWindowSendLayoutLists; add ItfMesWindowOp enum\n\nOp 8 places the body and text lists in all five window procedures, so it is the one op with a shared meaning. The other op wrappers stay func_ because their op meanings differ across window kinds.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":458,"complete_units":427}},{"timestamp":"2026-10-15T23:21:26Z","commit_sha":"561e7eb94f13abc74eaf1dd9f5a0f8bc514d7e1c","commit_message":"Name community record-flag bits by meaning\n\nREVERSED (0x1) and BROKEN (0x2) are evidenced by CMM_SET_REVERSE and\nCMM_SET_BROKEN (p4flow 0x3011/0x3012) and the SetReverseCurrent and\nSetBrokenCurrent wrappers. The 0x4 bit has no named command, so it is\nkept as the neutral MARKED. The bits move to a CmmRecordFlag enum in\ninclude/cmm_internal.h. Renames the Set/Clear/Test helpers to match.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":458,"complete_units":427}},{"timestamp":"2026-10-15T23:12:28Z","commit_sha":"2c52ad8296d7c02e0fa398d2d1d734f9bc4987ee","commit_message":"Name three more g_data.c functions\n\n- func_00105990 -> datSetHeroExp. Writes the hero's exp, D_00797400, for id\n  1 and asserts for other ids. It pairs with datPersonaGetExpById, which\n  reads the same word.\n- func_00108d80 -> datDestroyTaskByName. Finds the task named by the string at\n  D_005E4308 and destroys it with its hierarchy. The name string itself is not\n  resolved here.\n- func_0010ffa0 -> datPersonaInitAllRecords. For ids 1..255, builds each\n  record with datPersonaInitRecord and copies the unflagged ones into the\n  cache slot.\n\nCallers renamed in Yajima/y_list.c, cmmCommunity.c, cmmScript.c, and promoted\ncode1_0011/0021.c, plus g_data.c (6 files, 14 references).\n\nOwner verify: 417/417 MATCH, no status changes against the baseline.\nelig_debug src/g_data/g_data.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":458,"complete_units":427}},{"timestamp":"2026-10-15T23:03:37Z","commit_sha":"13176c77a7f1a2d1d61787183db8ba10236decd6","commit_message":"Name skill colour helpers in btlMain_inferred_001b5ec0\n\nfunc_001b7060 -> btlMainSkillColorPairDefaults (default colour pair),\nfunc_001b7090 -> btlMainSkillTintDefault (returns 0),\nfunc_001b70a0 -> btlMainSkillColorPairDefaultsAlt (identical body to the\npair-defaults function, separate retail address).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":458,"complete_units":427}},{"timestamp":"2026-10-15T22:54:32Z","commit_sha":"9da27b6fe28e8e9a216f62628bfdd246c542c400","commit_message":"Name the AI handlers in btlEffect_inferred_001e6d20\n\nThree handlers named from their bodies: kind-switched unit pick, lowest-HP\nliving side-1 unit, and weak-candidate pick with HP weighting. AI command\nindices (0x207B..0x207D) stay in the intent comments.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":458,"complete_units":427}},{"timestamp":"2026-10-15T22:45:52Z","commit_sha":"effc9cff687ab29138a694bae86c62e995cc5afc","commit_message":"Name the keyframe track sampler, blend and motion helpers in code1_0047.c\n\nRename 13 helpers in src/promoted/code1_0047.c to behaviour names (rename only, no retyping). Each gets an intent comment above its FUN_ marker. Measured comments that name them are updated.\n\nMotion state and refcount:\n- func_0047EAA0 -> mdlReleaseObject: drops one reference (count at +8); frees the object and its inner block at zero. Pair of mdlRetainObject (func_0047EA40).\n- func_0047EB20 -> mdlRequestMotionAnim (declared in model_motion_internal.h): requests an animation with blend ticks on a motion state.\n- func_0047ED60 -> mdlTickMotionState: per-tick countdown for wait and pending-start timers; retries up to eight times.\n\nKeyframe track sampling and blending:\n- func_0047EF10 -> mdlFindTrackKeyIndex (static): binary search over key times.\n- func_0047EF70 -> mdlSampleTrackScalar: scalar track sample with linear interpolation.\n- func_0047F040 -> mdlBlendTrackSamples: samples two scalar tracks and blends them.\n- func_0047F1A0 -> mdlBlendTrackWithAlpha: samples a track and moves it toward the alpha byte of arg1.\n- func_0047F3A0 -> mdlSampleVec4Track (static): Vec4 track sample into DAT_00922c30.\n- func_0047F4D0 -> mdlBlendVec4Tracks: blends two Vec4 track samples into D_00922C40.\n- func_0047F5B0 -> mdlBlendTrackColorBytes: Vec4 track sample blended with byte colour.\n- func_0047F710 -> mdlStoreColorBytes: float RGB to bytes.\n- func_0047F830 -> mdlGetSampleScratch: returns D_00922C50.\n- func_0047F850 -> mdlDispatchTrackRows: applies the four track row kinds to the target list at +0x50.\n\nCallers: mdlManager.c (release, tick, request, and the track row), mdlMatAnim.c (mdlDispatchTrackRows extern and call), model_motion_internal.h (declaration). docs/matching.md carries each old name as '(was ...)'.\n\nOwner verify: 3 touched code files, 183 MATCH, zero non-MATCH rows. Elig clean on all three.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":458,"complete_units":427}},{"timestamp":"2026-10-15T22:26:58Z","commit_sha":"6f4b19a78816201cd5d400193b3651d8c0cc66dc","commit_message":"Move 126 inferred runs out of code1_0020 into Battle btlEffect and Graphics/Model mdlEffect *_inferred_*.c files\n\nA cut definition that the bucket still calls keeps its prototype where the definition stood,\nso later calls keep their typing and earlier calls stay implicit as on origin. The top-level\ndeclaration check ignores indented call statements.\n\nOwner verify 146/146 MATCH (bucket keeps the 20 unresolved_stays and p3_twin functions, all MATCH). Elig clean on all 12 touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":458,"complete_units":427}},{"timestamp":"2026-10-15T22:18:30Z","commit_sha":"48ca0d1dcac3a024b5ed128ea1facceeb3cb218d","commit_message":"Name itfMes list, window slot, record and state helpers in code1_0027 (rename only)\n\nitfMesListSetRangeFlag, itfMesWindowSetProcedure, itfMesSlotReset, itfMesRecordReset, itfMesWindowFreeSlots, itfMesWindowStepState and itfMesWindowProcedureForKind are named from their bodies and itfMesManager callers. The window procedure table is D_0063BF80 indexed by kind.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":447,"complete_units":416}},{"timestamp":"2026-10-15T22:10:31Z","commit_sha":"221b8a501a94ab71f66cb9ebd2113d0126fe84c1","commit_message":"Name community record-flag, earn, points, and rank helpers\n\nRecord flags (bit 0x1/0x2/0x4 on the community record): cmmCommunitySetRecordFlag1/2\n(func_00107CE0/00107F00), ClearRecordFlag1/2 (func_00107DC0/00107FE0), TestRecordFlag1/2/4\n(func_00107C80/00107EA0/00107B70), TestRecordFlags(id, mask) (func_00107A00).\nReleaseCounterparts (func_00107370), EarnScale (func_001080C0), AddScaledPoints\n(func_00108290), AddPoints (func_00108590), CanRankUp (func_001087E0), TryRankUp\n(func_00108950), SetRank (func_00108B60). Callers in cmmCommunity, cmmMisc,\npromoted/code1_0024/0026/0027/0035, fmGslCont_inferred; rename-only extern alignment\nto the definitions. Owner verify 329/329 MATCH; lint unchanged from HEAD baselines.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":447,"complete_units":416}},{"timestamp":"2026-10-15T22:02:42Z","commit_sha":"00ad6efd16ee21343201547cb6b36f19967a71ed","commit_message":"Name the g_data.c category rank helpers\n\nThe category rank code turns a point total into a rank with a threshold\ntable (func_00246a50, not yet named) and reads progress inside the rank.\n\n- func_00104f50 -> datRankForPoints (walks up to five thresholds and\n  returns the rank reached by the given points)\n- func_00104f10 -> datCategoryRank (the rank for the category's current\n  points, D_007973F4[category])\n- func_00105010 -> datCategoryRankProgress (the points left over after the\n  completed ranks, scaled)\n- func_001051a0 -> datSetCategoryValueById (id 1 writes D_007973F4; other ids\n  write their unit record, the same id split as the datCalc*ById wrappers)\n\nCallers renamed in Event/Fcl/y_fclCombine.c, cmmCommunity.c, shdScript.c,\nand promoted code1_0011/0025/0036.c, plus g_data.c (7 files, 30 references).\n\nOwner verify: 336/336 MATCH, no status changes against the baseline.\nelig_debug src/g_data/g_data.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":447,"complete_units":416}},{"timestamp":"2026-10-15T21:53:45Z","commit_sha":"5164b773c7e3be1267a5e23f11decdc674527e56","commit_message":"Name skill-target predicates and dedupe the battle hit record\n\n- func_001d7f10 -> btlSkillClassifyTargets: fills the skill's target group\n  into the target list and returns the skill classification byte.\n- func_001f0ff0 -> btlActionHasNoTargetClass: classification is zero.\n- func_0019fc70 -> btlActionSkillReachesTargets: skill table applicability.\n- Add include/btl_hit_result_internal.h with LargeBattleHitResult; use it in\n  btl_action_internal.h and btlTarget_inferred_001f1030.c instead of local\n  copies (maskA/maskB map to addedStatus/removedStatus, same 0x20 layout).\n- Add AI script command index comments to btlAICommand.c handlers.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":447,"complete_units":416}},{"timestamp":"2026-10-15T21:44:51Z","commit_sha":"6e9728d111b1296c3314cebd702f7040a3e0eb08","commit_message":"Name the remaining AI handlers in btlEffect_inferred_001e8d80\n\nFifteen handlers named from their bodies (lowest/highest HP pickers by\ncandidate flag, random side-1 pickers, ailment-element search, best-skill\nranking, action-parameter setup). AI command indices (0x2083..0x2104) are\nkept in each intent comment.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":447,"complete_units":416}},{"timestamp":"2026-10-15T21:36:04Z","commit_sha":"4e99171ad09b1a0501aa531633c5fda6efdd0a13","commit_message":"Name the model callback helpers in code1_0047.c\n\nRename 13 helpers in src/promoted/code1_0047.c to the behaviour they carry (rename only, no retyping). The callback slots they forward to are named in include/model_callbacks_internal.h.\n\n- func_0047D050 -> mdlResetModelTable: clears the 0x30-byte table at D_00922BE0 and stores the argument in iGpffffbb28.\n- func_0047D090 -> mdlSetModelCallbacks: installs the five callbacks; registered from mdlApp.c.\n- func_0047D0B0 -> mdlGetModelNameForId: forwards to the name callback (type, id, output).\n- func_0047D0E0 -> mdlQueryModelType: forwards to the type callback.\n- func_0047D110 -> mdlBuildModelPath: forwards to the path callback, which writes the resource path for type and id. Its header slot is pathCallback.\n- func_0047D140 -> mdlRunSetupCallback; func_0047D170 -> mdlRunDataCallback.\n- func_0047DD40 -> mdlRefreshSecondaryEffect; func_0047DD70 -> mdlMarkSecondaryDirty; func_0047DDA0 -> mdlNoopSecondaryEffect; func_0047DDD0 -> mdlSetAttachmentColor.\n- func_0047EA40 -> mdlRetainObject; func_0047EA70 -> mdlInitObjectSlots.\n\nCallers: mdlManager.c (externs and call sites), btlUnit.c, btlAction_inferred_001b1510.c, btlUnit_inferred_0019be30.c, code1_0010.c, code1_0016.c, code1_0019.c, code1_0023.c, k_fldUnit.c, kwln_inferred_00100e30.c, mdlApp.c, and include/model_callbacks_internal.h. docs/architecture.md keeps '(was func_0047D090)'.\n\nOwner verify: 12 touched code files, 371 MATCH and 1 ASM row (code1_0010.c func_00100008, a pre-existing INCLUDE_ASM that this commit does not touch). After the path rename, mdlManager.c, btlUnit.c and code1_0047.c re-verified at 215 MATCH. Elig clean on all touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":447,"complete_units":416}},{"timestamp":"2026-10-15T21:27:24Z","commit_sha":"10df15eaa9e973d6c51c02df46d5dc3401e311b6","commit_message":"Name the camera rotate command handlers from the P4 flowscript library (pure renames)\n\nCmd_SetFieldSlot becomes K_Cmd_FLD_CAMERA_ROTATE and Cmd_SetFieldSlotAlt becomes\nK_Cmd_FLD_CAMERA_ROTATE_BEHIND. The two group-1 table entries (0x63D440 +\n8 * index, retail SLUS_217.82) are indices 0x1017 and 0x1018, and both have two\nparameters. The P4 library names them from build/p4flow/Field.json. Their bodies\ncall func_0016f130 and func_0016f3b0, which create a camera rotation task with\nfunc_0016ee00 as its per-frame update. The update reads the camera object, so\nthe library names fit. func_0016f130 adds degrees to the player's yaw; func_0016f3b0\ntakes an absolute target yaw, which is recorded in the comment. Owner verify:\n28/28 MATCH for k_command.c.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":447,"complete_units":416}},{"timestamp":"2026-10-15T21:19:04Z","commit_sha":"a582fe678da42cf9f2f3454cac03419658a4c43d","commit_message":"Name code1_0027 calendar screen and current-community reverse/broken wrappers (rename only)\n\ncalDrawScreen draws the calendar screen (msgCal resources, month/day, tile backdrop); the four cmmCommunity* wrappers call the same helpers as cmmSetReverse and cmmSetBroken on the current community entry. itfMsgProcedure_Window.c is a caller-only update of the window callback reference.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":447,"complete_units":416}},{"timestamp":"2026-10-15T21:17:15Z","commit_sha":"934e090ab91b5115b4ab204a6c2a006da9d46538","commit_message":"Move 4 single-function mdlEffect runs out of code1_001f into Graphics/Model *_inferred_*.c files\n\nOwner verify 5/5 MATCH, elig clean on all 5 touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":447,"complete_units":416}},{"timestamp":"2026-10-15T21:03:00Z","commit_sha":"19103c2fc4421e6e76d084565ac7b3722a17a422","commit_message":"Name the g_data.c money counter and persona record cache\n\n- func_00105ed0 -> datGetMoney, func_00105fa0 -> datSetMoney,\n  func_00106020 -> datAddMoney. These act on the shared counter\n  D_0079B68C, capped at 9,999,999 (0x98967F). Script commands read it into a\n  return value (cmmScript.c) and set it from a script parameter after a\n  <= 0x98967F check. datAddMoney adds a delta, clamps the total to 0..cap,\n  stores it, and returns it.\n- func_0010f4f0 -> datPersonaGetRosterSlot. Returns the 0x14-byte roster\n  record for slot 1..10, or NULL outside that range. Matches\n  datPersonaRosterSlotId's roster-slot concept.\n- func_0010fcb0 -> datPersonaCachedRecord. Returns the cached working copy\n  of persona id arg0 (0..0xFF), or NULL when the slot is unset.\n- func_0010fd40 -> datPersonaCacheRecord. Copies a 0x30-byte persona record\n  into its cache slot. This is the step datPersonaResolveRecord performs.\n\nCallers renamed across Battle, Event/Fcl, Main/Battle/Data/datCalc.c,\nYajima/y_list.c, cmmScript.c, shdMisc.c, promoted units, and g_data.c\n(14 files, 69 references).\n\nOwner verify: 674/674 MATCH, no status changes against the baseline.\nelig_debug src/g_data/g_data.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":443,"complete_units":412}},{"timestamp":"2026-10-15T20:55:17Z","commit_sha":"7f53a21d507e7f5f57c56b0a2e30feeb786dbfc9","commit_message":"Name fade task helpers hFadeTaskStart, hFadeTaskUpdate, hFadeSetCustomWhite\n\nfunc_001fc1b0 starts the fade task (kwlnTaskCreate, id 0xC9, update\nfunc_001fbb50, work at iGpffffb468); func_001fbb50 is that task's per-frame\nupdate; func_001fc280 sets the H_Fade custom colour to white and holds the\nfade flag. Renamed across the callers and externs. Owner verify 118/118 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":443,"complete_units":412}},{"timestamp":"2026-10-15T20:47:19Z","commit_sha":"8d31673e2b2292860cfa110518907cb3f7e84161","commit_message":"Name date-table helpers in cmmMisc\n\ncmmDateTableFindIndex (func_00249010), FindRecord (func_002490B0),\nFindSpecialRecord (func_00249180), HasEntry (func_00249230), HasSpecialRecord\n(func_002492B0), ReadColumn (func_00249370), ApplyColumnDelta (func_002494C0),\nAddCount (func_00249670), FindNthMatch (func_00249770), RollValue\n(func_00249960), RunEffect (func_00249A60). All callers are in cmmMisc.c and\ncmmScript.c. Owner verify 108/108 MATCH; lint unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":443,"complete_units":412}},{"timestamp":"2026-10-15T20:39:17Z","commit_sha":"446f43310054d5b16313e5febeeebd548b8ce824","commit_message":"Name the AI candidate-pick handlers in btlEffect_inferred_001e7400\n\nNames the remaining 14 handlers in the unit from their bodies: the AI\ncommand indices (0x2080..0x20F7) are cited in each intent comment. The\nfour 0x20F1..0x20F4 handlers share one body, differing only by the btlCond\ngate (HANSYA/KYUSYU/MUKOU/TAISEI), so each is named after its gate.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":443,"complete_units":412}},{"timestamp":"2026-10-15T20:31:20Z","commit_sha":"a731c2ed473f8e14c1d24b2dd0bad2b4d922a175","commit_message":"Name the aux chunk stream loader mdlReadAuxChunks\n\nRename func_0047B0C0 to mdlReadAuxChunks (rename only, no retyping). It is step 2 of the aux load state machine (mdlAdvanceAuxLoad). It reads the block's RenderWare chunk stream and dispatches each chunk type to its loader (texture dictionaries, animation, UV dictionaries, effect lists, materials); data not yet ready is queued as a request. It returns 1 once the stream is consumed.\n\nCallers: mdlAdvanceAuxLoad in promoted/code1_0047.c and the extern there. docs/lane_findings_20260928.md carries the old name as '(was ...)'.\n\nOwner verify: 2 touched code files, 168 MATCH, zero non-MATCH rows. Elig clean on both.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":443,"complete_units":412}},{"timestamp":"2026-10-15T20:23:35Z","commit_sha":"f152e75fe3b5a12c8ab52c6794cfbdbc7de391a7","commit_message":"Name two script command handlers from the P4 flowscript library (pure renames)\n\nCmd_BeginEncounter becomes K_Cmd_CALL_BATTLE and Cmd_WaitForFieldEvent becomes\nK_Cmd_FLD_EFFECT_TRAESTO_START. Both are group-1 command handlers whose table\nentries (0x63D440 + 8 * index, retail SLUS_217.82) are indices 0x1016 and\n0x1028. The names come from build/p4flow/Field.json, the P4 flowscript library,\nand each body fits: CALL_BATTLE takes two parameters and starts an encounter,\nand FLD_EFFECT_TRAESTO_START takes none and waits on a transition task.\nThe P3 name K_Cmd_CREATE_FLD_MDL stays, and a library citation (index 0x100D,\nFLD_NPC_MODEL_LOAD) is added above it. Cmd_SetFieldSlot and Cmd_SetFieldSlotAlt\nkeep their names because their bodies (a slot record alloc) do not match the\nlibrary's FLD_CAMERA_ROTATE names. Owner verify: 34/34 MATCH across the two\ntouched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":443,"complete_units":412}},{"timestamp":"2026-10-15T20:15:53Z","commit_sha":"0904b49abe412c6d14911cffaec3db877de3e20c","commit_message":"Name code1_0025 Common script command handlers (rename only)\n\nSix handlers are named from the p4flow Common command library (CHK_DAYS 0x0037, PARTY_IN 0x0038, PARTY_OUT 0x0039, GET_PC_PARAM 0x0044, ADD_PC_MONEY 0x0050, CALL_NAME_ENTRY 0x0051) under the scrCommon prefix. Each body was checked against its library name. Placeholder FUNCTION_xxxx command handlers and unindexed functions stay func_ names.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":443,"complete_units":412}},{"timestamp":"2026-10-15T20:07:51Z","commit_sha":"eb7d522ee510417b33285a47cc19a9eee71c4a30","commit_message":"Name the g_data.c skill unit-id wrappers datCalc*ById\n\nSix more wrappers take a unit id (id 1 is the player; ids 2..10 index the\nunit records). Each resolves the record, maybe a second one, and calls one\ndatCalc skill function. They match the datCalc*ById wrappers in the\nprevious commit:\n\n- func_0010f560 -> datCalcThresholdKindById\n- func_0010f600 -> datCalcSkillCostById\n- func_0010f6a0 -> datCalcThresholdTriggerById\n- func_0010f770 -> datCalcApplySkillEffectById. The second argument is a\n  second unit id, checked against 1..10 before use.\n- func_0010f930 -> datCalcSkillEffectFlagsById (second unit id as above)\n- func_0010fa80 -> datCalcSkillOutcomeById (second unit id as above)\n\nCallers renamed in Camp/cmpSkill.c, Kernel/h_malloc_inferred_0013f720.c,\npromoted/code1_0011.c, code1_0013.c, and g_data.c (5 files, 29 references).\n\nOwner verify: 241/241 MATCH, no status changes against the baseline.\nelig_debug src/g_data/g_data.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":443,"complete_units":412}},{"timestamp":"2026-10-15T20:00:27Z","commit_sha":"0c565cf0e55a46098a9a0f9bb910ed3bb525edc9","commit_message":"Type BtlAction hit-row block and name target scan helpers\n\nBtlAction+0xD8 is now BtlActionTargetBlock: hitRowCount at 0xD9, targetFlags\nat 0xDE, reactionFlag at 0xE0, specialHitFlag at 0xE4, and the 25 hit rows\n(LargeBattleHitResult, 0x20 each) at 0xF0. LargeBattleHitResult moves from\neight local copies into btl_action_internal.h.\n\nThe target scan helpers in btlTarget_inferred_001f0a50.c are named by what\nthey test on the target actions:\n  func_001f0a50 -> btlActionAnyTargetHitRowFlagged (row flags & 4)\n  func_001f0af0 -> btlActionAnyTargetHitRowStatus (row addedStatus & 0x100000)\n  func_001f0b90 -> btlActionAnyTargetSpecialHit (specialHitFlag != 0)\n  func_001f0bf0 -> btlActionAnyTargetFlagged (targetFlags & 6)\n  func_001f0c50 -> btlActionSameGenusTargetsHaveDelta\nOwner verify 246/246 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":443,"complete_units":412}},{"timestamp":"2026-10-15T19:58:47Z","commit_sha":"7fd79b6596c0476a8c42d5d1e3e3d8c9d93bbfdb","commit_message":"Move 10 inferred runs out of code1_001f into Battle and Graphics/Model *_inferred_*.c files\n\nOwner verify 93/93 MATCH, elig clean on all 11 files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":443,"complete_units":412}},{"timestamp":"2026-10-15T19:52:34Z","commit_sha":"fb8e48555e7d98f304656b559eafa03e18498948","commit_message":"Name community current-record and total helpers\n\ncmmCommunityGetCurrentId (func_00108E10), GetCurrentWork (func_00108DC0),\nGetCurrentSecondary (func_00108E70), SetCurrent (func_00108CF0), TaskNoop\n(func_00108CA0), SetTableHead/GetTableHead (func_00108ED0/EE0), AdvanceForm\n(func_00108EF0), SetRecordFlag4 (func_00107BD0), FindActiveSlotInGroup\n(func_00107930), AddTotal/GetTotal (func_001090C0/E0), GetCurrentEntryValue\n(func_00109100). Rename-only call and extern updates in promoted/code1_0024,\n0026, 0027, 0029, fmGslCont_inferred_0026e350 and scrComuCommand.\nOwner verify 367/367 MATCH; lint at baseline.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T19:28:09Z","commit_sha":"fac8bc3169116929a44c7ece0c0805c763750034","commit_message":"Name the aux resource poll step mdlPollAuxResources\n\nRename func_0047C660 to mdlPollAuxResources (rename only, no retyping). It is step 1 and step 3 of the aux load state machine (mdlAdvanceAuxLoad). It polls the block's pending texture dictionaries, request table, clump and node list, attaches each one that is ready, and returns 1 only when all are ready; then it copies each layer's keyframe maps.\n\nCallers: mdlAdvanceAuxLoad in promoted/code1_0047.c (two sites) and the extern there. No docs cite the old name.\n\nOwner verify: 2 touched code files, 168 MATCH, zero non-MATCH rows. Elig clean on both.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T19:19:42Z","commit_sha":"893938a183eaf9c4ff94d580d9df56df467498e3","commit_message":"Name the sdk listbox helpers sdkLbox* (pure renames)\n\nFifteen func_ helpers in the sdk listbox, named from their bodies.\nsdkLboxCreate and sdkLboxCreateEx create the list task, the second with a\nmode argument. sdkLboxAddEntry appends an entry with its name, assigns its\nid and relays out. sdkLboxAddDescriptors fills a table of descriptors.\nsdkLboxSetState, sdkLboxSetSelection, sdkLboxSetVisibleRows and\nsdkLboxSetOrigin set the list's state, selection, visible rows and origin\nand forward them to the child list. sdkLboxRecalcLayout recomputes the\nentry widths and the content size. sdkLboxSetRefValue and\nsdkLboxSetFloatRange store the value of a reference or float entry.\nsdkLboxFindEntry returns the entry with a given id, sdkLboxGetSelectedId\nreturns the id at the current cursor, sdkLboxClear removes every entry, and\nsdkLboxDestroy is the task destructor. Declarations, callers in Kosaka,\npromoted and tests, and the measured comments cite the new names. Owner\nverify: 193/193 MATCH across the ten touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T19:12:52Z","commit_sha":"fd727dcf0ba11cc5aa432ad7d8e3b7693b7a0df4","commit_message":"Name code1_0022 logo, result overlay, camera pose, encounter and formation helpers (rename only)\n\n93 functions in promoted/code1_0022.c named from bodies and callers\n[inferred]: logo title and stage (btlLogo*), result overlay and summary\ntask lifecycles (btlResultOverlay*, btlResultSummary*), camera frame and\npose helpers (btlCamera*), encounter sequence and step helpers\n(btlEncounter*, btlActionRun*), formation record and slot helpers\n(btlFormation*), and unit helpers (btlUnit*). Callers updated in the\nBattle files, promoted code1_0019 through code1_001f, code1_0021, and\ninclude/btl_motion_internal.h. code1_001f.c is parse-failed, so its\nextern and call lines were text-edited. Measurement comments in\ncode1_0022 that named the old functions were updated to match.\n\nIdentical bodies: btlResultSummaryOnEventAlt duplicates\nbtlResultOverlayOnEvent. btlLogoTitleIsReady, btlResultOverlayIsReady\nand btlResultSummaryIsReady share one body, one per task family.\nbtlFormationClearSlots replaces the btlFormationRelease name, which\nbtlFormation.c already declares.\n\nUnnamed: func_002218e0 and func_00221940 (work flag predicates whose\nbit meanings are not established), func_0022bac0 (returns 0),\nfunc_0022bd20 (flag bit test on a table entry), func_0022f8b0 (body not\nestablished). src/Battle/btlCamera_inferred_001c0e40.c line 643 keeps an\nold name inside a historical probe note.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T19:01:34Z","commit_sha":"5ed4caecfd6098b86833779449b80172eb2f7243","commit_message":"Name g_data.c persona exp, level, and skill helpers\n\n- func_00105210 -> datPersonaGetExpById. Id 1 reads the hero's counter\n  (D_00797400); other ids read the persona record through\n  datPersonaGetNextExp. That existing function returns the current exp at\n  +8, despite its name. It is not renamed here.\n- func_00109440 -> datPersonaGetExpToNextLevel. Total exp to reach\n  level + 1 on the persona's growth curve.\n- func_0010c6f0 -> datPersonaCanLevelUp. False at level 99; otherwise true\n  when the exp to the next level is at or below the persona's exp.\n- func_0010d360 -> datPersonaCollectSkills. Collects the valid skill ids for a\n  persona id into a caller array (up to 0x20 entries) and returns the count.\n  Ids 0xC0..0xD7 read their own skill block.\n- func_00104a00 -> datFreeBlock. Asserts a non-null pointer, then frees it\n  through the heap free table.\n\nCallers renamed in Event/Fcl/y_fclModel.c, cmmScript.c, promoted/code1_0021.c,\ncode1_0034.c, code1_0036.c, and g_data.c (6 files, 21 references).\n\nOwner verify: 357/357 MATCH, no status changes against the baseline.\nelig_debug src/g_data/g_data.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T18:52:54Z","commit_sha":"3680f1f05b37a3c3b234b09108ab10763f079331","commit_message":"Restore the FUN_001958F0 line marker above btlUnitGetGridSphereCenter\n\nThe intent comment put the marker inside a block comment, so the build's\nmarker scan lost the function and its translation unit stopped being\nlink-eligible (linked C function count fell below the floor). The marker is\na line comment again. Owner verify MATCH 47/47.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T18:44:58Z","commit_sha":"da41221a438ae88b9596f45b4fed0063db17b48f","commit_message":"Name script entry select, set-current, group slot, and total accessors\n\nfunc_0024aa10 -> cmmScriptSelectEntry, func_0024aaf0 -> cmmScriptSetCurrentEntry,\nfunc_0024acf0 -> cmmScriptFindSlotInGroup, func_0024ad70 -> cmmScriptAddEntryTotal,\nfunc_0024adb0 -> cmmScriptTakeTotal, func_0024ae00 -> cmmScriptGetEntryIndex.\nNames follow the cmmCommunity current-entry task (func_00108cf0/00108d80/\n00108e10/00108ef0) and the running total at D_00797560. verify 86/86 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T18:44:47Z","commit_sha":"6fc6353108b6ca2436fc54e48037cf8050988c97","commit_message":"Cite AI script command indices on table handlers in btlEffect/btlTarget inferred units\n\nAdds intent comments with the retail AI command index (0x2080..0x210B) to\nthe 57 handlers located through the SLUS_217.82 AI table; comment-only.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T18:43:10Z","commit_sha":"a316cb84523ddd3eb70d0fb402a361feb1076c02","commit_message":"Cite AI script command indices on btlEffect_inferred_001e7400 handlers\n\nEach handler's intent comment now names its retail AI command index\n(0x20E5..0x20F0, located by table lookup) for cross-reference with p4flow.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T18:42:29Z","commit_sha":"0ead04daaa52b9edd7fe2f5e9793de49e321223e","commit_message":"Name AI random and global-slot commands from the p4flow AI library\n\nbtlTarget_inferred_001eb2a0/001eb2e0/001eb320 match p4flow AI.json entries\nAI_RND (0x2097), AI_GET_GLOBAL (0x20AD) and AI_SET_GLOBAL (0x20AE) by\nretail table lookup and by body. Renamed to btlAiRandom, btlAiGetGlobal and\nbtlAiSetGlobal; callers updated in btlTarget_inferred and promoted/code1_001e.\nSource only.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T18:40:02Z","commit_sha":"02009d103d86fc49ae063091a891845cf32cf6d0","commit_message":"Name btlEffect_inferred_001e7400 script handlers from behaviour\n\nRenames the ten script-command handlers in btlEffect_inferred_001e7400.c\nby the unit stat or selection each returns. Source only; no config rows.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T18:38:40Z","commit_sha":"64303012e1f1387b3bfe18552f6746d9ee708ea2","commit_message":"Name btlEffect entry pool, table loader and packet builders from behaviour\n\nRenames the eleven btlEffect.c func_ definitions and updates their callers\nacross btlAction, btlCamera, btlFormation, btlUnit and promoted. Source only.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T18:37:12Z","commit_sha":"ca13d379850a8d2ec9fccef81fcdca7c7935d5b7","commit_message":"Name the material colour user-data helper and its atomic walker\n\nRename two helpers (rename only, no retyping):\n\n- func_004585C0 -> K_Clump_EnsureMatColorUsrData (src/promoted/code1_0045.c): adds the material's colour user-data entry (key D_00711870) when it is missing, storing the packed RGBA word read from the material. An existing entry is left unchanged. Only caller: mdlEnsureAtomicMatColors. The data key keeps its address-form name.\n- func_00476E10 -> mdlEnsureAtomicMatColors (mdlManager.c): atomic callback that calls the helper for every material of the atomic's geometry. Only caller: mdlSetupPreparedModel.\n\nOwner verify: 2 touched code files, 183 MATCH, zero non-MATCH rows. Elig clean on both.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T18:31:42Z","commit_sha":"ac604926cbdb09bd154a634ea910a4de289e1ced","commit_message":"Name btlEPL handle and pattern-work alloc/free helpers from behaviour\n\nRenames eleven btlEPL func_ definitions whose behaviour is clear from the\nallocation size, the id lookup they perform, and the free that pairs with\nthem. Source only; no config rows.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T18:29:03Z","commit_sha":"2cab0a14d88007864f8f2e10581a636ff47ee8cc","commit_message":"Move 10 inferred runs out of code1_001f into Battle btlTarget_inferred_*.c files\n\nOwner verify 151/151 MATCH, elig clean on all 11 files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":433,"complete_units":402}},{"timestamp":"2026-10-15T18:21:30Z","commit_sha":"02b7f402a68797e5f4a073db59ae3e3faa8360fc","commit_message":"Restore upstream rows in symbol_addrs.txt that the cleanup reverted\n\nThe cleanup restored the whole file from before the rename work, which\ndropped upstream's config edits. Only the 352 rows for removed behaviour\nnames are reverted now, back to their func_ spellings.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T18:13:34Z","commit_sha":"7deba6df3adf1df448fa98d1be5be490bcd9c68f","commit_message":"Name the shadow projection triangle and bounds callbacks (pure renames)\n\nfunc_00179130 is the atomic iterator that accumulates the shadow bounds\nrecord (FldShadowBoundsAccum: centre, radius, largest atomic, count). It is\ncalled over a clump in k_shadow.c. func_001791d0 is the world-sector collision\ncallback that back-face-culls a triangle against the work vector and projects\nits three vertices. func_00179860 is its skinned twin, which transforms each\nvertex by its atomic's frame first. The declarations in field_shadow_internal.h,\nk_shadow.c, k_spipe.c and k_spipe_inferred_00179fc0.c are renamed, and the\ntwin comment cites FldShadow_ProjectTriangle. Owner verify: 25/25 MATCH across\nthe four touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T18:06:30Z","commit_sha":"957e4d56eafc2542a6e79f48774277a8d66c29ac","commit_message":"Name code1_0021 damage, encounter, portrait, message, gauge, shuffle and XP helpers (rename only)\n\n92 functions in promoted/code1_0021.c named from bodies and their callers\n[inferred]: damage popup (btlDamage*), list entries (btlEntryInit,\nbtlEntryListFlush, btlEntryListPrune), encounter transition task\n(btlEncounter*), unit portraits (btlPortraitDraw*), panel and message\nstate (btlPanel*, btlMessage*), gauges (btlGauge*), effects\n(btlEffectDrawSkyPulse, btlEffectInit), the advantage panel\n(btlAdvantageDrawPanel), shuffle tasks (btlShuffle*) and XP awards\n(btlXp*). Duplicate bodies carry Alt and Alt2 suffixes. Callers updated\nin code1_001a, code1_001b, code1_001e, code1_0020, code1_0022, and the\nBattle files; the btl_panel_internal.h prototype follows. Unnamed:\nempty stubs func_00216e50, func_0021b1e0 and func_0021be70; func_00213b10,\nfunc_00213b30, the 0x80C-word bit helpers func_00213b50 through\nfunc_00213ca0, the 0x85C-word helpers func_00216d10 and func_00216d40,\nand func_0021be60 (returns a global; meaning unknown).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T17:58:18Z","commit_sha":"9365a2ed6be80427a3e4bc1dece74fe562061774","commit_message":"Name the g_data.c unit-id wrappers datCalc*ById\n\ng_data.c has a set of wrappers that take a unit id. Id 1 is the player\nrecord; ids 2..10 index the 0x88-byte unit records. Each wrapper resolves\nthe record and calls one datCalc function on it. The module already uses\nthe ById suffix for id-keyed wrappers (datPersonaGetStatById), so:\n\n- func_00104c70 -> datCalcGetLevelById\n- func_00104ce0 -> datCalcGetHpById\n- func_00104d50 -> datCalcGetSpById\n- func_00104dc0 -> datCalcMaxHpById\n- func_00104e30 -> datCalcMaxSpById\n- func_00105340 -> datCalcGetBadStatusNoDownById\n- func_00105610 -> datCalcIsDeadById\n- func_001055a0 -> datCalcInitUnitById (datUnitInit already names a\n  different function in datUnit.c, so the datUnit prefix is not used)\n- func_00105ce0 -> datCalcSetBadStatusById. The wrapper does not forward\n  its second argument to datCalcSetBadStatus; that is how retail calls it.\n- func_00105d50 -> datCalcClearBadStatusById\n\nLeft unnamed: func_001053b0 and func_00105460 return a u16 from one of two\nadjacent u16 columns of a level table, D_005DD844 and D_005DD846. Their\ncallers do not show what the columns hold.\n\ntests/fixtures/field_movement/semantic_repairs.py asserted the old\ndeclaration text (u32 func_00105340) in promoted/k_fldEvent.c; it now\nasserts the same declaration under its new name.\n\nCallers renamed across src/ and include/ (26 files, 162 references),\nincluding Battle, Main/Battle/Data, Camp, Event, and promoted units.\n\nOwner verify: 1139/1139 first-party MATCH; the 3 ASM rows were ASM at\nbaseline. No status changes against the baseline.\nelig_debug src/g_data/g_data.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T17:45:50Z","commit_sha":"999f92c34c1b0f7081a3a1ccc91e1554a7f3365c","commit_message":"Name script entry run, update, arm, and destroy helpers\n\nfunc_0024efa0 -> cmmScriptRunEntries, func_0024f040 -> cmmScriptEntriesDestroy,\nfunc_0024f080 -> cmmScriptArmEntry, func_0024ff60 -> cmmScriptEntryUpdate,\nfunc_002500e0 -> cmmScriptEntryDestroy. Task creation and call sites\nupdated. verify 86/86 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T17:37:02Z","commit_sha":"8df853eaa5e72fc683c174d02e6550869e1f3922","commit_message":"Name the aux-block load state machine mdlAdvanceAuxLoad\n\nRename func_0047CE00 to mdlAdvanceAuxLoad (rename only, no retyping). It advances the load state byte at +0x3C of the aux block at +0x30C: waits for the file, reads its tables, runs the material and texture steps, then frees the file. Returns 1 when done, 0 while a step is pending.\n\nOnly caller: mdlPrepareModel in mdlManager.c, which calls it without an argument (it compiles against the implicit declaration). The match depends on that call as written, so the call was renamed and not changed. The callees func_0047C660 and func_0047B0C0 are still unnamed.\n\ndocs/matching.md and docs/first_party_matching_handoff.md carry the old name as '(was ...)'. Address-form references (0047ce00 in the handoff snapshot list) are unchanged.\n\nOwner verify: 2 touched code files, 168 MATCH, zero non-MATCH rows. Elig clean on both.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T17:28:35Z","commit_sha":"85ae3fa89ac7c8ab71aa2b45c302332670c7cf28","commit_message":"Move 102 third-party INCLUDE_ASM runs out of code1_0044 into src/middleware\n\nEach contiguous text run gets its own single-run TU, so eligible_c_objects keeps\nthe pieces and does not drop the bucket for mixed run counts. Run 0x4401c8-0x4460c0\nis split at the held functions so no TU has a gap (layout check). Held in\ncode1_0044: 00443010 and 00444700 (NON_MATCHING-guarded C body with INCLUDE_ASM\nfallback; the move tool cannot cut guarded blocks yet) and 004420f8 (C stub return 0,\n12 bytes against an 8-byte window). First-party pair 0044f4d0/0044f510 stays.\n\nOwner verify: first-party 2/2 MATCH; moved vendor rows ASM; 0 non-MATCH/ASM rows.\nElig clean on all 8 touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T17:12:18Z","commit_sha":"d5c6dd5db7af34a85a644c55dbaf22f330b2f916","commit_message":"Name the shadow command callbacks FldShadow_Cmd* (pure renames)\n\nFour func_ command handlers registered in k_shadow.c. FldShadow_CmdProjectBounds\nbuilds a six-float extent, or a centre point, from the owner's model matrix and\ndraws it with FldShadow_DrawProjection. FldShadow_CmdBeginFlip saves the model\nmatrix into the command at +0x80 and flips the model's scale for a mirrored\nshadow. FldShadow_CmdEndFlip restores that saved matrix and clears the flip\nflags. FldShadow_CmdRender sets the shadow render states and calls the object's\ndraw slot. Registrations in k_shadow.c, the definitions in spipe and the\npromoted code1_0017.c measured comment cite the new names. Owner verify: 40/40\nMATCH across the three touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T17:04:59Z","commit_sha":"33d331fafe81b48fc4fc2e7b5d2a027fa5a1b8c5","commit_message":"Name code1_0020 swap, level-list and panel update/draw helpers (rename only)\n\n9 functions in promoted/code1_0020.c named from bodies and their\nbtlSelection/btlPanel callers [inferred]: btlSelectionResetCursorState,\nbtlSelectionHandleSwapInput, btlSelectionDrawSwapPanel,\nbtlSelectionDrawLevelList, btlPanelInitWork, btlPanelUpdate,\nbtlPanelDrawFrame, btlPanelDrawBackdropGrid and btlPanelDrawSkyFrame.\nEmpty retail stubs func_0020ad70 and func_0020b5a0 stay unnamed.\nIntent comments above each definition.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T16:49:53Z","commit_sha":"02767e33c459f225dcb4f50fb137b8f1a6ee0182","commit_message":"Name cmmScript persona, item, record, and task helpers\n\nfunc_0024a490 -> cmmPersonaDetailShow, func_0024b070 -> cmmItemInfoShow,\nfunc_0024b490 -> cmmRecordInfoShow, func_0024b720 -> cmmRecordGetField,\nfunc_0024b870 -> cmmScriptLoadStep, func_0024b990 -> cmmScriptTaskDestroy,\nfunc_0024ba60 -> cmmScriptTaskDestroyHandle, func_0024bb00 ->\ncmmScriptSpawnHandle, func_0024be40 -> cmmWeatherRoll, func_0024c0e0 ->\ncmmScriptStepWaveSprite. Call sites, externs, task callback pointers and\ncomments updated (including y_CmbCardEff.c measured notes). verify\n86/86 MATCH on cmmScript.c and y_CmbCardEff.c.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T16:41:47Z","commit_sha":"dd6a498d50b08f860f47eb5d0ddda3e43a1718d6","commit_message":"Name voice packet callbacks and the voice-id packet creator\n\nfunc_001f9800 is the update of btlVoiceCreatePacket (type 0xa01), func_001f9ac0\nthe update of the voice-id packet (type 0xa03), and func_001f9b80 builds that\n0xa03 packet from a voice id (its call sites in btlAction_inferred_001b1510 and\ncode1_001b are updated). Owner verify MATCH 199/199.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T16:33:40Z","commit_sha":"eac1c45480472f461b5932bee0393e9a42ec4c3d","commit_message":"Name the layer-key empty check and the material-vector atomic walker\n\nRename two mdlManager.c helpers and their callers (rename only, no retyping):\n\n- func_00479DD0 -> mdlIsLayerKeyEmpty: returns 1 when a layer's key at the index holds the empty-clip sentinel D_00922BC0. Callers: btlUnit_inferred_00198dd0.c, mt_sceneFunc.c (cross-lane pure rename).\n- func_00477510 -> mdlSetAtomicMaterialVector: atomic walker that writes the +0xC vector of each material entry from the material user-data floats, or the fallback value. Only caller: mdlSetupPreparedModel's default case in mdlManager.c.\n\nOwner verify: 3 touched code files, 186 MATCH, zero non-MATCH rows. Elig clean on all three.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T16:21:34Z","commit_sha":"01192bb09f7a4f0f300b397bad9aab0f2f57f118","commit_message":"Name the shadow projection draw FldShadow_DrawProjection (pure rename)\n\nfunc_00179fc0 projects shadow geometry: it sets the render states, builds the\nprojection matrix from the owner's model matrix and the radius, and draws\neither the resource list (mode 0) or the atomic context (mode 1). The two\ncommand callbacks in k_spipe_inferred_00179fc0.c call it with a six-float\nextent or a centre point. Declarations and callers in the field frame,\ncommand and spipe TUs are renamed in the same change, along with the\npromoted code1_0017.c declaration. The measured comment cites the new name.\nOwner verify: 63/63 MATCH across the seven touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T16:13:59Z","commit_sha":"b77c605c5087304a68ed4ca69041c17b71542f2f","commit_message":"Finish batch-3 list and panel renames after rebase\n\nUpstream moved an inferred block out of promoted/code1_001b.c into\nBattle/btlAction_inferred_001b1510.c; the moved copy and the remaining\nextern now use btlPanelReset, and the prose references to the list\ncallbacks in code1_0020.c use btlListStep and btlListDispatchUpdate.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T16:06:15Z","commit_sha":"3fd7a31eecf9e14b50e0ac1e56971e7cfcaefbff","commit_message":"Name the g_data.c save-data functions\n\ng_data.c holds the save-data code. Name the three functions by what they\ndo:\n\n- func_0010d7c0 -> datSaveBuildImage. Builds the save buffer (version,\n  metadata summary, unit and persona tables) and returns it with its size.\n- func_0010e9e0 -> datSaveRestoreSection. Copies one section back into its\n  table; the section id selects the table and the size must match.\n- func_0010e880 -> datSaveVerifyChecksum. Walks the chunks until the 0x2000\n  terminator, sums the payload bytes, and compares the sum to the stored\n  checksum byte.\n\nLeft unnamed: func_0010e710 (walks the same chunk list and logs each chunk\nthrough func_00440b68; the logging helper is not named yet).\n\nCallers renamed in src/Kernel/mc.c and src/promoted/code1_0011.c.\n\nOwner verify: 213/213 MATCH, no status changes against the baseline.\nelig_debug src/g_data/g_data.c passes. decomp_lint: 0 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T16:00:13Z","commit_sha":"4e7ca95b39a6d2dfa526e057d761b2bc9a2b5681","commit_message":"Rename fusion call in draw file to fclCombineFuseSourceRecords\n\nUpstream added a call to func_002f9c30 in y_fclCombineDraw.c; updated to\nthe renamed helper after rebase. verify 111/111 MATCH on both owner files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T15:51:17Z","commit_sha":"bfeb47ab75a0a55fd11cb73313f7791e4e792490","commit_message":"Update measured comments in battle_inferred_001927c0.c to the new helper names\n\nComment-only: the measured pragmas for btlRenderStateSetup, btlSkyScroll and\nbtlRelease previously referred to the old func_ names. TUCensus flagged them as\nstale references. Owner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T15:44:03Z","commit_sha":"a85112b5efbb12981b5faac50f53ef77ff196bbb","commit_message":"Name the indexed matrix copy, attach matrix and model matrix helpers\n\nRename three model matrix helpers and every caller, extern and doc citation in the same commit (rename only, no retyping):\n\n- func_0047A510 -> mdlCopyIndexedMatrix: copies the matrix for an index from the table at +0x2C8, or from the user-data frame when no table exists. Returns 1 when a matrix was copied.\n- func_0047A6D0 -> mdlComputeIndexedAttachMatrix: attach matrix for an index, through mdlComputeAttachMatrix when the table exists, else from the user-data frame.\n- func_0047A1C0 -> mdlApplyModelMatrix: forwards to func_003e0e20 (still unnamed) with the combine mode; the name states what the call does and does not claim more.\n\nCaller files outside the Graphics lane (pure rename): Battle, Kosaka, Event, Scene, Main/titleVisual.c and promoted files. docs/matching.md carries the old names as '(was ...)'. Codemod used ast_edit for 17 files; y_fclModel.c, mdlEffect.c, k_fldResource.c and code1_0012.c (parse errors) renamed by hand.\n\nOwner verify: 22 touched code files, 872 MATCH, zero non-MATCH rows. Elig clean on all 22.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T15:36:31Z","commit_sha":"f137e948dbf1a3e55490cd896d8326a8bf50fd57","commit_message":"Move 10 inferred runs out of code1_001e into Battle btlTarget_inferred_*.c files\n\nOwner verify 68/68 MATCH, elig clean on all 11 files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":423,"complete_units":392}},{"timestamp":"2026-10-15T15:21:47Z","commit_sha":"4e932cc69bb3a3a95cc39df6b6a1738e04718c70","commit_message":"Name the resource list unlink resrcMngDestroyRes (pure rename)\n\nfunc_00147430 unlinks a resource from its type list in the resource\nmanager, patching the neighbour pointers and the list head. The P3FES twin\nFUN_003b5360 is named resrcMngDestroyRes, so the P4 name follows it. The\nport comment in resrcManager.c cites the new name. Callers in\nmt_scene_inferred_001459b0.c and promoted/code1_0014.c are renamed in the\nsame change. Owner verify: 20/20 MATCH across the three touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":413,"complete_units":382}},{"timestamp":"2026-10-15T14:53:28Z","commit_sha":"31c705c830ce87c7fcb2be9f9c82bb1cdffa6eb8","commit_message":"Name g_data.c unit, persona, time-slot, and entry accessors\n\ng_data.c holds the game-data tables. Name these accessors from their\nbodies and callers:\n\n- func_00105510 -> datUnitGetRecord. Id 1 is the player record; ids 2..10\n  index the 0x88-byte unit records. Called from datUnit.c, datCalc.c, and\n  battle units.\n- func_0010fde0 -> datPersonaResolveRecord. Returns the cached working copy\n  of a persona record, or NULL after copying the record into that slot.\n- func_001060c0 -> datGetTimeSlot and func_001062f0 -> datSetTimeSlot. The\n  day's time slot (0..5); calendar.c cycles it.\n- func_00106820 -> datEntryAt (pointer to the 68-byte GDataEntry for an id).\n- func_00106880 -> datEntryGetFlags (the word at entry +0x04, used as a\n  flag mask by y_list.c filters).\n- func_001067f0 -> datGetItemNameId (the message id for an item, passed to\n  itfMesWindowSetString in cmmScript.c).\n\nLeft unnamed for now (the field meaning is not established by their\ncallers): the other GDataEntry field getters (+0x08..+0x40), the scalar\nglobals func_001060b0/d0/e0/f0, func_00106300/10 setters, and func_00106600.\n\nCallers renamed across src/ and include/ (38 files),\nincluding promoted units, Main/Battle/Data/datCalc.c and datPersona.c,\nCamp, Battle, and Event callers.\n\nOwner verify: 1527/1527 MATCH, no status changes against the baseline.\nelig_debug src/g_data/g_data.c passes.\nLint: 1 error, a P001 at fmGslCont_inferred_0026e350.c:1112 that predates\nthis change (HEAD has 9 pragma pushes and 8 pops in that file).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":413,"complete_units":382}},{"timestamp":"2026-10-15T14:38:18Z","commit_sha":"c8b84d4981d267976640cc1c131da76708312095","commit_message":"Name the layer time, layer flag, attach-slot and resource-model helpers\n\nRename twelve mdlManager.c helpers and every caller, extern and comment in the same commit (rename only, no retyping):\n\n- func_00479E60 -> mdlSetLayerTime, func_00479F60 -> mdlGetLayerTime, func_0047A000 -> mdlGetLayerKeyTime: layer animation time getters and setter, scaled by the global time factor.\n- func_0047A120 -> mdlSetLayerHandleFlag, func_0047A150 -> mdlClearLayerHandleFlag: flag 0x80 in the layer record when its handle at +0x120 has data.\n- func_0047A260 -> mdlApplyColorToAtomics: applies the colour at +0xD0 to every atomic.\n- func_0047A2A0 -> mdlInitIdentityMatrix: identity matrix plus flag word 0x20003.\n- func_0047AA10 -> mdlCopyScale, func_0047AA30 -> mdlSetAttachedOwner.\n- func_0047AAA0 -> mdlAttachSlotModelFromResource, func_0047AB90 -> mdlAttachSlotModelFromPair, func_0047AC90 -> mdlAttachSlotModelFindOrCreate: create or find a model and attach it to an attached slot.\n- func_00475350 -> mdlStartAnimation, func_00477CA0 -> mdlSetupPreparedModel, func_00477FB0 -> mdlCreateModelObjectFromResource (prototype in btlUnit.c extern).\n\nCaller files outside the Graphics lane (pure rename): Battle, Kosaka, Event, Scene, Main/titleVisual.c and promoted files. docs/matching.md carries the old names as '(was ...)'. Codemod used ast_edit for 20 files; mdlManager.c, y_fclModel.c and k_fldFrame_inferred_0016b8a0.c (parse errors) renamed by hand.\n\nOwner verify: 23 touched code files, 678 MATCH, zero non-MATCH rows. Elig clean on all 23.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":413,"complete_units":382}},{"timestamp":"2026-10-15T14:35:18Z","commit_sha":"154a07cf307bfb2892188fb33769933d556e2b1a","commit_message":"Move 10 inferred runs out of code1_0019/001b/001d/001e and btlOrder_grouped into Battle *_inferred.c files\n\nMove tool: carry function-type typedefs and mid-file includes the moved blocks need.\nHeld 001b0dd0, 001b13c0, 001b1450: they call static btlOrderRemoveAction (FUN_001B0D00,\np3_twin to btlOrder.c, not moved); without it they compile differently.\nOwner verify 202/202 MATCH, elig clean on all 15 files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2864384,"complete_code_percent":91.25543,"complete_data":0,"complete_data_percent":100,"total_units":413,"complete_units":382}},{"timestamp":"2026-10-15T14:12:11Z","commit_sha":"c0ad7333c01853cea6a97efff295ffd68a80fca5","commit_message":"Name code1_0020 packet, sprite and selection helpers (rename only)\n\n34 functions in promoted/code1_0020.c named from bodies and callers\n[inferred]: packet creators and callbacks (hit display, sprite steps,\neffect counters, unit counters, HP ratio, end sequence), UI sprite and\nscale setters, and the selection block init/update/input routines.\nIdentifier-only rename; intent comments above each definition and header\nprototype.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T14:10:52Z","commit_sha":"e1cca65584fd3b4e9c4d30e4b62a666325837a7b","commit_message":"Name the h_malloc radar and CampDisplay helpers\n\nh_malloc_inferred_001400f0.c holds the radar/minimap draw code. Each\nhelper is named from its body and callees, not from its offsets.\n\nDrawing:\n- func_001400f0 -> radarDrawFrame (the radar frame: grid, labels, and\n  the five value rows)\n- func_001423c0 -> radarDrawNumber (one sprite per decimal digit)\n- func_001424b0 -> radarDrawText (outlined text through frFontExDrawTextOutA)\n- func_001427c0 -> radarDrawPolygon (seven vertices, palette per point)\n- func_00142bf0 -> radarDrawSegment (one of five segments, index < 5)\n- func_00142d80 -> radarDrawEdge (one of four edges, index < 4)\n- func_001437b0 -> radarAnimateValue (cos/sin interpolation toward the target)\n\nState and layout:\n- func_00141cf0 -> radarPushValue (shifts the value at +0x34 into +0x36)\n- func_00141d10 -> radarResetEntries (calls the entry reset over 0x6C entries)\n- func_00141d80 -> radarSetMode (shifts the rows, then selects a table per mode)\n- func_00142090 -> radarLayoutSlots (the selected slot at 0 and the others\n  at +-200)\n- func_00142130 -> radarResetStateDefault\n- func_001421b0 -> radarResetStateMirrored (same initializer with the\n  signs flipped: +100/650 against -100/-150)\n- func_00142230 -> radarLoadSlotCoords (copies five coordinate pairs from\n  D_005EF5A0)\n- func_00142340 -> radarEntriesReady (every entry's +0x6C is at or below\n  the value, combined with func_0034c210)\n- func_00142f20 -> radarUpdateState (the state machine; dispatches to the\n  draw and layout helpers)\n- func_001422b0 -> radarDestroy (frees the 0x19 sprite nodes and destroys\n  the child task)\n\nCallers renamed in h_malloc_inferred_001400f0.c, h_malloc_inferred_0013f720.c,\nh_malloc_inferred_00143b70.c, h_malloc_inferred_00143b80.c,\nh_malloc_inferred_00143b90.c, h_malloc_inferred_001441e0.c, promoted\ncode1_0012/0013/0014/0035/0036.c, and Camp cmpConfig, cmpEquip, cmpMain,\ncmpPersona, cmpSkill, and Battle btlResultHeroLvUp, btlResultSimple.\n\nOwner verify: 346/346 MATCH, no status changes against the baseline.\nelig_debug src/Kernel/h_malloc_inferred_001400f0.c passes.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T14:07:30Z","commit_sha":"c521ef1e6439b76895cb44aa46091426bbfff4d7","commit_message":"Re-pin regenerate-asm for 0x00192790 under the curated btlUpdateDraw2DTask name\n\nThe live symbol map now carries the curated name btlUpdateDraw2DTask (the\nreconcile output). The fallback func_00192e90.s keeps its audited bytes: its\nslice-canonical recipe previously rewrote the live 3DFrontTask spelling to\nfunc_00192790, and the baseline extraction still spells btlUpdateDraw3DFrontTask.\nA correction.symbol_spellings entry maps that historical spelling to\nfunc_00192790, so the output and sha256 are unchanged whatever the live name is.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T14:04:11Z","commit_sha":"88f61275b8717098779cb095dde198260ac19f47","commit_message":"Name the listbox window setters sdkLboxSet* and sdkLboxGetValuePtr (pure renames)\n\nFour func_ setters for the sdk listbox window entries, named to match\nsdkLbox.c. sdkLboxSetCallback stores a callback on an entry.\nsdkLboxSetText stores a text value and marks the entry as text.\nsdkLboxSetIntRange stores an int value with its min, max and flags.\nsdkLboxGetValuePtr returns the address of an entry's int value, which\ncallers in k_viewer and code1_0018 read and write through. Declarations\nin sdk_lbox_internal.h and callers in k_view, k_viewer, k_sceneDraw and\ncode1_0018 are renamed in the same change. The helpers in sdkLbox.c and\ncode1_0047.c are still func_ names. Owner verify: 91/91 MATCH across the\nfive touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T13:57:00Z","commit_sha":"a7541b3ec3a56dc32ac0bb9e3b58aefc16a3201c","commit_message":"Name the attached slot and auxiliary block helpers\n\nRename nine model helpers in mdlManager.c and update every caller, extern, prototype and cited doc in the same commit (rename only, no retyping):\n\n- func_0047ADF0 -> mdlSetAttachedSlotValue: stores a value at +0x294 of an attached slot (12-byte slots from +0x28C).\n- func_0047AE10 -> mdlDetachSlotModel: destroys an attached slot's model and clears its flag bit 0.\n- func_0047AE90 -> mdlPrepareSlotModel: returns 1 for an empty slot, else mdlPrepareModel's result.\n- func_0047AEE0 -> mdlSetAttachedModelMatrices: copies a matrix into every attached slot model.\n- func_0047AF60 -> mdlAllocAuxBlock, func_0047AFD0 -> mdlSetAuxPair, func_0047AFF0 -> mdlSetAuxResource, func_0047B050 -> mdlSetAuxValue, func_0047B060 -> mdlFreeAuxBlock: helpers for the 0x48-byte auxiliary block at +0x30C. Its purpose is not traced; the names say only what the code stores.\n\nCaller files outside the Graphics lane, changed by pure rename: src/promoted/code1_0016.c, code1_0023.c, code1_0029.c, k_fldUnit.c. docs/matching.md carries the old name as '(was ...)'. src/generated and asm fallbacks keep address-form names.\n\nOwner verify: 5 touched code files 273 MATCH, zero non-MATCH rows; mdlManager.c re-verified after prose fix (135 MATCH). Elig clean on all touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T13:51:47Z","commit_sha":"81b10cd6dbdf71089ce8f18d06c95315867ee1da","commit_message":"Keep regenerate-asm pin for 0x00192790 at btlUpdateDraw3DFrontTask\n\nThe regenerate-asm drift check renders from the live symbol_addrs.txt, and\nthe pinned fallback text uses the 3DFrontTask spelling. Curated\nbtlUpdateDraw2DTask stays in symbol_names.txt; the live map keeps the pin.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T13:50:40Z","commit_sha":"8538a5c6ba11835bf402093559e9aac951b0b4b4","commit_message":"Name y_list.c sort comparators by their keys\n\nThe two qsort comparators in y_list.c sort the persona slot rows in\ndescending order, each by a different key, and the two routines that\ncall them differ only in the comparator:\n\n- func_002e6630 -> yListCompareByWeightedKeyDesc. The key is the record\n  byte at +4 plus 100 times the persona metadata byte.\n- func_002e6b20 -> yListCompareByKeyDesc. The key is the record byte at\n  +4 alone.\n- func_002e68b0 -> yListSlotSortWeighted (uses the weighted comparator).\n- func_002e6c90 -> yListSlotSortByKey (uses the plain key comparator).\n\nThe measured notes that cite the old addresses stay as history.\n\nOwner verify: 37/37 MATCH, no status changes against the baseline.\nelig_debug src/Yajima/y_list.c passes.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T13:45:13Z","commit_sha":"a5cd9bf6849345c792933d63f3ed7a07a1a91330","commit_message":"Name battle task, state, and render helpers from their callers\n\nfunc_00192e90 builds the battle task tree and sets the starting phase (called\nfrom k_fldEvent and sequenceList with the battle setup record). func_00192b90\nallocates and initialises the battle state (only btlTaskCreate calls it),\nfunc_00192cd0 releases it, func_00192ac0 is its task callback, func_00192ae0\ndestroys the battle task, func_00192b20 resets the effect slots, func_001927c0\nand func_001928c0 are the render-state and sky-scroll callbacks stored in the\nstate, and func_00193060 checks the battle end condition. Owner verify MATCH\n193/193.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T13:44:08Z","commit_sha":"74c712a0cb8286e2b196d0de6783f2afd284a659","commit_message":"Rename func_0046d730 to kAssertFail (rename only)\n\nAssert-fail reporter shared by the battle and Kosaka/Scene/Graphics TUs.\nName taken from datScript.c's K_ASSERT macro [inferred]; body unchanged\n(empty stub in promoted/code1_0046.c). Identifier-only rename across\n152 files; src/generated untouched.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T13:36:25Z","commit_sha":"8dcd0313b575c42bbde422c03865a7dd139b87a1","commit_message":"Name the atomic flag, user-data count and battle flag helpers\n\nRename four model helpers in mdlManager.c and update every caller and extern in the same commit (rename only, no retyping):\n\n- func_0047A4D0 -> mdlClearAtomicFlags: clears a mask in every atomic of a model's clump; walker func_0047A4A0 -> mdlClearAtomicFlagsCallback.\n- func_0047A7C0 -> mdlCountIntUserData: returns the cached count at +0x2C8, else counts the clump's int user data.\n- func_0047A810 -> mdlSetBattleStateFlag: sets bit 0 at +0xD8, the inverse of mdlClearBattleStateFlag.\n\nCaller files outside the Graphics lane, changed by pure rename: src/Battle/btlUnit_inferred_0019d670.c, btlEPL.c; src/Kosaka/k_shadow.c; src/promoted/code1_0019.c. Graphics callers: src/Graphics/Effect/effHelper.c, src/Graphics/Model/effModel.c.\n\nOwner verify: 7 touched code files 206 MATCH, zero non-MATCH rows. Elig clean on all touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T13:34:22Z","commit_sha":"9602c47243c8ae255328721a6cfcc6256ac01177","commit_message":"Name the field event actor search and grid scan helpers (pure renames)\n\nSix func_ helpers in the field event TUs, named by what callers do.\nFldEvent_FindNearestVisibleActor scans the eight event-actor slots and\nreturns the closest one that is in view and not blocked by the world.\nFldEvent_FindFirstRegionActor returns the first actor whose region record\npasses the region test. FldEvent_AverageEntryValue averages the per-entry\nvalue over the valid entries, used by k_fldUnit as a level offset.\nFldEvent_BeginGridScan, FldEvent_NextGridCell and FldEvent_GetGridCellEntry\nare the grid walk that k_fldUnit runs in order: reset the scan state, step\nto the next cell, and fetch the entry for the current cell. The measured\ncomments in k_event_inferred.c and k_fldrc_inferred.c cite the new names.\nCallers in promoted and Kosaka are renamed in the same change. Owner verify:\n96/96 MATCH across the four touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T13:29:28Z","commit_sha":"4b31cb25c83beb1448f7bd0abf8243b98c5ec1bf","commit_message":"Declare the decoded action state table in btl_action_internal.h\n\nBtlActionState ({init, update, name}, 12 bytes) and BtlActionStateFn move\nfrom btlAction.c into the owner header, with the extern for D_005f6e20 (38\nentries, NON through TEST, decoded from SLUS_217.82). The data symbol keeps\nits retail name. Owner verify MATCH 201/201 across btlAction.c and the 12 TUs\nthat include the header.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T13:24:12Z","commit_sha":"53b4be88d96a73a1e41345d07b1dcf420ba08ba0","commit_message":"Rename fclCombineMenuSkillPick to fclCombineMenuResultGrowth: state 0x0C is post-result experience, stat, and skill growth","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T13:19:59Z","commit_sha":"f52eb1f386128f3298863cbcc6679895790701c2","commit_message":"Name the sdkTask work-pointer getter kwlnTaskGetWork\n\nfunc_00452560 returns the word at +0x38 of a task. SdkTask::work, in\ninclude/sdktask.h, documents that field as the handler's own work\nallocation, so the getter is kwlnTaskGetWork. It sits beside the\nexisting kwlnTaskGetTimer (+0x28) and kwlnTaskGetState.\n\nIt has about 375 call sites in 40 files (Battle, Kosaka, Event, Kernel,\npromoted units). Every caller passes a task pointer. The return type\nstays u32, so the call-site casts and the codegen are unchanged; only\nthe name moves. Declarations at the call sites are renamed too; the\nheader has no prototype for this getter.\n\nOwner verify: 1423/1423 MATCH, no status changes against the baseline.\nelig_debug src/Kernel/sdkTask.c passes.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T13:13:05Z","commit_sha":"8dc4753361915beee46bde1be0ac8d061a18b3a7","commit_message":"Name SUPPORT state update in btlAction_inferred_001a1450\n\nfunc_001a2d70 is D_005f6e20[10].update (per its comment). Index 10 is SUPPORT\nin the retail state list (docs/architecture.md), matching the existing\nbtlActionCooperateUpdate and btlActionAssistUpdate names. Owner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T13:10:28Z","commit_sha":"2706d76d97147bae341d4eb5af62c9d231902108","commit_message":"Rename datCalcSkillCost and datCalcResolveSkillHit (rename only)\n\nfunc_0023d9b0 -> datCalcSkillCost (SP cost of a skill after equipment\nreduction; cost tiebreak in code1_001e.c), func_0023e6f0 ->\ndatCalcResolveSkillHit (outcome code of a skill; 0x200 means reflected).\n[inferred] from callers. Callers in datCalc.c, g_data.c, code1_0020.c,\ncode1_001e.c and code1_001f.c (text edits) updated in the same commit.\nSignatures unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T13:06:23Z","commit_sha":"5482714c946ec0c6414b75ed6dd354afcb9588dd","commit_message":"Name the layer weight getter and matrix translate and rotate wrappers\n\nRename three model-matrix helpers and update every caller, extern, prototype and cited doc in the same commit (rename only, no retyping):\n\n- func_0047A080 -> mdlGetLayerWeight: returns a layer's weight at +0xF8, or 0 when the layer index at +0xF0 is negative; pairs with mdlSetLayerWeight.\n- func_0047A180 -> mdlTranslateMatrix: RwMatrixTranslate wrapper that keeps the caller's combine mode.\n- func_0047A1A0 -> mdlRotateMatrix: RwMatrixRotate wrapper that keeps the caller's combine mode; prototype in include/model_matrix_internal.h.\n\nCaller files outside the Graphics lane, changed by pure rename: src/Battle/btlEPL.c, btlUnit.c, btlUnit_inferred_001991c0.c, btlUnit_inferred_0019aae0.c, btlUnit_inferred_0019c0d0.c; src/Event/Fcl/y_fclModel.c; src/Kosaka/Field/k_field.c, k_fldFBN.c, k_fldFrame_inferred_00167f00.c, k_fldResource.c; src/Kosaka/k_command.c; src/promoted/code1_0014.c, code1_0016.c, code1_0018.c, code1_0019.c, code1_0020.c, code1_0022.c, code1_004a.c, k_fldEvent.c, k_fldLmap.c, k_fldUnit.c; src/Scene/mt_scene_inferred_001453a0.c, mt_scene_inferred_001459b0.c; src/Graphics/Model/effModel.c. Docs citations in docs/architecture.md and docs/matching.md carry the old names as '(was ...)'. src/generated and asm fallbacks keep address-form names.\n\nOwner verify: 25 touched code files 855 MATCH, zero non-MATCH rows. Elig clean on all touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T13:06:08Z","commit_sha":"90826c188809e9606172ff1c8a3158415fc41506","commit_message":"Name y_smap.c minimap functions\n\ny_smap.c is the field minimap: a loader task, a reveal routine that\nmarks visited cells and rooms, and per-frame draw and update code for\nthe cells, the player, and the overlay. Name the 36 functions from their\nbodies and callees, using the file's existing smap* and SMAP_* names.\n\nLoader and reveal:\n- func_002ac400 -> smapLoadStep (two sprite loads, then a CDVD file)\n- func_002ac6b0 -> smapCreate\n- func_002ac740 -> smapGetSpriteHandle\n- func_002ac750 -> smapRevealCell (reveals the cell, connected walls,\n  or the room footprint)\n- func_002ac600 -> smapResetVisibility (allocates and clears the\n  visibility table D_00764658). Note: this is registered as the task's\n  destroy callback; the registration is unchanged here.\n\nCells and symbols:\n- func_002adcf0 -> smapCellKind\n- func_002add90 -> smapUpdateEntities\n- func_002ae630 -> smapCreateSymbols (creates marker, point, and target\n  symbols)\n- func_002ae520 -> smapFreeSprites\n- func_002af3e0 -> smapRefreshCells\n- func_002afb70 -> smapSetPhase (phase byte 5 or 6)\n- func_002afbc0 -> smapDrawCell\n- func_002b0250 -> smapBuildTiles\n- func_002b0220 -> smapTaskDestroy\n\nDrawing:\n- func_002add10 -> smapSetPrimitiveState\n- func_002add60 -> smapSetStateValue\n- func_002b07a0 -> smapDrawLabel\n- func_002b0b10 -> smapDrawQuad\n- func_002b1520 -> smapDrawPanel\n- func_002b2500 -> smapSetRenderStates\n- func_002b2290 -> smapUpdateItems\n- func_002b2240 -> smapClearSelection\n\nOverlay task (0x120-byte work):\n- func_002b2830 -> smapCreateOverlay\n- func_002b25d0 -> smapUpdateOverlay\n- func_002b2800 -> smapDestroyOverlay\n\nCoordinates (the upper-case FUNC_002B spellings are renamed too):\n- func_002B1100 -> smapCellToWorld (cell * 1200 on x and z)\n- func_002B11C0 -> smapWorldToColumn ((x + 600) / 1200)\n- func_002B1210 -> smapWorldToRow ((z + 600) / 1200)\n- func_002b1260 / func_002b1320 -> smapPlayerOffsetX / smapPlayerOffsetZ\n- func_002b13e0 / func_002b1480 -> smapPositionOffsetX / smapPositionOffsetZ\n\nSetters:\n- func_002b10a0 -> smapSetPosition (position, plus the active flag)\n- func_002b10d0 -> smapSetActive\n\nLeft unnamed: func_002b10e0 and func_002b10f0 write fields at 0x143 and\n0x144 whose meaning is not yet established.\n\nCallers renamed in Yajima/y_symbol.c, promoted/code1_0017.c,\npromoted/code1_002b.c, promoted/k_fldEvent.c, Kosaka/Field/k_field.c,\nThe docs/architecture.md minimap citation is updated. Battle/btlCamera.c\nand Event/Fcl hold only comment references, which stay as history.\n\nOwner verify: 176/176 MATCH, no status changes against the baseline.\nelig_debug src/Yajima/y_smap.c passes.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:57:54Z","commit_sha":"5ae6e37698ac777d6eadad1d7999572ef3548566","commit_message":"Rename datCalc helpers datCalcSkillOutcome, datCalcSkillSlotValue, datCalcStatusResistance (rename only)\n\nfunc_0023a490 -> datCalcSkillOutcome (HP amount, SP amount and infliction\noutcome for a skill), func_0023a620 -> datCalcSkillSlotValue (packed\nskill-table entry to skill value), func_0023a6b0 -> datCalcStatusResistance\n(unit resistance and nullify flags against a status element). [inferred]\nfrom callers. Callers in datCalc.c, datPersona.c and its header prose,\ndatScript.c, btlAICommand.c, btlCond.c, btlPanelAnalyze.c, g_data.c,\ncode1_001b/001d/001f.c (text edits) updated in the same commit. Signatures\nunchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:53:51Z","commit_sha":"017746fbeaf0f38167a0e785cc6a30e803609927","commit_message":"Name fcl combine draw helpers from their bodies\n\nRenames 11 draw-layer functions: panel fade, row marker, rows-busy\ncheck, slot icons, selected-name draw, slot colours, slot-kind map,\nresource draw, and the CDVD task create/update/destroy trio. Names\nfollow each body's sprite calls and state fields. Owner verify\nunchanged (111 MATCH).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:49:50Z","commit_sha":"b3820facb8480a1b09d106b51b3e30b6a36e7cb1","commit_message":"Name the atomic walkers, model clone and sky-pass functions\n\nRename six functions in mdlManager.c and update every caller, extern, prototype and cited doc in the same commit (rename only, no retyping):\n\n- func_00474F40 -> mdlSyncAtomicMatFx: atomic callback that sets the MatFX mode from whether any material has MatFX effects.\n- func_00475090 -> mdlSetupMatFXMaterials: atomic callback that runs mdlSetupMatFXMaterial on each material when the object is larger than 0x40 units.\n- func_00477660 -> mdlSetAtomicEntryVector: atomic callback that copies a vector into the +0xC slot of every entry.\n- func_00478410 -> mdlCopyModelState: copies clump, layer and attachment state from source into destination.\n- func_00478750 -> mdlCloneModelObject: allocates a model object sized like its source and copies state when the source has the 0x1000 flag.\n- func_00476C70 -> mdlDrawSkyPass: sky draw pass (sky render states, sky table, then atomics or effect list).\n\nCaller files outside the Graphics lane, changed by pure rename: src/Battle/btlPanelAnalyze.c, btlUnit.c; src/Kosaka/Field/k_fldFBN.c, k_fldResource.c; src/Kosaka/k_command.c; src/promoted/k_fldUnit.c, code1_0046.c; a comment reference in src/Camp/cmpMain.c. Docs citations in docs/matching.md carry the old names as '(was ...)'. src/generated and asm fallbacks keep address-form names.\n\nOwner verify: 9 touched code files 349 MATCH, zero non-MATCH rows. Elig clean on all touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:45:49Z","commit_sha":"e1646d1a68d32a0e5736301095a64352a3c43900","commit_message":"Rename datCalcBuffMultiplier from func_00233bc0 (rename only)\n\nNamed from its body: multiplier for a stat index (0-4 read a buff level,\n18-19 read a status bit) on a unit [inferred]. All six callers are in\ndatCalc.c and updated in the same commit. Signature unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:45:02Z","commit_sha":"ffe9d3d803206869409d765fcc421b7541273060","commit_message":"Name action work builder and unit unavailability check\n\nfunc_0019f5f0 builds the type-0/1 unit work for an action (btlActionCreateWork),\nas the btlEffect comment describes. func_0019fe60 returns true for the unit\nstatus codes that block an action (btlUnitIsUnavailable). Renamed across 4\nfiles. Owner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:41:45Z","commit_sha":"a6bdfd573c6b23d9b49bd1c5275a0cfd83b57041","commit_message":"Name mc.c memory-card state and screen functions\n\nGive nine mc.c functions mc* names that follow the file's existing\nmcSetState / mcTableAt / mcLocationName convention. Each name is taken\nfrom the callees the function uses:\n\n- func_002a3070 -> mcLoadState (drives H_Memcard_LoadStep)\n- func_002a3d80 -> mcSaveState (drives H_Memcard_BeginSave / SaveStep)\n- func_002a4570 -> mcStepState (top-level state dispatch; calls the\n  per-state functions and mcIconTaskUpdate)\n- func_002a6510 -> mcDrawDispatch (selects one of the row renderers)\n- func_002a6960 -> mcSetSkyRenderState (RpSkyRenderStateSet)\n- func_002a7330 -> mcTableClear (memset of one table entry)\n- func_002a73c0 -> mcTableRandomize (RpRandom over mcTableAt entries)\n- func_002a9100 -> mcDrawLocationText (sprintf + frFontExDrawTextWithCharWidth)\n- func_002a9f50 -> mcScreenStep (creates and updates the icon task)\n\nCallers renamed in Kernel/mc.c and Kernel/Kwln/kwln.c (the draw dispatch\nis called from kwln.c). Retail addresses and order are unchanged.\n\nLeft unnamed on purpose: the three row renderers (func_002a4f20,\nfunc_002a5630, func_002a5f00) share helpers and differ only in layout\nthat is not yet derived; func_002a32c0, func_002a34e0 and func_002a4390\ncall unnamed memory-card helpers (func_00466280, func_004647c0,\nfunc_00453670) whose meaning is not established; the sky and sprite\nhelpers (func_002a4d10, func_002a6680, func_002a66d0, func_002a6af0,\nfunc_002a6b10, func_002a6b60, func_002a6c30, func_002a6e30,\nfunc_002a7710, func_002a7920, func_002a95c0) have no string or\ncallee evidence beyond the mc* helpers they call.\n\nOwner verify: 36/36 MATCH, no status changes against the baseline.\nelig_debug src/Kernel/mc.c passes.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:38:27Z","commit_sha":"4d5a8c661db372c72ba3683d250132ff082402b4","commit_message":"Name the fcl combine menu state handlers from state flow\n\nRenames the 13 menu state functions dispatched from fclCombineMenuUpdate\n(states 0-0x0E): enter, pick source/target, pair step, preview, price\ninfo, validate, confirm, closing, material grid, item pick, skill pick,\nfinish. Names follow each handler's state transitions and named callees;\nintent comments sit above the FUN_ markers. Owner verify unchanged (74 MATCH).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:38:14Z","commit_sha":"4be00454d1e48623fec04fc5bb1ccd0407cf2e12","commit_message":"Name the named-frame colour walker and its wrapper\n\nRename two functions in mdlManager.c and update every caller (rename only):\n\n- func_004777D0 -> mdlSetFrameColorByName: sets colour and alpha on every frame whose name matches the string passed in, by running the atomic callback over the clump.\n- func_004776C0 -> mdlSetFrameColorIfNamed: the RpClumpForAllAtomics callback that applies the colour to matching frame entries. Each entry's colour comes from its material user-data int and alpha from the wrapper's argument.\n\nCaller updated in the same commit: src/promoted/code1_0022.c (extern and 12 call sites, pure rename). src/generated copies keep address names.\n\nOwner verify: mdlManager.c and code1_0022.c 233 MATCH, zero non-MATCH rows. Elig clean on both files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:33:21Z","commit_sha":"96a692b93e4aec4e6bdccc83acf115f45d9d9fa9","commit_message":"Rename unit class accessors datCalcUnitClass and datCalcSetUnitClass (rename only)\n\nfunc_00243e90 -> datCalcUnitClass (4 for the main character, else the unit\nrecord byte at +0x10), func_00243ec0 -> datCalcSetUnitClass (stores that\nbyte). [inferred] from callers that compare against 4. Callers in\nbattle_inferred_00193630.c, code1_0019/0020/0021/001b.c updated in the same\ncommit. Signatures unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:29:08Z","commit_sha":"f8ff36e2c2a0df48328cbb0733e3da9618447c73","commit_message":"Name y_list.c item-list and persona-slot functions\n\ny_list.c has two families. The item list (iGpffffb58c) is created,\nread, rebuilt, and destroyed through the yList* helpers. The persona\nslot table (D_00882F70) holds up to fifteen lists; each slot is created,\nrefreshed, copied from, filled, sorted, and released. Name them after\nthose roles and keep the file's existing yListAcceptsItem / yListExcluded\n/ yListWork / yListEntryInWork static inlines.\n\nItem list:\n- func_002e24a0 -> yListCreate, func_002e2590 -> yListCreateChild\n- func_002e2670 -> yListCount, func_002e26f0 -> yListCountFor\n- func_002e2740 -> yListValueAt, func_002e2830 -> yListValueAtFor\n- func_002e28f0 -> yListAuxValueAtFor\n- func_002e29a0 -> yListDestroy, func_002e29d0 -> yListKind,\n  func_002e2a00 -> yListKindFor\n- func_002e2a10 -> yListRebuild, func_002e3560 -> yListRebuildFor\n\nPersona slot:\n- func_002e4610 -> yListSlotCreate, func_002e4090 -> yListSlotRefresh,\n  func_002e45e0 -> yListSlotDestroy, func_002e47b0 -> yListSlotFindFree,\n  func_002e4820 -> yListSlotRelease, func_002e4870 -> yListSlotWork\n- func_002e48a0 -> yListSlotEntry, func_002e4960 -> yListSlotCopyEntry\n- func_002e4ac0 -> yListBuildAvailability,\n  func_002e5000 -> yListBuildPairFlags\n- func_002e5270 -> yListRecordsDiffer\n- func_002e53b0 -> yListSlotContainsId, func_002e54c0 -> yListSlotIndexOf\n- func_002e55c0 -> yListSlotAppend, func_002e5960 -> yListSlotClear\n- func_002e6280 -> yListSlotFillByLevel\n- func_002e6f00 -> yListAllocIndexTable\n\nCallers renamed in Event/Fcl (y_fclCombine, y_fclCombineDraw,\ny_fclShopDraw, y_fclItemShopDraw, fclCombineMisc), the\ninclude/list_item_internal.h prototypes, comuData_inferred_002e23b0.c,\nand promoted/code1_002e.c and code1_0031.c. Live doc comments that cite\nthe old names are updated; measured notes keep the retail addresses as\nhistory.\n\nLeft unnamed on purpose: func_002e26a0 and func_002e2700 (depend on the\nunnamed func_002b2d00); func_002e5ae0 (the measured group fill; its\npair-group semantics are not fully derived); func_002e6230 (an external\nwrapper for the static inline yListExcluded, kept to preserve the\nout-of-line call); func_002e6630 / func_002e6b20 (qsort comparators) and\nfunc_002e68b0 / func_002e6c90 (the two sort routines, which differ only\nin comparator; the file's measured notes do not say which one is the\nproduction path).\n\nOwner verify: 259/259 MATCH, no status changes against the baseline.\nelig_debug src/Yajima/y_list.c passes.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:25:00Z","commit_sha":"b0a4ad1b7fe14de583ac79798ef54be066ad5873","commit_message":"Rename datCalcUnderlyingSkillId and datCalcEnemyExp (rename only)\n\nfunc_00243920 -> datCalcUnderlyingSkillId (persona-skill id to base skill id),\nfunc_00243950 -> datCalcEnemyExp (monster row experience field, summed into\nthe battle reward total). [inferred] from callers. Callers in datCalc.c,\nbtlAICommand.c, code1_0020.c and code1_001f.c (text edit) updated in the\nsame commit. Signatures unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:20:45Z","commit_sha":"8e316bb9d2b8eec69f22c42dd038468ec8a20ff8","commit_message":"Name idle animation tick and look-at fan-out helpers\n\nfunc_0019f8a0 is a timer-gated idle-animation tick (btlUnitIdleAnimTick): it\nwaits a random 120-360 frames, then plays animation 0x11 when the unit can\nact. func_0019fa40 runs it over the action list (btlUnitTickIdleAnims).\nfunc_0019faf0 sends look-at packets from the listed units toward a given unit\n(btlUnitRequestLookAtOthers). Owner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:18:41Z","commit_sha":"6e32476b0f014113721a07d217234f913fe230c5","commit_message":"Name the model advance, matrix and callback functions\n\nRename five model-registry functions and update every caller, extern and prototype in the same commit (rename only, no retyping):\n\n- func_00478a30 -> mdlAdvanceModel: advances a model by tick (frame matrix and attachments, both animation layers, recursion into child models).\n- func_00478E70 -> mdlAdvanceModelFromFlags: calls mdlAdvanceModel with tick set unless bit 0 of d8 is set.\n- func_004789C0 -> mdlUpdateModelMatrix: recomputes the frame matrix from the identity matrix and clump root, then updates the owner matrix.\n- func_00478EA0 -> mdlSetDrawCallback: stores the draw callback at +0x310 and its context at +0x314.\n- func_00478EB0 -> mdlSetResetCallback: stores the post-draw callback at +0x318 and its context at +0x31C.\n\nCaller files outside the Graphics lane, changed by pure rename: src/Battle/btlEPL.c, btlEffect_inferred_001d6300.c, btlFormation_inferred_001d44a0.c, btlPanelAnalyze.c, btlUnit.c, btlUnit_inferred_0019c0d0.c, src/Kosaka/Field/k_fldFBN.c, k_fldFrame_inferred_00167f00.c, src/Kosaka/k_command.c, k_spipe_inferred_00179fc0.c, src/Main/titleVisual.c, src/promoted/code1_0012.c, code1_0016.c, code1_0017.c, code1_0018.c, code1_0019.c, code1_001d.c, code1_0020.c, code1_0047.c, code1_004a.c, k_fldUnit.c. The docs/matching.md citation carries the old name as '(was func_00478a30)'. Asm fallbacks keep address-form names.\n\nRebase note: upstream moved the func_0019C0D0 block out of code1_0019.c into btlUnit_inferred_0019c0d0.c; the two renames in that block were applied to the moved copy.\n\nOwner verify: 23 touched files 819 MATCH, zero non-MATCH rows on the rebased tree. Elig clean on all touched files. Full gate ran on the pre-rebase tree (5bed4c91, 6860/6860 MATCH).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:17:17Z","commit_sha":"939743b7ef164dcb0a882213116d03db4826b55a","commit_message":"Rename datCalcSkillRoll from func_002384b0 (rename only)\n\nNamed from its body: signed per-unit roll for a kind-6 skill (0 unless the\ntable kind is 6), positive on the monster side [inferred]. Caller in\nparse-failed code1_001f.c updated by text edit in the same commit. The\nexisting 4-argument call against this 3-argument definition is unchanged.\nSignature unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:16:34Z","commit_sha":"8b7d4acb97161a6769a985a3eee03196ca8242fe","commit_message":"Name map symbol task functions in y_symbol.c\n\ny_symbol.c holds four map symbol object families (the probe doc is\ndocs/probe_archive/Map_symbol_002b4ad0). Each family has a create,\nupdate, and destroy function, and the families are named to match:\n\nMarker (kwln task with a 0x24-byte work block):\n- func_002b3990 -> mapSymbolMarkerCreate\n- func_002b3ae0 -> mapSymbolMarkerDraw (yaw-rotated sprite)\n- func_002b3c50 -> mapSymbolMarkerSetHighlight (writes +0x20)\n- func_002b3c60 -> mapSymbolMarkerSetVariant (writes +0x21)\n\nPoint (0x1C work block, position from a Vec3):\n- func_002b4140 -> mapSymbolPointCreate\n- func_002b3c70 -> mapSymbolPointUpdate\n- func_002b4110 -> mapSymbolPointDestroy\n- func_002b4240 -> mapSymbolPointSetState\n\nEntity (0xC work block, indexes the entity table at D_007E8C50):\n- func_002b4a10 -> mapSymbolEntityCreate\n- func_002b4250 -> mapSymbolEntityUpdate\n- func_002b49e0 -> mapSymbolEntityDestroy\n\nTarget (0xC work block, indexes the table at D_007E80A0):\n- func_002b4fe0 -> mapSymbolTargetCreate\n- func_002b4ad0 -> mapSymbolTargetUpdate\n- func_002b4fb0 -> mapSymbolTargetDestroy\n- func_002b4ac0 -> mapSymbolTargetSetState\n\nCallers renamed in Yajima/y_smap.c and promoted/code1_002b.c. Retail\naddresses and ordering are unchanged.\n\nOwner verify: 126/126 MATCH, no status changes against the baseline.\nelig_debug src/Yajima/y_symbol.c passes.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:12:30Z","commit_sha":"1b823773bee24b79bccb1c8efe5664017f3726e5","commit_message":"Name the field frame accessors and raycast entry (pure renames)\n\nSix func_ helpers in src/Kosaka/Field/k_fldFrame_inferred_0016b8a0.c and\ntheir callers, named by what callers do with them. FldFrame_RaycastField\nreturns the nearest hit of a line over the field's models, resources and\nworlds, with a fallback; k_fldAI uses it for line tests, and it sits next\nto the FldFrame_Raycast* family. FldFrame_SetStateFlags and\nFldFrame_ClearStateFlags set and clear bits in the frame's state word, as\nk_fldEvent does around its transitions. FldFrame_GetStatus returns the\nstatus word that k_fldEvent compares. FldFrame_SetViewOffset copies a vector\ninto the frame's view offset, from the camera resource's +0x150 vector.\nFldFrame_SetViewDistance stores the f32 that code1_0015 and k_fldEnvironment\ntake from the camera resource's +0x15C field, which code1_0015 defaults to\n20.0f. Other accessors in the file are left unnamed until their callers\nestablish what they do. Owner verify: 144/144 MATCH across the five touched\nfiles.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:08:10Z","commit_sha":"8802c42430b493753efb7e6acb462799bd540b85","commit_message":"Re-apply record helper renames to moved inferred runs\n\nUpstream moved left-behind inferred runs out of code1_0019 and code1_001a\n(9adb620c), so the record helpers (btlUnitInitFromRecord, btlUnitGetRecordPtr,\nbtlUnitInitChild) reappear in the Battle inferred files and the remaining\npromoted copies under their old names. Renamed them there. Owner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:03:50Z","commit_sha":"09bd3f452c12f52b206ec6703c912c31b299be3f","commit_message":"Name h_memcard.c state and setup functions\n\nGive the nine unnamed h_memcard.c functions H_Memcard_ names, following\nthe existing H_Memcard_SetSeqMode9 / H_Memcard_SetAbort convention:\n\n- func_00464650 -> H_Memcard_BeginLoad (sets file, buffer, buffer size)\n- func_00465400 -> H_Memcard_CheckCard (polls card status, abort flag)\n- func_00465570 -> H_Memcard_BeginSave\n- func_00465590 -> H_Memcard_SaveStep (per-slot state machine)\n- func_004659F0 -> H_Memcard_SetRecordTable (record table pointer)\n- func_00465a10 -> H_Memcard_LoadStep (reads records into the table,\n  checksums each record, returns 100 after 16 slots)\n- func_00465F20 -> H_Memcard_Reset\n- func_00465F40 -> H_Memcard_CreateSlotsStep (free-space check, then one\n  file per slot, returns 100 after 16 slots)\n- func_00466260 -> H_Memcard_SetSlot\n\nThe save/load pairing follows the state machines: the load step copies\ncard records into the table; the save step is the other per-slot machine\nreached through BeginSave. Callers renamed in Kernel/mc.c (including the\nlowercase func_004659f0 spelling) and promoted/code1_0012.c.\n\nOwner verify: 125/125 MATCH, no status changes against the baseline.\nelig_debug src/Kernel/h_memcard.c passes.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T12:03:40Z","commit_sha":"fddeb02ff19b50a596271ec19e8a763cad26376f","commit_message":"Name Yajima sprite pool API from bodies (fclSprite*)\n\nRenames the 23 y_draw.c sprite functions (FUN_002B6150..FUN_002B8370)\nfrom their bodies: entry lookup, flag set/test, the start-transition\nsetters that the fclStart* inline helpers duplicate, the task/index\nforwarding wrappers, create/reset/activate, and the pool create/update/\ndestroy callbacks. Identifier and prose references updated across the\nFcl and promoted callers; owner verify unchanged (277 MATCH).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T11:59:38Z","commit_sha":"397c109e63a236bc7c8e6dfb127091ee88519993","commit_message":"Name the camera accessors and free-resource finder (pure renames)\n\nSix func_ helpers in the Field sceneDraw TUs, named by what callers do with\nthe value. MT_Scene_GetCameraFov returns the f32 at +0x144 of the camera list\nhead (resource type 20), which callers pass to K_View_SetFov.\nMT_Scene_GetCameraResFirst and MT_Scene_GetCameraResSecond return\ncameraRes[0] and cameraRes[1] from include/resrc_manager_internal.h, which\ncallers pass to the camera resource applier. MT_Scene_FindFreeResId returns\nthe lowest unused index for a resource type, used when creating field model\nresources. KDraw_RoundYawDeg rounds a yaw in degrees to whole degrees.\nFldState_SetEventViewMode stores its argument in the field global at +0x18,\nand evtMain sets it to 1 right after a 35-degree FOV. The predicates in\nk_sceneDraw_inferred_0014a160.c are left unnamed because the repo does not\ndocument what their map-id ranges mean. Callers in Event, Kosaka, promoted\nand the k_command_internal.h prototype are renamed in the same change, after\nnotifying AtlusReadA and AtlusReadB. Owner verify: 396/396 MATCH across the\n14 touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T11:56:39Z","commit_sha":"229bf834fc73445130c84d1f4221d72fb0c81970","commit_message":"Archive the TU move tool and header-fix pass used for the inferred-run moves","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T11:55:31Z","commit_sha":"fa30509f3b910faf5e891f6cd8bf4af0a2450f5f","commit_message":"Move two sdkDbprt runs out of code1_0045 into sdkDbprt *_inferred.c files\n\nThe run at 0044f4d0 stays in code1_0044: moving it dropped that TU's 105 linked functions\n(progress-report diff against its parent). Owner verify 53/53 MATCH, elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2860240,"complete_code_percent":91.12341,"complete_data":0,"complete_data_percent":100,"total_units":403,"complete_units":372}},{"timestamp":"2026-10-15T11:51:22Z","commit_sha":"7cf0f0dd8afce3765bc589b1b697c226d6f94b51","commit_message":"Name sdkUttmx.c TMX loader and upload functions\n\nGive the 11 unnamed sdkUttmx.c functions behaviour-derived names and\nupdate their callers:\n\n- func_00463570 -> tmxConvertRgba32\n- func_00463620 -> tmxConvertRgb24\n- func_004636a0 -> tmxConvertRgb555\n- func_00463740 -> tmxUnpackNibbles\n- func_004637c0 -> tmxConvertPalette\n- func_00463870 -> tmxSwizzlePalette8\n- func_00463930 -> tmxDecodeStream\n- func_00463d60 -> tmxLoadFile\n- func_00463e60 -> tmxImageWriteCallback\n- func_00463ea0 -> tmxDmaCopy\n- func_00464100 -> tmxUploadStream\n\nCallers renamed in Graphics/Effect/tnEffect.c, Kernel/Kwln/\nkwln_inferred_00100218.c, Kernel/sdkLbox.c (comment only), and sdkWrap.c.\nRetail addresses and ordering are unchanged.\n\nOwner verify: 48/48 MATCH across the touched units.\nelig_debug src/Kernel/sdkUttmx.c passes.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T11:50:01Z","commit_sha":"8ce6337d2541d1cb04f77fd58114d34157347746","commit_message":"Rename datCalcSkillAmount from func_00235520 (rename only)\n\nNamed from its body: signed skill amount for channel 1 (HP) or 2 (SP),\nhealing positive and damage negative [inferred]. Callers in btlAICommand.c,\ncode1_001e.c, code1_001f.c (text edit) and datCalc.c updated in the same\ncommit. Signature unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T11:43:20Z","commit_sha":"9672c23eb72357e0cd8cd8764b911a1e1fe6872f","commit_message":"Name the model draw-state forwarders mdlApplyDrawState, mdlApplySkyDrawState and mdlResetDrawState\n\nRename three draw callbacks stored in the render command built by mdlQueueModelForDraw (formerly func_00479100, renamed upstream):\n\n- func_00478ec0 -> mdlApplyDrawState: applies a model's draw state (blend-track update, colour scale over its atomics, render-state flags from d8, optional callbacks at +0x310).\n- func_00479030 -> mdlApplySkyDrawState: runs mdlApplyDrawState, then sets the sky render-state pair from +0xE4 and +0xE8.\n- func_00479080 -> mdlResetDrawState: post-draw callback that clears the global 0x80 draw bit, runs the 0x100000 hook and calls the model's callback at +0x318.\n\nCallers updated in the same commit: the render-command setup in mdlManager.c, the extern in src/promoted/code1_0047.c, and the docs/matching.md citation. Intent comments sit above each FUN_ marker.\n\nOwner verify: mdlManager.c and code1_0047.c 168 MATCH, zero non-MATCH rows. Elig clean on both files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T11:35:11Z","commit_sha":"07313af5ad296cf4cab68a75365db0b950cba539","commit_message":"Rename allocation-site tag func_0044ea90 to chkmemAllocSiteTag\n\nfunc_0044ea90(file, line) is an empty hook that callers issue before an\nallocation, passing the source file and line. It has 655 call sites in\nabout 170 files across Battle, Camp, Event, Graphics, Kernel, Kosaka,\nMain, Scene, Yajima, and the promoted units. This commit renames the\nfunction, its extern prototypes, and every call site.\n\nThe rename changes names only. Retail addresses and ordering are\nunchanged, and the function body remains empty.\n\ndocs/architecture.md citation updated in the same commit. Historical\nnotes (docs/probe_archive, measured comments) are left as they are.\n\nOwner verify over the 170 touched units: see build/ea90_verify_1.json.\nelig_debug src/Kernel/sdkChkmem.c passes.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T11:30:51Z","commit_sha":"749f1dff52236a8c3868feefb13d75bc0224cbbf","commit_message":"Name clear-state and look-at helpers by behaviour\n\nfunc_0019d990 clears the model states that btlUnitApplyModelState sets\n(btlUnitClearModelState). func_0019db40 updates a unit's look-at target from\nits mode (btlUnitUpdateLookAtTarget). func_0019df20 sets look-at angle ranges\nand blend weight for one unit or for all units (btlUnitSetLookAtRanges).\nOwner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T11:28:35Z","commit_sha":"2a5207c0cf14622489991df7b3b2047813a0b27c","commit_message":"Name the model destroy, prepare and layer-weight functions\n\nRename three model-registry functions and update every caller, prototype and extern in the same commit:\n\n- func_004787e0 -> mdlDestroyModelObject: unlinks a model from its registry bucket, destroys its effects and animation tables, then frees it through the free callback.\n- func_004782b0 -> mdlPrepareModel: returns 1 once the model is ready (flag 0x1000); otherwise advances the load and clone steps and returns 0 while a step is pending.\n- func_0047a0e0 -> mdlSetLayerWeight: writes a layer weight at +0xF4; layer 0 is mirrored to +0x244.\n\nEach definition has its intent comment above the FUN_ marker. The bucket table D_00922BE0 keeps its address-form name (see the previous owner-header commit).\n\nOwner verify: 36 touched files 1061 MATCH, zero non-MATCH rows. Overlap files after rebase onto 4d675d94 (12 files) re-verified 622 MATCH. Elig clean on all touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T11:26:53Z","commit_sha":"dbfe8f2bfc466cd1dfa288f5daafa14f5e051de6","commit_message":"Rename status-blocked flag accessors datCalcIsStatusBlocked, datCalcSetStatusBlocked, datCalcClearStatusBlocked (rename only)\n\nfunc_00243e30/e50/e70 -> get/set/clear of the 0x200 bit on a unit word.\nNamed from datCalcInflictStatus's immunity check and btlTarget's toggling\n[inferred]. Callers in btlCamera_inferred_001c79e0.c, btlTarget.c,\nbtlUnit_inferred_00198dd0.c, code1_0019.c, code1_001a.c, code1_001e.c,\ncode1_0022.c and code1_001f.c (text edit) updated in the same commit.\nSignatures unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T11:22:52Z","commit_sha":"eef0f368806e5d1e282751957128ea314ea5c400","commit_message":"Name sdkChkmem.c allocator functions\n\nGive the 12 sdkChkmem.c pool and allocator functions behaviour-derived\nnames and update their callers:\n\n- func_0044e8d0 -> chkmemPoolAppend\n- func_0044e920 -> chkmemPoolUnlink (static)\n- func_0044e9e0 -> chkmemUntrackBlock (static)\n- func_0044eaa0 -> chkmemRegisterBlock\n- func_0044ec30 -> chkmemGetBytes\n- func_0044ec40 -> chkmemGetClasses\n- func_0044ec50 -> chkmemSetLock\n- func_0044ec60 -> chkmemAllocate\n- func_0044ee70 -> chkmemFree\n- func_0044ef70 -> chkmemAllocAligned\n- func_0044f140 -> chkmemReallocate\n- func_0044f3a0 -> chkmemAllocZeroed\n\nCallers renamed in Kernel/sdkCdvd.c, Kosaka/Field/k_fldResource.c,\npromoted/code1_0044.c, promoted/code1_0046.c, sdkDbprt.c, and\nsdkPak2.c. docs/architecture.md citations updated in the same commit.\nfunc_0044ea90 (the allocation-site tag, 655 call sites) is left for a\nseparate commit.\n\nOwner verify: all touched units MATCH. elig_debug src/Kernel/sdkChkmem.c\npasses. Retail addresses and ordering are unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T11:18:39Z","commit_sha":"1f6b79de96a0628fce8d4baa2883a0682bb40a12","commit_message":"Name packet callbacks for 0x100, 0x104, 0x107 and 0x109 by behaviour\n\nfunc_0019a0c0 creates the motion-request packet (btlUnitCreateMotionRequestPacket,\nwith hold/update/release btlUnitHoldPendingMotionRequest,\nbtlUnitMotionRequestPacketUpdate, btlUnitReleasePendingMotionRequest).\nfunc_0019a130/func_0019a150/func_0019a2c0 are the res-nullified hold, update\nand release (btlUnitHoldPendingResNullified, btlUnitResNullifiedPacketUpdate,\nbtlUnitReleasePendingResNullified). func_0019a660/func_0019a680 are the enemy\ndodge hold and update (btlUnitHoldPendingEnemyDodge,\nbtlUnitEnemyDodgePacketUpdate). func_00199e50/func_00199e70/func_00199ec0 are\nthe anim packet's hold, play-motion update and release\n(btlUnitHoldPendingAnim, btlUnitPlayMotionPacketUpdate,\nbtlUnitReleasePendingAnim). Owner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T11:14:38Z","commit_sha":"95e9fb1cdf3405ee6534d384e07501f444d34f42","commit_message":"Rename datCalcPickSpecialItem from func_0023dff0 (rename only)\n\nNamed from its body: random special-item skill (0xC0-0xC5) from a unit's\nskill list, 0 when none [inferred]. Callers and the btlAICommand.c prose\nnote updated in the same commit. Signature unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T11:10:39Z","commit_sha":"40bc93316a770f047c8ed59a30c96d607ba2721e","commit_message":"Name the fcl combine row builder, cue and result cue helpers (rename only)\n\nfunc_002ECFC0 -> fclCombineBuildRows (fills the 10-byte combine row table and\ncreates the first row sprite), func_00310960 -> fclCombinePlayCue (sets the\ncue on the channel and starts it when the flag is set; cue ids 0x26/0x27) and\nfunc_00310A10 -> fclCombinePlayResultCue (plays 0x2B/0x2C/0x2D by comparing\nthe player's score with the row thresholds). A prose note in the 0x30F650\nmeasurement comment names fclCombineBuildRows. Identifier, comment and prose\nchanges only.\n\nOwner verify: 41 MATCH before and after, zero status changes. Lint 40 before\nand after. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T11:06:41Z","commit_sha":"e7fe76ff6a8d77f67edd3554024cfe01b02a85a0","commit_message":"Name motion table lookup btlUnitGetMotionId\n\nfunc_001990d0 looks up a motion id in a unit's per-kind motion table (0x1E\nentries per kind, with a special case when flag 0x100 is set on a kind-0 unit\nwith id 1). The header already names its second argument motion. Renamed in\nbtl_motion_internal.h, btlUnit.c, the inferred unit files and code1_0019.c.\nOwner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T11:03:32Z","commit_sha":"0906680e43b4f41d4d3e22859b02c3646d13393b","commit_message":"Name the layer animation getter mdlGetLayerAnimation\n\nRename func_00479c30 to mdlGetLayerAnimation. It returns the layer's animation index from its state record (+0xF0), or -1 when the layer has no animation state. Its intent comment sits above the address marker.\n\nPure rename across every caller: src/Kosaka/Field/k_fldAI.c, src/promoted/code1_0018.c and src/promoted/k_fldEvent.c, with each prototype and extern updated.\n\nOwner verify: 4 touched files 233 MATCH, zero non-MATCH rows. Elig clean on all 4.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T11:01:02Z","commit_sha":"4d675d947f3431e169c15607dfc707cbe67c2ea3","commit_message":"Name sdkSpr.c sprite loader and draw functions\n\nGive the 16 unnamed sdkSpr.c functions behaviour-derived names and\nupdate every caller in the tree to match:\n\n- func_0046ab90 -> sdkSpriteLoadStep (archive load state machine)\n- func_0046aea0 -> sdkSpriteRequestLoad\n- func_0046af60 -> sdkSpriteAdoptBlob\n- func_0046b000 -> sdkSpriteCreateFromName\n- func_0046b0d0 -> sdkSpriteRelease\n- func_0046b1f0 -> sdkSpriteEntryWidth\n- func_0046b260 -> sdkSpriteScaledWidth\n- func_0046b2f0 -> sdkSpriteScaledHeight\n- func_0046b380 -> sdkSpriteDraw\n- func_0046d200 -> sdkSpriteNewNode\n- func_0046d280 -> sdkSpriteFreeNode\n- func_0046d2b0 -> sdkSpriteDrawOnce\n- func_0046d3b0 -> sdkSpriteDrawOnceAux\n- func_0046d4c0 -> sdkSpriteDrawOnceTinted\n- func_0046d5f0 -> sdkSpriteSlotHandle\n- func_0046d6a0 -> sdkSpriteNoop\n\nCallers renamed across Battle, Camp, Event/Fcl, Kernel, Main/Social,\nYajima, promoted, and the shd*/cld*/cmm* units. Prototypes and externs\nin include/sdk_sprite_loader.h and the touched units follow the same\nnames. Retail addresses and ordering are unchanged.\n\nOwner verify: 1598/1598 MATCH across the touched units.\nelig_debug src/Kernel/sdkSpr.c: no blocking markers, compiled True.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:58:14Z","commit_sha":"eaf6f945fb4ac5177e5bfdc5794764c096c81233","commit_message":"Rename threshold helpers datCalcThresholdKind and datCalcThresholdTrigger (rename only)\n\nfunc_0023dd90 -> datCalcThresholdKind (skill threshold kind: 1 HP, 2 SP),\nfunc_0023ddc0 -> datCalcThresholdTrigger (0/1/2/4 trigger result).\nNames from bodies and HP/SP call-site comparisons [inferred]. Callers in\nbtlAICommand.c, g_data.c, code1_001e.c, code1_001f.c (text edit) and\ncode1_0020.c updated in the same commit. Signatures unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:54:17Z","commit_sha":"ae0d1ad97e825ca55411445c498438cf58a59456","commit_message":"Name status motion updater btlUnitUpdateStatusMotion\n\nfunc_00198dd0 chooses a unit's status motion from its HP and status-flag\ntests (low HP, dead, and others) and plays it at the given frame. Renamed\nacross btl_motion_internal.h and the Battle and promoted callers. Owner\nverify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:54:06Z","commit_sha":"f756d8e426fa6e441896bee00bf71e26eeebd807","commit_message":"Name the fcl combine task creator fclCombineTaskCreate (rename only)\n\nfunc_00311260 -> fclCombineTaskCreate: creates the combine task with\nfclCombineTaskUpdate/Destroy as its callbacks, initialises its state, and runs\nthe unlock and roster setup when flag 0x1463 is set. Its extern and call in\nsrc/Kosaka/Field/sequenceList.c and its two calls in src/promoted/code1_002a.c\nare renamed in the same commit as rename-only link fixes outside this lane.\nIdentifier and intent comment only. No D_XXXXXXXX data symbols are renamed.\n\nOwner verify: 106 MATCH before and after across the three files, zero status\nchanges. Lint 40, 10 and 18 before and after. Elig clean for all three.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:46:09Z","commit_sha":"fbec4b6bbbe3d808222eee27387fb0d22bd55e0a","commit_message":"Rename datCalcStatusElement from func_0023d740 (rename only)\n\nNamed from its body: element index for a status bit (a skill of element 6\nalways gives 6) [inferred]. Callers in datScript.c and code1_001b.c updated\nin the same commit. Signature unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:42:14Z","commit_sha":"8d5ee92fa80169e4addfc6fe71e4a9a0df532c34","commit_message":"Name the layer predicates mdlLayerIsPresent and mdlLayerHasAnimation\n\nRename func_00479ca0 to mdlLayerIsPresent (two-argument layer-state test) and func_00479d10 to mdlLayerHasAnimation (three-argument animation-table test). mdlDispatchAnimIfPresent's intent comment now names the predicate it uses.\n\nPure rename across every caller: src/Event/evtMain.c, src/Graphics/Effect/effHelper.c, src/Graphics/Model/effModel.c and mdlManager.c, src/promoted/code1_0047.c and code1_004a.c, src/Battle/btlUnit_inferred_00198dd0.c, include/model_motion_internal.h, and docs/matching.md (with (was ...) citations).\n\nOwner verify: 7 touched .c files 329 MATCH, zero non-MATCH rows. Elig clean on all 7.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:41:01Z","commit_sha":"8369d725e0944647bb530642c8d8684a76f3db1a","commit_message":"Name the fcl combine menu task create, update and destroy (rename only)\n\nfunc_002E8410 -> fclCombineMenuCreate (combine state 1 creator: builds the slot\ntables and the menu's child draw tasks), func_002E7AC0 -> fclCombineMenuUpdate\n(menu state machine that draws and returns a status) and func_002E82B0 ->\nfclCombineMenuDestroy (frees the slot entries and slot draw tasks). The update\nand destroy callbacks are defined in promoted/code1_002e.c and their externs\nare renamed in the same commit. The P4_002E7AC0_DRAW macro keeps its name: it\nis a macro, not a function, and it is out of this rename's scope.\nIdentifier and intent comments only.\n\nOwner verify: 74 MATCH before and after across the two files, zero status\nchanges. Lint 39 and 16 before and after. Elig clean for both.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:34:08Z","commit_sha":"514b02f93e589800b6dc12b3f0740f3b152cd440","commit_message":"Rename datCalcInflictStatus from func_00238940 (rename only)\n\nNamed from its body: status-infliction roll for a skill (picks status bits,\ngates them on the target, applies resistance and source-side bonuses, rolls\nchance, returns landed bits) [inferred]. All 34 sites are in datCalc.c.\nSignature unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:30:08Z","commit_sha":"ef801ebba9356eba79794839d74628a9c61f2c9f","commit_message":"Name memory-card icon task and state entry in mc.c\n\nmc.c is the memory-card save UI. Name its state-machine entry mcSetState\nand the camp/icon.bin icon task family: mcIconTaskCreate (registers the\ntask), mcIconTaskUpdate (loads the archive, waits, suppresses render, then\nreleases), mcIconTaskDestroy (closes the archive handle and runs the\nteardown) and mcIconWorkFree (frees the work block). Update the callers in\npromoted/code1_0012, code1_0025, code1_001b and Battle/btlMain_inferred.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:27:18Z","commit_sha":"22c49e54b51431458e6516c145c91ad9c071f74c","commit_message":"Name the animation dispatch helper mdlDispatchAnimIfPresent\n\nRename func_00479940 to mdlDispatchAnimIfPresent. It calls mdl_dispatch_animation only when func_00479d10 reports the layer present, and always returns 1. Its intent comment says the presence test is not yet named.\n\nPure rename across every caller: src/Event/Fcl (y_fclCombine, y_fclModel), src/Graphics (mdlManager, effHelper, effModel), src/Kernel/h_malloc_inferred_001441e0, src/Kosaka (k_fldAI, k_fldResource, k_command), src/Scene/mt_sceneFunc, src/promoted (code1_0012, code1_0015, code1_0018, code1_0019, code1_004a, k_fldEvent, k_fldUnit), and include/model_motion_internal.h. Asm fallbacks and config keep the address-form name. Docs citations updated with (was ...) notes.\n\nOwner verify: 17 touched .c files 703 MATCH, zero non-MATCH rows. Elig clean on all 17.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:26:12Z","commit_sha":"3b7b5b0df93f99f3fc3333f9435fb9c08cb32d23","commit_message":"Name packet allocator, enqueue and step by behaviour\n\nfunc_00194470 allocates a packet record of a given type and work size\n(btlPacketAlloc), func_00194590 enqueues it on the side list keyed by its\nuid (btlPacketEnqueue), and func_00194670 runs its state step, including\nthe callback chain and removal from the list (btlPacketStep). Renamed across\n57 Battle and promoted files, including the code1_001f.c references that ast\ncannot parse (edited by hand). Comments that mention the old names are left\nfor a later comment pass. Owner verify 1128/1128 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:22:02Z","commit_sha":"52b8b7a6c7851e5ba7a4bcabb3155a27d534509e","commit_message":"Rename datCalc skill helpers datCalcSkillElement, datCalcSkillList, datCalcDefaultSkillId (rename only)\n\nfunc_0023d8e0 -> datCalcSkillElement (element index of a skill for a unit),\nfunc_0023e140 -> datCalcSkillList (pointer to a unit's skill-id list),\nfunc_0023dfe0 -> datCalcDefaultSkillId (retail stub that returns 0).\nNames from callers and bodies [inferred]. 70 call sites across 14 files\n(including Camp/cmpSkill.c and shdSkill.c caller-only edits) updated in this\ncommit; code1_001f.c by text edit. Signatures unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:15:03Z","commit_sha":"e92cc82a81f8d8b84119a3137dd4dff2c7a0c3bf","commit_message":"Name sdkTask kernel functions and update callers\n\nGive the task kernel behaviour names (kwlnTaskCreate, kwlnTaskCreateChild,\nkwlnTaskRunFrame, kwlnTaskRunList, kwlnTaskRunUpdate, kwlnTaskFinalize,\nkwlnTaskMoveToDying, kwlnTaskGetState, kwlnTaskIsLinked and others), and\nupdate every caller in the tree. kwlnTaskGetTaskByName and\nkwlnTaskDestroyWithHierarchy keep the P3 names.\n\nkwlnTaskDestroyWithHierarchy now returns u8, matching the u8 view its\nby-name wrapper used before, so the wrapper still matches byte-for-byte.\n\nUpdate the docs/architecture.md kernel citations and the sdktask.h comment\nto the new names.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:13:30Z","commit_sha":"a41442908b076574d3501df3b6b961631349bfe2","commit_message":"Name the fcl layout transition and combine task callbacks (rename only)\n\nfunc_002EB270 -> fclCombineLayoutTransition (transition 0 slides the layout in,\nany other value slides it out with jitter), func_00310BF0 ->\nfclCombineTaskUpdate (state dispatch registered with the combine task), and\nfunc_003111D0 -> fclCombineTaskDestroy (releases the CDVD handle and frees the\ntask work block). Also rewrites the func_003095F0 prose reference in a m2c\nnote to fclCombineOtherHeroId, which the previous commit renamed.\nIdentifier, comment and prose changes only.\n\nOwner verify: 41 MATCH before and after, zero status changes. Lint 39 before\nand after. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:09:47Z","commit_sha":"fd85140b65eb37231f62cbd3cf6ee74a71e33b87","commit_message":"Rename datCalcApplySkillEffect from func_00239f50 (rename only)\n\nNamed from its body: applies a skill's HP/SP/status effect to a target and\nreturns 1 [inferred]. Caller in g_data.c updated in the same commit.\nSignature unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:05:57Z","commit_sha":"9287e14f1cf0bafb8d2e9db2e089299516ebbccd","commit_message":"Name the model object registry functions in mdlManager and their callers\n\nRename seven model-object registry entry points in mdlManager.c, with every caller updated in the same commit:\n\n- func_004779b0 -> mdlAllocModelObject\n- func_00477c40 -> mdlFindModelObject\n- func_00477e80 -> mdlCreateModelObjectFromData\n- func_00477f10 -> mdlCreateModelObjectFromMemory\n- func_00478140 -> mdlFindOrCreateModelObject\n- func_00479880 -> mdlDrawAtomicIfVisible\n- func_00479910 -> mdlDrawVisibleAtomics\n\nThe bucket table D_00922BE0 keeps its name. Retail assembly fallbacks reference it by that address-form name (asm/nonmatchings/**), and the auto-symbol file defines it there. Renaming it left the link without a definition: mdlManager.c and code1_0047.c became ineligible (168 functions) until the name was restored.\n\nCallers updated: evtScript, btlUnit, evtLoadSave, y_fclModel, effHelper, effModel, mdlSE, k_command, k_field, k_fldFBN, k_fldResource, titleVisual, code1_0012/0015/0016/001b/0023/0029/0046/004a, k_fldData, k_fldEvent, k_fldUnit, and the Kosaka command and model headers. Docs citations updated with (was ...) notes. Owner verify: mdlManager.c and code1_0047.c 168 MATCH; all touched files MATCH with zero non-MATCH rows.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:05:35Z","commit_sha":"220e446f963e2374d43ae6d8e808b7f129544f5b","commit_message":"Name unit block loader and record counters by behaviour\n\nfunc_00193840 reads the CD file's blocks into the block buffer\n(btlUnitLoadBlocksFromFile), func_001939e0 is its load task step and returns\n-1 when finished (btlUnitLoadStep), func_00193a80 resets the loader and\nregisters the step (btlUnitStartLoad). func_00193c70 counts records across the\nper-side lists (btlCountUnitRecords) and func_00193cd0 counts those with a\nmatching id (btlCountUnitRecordsById). Callers in btlMain.c, code1_0019.c,\ncode1_001a.c and code1_001b.c renamed in the same commit. Owner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T10:01:25Z","commit_sha":"ba292bedbe574724a45f95439ad83ebbebd44e98","commit_message":"Name the fcl recipe, snapshot and hero helpers (rename only)\n\nfunc_00310480 -> fclCombineRecipeUnlocked (all four prerequisite records hold),\nfunc_00310700 -> fclCombineSaveSnapshot, func_00310850 ->\nfclCombineRestoreSnapshot (persona records and four combine flags), and\nfunc_003095F0 -> fclCombineOtherHeroId. Prototypes and two call sites of the\nsnapshot pair in promoted/code1_0011.c are renamed in the same commit (a\nrename-only link fix outside this lane). Also rewrites two stale draw-accessor\nnames in a y_fclCombine.c m2c note (fclDrawGetState, fclDrawSetPlacementEx).\nIdentifier, comment and prose changes only.\n\nOwner verify: 88 MATCH before and after across the two files, zero status\nchanges. Lint 39 and 14 before and after. Elig clean for both.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T09:58:35Z","commit_sha":"5d0874f8074a04a0f69bbbaa4ca3cbcd62d45c87","commit_message":"Name the scene resource constructors by resource type (pure renames)\n\nThe 14 func_ constructors in src/Scene/mt_scene_inferred_001459b0.c each\ncreate one resource of a fixed type id, (arg & 0x3FF) | type << 10. Names\nfollow RESRC_TYPE_* in include/resrc_manager_internal.h where the header\nnames the type, and the callers' use otherwise:\nMT_Scene_CreateObjectRes (type 6), MT_Scene_CreateModelFldRes (MODELFLD, 10),\nMT_Scene_CreateRes11 (type 11, unnamed in the header), MT_Scene_CreateFldRes\n(FLD, 12), MT_Scene_CreateFldHitLight (FLDHIT, 13), MT_Scene_CreateRes21Light\n(type 21, unnamed in the header), MT_Scene_CreatePointRes14..19 (six\nidentical point-and-radius creators, one per unnamed type), and\nMT_Scene_CreateCameraRes (camera entry arrays, type 20).\nMT_Scene_ApplyResTransform applies a placement to a resource. Callers in\ninclude, Event, Kosaka, Scene, promoted and tools/switch_probe.py are renamed\nin the same change. Owner verify: 326/326 MATCH across the 14 touched C and\nheader files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T09:53:32Z","commit_sha":"f4cb0380494a19e8bdab18991f9e29b3c49cd1e2","commit_message":"Move 10 inferred run TUs out of code1_0036 and code1_0038 into Main/OpEd ed_scroll and Main/Social gc_model *_inferred.c files\n\nOwner verify 122/122 MATCH, elig clean on all ten.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854848,"complete_code_percent":90.95163,"complete_data":0,"complete_data_percent":100,"total_units":391,"complete_units":361}},{"timestamp":"2026-10-15T09:52:12Z","commit_sha":"dd3fbd212eea842c5c794d53d11e9103b7e2567f","commit_message":"Name model release helper btlUnitReleaseModel\n\nfunc_0019d3c0 destroys the unit's model resource (MT_Scene_DestroyRes on the\nid at +0x9FE), clears the model pointer at +0xA00 and clears flags2 bit 2.\nCallers in btlUnit_inferred_0019b530/0019d4e0/0019d550 and promoted/code1_0019.c\nrenamed in the same commit. Owner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854256,"complete_code_percent":90.93277,"complete_data":0,"complete_data_percent":100,"total_units":381,"complete_units":351}},{"timestamp":"2026-10-15T09:49:09Z","commit_sha":"0b3776a004daf9bf5ce035b42347c8a416290cc4","commit_message":"Name the fcl draw task accessors (rename only)\n\nFourteen func_0031xxxx accessors of the fcl draw task are named from their\nbodies: fclDrawTaskCreate, fclDrawSetState, fclDrawSetPlacement(Ex),\nfclDrawSetSlot, fclDrawIsActive, fclDrawGetState, fclDrawSetStateByte,\nfclDrawResetScale, fclDrawSetHandleValue, fclDrawSetSlotMode, fclDrawSetFlag,\nfclDrawSetVisible and fclDrawGetResource. Callers are in y_fclCombine.c,\ny_fclCombineDraw.c and promoted/code1_002e.c; all are updated in this commit.\nIdentifier and intent comments only.\n\nOwner verify: 150 MATCH before and after, zero status changes. Lint 39, 13 and\n16 before and after. Elig clean for all three.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854256,"complete_code_percent":90.93277,"complete_data":0,"complete_data_percent":100,"total_units":381,"complete_units":351}},{"timestamp":"2026-10-15T09:45:32Z","commit_sha":"d4136f34d79b0844ee67488299ace5f4513a525f","commit_message":"Rename datCalcSureHitResult from func_00239e40 (rename only)\n\nNamed from its body: hit-formula result for kind-2 skills with a guard byte\nof 100 (sure hit), otherwise 0 [inferred]. Caller in parse-failed\ncode1_001f.c updated by text edit in the same commit. Signature unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854256,"complete_code_percent":90.93277,"complete_data":0,"complete_data_percent":100,"total_units":381,"complete_units":351}},{"timestamp":"2026-10-15T09:45:21Z","commit_sha":"0a3f6755ac320427ea313f84a8ab7cb15ffd0efc","commit_message":"Name itfMsgProcedure_Window.c message-window tasks\n\nRename the 21 unnamed func_ functions in itfMsgProcedure_Window.c from\nbehaviour: the entry state step and update, the window task start,\ndrawing helpers (ring, sprite, rect, shape, selection), the choice and\nphase machines (msgWinChoicePhase, msgWinRunPhase*), the selection and\ncalendar resource tasks (msgWinSelection*, msgCalResource*), and the\ncalendar draw (msgCalendarDraw). Callers in fclMisc.c, itfMesManager.c\nand promoted/code1_0027.c are renamed in the same commit. The SDK\ncomment in sdkPrimitive.c and measured notes are left as history.\n\nSignatures are unchanged; owner verify 186 rows, 0 status diffs vs\nsystemtu_full_14.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854256,"complete_code_percent":90.93277,"complete_data":0,"complete_data_percent":100,"total_units":381,"complete_units":351}},{"timestamp":"2026-10-15T09:41:19Z","commit_sha":"44a8bd6837792bec6382288a31992ceef261ce1f","commit_message":"Move 9 inferred run TUs out of code1_0025, code1_0026, code1_0028 and code1_002e into comuData, comuTimerSequence and fmGslCont *_inferred.c files\n\nOwner verify 179/179 MATCH, elig clean on all nine.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854256,"complete_code_percent":90.93277,"complete_data":0,"complete_data_percent":100,"total_units":381,"complete_units":351}},{"timestamp":"2026-10-15T09:35:13Z","commit_sha":"26e65775879337d92717e647173945e44f753f9a","commit_message":"Name itfMesManager.c window script handlers\n\nRename the 90 unnamed func_ functions in itfMesManager.c from behaviour:\nwindow command handlers (itfMesCmd*), window object state and\naccessors (itfMesWindow*), record/entry parsing (itfMesRecord*), text\nobject builders (itfMesObject*, itfMesWindowBuildEntry), and glyph list\nhelpers (itfMesList*). Callers in the 25 referencing files are renamed\nin the same commit (Battle, Event, Kernel/Kwln, Script, Yajima, cmm*,\npromoted/code1_*). code1_001f.c is hand-edited (ast could not parse it).\n\nSignatures are unchanged; owner verify 1321 rows, 0 status diffs vs\nsystemtu_full_14. Unnamed and left: func_00279010, func_00278260\n(duplicate of func_00277070 body), func_0027a340 (list field write).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854256,"complete_code_percent":90.93277,"complete_data":0,"complete_data_percent":100,"total_units":372,"complete_units":342}},{"timestamp":"2026-10-15T09:32:36Z","commit_sha":"a4b2ad810f989e591232bfc276f9c95ad7c06d7e","commit_message":"Name unit record constructor btlUnitCreate\n\nfunc_0019d210 zeroes a 0xA70-byte record (the BtlUnit size from\nbtl_unit_internal.h) and stores its genus argument at +0xA2\n(BtlUnit.genus). Renamed btlUnitCreate in btlUnit_inferred_0019d150.c,\nbtlUnit_inferred_0019e9f0.c and promoted/code1_0019.c. Owner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854256,"complete_code_percent":90.93277,"complete_data":0,"complete_data_percent":100,"total_units":372,"complete_units":342}},{"timestamp":"2026-10-15T09:31:58Z","commit_sha":"17cf16eb5b0c2f63a42e41e2696b22d7570f71d0","commit_message":"Name the fclCombine fusion pair and rare chance roll (rename only)\n\nfunc_003124A0 -> fclFusePair (fuses two persona ids into an output record;\nreturns 2 for an excluded pair, 0 when there is no result arcana, 1 on\nsuccess) and func_00312BC0 -> fclRollRareChance (1/64 chance for kind 2, 1/32\nfor kind 3). The chance roll is also called from y_fclCombine.c, and both\ncallers and the externs are renamed here. Identifier and intent comments only.\n\nOwner verify: 52 MATCH before and after across the two owners, zero status\nchanges. Lint 6 and 39 before and after. Elig clean for both.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854256,"complete_code_percent":90.93277,"complete_data":0,"complete_data_percent":100,"total_units":372,"complete_units":342}},{"timestamp":"2026-10-15T09:27:14Z","commit_sha":"42eeae3f9d9eea0a8cfb8302635d13e92d0ebc1b","commit_message":"Second pass: move 10 left-behind inferred runs into *_inferred.c files, carrying their declarations\n\nRuns held back from the first pass because their moved text needed declarations that\nstayed in the bucket: Battle btlUnit 00193840, 00195610, 00195710, 00196b70; Kosaka k_event,\nk_fldFrame 0016b8a0, k_fldrc, k_command 00175f70, k_spipe 00178a00 and 00179fc0.\nMoved text now carries the gap declarations it uses (typedefs, enums, multi-line #defines,\nprototypes) in original order, plus extern prototypes for same-source functions it calls.\nOwner verify 164/164 MATCH, elig clean on all ten.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2854256,"complete_code_percent":90.93277,"complete_data":0,"complete_data_percent":100,"total_units":372,"complete_units":342}},{"timestamp":"2026-10-15T09:26:04Z","commit_sha":"38abad1435a812ce9c9173f8568850823391ebb9","commit_message":"Rename datCalcStatusEffectResult from func_002397d0 (rename only)\n\nNamed from its body: status-effect result for a skill (0x80000 for the\nspecial kind, hit-formula result for ailment-type skills, else 0) [inferred].\nCaller in parse-failed code1_001f.c updated by text edit in the same commit.\nSignature unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2846576,"complete_code_percent":90.688095,"complete_data":0,"complete_data_percent":100,"total_units":363,"complete_units":333}},{"timestamp":"2026-10-15T09:23:17Z","commit_sha":"a64e01178df459c49721b9214c3a7a71a9b2ef1a","commit_message":"Name animation time setter and attachment matrix in mdlManager\n\n  func_00475170 -> mdlSetAnimControlTime   (sets the control time and applies it to the copy-hooked interpolators of MatFX frames)\n  func_00475B90 -> mdlComputeAttachMatrix  (writes an attachment entry times its frame matrix into buf; 0 when no entry or frame matches)\n\nmdlSetAnimControlTime has one caller, a tail block that runs when the\nlow 16 bits of arg1 are 0. mdlComputeAttachMatrix has one caller, the\nattachment matrix path, which falls back to a named-frame lookup when\nthe table is absent. The extern, the definitions and the two call lines\nare renamed. The docs/matching.md citation of the attachment matrix\n(312B / 320B MATCH) now uses the new name.\n\nOwner verify: mdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2846576,"complete_code_percent":90.688095,"complete_data":0,"complete_data_percent":100,"total_units":363,"complete_units":333}},{"timestamp":"2026-10-15T09:19:34Z","commit_sha":"c1a524effb55e744ef04507f8abe8385ddf4cb61","commit_message":"Name frFont.c text layout routines (rename only)\n\nPure renames with intent comments; no statement or type change.\n\n- func_002739E0 -> frFontLayoutSlotText (lay out the slot's string as glyph nodes)\n- func_00273CC0 -> frFontLayoutText (lay out a text string as glyph nodes)\n- func_00273F70 -> frFontUpdateTextWork (apply pending text work)\n\nCallers renamed in frFont.c, promoted/code1_0027.c and promoted/code1_0026.c.\ncode1_0026.c does not parse under ast_edit, so its call sites and externs were\nedited by hand (grep confirms none remain outside src/generated).\n\nOwner verify: 182 rows across frFont.c, code1_0026.c and code1_0027.c, no\nstatus change vs baseline. elig_debug on frFont.c: blocking [], compiled True,\nunowned []. Lint: no findings.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2846576,"complete_code_percent":90.688095,"complete_data":0,"complete_data_percent":100,"total_units":363,"complete_units":333}},{"timestamp":"2026-10-15T09:19:25Z","commit_sha":"416106531c6ecf1809fcf28461960a5686eeb510","commit_message":"Move 9 inferred run TUs out of btlFormation_grouped, code1_001d and code1_001e into Battle *_inferred.c files\n\nRun-level inferred units (no __FILE__ evidence): btlEffect runs 001d7140 through 001e8c60\n(nine files). Moved text now carries the gap declarations it uses (typedefs, tags, defines,\nprototypes) in original order. Owner verify 152/152 MATCH. btlEffect 001e7400 (mismatch)\nstays in code1_001e.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2846576,"complete_code_percent":90.688095,"complete_data":0,"complete_data_percent":100,"total_units":363,"complete_units":333}},{"timestamp":"2026-10-15T09:19:10Z","commit_sha":"ef40d1230510ea2061952f234838c5889a82ecd6","commit_message":"Name the fclCombine event gate and destroy callbacks (rename only)\n\nfunc_0033DD40 -> fclCombineEventGate (returns -1 and sets the event flag when a\nblocking flag or map range applies, else 0) and func_0033DE40 ->\nfclCombineEventDestroy (stops sound channel 2 and frees the task's work\nbuffer). Both are task callbacks referenced only inside y_fclCombineEvent.c.\nIdentifier and intent comments only. func_0033DE90 is left unnamed: its caller\nis in promoted/code1_0033.c, outside this lane.\n\nOwner verify: 7 MATCH before and after, zero status changes. Lint 6 before and\nafter. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2838496,"complete_code_percent":90.43068,"complete_data":0,"complete_data_percent":100,"total_units":354,"complete_units":324}},{"timestamp":"2026-10-15T09:11:26Z","commit_sha":"360ab76c112769c49fdaefbb99d681f143ae4c2f","commit_message":"Name animation control advance and frame search by id in mdlManager\n\n  func_00475820 -> mdlAdvanceAnimControl   (advances an animation control one tick and steps its resource objects)\n  func_00475B10 -> mdlFindFrameById        (recursive frame search by id through func_003e9af0)\n\nmdlAdvanceAnimControl has one caller, the model update at mdl+0x23C.\nmdlFindFrameById is passed to func_003e9af0 twice: in its own recursion\nand in the search wrapper. The extern and the two docs/matching.md\ncitations (the IDA section for mdlAdvanceAnimControl and the callback\nnote in the frame-search section) are updated in this commit.\n\nOwner verify: mdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2838496,"complete_code_percent":90.43068,"complete_data":0,"complete_data_percent":100,"total_units":354,"complete_units":324}},{"timestamp":"2026-10-15T09:07:19Z","commit_sha":"d00f2a118167419852a990de7140f7abf949d485","commit_message":"Name command-type found script query\n\nfunc_001e6820 returns whether btlAICommandCollectCommandsOfType did not\nfail: the collector returns -1 on failure and the script returns\n~result != 0. Renamed btlAICommandScriptHasCommandOfType. Rename only;\nowner verify 263/263 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2838496,"complete_code_percent":90.43068,"complete_data":0,"complete_data_percent":100,"total_units":354,"complete_units":324}},{"timestamp":"2026-10-15T09:06:43Z","commit_sha":"40d54f883b0b2e7a2356c7dad8bc8ff03c3ab128","commit_message":"Name the fclCombine rule check fclCombineCheckRules (rename only)\n\nfunc_00303610 tests the gathered item ids against the combine's three category\nrules (the D_0063FCA0 table, indexed by the rule number at +0x2D4) and returns\n1 when they pass or no rule is set. Its only caller is fclCombineCheckIds, and\nthe extern is in y_fclCombine.c. Identifier and intent comment only.\n\nOwner verify: 41 MATCH before and after, zero status changes. Lint 39 before\nand after. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2838496,"complete_code_percent":90.43068,"complete_data":0,"complete_data_percent":100,"total_units":354,"complete_units":324}},{"timestamp":"2026-10-15T09:03:05Z","commit_sha":"1d889ebc5eeced7799feeaed464c812fea967523","commit_message":"Rename datCalcSkillEffectFlags from func_0023a1e0 (rename only)\n\nNamed from its body: effect flag mask (HP, SP, status) for a skill from an\nactor on a target [inferred]. Callers in parse-failed code1_001f.c and\ng_data.c (extern and return) updated in the same commit. Signature unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2838496,"complete_code_percent":90.43068,"complete_data":0,"complete_data_percent":100,"total_units":354,"complete_units":324}},{"timestamp":"2026-10-15T09:00:13Z","commit_sha":"fbb62e3b9ca3d24cc13df23e961ec11890069370","commit_message":"Name named-frame setup and list-insert callback in mdlManager\n\n  func_00474DF0 -> mdlSetupNamedFrameAnims   (collects a clump's frames and sets the loop callback and copy hooks on frames with the named prefix)\n  func_00474970 -> mdlAppendUniqueListEntry  (clump-walk callback: appends a value to a list unless present)\n\nmdlSetupNamedFrameAnims has two callers, the model attach path (under\nthe +0x254 list check) and the layer clone path. The callback is stored\nin callbackData and its extern is renamed.\n\nOwner verify: mdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2838496,"complete_code_percent":90.43068,"complete_data":0,"complete_data_percent":100,"total_units":354,"complete_units":324}},{"timestamp":"2026-10-15T08:55:10Z","commit_sha":"47c1dd1310a71769a0c6ffb02a7ffe683f3223d3","commit_message":"Name AI picker, id2 accessors and average-level queries\n\nfunc_001dbf20 is the AI row picker (btlAICommandPickAiTarget): it filters\nthe candidate list, sorts it and picks a target. func_001e5f90 returns the\nunit's id2 (btlAICommandScriptGetSelfId2). btlAICommandScriptResetBuffLevels\nalso writes id2, so it becomes btlAICommandScriptSetId2ClearBuffs.\nfunc_001e6400 and func_001e6450 average the alive level on the own and\nopposite side through btlSideAverageLevel (btlAICommandScriptAverage\nOwnLevel / OppLevel). Renames across the Battle, promoted files; owner\nverify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2838496,"complete_code_percent":90.43068,"complete_data":0,"complete_data_percent":100,"total_units":354,"complete_units":324}},{"timestamp":"2026-10-15T08:53:56Z","commit_sha":"48051407f944958c151f3dd9ad46a167dfe4f285","commit_message":"Name frFont.c script runner, command runner and startup (rename only)\n\nPure renames with intent comments; no statement or type change.\n\n- func_002746E0 -> frFontRunScript (run a command script until a terminator)\n- func_002748E0 -> frFontRunCommand (run one command with a mode, restore it)\n- func_00274970 -> frFontStartup (task pool, manager init, callback registration)\n\nCallers renamed in frFont.c, itfMesManager.c, promoted/code1_0010.c (boot\npath), promoted/code1_0027.c and Kernel/Kwln/kwln_inferred_00100e30.c (boot\npath).\n\nOwner verify: 229 rows across the five touched source files, no status change\nvs baseline. elig_debug on frFont.c: blocking [], compiled True, unowned [].\nLint: no findings.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2838496,"complete_code_percent":90.43068,"complete_data":0,"complete_data_percent":100,"total_units":354,"complete_units":324}},{"timestamp":"2026-10-15T08:51:19Z","commit_sha":"6a7b4793dd478706a4c22e23831ef2c5ad986e12","commit_message":"Rename datCalcPrimaryPersonaId and datCalcSkillValueBase (rename only)\n\ndatCalcPrimaryPersonaId (func_0023e270) and datCalcSkillValueBase\n(func_0023e2f0), named from their bodies [inferred]. Callers in parse-failed\ncode1_001f.c updated by text edit in the same commit. Signatures unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2838496,"complete_code_percent":90.43068,"complete_data":0,"complete_data_percent":100,"total_units":354,"complete_units":324}},{"timestamp":"2026-10-15T08:48:01Z","commit_sha":"12ca25686779013104910849c9f8469d4e2b665e","commit_message":"Name side count and side selection helpers by decoded behaviour\n\nfunc_001ef720 counts the alive units in a side mask without the given bad\nstatus (btlSideCountNotBad). func_001d9390 selects the alive units of a\nside mask that satisfy a predicate, negated when the mode is 1; the out\nlist is optional (btlSideSelectUnits). Renames across the Battle,\npromoted and shared-header files; the code1_001d.c edits are the two\ncall-site and definition renames Main released for this change. Owner\nverify MATCH for every touched file.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2838496,"complete_code_percent":90.43068,"complete_data":0,"complete_data_percent":100,"total_units":354,"complete_units":324}},{"timestamp":"2026-10-15T08:47:45Z","commit_sha":"ee9f9ce88a7b3c2996186ccd8cec5b07422a83f7","commit_message":"Name the resource manager render and accessor functions (pure renames)\n\nThe 27 func_ definitions in src/Scene/resrcManager_inferred.c take the\nnames of their roles. Lookup and counting: resrcMngFindResById,\nresrcMngGetTotalResInList (the P3FES name, kept from the file's own\nprovenance comment), resrcMngGetTableEntry. Render-queue draw callbacks\nregistered on the queue task: resrcMngRenderCameraFog, resrcMngRenderCamera,\nresrcMngRenderCameraFade, resrcMngRenderCameraPair, resrcMngRenderAttached,\nresrcMngRenderCameraSlots, resrcMngRenderAttachedPair, resrcMngRenderAttachedAlt.\nQueue: resrcMngRenderTask, resrcMngSpawnRenderTask, resrcMngSetRenderSuppressed,\nresrcMngSelectDrawSet, resrcMngSetDrawEnabled, resrcMngApplyColorFactors,\nresrcMngResetRenderSlots. Accessors: resrcMngGetColorValue,\nresrcMngGetColorTarget, resrcMngGetTransform, and the field-environment\nsetters resrcMngSetEnvPrimary, resrcMngSetEnvSecondary,\nresrcMngSetEnvTertiary, resrcMngSetEnvIntensity. The two identical distance\ncomparators are resrcMngCompareDistanceArrA and ArrB, named by the array each\none sorts. Callers in btlEPL, btlMain, k_field, k_fldResource, k_sceneDraw,\nthe k_draw/k_sceneDraw inferred files, mt_scene, mt_sceneFunc, mc, kwln,\nand code1_* are renamed in the same change, along with the measured-log\ncomments. Owner verify: 808/809 MATCH across the 25 touched files; the one ASM\nrow (code1_0010 func_00100008) is an existing INCLUDE_ASM at HEAD.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2838496,"complete_code_percent":90.43068,"complete_data":0,"complete_data_percent":100,"total_units":354,"complete_units":324}},{"timestamp":"2026-10-15T08:43:29Z","commit_sha":"68fdbebd5696f33341ce302a456ee49c6dff8c8e","commit_message":"Move 8 inferred run TUs out of btlFormation_grouped, code1_001c and code1_001d into Battle *_inferred.c files\n\nRun-level inferred units (no __FILE__ evidence): btlCamera 001ce470 and 001d01c0, btlEffect\n001d6300 through 001d6f20 (four files), btlFormation 001d41b0 and 001d44a0. Owner verify\n83/83 MATCH. code1_001d gains seven extern declarations for moved functions it still calls.\nbtlCamera 001d1310 (mismatch) and btlFormation 001d4eb0 (compile) stay in their buckets.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2838496,"complete_code_percent":90.43068,"complete_data":0,"complete_data_percent":100,"total_units":354,"complete_units":324}},{"timestamp":"2026-10-15T08:41:23Z","commit_sha":"f12d83ef82648e29f7ca9f60125d2565310727b6","commit_message":"Name the fclCombine item id check fclCombineCheckIds (rename only)\n\nfunc_00303A20 gathers the item id fields for the combine's stage count into a\nbuffer and returns the validation result of func_00303610. Its nine callers\ncompare that result against 1. All callers are in y_fclCombine.c. Identifier\nand intent comment only.\n\nOwner verify: 41 MATCH before and after, zero status changes. Lint 39 before\nand after. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":347,"complete_units":318}},{"timestamp":"2026-10-15T08:39:33Z","commit_sha":"d456fa8e6724b2ab2c6061f1b01f26884651377c","commit_message":"Rename datCalcElementBit from func_0023d6e0 (rename only)\n\nNamed from its body: element bit 1 << (index+1) for element index 0..0x12\n[inferred]. Callers in btlAICommand.c, code1_001d.c, code1_001e.c and\ncode1_0020.c updated in the same commit. Signature unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":347,"complete_units":318}},{"timestamp":"2026-10-15T08:35:42Z","commit_sha":"25aeb297a8a32007a60ac6ab5b95a2694adb15d1","commit_message":"Name keyframe hook copies and no-op hooks in mdlManager by role\n\n  func_00474A50 -> mdlKeyFrameBlendCopy        (keyframe blend hook; copies six floats at +0x8..+0x1C)\n  func_00474A90 -> mdlKeyFrameInterpolateCopy  (keyframe interpolate hook; same copy body)\n  func_00474AD0 -> mdlKeyFrameBlendNoOp        (empty; only compared against in this file)\n  func_00474AE0 -> mdlKeyFrameInterpolateNoOp  (empty; only compared against in this file)\n\nThe two copy hooks are installed at the interpolator's +0x40 and +0x44\nand as keyFrameBlendCB / keyFrameInterpolateCB, and compared in the\nhook checks. Their bodies are identical; retail keeps them at separate\naddresses, so both stay and the intent comments say so. The no-op hooks\nhave no install site in this file yet, and their comments say that.\n\nThe LAB_00474a50 / LAB_00474a90 address-form labels are kept: they are\nused by the other install site and follow the address-form convention.\n\nOwner verify: mdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":347,"complete_units":318}},{"timestamp":"2026-10-15T08:31:48Z","commit_sha":"cd20aa041860f46342e6c0caf5c3c1aa4ced2645","commit_message":"Name frFont.c text builder chain (rename only)\n\nPure renames with intent comments; no statement or type change.\n\n- func_002740B0 -> frFontBuildText (build a text chain from a descriptor and\n  return its head)\n- func_00274570 -> frFontBuildTextSimple (nine-argument wrapper with a zero\n  third argument)\n- func_002745C0 -> frFontBuildTextFull (packs its parameters into a descriptor\n  and calls frFontBuildText)\n\nCallers renamed in frFont.c, itfMesManager.c (including the measured note on\nfunc_002787d0) and shdWindow.c.\n\nOwner verify: 151 rows across frFont.c, itfMesManager.c and shdWindow.c, no\nstatus change vs baseline. elig_debug on frFont.c: blocking [], compiled True,\nunowned []. Lint: no findings.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":347,"complete_units":318}},{"timestamp":"2026-10-15T08:28:49Z","commit_sha":"a1513fc844ae23f3654dda02a6fea4b337d6798e","commit_message":"Move 8 inferred run TUs out of code1_001b/001c/nullsub into Battle *_inferred.c files\n\nRun-level inferred units (no __FILE__ evidence): btlCamera runs 001bd7d0 through 001ca590\n(six files), btlMain 001bbe80 and 001bbf40, and the func_001ca580 nullsub from nullsub.c.\nOwner verify 143/143 MATCH. btlCamera 001bc980 and 001be900 stay in their buckets: their dests\ndid not compile on the moved text.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":347,"complete_units":318}},{"timestamp":"2026-10-15T08:27:49Z","commit_sha":"837c83bca3e01107b5d16bafe4290c375f670977","commit_message":"Rename datCalcResolveSkillId from func_00242990 (rename only)\n\nNamed from its body: effective skill id for a unit given a base skill,\nor -1 when no replacement applies [inferred]. Callers in parse-failed\ncode1_001f.c updated by text edit in the same commit. Signature unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":339,"complete_units":310}},{"timestamp":"2026-10-15T08:23:53Z","commit_sha":"a569be3cc946726eee3420534ef1c4843e0a5dde","commit_message":"Name anim-loop callbacks in mdlManager by behaviour\n\n  func_00474AF0 -> mdlAnimLoopRewind     (loop callback: rewinds the interpolator time for a valid, unflagged slot; sets the loop-done byte at state+1)\n  func_00474BA0 -> mdlAnimLoopCallback   (loop callback with two modes: re-seed and hook install, or the rewind with a +2 byte)\n\nBoth are passed to RtAnimInterpolatorSetAnimLoopCallBack. The registration\nsites are one in the user-data loop and four in the keyframe-hook setup\npaths. The extern and all seven callback references are renamed. The\nkeyframe hook functions they install (func_00474a50, func_00474a90) keep\ntheir names for now.\n\nOwner verify: mdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":339,"complete_units":310}},{"timestamp":"2026-10-15T08:22:46Z","commit_sha":"ef2f07b52097ac9bc40ac8a9884059fe2b685783","commit_message":"Name NOMAL check helpers by behaviour\n\nfunc_001db360 is the gated command check (btlAICommandNomalCheck, enabled\nflag), func_001db5b0 is its enabled=0 wrapper (btlAICommandNomalCheck\nNoGate), func_001db5e0 is the status-only check (btlAICommandNomal\nStatusCheck). Renames across btlAICommand.c, code1_001a.c and code1_001e.c;\nowner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":339,"complete_units":310}},{"timestamp":"2026-10-15T08:19:48Z","commit_sha":"e9a40e350062c1541e25ff80685b9d0114e2efb6","commit_message":"Name the fclCombine outcome roll and stage value helpers (rename only)\n\nfunc_003040D0 -> fclCombineRollOutcome (rolls the stage from five weights, then\na result count, and returns the stage value) and func_003042F0 ->\nfclCombineStageValue (selects one of six per-stage tables by stage and indexes\nit by count). Two prose comments that named the old functions now use the new\nnames. Identifiers, declarations and intent comments only; all references are\nin y_fclCombine.c.\n\nOwner verify: 41 MATCH before and after, zero status changes. Lint 39 before\nand after. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":339,"complete_units":310}},{"timestamp":"2026-10-15T08:16:24Z","commit_sha":"cc9add43e0c55c526c106d9288f499d8a495e773","commit_message":"Rename datCalcHitResult from func_002411a0 (rename only)\n\nNamed from its body: returns 4 for a critical, 2 for a roll that lands, 1\notherwise [inferred]. Caller in parse-failed code1_001f.c updated by text\nedit in the same commit. Signature unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":339,"complete_units":310}},{"timestamp":"2026-10-15T08:15:46Z","commit_sha":"c366e6537dab7545029c5f670463343ca4b7ee34","commit_message":"Name frFont.c state, mode, width and run helpers (rename only)\n\nPure renames with intent comments; no statement or type change.\n\n- func_002738A0 -> frFontLoadSystemSlot (load data into slot 8)\n- func_002738D0 -> frFontNodeWidth (glyph advance plus line height)\n- func_00273970 -> frFontCountRuns (same-type runs in a chain)\n- func_00274640 -> frFontClearStateFlags\n- func_00274660 -> frFontSetStateBits (set or clear bits by enable flag)\n- func_002746A0 -> frFontGetMode\n- func_002746B0 -> frFontSetMode\n\nCallers renamed in frFont.c, frFontEx.c, itfMesManager.c,\nitfMsgProcedure_Window.c, cmmRankUp.c, evtScript.c, shdWindow.c,\nMain/OpEd/ed_scroll.c and the promoted buckets code1_0020, code1_0021,\ncode1_0026 and code1_0027. code1_0026.c does not parse under ast_edit, so its\ncall sites were edited by hand (37 lines; grep confirms none remain).\n\nOwner verify: 613 rows across the twelve touched source files, no status\nchange vs baseline. elig_debug on frFont.c: blocking [], compiled True,\nunowned []. Lint: no findings.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":339,"complete_units":310}},{"timestamp":"2026-10-15T08:11:50Z","commit_sha":"fc875c8b5603bad945d02c8c555dd8c6edf46d79","commit_message":"Name layer pose rebase function in mdlManager\n\n  func_00473870 -> mdlRebaseLayerPose   (rebases a layer's output pose by its reference rotation and input clip)\n\nFor each node: out = out * conj(rotation) * input, using normalized\nquaternions, and out.values += rotation.values - input.values. The\nconsumer of the output pose is not yet traced, so the intent comment\nsays so.\n\nCallers: two sites in the layer code, both passing the layer record.\nThe extern and both call lines are renamed.\n\nOwner verify: mdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":339,"complete_units":310}},{"timestamp":"2026-10-15T08:03:44Z","commit_sha":"afbf4fdb65b55e83076e367bc6dbc5f378f88669","commit_message":"Name frFont.c list measure, cache task, append and run-split helpers (rename only)\n\nPure renames with intent comments; no statement or type change. Measured\nnotes in frFont.c that quoted the old names now quote the new ones.\n\n- func_002734B0 -> frFontMeasureList (total advance when no node is animating)\n- func_00273610 -> frFontMaintainCacheTask (release cached list, evict expired raster)\n- func_00273650 -> frFontAppendList (splice list onto a tail; optional placement)\n- func_002736D0 -> frFontSplitRun (detach a run of same-type nodes)\n\nCallers renamed in frFont.c, itfMesManager.c, cmmRankUp.c, evtScript.c,\nshdWindow.c and promoted/code1_0027.c.\n\nOwner verify: 245 rows across the six touched source files, no status change\nvs baseline. elig_debug on frFont.c: blocking [], compiled True, unowned [].\nLint: no findings.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":339,"complete_units":310}},{"timestamp":"2026-10-15T08:03:20Z","commit_sha":"c91082fb69131683f8afe21efe07a917d7ac95e6","commit_message":"Move 3 inferred run TUs out of code1_001b into Battle *_inferred.c files\n\nRun-level inferred units (no __FILE__ evidence): btlAction 001b0020 and 001b0930, btlMain\n001b5ec0. Owner verify 119/119 MATCH. Runs btlAction 001a0660, 001a0670, 001a1450, 001ade90,\n001b0d70, 001b1510 and btlMain 001ba0e0 stay in their buckets: their dests did not compile on\nthe moved text (missing prototypes for callees declared in the bucket) or one mismatched.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":339,"complete_units":310}},{"timestamp":"2026-10-15T07:59:39Z","commit_sha":"0864c8f90d0fd026bcf75c2daf9a91fb50290425","commit_message":"Name slot hierarchy attach function in mdlManager\n\n  func_00473710 -> mdlAttachSlotHierarchy   (attaches a clump's frame hierarchy to a slot record)\n\nCallers: the model attach path (with MatFX, arg2 = 1) and the layer\nclone path (without, arg2 = 0). The function stores the hierarchy at the\nslot, sets the atomic hierarchy, optionally sets up MatFX, and builds\ntwo interpolators from the source animation. Both caller lines are\nrenamed, and the docs citation for the MATCH function now uses the new\nname.\n\nOwner verify: mdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":336,"complete_units":307}},{"timestamp":"2026-10-15T07:56:56Z","commit_sha":"5d87a61f6e4cd4c24a93a6ac6f0efbc1ee0b2991","commit_message":"Name the fclCombine slot claim and discount helpers (rename only)\n\nfunc_00302570 -> fclCombineClaimSlot (takes the first free combine slot whose\ngate is met and sets up its item; 0 when none is free) and func_003026C0 ->\nfclCombineApplyDiscount (reduces a value by the rate of the first set discount\nflag). Twenty-plus call sites, all in y_fclCombine.c. Identifiers and intent\ncomments only.\n\nOwner verify: 41 MATCH before and after, zero status changes. Lint 39 before\nand after. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":336,"complete_units":307}},{"timestamp":"2026-10-15T07:55:49Z","commit_sha":"67b58c6910d680a6b4d66cfa436296db69b6b484","commit_message":"Name tail script queries and command helpers by behaviour\n\nfunc_001e5990 applies the APPOINT predicate to the current unit\n(btlAICommandScriptAppointCurrent), func_001e5ca0 is MYID with the 0x40\nfilter, func_001e5d90 clears buff levels 8-B, func_001e5f40 writes the\ncommand override, func_001e64c0 looks up a command row, func_001e66c0\ntests a buff by unit id, func_001e6740 checks whether the skill would\nkill the target, func_001e68c0 only looks up the unit and returns false,\nfunc_001e6a00 checks the unit's side is 0, func_001e6a50 checks whether\nthe unit can use the command. Renames only; owner verify 263/263 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":336,"complete_units":307}},{"timestamp":"2026-10-15T07:51:54Z","commit_sha":"ddd7e59564b60ae416622825fd8d3253ec68f07f","commit_message":"Name frFont.c glyph draw chain and node intensity step (rename only)\n\nPure renames with intent comments; no statement or type change.\n\n- func_00272E10 -> frFontStepNodeIntensity (scaled saturating intensity step,\n  returns x shift for type-1 nodes)\n- func_00273170 -> frFontDrawList (draw each node's glyphs, return total\n  advance or 0 while animating)\n- func_00273140 -> frFontDrawListMode (draw with mode and the default third\n  argument)\n- func_00273110 -> frFontDrawListDefault (draw with the default mode)\n\nCallers renamed in frFontEx.c, itfMesManager.c, cmmRankUp.c, evtScript.c,\nshdWindow.c, Main/OpEd/ed_scroll.c, the promoted buckets code1_0020,\ncode1_0021 and code1_0027, and the fr_font_internal.h prototype.\n\nOwner verify: 527 rows across the ten touched source files, no status change\nvs baseline. elig_debug on frFont.c: blocking [], compiled True, unowned [].\nLint: no findings.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":336,"complete_units":307}},{"timestamp":"2026-10-15T07:50:03Z","commit_sha":"987d971b14d4950a7f8075eacc3d0b1e5023988f","commit_message":"Rename datCalcGetIdRecord and datCalcRollSkillValue (rename only)\n\ndatCalcGetIdRecord (func_00243840) and datCalcRollSkillValue (func_00243650),\nnamed from their bodies; [inferred]. Callers in btlPanelAnalyze.c,\ncode1_0011.c, code1_0038.c and parse-failed code1_001f.c updated in the same\ncommit. Signatures unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":336,"complete_units":307}},{"timestamp":"2026-10-15T07:48:08Z","commit_sha":"ddd3142874f4e9791849979a0c0035f5968521bb","commit_message":"Name frame name user-data getter in mdlManager\n\n  func_00474CE0 -> mdlGetFrameNameUserData   (returns the string value of the frame's name-keyed user-data entry, or 0)\n\nCallers: four sites in mdlManager.c. Two use the result as a name (the\nanimation lookup by name at the object pass, and the name match in the\nhierarchy loop). One is a detach test on the object pass, and one is a\nuser-data scan. The key string at DAT_007641c8 is not yet read from\nrodata, so the intent comment says so. The extern is renamed too.\n\nOwner verify: mdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":336,"complete_units":307}},{"timestamp":"2026-10-15T07:42:56Z","commit_sha":"0e4e0689801981cca0e7ee1e222ae6d63d918434","commit_message":"Name side-scoped all-units status queries\n\nfunc_001e2910 checks that every caller-side unit with the id has the buff\n(btlAICommandSideIdQueryAllHasBuff); func_001e26c0 checks the same\nover the opposite side for bad status (btlAICommandOppSideIdQueryAll\nBadStatus). Renames only; owner verify 263/263 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":336,"complete_units":307}},{"timestamp":"2026-10-15T07:40:13Z","commit_sha":"8fc8c783706ba9a4749833291882ebafae6f2e26","commit_message":"Name frFont.c list tail, flag-bit, fade and readiness helpers (rename only)\n\nPure renames with intent comments; no statement or type change. Measured\nnotes in frFont.c that quoted the old names now quote the new ones.\n\n- func_00272BF0 -> frFontListTail (last node of a list)\n- func_00272C60 -> frFontSetFlagBits (OR into global flag word, return old)\n- func_00272C80 -> frFontClearFlagBits (AND-NOT, return old)\n- func_00272CB0 -> frFontFadeNodes (fade type-2 nodes, return changed)\n- func_00272D40 -> frFontReadyNode (return node when type and state are ready)\n\nCallers renamed in frFontEx.c, itfMesManager.c, Main/OpEd/ed_scroll.c and the\npromoted buckets code1_0020 and code1_0021.\n\nOwner verify: 425 rows across the six touched source files, no status change\nvs baseline. elig_debug on frFont.c: blocking [], compiled True, unowned [].\nLint: no findings.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":336,"complete_units":307}},{"timestamp":"2026-10-15T07:36:21Z","commit_sha":"04955fa6e1a7deab7bfee8c029fe2de2972520f3","commit_message":"Name blend track update and release functions in mdlManager\n\n  func_004746B0 -> mdlUpdateBlendTrack   (cross-fades a blend track between animation entries)\n  func_00474890 -> mdlReleaseBlendTrack  (drops the count at +0xE; frees subobjects on last release)\n\nCallers: the owner and model render paths (update at animation flag\n0x80000), the attached-model path, and the owner teardown at +0x254. The\nextern declarations and the call inside the attached-model path are\nrenamed too.\n\nOwner verify: mdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":336,"complete_units":307}},{"timestamp":"2026-10-15T07:35:47Z","commit_sha":"49907f76764169592ea8ffd47ff78b1d058db0a6","commit_message":"Move 7 inferred run TUs out of code1_0019 into btlUnit *_inferred.c files\n\nRun-level inferred units (no __FILE__ evidence) from Battle btlUnit runs 0019d4e0 through\n0019e9f0. Owner verify 65/65 MATCH. Runs btlAction 001a0640 and 001a0650 and btlUnit 001a0140\nstay in place (their dests did not compile on the moved text).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2834912,"complete_code_percent":90.3165,"complete_data":0,"complete_data_percent":100,"total_units":336,"complete_units":307}},{"timestamp":"2026-10-15T07:28:34Z","commit_sha":"25508e725167341535283cec1293772187d48997","commit_message":"Name frFont.c list and glyph accessors by what they do (rename only)\n\nPure renames with intent comments; no statement or type change. The\nmeasured notes in frFont.c that quoted the old names now quote the new ones.\n\n- func_00272730 -> frFontSetListFlag (byte at +2 of every node)\n- func_002727A0 -> frFontSetNodeId (leading 16-bit id)\n- func_002727F0 -> frFontEnableList\n- func_00272860 -> frFontSetCharWidth (byte at +3, recompute width at +0xC)\n- func_002728C0 -> frFontSetListSlot (slot byte of every glyph)\n- func_00272950 -> frFontMoveListTo (shift list to x, y)\n- func_00272A10 -> frFontMoveListToFloat (shift list to float x*16, y*8)\n- func_00272B00 -> frFontSetGlyphAux (aux byte of every glyph)\n- func_00272B50 -> frFontReplaceGlyphAux (replace aux byte equal to key)\n- func_00272BA0 -> frFontSetGlyphColor (u32 colour word of every glyph)\n\nCallers renamed in frFontEx.c, itfMesManager.c, itfMsgProcedure_Window.c,\ncmmRankUp.c, evtScript.c, shdWindow.c, Main/OpEd/ed_scroll.c and the\npromoted buckets code1_0020, code1_0021 and code1_0027.\n\nOwner verify: 548 rows across the 11 touched source files, no status change\nvs baseline. elig_debug on frFont.c: blocking [], compiled True, unowned [].\nLint: no findings.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T07:28:24Z","commit_sha":"33d99107713b8f198947112666e3400e38580765","commit_message":"Name the persona info show handlers in cmmScript (rename only)\n\nfunc_0024A8B0 -> cmmPersonaInfoShow (fills the message slots from the persona\nrow for the entry in arg 0) and func_0024A710 -> cmmPersonaInfoLookupShow (the\nsame fill after resolving the entry through func_00247900). Also reworded a\nprose mention of FUN_0024A8B0 in the level-1 measured block to the new name, so\nthe marker text no longer appears in comment prose.\n\nOwner verify: 51 MATCH before and after, zero status changes. Lint 43 before\nand after. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T07:24:47Z","commit_sha":"58731fb4357948322ef808213ee541359692c964","commit_message":"Name atomic MatFX, anim-loop, slot record and effect cleanup functions\n\n  func_00473250 -> mdlSetupAtomicMatFX        (per-atomic callback; MatFX plugin and materials for large hierarchies)\n  func_00473350 -> mdlResolveLoopAnimation    (RtAnimInterpolator anim-loop callback; slot animation lookup)\n  func_00473520 -> mdlInitSlotRecord          (clears and defaults a 0xA4-byte slot record)\n  func_004735B0 -> mdlDestroySlotEffects      (destroys each slot's effect list)\n\nCallers: the clump atomic walk (mdlSetupAtomicMatFX), the anim-loop\nregistration and layer update (mdlResolveLoopAnimation), the two slot\ninits and the slot destroy at the owner's +0xEC record array. The two\ncallbacks are passed as function pointers, so those uses are renamed too.\n\nOwner verify: mdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T07:21:44Z","commit_sha":"a5c9331239a8e77660fadcbf2440b97d008d0cd5","commit_message":"Rename datCalc helpers datCalcSkillTypeAllowed and datCalcGetSlotRecord (rename only)\n\ndatCalcSkillTypeAllowed (func_00243fa0) and datCalcGetSlotRecord\n(func_002438b0), named from their bodies; [inferred] meanings. Callers in\nbtlShuffleResult.c, btlShuffleSeq.c and parse-failed code1_001f.c updated in\nthe same commit. Signatures unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T07:16:30Z","commit_sha":"b5a0845a7e26f619a490786694392641911506ff","commit_message":"Name script action setters and unit action helpers\n\nfunc_001ded30 sets a unit's action (btlAICommandSetUnitAction) and\nfunc_001deee0 releases its proc (btlAICommandTryReleaseProc); the\nfunc_001def60..func_001df2d0 script commands write action codes through\nbtlAICommandSetActionCode: default (0x8000), parameter-driven, skill, AI\nplan (with and without arg), and the 0x8001/0x8002/0x8007 code writers\nthat are named by their written value until the de640 switch is decoded.\nRenames across btlAICommand.c and code1_001a.c; owner verify MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T07:15:05Z","commit_sha":"6ca7d7910c3103d550b9618b8ff0e937a227209b","commit_message":"Name frFont.c glyph and list functions by what they do (rename only)\n\nPure renames with intent comments; no statement or type change. The P3\ndonor leaves these as FUN_ markers, so the names come from the bodies.\n\n- func_00271860 -> frFontLoadTables (first-use table load, then snapshot)\n- func_00271A40 -> frFontReleaseSlots (free each in-use slot's block)\n- func_00271B70 -> frFontListKeepOrRelease\n- func_00271BD0 -> frFontListRelease (drop refcounts, free unused entries)\n- func_00271D10 -> frFontComputeGlyphMetrics\n- func_00271F50 -> frFontAcquireGlyph (cached raster or load and decode)\n- func_00272170 -> frFontCreateGlyphNode\n\nCallers renamed in frFontEx.c, frFontRaster.c, cmmRankUp.c, evtScript.c,\nitfMesManager.c, Main/OpEd/ed_scroll.c, shdWindow.c and the\npromoted buckets code1_0020, code1_0021 and code1_0027.\n\nOwner verify: 536 rows across the 11 touched source files, no status change\nvs baseline. elig_debug on frFont.c: blocking [], compiled True, unowned [].\nLint: no findings.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T07:12:21Z","commit_sha":"96ee865d6e4ba5e7f8e65ac2fb5c8df0ffc1430f","commit_message":"Name animation blend, hierarchy pose and scale hook functions in mdlManager\n\n  func_00471280 -> mdlBlendAnimInterpolators   (blends two interpolators for one frame)\n  func_00471370 -> mdlUpdateHierarchyPose      (slerp and matrix composition over the nodes)\n  func_00472F30 -> mdlHierarchyScaleHook       (per-node hook; scales translation, chains previous hook)\n  func_00473000 -> mdlInstallHierarchyScaleHook (saves the previous hook and installs this one)\n\nCallers: the layer update (blend, install and pose), the owner render\npaths (install at animation flag 0x10, pose at flags 0x81E0), and the\npose setup. The scale hook is installed as a function pointer, so its\nuse in the installer is renamed too. Doc citations of\nmdlUpdateHierarchyPose (matching.md, first_party_matching_handoff.md)\nare updated. The generated headstart snapshots keep their address names.\n\nOwner verify: mdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T07:03:19Z","commit_sha":"dd0609e2c690495e24e380ee4b1c6b541d0eb3b5","commit_message":"Name table-2 predicate handlers by retail row\n\nThe predicate handlers of the condition table D_00609CE0 are named\nbtlCond_<RETAIL> like the table-1 predicates in btlCond.c: HPMIN, LVMIN,\nMPMAX, MYAI, AI_REV, APPOINT, RND (their rows 0x01-0x03, 0x08, 0x11,\n0x12, 0x22). Pure renames in btlAICommand.c; owner verify 263/263.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T07:00:48Z","commit_sha":"1a043dedea9749d598f6332976ffa4648f6a76cf","commit_message":"Name the message stream command handlers in cmmScript (rename only)\n\nfunc_0024A200 -> cmmMsgStreamStart (selects a stream entry from script ids and\ncopies it into the message state), func_0024A2E0 -> cmmMsgStreamUpdate (per-frame\npacket send; finishes when the stream ends), func_0024A450 -> cmmMsgStreamGetResult\n(returns the stored result). Dispatched through the command table, so there are\nno direct callers. Identifiers and intent comments only.\n\nOwner verify: 51 MATCH before and after, zero status changes. Lint 43 before\nand after. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T06:58:55Z","commit_sha":"30cca42fcf3980d229b14c40cf7ddf148059cfc9","commit_message":"Name dispatch table, frame hierarchy and MatFX setup functions in mdlManager\n\n  func_00470E90 -> mdlDispatchAnimTableCreate   (allocates a 16-byte header plus entries)\n  func_00471010 -> mdlDispatchAnimTableRelease  (drops the count at +0xA; frees on last release)\n  func_004711E0 -> mdlFindFrameHierarchy        (HAnim lookup; queues itself as callback on miss)\n  func_00471250 -> mdlSetAtomicHierarchy        (per-atomic callback for RpClumpForAllAtomics)\n  func_00473140 -> mdlSetupMatFXMaterial        (dispatch on RpMatFXMaterialGetEffects)\n\nCallers: create at the two layer-load cases and the lazy path; release in\nthe frame destroy path; MatFX setup in two material loops. The HAnim\ncallback and the atomic callback are passed as function pointers, so\ntheir uses in the hierarchy setup are renamed too. Intent comments state\nwhat each does; the atomic callback has no direct caller because it is\npassed as a function pointer.\n\nOwner verify: mdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T06:54:42Z","commit_sha":"1febfbf4f47dbde661fc7fa1f5e4530384767233","commit_message":"Rename 7 datCalc helpers from their bodies (rename only)\n\nBatch E: datCalcPickWeightedSkill, datCalcInitializeCharacter.\nBatch F: datCalcSkillAppliesToTarget, datCalcSkillAllowedForMode,\ndatCalcRollSupportSkillHit, datCalcRollSkillChance, datCalcAilmentChance\n(the last five [inferred]). Callers updated in the same commit, including\nparse-failed code1_001f.c by text edit; prose references in datCalc.c\nupdated. Signatures unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T06:47:41Z","commit_sha":"92bd314366c8f539968798258ea49fd327219bb9","commit_message":"Name DOWN and SLIP flag setter script commands\n\nfunc_001e5e40 sets or clears DatUnit.flags bit 0x8 and func_001e5ec0\nbit 0x10. Those are the bits btlCond_DOWN and btlCond_SLIP test\n(flags & 0x8 and flags & 0x10), so the setters are\nbtlAICommandScriptSetDownFlag and btlAICommandScriptSetSlipFlag.\nPure renames; owner verify 263/263 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T06:46:19Z","commit_sha":"772d5274cf4aca79a9e43fa025ccdd671ae8e4be","commit_message":"Name frFont.c font-manager, slot and free-list functions (rename only)\n\nPure renames with intent comments; no statement or type change. The P3\ndonor leaves these as FUN_ markers, so the names come from the bodies.\n\n- func_00270FB0 -> frFontInitSlotGrid (columns * rows slot nodes)\n- func_00271310 -> frFontFreeListInsert (insert after the list head)\n- func_00271380 -> frFontSlotLoadData (frFontSlotLoad with no header buffer)\n- func_002713B0 -> frFontInitManager (slot grid, scratch tables, glyph cache)\n- func_002715C0 -> frFontTaskDestroy (task destroy callback)\n- func_002716B0 -> frFontSlotLoad (parse one font into a slot)\n- func_00271820 -> frFontSlotFree\n\nCallers renamed in frFontRaster.c, Main/OpEd/ed_res.c, and the\nfr_font_internal.h prototype. The undeclared-calls comment in frFont.c now\nnames frFontFreeListInsert.\n\nOwner verify: 73 rows across frFont.c, frFontRaster.c and ed_res.c, no\nstatus change vs baseline. elig_debug on frFont.c: blocking [], compiled\nTrue, unowned []. Lint: no findings.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T06:42:07Z","commit_sha":"e8b2f423e1b55c7038e4c8436a62194ad6cf8f6c","commit_message":"Name the +0x140 look state accessors by their callers\n\nRenames the look-state functions that read and write the 16-bit word at\nmodel +0x140 and the sub-object at +0x150:\n\n  func_0047A990 -> mdlSetLookAtRequested   (sets 0x100; mode setters clear it)\n  func_0047A9B0 -> mdlSetLookAtActive      (sets 0x200 during look-at activation)\n  func_0047A9D0 -> mdlHasActiveMode        (tests mode mask 0x81E0; state-machine gate)\n  func_0047A9F0 -> mdlSetLookStateWord     (stores the whole word)\n  func_0047AA00 -> mdlGetLookStateWord     (reads the whole word)\n  func_0047A980 -> mdlGetLookAtSubobject   (returns the +0x150 record)\n\nCallers: statement and expression call sites in btlUnit_functions,\nevtMain, evtModel, code1_0016, code1_0018 and code1_0019. Single-argument\nexpression callers were edited by hand because the codemod does not match\nthem. Extern declarations and the definitions in mdlManager.c (including\nthe draw-path gate at line 4673) are renamed. Intent comments state what\nis known and mark the bit meanings not yet traced.\n\nOwner verify: btlUnit_functions 19, code1_0016 46, code1_0018 61,\ncode1_0019 84, evtMain 48, evtModel 10, mdlManager 135 MATCH; no bad\nrows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T06:37:53Z","commit_sha":"0a1aab36df6e952657a10ed8b02e9718f1bc917c","commit_message":"Rename 6 datCalc buff helpers from their bodies (rename only)\n\ndatCalcHasBuffMask, datCalcGetBuffStatus, datCalcApplyBuffMask,\ndatCalcClearFlaggedBuffs, datCalcAdvanceSecondaryBuffs, datCalcFindStrongBuff.\nCallers updated in the same commit (including parse-failed code1_001f.c by\ntext edit). Buff meanings marked [inferred] where callers do not confirm\nthem. Signatures unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T06:29:17Z","commit_sha":"533e17fae55ba70ded585f5623ecb5da29f5b08c","commit_message":"Name frFontRaster.c glyph-cache functions by what they do (rename only)\n\nPure renames with intent comments; no statement or type change. The P3FES\ndonor leaves these as FUN_ markers, so the names come from the bodies.\n\n- func_00275A60 -> frFontRasterCreateCache (count entries, 0x200-byte rasters)\n- func_00275BD0 -> frFontRasterDestroyCache\n- func_00275C00 -> frFontRasterEvictExpired (age entries; move expired to free list)\n- func_00275D80 -> frFontRasterDrawGlyph (quad for one glyph, palette, colour)\n- func_00276260 -> frFontRasterLookup (donor-backed lookup wrapper)\n- func_00276290 -> frFontRasterFindEntry (find by key and palette, mark used)\n- func_002762F0 -> frFontRasterAllocEntry (take a free entry, store raster)\n- func_00276420 -> frFontRasterUploadGlyph (unpack 4-bit glyph, copy palette)\n\nCallers renamed in frFont.c and promoted/code1_0027.c. The measured note at\nfrFontRaster.c line 99 now names frFontRasterCreateCache.\n\nOwner verify: 126 rows across frFontRaster.c, frFont.c and code1_0027.c,\nno status change vs baseline. elig_debug on frFontRaster.c: blocking [],\ncompiled True, unowned []. Lint: no findings.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T06:25:00Z","commit_sha":"fee7234f33884eeeea277d412863185820c67d10","commit_message":"Name the +0xD8 flag accessors by their callers\n\nfunc_0047A850 and func_0047A870 set and clear the alpha-blend flag\n(0x20) at model +0xD8. Scene and field code calls them for translucent\nmodels (mt_sceneFunc alpha-blend and opaque cases, k_fldAI camera fade,\ncode1_0016 fade start). Renamed to mdlSetAlphaBlend and\nmdlClearAlphaBlend.\n\nfunc_0047A830 clears bit 0 of +0xD8 in the battle look-at reset path\n(code1_0019 case 1). Renamed to mdlClearBattleStateFlag; the intent\ncomment says the consumer of bit 0 is not yet traced.\n\nCallers: 17 call sites across btlPanelAnalyze, effModel, k_fldAI,\nmt_sceneFunc, code1_0016, code1_0018, code1_0019 and k_fldUnit (ast\nrewritten where it parsed, by hand in code1_0016), the extern and\nprototype declarations, and the definitions in mdlManager.c.\n\nOwner verify: btlPanelAnalyze 8, effModel 19, k_fldAI 11, mt_sceneFunc\n50, code1_0016 46, code1_0018 61, code1_0019 84, k_fldUnit 42,\nmdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T06:20:45Z","commit_sha":"13d99dce767a55aa30da34613d554447da7b4b44","commit_message":"Rename datCalc modifier helpers to buff-level names (rename only)\n\ndatCalcGetBuffLevel, datCalcSetBuffLevel, datCalcAddBuffLevel,\ndatCalcSetSecondaryBuffLevel, datCalcClearBuffLevel, datCalcClearAllBuffs.\nIndex 0..4 follow DatPersonaStat (St/Ma/En/Ag/Lu) and are read as buff or\ndebuff by func_002340c0; the buff meaning stays [inferred] until the\nskill-effect writer is traced. datCalcGetSkillMask unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T06:19:38Z","commit_sha":"88d6b3df34a94af11a16be5da95dfa39291fdeb7","commit_message":"Name table-2 condition query handlers from retail row strings\n\nbtlAICommand's second dispatch table D_00609CE0 (stride 8: handler, name\nstring; index cmd*2) has retail names for rows 0x00-0x27. The 22 query\nbodies using tags 0x04-0x24 are named btlAICommandCondQuery<Name> after\ntheir row (BAD, ID, HANSYA, HANSYA_ST, NOTWEAK_ST, HOJO, NOTHOJO ...).\nPure renames in btlAICommand.c; owner verify 263/263 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T06:16:22Z","commit_sha":"214fb10f37d7bc0e04e27774d98b472509b410a0","commit_message":"Name frFontEx.c text helpers by what they do (rename only)\n\nPure renames with intent comments; no statement or type change. The\nheader comment in frFontEx.c already described these roles, so the names\nfollow it. Callers are renamed across the tree, including the promoted\nbuckets and the shd/Camp/Battle/Event/Fcl units.\n\n- func_00274A20 -> frFontExSetScale\n- func_00274A90 -> frFontExLayoutText (position, glyph scale, colour; returns width)\n- func_00274CD0 -> frFontExCreateText\n- func_00274ED0 -> frFontExDrawText\n- func_00275020 -> frFontExDrawTextWithCharWidth\n- func_002751A0 -> frFontExDrawTextOutA (writes D_007645A0 while drawing)\n- func_00275330 -> frFontExDrawTextOutB (writes D_007645A8 while drawing)\n- func_002754C0 -> frFontExFreeText (cleanup callback)\n- func_00275520 -> frFontExDrawTextDeferred\n- func_00275680 -> frFontExDrawTextDeferredWithCharWidth\n- func_00275820 -> frFontExDrawTextDeferredOutB\n- func_00275980 -> frFontExCopyString\n- func_00275A40 -> frFontExGlyphHeight (retail frFontGetHeight; vertical offset)\n\nLeft unchanged: func_002BB1C0 (table lookup, meaning not established) and\nthe int-typed extern func_00275a40_typed, which config/symbols_recovered.txt\nresolves to the same address for the linker; renaming the extern would\nneed a config change.\n\nThe measured-history comments in y_fclCombine.c and the historical notes\nin docs/matching.md and docs/first_party_matching_handoff.md still quote the\nold names; they record measurements, so they stay as written.\n\nOwner verify: 1480 rows across the 32 touched source files, no status\nchange vs baseline. elig_debug on frFontEx.c: blocking [], compiled True,\nunowned []. Lint: no findings.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T06:13:24Z","commit_sha":"a5c895065f3104537e4df81fa36c6333dc6388b6","commit_message":"Move 8 inferred run TUs out of code1_0019 into btlUnit *_inferred.c files\n\nRun-level inferred units (no __FILE__ evidence) from Battle btlUnit runs 0019b530 through\n0019d3c0. Owner verify 84/84 MATCH. Runs btlUnit 0019b710 and 0019c0d0 stay in code1_0019\n(a moved function they reference or a gap declaration they need is not yet declared).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2825488,"complete_code_percent":90.01626,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":300}},{"timestamp":"2026-10-15T06:12:14Z","commit_sha":"9a15fd496e829208ee6aaa7c8a295fd395b81cf9","commit_message":"Name func_0047A8A0 mdlLookAtSetupSetRange by its battle use\n\nfunc_0047A8A0 stores a high/low pair at model +0x148/+0x14C. Battle\nlook-at setup passes the unit's look-at range (btlUnit firstHigh and\nfirstLow, and the 70/60 and 70/80 pairs and call angles in btlUnit_functions\nand code1_0019) next to the blend weight. No reader of +0x148/+0x14C was\nfound in the event, battle, or mdlManager files, so the name records\nthe use and the intent comment says the consumer is not yet traced.\n\nCallers: nine call sites in btlUnit.c, btlUnit_functions.c and\ncode1_0019.c (ast-rewritten), the extern declarations, a prose\nreference in code1_0019.c, and the definition in mdlManager.c.\n\nOwner verify: btlUnit 47, btlUnit_functions 19, code1_0019 84,\nmdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2823568,"complete_code_percent":89.95509,"complete_data":0,"complete_data_percent":100,"total_units":321,"complete_units":292}},{"timestamp":"2026-10-15T06:07:44Z","commit_sha":"ae534c92bae600cd29b66c8e64198c793dc21e1f","commit_message":"Rename 7 datCalc modifier and skill-mask helpers from their bodies (rename only)\n\ndatCalcGetSkillMask, datCalcGetModifier, datCalcSetModifier,\ndatCalcSetSecondaryModifier, datCalcAddModifier, datCalcClearModifier,\ndatCalcClearAllModifiers. Meanings marked [inferred]; no callers confirm\nthe modifier semantics yet. Callers updated in the same commit; signatures\nunchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2823568,"complete_code_percent":89.95509,"complete_data":0,"complete_data_percent":100,"total_units":321,"complete_units":292}},{"timestamp":"2026-10-15T06:03:32Z","commit_sha":"abc88965104b922e888f914f6f02e894e7b8a739","commit_message":"Name func_0047A890 mdlSetBlendWeight from its consumer\n\nfunc_0047A890 stores a float at model +0x144. Its consumer is the event\nstate code in evtModel.c, which sets the 0..1 weight from its timer and\nreads it back (2.0f * value). mdlManager.c has no reader of +0x144.\nRenamed to mdlSetBlendWeight, with an intent comment above the address\nmarker.\n\nCallers: 27 expression call sites (evtModel 16, evtMain 2, btlUnit 3,\nbtlUnit_functions 3, code1_0019 3; ast-rewritten), the extern\ndeclarations in those files, and the definition in mdlManager.c.\n\nOwner verify: btlUnit 47, btlUnit_functions 19, code1_0019 84, evtMain\n48, evtModel 10, mdlManager 135 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2823568,"complete_code_percent":89.95509,"complete_data":0,"complete_data_percent":100,"total_units":321,"complete_units":292}},{"timestamp":"2026-10-15T06:00:43Z","commit_sha":"c4d246d9c5f9a2e9ada88268306b4ab63908a364","commit_message":"Name h_snd slot functions and gameSequence task functions (rename only)\n\nPure renames with intent comments; no type or statement change beyond the\nextern in promoted/code1_0012.c, which now matches the definition.\n\nh_snd.c:\n- func_00459790 -> hsndSlotUpdate (slot state machine: start playback,\n  then wait for completion)\n- func_004599A0 -> hsndQueueSound (queues a sound id; returns 1)\n- func_0045A890 -> hsndSlotIsStarting (state == HSND_CHANNEL_STARTING)\n\ngameSequence.c:\n- func_00124240 -> gameSequenceStart (creates the \"gameSequence\" task)\n- func_001242C0 -> gameSequenceIsRunning\n- func_001242F0 -> gameSequenceStop\n\nCallers renamed in sdkSnd.c, cmmRankUp.c, Event/evtMain.c, nEntry.c,\nBattle/btlSound.c, Graphics/Model/mdlSE.c, Main/init.c, and the promoted\nbuckets code1_0012.c and code1_0047.c. The architecture doc's START GAME row\nand the matching note reference are updated in the same commit.\n\nOwner verify: 256/256 MATCH across the 11 touched source files, no status\nchange vs baseline. elig_debug on h_snd.c: blocking [], compiled True,\nunowned []. Lint: no findings on the renamed names.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2823568,"complete_code_percent":89.95509,"complete_data":0,"complete_data_percent":100,"total_units":321,"complete_units":292}},{"timestamp":"2026-10-15T05:58:39Z","commit_sha":"08674044b9d6d75d35e89112175a3f1f70d7d5c1","commit_message":"Rename 6 datCalc helpers from their bodies (rename only)\n\ndatCalcCountIdSlotsWithValue, datCalcCountSlotsWithValue,\ndatCalcIsSkillAvailable, datCalcIsFlaggedPersonaSkill,\ndatCalcGetUnitStat, datCalcGetBattleStat. Callers and the\nbtl_equipment_count_internal.h prototype updated in the same commit; prose\ncomments in datCalc.c that named the old functions updated. Signatures\nunchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2823568,"complete_code_percent":89.95509,"complete_data":0,"complete_data_percent":100,"total_units":321,"complete_units":292}},{"timestamp":"2026-10-15T05:53:46Z","commit_sha":"03ac45ab48bbcefef85cefb2d102d7ceed4ce28c","commit_message":"Name func_0047A950 mdlSetTrackScaleRange from its consumer\n\nfunc_0047A950 stores two floats at model +0x188 and +0x18C and sets\nflag 0x8000 (clearing 0x100). The consumer is func_00477810, which\ndivides by +0x188 and copies +0x18C into the per-track records, so the\npair is a range/scale pair for the tracks. Renamed to\nmdlSetTrackScaleRange, with an intent comment above the address marker.\n\nCallers: the eight calls in src/Event/evtModel.c (ast-rewritten), the\nextern declaration there, and the definition in mdlManager.c. Config\nsymbol tables keep address names (reconcile-generated).\n\nOwner verify: evtModel.c 10 MATCH, mdlManager.c 135 MATCH, no bad rows.\nElig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2823568,"complete_code_percent":89.95509,"complete_data":0,"complete_data_percent":100,"total_units":321,"complete_units":292}},{"timestamp":"2026-10-15T05:47:13Z","commit_sha":"29baa9ba94336c01137ba0c001459db1061fe73f","commit_message":"Rename 10 datCalc helpers from their bodies (rename only)\n\ndatCalcRandomBelow, datCalcInitUnit, datCalcGetLevel, datCalcSetLevel,\ndatCalcMaxHp, datCalcMaxSp, datCalcAddHp, datCalcAddSp, datCalcHasSkill,\ndatCalcIsStandardUnit. Callers updated in the same commit (including\nparse-failed code1_001f.c by text edit). Signatures unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2823568,"complete_code_percent":89.95509,"complete_data":0,"complete_data_percent":100,"total_units":321,"complete_units":292}},{"timestamp":"2026-10-15T05:40:39Z","commit_sha":"8e4af6289d5b6c8754158f65a9214165a40839d3","commit_message":"Update architecture doc citations to evtStart and evtSetId\n\nThe events section cited the pre-rename names func_002862a0 and func_002863e0\nfor the event player constructor and id setter. Updated to the names the\ncode now uses (commit 0c7415c1). Doc-only.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2823568,"complete_code_percent":89.95509,"complete_data":0,"complete_data_percent":100,"total_units":321,"complete_units":292}},{"timestamp":"2026-10-15T05:33:54Z","commit_sha":"d93302eba1ed601960640ebada5f9c2a21659a33","commit_message":"Add DAT_UNIT_FLAG_DOWN; name GROUP/HREC/MORE script queries\n\nbtlCond_DOWN tests DatUnit.flags bit 0x8, so the bit is named\nDAT_UNIT_FLAG_DOWN in datUnit_internal.h and used there. Also names\nfunc_001e0cc0/0d10/0d60/0f10/0f60 as btlAICommandScriptQueryMyGroup/\nFrGroup/EnGroup/MyHrec/More (fixed slots D_00609A30/3C/48/6C/78 hold the\nsame handlers as the GROUP, MYHREC and MORE rows). Owner verify 364/364.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2823568,"complete_code_percent":89.95509,"complete_data":0,"complete_data_percent":100,"total_units":321,"complete_units":292}},{"timestamp":"2026-10-15T05:27:03Z","commit_sha":"3eae58451a50355d6992e4cc77eddd39b2e9493b","commit_message":"Move 9 inferred run TUs out of code1_0019 into btlUnit/battle *_inferred.c files\n\nRun-level inferred units (no __FILE__ evidence) from Battle btlUnit runs 00198dd0 through\n0019aae0 and 001990d0/001991c0. Owner verify 116/116 MATCH. Bucket keeps a declaration\nfor each moved function it still calls. Run btlUnit 00198920 stays in code1_0019: it needs\nthe MotionTableEntry typedef from a bucket gap.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2823568,"complete_code_percent":89.95509,"complete_data":0,"complete_data_percent":100,"total_units":321,"complete_units":292}},{"timestamp":"2026-10-15T05:20:03Z","commit_sha":"29bfe426a4a44b7be1f1587aeb6ec2b300828a49","commit_message":"Reapply \"Name k_encount encounter-table helpers by what they return (pure renames)\"\n\nThis reverts commit 2855bc23cc9e5706708b479861a4291e5f2e784f.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2817408,"complete_code_percent":89.75884,"complete_data":0,"complete_data_percent":100,"total_units":312,"complete_units":283}},{"timestamp":"2026-10-15T05:13:24Z","commit_sha":"034de4286284451c5c3858162da7f3a4df91b1a8","commit_message":"Name the mainDraw.c clear-OT and frame tasks from their bodies\n\nPure rename family (identifiers, intent comments and the architecture\ndoc citations; no type or statement change). Each name follows the task\nrole that docs/architecture.md section 6 traces.\n\n- func_00102490 -> mainDrawStartClearOt (creates the \"clear ot\" task at\n  priority 0x0A)\n- func_00101BB0 -> mainDrawClearOtUpdate (flushes debug print, clears the\n  camera, resets the ordering table, installs the fixed callbacks)\n- func_00102550 -> mainDrawFrameUpdate (walks the 0xD8 ordering-table\n  buckets between the camera's begin and end updates)\n- func_001025E0 -> mainDrawFrameDestroy\n- func_00102610 -> mainDrawStartFrame (creates the \"mainDraw(drawOt)\" task\n  at priority 0xC8)\n- func_001014B0 -> mainDrawClearCameraAndSky (clear-OT callback)\n\nThe five fixed render-state presets func_001015C0, func_001016F0,\nfunc_00101820, func_00101950 and func_00101A80 are not renamed in this\ncommit: their bodies differ only in the sky-state words, and the meaning\nof those words is not yet established.\n\nCallers renamed in kwln_inferred_00100e30.c and promoted/code1_0010.c.\n\nOwner verify: 37/37 MATCH across the three source files, no change vs\nbaseline. elig_debug on mainDraw.c: blocking [], compiled True, unowned [].\nLint: no findings on the renamed names.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2817408,"complete_code_percent":89.75884,"complete_data":0,"complete_data_percent":100,"total_units":312,"complete_units":283}},{"timestamp":"2026-10-15T05:06:37Z","commit_sha":"d64297f984e7454d51efdd0d1cd16a2ef39cad13","commit_message":"Reword FUN_ marker text in Graphics comments as addresses\n\nComments that quoted a FUN_ symbol in prose now give the address\n(0x00xxxxxx) instead, so the marker text appears only as a line-start\nmarker above a definition. Comment-only: no code, tokens, or\ndeclarations changed (the mdlMatAnim comments sit inside casts and\nkeep their code).\n\nOwner verify: effPolygonFlash 49, effPolygonRing 16, effPolygonThunder\n16, effPolygonTrack 19, eff_after 14, mdlEffect 53, mdlManager 135,\nmdlMatAnim 15, primitive 12 MATCH; no bad rows. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2817408,"complete_code_percent":89.75884,"complete_data":0,"complete_data_percent":100,"total_units":312,"complete_units":283}},{"timestamp":"2026-10-15T04:59:18Z","commit_sha":"4a10cc658e53cc74727f28f05e9af6241216542c","commit_message":"Rename 5 datPersona helpers from their bodies (rename only)\n\ndatPersonaLoadRecord, datPersonaLearnFixedSkills, datPersonaInitRecord,\ndatPersonaReplaceSkill, datPersonaCollectLearnableSkills. Updates the\narchitecture.md citations to renamed datPersona helpers (including the\nstale 327aa306 citations).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2817408,"complete_code_percent":89.75884,"complete_data":0,"complete_data_percent":100,"total_units":312,"complete_units":283}},{"timestamp":"2026-10-15T04:52:20Z","commit_sha":"0c7415c1f7947dea836c9c28cbffc0a8dc8b8593","commit_message":"Name event task start, destroy, lookup, id and condition helpers (rename only)\n\nfunc_002862A0 -> evtStart (creates the event task for an owner, returns its id),\nfunc_00286240 -> evtTaskDestroy (task destroy callback), func_00286350 ->\nevtFindTask (event task lookup; 23 call sites), func_002863E0 -> evtSetId\n(three id words at +0x78C..+0x794), func_00286430 -> evtCheckCondition (block\nkinds 0 and 1, result-slot compare). Identifiers, declarations and intent\ncomments only; evtEvent.c, evtMain.c, evtScript.c and the shared header are\nrenamed in the same commit.\n\nOwner verify: 93 MATCH before and after (4 owners), zero status changes.\nLint 49 before, 49 after. Elig clean for all four owners.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2817408,"complete_code_percent":89.75884,"complete_data":0,"complete_data_percent":100,"total_units":312,"complete_units":283}},{"timestamp":"2026-10-15T04:45:29Z","commit_sha":"0eddc0932aa842c82a81693eb80a283524040e68","commit_message":"Correct btlAICommand selector wrapper names to predicate polarity\n\nThe fifth argument of func_001dbba0 is the expected predicate value\n(selects units where cond != arg4), not an all/random switch; the\nrandom pick is controlled by arg3 bit 0x4. Renames the eleven wrappers\nto btlAICommandPickMy<Cond> (arg4 0) and btlAICommandPickNotMy<Cond>\n(arg4 1). Pure renames; owner verify 263/263 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2817408,"complete_code_percent":89.75884,"complete_data":0,"complete_data_percent":100,"total_units":312,"complete_units":283}},{"timestamp":"2026-10-15T04:37:48Z","commit_sha":"9cd3247ff0dfa4f9a26cdc06f39026471a1f9a2e","commit_message":"Move 5 inferred run TUs out of code1_0019 into *_inferred.c files\n\nRun-level inferred units (no __FILE__ evidence): Battle battle_inferred_001927c0 and\n_00193630, btlUnit_inferred_00194ff0, _00197a80, _00198810. Owner verify 144/144 MATCH.\nRuns btlUnit 00193840, 00195710, 00195610, 00196b70 and 00198380 stay in code1_0019:\nthey need gap declarations or an extern for a moved function the bucket still calls.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2817408,"complete_code_percent":89.75884,"complete_data":0,"complete_data_percent":100,"total_units":312,"complete_units":283}},{"timestamp":"2026-10-15T04:12:54Z","commit_sha":"901ca8d6a64d198f26e3e4f45d0b70c3c06d3a6b","commit_message":"Name event result-slot accessors evtResultSet/evtResultGet (rename only)\n\nfunc_0028D020 -> evtResultSet and func_0028D060 -> evtResultGet. The 10-entry\ntable D_008825F0 holds call results: evtMessage stores a result by index\n(evtMessage.c), and the condition check in code1_0028 compares a stored value\nwith an expected one. Callers in code1_0028.c, evtMessage.c and code1_0029.c\n(including its extern) renamed in the same commit.\n\nOwner verify: 102 MATCH before and after (3 owners), zero status changes.\nLint 48 before, 48 after. Elig clean for all three owners.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810544,"complete_code_percent":89.54016,"complete_data":0,"complete_data_percent":100,"total_units":307,"complete_units":278}},{"timestamp":"2026-10-15T04:05:50Z","commit_sha":"9eb3d8667822a7095bbda41ef62515722fecf9fc","commit_message":"Name btlMain curve samplers and color/fade updaters by behaviour\n\nfunc_001bb790 -> btlMainEvalBezierPosition (cubic Bernstein position),\nfunc_001bb8c0 -> btlMainEvalLinearPosition, func_001bb9b0 ->\nbtlMainEvalSlerpRotation, func_001b7e70 -> btlMainUpdateColorWork,\nfunc_001b87e0 -> btlMainUpdateFade. Pure renames; btlEPL.c provenance\ncomment updated. Owner verify btlMain/btlEPL 54/54 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810544,"complete_code_percent":89.54016,"complete_data":0,"complete_data_percent":100,"total_units":307,"complete_units":278}},{"timestamp":"2026-10-15T03:58:13Z","commit_sha":"1e7f77c8bbb9bcf71d179d27ddf6112dfb709197","commit_message":"Move 5 inferred run TUs out of code1_0016/0017/0019 into *_inferred.c files\n\nRun-level inferred units (no __FILE__ evidence): Battle battle, Kosaka/Field k_fldFrame,\nKosaka k_command. Owner verify 272/272 MATCH. Runs that need gap-level declarations\n(k_fldFrame 0016b8a0, k_fldrc, k_command 00175f70, k_spipe 00178a00 and 00179fc0) fail\nto compile when moved and stay in their buckets.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810544,"complete_code_percent":89.54016,"complete_data":0,"complete_data_percent":100,"total_units":307,"complete_units":278}},{"timestamp":"2026-10-15T03:55:28Z","commit_sha":"b18faeb4b54ebeb3ce43056f37850f2207f179f4","commit_message":"Restore K_Fldrc_DestroyArchives retail marker to its own line\n\nThe intent comment added in 5c1c452f put the FUN_00102E70 marker at the end of\na comment line. verify.py and build.py match markers only at line start, so the\nfunction lost its marker, its translation unit became ineligible, and the\nfrom-source link fell from 8100 to 8063 functions. The marker is back on its\nown line directly above the function. Local build: 8100 linked, exit 0.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T03:36:30Z","commit_sha":"327aa30652a701ce3cb4f198242ab5d1eaabfcb4","commit_message":"Rename 27 datPersona helpers from their bodies (rename only)\n\nTable row, arcana, skill slot, battle-stat (buffed, total, bonus, equipment, add),\nroster member and mode helpers, level-up preview and apply, exp curve and add, and\nthe 8-slot skill list helpers. Renames and intent comments only; no signature changes.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T03:28:27Z","commit_sha":"a1e1f9126d048f3a92830a4c0ddf3dffc7a8748c","commit_message":"Name event handle-table clear and resource release helpers (rename only)\n\nfunc_0028B6B0 -> evtClearHandles: frees each handle in the table at +0x7A4,\naccounts the bytes, clears the count. func_0028D0A0 -> evtReleaseRes: releases\neach resource id stored in the node's list. Behaviour-derived; no P3 twin.\n\nIdentifiers, declarations and intent comments only; callers in evtMain.c and\nthe shared scene_event_internal.h prototype are renamed in the same commit.\n\nOwner verify: 75 MATCH before and after (2 owners), zero status changes.\nLint 36 before, 36 after. Elig clean for both owners.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T02:59:10Z","commit_sha":"704b549f9d7c863dd4440a1bf27b4c79c8d97afe","commit_message":"Name the kwlnTask.c camera helpers from their bodies\n\nPure rename family (identifiers, one extern and intent comments; no type\nor statement change). kwlnTask.c holds camera helpers rather than the\ntask kernel, but there is no evidence yet for a move, so the file keeps\nits name.\n\n- func_004571D0 -> kwlnCameraResizeView: recreates the camera's frame and\n  Z buffers at the requested view (or the display size) and sets its\n  view window.\n- func_004574D0 -> kwlnCameraCreate: creates a camera with a frame buffer\n  and an optional Z buffer; on failure it frees everything and returns\n  NULL.\n\nThe caller in promoted/code1_0045.c is renamed by hand (ast_edit cannot\nparse that file). Its kwlnCameraCreate extern now uses u32 parameters to\nmatch the definition, which removes an H011 finding.\n\nOwner verify: 55/55 MATCH across the two files, no change vs baseline.\nelig_debug on kwlnTask.c: blocking [], compiled True, unowned []. Lint:\nno findings on the renamed names.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T02:45:17Z","commit_sha":"1a388f380e134439ac1a4e7749b6586d24b85b59","commit_message":"Rename datPersona social-stat getters to battle-stat getters\n\ndatPersonaGetSocialStat(ById) -> datPersonaGetStat(ById). Callers show battle stats:\ndatCalc's stat reader uses the same 0..4 index on enemy records and clamps to 1..99,\nbtlOrder ranks turn order with index 3 (AGI), btlShuffle raises and lowers the byte.\nAdds enum DatPersonaStat (St/Ma/En/Ag/Lu order; only AGI=3 is confirmed by callers,\nothers are inferred and marked as such). shdPersona keeps literal indices (no header include).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T02:38:26Z","commit_sha":"9194d8510976d69bdcc0d2d3403effaacbcc6fad","commit_message":"Name event memory accounting and key-index helpers (rename only)\n\nfunc_002852A0 -> evtMemAccount: adds a byte delta to the 13-slot event memory\ncounter table (D_00882170). Positive on allocation, negative on release; 50\ncall sites across the event TUs and evtMisc.c.\nfunc_002853F0 -> evtKeyIndex: index of a key in the 58-entry key table\n(D_0063C1D0), 0 when absent; used by the sorted event list insert.\n\nIdentifiers, declarations and intent comments only. evtMisc.c (unowned) gets\ntwo call-site renames; the shared scene_event_internal.h prototypes move too.\n\nOwner verify: 118 MATCH before and after (7 owners), zero status changes.\nLint 59 before, 59 after. Elig clean for all seven owners.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T02:23:39Z","commit_sha":"25cf4cfeb6533430bf27c0fa7e116eed56b18133","commit_message":"Rename scene-draw accessors from what callers store in them (pure renames)\n\nThe offset-based names (SceneDraw_GetList4Vec0..2, SceneDraw_GetList5Vec0..2,\nSceneDraw_GetScaleA/B, SceneDraw_GetMatrixA/B, SceneDraw_GetOffsetVec) only\nrestated a struct offset. Callers say what each block holds:\n\n- SceneDraw_GetList4FirstColor / SceneDraw_GetList5FirstColor and\n  SceneDraw_GetList4SecondColor / SceneDraw_GetList5SecondColor return the\n  two RGBA colour vectors that the list 4 and list 5 blocks carry.\n- SceneDraw_GetList4Matrix / SceneDraw_GetList5Matrix return the matrix block\n  (the callers copy it as a matrix or hand it to RtQuatConvertFromMatrix).\n- SceneDraw_GetLightColorA / SceneDraw_GetLightColorB return the per-type light\n  colour blocks written by the light setup.\n- SceneDraw_GetLightMatrixA / SceneDraw_GetLightMatrixB return the per-type\n  light rotation matrices.\n- SceneDraw_GetLightTint returns the per-type RGBA tint that the light setup\n  writes.\n\nIdentifiers only. Owner verify: 243/243 MATCH across the five touched files.\nNo architecture-doc citation to update.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T01:55:21Z","commit_sha":"43b6b195c8f3e99d566a5ded473c868e135af090","commit_message":"Rename datPersona offset-named accessors by meaning\n\nPure renames (identifiers and intent comments only):\ndatPersonaRosterSlotByte4 -> datPersonaRosterSlotRank (ranking key, cmmMisc picks the largest),\ndatPersonaLeadHasFlag4 -> datPersonaLeadBoosted (lead flag bit 4 scales damage or level),\ndatPersonaRecordStatByte -> datPersonaGetSocialStat and datPersonaRecordStatByteById ->\ndatPersonaGetSocialStatById (five index 0..4 bytes at +0x1C; INFERENCE from layout and callers),\ndatPersonaLeadSlotWord -> datPersonaLeadPersonaId (lead persona id, stored as equippedId).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T01:48:20Z","commit_sha":"c98d45ca17dd1b0400fdf533f9c937a92f14bf88","commit_message":"Name evt env-slot, camera-position and teardown helpers (rename only)\n\nfunc_0028B2A0 -> evtEnvSlot, func_0028B320 -> evtEnvSlotSave,\nfunc_0028B440 -> evtEnvSlotRestore, func_0028B550 -> evtCamPosSave,\nfunc_0028B5D0 -> evtCamPosRestore, func_0028B160 -> evtDestroy.\nBodies: 20-byte light/camera state slots under the event node, camera x/y\nstored at node+0x98, and the event teardown (restore, release task, free).\nBehaviour-derived; no P3 twin.\n\nIdentifiers, declarations and intent comments only. Callers in\npromoted/code1_0028.c and the shared scene_event_internal.h prototypes are\nrenamed in the same commit.\n\nOwner verify: 75 MATCH before and after (2 owners), zero status changes.\nLint 36 before, 36 after. Elig clean for both owners.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T01:40:51Z","commit_sha":"6657e4a7ff04b6b0f9ba8ad722f7a8f7c50f5231","commit_message":"Name k_misc delayed-model, script-shutdown and RMD-fade tasks from their strings (pure renames)\n\nThe three task triples take their names from the retail task strings\nthey register: \"delay model(RMD) destroy\" (KMisc_CreateDelayMdlFree,\nKMisc_DelayMdlFreeUpdate, KMisc_DelayMdlFreeDestroy), \"script shutdown(kosaka)\"\n(KMisc_CreateScrShutdown, KMisc_ScrShutdownUpdate, KMisc_ScrShutdownDestroy)\nand \"rmd fade(kosaka)\" (KMisc_CreateRmdFade, KMisc_RmdFadeUpdate,\nKMisc_RmdFadeDestroy).\n\nIdentifiers only. Callers in k_fldAI, k_fldUnit, code1_0014, code1_0016,\ncode1_0018 and code1_0019 are renamed in the same change (code1_0016 by hand;\nast-grep does not parse it). Owner verify: 423/423 MATCH across the seven\ntouched files. No architecture-doc citation to update.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T01:33:39Z","commit_sha":"e725269214080eca704ed5076cb797e20fbbdbe8","commit_message":"Rename battle_draw_2d update callback to btlUpdateDraw2DTask; curated evidence outranks p3\n\nThe retail task name \"battle_draw_2d\" is string evidence for the update\ncallback at 0x00192790, which the P3 name btlUpdateDraw3DFrontTask\ncontradicts (P3 names come from upstream contributors, not Atlus).\n\n- config/symbol_names.txt: curated override btlUpdateDraw2DTask with\n  evidence string:\"battle_draw_2d\" (the curated overlay survives\n  regeneration; strings.txt is regenerated by mine_name_strings.py and only\n  holds role-label and error-macro classes).\n- tools/port_p3_names.py: skip any address already named by a curated\n  overlay (config/symbol_names.txt or config/symbol_names.strings.txt).\n  New helpers overlay_addresses and drop_string_evidence. Unit cases in\n  tests/test_port_p3_names.py.\n- config/symbol_names.p3.txt: drop the overlapping row (the only committed\n  p3 row whose address is in an overlay) and update the count 196->195.\n  The generator cannot be re-run exactly here: its committed mapping input\n  (C:/tmp/shared.json) is absent, and build/shared_p3.json yields a\n  different set. Dropping the overlap equals the skip on that input.\n- src/Battle/battle.c, src/promoted/code1_0019.c: rename, intent comment.\n- docs/architecture.md: citation updated.\n\nOwner verify battle.c + code1_0019.c: 155/155 MATCH. elig clean.\nUnit: test_port_p3_names, test_symbol_names, test_mine_name_strings: 51 OK.\nmake names-check: duplicate-address error gone; the remaining failure is 62\npending occurrences of func_00232710 in code1_001f.c (another lane's rename).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T01:26:52Z","commit_sha":"fcd8fcc8cfd5d8111ccee44bd96ead68bf8930ac","commit_message":"Name the ten cldDayChange.c functions from their bodies\n\nPure rename family (identifiers, forward declarations and intent\ncomments; no type or statement change).\n\n- func_00264D90 -> cldDayChangeStartTask (creates the display task)\n- func_00264E70 -> cldDayChangePreloadData (synchronous data-file read)\n- func_00264EC0 -> cldDayChangeUpdateState (state machine, states 0-10)\n- func_00265110 -> cldDayChangeDrawMarker (dial-case marker draw)\n- func_00265F40 -> cldDayChangeDrawPolygon (point array to polygon)\n- func_00266050 -> cldDayChangeDrawMonthOutline (month outline draw)\n- func_00266690 -> cldDayChangeDrawFrame (per-frame render callback)\n- func_00266890 -> cldDayChangeAddRenderTask (render node creation)\n- func_002668F0 -> cldDayChangeTaskDestroy (task destroy callback)\n- func_00266950 -> cldDayChangeStartStateTask (state-machine task)\n\nCallers renamed in kwln_inferred_00100e30.c, and in the promoted buckets\ncode1_0010, code1_0012 and code1_0026. ast_edit cannot parse the last\ntwo, so their references were renamed by hand.\n\nOwner verify: 183/183 MATCH across the five touched files, no change vs\nbaseline. elig_debug: blocking [], compiled True, unowned []. Lint: no\nnew findings; the four H011 hits on these files are pre-existing and\nconcern functions this commit does not rename.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T01:05:51Z","commit_sha":"105638bbe4c5acba5642e68f15e16c506ad4238a","commit_message":"Rename datPersona roster slot field readers\n\nPure renames (identifiers and intent comments only):\nfunc_001092f0 -> datPersonaRecordId, func_00109300 -> datPersonaRosterSlotId,\nfunc_00109360 -> datPersonaGetRecordId, func_001093a0 -> datPersonaRosterSlotByte4,\nfunc_00109470 -> datPersonaRosterSlotFlags, func_00109920 -> datPersonaRecordStatByte,\nfunc_00109980 -> datPersonaRecordStatByteById.\nCallers migrated in cmmMisc, btlShuffle, y_fclCombine, datCalc, shdPersona (text edit,\nparse-failed by ast_edit) and code1_001f; datCalc comments updated to the new name.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T00:58:44Z","commit_sha":"9fd3937a0569ae0663356f5c3c2c1c73f6e35ca3","commit_message":"Name evt node/list helpers from their bodies (rename only)\n\nfunc_00286F00 -> evtNodeAlloc, func_00287060 -> evtNodeAllocWithRes,\nfunc_00286FF0 -> evtNodeSetRes, func_00286D80 -> evtListInsertSorted,\nfunc_00286E90 -> evtNodeUnlink (static), func_00286C60 -> evtNodeRemoveFree.\nNames follow the bodies: 0x98-byte node allocation under a parent, scene\nresource attach, sorted insert into the owner list, sibling unlink, and\nunlink-plus-free. No P3 twin; behaviour-derived.\n\nIdentifiers, declarations and intent comments only. Callers in\nevtLoadSave.c, evtScript.c, promoted/code1_0029.c and the shared\nscene_event_internal.h prototype are renamed in the same commit.\n\nOwner verify: 131 MATCH before and after (4 owners), zero status changes.\nLint 58 before, 58 after. Elig clean for all four owners.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T00:51:56Z","commit_sha":"ac559850b747db57485b9a547adb6a93b6bda691","commit_message":"Name k_sceneDraw resource accessors and setters from their bodies (pure renames)\n\nSceneDraw_SetResVisible sets or clears the visible flag on a resource.\nSceneDraw_SetCustomLight and SceneDraw_SetResPersona set the custom-light and\npersona flags for the resource's type. SceneDraw_SetResVisibleChecked does\nthe same after a resource-manager NULL check.\nSceneDraw_GetScaleA, SceneDraw_GetScaleB, SceneDraw_GetMatrixA,\nSceneDraw_GetMatrixB and SceneDraw_GetOffsetVec return the per-type\nsub-block that holds the scale, matrix and offset values for a model\nresource. SceneDraw_ResetResource resets those blocks to identity and\nunit scale. SceneDraw_GetList4Vec0/1/2 and SceneDraw_GetList5Vec0/1/2 return\nthe three fixed vectors of scene resource list 4 and list 5.\n\nIdentifiers and comments only. Callers in k_field, k_fldFBN, k_fldEvent,\nk_fldUnit, k_command, k_shadow and the promoted bucket TUs are renamed in the\nsame change. Two functions (func_0014a460 used by btlUnit.c, func_0014ad90\nused by a Kernel file) stay unnamed here because their callers are outside\nthis lane. Owner verify: 558/558 MATCH across the 13 touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T00:30:47Z","commit_sha":"47cc52e3f24ca792962b5e7f8c70c256c691c7fa","commit_message":"Prune replayed pragmas and use owner headers in inferred batch 1\n\nEach replayed optimisation pragma is removed unless the owner verify shows a\nfunction in the file breaks without it; kept pragmas carry a measured comment\nnaming those functions. Called prototypes move to the owner include/ header\nwhere that header compiles and matches; otherwise the local prototype stays.\nOwner verify: 49/49 MATCH on the batch-1 inferred files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T00:09:03Z","commit_sha":"e54fd2a10c7db1526bcd6960c9cfde0e55e3654d","commit_message":"Name script integer typed-view aliases scrGetParamIntS32/S64\n\nfunc_0029cc00_s32 and func_0029cc00_s64 are typed views of scrGetParamInt\n(same address 0x29cc00, used where the 32-bit or 64-bit result is needed).\nRename the call sites in btlTarget.c, code1_001e.c and code1_0029.c, and\nthe matching keys in config/symbols_recovered.txt so the link still resolves.\nIdentifiers and config keys only; no code change.\n\nOwner verify: 225 MATCH before and after (3 files), zero status changes.\nLint 99 before, 99 after. Elig clean for all three owners.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-15T00:01:21Z","commit_sha":"57daaa7439e359c8e6ad5351e8e8328c3f7f8b4d","commit_message":"Name k_draw debug-primitive tasks and matrix angle helpers (pure renames)\n\nKDraw_MatrixYawDeg, KDraw_MatrixPitchDeg and KDraw_MatrixRollDeg read the\nmatrix's heading, pitch and roll in degrees. Each debug primitive has a\ncreate, update and destroy triple: KDraw_CreateSphereTask/UpdateSphere/\nDestroySphere, KDraw_CreateCylinderTask/UpdateCylinder/DestroyCylinder,\nKDraw_CreateAxesTask/UpdateAxes/DestroyAxes, and the group task\nKDraw_CreateGroupTask. The draw callbacks are KDraw_DrawSphere,\nKDraw_DrawCylinder and KDraw_DrawAxes. The setters KDraw_SetGroupFlags,\nSetGroupColor, SetSphereFlags, SetSphereCenter, SetSphereColor,\nSetCylinderFlags, SetCylinderCenter, SetCylinderRadius and SetCylinderHeight\nwrite the task's work block.\n\nIdentifiers and comments only. Callers in k_fldFBN, k_fldResource, k_fldAI,\nk_command, k_fldEvent, y_symbol and the promoted bucket TUs are renamed in\nthe same change (code1_0016 and k_fldResource by hand; ast-grep does not parse\nthem). Owner verify: 322/322 MATCH across the ten touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-14T23:46:07Z","commit_sha":"54acef01d16bee932858f5ce9d209f08c06840aa","commit_message":"Name the h_cdvd internal helpers from their bodies\n\nPure rename family (identifiers, externs, table entries and intent\ncomments; no type or statement change). Names come from the body and\ncallers, not from a string or a P3 twin.\n\n- func_00454E10 -> H_Cdvd_SplitPath (VOL: name and directory split)\n- func_00455230 -> H_Cdvd_SelectDirectory (runs the directory command table)\n- func_004553E0 -> H_Cdvd_StreamAttachCacheEntry (cache lookup, 1 found / 2 not)\n- func_00455520 -> H_Cdvd_StreamReadChunk (copies from the in-memory file)\n- func_004555B0 -> H_Cdvd_StreamAtEnd (offset reached end: -1 / 0)\n- func_004556F0 -> H_Cdvd_StreamContextFree\n- func_00455720 -> H_Cdvd_IsCached (cache-table presence)\n- func_00455B70 -> H_Cdvd_ParseArchive (whole-file read or archive walk)\n- func_00456090 -> H_Cdvd_ArchiveEntryName\n- func_004561A0 -> H_Cdvd_StartPlayback (movie playback, sync or async)\n- func_004562E0 -> H_Cdvd_StreamOpenByPath\n- func_00456370 -> H_Cdvd_StreamOpenHandle\n- func_004568A0 -> H_Cdvd_SlotRead (sceRead, state 3)\n- func_00456930 -> H_Cdvd_SlotWrite (sceWrite)\n- func_004569C0 -> H_Cdvd_SlotSeek (set, add, subtract, clamp)\n- func_00456AE0 -> H_Cdvd_ProbeFile (opens prefix+path, 1 if it exists)\n- func_00456B70 -> H_Cdvd_FileContextSlot\n- func_00456BE0 -> H_Cdvd_FileContextFree\n\nThe name H_Cdvd_FileExists was tried first for func_00456AE0 and\ncollides with the existing H_Cdvd_FileExists(const char*) that many lanes\ncall, so that function is H_Cdvd_ProbeFile instead.\n\nCallers: sdkCdvd.c, sdkSnd.c, include/h_cdvd_internal.h and the three\npromoted buckets that reference these helpers (code1_0010, code1_0045,\ncode1_0046), renamed by hand where ast_edit cannot parse the file.\n\nOwner verify: 211/211 MATCH across the six touched files, no change vs\nbaseline.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-14T23:25:34Z","commit_sha":"c352c6bfc07f90006b16a18647ec91cc85827761","commit_message":"Rename datPersona roster accessors and membership helpers\n\nPure renames (identifiers and intent comments only). Roster accessors:\nfunc_0010ace0 -> datPersonaRosterSlot, func_0010abd0 -> datPersonaRosterSlotActive,\nfunc_0010aa80 -> datPersonaFindRosterSlotById, func_0010ab30 -> datPersonaFindFreeRosterSlot,\nfunc_0010ac10 -> datPersonaFindRosterRecordById, func_0010ad80 -> datPersonaRemoveRosterMemberById,\nfunc_0010ae30 -> datPersonaRemoveRosterSlot, func_0010b5b0 -> datPersonaRosterCapacity,\nfunc_0010b610 -> datPersonaSetRosterMode, func_0010a900 -> datPersonaGetRecord,\nfunc_0010a9b0 -> datPersonaLeadHasFlag4.\nMembership and lead: func_0010b010 -> datPersonaAddRosterMember, func_0010b060 ->\ndatPersonaTryAddRosterMember, func_0010b190 -> datPersonaInsertRosterRecord,\nfunc_0010b300 -> datPersonaSelectRosterMemberById, func_0010b3b0 -> datPersonaSetLeadSlot,\nfunc_0010b460 -> datPersonaLeadSlotWord, func_0010b510 -> datPersonaGetLeadSlot,\nfunc_0010b6f0 -> datPersonaCountValidMembers, func_0010b7c0 -> datPersonaClearRoster.\nCallers migrated across first-party src (shdPersona.c identifier-only text edit, parse-failed by ast_edit).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-14T23:05:27Z","commit_sha":"e2d60ca5210ae0e3d1759d0e84a5e1b2d830748b","commit_message":"battle.c: intent comment for battle_draw_2d update callback\n\nbtlUpdateDraw3DFrontTask keeps its P3-matched name (tier-1 evidence in\nconfig/symbol_names.p3.txt). Add an intent comment and state the same in\narchitecture.md.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-14T22:19:52Z","commit_sha":"826e3638925a759d3af9f8791dddd31efde6cd14","commit_message":"Move 10 inferred run TUs out of code1 buckets into *_inferred.c files\n\nEach file is a run-level inferred unit (no __FILE__ evidence) named after its\nneighbour file stem. Blocks move verbatim; #pragma state is replayed per block\nand kept in the bucket; the header keeps only the prototypes the moved bodies call.\nOwner verify: 202/202 MATCH on the touched files.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810432,"complete_code_percent":89.5366,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":264}},{"timestamp":"2026-10-14T22:01:58Z","commit_sha":"fe59a2317b7432528cc585888453780c76f5beaa","commit_message":"Update script helper names in architecture doc and cmmScript comment\n\ndocs/architecture.md cites the renamed command helpers (scrGetParamInt,\nscrGetParamFloat, scrGetParamString, scrSetReturnInt, scrSetReturnFloat).\nsrc/cmmScript.c comment on the unk0A field now names scrSetReturnInt.\nComment and doc text only; no code change.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":283,"complete_units":256}},{"timestamp":"2026-10-14T21:48:24Z","commit_sha":"64678be3e9401915a18d14f534eabfefca8c0776","commit_message":"btlMain: name 10 functions by behaviour (pure rename batch)\n\nRename func_001b7e20 -> btlCreateTimingPacket, func_001b7b30 ->\nbtlMainUpdateCameraLerp, func_001b7880 -> btlMainCreateColorLerpPacket,\nfunc_001b9360 -> btlMainCreateFadePacket, func_001b9560 ->\nbtlMainCreateTintPacket, func_001b99a0 -> btlMainCreateColorFadePacket,\nfunc_001ba090 -> btlMainCreateColorSetPacket, func_001b93c0 ->\nbtlMainUpdateTintLerp, func_001b96e0 -> btlMainUpdateColorFade,\nfunc_001b9e50 -> btlMainUpdateUnitAlphaFade. Callers and prototypes in\ncode1_001a/001b/0022 renamed in the same change. Pure identifier rename.\n\nOwner verify (btlMain.c + 3 buckets): 315/315 MATCH. elig clean. Lint\nbtlMain 5=HEAD 5.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":283,"complete_units":256}},{"timestamp":"2026-10-14T21:36:37Z","commit_sha":"9500cde5eea3b21dd5aec594743bf496a85a4bc8","commit_message":"Add architecture overview of boot, sequences, tasks, field, battle, scripts and calendar","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":283,"complete_units":256}},{"timestamp":"2026-10-14T21:23:21Z","commit_sha":"275808f2a3734e14b5dbaed1bb98ee668a0d05fe","commit_message":"Declare effMisc RNG prototypes once in the owner header\n\neffMiscRand, effMiscRandFloat and effMiscRandInit (effMisc.c) had\nper-file externs with five different signatures (s32/u32 state, void\narguments). The H011 rule flags each one that disagrees with the\ndefinition.\n\n- include/effect_instance_internal.h: typedef struct EffRandState and\n  exact prototypes, matching effMisc.c. A NULL state selects the global\n  generator, so the existing 0 arguments need no change.\n- Removed the per-file externs in effBlurFilter, effDistortParticle,\n  effLineNova, effPolygonFlash, effPolygonRing, effPolygonThunder,\n  effPolygonWind, tnEffect, promoted/code1_0048 and promoted/code1_004a.\n\nThe u32 return is the definition's type. Owner verify: 283 functions\nacross the touched Graphics files and code1_0048 unchanged, code1_004a\n89/89. Full verify 9680 MATCH, link 8100 functions, both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":283,"complete_units":256}},{"timestamp":"2026-10-14T21:11:57Z","commit_sha":"191335d127fda4617a54adbce0645cf3ee7cfc2f","commit_message":"MT_Scene_GetRes: pass live arguments at bare calls; measured H011 allows\n\nBare MT_Scene_GetRes() calls now pass the value in $a0 at that point:\nfunc_00268e60/func_00269440 pass unk, func_00269620 param_1, func_00269c20\nand func_0026bd50 pass unk, func_0026bc10 passes arg0 in mt_sceneIcon's\nfunc_0026da30. func_0026be60 takes s32 arg0 (its callers pass resource ids\n0x1E58/0x1E59 and code1_0028 declares it that way), so the (void) definition\nis corrected.\n\nThe shared u16 prototype narrows wide arguments and regresses every wide-id\ncaller (measured), so mt_sceneFunc and mt_sceneIcon keep their old-style\nextern and the other wide-id callers keep their local declarations, each with\na lint: allow H011 comment naming the measured function. Stale source-unit\ncomment in mt_sceneFunc.c updated.\n\nVerify: 225 MATCH across the nine touched files. Full verify 6860/6860; sha1\n3d1d3d2b... OK, SLUS 4eeec036... OK; unit suite only the 10 known errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":283,"complete_units":256}},{"timestamp":"2026-10-14T21:02:12Z","commit_sha":"2f1d690d5a19242f001c3e9c575626a1333af5a9","commit_message":"Owner-header prototypes for H_Cdvd_Destroy, H_Cdvd_IsFileLoaded, datGetFlag, H_Fade_SetCustomColor\n\nH011 now checks declarations of renamed functions too. These four names\nhad per-file externs that disagreed with their definitions. One prototype\nper function now lives in an owner header, and the definitions' real\ntypes are the canonical ones:\n\n- include/h_cdvd.h (new, lean): H_Cdvd_IsFileLoaded and H_Cdvd_Destroy\n  take struct HCdvd*, as h_cdvd.c defines them. h_cdvd_internal.h includes\n  it and no longer declares the two functions itself. The lean header is\n  needed because h_cdvd_internal.h declares the whole SDK surface\n  (func_00440b68 as int(const char*, ...)), which collides with other\n  TUs' void externs of the same name.\n- include/g_data_internal.h (new): u32 datGetFlag(s32 bit), as g_data.c.\n- include/h_fade_internal.h (new): void H_Fade_SetCustomColor(u8, u8, u8).\n\nMigrated in files of this lane: externs removed, owner header included.\nCall sites that passed u8* or u32 handles to a struct HCdvd* parameter\nnow name the type (struct HCdvd* / struct HCdvd**) in the same expression\nwhere a u8 cast or u8** deref was already present. g_data.c's obj stays a\nbyte-addressed block (obj + 0x110 arithmetic), so its single call keeps an\nexplicit (struct HCdvd*) cast. sdkWrap.c is touched because its local\nH_Cdvd_Destroy(u8*) extern collided with the new owner prototype.\n\nOther lanes' files still declaring these names differently (promoted\nbuckets, Battle, Event) keep their H011 until their owners migrate them\nto these headers.\n\nOwner verify: 420/420 MATCH across the 12 touched files, no change vs\nbaseline. Full verify 6860/6860, both sha1 OK, make verify and\nbuild-progress exit 0, unit suite at the known 10 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":283,"complete_units":256}},{"timestamp":"2026-10-14T20:59:15Z","commit_sha":"4d50c1b73795e36793e28ec748a233091ca1ca3f","commit_message":"Migrate btlBoss accessor calls to typed BtlUnit fields\n\nbtlBoss.c includes btl_unit_internal.h and datCalc_internal.h, drops its local datCalcChkBadStatus and datCalcIsDead externs, and types the unit locals in the first function (temp_5, temp_3) as BtlUnit *, reading genus and datUnit as fields. Mixed-offset list walkers (var_17 through +0x44C/+0x450, var_6 through +0xA6C) stay u8 *: they are never passed to an accessor, and their offsets are not BtlUnit fields. The two accessor calls that reach the unit through the action's +0x30 pointer use a typed load of that pointer. Gate: owner verify 15/15; full verify 6860/6860; unit suite 10 known errors, skipped 17; C functions linked 8100 (floor 8100), both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":283,"complete_units":256}},{"timestamp":"2026-10-14T20:46:07Z","commit_sha":"42868d1296c5eca836c5bf933170e0fc102e5aaa","commit_message":"code1_002b: H011 align func_002bcc60 declaration with its u64 definition\n\nDeclared u64 func_002bcc60(u8 *arg0): the return value is u64 in fclMisc.c's\ndefinition, and the only caller in this TU passes a u8 * (D_0072466C).\nA func_002bcc60(int *) declaration fails to compile here (MWCC rejects the\nu8 * argument), so the parameter stays u8 * to match the caller. The\ndefinition's int * is left in fclMisc.c's lane.\n\nVerify: code1_002b 75 MATCH before and after, zero status changes against\nbase bc2d42df. Lint 27 -> 26.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":283,"complete_units":256}},{"timestamp":"2026-10-14T20:41:16Z","commit_sha":"a91d8f51a7304900c5f0c0688f19889dd187c436","commit_message":"Move three bp_support_mid bucket functions into Social TUs and drop the bucket\n\n0036adc0 and 0036ae00 move to src/Main/Social/gc_model.c (P3 twin at the same\npath), in address order before 0036b470. 0036a8f0 moves to\nsrc/Main/Social/pscModel.c (__FILE__ span), between 0036a880 and 0036a900.\nBucket src/bp_support_mid/bp_support_mid_grouped.c had no other content and is\nremoved. Gate: owner verify 12/12 (gc_model + pscModel), lint delta zero (1 and\n1), unit suite only known 10 errors, full verify first-party 6860/6860, link\n8100 linked from source, both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":283,"complete_units":256}},{"timestamp":"2026-10-14T20:35:22Z","commit_sha":"6aaecb2d97d9cd106ec3a7101c7c3a87b80ddd15","commit_message":"MT_Scene_GetRes: one shared prototype in include/mt_scene_internal.h\n\nThe definition in src/Scene/mt_scene.c (u16 id, u8 * result) is now the\nsingle prototype, included by the 18 callers that agree with it, replacing\ntheir local extern declarations (void *, u16 *, Resrc *, s32, u32 variants).\nScene's func_00147530 extern is u8 * to match its definition in\ncode1_0014.c, and the moved 0x146e60/0x146ee0 bodies use u8 * without casts.\nCallers that store the result as a wider integer or pass s32 arguments are\nleft: their argument types disagree with the u16 definition (verified: with\nthe s32 prototype callers mismatch, and with s32 on the definition\nMT_Scene_GetRes itself mismatches). Those sites are not changed here:\nk_sceneDraw, mt_evtCustomEvent, mt_sceneFunc, mt_sceneIcon, evtMain,\nevtScript, evtModel, k_fldFrame, k_fldResource, code1_0029.\n\nCalls with a retyped result: evtLoadSave's 0x12C field is u8 * (read as u16\nexplicitly), evtModel calls func_00269820 through (u16 *), k_fldLmap stores\nthe record in s32 slots via (s32).\n\nVerify: 18 touched files 426/426 MATCH. Lint: 0 MT_Scene_GetRes H011 in the\n18 files. Full verify 6860/6860; sha1 3d1d3d2b... OK, SLUS 4eeec036... OK;\nunit suite only the 10 known errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":284,"complete_units":257}},{"timestamp":"2026-10-14T20:31:15Z","commit_sha":"bc2d42df2cc684607ec527e13aac57b2612614bd","commit_message":"H011: retype func_002bcbc0, func_002e1db0, func_004b1520 to their definitions\n\nfclMisc.c\n  func_002bcbc0 -> s32(u8 *, s32): the definition uses arg0 as a base address\n    (arg0 + arg1 * 0xC); the caller passes the u8 * manager.\n  func_002e1db0 -> u8 *(s32, fn, fn, fn): the three arguments are function\n    pointers (typedef int (*code)() in nmlist.c); callers pass 0.\n\ncode1_002b.c\n  func_002bcbc0 takes u8 *arg0; the arithmetic is pointer + byte offset with\n    the same result as the old integer form, and the cast is removed.\n\ncode1_004b.c\n  func_004b1520 takes u8 * and returns s32 from func_00486060 (pass-through\n    argument, not a discarded void); func_00486060's local declaration becomes\n    s32(u8 *) to match code1_0048.\n\ny_CmbCardEff.c\n  func_004b1520 declaration and caller load retyped to u8 *.\n\nVerify: four TUs (fclMisc, y_CmbCardEff, code1_004b, code1_002b) zero status\nchanges against base 725ff9ad. Lint over those four: 54 -> 50. Elig clean for\nfclMisc and y_CmbCardEff. Unit suite 871 tests, known 10 errors.\n\nStill open in y_CmbCardEff: func_004b1250 and func_004b13f0 take an untyped\nobject handle from func_004b1130 and pointer views into obj; they need the\ncard state struct typed before they can be retyped.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":284,"complete_units":257}},{"timestamp":"2026-10-14T20:28:15Z","commit_sha":"31d86386759ae444a721c4f3c8c09c09a91f021e","commit_message":"Migrate btlCamera reverse unit walk to typed BtlUnit fields\n\nThe var_18 walk over the previous-unit list (0xA68) is typed BtlUnit * and advances through prevUnit. Flag and DatUnit reads are fields (flags3, datUnit), and btlCamera.c includes datCalc_internal.h in place of its local datCalcIsDead extern. Gate: owner verify 63/63; full verify 6860/6860; unit suite 10 known errors, skipped 17; C functions linked 8100 (floor 8100), both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":284,"complete_units":257}},{"timestamp":"2026-10-14T20:24:51Z","commit_sha":"2bf88614c04dd57bdbb29b31b724ee29c2539ade","commit_message":"Declare blur and slot helpers once in the owner header\n\nThe H011 rule now checks declarations of renamed functions. My earlier\nrenames left per-file externs for the blur and mdlEffect slot helpers\nthat disagreed with their definitions.\n\n- include/effect_instance_internal.h: one prototype each for\n  effBlurFilter{Copied,Direct}{Create,Destroy,Dispatch,AdvanceAndSync}\n  and mdlEffectSlot{SetZero,Release,IsFree}, matching the definitions.\n- Removed the per-file externs in evtMisc, shdEffect, tnEffect,\n  code1_0025, code1_0048, effPolygonTrack, effBlurFilter.\n- effBlurFilterDirectCreate takes const void *initialData (the caller's\n  data pointer). Its initializer is typed s32 (*)(const void *), so the\n  function-pointer read and the call need no integer casts.\n- mdlEffectSlot* take u8 *param_1 (the table base is read through it).\n  The index is u16 (the retail caller truncates it), and IsFree returns\n  s32 (the retail caller does not truncate the result).\n- Task-word call sites cast s32 slots to u8 * / void * at the boundary.\n\nOwner verify: evtMisc 16/16, shdEffect 7/7, tnEffect 18/18, code1_0025\n48/48, code1_0048 73/73, effPolygonTrack 19/19, mdlEffect 53/53,\neffBlurFilter 53/53. Lint H011 for these names is gone.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":284,"complete_units":257}},{"timestamp":"2026-10-14T20:14:36Z","commit_sha":"725ff9adbcda36aa439f3a63a9de020138d3aada","commit_message":"fclMisc: H011 waiver for measured func_00276e10 s32 declaration\n\nAn s8 declaration regresses fclMiscUpdateHandle ('< 0' test) under\nmeasurement; retail consumes the full register. The definition in\nitfMesManager.c stays s8 (its own lane). Waiver comment only; no code change.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":284,"complete_units":257}},{"timestamp":"2026-10-14T20:07:18Z","commit_sha":"46cea2f3467dd7ed25b7407ad4b12e5c0f0cfba9","commit_message":"H011: align cross-lane signatures with retail usage; waive fclMiscHandleState extern\n\nSignatures follow the definitions' retail usage, with caller variables retyped\nrather than cast.\n\nfclMisc.c\n  func_002774d0 takes u8 * (message pointer; nmCmdList/evtMessage pass pointers).\n  fclMiscAcquireHandle's param_2 becomes u8 *; its call site loads a pointer.\n  func_002bcbc0 / func_002774d0 related: see the waiver below.\n  fclMiscHandleState block extern keeps s32 with an H011 waiver: an s8 extern\n    regresses func_002bcfb0 MATCH -> MISMATCH (measured); retail consumes the\n    full register.\n\ny_CmbCardEff.c\n  func_00452490 takes void * (sdkTask definition); six caller loads become u8 **.\n  func_004b11d0 takes (void *, void *); the (s32) address cast is removed and the\n    second argument load is a pointer.\n\ncode1_004b.c\n  func_004b13d0 takes (s32, f32): the body ignores both (calls func_00486400).\n\ncode1_0036.c\n  func_0036d940 takes void * (unused by the body; calls func_0036bbf0).\n\ncode1_0033.c\n  func_00331620 returns s32 *: every caller (y_CmbCardEff) uses the result as a pointer.\n\nVerify: five TUs (fclMisc, y_CmbCardEff, code1_004b, code1_0036, code1_0033)\nzero status changes against base 78983200. Lint over those five: 74 -> 67.\nElig clean for fclMisc and y_CmbCardEff. Unit suite 871 tests, known 10 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":284,"complete_units":257}},{"timestamp":"2026-10-14T19:58:35Z","commit_sha":"4f95fe206a4e14e7a4f4c19292900958f9446937","commit_message":"Migrate btlFormation unit walks to typed BtlUnit fields; add BtlUnit prevUnit\n\nBtlUnit gains prevUnit at 0xA68, next to nextUnit at 0xA6C; the 0xA68 link was previously an untyped unk_a68 pad. btlFormation.c includes btl_unit_internal.h and datCalc_internal.h, drops its local datCalcChkBadStatus and datCalcIsDead externs, types var_17 and the func_001d1f30 walk as BtlUnit *, and walks the 0xA68 list in reverse through prevUnit. The walk reads flags3, unk_94 and unk_96 as fields instead of raw offsets. Local btlUnitSetPos/btlUnitSetRot externs stay in func_001d1f30: removing them changes overload resolution for the callers in the file (MWCC error). Gate: owner verify 39/39; full verify 6860/6860; unit suite 10 known errors, skipped 17. Link TU-count check shows 595 vs 596 from d9e1437f (mt_scene retirement) on this base; re-checked after rebasing onto 74d624ee, which moves the floor to linked_function_count.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":284,"complete_units":257}},{"timestamp":"2026-10-14T19:53:27Z","commit_sha":"7898320025b11e8ee751e1f5a60df5fb8a8d9721","commit_message":"Align external declarations with their definitions (H011, cast-free)\n\nDeclarations only; no definition or call site changed except where noted.\n\nfclMisc.c\n  func_002bc890 -> s32(u8 *, s32); func_002bc9e0 -> s32(u8 *)   were void(?)\n  func_00278610 -> s32(s32, s16); func_002778c0 -> s32(s32, s32, s32)   were void\n  func_00276e10 kept s32(s32): an s8 declaration regresses fclMiscUpdateHandle\n    (its \"< 0\" test); kept with a measured comment.\n  fclMiscHandleState: an s32 definition regresses fclMiscHandleState and\n    fclMiscUpdateHandle, so the s8 definition is kept with a measured comment.\n    The block-local s32 extern in func_002bcfb0 remains; this H011 finding stays.\n\ny_CmbCardEff.c\n  func_004b1150 -> void(s32)   callers pass u32 values, no cast needed\n  datGetFlag -> u32(s32)       callers compare against 0\n  func_0045aeb0 -> s32(s16, u8 *)   callers discard the result\n  func_002b2d00 -> s32(s32 x4, s8)  caller stores into an s16 field\n\nfclBankManager.c\n  func_002e2170 -> u8 *(void *, void *, s32)   the 0 argument is a null pointer\n\nNot changed here (definitions are in other lanes, or the fix needs a cast):\nfunc_002774d0, func_002e1db0, func_002bcbc0, func_0036d940, func_00331620,\nfunc_00452490, func_004b11d0, func_004b1250, func_004b13d0, func_004b13f0,\nfunc_004b1520.\n\nVerify: 66/66 MATCH before and after, zero status changes (3 files). Lint\n26 -> 17. Elig clean. Unit suite 871 tests, known 10 errors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":284,"complete_units":257}},{"timestamp":"2026-10-14T19:52:30Z","commit_sha":"ffab42758093dd680b283be16ea2752517be8241","commit_message":"Move itfMsgProcedure_Window.c out of src/promoted to src/itfMsgProcedure_Window.c\n\nWhole-file move: all 21 functions are one original TU (itfMsgProcedure_Window.c,\nrecovered from a __FILE__ span). Content unchanged. Lint delta zero: 24\nfindings (H003 3, H011 21) before and after, all pre-existing in the moved\ncontent. Gate: owner verify 21/21, elig clean, unit suite only known 10 errors,\nfull verify first-party 6860/6860, link OK, both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":284,"complete_units":257}},{"timestamp":"2026-10-14T19:47:52Z","commit_sha":"688d718a2e56a3a31119b8dd4e67b3244e810a98","commit_message":"Move func_002761f0 from code1_0027 bucket into src/frFontRaster.c\n\nThe census maps 0x2761f0 to frFontRaster.c (file_string, HIGH). Retail\nplaces it between func_00275d80 and func_00276260, so it goes at that\ngap. It is a 14-line entry lookup: func_00276290 finds an existing entry\nfor (arg0, arg2); on a miss, func_002762f0 takes a free entry and loads\n0x200 bytes from arg1. Named frFontFindOrLoadEntry in source from that\nbehaviour, with an intent comment. Its two callers in frFont.c (extern\nand call) are renamed with it.\n\nTwo callees were typed wrongly by their definitions: func_00276290 and\nfunc_002762f0 return an entry pointer through (u32) and func_002762f0\ntakes its source buffer as u32. Both are now typed u8 * (return) and\nu8 * (param_2); bodies unchanged. Forward declarations for the two\ncallees use the unprototyped form the bucket used: the prototype form\nmeasured nd 7 for the moved function, the unprototyped form nd 0.\n\nOwner verify: 126/126 MATCH on the three files. Full verify 6860/6860.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":284,"complete_units":257}},{"timestamp":"2026-10-14T19:44:11Z","commit_sha":"489a5eca84b3cf8ccec0084b44ae315308504dfc","commit_message":"Rename remaining CmbCardEff helpers to behaviour-derived names\n\n  func_0033e5c0 -> cmbCardLoaderStep          steps the card loader state machine\n  func_0033e7c0 -> cmbCardControllerDestroy   frees the sub-object and destroys state\n  func_0033e810 -> cmbCardPathUpdate          advances each card along its path\n  func_0033f660 -> cmbCardReleaseState        jump-table slot 0 on the state block\n  func_0033fa30 -> cmbCardSetAngle            sets a card's angle\n  func_0033fb10 -> cmbCardSetPosition         sets a card's position\n  func_0033fc00 -> cmbCardStartMove           start/target/duration move setup\n  func_00347940 -> cmbCardClearSlots          zeroes the twelve per-card slot words\n  func_00348840 -> cmbCardEffFreeHandle       frees the handle at state+0x8\n  func_00349260 -> cmbCardEffReleaseState     jump-table slot 0 on the effect state\n\nOnly the owner file used these (grep across src and include). Call sites,\nblock-scope prototypes, the func_00451fc0 callback arguments and the comment\nnaming the callbacks were renamed together; each definition keeps its // FUN_\nmarker and gains a one-line intent comment. Intent comments for the large\nstate machines (func_0033fc80 and siblings) are not yet written; those names\nare unchanged.\n\nVerify: 35/35 MATCH before and after; the 10 renamed entries are MATCH.\nLint identical (13). Elig clean. Unit suite at baseline (869, known 10 errors).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":284,"complete_units":257}},{"timestamp":"2026-10-14T19:41:59Z","commit_sha":"34d32a41542317421bb0bc9494a453a4021bd879","commit_message":"lint: H011 checks declarations of renamed functions, not only func_ placeholders\n\nRenaming a function hid every declaration that disagreed with its\ndefinition (e.g. fclMiscHandleState declared s8, defined s32), so lint deltas\nimproved on renames while the contract stayed wrong. The tree now reports\n2,290 H011 findings, 436 of them on named functions (datCalc*, H_Cdvd_*,\ndatGetFlag, effMiscRand*, MT_Scene_GetRes, ...).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":284,"complete_units":257}},{"timestamp":"2026-10-14T18:20:54Z","commit_sha":"9b613e1e53ef50b9ffe9f4d3405319ac73092c8a","commit_message":"btlUnit: move six census-mapped functions from code1_0019 into btlUnit.c\n\nMove p3_twin rows func_0019bcb0, func_0019bd80, func_0019df00,\nfunc_0019e130, func_0019e830, func_0019e9d0 from code1_0019.c into\nsrc/Battle/btlUnit.c in address order (between func_0019ae20/\nbtlUnitCreateLookAtPacket, before func_0019e1f0, and before\nfunc_00195590). func_0019e130/func_0019df00 keep the BtlUnitPacketCountRef\nparameter type of their existing prototypes in btlUnit.c. func_0019d040\nand func_0019d0c0 get file-scope prototypes. No pragma brackets moved;\nfunc_0019df00 sits outside the df20 bracket and e130/e830/e9d0 outside\nthe pop/pragma pairs.\n\nOwner verify (btlUnit.c + code1_0019.c): 192/192 MATCH. Lint btlUnit 7=HEAD\n7, code1_0019 33=HEAD 33. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2810032,"complete_code_percent":89.52385,"complete_data":0,"complete_data_percent":100,"total_units":284,"complete_units":257}},{"timestamp":"2026-10-14T18:14:08Z","commit_sha":"74d624ee2e3bf4da348660db5dc62b2f152bbe28","commit_message":"build: link floor counts C functions linked from source, not translation units\n\nMerging files into their original TU legitimately reduces the linked-unit\ncount while every function stays linked, so the unit-count ratchet forced a\nmanual floor edit on every merge and raced between concurrent merges (origin\nfailed the floor check several times). The function count is the quantity the\nguard protects: 8100 C functions linked from source on this tree (596 units,\nboth SHA1 OK). required_c_functions is unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":284,"complete_units":257}},{"timestamp":"2026-10-14T17:32:40Z","commit_sha":"7e4aa1cf6b798b45a5b4a7e89b477a2833621371","commit_message":"Rename fclBankManager helpers to behaviour-derived names\n\n  func_002e0ea0 -> fclBankLogf      variadic bank log; forwards to func_00446e88\n  func_002e1030 -> fclBankAcquire   places a node in a free/reusable bank; returns index or -1\n  func_002e12e0 -> fclBankScanOthers marks other slots with a matching key; 0 if any lacks flag 4\n  func_002e13b0 -> fclBankUpdateFades per-frame fade of each bank's state\n\nAll four are used only in fclBankManager.c (checked by grep across src and\ninclude), so no out-of-lane call sites change. Each moved definition keeps its\n// FUN_ marker and gains a one-line intent comment; pragmas and measured notes\nare untouched.\n\nVerify: 10/10 MATCH before and after; status deltas are only the four renames,\neach still MATCH. Lint unchanged (10). Elig clean. Unit suite at baseline (869,\nknown 10 errors).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":285,"complete_units":258}},{"timestamp":"2026-10-14T17:31:26Z","commit_sha":"ff29696ab702c4384abefb57bec9605a5c3e1ada","commit_message":"Move sdkWrap.c out of src/promoted to src/sdkWrap.c\n\nWhole-file move: all 5 functions are one original TU (sdkWrap.c, recovered\nfrom a __FILE__ span). Content unchanged. Lint delta zero: the moved file has\nthe same H003 (1) and H011 (8) findings as at the old path. Gate: owner verify\n5/5, elig clean, unit suite only known 10 errors, full verify first-party\n6860/6860, link 596 eligible, both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":285,"complete_units":258}},{"timestamp":"2026-10-14T17:28:41Z","commit_sha":"ab5cc17c1e55a4b61930825216c3c444d542b8aa","commit_message":"btlTarget: move span members of src/btlTarget into src/Battle/btlTarget.c\n\nMove the 15 functions of the src/btlTarget duplicate that fall inside the\nbtlTarget TU's address span (tu_audit.json current_files: src/Battle/\nbtlTarget.c spans 1eb440-1f9730) into btlTarget.c in address order:\nfunc_001ec250, func_001ec6d0, func_001ec790, func_001ec8c0,\nfunc_001eca10, func_001ecde0 (static), func_001ece50, func_001eec50,\nfunc_001f0a40, func_001f3850, func_001f3930, func_001f3b00,\nfunc_001f5f70, func_001f6000, func_001f60c0, with their pragma brackets.\n\nKept in src/btlTarget/btlTarget.c: func_001eb420 (outside the span, its\nown audit group) and func_001f6030. func_001f6030 matched in the duplicate\nbut mismatched (nd 45) in btlTarget.c's func_001ea9a0 once its definition\nbecame (u16, u32); its s64 caller view is kept, so it stays put.\n\nType clean-up: btlTarget.c's BtlPacket / RwV3d come from existing\ndeclarations; the duplicate's own copies were dropped. func_001f60c0 and\nfunc_001f6030 prototypes are declared before first use; the two\ncaller-side pointer casts follow the file convention.\n\nOwner verify (btlTarget.c + duplicate): 50/50 MATCH. Lint btlTarget.c 6 =\nHEAD 6; duplicate 4 -> 1. Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":285,"complete_units":258}},{"timestamp":"2026-10-14T17:12:44Z","commit_sha":"8cfbb78c041ad6b85bfc54d2bd4343a716c422aa","commit_message":"Rename CmbCardEff effect-helper functions to behaviour-derived names\n\n  func_00348130 -> cmbCardEffDestroy      task destructor, jump-table slot 0\n  func_00348160 -> cmbCardEffTaskCreate   0x1B0-byte state block, colours, unit scale\n  func_00348290 -> cmbCardEffState        returns the state block (task +0x38)\n  func_003482a0 -> cmbCardEffSetParams    mode bytes +0x193/+0x19B/+0x197, param +0x19E\n  func_003482d0 -> cmbCardEffSetPosition  position +0x134/+0x124, target +0x12C\n\nEvery call site was rewritten (about 38 cmbCardEffState, 12 cmbCardEffTaskCreate,\n6 cmbCardEffSetParams, 6 cmbCardEffSetPosition); definitions and the file-local\nprototypes were updated with a one-line intent comment kept above each // FUN_\nmarker. All five functions are used only in this file. The unnamed\nconfig/asm_symbol_baseline.txt table is left as-is (behaviour-derived names\nstay in source).\n\nVerify: 35/35 MATCH before and after; status deltas are only the five renames,\neach still MATCH. Lint unchanged (30). Elig clean. Unit suite at baseline (869,\nknown 10 errors).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":285,"complete_units":258}},{"timestamp":"2026-10-14T17:11:15Z","commit_sha":"c10c26b70cfabfe55fb3dbd566a9b470308ae91b","commit_message":"Migrate btlAction accessor calls to typed BtlUnit fields\n\nBtlUnit.datUnit is now DatUnit * (offset 0xA64), and the 0xA6C list link is named nextUnit. btlAction.c includes datCalc_internal.h, drops its local datCalcChkBadStatus and datCalcIsDead externs, types its unit cursor as BtlUnit *, and calls the accessors with unit->datUnit. code1_001a.c, the only other reader of the field, casts the two u8 * helper arguments that read it. Gate: owner verify 80/80 for btlAction.c and code1_001a.c; full verify 6860/6860; unit suite 10 known errors, skipped 17; link 596 linked from source (floor 596), both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":285,"complete_units":258}},{"timestamp":"2026-10-14T16:54:41Z","commit_sha":"d30dd94a8657967eec21678220d8cedc7975fdbb","commit_message":"Remove stale y_fclCombineDraw.c.bak; name the moved ball draw in code1_0038 comment\n\n- Delete the tracked src/Event/Fcl/y_fclCombineDraw.c.bak (stale backup, not\n  compiled, no source or tool references; only historical probe_archive notes\n  mention it, left as records).\n- src/promoted/code1_0038.c:323: comment reference func_0034ae70 -> fclCmbBallDraw.\n- y_fclCombineDraw.c: keep the block-local extern of fclCombineSlotRecord with\n  an s32 slot and add a comment with the measurement. The single prototype with\n  s8 (header and definition) is correct for the combine callers, but it\n  regresses func_003191c0 (MATCH -> nd) because that caller passes an\n  unnarrowed value. Changing the shared prototype to s32 regresses 14 functions\n  across the combine/draw TUs, so there is no cast-free single prototype yet.\n\nVerify: y_fclCombineDraw.c and code1_0038.c 158/158 identical to base. Lint on\ny_fclCombineDraw.c unchanged (25). Elig clean.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":285,"complete_units":258}},{"timestamp":"2026-10-14T16:44:16Z","commit_sha":"cf21a53616a8f309bb567b386171ebc2d5cdc220","commit_message":"Type datCalc unit accessors as DatUnit pointers\n\nThe HP, SP, bad-status and death accessors in datCalc.c (GetHp, GetSp, SetHp, SetSp, SetBadStatus, GetBadStatusNoDown, GetBadStatus, ClearBadStatus, ChkBadStatus, IsDead, IsLowHp) take DatUnit *unit and read the record fields directly (hp, sp, flags, bad). Retail reads the same offsets (hp +8, sp +0xA, flags +0, bad +0xC), so the bodies are field accesses instead of byte-offset casts. datCalc_internal.h carries one prototype for each, matching the definitions. Files that do not include the header keep their local prototypes; those are lint H011 only, not compile errors. Gate: owner verify 113/113 for datCalc.c; full verify 6860/6860; unit suite 10 known errors, skipped 17; link 598 linked from source (floor 598), both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":285,"complete_units":258}},{"timestamp":"2026-10-14T16:32:24Z","commit_sha":"7680dd9c5e5ec1d8f539348d0e4016f5831f7e82","commit_message":"Move sdkFiler.c out of src/promoted to src/sdkFiler.c\n\nWhole-file move: all 6 functions are one original TU (sdkFiler.c, recovered\nfrom a __FILE__ span). Content is unchanged (100% rename). Lint shows one\nH011 warn that is pre-existing in the moved content, not introduced by the\nmove. Gate: owner verify 6/6, elig clean, unit suite only known 10 errors,\nfull verify first-party 6860/6860, link 598 eligible, both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":285,"complete_units":258}},{"timestamp":"2026-10-14T16:29:59Z","commit_sha":"071b47555cf15be3f87100120acd0fc0ffa9fd40","commit_message":"link_floor: 597 -> 596 for the merged shdPersona consolidation\n\nOrigin c920bbb6 (shdPersona TU fold-in) removes one more eligible C\nobject. Measured on the merged tree: 596 eligible C objects, both retail\nsha1 OK. The earlier frFont floor (597) landed before this removal, so\norigin main was briefly below its floor; this commit restores the gate.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":285,"complete_units":258}},{"timestamp":"2026-10-14T16:20:08Z","commit_sha":"c920bbb6413ca9b0606d268ade96c2c0fd1fc5aa","commit_message":"Move shdPersona TU to src/shdPersona.c; fold in footstep members\n\nAudit group 0x00115890 (file-string shdPersona.c, 104 members) was split\nbetween src/promoted/shdPersona.c (102) and src/Kosaka/k_footstep_grouped.c\n(0x0011B9E0, 0x0011B9F0). Rename the promoted file to its named path\nsrc/shdPersona.c, insert the two footstep members in address order before\n0x0011BA00, and declare them at the top of the owner file. The bucket\nSource unit comments in the footstep file are dropped.\n\nThe footstep file held no other functions and is deleted. Its prototypes\nare now declared in src/shdPersona.c; the two outside callers\n(Event/Fcl/y_fclCombineDraw.c and promoted/code1_0031.c) keep their local\nexterns, which compile to the same signatures.\n\nlink_floor 598 -> 597: the empty footstep unit leaves the link (a\nlegitimate removal, measured with tools/build.py on the merged tree).\n\nVerify: src/shdPersona.c 104/104 MATCH; y_fclCombineDraw.c 70/70;\ncode1_0031.c 17/17. Lint delta 0. Full first-party 6860/6860; both link\nsha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":286,"complete_units":259}},{"timestamp":"2026-10-14T16:10:05Z","commit_sha":"df207cf625108ffa323db02ea995cfb8b4956505","commit_message":"Cast-free func_002909a0 chain: u32 * word pointer, void * for func_00290de0\n\nRetail reads func_002909a0 as a word compared with sltu, so its parameter is\nu32 *. The chain that forwards to it is retyped to match (no casts):\n  func_00290940(u32 *), func_00290b00(u32 *), func_00290470(s32 *, u32 *).\nfunc_00290b00 only reads [2]/[3] as words, so its body is unchanged.\n\nfunc_00290de0 takes void *: its callers pass u8 *, u32 * and ptr+0x678, and\nvoid * accepts each without a cast. Return is s32 (callers consume it as a\nfull word; a u8 return added narrowing at the call sites and regressed\nfunc_00287ad0 and func_00286430).\n\nOwner-side and cross-lane edits, measured:\n  evtMessage.c: definitions retyped to the header signatures.\n  evtScript.c: now includes scene_event_internal.h, drops its local extern;\n  its one call uses (u32 *) on p + 0x678 (was a u8 * implicit-conversion error).\n  code1_0029.c: block-scope extern removed (header owns it).\n  evtEvent.c, evtMain.c, evtPolygonMovie.c: block externs removed; callers\n  pass explicit (u32 *) where they previously passed s32 *.\n\nVerify (798 TUs-funcs incl. evtScript, the 30-TU set): 798/798 MATCH before\nand after, identical per-function statuses. Elig clean on all seven. Lint\n78 -> 72 (six resolved H011 disagreements, no new findings). Unit suite:\n869 tests, known 10 errors only.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":287,"complete_units":260}},{"timestamp":"2026-10-14T16:09:18Z","commit_sha":"23725871cd892c5adec1a62c0dd5df9fac2af071","commit_message":"Rename moved datCalc.c functions to behaviour-derived names\n\nfunc_0023e130 -> datCalcGetTableLength (returns the fixed table length 8), func_00233bb0 -> datCalcClearField18 (clears the word at +0x18 of an object), and the six script-formula routines func_002447c0, func_002449c0, func_00244ad0, func_00244b10, func_00244c10, func_00244e20 -> datCalcFormulaTerms13And1A, datCalcFormulaScaledRatio, datCalcFormulaPassCalc15, datCalcFormulaWeightedRatio, datCalcFormulaInverseRatio, datCalcFormulaRatioOfProducts. The formula comments state which script calc kinds each routine combines. Caller-only edits in AtlusReadA's btlAICommand.c, btlCond.c, btlPanelAnalyze.c and promoted code1_001d/001e.c (identifier renames, notified). Each definition and header prototype carries a one-line intent comment. Gate: owner verify 599/599 across the touched files; full verify 6860/6860; unit suite 10 known errors, skipped 17; link 598 linked from source (floor 598), both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":287,"complete_units":260}},{"timestamp":"2026-10-14T15:51:12Z","commit_sha":"221eb87c016b857e65f01e36e242040d3974d8bf","commit_message":"Consolidate mt_scene P3-twin members into src/Scene/mt_scene.c\n\nAudit group 0x00145250 (HIGH, P3 twin src/Scene/mt_scene.c) has five\nmembers spread over three files. Move the three not already in the\ndestination into address order: 0x00145250 and 0x001452B0 from\ncode1_0014.c, and 0x00145260 from the module-subfolder copy\nsrc/mt_scene/mt_scene.c. The subfolder copy keeps its five members that\nhave no evidence (0x00146E60, 0x00146EE0, 0x0026D400, 0x0026D440,\n0x0026D780) and stays in place.\n\nThe moved bodies read the global at 0x762EA0 and the list helpers; the\ndestination declares them with the same types as code1_0014.c.\n0x00145250 returns that address as s32, so it casts explicitly.\n\nVerify: src/Scene/mt_scene.c 8/8 MATCH; src/mt_scene/mt_scene.c 5/5 MATCH;\ncode1_0014.c 122/122 MATCH. Lint delta 0. Full first-party 6860/6860; both\nlink sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":287,"complete_units":260}},{"timestamp":"2026-10-14T15:50:02Z","commit_sha":"888b0c004323a3ec9118425a669cfa7ea97449f5","commit_message":"Unify four disputed event prototypes with retail-typed signatures\n\nOne prototype per function in include/scene_event_internal.h, matched to the\nowning definition where the retail body agrees:\n  func_0028bfb0  void(u8 *, s32, u8 **, u8 **)   out-pointers stored before read\n  func_0028c080  void(u8 *, u8 *, s32, u8 *, f32 *, f32 *)\n  func_002866c0  void(u8 *, u8 *)   element list insert; arg1 is an element, not s32\n  func_00291360  s32(int, int)      caller masks the result with & 0xFFFF (andi),\n                                    so the caller treats it as int; the u16 prototype\n                                    dropped that mask and regressed func_002891d0\n                                    (MATCH -> nd 4). mt_misc definition changed to s32.\n\nCaller/definition changes (no casts added):\n  evtMain.c func_00287ad0: node/a/b locals retyped to u8 * (retail stores object\n  pointers there); removed the six block externs that the header now owns.\n  code1_0028.c: definition arg1 s32 * -> u8 * (body already casts it to u8 *).\n\nStill disputed, left out of the header on purpose:\n  func_00290de0: callers pass u8 *, u32 *, and (caller-side) ptr+0x678; no\n  single pointee type is cast-free. Kept the original local externs.\n  func_002909a0: owner definitions disagree on pointee sign (u32 * here, but\n  func_00290940 takes int * and forwards it to int * functions), reached through\n  func_00290470 in evtPolygonMovie. Needs an owner-definition change outside\n  this family.\n\nVerify (30 TUs incl. code1_0029, evtMessage, mt_misc): 791/791 MATCH before and\nafter, identical per-function results. Elig clean on evtMain, evtEvent,\nevtPolygonMovie, code1_0028, mt_misc. Lint: H011 44 -> 42 (no new H011).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":287,"complete_units":260}},{"timestamp":"2026-10-14T15:47:46Z","commit_sha":"125d9fb6025d5d410db7a64fb447399d0a9a5a7e","commit_message":"btlFormation: move mapped formation functions into btlFormation.c\n\nMove func_001d4120, func_001d4190, func_001d43f0, func_001d4490 from\nbtlFormation_grouped.c and func_001d4e90 from code1_001d.c into\nbtlFormation.c in retail address order. Prototypes for the moved\nformation functions now take the formation pointer as void *; the\ncallers cast their integer arguments. Owner verify: btlFormation,\ncode1_001d, btlFormation_grouped 101/101 MATCH.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809808,"complete_code_percent":89.516716,"complete_data":0,"complete_data_percent":100,"total_units":287,"complete_units":260}},{"timestamp":"2026-10-14T15:46:08Z","commit_sha":"a3751ffb9def476337a2ac7d2eed41b01a21d7f2","commit_message":"Move sdkListState.c out of src/promoted to src/sdkListState.c\n\nWhole-file move: all 20 functions are one original TU (sdkListState.c,\nrecovered from a __FILE__ span). Gate: owner verify 20/20, elig clean, lint\n0 findings, unit suite only known 10 errors, full verify first-party 6860/6860,\nlink 600 eligible, both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":287,"complete_units":260}},{"timestamp":"2026-10-14T15:29:43Z","commit_sha":"77f0f0aac24c8845b558a5b8c2b253c5c349e890","commit_message":"Rename sfl_data.c panel setup functions to behaviour-derived names\n\nfunc_00367f50 -> sflDataInitPanel (clears the panel block, sets default scale and colour), func_00367fb0 -> sflDataSetupLayoutPanel (type-0 full corner layout), func_003688b0 -> sflDataSetupFramePanel (type-1 outer/inner/centre corners), func_00368be0 -> sflDataSetupQuadPanel (type-2 four corners). Callers in promoted/code1_0036.c and src/Battle/btlShuffleCard.c are renamed too (AtlusReadA lane, caller-only edit, notified). Each definition and prototype carries a one-line intent comment. Gate: owner verify 57/57; full verify 6860/6860; unit suite 10 known errors, skipped 17; link 599 linked from source (floor 599), both sha1 OK; lint shows no new findings for these names.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":287,"complete_units":260}},{"timestamp":"2026-10-14T15:09:27Z","commit_sha":"9803f946cbd011bbed7b5d1ddc70a47ba35d9bdd","commit_message":"Move k_clump P3-twin member 0x00461530 into src/Kosaka/k_clump/k_clump.c\n\nAudit row 0x00461530 (P3 twin src/Kosaka/k_clump/k_clump.c, basename\nexisting) sat in code1_0046.c. Move it into address order between 0x458430\nand 0x462170, and declare it once in the owner header\ninclude/Kosaka/k_clump_internal.h for the code1_0046 callers.\n\nVerify: k_clump.c 19/19 MATCH; code1_0046.c 57/57 MATCH. Lint delta 0.\nFull first-party 6860/6860; both link sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":287,"complete_units":260}},{"timestamp":"2026-10-14T15:03:08Z","commit_sha":"937004f51c5e311a3f8ec104470d2023ad763518","commit_message":"link_floor: 599 -> 598 for the merged btlCamera_grouped unit\n\nsrc/Battle/btlCamera_grouped.c was merged into btlCamera.c and deleted. Its\nten functions still compile and match from btlCamera.c (243/243 MATCH for\nbtlCamera, code1_001b, code1_001c; full verify 6860/6860). The lower count is\nexactly that unit leaving the from-source link, so the floor is lowered\ndeliberately. build.py: loadable image 3d1d3d2b..., SLUS_217.82 4eeec036... OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":287,"complete_units":260}},{"timestamp":"2026-10-14T14:59:43Z","commit_sha":"0041a8a8308384cdc7d6ebf92d0484d692e19b6e","commit_message":"Move sdkPrimitive.c under Graphics/Primitive\n\nsrc/sdkPrimitive.c holds only its own __FILE__ span (8 functions, retail\n0x45da40-0x45eb20) and is primitive-draw code. It moves to\nsrc/Graphics/Primitive/sdkPrimitive.c, next to the other Graphics TUs.\nFunction order and markers are unchanged; its include paths still resolve\nfrom the new location.\n\nGate: owner verify 8/8 MATCH before and after; elig_debug clean; full verify\nfirst-party 6860/6860; full link 600 C objects, loadable 3d1d3d2b and\nSLUS_217.82 4eeec036 both OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":288,"complete_units":261}},{"timestamp":"2026-10-14T14:47:02Z","commit_sha":"82c247006aa56cb080a56b5641773a65ba92fdf4","commit_message":"Rename datScript.c functions to behaviour-derived names\n\nfunc_00244f60 -> datScriptRunCalc, func_00245030 -> datScriptCalcFloat, func_00246450 -> datScriptSetResult, func_00246480 -> datScriptTargetLacksFlag4, func_002464e0 -> datScriptCmdFlag2Set. The flag names state only the bit each body tests. 119 parseable call sites and declarations are rewritten (datCalc.c, code1_0024.c, datScript.c, datScript_internal.h). Each definition carries a one-line intent comment below its FUN marker. Gate on the rebased tree (onto 76fabc66, floor 599): owner verify 135/135; full verify 6860/6860; unit suite 10 known errors, skipped 17; link 599 linked from source (floor 599), both sha1 OK; lint H011 unchanged for these names.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":288,"complete_units":261}},{"timestamp":"2026-10-14T14:24:02Z","commit_sha":"1b9087d6d7341dfc3bcd840c133628187ebbb263","commit_message":"Move k_draw members 0x0014D7D0 and 0x0014D9E0 into src/Kosaka/k_draw.c\n\nThe file-string group k_draw.c (0x0014D510) holds 22 members. Twenty were\nalready in src/Kosaka/k_draw.c and two were still in code1_0014.c. Move\nthe two into address order and add the SVec3 header they need.\n\nVerify: k_draw.c 25/25 MATCH (was 23); code1_0014.c 124/124 MATCH (was\n126). Lint delta 0. Full first-party 6860/6860; both link sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":288,"complete_units":261}},{"timestamp":"2026-10-14T14:01:09Z","commit_sha":"76fabc66a5a74fac2524b20e8c4b3ec66d5d79a5","commit_message":"Rename light-slot and event helpers in mt_evtMisc from retail addresses\n\nRenames four functions moved into src/Event/mt_evtMisc.c, from their\naddress names to names derived from their bodies and callers:\n  func_00285330 -> evtSlotTableIdle      (1 if the slot table is idle)\n  func_0028bf90 -> evtCommandParamF32    (command parameter as f32, +2.0 bias)\n  func_0028c370 -> sceneLightSlotsReset  (reset slots 0-2 to defaults)\n  func_0028ced0 -> sceneLightSlotSet     (write one light slot)\nAlso renames temp_3 -> slotOffset, c4/c5/c6 -> exemptSlot4/5/6, and the\nparams of sceneLightSlotSet (slot, mode, modeValue). Adds one-line intent\ncomments; the // FUN_ markers and pragmas are unchanged.\n\nPrototypes are updated in include/scene_event_internal.h. The block-local\nextern of evtCommandParamF32 in evtMain.c is removed; the header now owns it.\nCall sites in evtMain.c are repointed.\n\nGates: owner verify (27 TUs) 736/736 MATCH before and after, identical per-\nfunction results; lint 0 new findings; elig clean on mt_evtMisc and evtMain.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":288,"complete_units":261}},{"timestamp":"2026-10-14T13:35:33Z","commit_sha":"09e204e17815663a6eb78e11c9448934c6b95038","commit_message":"link_floor: 600 -> 599 after the k_command module merge\n\nOn origin/main the real linked TU count is now 599: the subfolder copy\nsrc/Kosaka/k_command/k_command.c was merged into src/Kosaka/k_command.c\n(one eligible unit removed), on top of the 601 -> 600 removal of\nk_fieldRuntime.c. Measured with tools/build.py on the current HEAD: linked\nTU count 599, below the 600 floor. This is a deliberate lowering for a\nreal removal, not a loss of eligibility: no required function left the\nlink set and the image sha1s are unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":288,"complete_units":261}},{"timestamp":"2026-10-14T13:27:46Z","commit_sha":"abcfc13d2446dc6860c3824ef947049ba8fe68cd","commit_message":"Move nLine.c out of src/promoted to src/nLine.c\n\nWhole-file move: the 28 functions were already one original TU (nLine.c,\nrecovered from a __FILE__ span). Gate: owner verify 28/28, elig clean,\nlint 4 H003 pre-existing opt pragmas (unchanged), unit suite only known 10\nerrors, full verify first-party 6860/6860, link 604 eligible, both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":289,"complete_units":262}},{"timestamp":"2026-10-14T13:22:07Z","commit_sha":"b762274347d64f2320a0934cb4fa1e57993a834b","commit_message":"Lower link floor 601 -> 600 for removed k_fieldRuntime.c\n\nsrc/Kosaka/Field/k_fieldRuntime.c held only func_004baea0. The previous\ncommit moved that function into src/Graphics/Effect/eff_after.c and\ndeleted the file, which was link-eligible, so one linked C object is\nlegitimately gone. The count on the merged tree is 600 (build log: linked\nTU count 600). required_c_functions has no entries for the removed file\nor the moved addresses, so no identity is lost.\n\nLink after the change: 600 C objects, loadable 3d1d3d2b and SLUS_217.82\n4eeec036 both OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":289,"complete_units":262}},{"timestamp":"2026-10-14T13:21:45Z","commit_sha":"3423bdf18fdfef6104ae019139df7aaa766e1864","commit_message":"Name memcard functions moved into h_memcard.c by behaviour\n\n004647a0 and 004647b0 store sequence modes 9 and 4 into sMemcardSeqMode\n(D_00764BC0); 004653f0 raises the abort flag D_00764B9C. They become\nH_Memcard_SetSeqMode9, H_Memcard_SetSeqMode4 and H_Memcard_SetAbort,\nnamed in source only from their bodies, with the intent comments already\non the definitions. Definitions, declarations and the twelve call sites\nin mc.c are renamed together; no symbol_names evidence entry is claimed.\n\nOwner verify: h_memcard.c, mc.c and h_memcard_grouped.c 44/44 MATCH with\nno status or diff change. Full verify 6860/6860; both retail sha1 OK;\nmake verify and build-progress pass.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":290,"complete_units":263}},{"timestamp":"2026-10-14T13:12:24Z","commit_sha":"a2bfb19a8db24e10c21732e7547b45935bc81164","commit_message":"Rename datUnit.c functions to behaviour-derived names\n\nfunc_00231580 -> datUnitCreatePc, func_00231630 -> datUnitCreateEncounterGroup, func_002317a0 -> datUnitAddEncounterUnit, func_002318c0 -> datUnitRemoveEncounterUnit, func_002319c0 -> datUnitFree, func_002319f0 -> datUnitGroupIsDefeated, func_00231af0 -> datUnitInit. Every call site and declaration in the parseable src tree is rewritten by structural match (50 replacements in 8 files; datUnit.c and the promoted callers). Each prototype in datUnit_internal.h carries a one-line intent comment. src/generated/ M2C candidates still name the old functions and are not compiled; left untouched. Gate (on the rebased tree, before the comment-only header edit): owner verify 518/518 for datUnit and promoted callers; full verify 6860/6860; unit suite 10 known errors, skipped 17; link 601 linked from source (floor 601), both sha1 OK; lint no new H011 for these names.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":290,"complete_units":263}},{"timestamp":"2026-10-14T12:57:51Z","commit_sha":"97167b98e8e40f3a2c12b382d20a87a5ae4c2a30","commit_message":"Split func_002340c0/func_0023e140 prototypes into datCalc_unit_internal.h\n\nBoth take the battle unit as u8 *, which disagrees with the int-typed datCalc\naccessors in datCalc_internal.h. The split header is temporary until the\naccessor sweep unifies the signatures. Callers retype the unit load from\n*(s32 *)/*(u32 *) to *(u8 **); the same lw is emitted. btlAICommand's\nbtlCond_MYHOJO keeps an unprototyped call because retail never sets a1 before\nthe jal at 0x1db8e0.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":290,"complete_units":263}},{"timestamp":"2026-10-14T12:22:15Z","commit_sha":"a3c662c71d7c6dd6c15055995c43b384536c01fb","commit_message":"Lower link floor 602 -> 601 after merging grouped buckets\n\nProof against origin/main 56e4f2c2, same build flags, both built with\n--progress-report:\n- linked functions 8586 before, 8586 after; 0 lost, 0 gained.\n- loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78 and\n  SLUS_217.82 sha1 4eeec0360cf2715535d9f7e52eb69d786fb0158c identical in both\n  builds, so linked code bytes are identical.\n- Linked TU count 603 -> 601.\n\nLeft (merged into destinations, now gone): src/Event/Fcl/fcl_misc_grouped.c,\nsrc/Event/mt_evtCustomEvent_grouped.c, src/Event/mt_evtMessage_grouped.c.\nJoined: src/Event/mt_evtMisc.c (4 functions from src/promoted/code1_0028.c).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":290,"complete_units":263}},{"timestamp":"2026-10-14T12:03:05Z","commit_sha":"56e4f2c2087d7432ec2feb27b7bb19bcc1c47b62","commit_message":"Share unit-group prototypes for func_001ef4d0 and func_001ef720\n\nDeclare both in btl_skill_target_internal.h with the code1_001e.c definition\nsignature s32(s32, s32), and drop the u32() and s32(s32, s32) local externs\nin btlCond, btlEffect, btlAICommand and code1_001a/001d/001f/0020.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":292,"complete_units":265}},{"timestamp":"2026-10-14T11:47:10Z","commit_sha":"d83ffbf86f0071c21cc3593837cab631bbf6b409","commit_message":"Move brp_param functions into src/Main/Battle/Result/brp_param.c\n\nThe HIGH-tier audit group (0x38F590, 0x38F5C0, 0x38F5E0, 0x38F5F0; P3 twin brp_param.c with 4 members) moves out of code1_0038.c and op_fade_grouped.c into the new brp_param TU in retail address order. 0x38F600 moves with them on TUCensus inferred_tu evidence (not in the audit group). Link floor 600 -> 602: brp_param.c is a new linked TU, and btlCond.c (AtlusReadA, arrived with the rebase) is also link-eligible. Gate: owner verify brp_param.c+code1_0038.c+op_fade_grouped.c 94/94 first-party, elig clean, lint 0 new findings in brp_param.c, unit suite 10 known errors, full verify 6860/6860, full link 602 source objects, both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809776,"complete_code_percent":89.51569,"complete_data":0,"complete_data_percent":100,"total_units":292,"complete_units":265}},{"timestamp":"2026-10-14T11:46:32Z","commit_sha":"0008447766e3241c6ef968eba7f26f31c2d9ddb0","commit_message":"k_shadow: use RenderWare-layout RwV3d/RwRGBA; record ICE trigger\n\nReplace the local Vec3_00178590 and FieldColor_0017 copies with RwV3d and\nRwRGBA (identical layouts: three f32, four u8). RwV3d now comes from the\nKosaka field header; RwRGBA and RwSphere stay local because only this TU\nuses them. Document that the kept prologue is the minimal set: the full\nprologue ICEs in InterferenceGraph.c, and the trigger is not isolated to\none declaration.\n\nVerify: k_shadow 14/14, code1_0017 63/63 unchanged; full first-party\n6860/6860; both link sha1 OK. Lint: no new findings.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809696,"complete_code_percent":89.513145,"complete_data":0,"complete_data_percent":100,"total_units":291,"complete_units":264}},{"timestamp":"2026-10-14T11:38:55Z","commit_sha":"c81394d450c238853f78e35cc70061ee9c4d44cc","commit_message":"Move effGeometry.c and effParticle.c into Graphics/Effect\n\nsrc/promoted/effGeometry.c (17 members, retail __FILE__ span\n0x4a6e50-0x4aed... per tu_audit) and src/promoted/effParticle.c (17\nmembers) held only their own __FILE__ span members. Both are renamed to\ntheir original TU names under src/Graphics/Effect/, beside the other\neff*.c units. Function order and markers are unchanged.\n\nGate: owner verify 34/34 MATCH before and after the move; elig_debug\nclean on both owners; lint path-only for these two files (effGeometry 2,\neffParticle 14 H011 entries, same messages as under promoted/); unit\nsuite only the 10 known host-witness errors; full verify first-party\n6860/6860; full link loadable 3d1d3d2b and SLUS_217.82 4eeec036 both OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809696,"complete_code_percent":89.513145,"complete_data":0,"complete_data_percent":100,"total_units":291,"complete_units":264}},{"timestamp":"2026-10-14T11:24:13Z","commit_sha":"af8b19df276fb161b0c3c82f3e4c7dcc5e25c6ce","commit_message":"Move memcard functions 004647a0, 004647b0, 004653f0 into src/Kernel/h_memcard.c\n\nRetail places these three small sequence-mode and abort setters between\nh_memcard.c's 0x464650 and 0x465570 markers. The P3 twins (src/Kernel/\nh_memcard.c, verifier-matched, address-normalized) confirm the same\nfile. Bodies, markers and order are unchanged; the names remain\nfunc_XXXXXXXX because no accepted curated-name evidence exists.\n\nh_memcard_grouped.c keeps 004647c0 and its externs. required_c_functions\nmoves the three addresses to h_memcard.c so the link check tracks their\nnew owner.\n\nOwner verify: 13/13 MATCH, the three functions at diff 0 before and\nafter. Full verify 6860/6860; both retail sha1 OK; make verify and\nbuild-progress pass.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809696,"complete_code_percent":89.513145,"complete_data":0,"complete_data_percent":100,"total_units":291,"complete_units":264}},{"timestamp":"2026-10-14T11:23:49Z","commit_sha":"1627d6167a6803f188a37286d5398e31d2272752","commit_message":"Consolidate k_shadow TU into src/Kosaka/k_shadow.c\n\nMove the bare \"k_shadow.c\" __FILE__ span (0x0017B510..0x0017CCC0) and its\nspan-only helpers 0x0017ACC0 and 0x0017B350 out of src/promoted/code1_0017.c\ninto src/Kosaka/k_shadow.c, in retail address order.\n\nThe prologue is the minimal set found by delta-debugging the committed code1\nprologue against the span: the old full prologue ICEd the span in\nInterferenceGraph.c line 400. The kept declarations are each required to\ncompile and match; no single removal reproduced the ICE, so the trigger is\nrecorded as unisolated.\n\nVerify: k_shadow 14/14, code1_0017 63/63, full first-party 6860/6860, both\nlink sha1 OK. Lint delta: no new findings (H011 waivers with retail evidence\non the three pointer-returning externs; measured comments on span pragmas).\n\nShared types: RwV3d/RwRGBA/RwSphere stay local because the included RenderWare\nheaders do not supply them; Vec3_00178590 and FieldColor_0017 duplicate them\nbut are used across TUs and are not yet migrated to a subsystem header.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809696,"complete_code_percent":89.513145,"complete_data":0,"complete_data_percent":100,"total_units":291,"complete_units":264}},{"timestamp":"2026-10-14T11:22:24Z","commit_sha":"992bb744feedace2ecba7608a96021db6808a856","commit_message":"Consolidate effPolygon TUs into Graphics/Effect\n\nMove the effPolygon family out of the promoted bucket into\nsrc/Graphics/Effect/, under their original TU names:\n\n- effPolygonTrack.c (19), effPolygonRing.c (16), effPolygonFlash.c (49):\n  whole-file renames from src/promoted/; each held only its __FILE__\n  span members.\n- effPolygonWind.c: three members (0x4a22c0, 0x4a35f0, 0x4a49c0) moved\n  in from src/promoted/code1_004a.c, inserted in retail address order.\n  They need func_004841c0 and D_008873ec, declared as in code1_004a.c.\n  func_004841c0 is declared void *, matching its definition in\n  code1_0048.c and the existing prototype in code1_0049.c; the callers\n  pass the loaded field through a void * cast, which does not change the\n  object bytes.\n\nGate: owner verify 194/194 MATCH before and after (no regressions);\nelig_debug clean on all five owners; lint has no new findings (the\neffPolygon set is path-only apart from the H011 it avoids); unit suite\nonly the 10 known host-witness errors; full verify first-party 6860/6860;\nfull link loadable 3d1d3d2b and SLUS_217.82 4eeec036 both OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809696,"complete_code_percent":89.513145,"complete_data":0,"complete_data_percent":100,"total_units":290,"complete_units":263}},{"timestamp":"2026-10-14T11:20:57Z","commit_sha":"9cfca66ce6d0149cf3d908ed197dfa39cc2b77eb","commit_message":"Move func_00367f50 into sfl_data.c\n\n0x367F50 is a member of the HIGH-tier sfl_data group (audit members 0x367F50, 0x367FB0, 0x3688B0, 0x368BE0; the three others are already in sfl_data.c; census row p3-same-path). Moved into retail address order before func_00367fb0; its extern in sfl_data.c is removed since the definition now precedes its callers. Canonical prototype and source-unit header removed from bp_support_mid_grouped.c. Gate: owner verify sfl_data.c + bp_support_mid_grouped.c 8/8, elig clean, lint 0 findings, unit suite 10 known errors, full verify 6860/6860, full link 600 source objects, both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809696,"complete_code_percent":89.513145,"complete_data":0,"complete_data_percent":100,"total_units":290,"complete_units":263}},{"timestamp":"2026-10-14T11:09:07Z","commit_sha":"f40c3b3e57bd8f86aa9a717e45cc5c0fce61ab8c","commit_message":"Move btlCond predicate family into src/Battle/btlCond.c\n\nThe btlCond span (btlCond_MYHP..btlCond_ENALLHP in code1_001d.c, plus the\nbtlCond_FRLV_O..btlCond_MYID members of btlEffect.c) is contiguous in\nretail, so it moves as one TU in retail address order, with each function's\npragma pair carried along. Shared prototypes for the family and its callers\nlive once in include/btl_cond_internal.h. Callers in btlAICommand.c,\ncode1_001e.c, code1_0022.c, code1_001f.c and code1_001d.c drop their local\nextern declarations. btlCond_ESCAPE takes the two arguments its retail\ncaller passes.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2809696,"complete_code_percent":89.513145,"complete_data":0,"complete_data_percent":100,"total_units":290,"complete_units":263}},{"timestamp":"2026-10-14T11:01:01Z","commit_sha":"90a0943ba7f0cb03d590e924245728931adeed32","commit_message":"Move datScript TU to src/Main/Battle/Data/datScript.c\n\nMerge src/datScript/datScript.c and src/datScript/datScript_grouped.c (0x246450 func_00246450, p3-style optimization_level 1 wrapper kept as push/pop) into the original datScript TU in retail address order. func_00246450 is shared with datCalc and code1_0024, so its prototype moves to include/datScript_internal.h and datCalc.c drops its local extern. Link floor 601 -> 600: two bucket TUs (src/datScript/datScript.c and datScript_grouped.c) became one original TU, so one fewer C object links from source. Gate: owner verify datScript+datCalc 106/106, elig clean, unit suite 10 known errors, full verify 6860/6860, full link 600 source objects, both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":289,"complete_units":262}},{"timestamp":"2026-10-14T10:37:42Z","commit_sha":"818eb753a11da91f272c4e4178a49927053df910","commit_message":"Move func_004556b0 into src/h_cdvd/h_cdvd.c as H_Cdvd_StreamGetSlot\n\nRetail address order places 0x4556b0 between 0x4555b0 and 0x4556f0 in\nh_cdvd.c. The P3 twin 0x001019a0 (src/h_cdvd.c, verifier-matched, exact\nbytes) is named H_Cdvd_StreamGetSlot; the name is added to\nconfig/symbol_names.txt with that evidence. The shared prototype lives in\ninclude/h_cdvd_internal.h. The bucket copy in code1_0045.c is removed.\n\nsdkCdvd.c keeps its address-only extern (now the renamed symbol) because\nits local HCdvd view disagrees with the header at several offsets; that\nmerge is left for a follow-up.\n\nOwner verify: function MATCH with diff 0; other functions in the three\nfiles unchanged. Full verify 6860/6860; both retail sha1 OK; make verify\nand build-progress pass.\n\nThe rename flow also applies other lanes' curated names to code1_0018.c\nand code1_001f.c; those were reverted because they break compilation and\nremain pending on origin/main.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":290,"complete_units":263}},{"timestamp":"2026-10-14T10:35:53Z","commit_sha":"ae61efd988dd99c796109442dbd537ef8716cf27","commit_message":"Move tnEffect.c out of promoted bucket into Graphics/Effect\n\nsrc/promoted/tnEffect.c held only the 18 functions of the tnEffect.c\n__FILE__ span (retail 0x481300-0x481a20). The file is renamed to its\noriginal TU name under src/Graphics/Effect/, beside the other eff*.c\nunits. Function order and markers are unchanged.\n\nGate: owner verify 18/18 MATCH before and after the move; elig_debug\nclean; lint findings identical (same six messages under the new path);\nfull verify first-party 6860/6860; full link loadable 3d1d3d2b and\nSLUS_217.82 4eeec036 both OK; unit suite only the 10 known host-witness\nerrors.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":290,"complete_units":263}},{"timestamp":"2026-10-14T10:30:51Z","commit_sha":"0106bb841306ba92a3173b4e1d817f1b8f9b8b66","commit_message":"Move datUnit TU to src/Main/Battle/Data/datUnit.c\n\nsrc/promoted/datUnit.c held only the datUnit TU (7 functions, 0x231580-0x231AF0, __FILE__ datUnit.c, P3 twin at src/Main/Battle/Data/datUnit.c). Renamed to the original TU path; func_002319C0 moved ahead of func_002319F0 to keep retail address order, same default pragma state. Gate: owner verify 7/7, elig clean, unit suite 10 known errors, full verify 6860/6860, full link 602 source objects, both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":290,"complete_units":263}},{"timestamp":"2026-10-14T10:03:38Z","commit_sha":"56decf2e0e2bdf54c95931d9fd283360e39b0960","commit_message":"Single prototype for func_001d10d0 in the camera sequence header\n\nRetail func_001d10d0 reads only its first argument (lhu 14(a0)) and returns a\n0/1 flag in v0. The two local declarations (code1_001b with (u8*,u8*),\nbtlCamera_grouped inside a function and at file scope) are removed, the\nprototype lives once in btl_camera_sequence_internal.h, and the single caller\nin code1_001b drops the ignored second argument (codegen unchanged).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":290,"complete_units":263}},{"timestamp":"2026-10-14T10:03:22Z","commit_sha":"6de50681b7e9557a5b08a85e634705fef1f888b5","commit_message":"Consolidate mdlManager stragglers into mdlManager.c\n\nMove the nine mdlManager.c __FILE__ span members still sitting in\nsrc/promoted/code1_0047.c and src/mdlManager_grouped.c into\nsrc/Graphics/Model/mdlManager.c, in retail address order:\n\n- 0x478e70, 0x479030, 0x479c30, 0x47adf0, 0x47ae90 from code1_0047.c\n- mdlGetColor, mdlGetMatrix, mdlGetClumpFrame, mdlGetClump from\n  mdlManager_grouped.c (file deleted; it was empty after the move)\n\n0x47ce00 is outside the span and stays in code1_0047.c.\n\nLink floor 604 -> 603: the deleted src/mdlManager_grouped.c was one\nlink-eligible C object. Its functions now live in mdlManager.c, which\nstays eligible, so this is a legitimate removal, not a lost unit.\n\nGate: owner verify 168/168 MATCH; elig_debug clean; lint findings\nidentical to baseline (2351 normalized, zero delta); unit suite only\nthe 10 known host-witness errors; full verify first-party 6860/6860;\nfull link loadable 3d1d3d2b and SLUS_217.82 4eeec036 both OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":290,"complete_units":263}},{"timestamp":"2026-10-14T10:03:14Z","commit_sha":"f99d6666d655d57f689a38aa2bcb1615032b5bbd","commit_message":"Move persona table getters 0x109220 and 0x109280 into datPersona.c\n\nfunc_00109220 and func_00109280 read the persona table globals that datPersona.c owns (func_0010ace0 family), and sit in retail address order between func_00109190 and the datPersona bodies. Moved out of src/g_data/g_data.c with the now-unused DAT_00764530 extern. Compiler is the default b210 for both TUs. Gate: owner verify datPersona.c+g_data.c 193/193, elig clean, unit suite 10 known errors, full verify 6860/6860, full link 602 source objects, both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":291,"complete_units":264}},{"timestamp":"2026-10-14T09:31:37Z","commit_sha":"08fe9786fec50991433979e396a22f9a412b98a3","commit_message":"Consolidate datCalc functions into Main/Battle/Data/datCalc.c\n\nMove the datCalc-owned bodies from the src/datCalc buckets and the p3-twin rows of src/promoted/code1_0024.c into the original datCalc TU, in retail address order. Moved: 0x231ED0 datCalcGetHp, 0x231EE0 datCalcGetSp, 0x231F20 datCalcSetHp, 0x231F50 datCalcSetSp, 0x232680 datCalcSetBadStatus, 0x2326C0 datCalcGetBadStatusNoDown, 0x2326E0 datCalcGetBadStatus, 0x2326F0 datCalcClearBadStatus, 0x232710 datCalcChkBadStatus, 0x233BB0 func_00233bb0, 0x23DF20 datCalcIsSpecialItem, 0x23E130 func_0023e130, 0x2428F0 datCalcIsDead, 0x242930 datCalcIsLowHp, 0x243ED0 datCalcInitializeCharacters, 0x2447C0, 0x2449C0, 0x244AD0, 0x244B10, 0x244C10, 0x244E20 (func_XXXXXXXX). The shared prototypes for datCalc-owned functions move to include/datCalc_internal.h.\n\nLink floor 604 -> 602: the two emptied bucket TUs (src/datCalc/datCalc.c, src/datCalc/datCalc_grouped.c) were removed on purpose; their functions now live in the already-linked Main/Battle/Data/datCalc.c, which stays eligible. Gate: owner verify 130/130, elig clean, unit suite 10 known errors, full verify 6860/6860, full link 602 source objects, both sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":291,"complete_units":264}},{"timestamp":"2026-10-14T09:27:44Z","commit_sha":"6b8f990350e46679741ce40c03ecc383996a4a64","commit_message":"Move btlEPL into src/Battle as one whole TU\n\nThe file is the original btlEPL.c (its __FILE__ assert strings name it). All\n27 functions move together, including the static selection predicate at\n001FC300 that the TU census left unresolved: it is interior to the TU's\naddress span and used only by btlEPL functions. Whole-file rename; bodies,\npragmas and compile flags unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":266}},{"timestamp":"2026-10-14T09:18:21Z","commit_sha":"7064c4ab79251965f68c737edc179d09d65609b4","commit_message":"Consolidate y_smap, y_draw and calendar into their original TUs\n\nMove the promoted bucket files into their Atlus-named TUs:\nsrc/Yajima/y_smap.c (36 functions), src/Yajima/y_draw.c (58) and\nsrc/calendar.c (8). Content is unchanged; the headers already name the\noriginal TU. Owner verify 102/102 MATCH before and after; full verify\n6860/6860; both retail sha1 OK.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":266}},{"timestamp":"2026-10-14T09:06:37Z","commit_sha":"8c7eaae2fad54c39f00a914cac34c865167c6431","commit_message":"Move btlShuffle, btlShuffleCard, btlShuffleResult, btlResultFriendPsLvUp into src/Battle\n\nEach file is the whole original TU (its __FILE__ assert strings name it),\nand every function in it is mapped to the same destination by the TU census\n(p3/file-string evidence). Whole-file renames; bodies, pragmas and compile\nflags are unchanged (no path-keyed entries in config/*units*.txt).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":266}},{"timestamp":"2026-10-14T08:08:54Z","commit_sha":"ae9742ccd2345774354251e39927f84e867affa0","commit_message":"Rename func_001452b0 to MT_Scene_GetResListHead\n\nSame role as the P3 MT_Scene_GetResListHead twin (src/Scene/mt_scene.c):\nreturns the resource list head for a type from the resource manager.\nCallers in the non-generated P4 tree updated; src/generated and config\nsymbol tables are unchanged.","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":266}},{"timestamp":"2026-10-14T07:52:55Z","commit_sha":"0c86cf6d3ef5352716dd044354cbeea969a831a0","commit_message":"code1_0047: name locals and parameters in list, release, and search helpers\n\nRenames only: temp_/var_ locals become role names in func_00470c10,\nfunc_00470c80, func_00470d70, func_00470e20, func_0047ae90, func_0047ea40,\nfunc_0047eaa0, func_0047ed60, func_0047ef10, func_0047ef70, func_0047f3a0 and\nthe small release helpers at 0x47dd40/dd70/dda0. Declaration order, statement\nshape and the shared 0x22 scratch slot in func_0047ed60 are unchanged (owner\nverify 38/38 after each batch).","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":266}},{"timestamp":"2026-10-14T07:46:48Z","commit_sha":"2c309379463a8ab9af2f7957a11e92feb77a4f00","commit_message":"decomp.dev: list first-party first and the whole program second (category id 'whole')","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":266}},{"timestamp":"2026-10-14T07:39:07Z","commit_sha":"911df965bd532c41f25b25f890c48a070b587aeb","commit_message":"ci: check the whole-program denominator on the 'all' category; headline is first-party","measures":{"fuzzy_match_percent":100,"total_code":3138864,"matched_code":3138864,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":6860,"matched_functions":6860,"matched_functions_percent":100,"complete_code":2804560,"complete_code_percent":89.349525,"complete_data":0,"complete_data_percent":100,"total_units":293,"complete_units":266}},{"timestamp":"2026-10-14T07:11:46Z","commit_sha":"c2e5469d2c6c1f7273467ce7c44b6c9acfddc6fd","commit_message":"Match battle target navigation through real counter lifetimes\n\nClose 001d8010 from 11 edits to zero by testing the masked live count and reusing the completed gather cursor and depth counter. Preserve depth's 16-bit wrap and retail's stale reads; no manufactured bound refreshes.","measures":{"fuzzy_match_percent":76.674416,"total_code":4387560,"matched_code":3364136,"matched_code_percent":76.674416,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9680,"matched_functions_percent":73.88185,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T07:10:18Z","commit_sha":"ee5414ce03bdbd609de8c98e2e5a80d6167888e7","commit_message":"Name vector, userdata, and object temps in code1_0045.c\n\nfunc_00456e40 parent/slot/obj; func_00457630 basis-matrix builder\n(record/basis/refVec/fwd/up, probe pragma unchanged); func_004585c0\nand func_004586f0 userdata search (index/found/value, userData); the\nunused func_004585c0 temp is dropped and declaration order kept.","measures":{"fuzzy_match_percent":76.606224,"total_code":4387560,"matched_code":3361144,"matched_code_percent":76.606224,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9679,"matched_functions_percent":73.874214,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T07:02:16Z","commit_sha":"cf918359794f31baadc41bd463f011573bba4056","commit_message":"Match second navigation score-sort allocation (18 -> 11)","measures":{"fuzzy_match_percent":76.606224,"total_code":4387560,"matched_code":3361144,"matched_code_percent":76.606224,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9679,"matched_functions_percent":73.874214,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T06:59:16Z","commit_sha":"bcbae027275053d95ad42b5848f9f8aab449528f","commit_message":"Match first navigation score-sort allocation (25 -> 18)","measures":{"fuzzy_match_percent":76.606224,"total_code":4387560,"matched_code":3361144,"matched_code_percent":76.606224,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9679,"matched_functions_percent":73.874214,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T06:49:15Z","commit_sha":"fe90aaf35386a5ce6834e4d00bf9eb7daecacffe","commit_message":"Name typed battle action and calendar prompt functions\n\nBattle: btlAction* names for the BtlAction helpers in code1_001a,\nupdated in code1_001e, code1_0022 and btlAction.c callers.\nCalendar: clndPrompt* for the dialog task (update, destroy, start,\nfinished) and clndSceneUpdate for the calendar scene state machine.\nRenames only; per-file verify and full verify unchanged (6859/6860).","measures":{"fuzzy_match_percent":76.606224,"total_code":4387560,"matched_code":3361144,"matched_code_percent":76.606224,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9679,"matched_functions_percent":73.874214,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T06:37:32Z","commit_sha":"922a9ead1d4527ca542514f773e204e9b91a89ea","commit_message":"Name func_00413640 temps in code1_0041.c\n\nRename var_3..var_7 to cell, rootA, rootB, lastSib and node. The\nmeasured comment is updated to the new names. Owner verify 27 MATCH\nand 157 ASM unchanged; elig clean; lint identical. NON_MATCHING\nprobe bodies keep their names.","measures":{"fuzzy_match_percent":76.606224,"total_code":4387560,"matched_code":3361144,"matched_code_percent":76.606224,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9679,"matched_functions_percent":73.874214,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T06:25:23Z","commit_sha":"2a6dfa4fa6701b6b767cd08f8462df3e450c9c82","commit_message":"Retype func_001ae3c0 to BtlAction in code1_001a\n\nThe one-line getter for +0x428 now takes BtlAction *. Its only caller\npasses it as a callback address, so the change is type-only.","measures":{"fuzzy_match_percent":76.606224,"total_code":4387560,"matched_code":3361144,"matched_code_percent":76.606224,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9679,"matched_functions_percent":73.874214,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T06:17:57Z","commit_sha":"a74e2425e28a265fcab8ec9aab001601687eda7a","commit_message":"Retype three more battle action functions to BtlAction in code1_001a\n\nfunc_001a24a0, func_001af9e0 and func_001ade10 now take BtlAction *.\nfunc_001ade10 also drops its local btlActionSetState extern and uses\nthe shared header prototype.","measures":{"fuzzy_match_percent":76.606224,"total_code":4387560,"matched_code":3361144,"matched_code_percent":76.606224,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9679,"matched_functions_percent":73.874214,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T06:09:44Z","commit_sha":"fbd52538ed0be621a334a032eed22b3266509a2d","commit_message":"Retype five more battle action functions to BtlAction in code1_001a\n\nfunc_001a55a0, func_001a58e0, func_001ac500, func_001ac5b0 and\nfunc_001ac6a0 now take BtlAction *. func_001acb10 was tried and\nreverted: typing it changed common-subexpression reuse of the 0x3F4\nfield address, so it keeps its u8 * form.","measures":{"fuzzy_match_percent":76.606224,"total_code":4387560,"matched_code":3361144,"matched_code_percent":76.606224,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9679,"matched_functions_percent":73.874214,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T06:02:35Z","commit_sha":"9691deab59a73e05a650c78262b444fe4ab7d575","commit_message":"docs: 0048b340 MATCH; 6,859 MATCH / 1 ASM (after60, link67)","measures":{"fuzzy_match_percent":76.606224,"total_code":4387560,"matched_code":3361144,"matched_code_percent":76.606224,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9679,"matched_functions_percent":73.874214,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T05:50:31Z","commit_sha":"2c896c68b312b811fcbddec261aec8c3bb553a23","commit_message":"Retype five battle action functions to BtlAction in code1_001a\n\nfunc_001a0f40, func_001a2ad0, func_001a3de0, func_001a3df0 and\nfunc_001a3d50 now take BtlAction *. Their in-file uses are typed\nthrough (u8 *) casts, which keep the same byte offsets. The local\nbtlActionSetState extern in func_001a0f40 is dropped in favour of the\nshared header prototype.","measures":{"fuzzy_match_percent":76.606224,"total_code":4387560,"matched_code":3361144,"matched_code_percent":76.606224,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9679,"matched_functions_percent":73.874214,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T05:33:00Z","commit_sha":"d0832ad6aa929b370bac02066d00320d57863197","commit_message":"Retype func_001a03b0 to BtlAction and update its callers in code1_001a","measures":{"fuzzy_match_percent":76.606224,"total_code":4387560,"matched_code":3361144,"matched_code_percent":76.606224,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9679,"matched_functions_percent":73.874214,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T05:24:50Z","commit_sha":"1c3c4b0bc8d9b3af1b301e95a55a8a15173f156f","commit_message":"Name calendar state fields and getters in code1_0012 from P4/P3 evidence\n\ndaysSinceApr5 (datGetDaysSinceApr5 in P3, same save-global as func_001060b0),\nperiod (DatSaveMetadata.period; cldScheduler labels AM_A..PM_D index by it).\nRenames the two CalendarState getters to clndGetPeriod and clndGetDaysSinceApr5.","measures":{"fuzzy_match_percent":76.606224,"total_code":4387560,"matched_code":3361144,"matched_code_percent":76.606224,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9679,"matched_functions_percent":73.874214,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T05:16:47Z","commit_sha":"549fb543c33b334490dcac1070272ec069a0d6d0","commit_message":"Type func_001a06d0 with BtlAction fields; add P4 datUnit and action list links","measures":{"fuzzy_match_percent":76.606224,"total_code":4387560,"matched_code":3361144,"matched_code_percent":76.606224,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9679,"matched_functions_percent":73.874214,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T05:03:54Z","commit_sha":"d3e80792f0e538f28295cc7915d1985840beb3d7","commit_message":"Match trail interpolation with native cursor and split counter lifetimes","measures":{"fuzzy_match_percent":76.606224,"total_code":4387560,"matched_code":3361144,"matched_code_percent":76.606224,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9679,"matched_functions_percent":73.874214,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T05:01:43Z","commit_sha":"c5db98bb6a4c29ef103a354e3e855c6ef623354a","commit_message":"Type battle unit/action helpers in code1_001a with shared BtlUnit/BtlAction headers","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T04:42:21Z","commit_sha":"4fa07764a08d9a5a2a489b12ca36426e4abd79f9","commit_message":"btlEPL: clarify BtlEplSelect kind per reference slot; record for-loop mismatch","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T04:40:28Z","commit_sha":"bb60b229f739acf61ce516596c11c11512433cd9","commit_message":"Rename MT_Scene_DeleteRes to MT_Scene_DestroyRes\n\nMatches the P3 twin resrcMngDestroyRes. The retail debug string still\nreads 'delete field camera res', which is kept as the evidence line in\nconfig/symbol_names.txt. Callers and extern prototypes updated in the\ncaller TUs; no code changes beyond the name.","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T04:20:48Z","commit_sha":"f55396cde873b22169216d3a08f101833040202a","commit_message":"btlEPL: type btlEplUnitIsSelected params and select; name unit table global","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T04:14:11Z","commit_sha":"e36ade9bcb57c97422791e6dc25c2703adeff557","commit_message":"Recover 0048b340 invariant color-scale transfer (5 to 4 edits)","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T04:09:18Z","commit_sha":"9a98ae29609e8cdbb58adce753930772d79e0fdd","commit_message":"Name MT_Scene_DeleteRes parameter resTypeId","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T03:56:20Z","commit_sha":"5bf865d43f0965bb4cc95870420c323bcf3806a6","commit_message":"cmmScript: name uVar1 residues in func_0024AB40/ABF0/AC20 as value","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T03:54:21Z","commit_sha":"5f435ee1ea6aaef589c52e87caa36a6f219a0e7c","commit_message":"Improve 0048b340 native VU anchor lifetime (9 to 5 edits)","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T03:40:57Z","commit_sha":"90324d0c922b02aca5c653e496e59cbcd545e53f","commit_message":"btlShuffleResult: name residue locals by role in func_00382ba0/00383720/00383a40","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T03:38:13Z","commit_sha":"bd171fd6c3fc32fc8c1c46a3cca5843e385d3e74","commit_message":"code1_0010: name residue locals by role in func_00100230/00101270/00102780/00103600/00103980/001047b0/00104830","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T03:26:24Z","commit_sha":"558c5a7f69493810b0991e4e17ae4eccb9eaea65","commit_message":"Name locals in code1_001a func_001a3f90","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T03:11:03Z","commit_sha":"0f4e6af4893f86c9981b8456a60c2ef300c90ee5","commit_message":"Name locals in code1_001a func_001a0f40","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T03:06:05Z","commit_sha":"197c8c0ccb6d133424fb88edfb5c001d15d48c45","commit_message":"Apply symbol names in five TUs: datGetFlag, RwMatrixRotate, cosf, sinf","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T02:56:31Z","commit_sha":"7620639983e3f959d6d415b6ce72f0a8089e92d8","commit_message":"docs: 0014f310 MATCH; 6,858 MATCH / 2 ASM (after59, link65)","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T02:43:20Z","commit_sha":"a45fdebc166eb1a17a98020ada2ab6c8dab1d5c4","commit_message":"y_CmbCardEff: name colour local in func_00348160\n\nsp5C -> color (FclDrawColor stored into the block). Renames only.\nVerify: 35/35 MATCH; lint and elig match HEAD.","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T02:42:29Z","commit_sha":"e91f3ab6d9724f30352859c06dba81b3c19d7a2e","commit_message":"Type calendar consumer func_00122a40 with CalendarState fields","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T02:38:50Z","commit_sha":"77df2253b371f843cbbb188d6e9a2fa7a155cdad","commit_message":"calendar: name func_00121310 out-params month/day\n\nsp3C/sp38 -> month/day, matching the callee's out-params in the same\nfile (func_001104d0 at lines 197-198). Renames only. Verify: 8/8 MATCH;\nlint and elig match HEAD.","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T02:38:10Z","commit_sha":"f9bfe995f6d81d475d0240b586d0c31cee57c2ab","commit_message":"Match primary FBN result lifetimes in func_0014f310","measures":{"fuzzy_match_percent":76.567566,"total_code":4387560,"matched_code":3359448,"matched_code_percent":76.567566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9678,"matched_functions_percent":73.866585,"complete_code":2829648,"complete_code_percent":64.49252,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":528}},{"timestamp":"2026-10-14T02:22:59Z","commit_sha":"78856c775837cf133c81639580a384a356d8204e","commit_message":"Type calendar state machine in code1_0012\n\nfunc_001228c0 uses CalendarState/CalendarRecord fields and named locals\ninstead of temp_N offsets; codegen unchanged (file verify 82/82 MATCH).","measures":{"fuzzy_match_percent":76.44212,"total_code":4387560,"matched_code":3353944,"matched_code_percent":76.44212,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9677,"matched_functions_percent":73.858955,"complete_code":2811200,"complete_code_percent":64.07206,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":527}},{"timestamp":"2026-10-14T02:22:16Z","commit_sha":"3a6d1dac64aba117be7d0e8d708978580bcb3ff4","commit_message":"Type calendar state block in code1_0012\n\nAdd CalendarState/CalendarRecord for the iGpffffb1dc block, convert the\ncalendar accessors and func_001238c0 to typed fields. Neutral field names;\ncodegen unchanged (file verify 82/82 MATCH, elig clean).","measures":{"fuzzy_match_percent":76.44212,"total_code":4387560,"matched_code":3353944,"matched_code_percent":76.44212,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9677,"matched_functions_percent":73.858955,"complete_code":2811200,"complete_code_percent":64.07206,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":527}},{"timestamp":"2026-10-14T02:21:51Z","commit_sha":"0e69f89b99ff56d20e9071383e67ce000063d8e8","commit_message":"code1_0035: name locals in matched functions\n\nRename temp_/var_/sp locals to role names (len, partyId, label, subLabel,\nmode, msgId, flagId, slot, state, task, newTask) across\nfunc_00353b50..func_00354500. Renames only. Verify: 80/80 MATCH; lint and\nelig match baseline.","measures":{"fuzzy_match_percent":76.44212,"total_code":4387560,"matched_code":3353944,"matched_code_percent":76.44212,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9677,"matched_functions_percent":73.858955,"complete_code":2811200,"complete_code_percent":64.07206,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":527}},{"timestamp":"2026-10-14T02:15:04Z","commit_sha":"19ad500d2ab1ca789ef25c71e0526352efe92477","commit_message":"Recover primary FBN output-member bindings (14 to 4 edits)","measures":{"fuzzy_match_percent":76.44212,"total_code":4387560,"matched_code":3353944,"matched_code_percent":76.44212,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9677,"matched_functions_percent":73.858955,"complete_code":2811200,"complete_code_percent":64.07206,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":527}},{"timestamp":"2026-10-14T01:11:21Z","commit_sha":"e80d08ecca283b6404ebe6d1f0bd4e3c5c222da6","commit_message":"docs: 0016bdd0 MATCH; 6,857 MATCH / 3 ASM (after58, link64)","measures":{"fuzzy_match_percent":76.44212,"total_code":4387560,"matched_code":3353944,"matched_code_percent":76.44212,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9677,"matched_functions_percent":73.858955,"complete_code":2811200,"complete_code_percent":64.07206,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":527}},{"timestamp":"2026-10-14T01:02:20Z","commit_sha":"391a1f9b1d8a6d1bb56b9e80f51b42409ac033cc","commit_message":"Match field camera update func_0016bdd0\n\nClose the final 16 edits with real debug-vector argument and helper-pointer bindings. Canonicalize the imported call contracts, retain the retail call-crossing snapshots, and register four data symbols from their retail relocations.\n\nfnalign: 39 -> 16 -> 0, 2320 instructions, frame 0x360. Owner verify: 64/64 MATCH. Eligibility: compiled, no blockers, unresolved symbols or unowned functions. Lint delta: no new findings. Unit suite: 869 tests, 17 skips, only the 10 authorized Windows host-cc errors.","measures":{"fuzzy_match_percent":76.44212,"total_code":4387560,"matched_code":3353944,"matched_code_percent":76.44212,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9677,"matched_functions_percent":73.858955,"complete_code":2811200,"complete_code_percent":64.07206,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":527}},{"timestamp":"2026-10-14T00:42:06Z","commit_sha":"dbff44d7ea8a0a02f23db85df7b1cb8fe3d5aad8","commit_message":"Recover camera phase snapshots and MAC zero lifetimes (39 -> 16)","measures":{"fuzzy_match_percent":76.23061,"total_code":4387560,"matched_code":3344664,"matched_code_percent":76.23061,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9676,"matched_functions_percent":73.85132,"complete_code":2780464,"complete_code_percent":63.371532,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":526}},{"timestamp":"2026-10-13T22:53:06Z","commit_sha":"85bc2a0065bf678c9451321b86cc58cb79c4781e","commit_message":"docs: 004a7830 MATCH; 6,856 MATCH / 4 ASM (after57, link63)","measures":{"fuzzy_match_percent":76.23061,"total_code":4387560,"matched_code":3344664,"matched_code_percent":76.23061,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9676,"matched_functions_percent":73.85132,"complete_code":2780464,"complete_code_percent":63.371532,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":526}},{"timestamp":"2026-10-13T22:44:39Z","commit_sha":"6065a219c2dcd237056800c53274c90b93b0fe6c","commit_message":"Match 004a7830 with early floating copy coalescing\n\nUse the O3 copy coalescer with scheduling, LICM and loop rotation disabled. Preserve the real partial product and sign reference, then order the current-value local as predicted by the captured FPR graph. No artificial magnitude lifetime is required.\n\nfnalign 2 -> 0; owner 92/92 MATCH; eligibility clean; no lint delta. Unit suite: 869 tests, 17 skips, only the 10 authorized Windows host-cc errors.","measures":{"fuzzy_match_percent":76.23061,"total_code":4387560,"matched_code":3344664,"matched_code_percent":76.23061,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9676,"matched_functions_percent":73.85132,"complete_code":2780464,"complete_code_percent":63.371532,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":526}},{"timestamp":"2026-10-13T21:00:41Z","commit_sha":"10eb56d8e9aebfbad32704fa923ba6c46c3f5e84","commit_message":"Reduce 004a7830 to two edits with explicit float phase values","measures":{"fuzzy_match_percent":76.218216,"total_code":4387560,"matched_code":3344120,"matched_code_percent":76.218216,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9675,"matched_functions_percent":73.84369,"complete_code":2780464,"complete_code_percent":63.371532,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":526}},{"timestamp":"2026-10-13T19:37:54Z","commit_sha":"ccd8ecb2feebdfb3f2ea4dbcc7e220ac2d262573","commit_message":"docs: 002ac750 MATCH; 6,855 MATCH / 5 ASM (after56, link62)","measures":{"fuzzy_match_percent":76.218216,"total_code":4387560,"matched_code":3344120,"matched_code_percent":76.218216,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9675,"matched_functions_percent":73.84369,"complete_code":2780464,"complete_code_percent":63.371532,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":526}},{"timestamp":"2026-10-13T19:29:09Z","commit_sha":"4e21d141a627790af4018943486202bbb231d1d9","commit_message":"Match minimap room reveal and scan routine (002ac750)","measures":{"fuzzy_match_percent":76.218216,"total_code":4387560,"matched_code":3344120,"matched_code_percent":76.218216,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9675,"matched_functions_percent":73.84369,"complete_code":2780464,"complete_code_percent":63.371532,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":526}},{"timestamp":"2026-10-13T19:22:45Z","commit_sha":"59c67224c2acbea10bed3dfcbdd418b765421c4f","commit_message":"note: 001d8010 lifetimes and per-web propagation measurements","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T19:16:20Z","commit_sha":"45e705e59c22a5e00c445f70ccb91f95c10f132c","commit_message":"Restore minimap helper exit threading (43 to 39)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T19:10:03Z","commit_sha":"299fad2af76fc8883774824b4b73ba0a2ac4ab2b","commit_message":"Recover rectangle current-cell address order (45 to 43)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T19:09:07Z","commit_sha":"b0c25875b5a2f75627c79542dc776c0aed3cdf5d","commit_message":"Recover minimap scan coordinate snapshots and ordering (73 to 45)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T19:02:46Z","commit_sha":"2f9b509b6d5672fd065cff4e78b746fd14b43f47","commit_message":"Recover per-row minimap scan offsets (79 to 73)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T18:59:42Z","commit_sha":"cf2bc091e3113ded91e41f70cc1282ffd9d6037c","commit_message":"Recover horizontal footprint preheader coordinates (81 to 79)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T18:52:08Z","commit_sha":"d6aac198dc7bebe2d3a9ee3674c0c89351216623","commit_message":"Recover signed rectangle query coordinates (89 to 81)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T18:35:09Z","commit_sha":"b814e6613fcc94ff7283828825e4b7e68f792ef4","commit_message":"Recover word-sized minimap reveal mask phase (96 to 89)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T18:20:31Z","commit_sha":"cb7f7271a3915550acedaee1391f04ba84f25eee","commit_message":"Recover minimap room preparation and reveal boundary (106 to 96)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T17:50:13Z","commit_sha":"03dc6c60c672f471fca4b39c573defa544e99d6d","commit_message":"y_smap: recover following-row pointer operand order (110 -> 106)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T17:49:32Z","commit_sha":"6e57b05b6bfdc2cb1e7d1b3c00344eea0215f255","commit_message":"y_smap: recover the three-cell row coordinate (112 -> 110)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T17:43:37Z","commit_sha":"761ef3c53b8749f7de752772b30c8541ce3ae8fb","commit_message":"y_smap: recover current-cell reveal evaluation order (115 -> 112)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T17:42:06Z","commit_sha":"37801b00e32aa4584d32d0636a8f3594ee846871","commit_message":"y_smap: recover the final reveal guard (142 -> 115)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T17:41:16Z","commit_sha":"bd3fee740615b97abea5f2b2aa4254033de236ad","commit_message":"y_smap: recover horizontal footprint evaluation order (146 -> 142)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T17:40:18Z","commit_sha":"a1e65aa5584abfc2a9cf1e2d875d0bcf851c9f22","commit_message":"y_smap: recover vertical footprint evaluation order (154 -> 146)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T17:19:52Z","commit_sha":"102b6cdc792981b40dd41a411fb7d3903846f53d","commit_message":"y_smap: recover the rectangle column phase (198 -> 154)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T17:14:22Z","commit_sha":"2bbea892f2033da2ca1ff95167b19ccc901bfa77","commit_message":"y_smap: separate the original-cell row stride (208 -> 198)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T17:12:55Z","commit_sha":"5773f763669813ac5b5f1abfe687e8501549a5aa","commit_message":"y_smap: recover rectangle row-offset width (212 -> 208)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T17:12:03Z","commit_sha":"b258a887ac6cc6805f49662c1796de71601e485a","commit_message":"y_smap: preserve the rectangle row snapshot type (217 -> 212)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T17:09:38Z","commit_sha":"60c4a303197c83c336d27bdcf1dfa5562561c224","commit_message":"y_smap: recover shared room phase and coordinate lifetimes (290 -> 217)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T16:01:49Z","commit_sha":"4dc78cb9601136ba0b2e406c05a5f247946d7cfe","commit_message":"note: 001d8010 sibling and helper measurements","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T15:13:15Z","commit_sha":"2431a885c64297409fa1e1e4ee6e8f9f9fddd521","commit_message":"note: 0016bdd0 backend-CSE fold and conditional-definition measurements","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T14:55:13Z","commit_sha":"5a335ae9ce1e643a3b81935a73fc01e1cde9ef3a","commit_message":"note: 0014f310 resource/base replay limits and helper measurements","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T14:34:13Z","commit_sha":"f2361494cb2ea008d9617790826a64e64bff178f","commit_message":"docs: 00320b80 MATCH; 6,854 MATCH / 6 ASM (after55, link61)","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T14:27:56Z","commit_sha":"c096f0b5927773e18cd595a9e07729c6335cab45","commit_message":"Match 00320b80 through the grid row's wide snapshot\n\nMove the real grid phase into an inline helper with a signed wide rendered-row snapshot, as in matched 003212e0. Both row webs survive allocation; post-color CSE removes their duplicate sext. Preserve every getter, delay, field store and public call contract.\n\nfnalign 1 -> 0 (471 instructions, 0x150 frame). Owner verify: 70 MATCH. Eligibility: no blocking markers, unresolved symbols or unowned functions. Lint: no new findings (0 errors, 11 existing warnings). Unit suite: 869 tests, 17 skips; only the ten known Windows host-cc errors in field_movement/model_controller.","measures":{"fuzzy_match_percent":76.09204,"total_code":4387560,"matched_code":3338584,"matched_code_percent":76.09204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9674,"matched_functions_percent":73.83605,"complete_code":2754544,"complete_code_percent":62.78077,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":525}},{"timestamp":"2026-10-13T10:19:49Z","commit_sha":"cc2ff055737ce7fb743c6be34f80d3ea64a22c77","commit_message":"docs: 00320b80 at 1 edit after a8fcad84","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T07:58:14Z","commit_sha":"73566a68967641f4cfe2ba631675464acda76ffc","commit_message":"note: 0048b340 anchor order-search and expression-anchor measurements","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T07:49:53Z","commit_sha":"a8fcad8445c9e8238165ccea35eec076906855ce","commit_message":"y_fclCombineDraw: preserve grid mode phase copy, 3 to 1 edits","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T07:32:38Z","commit_sha":"325b24fadddc9c7a8ec3ce95859cae15bbc298f3","commit_message":"note: 0016bdd0 unfused sum proves the codegen adda zero","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T07:30:04Z","commit_sha":"7e8d052f44376cf67cde9f05e867053f1d62382e","commit_message":"note: 002ac750 dual-feature pragma sweep","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T07:27:55Z","commit_sha":"ef9f22f5ebfc9c6c0c2179baf8dfabfab99f8031","commit_message":"note: 0016bdd0 FPR local survival needs a conditional definition (micro)","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T07:21:44Z","commit_sha":"ee189347e8dce468addca72579a9a49508e8450f","commit_message":"docs: October 13 b210 rules (frontend CSE, asm-store kills, per-variable propagation, O1 forwarding, remat)","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T07:02:18Z","commit_sha":"c3e9f4c853682c3c5ee64237bf76105a5396e639","commit_message":"note: 0014f310 CSE flag also widens O1 copy forwarding","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T07:01:12Z","commit_sha":"3d8c629f6009f5c2a8be91ad6381aa15c56ea183","commit_message":"note: 0014f310 O1 + frontend CSE reproduces both swap sites; measured cost","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T06:45:07Z","commit_sha":"b5c4323eb86bf76e1f70fa68490ba732c7a0c7a1","commit_message":"note: 002ac750 remat only clones constants/LA; retail masks are separate conversions","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T06:38:25Z","commit_sha":"c0e1fb05b5c6868c5ba78efc5ac71f0aebe66b67","commit_message":"note: 002ac750 shared masks are frontend CSE shadows; measured micro rules","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T06:22:58Z","commit_sha":"b6111cfeea0ab7a92520c5f22c51c079acbd2359","commit_message":"note: 001d8010 sort-bound replay constraints and measured non-levers","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T06:16:09Z","commit_sha":"f24c12b14377388b55467c39a7695673537d7bd9","commit_message":"note: 0014f310 base must survive O1 block-local forwarding; measured non-levers","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T06:02:48Z","commit_sha":"b7a34631ae551f7e3c461ba58ab7d63ef5c6d01c","commit_message":"note: 0014f310 O1 backend forwards copies only into memory operands (base folds, resource survives via addiu)","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T05:56:15Z","commit_sha":"9a52900b7de1a8c2706dcc5ee02805c7099a0418","commit_message":"notes: 0016bdd0 FPR replay (sqrt must be numbered before the inline zero) and 004a7830 adda-zero numbering evidence","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T05:46:53Z","commit_sha":"40c6e5845e87ab4a6eb467b853864dc9acc13a66","commit_message":"y_draw: func_002b6ec0 MATCH (entry offset formed once; no copies pin the base or offset); handoff 6853/7","measures":{"fuzzy_match_percent":76.04901,"total_code":4387560,"matched_code":3336696,"matched_code_percent":76.04901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9673,"matched_functions_percent":73.82842,"complete_code":2635184,"complete_code_percent":60.060352,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":524}},{"timestamp":"2026-10-13T05:38:04Z","commit_sha":"31a7b01dec2014ba7b1cde586133b4f5aab3e210","commit_message":"y_draw: func_002b6ec0 keeps one queue pointer (no table copy pins the base; retail $s3) 28 -> 23","measures":{"fuzzy_match_percent":76.014,"total_code":4387560,"matched_code":3335160,"matched_code_percent":76.014,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9672,"matched_functions_percent":73.82079,"complete_code":2617792,"complete_code_percent":59.66396,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":523}},{"timestamp":"2026-10-13T05:13:53Z","commit_sha":"a9d774b537f8e34c965b4964711b2cc59cdb208c","commit_message":"code1_0048: func_0048b340 note: allocator replay needs the anchor numbered after r91 (an IR/codegen temporary), measured expression/helper forms","measures":{"fuzzy_match_percent":76.014,"total_code":4387560,"matched_code":3335160,"matched_code_percent":76.014,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9672,"matched_functions_percent":73.82079,"complete_code":2617792,"complete_code_percent":59.66396,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":523}},{"timestamp":"2026-10-13T05:01:29Z","commit_sha":"528f157b306e46769f2825de64111ae73490f684","commit_message":"code1_001a: func_001a7720 MATCH (inline effect-delay helper evaluates first like retail; real callee prototypes, retail-evidenced u16 waivers; packet constructors return their packet)","measures":{"fuzzy_match_percent":76.014,"total_code":4387560,"matched_code":3335160,"matched_code_percent":76.014,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9672,"matched_functions_percent":73.82079,"complete_code":2617792,"complete_code_percent":59.66396,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":523}},{"timestamp":"2026-10-13T04:22:53Z","commit_sha":"6e128a5da6cca3f101c723acfe68ef40e4220757","commit_message":"code1_001a: func_001a7720 primary target as one nested conditional (the keep arm's coalesced copy leaves retail's unthreaded branch; 3 -> 2)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T04:18:35Z","commit_sha":"70a605243b47c8562b08a011a13358bd1030bbb1","commit_message":"code1_001a: func_001a7720 recovery frames start from the anim length then add the blend (retail addu order; 4 -> 3)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T04:17:34Z","commit_sha":"8c3abd908118258bad9a1d4a9931953db45e7368","commit_message":"code1_001a: func_001a7720 reads the unit camera field through the sibling btlCameraField helper (retail operand order; 6 -> 4)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T04:16:26Z","commit_sha":"4e28f5f1008088c51d4deff8d1385977c3b05a0a","commit_message":"code1_001a: func_001a7720 hitDelta is u16 and accumulates with += (retail's direct lhu into the add; 10 -> 6)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T04:13:05Z","commit_sha":"1ebbbbc08c47e04070e0b281648cc4dd20167b6a","commit_message":"code1_001a: func_001a7720 late hit-row addresses go through the row index's address (btlHitRow helper, sibling btlHitResult) so IR CSE recomputes them like retail (22 -> 10)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T04:06:54Z","commit_sha":"bac838be92c4e6399a59e8377a36b852b856a521","commit_message":"docs: 001a7720 at 22 (LICM, copy-use and u16-argument findings); 00320b80 mode-use census note","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T04:00:51Z","commit_sha":"2e12b5747e5011bbe7f249147b3658188d62e742","commit_message":"code1_001a: func_001a7720 indexes the skill table base-first (retail addu operand order; 24 -> 22)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:58:33Z","commit_sha":"ccbc8040b9cef0faac8af833eb5ef5d7a2f433a1","commit_message":"code1_001a: func_001a7720 reads the motion target as an s32 field (retail loads it at the call; 26 -> 24)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:57:54Z","commit_sha":"51d92c6c5f2960dae7eddcf130332970df8527aa","commit_message":"code1_001a: func_001a7720 sees func_001b9de0's selector as u16 (retail reuses the unmasked (u16)skill; 28 -> 26)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:56:30Z","commit_sha":"073874a7d1a51b325c2f8fb7276fc1e87e961920","commit_message":"code1_001a: func_001a7720 sees func_001d69f0's value as u16, as retail's unconverted lhu argument shows (30 -> 28)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:55:35Z","commit_sha":"adf853a4232f5caec89a4013c76eb3bdc5032b8a","commit_message":"code1_001a: func_001a7720 declares func_001ef4a0's skill parameter as u16 (retail passes the lhu directly; 33 -> 30)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:51:41Z","commit_sha":"df64128e79356fe21c4498bb44e109bfdd93385d","commit_message":"code1_001a: func_001a7720 under opt_loop_invariants with retail's hoisted hit-loop invariants; frame and all stack slots now match (89 -> 33)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:41:37Z","commit_sha":"b7175d660e49959ba844db4e3bd336a725c44766","commit_message":"code1_001a: func_001a7720 camera mode flag as a conditional keeps retail's u16 mask (91 -> 89)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:40:09Z","commit_sha":"cc28cd63a0e7682547fe4dfb549c50d96563f11e","commit_message":"code1_001a: func_001a7720 passes animMotion as its s16 parameter type (102 -> 91)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:28:37Z","commit_sha":"03dd180bae689261b983350e7b2afa61974cbe05","commit_message":"code1_001a: func_001a7720 per-target signed index and ternary same-side flag give retail's word/quad spill identities (117 -> 102)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:23:35Z","commit_sha":"e939c858b9aaa1ffb94180ea6dbe8e2a5d15de09","commit_message":"code1_001a: func_001a7720 hit-row addressing uses unsigned indices where retail shares the shift (121 -> 117)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:17:23Z","commit_sha":"3d63ad7c0750b2dea7e36fd2fa6600c78400f747","commit_message":"code1_001a: func_001a7720 indexes the target list with an unsigned index (no CSE with the loop test; 123 -> 121)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:13:37Z","commit_sha":"28daef7e241fe60e40b89f3da4e854100f0d1c47","commit_message":"code1_001a: func_001a7720 hit-loop bound and last-hit test read rowHitCount directly (LICM temps, frame 0x5b0 matches; 279 -> 123)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:08:28Z","commit_sha":"b9d26a7de3a6793b2ad547f20e4976d4fb09d21b","commit_message":"code1_004a: func_004a7830 measured floor note (faithful 7 stands)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:06:35Z","commit_sha":"b7ab97f8a4bce8def88606c392c3d18abeb2aa23","commit_message":"code1_001a: func_001a7720 names hitModeDelay, notes the slot-named phase flags (279 unchanged)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:06:05Z","commit_sha":"c50d928a4e84157aadd1ac0de05b86c8af582c95","commit_message":"code1_001a: func_001a7720 names the last decompiler temporaries, drops an unused local (279 unchanged)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:05:50Z","commit_sha":"90864ae9f7e79bd7d5d7295453f1ef56d82d77c4","commit_message":"Revert \"code1_004a: func_004a7830 7 -> 6 (sign branches via magnitude)\"\n\nThis reverts commit f0c59c06f4997bf2d611732c7a4c0ca5003e7b41.","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:05:26Z","commit_sha":"ac8685a7c399e67dc8471f98f8841e58b579ef25","commit_message":"code1_001a: func_001a7720 names the remaining computed locals (279 unchanged)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T03:04:50Z","commit_sha":"85056049383f6491c5d4df531b68f0fe8f3603a1","commit_message":"code1_001a: func_001a7720 names 107 more locals from their definitions (279 unchanged)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T02:50:33Z","commit_sha":"f0c59c06f4997bf2d611732c7a4c0ca5003e7b41","commit_message":"code1_004a: func_004a7830 7 -> 6 (sign branches via magnitude)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T02:41:47Z","commit_sha":"492fb4d77b2e4920f98754de83d9a2282abd61a8","commit_message":"Make the pair-fusion grid's three-edit baseline readable\n\nRecover task state, grid row views, Persona header fields and phase names without changing the sensitive casts, statement order or scopes. The typed cell-clear accessor preserves b210's indexed-base operand order.\n\nfnalign remains 3 edits; all 471 normalized instructions equal the captured pre-readability baseline. Owner verify: 69 MATCH, 1 ASM. Eligibility: compiled True, blocking markers [], unowned [].","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T02:36:25Z","commit_sha":"85f495a19c6846be5ef79ef7ad47c9bbdcac3af3","commit_message":"code1_001a: func_001a7720 types and names the remaining packet locals (279 unchanged)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T02:35:13Z","commit_sha":"65f67452a8f42550f0cd300e97fd562e0ab48df0","commit_message":"code1_001a: func_001a7720 names target/hit loop locals and action flags (279 unchanged)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T02:34:48Z","commit_sha":"a2b41289f0abdf346231b99661a7930e0784afbc","commit_message":"Revert \"code1_001a: func_001a7720 names target/hit loop locals and action flags (279 unchanged)\"\n\nThis reverts commit 557e4473e6aa6c8400009f374ae139af85043fa7.","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T02:34:25Z","commit_sha":"557e4473e6aa6c8400009f374ae139af85043fa7","commit_message":"code1_001a: func_001a7720 names target/hit loop locals and action flags (279 unchanged)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T02:33:52Z","commit_sha":"497c933ae7d615f7cf6133b4ece8c826698c3eb6","commit_message":"code1_001a: func_001a7720 names packet locals after their constructors (279 unchanged)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T02:33:05Z","commit_sha":"0879867a3b8d6e72d38b769c56fa06638319d76f","commit_message":"code1_001a: func_001a7720 drop decompiler cast clutter and normalise dereferences (279 unchanged)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T02:31:55Z","commit_sha":"bd8dd23072aaadd14b176b4d264c8f53f4bfe797","commit_message":"code1_001a: func_001a7720 reads the action through an ActionView7720 (279 unchanged)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T02:30:26Z","commit_sha":"3ddc4a9854510b812cff25856266492657d965c4","commit_message":"code1_001a: func_001a7720 names for action id, chain time, anim packet, skill and side locals (279 unchanged)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T02:29:36Z","commit_sha":"dd0b15d1702f8b6cce064842072e23e5ea8ac17c","commit_message":"code1_001a: func_001a7720 packet locals use a BtlPacketTiming header view (279 unchanged)","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T01:44:45Z","commit_sha":"89ab2deba4e7243ea3dded99023042d4dfbeda95","commit_message":"handoff: 6851/9 checkpoint, link58","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T01:33:08Z","commit_sha":"37a35851d90ed63122de6097f525aa03251eeca4","commit_message":"handoff: 00162e10 MATCH, 001a7720 at 279","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T01:19:46Z","commit_sha":"8e4df6ff59f997f68013e81b8004a79f8a5c4f77","commit_message":"Match 00162e10 through the calendar helper's real early return\n\nReduce fnalign from 1 to 0 edits (736 instructions). Recover the matched 001623f0 search as an inline predicate with a genuine early return 0 and signed remainder. Native captures show that the extra zero definition survives allocation, giving found score 4 and s5, then post-color CSE deletes it. The success store is the retail literal assignment, not a self-increment.\n\nPreserve the readable recovered types and semantic names. Owner verify: 42 MATCH. Eligibility: no blocking markers, unowned ranges or unresolved symbols. Lint: no new findings (0 errors, 26 existing warnings). Unit discovery: 869 tests, 17 skips, ten Windows host-cc compilation errors confined to test_field_movement and test_model_controller.","measures":{"fuzzy_match_percent":75.61433,"total_code":4387560,"matched_code":3317624,"matched_code_percent":75.61433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9671,"matched_functions_percent":73.813156,"complete_code":2553392,"complete_code_percent":58.196175,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":522}},{"timestamp":"2026-10-13T01:14:57Z","commit_sha":"c4e6a086521f32a59e13e84e2e85930ab9797b71","commit_message":"code1_001a: func_001a7720 322 -> 279 (declare var_18 first)","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-13T01:06:32Z","commit_sha":"de09950279468e7a91c56fb517368e3ceb05a013","commit_message":"code1_001a: func_001a7720 469 -> 322 (declare the shared packet pointer var_19 first)","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-13T00:44:36Z","commit_sha":"8be37bab48fdf9ed55fb6a4c7a654d3bcfda4a9f","commit_message":"Make the one-edit field-unit initializer readable","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-13T00:15:40Z","commit_sha":"f612f050a9b11f395e8785ede112e601701df096","commit_message":"handoff: 001a7720 at 469, S_290 identity stack and sp430 colour finding","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-13T00:11:32Z","commit_sha":"e4e11c75a201e27a40ee3167f9a740e1060b4372","commit_message":"code1_001a: func_001a7720 470 -> 469 (sp270 as u16 copy of (s16)sp450)","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-13T00:01:58Z","commit_sha":"d21941d961dbd45f375e0bdc991a4d137a42d01e","commit_message":"handoff: 001a7720 full identity stack and sp430 finding","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T23:42:51Z","commit_sha":"c42fa5aaf2ab7e18960df6458367b5246e1209a4","commit_message":"code1_001a: func_001a7720 472 -> 470 (sp270 is s16)","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T23:40:45Z","commit_sha":"f162bb5e5a6a595f89f7b26504e9eeba22ef1b31","commit_message":"handoff: 001a7720 remaining spill-slot differences","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T23:39:53Z","commit_sha":"5e9f4e3c086628dd01129c08006acef0d9da00dc","commit_message":"handoff: 001a7720 slot order follows declaration order","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T23:35:21Z","commit_sha":"1dd6e6cad808b5813622d123abedfe03b1f49d4b","commit_message":"handoff: 001a7720 at 472 with spill-identity findings","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T23:28:25Z","commit_sha":"aa9ad9d845b29f04b0c4c9626010dfd58eddbb9c","commit_message":"code1_001a: func_001a7720 477 -> 472 (timing branches clear var_18)","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T23:26:27Z","commit_sha":"d30cb04acbd0b4f0649c8e4ab54e4787138bc3af","commit_message":"code1_001a: func_001a7720 478 -> 477 (SP delta row arithmetic)","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T23:20:31Z","commit_sha":"19f4a88295d4d75c4be83c2a7c82010cb6d5c25d","commit_message":"code1_001a: func_001a7720 483 -> 478 (row-flag address, sp200 casts)","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T23:15:46Z","commit_sha":"a48ce6873d905f5802a66d3d1422d9a69d382067","commit_message":"func_001a7720 505 -> 483: func_0019a0c0 value is u16 in every declaration and the definition","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T23:13:02Z","commit_sha":"b2f772bc9dacd5c7d2578e13066c4157700ce058","commit_message":"code1_001a: func_001a7720 513 -> 505 (real callee prototypes)","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T23:10:18Z","commit_sha":"e1a0a2b00ac238a381e344b9a0085eb7f2760f3a","commit_message":"code1_001a: func_001a7720 519 -> 513 (HP delta negation, cut-in partner load order)","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T23:07:31Z","commit_sha":"cc8264b16b4d0fc13be06af6c40ec01d7f18faf6","commit_message":"code1_001a: func_001a7720 582 -> 519 (drop propagation/rebuildconditionals pragmas; retail used plain flags)","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T23:05:46Z","commit_sha":"1e64c085171234bb46b6d031ea4d9fc85278a720","commit_message":"code1_001a: func_001a7720 587 -> 582 (CSE back on; uncast u8 field reads, u16 masks, u16 skill prototypes)","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:53:40Z","commit_sha":"2f266bf00572ab68dc087a3e508bd8b6e336d2b8","commit_message":"Recover 001a7720 timing accumulation spelling: 588 to 587","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:51:14Z","commit_sha":"48e40f8a51fc49eb558294771acf430e5008ff6c","commit_message":"Recover 001a7720 recovery-delay comparison: 590 to 588","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:50:39Z","commit_sha":"abde85b711ba236f2a1f914a55d286b0951b5aeb","commit_message":"Recover 001a7720 recovery packet contract: 593 to 590","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:49:56Z","commit_sha":"cccd063f3c08a6a78dc01ef805891abdb06f8674","commit_message":"Fix 001a7720 duration-query unit offset regression: 597 to 593\n\nThe widened-duration rewrite accidentally applied +0x30 to an s32 pointer. Restore the byte view: retail 001AA1BC loads the unit at +0x30, not +0xC0. This fixes the guarded decompilation error introduced in 27638679.","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:45:00Z","commit_sha":"9e135cbbe71c36ef09085272af79d01c96e97dce","commit_message":"Recover 001a7720 last-hit index dataflow: 598 to 597","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:42:57Z","commit_sha":"27638679a04a42b9c4b118d5f4f65e963e00fa6f","commit_message":"Recover 001a7720 widened hit-duration snapshot: 602 to 598","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:41:50Z","commit_sha":"aab3dce6c2afecef158fc79688c8d8911e0dc16f","commit_message":"Recover 001a7720 per-hit speed reuse: 610 to 602","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:39:44Z","commit_sha":"bc4055a88d051f44b22af72cae142092d89d6a61","commit_message":"Recover 001a7720 formation packet contract: 612 to 610","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:34:34Z","commit_sha":"66c8c58b5dfa5fb0594e43496309b8c379337c58","commit_message":"Recover 001a7720 nullable controller fallback: 616 to 612","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:32:18Z","commit_sha":"727c8e763c3ca535df6c255d7d7d0d53aec68e99","commit_message":"handoff: 6850/10 checkpoint, link57, copy-propagation rule and numbering findings","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:31:25Z","commit_sha":"03bbfb06142c602fd93d7690d9ec0bd82163c649","commit_message":"Recover 001a7720 direct reaction branch: 623 to 616","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:30:06Z","commit_sha":"cfb9e8ca5cd61e2ffd17658056804d4e576795d1","commit_message":"Recover 001a7720 final delay expression: 626 to 623","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:27:59Z","commit_sha":"9ef214787977816dd607a09e8a7aacfa57afcf6c","commit_message":"Recover 001a7720 motion switch layout: 629 to 626","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:27:40Z","commit_sha":"786c7fc261be7d082e313061a7a80ee1a6b920ce","commit_message":"k_fldResource: 0014f310 note: base/resource numbering residual","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:25:41Z","commit_sha":"232c55dc9c2c4f8ae2d750d2c62e642be8babdde","commit_message":"Recover 001a7720 scale clamp bound reuse: 637 to 629","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:23:41Z","commit_sha":"f3f171781d767a1076a30825c462a6a30348f737","commit_message":"Recover 001a7720 normalized unit flag: 639 to 637","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:16:19Z","commit_sha":"2a6d18255a795d9cbebdc2f69ec520c581ca2aa4","commit_message":"Recover 001a7720 camera packet frame: 738 to 639\n\nUse the canonical camera constructor and retain its BtlPacket pointer directly in the persistent camera snapshot. Removing redundant aliases restores retail's 0x5B0 frame from 0x5D0 without changing packet accesses. Owner verify remains 70 MATCH / 1 ASM.","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T22:15:26Z","commit_sha":"dc52724375166897ac4ea4b4ab3600996169cd89","commit_message":"tests: guard-only symbol diagnosis uses a synthetic tree (fGpffff8358 is now compiled after func_001a59a0 matched)","measures":{"fuzzy_match_percent":75.547226,"total_code":4387560,"matched_code":3314680,"matched_code_percent":75.547226,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9670,"matched_functions_percent":73.80553,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T21:30:36Z","commit_sha":"675a13f8b9399fe9750bd667259f3fbd93da88a1","commit_message":"Recover 001a59a0 selected-target branch join: 4 to 3","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T21:28:31Z","commit_sha":"56c6e8f3a2e93e788c2653a5f7b2cd7db5325d9f","commit_message":"y_fclCombineDraw: 00320b80 comment: whatif score analysis for mode","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T21:26:38Z","commit_sha":"708b1325ff17638e32386b7f07ef4426522d215c","commit_message":"Recover 001a59a0 strided camera field addressing: 6 to 4","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T21:16:30Z","commit_sha":"21d5a6b4839d8afa55c722ed3fcdb7ec444acde5","commit_message":"handoff: 00320b80 at 3 (spill-score analysis), agent function states","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T21:13:02Z","commit_sha":"66a26b062482992bf171bc217106837e9da3227f","commit_message":"y_smap: restore func_002ac750 fnalign-290 body (0ffb920f); keep restructure findings as a measured note","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T21:01:44Z","commit_sha":"d7d2f7668081861bc1195432828f4134204a6350","commit_message":"y_smap: func_002ac750 searches keep per-block anchor locals (structural 36 -> 32, fnalign 398 -> 397)","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T20:55:01Z","commit_sha":"72b747b16c26a5fbc7c1acf811fbe3b906404dff","commit_message":"y_smap: restructure func_002ac750 toward retail frontend CSE keys\n\nStructural (register-normalised) diff 50 -> 36 instructions and the frame\nnow matches retail (0x190). fnalign rises 290 -> 398 while the register\nallocation is re-derived on the better-structured body, as agreed for this\ncampaign: per-phase u16/u32/int coordinate conversions reproduce retail's\nre-masked parameter uses, the search snapshots are u16 locals, and the\ncase 13/14 reveal-1 test is an if as retail.","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T20:54:33Z","commit_sha":"1ab9d0b9556dcafe32c6264fbb64f0e37fe25304","commit_message":"y_fclCombineDraw: func_00320b80 8 -> 3 edits (loop-top extension, mode spill score)","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T20:38:24Z","commit_sha":"9bf76ee7284f869902c1a4539fe7c56a8c6d09ef","commit_message":"Recover native u16 skill-key contract for 001a59a0: 8 to 6","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T20:33:26Z","commit_sha":"33a6c7e3b08283b435b7126ee7ee61b208f5a950","commit_message":"Recover 001a59a0 post-repeat halfword reload: 15 to 8","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T20:26:10Z","commit_sha":"2abbc2197ffc5b43c80adc4896571b0800d33800","commit_message":"Recover 001a59a0 branch-fed reaction gates: 23 to 15","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T20:19:04Z","commit_sha":"936b122d09cf610898160989a33013efa8f76342","commit_message":"Recover 001a59a0 camera result reaching definitions: 50 to 23","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T20:11:52Z","commit_sha":"0548d6fb9a20789406ed759126b1d851cc88cc70","commit_message":"Recover 001a59a0 result packet address argument: 52 to 50","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T20:10:00Z","commit_sha":"e43838fb05cc35ed9b60f477ae060e9ba503e1aa","commit_message":"Recover 001a59a0 distance packet address argument: 54 to 52","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T20:09:25Z","commit_sha":"92437306aa1a30f01b0a12148c6d0af398b8391e","commit_message":"y_smap/code1_0016: measured notes for func_002ac750 conversion CSE and func_0016bdd0 sqrt-numbering floor","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T20:00:43Z","commit_sha":"0ffb920f2e222c4e6bfae22adef50b2f2a2238b1","commit_message":"y_smap: func_002ac750 search calls read the u8 parameters directly (fnalign 291 -> 290)","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:56:12Z","commit_sha":"fbecb4406b1ee615a7c3494e62b70e1104e8dc8c","commit_message":"Recover 001a59a0 animation delay dispatch: 56 to 54","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:55:42Z","commit_sha":"4ce1b2bfa9124e72a763fe864f27df8816650231","commit_message":"Recover 001a59a0 camera table evaluation order: 62 to 56","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:54:22Z","commit_sha":"c73cbadfde14470f88ed62e064435978d266ce62","commit_message":"Recover 001a59a0 motion switch dispatch: 70 to 62","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:51:59Z","commit_sha":"79933fa0b61f4729ec2c43c5693a47a68e9f7fd0","commit_message":"handoff: 0048b340 anchor numbering analysis","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:49:59Z","commit_sha":"b18ab24c38cafc21bf0b1df26300b12f79c9e2ca","commit_message":"Recover 001a59a0 paired-target flag normalization: 72 to 70","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:49:40Z","commit_sha":"310ee19d6fbc40896d3d407817487619fdddff3b","commit_message":"Recover 001a59a0 opening packet signature: 74 to 72","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:48:45Z","commit_sha":"ef1879f4a55aa79d78f6f7d88e086dd3da11521f","commit_message":"Recover 001a59a0 independent scan-index narrowing: 82 to 74","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:47:49Z","commit_sha":"4f4d765b446cdbab939af913115dcbf41015bc11","commit_message":"handoff: 004a7830 colouring analysis","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:46:48Z","commit_sha":"33a876f30b7fcdc6aaf5a938d41061bff705d5bf","commit_message":"Recover 001a59a0 row index lifetimes: 88 to 82","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:44:58Z","commit_sha":"23db1788ec0fa8acd0ff46e588ba40b6029922aa","commit_message":"Recover 001a59a0 repeat-count and effect-index widths: 93 to 88","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:42:48Z","commit_sha":"de3d9f1a0d1f09a21ecfe52986c22ff0af1fb4b0","commit_message":"Recover 001a59a0 spill order from b210 capture: 214 to 93","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:36:20Z","commit_sha":"1d5a43605505d43885ce2eec830f7e3b031039f2","commit_message":"002ac750: remask coordinates at two more sites (294 -> 291)","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:35:44Z","commit_sha":"47a323385fdbd3c62bb7d8a9fcc944d8a932e67b","commit_message":"Recover 001a59a0 signed count consumers: 218 to 214","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:34:57Z","commit_sha":"0bd2f97deee2f8b47a8c0d0e85b5e760a3d9d4ca","commit_message":"Recover 001a59a0 animation packet type and frame: 239 to 218","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:34:38Z","commit_sha":"82cea2eb49253b6689fc212ab09ae80bfe9dd3b4","commit_message":"handoff: measured blockers for the small residuals","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:33:46Z","commit_sha":"6c6955c9791544bfd92d2e7e0a03cb18de2016ff","commit_message":"Recover phase-local minimap coordinate remasks (303 to 294 edits)","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:32:05Z","commit_sha":"fda1372d1fac49d3170904c6d141348643408a09","commit_message":"Remask minimap reveal coordinate at kind-9/10 bit use (309 to 303 edits)","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:31:51Z","commit_sha":"2c7e5403a141e514a7d840956dc410c3718ced6b","commit_message":"Recover 001a59a0 selected action layout: 309 to 239","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:30:33Z","commit_sha":"e960748b81952434b6efff801cf20af290c6da28","commit_message":"Recover 001a59a0 target unit member: 318 to 309","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:29:23Z","commit_sha":"1c8012a3e568227bca2d57b66ed46d58bd10687b","commit_message":"Recover 001a59a0 target effect layout: 322 to 318","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:25:51Z","commit_sha":"c303c843eb8a03e6faaa40714af4efd939df1917","commit_message":"Improve 001a59a0 paired-effect unit load: 325 to 322","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:20:56Z","commit_sha":"10e984a02cdf108f1332ea992f041d4974476947","commit_message":"Recover 001a7720 reaction fallback layout: 740 to 738","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:19:40Z","commit_sha":"230f63a066b01db5a7cd428aeb7291b5d08046cc","commit_message":"Repair 001a7720 reaction count narrowing: 742 to 740","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:15:01Z","commit_sha":"858f92070c14ca17ca7362f3844c84b8388bd340","commit_message":"Recover 001a7720 skill lookup order: 745 to 742","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T19:14:25Z","commit_sha":"f8b07960c4cd23f860dfe2da28f89808251384e6","commit_message":"Repair 001a7720 windup shift signedness: 746 to 745","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:59:24Z","commit_sha":"159175540a8fd641fc547cc7a1ff1ccd4e86d11b","commit_message":"Repair 001a7720 animation duration width: 752 to 746\n\nRetail retains the full word sum of the signed timing query and the 0/6 delay, then uses a logical right shift for its shortened duration. Correct the decompiler's u16 truncation and model the bounded delay as a signed word.","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:57:03Z","commit_sha":"f469e97537c566724252e6fcefdbda3f4a310e62","commit_message":"Improve 001a7720 selector lifetimes: 759 to 752","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:56:24Z","commit_sha":"7b86e617723f95c737bc609637adc730f1a81b48","commit_message":"Improve 001a7720 threshold widths: 779 to 759","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:53:47Z","commit_sha":"2e97358d203069805ec66045718157cd5fa31355","commit_message":"Improve 001a7720 tail predicate widths: 786 to 779","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:52:51Z","commit_sha":"5cd89c9770731a6a458f4c5dccc04140a28acc1f","commit_message":"Repair 001a7720 timing sum width: 792 to 786\n\nRetail extends the signed-halfword result of func_001991c0 before ADDIU +6 at 0x001a88a0, 0x001a8cd4, and 0x001a8fb8. Correct the decompiler's extra truncation after addition; retain the word-sized delay even at the signed-halfword boundary.","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:50:51Z","commit_sha":"c5f14d0d64df7894f71500f8b9c290118f7ab89e","commit_message":"Improve 001a7720 signed tail snapshots: 796 to 792","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:49:45Z","commit_sha":"d893abcb6006240717b6b60c72e3d284146572f4","commit_message":"Improve 001a7720 native delay arithmetic: 803 to 796","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:43:07Z","commit_sha":"7e735bf64d26adcf0c0680ccd2bbcc6c4461a8a5","commit_message":"Improve 001a7720 reaction index lifetime: 810 to 803","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:39:12Z","commit_sha":"16500dc387893f9efa4b93da0c4a241e49508a74","commit_message":"Improve 001a7720 scalar joins: 817 to 810","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:37:02Z","commit_sha":"683db433523d5c3304f327bfc3d611c995662bc4","commit_message":"Recover minimap three-cell search step locals (310 to 309 edits)","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:36:32Z","commit_sha":"6cccd203b6deb75d5f7f9bcbda38df9dd62cf9d8","commit_message":"Recover minimap two-cell search step locals (311 to 310 edits)","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:36:13Z","commit_sha":"e15705c49db169929362ba54dc21224bccbf8d3c","commit_message":"Repair 001a7720 effect-table lookup: 819 to 817\n\nRetail 0x001aa458 reads a 32-bit effect ID directly from iGpffffb3ac plus index*4+0xd04. Correct the decompiler's extra table indirection and unaligned 64-bit read; the matched constructor stores this argument as a word.","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:34:38Z","commit_sha":"d36994c64d4f2ac5da01904be5f38d43e506eb5b","commit_message":"handoff: part 13 checkpoint 6849/11 (after49, link56)","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:22:08Z","commit_sha":"636c5b181572e9d3ed44d1e4bef4659406176a84","commit_message":"Document trail anchor allocation checkpoint","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:21:58Z","commit_sha":"7459bf589329cad87f660278bbff6d5e6953fde4","commit_message":"Document combine row normalization checkpoint","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:18:31Z","commit_sha":"01ffb943a2caf1ef688b4c767a2c0e07b9bbf006","commit_message":"Improve minimap reveal row addressing (313 to 311 edits)","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:14:00Z","commit_sha":"1611aaad38e1ecb7eda5a0c56ee09991aac5bc69","commit_message":"Improve 001a59a0 effect-unit reads: 327 to 325","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:09:33Z","commit_sha":"3841f3ac2322ed5a71a33b0afe33cc755c2ae7d4","commit_message":"Improve 001a59a0 unit-kind loads: 331 to 327","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T18:09:01Z","commit_sha":"3f868bd3b60ce06db50aa5e23869a7b60c9bf318","commit_message":"Improve 001a59a0 packet UID loads: 335 to 331","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T17:58:17Z","commit_sha":"ebfc34d1ccc47b7b7c31cca46de0b4aadc77950e","commit_message":"matching.md: b210 binary operand evaluation cost rule (closes 0046b380)","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T17:58:00Z","commit_sha":"fedbca11a7466e81a314f48a2e6a94033b5bfd49","commit_message":"Match sprite renderer 0046b380\n\nEach colour arm forms one record pointer that the flags test reuses, and\nthe alpha fade narrows alpha again before the fade load, reproducing\nretail's second andi (left operand evaluated first per b210's\ncost rule at 0x004a9250). The raster-less paths keep retail's reads of\nunwritten uv[]/source[].z, commented at each site.","measures":{"fuzzy_match_percent":75.37547,"total_code":4387560,"matched_code":3307144,"matched_code_percent":75.37547,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9669,"matched_functions_percent":73.79789,"complete_code":2532192,"complete_code_percent":57.71299,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":521}},{"timestamp":"2026-10-12T17:54:09Z","commit_sha":"5fa3e380ee1fa8f0f1bc74728b9fc6995da64840","commit_message":"0046b380: one record pointer per colour arm reused by the flags test (fnalign 7 -> 4)","measures":{"fuzzy_match_percent":75.19751,"total_code":4387560,"matched_code":3299336,"matched_code_percent":75.19751,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9668,"matched_functions_percent":73.79026,"complete_code":2521152,"complete_code_percent":57.46137,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":520}},{"timestamp":"2026-10-12T17:48:29Z","commit_sha":"e5ac1f3c2b79c6b9cb577e740931d9beedccb3ad","commit_message":"Separate post-color draw base lifetimes (38 to 28 edits)","measures":{"fuzzy_match_percent":75.19751,"total_code":4387560,"matched_code":3299336,"matched_code_percent":75.19751,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9668,"matched_functions_percent":73.79026,"complete_code":2521152,"complete_code_percent":57.46137,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":520}},{"timestamp":"2026-10-12T17:45:50Z","commit_sha":"6c82c2099c84ec9043281e4523521197a81c8a9d","commit_message":"matching.md: rewrite playbook for large residuals (the procedure that closed 001f14f0, 0017f490, 0018a200, 0027f6f0, 00471370)","measures":{"fuzzy_match_percent":75.19751,"total_code":4387560,"matched_code":3299336,"matched_code_percent":75.19751,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9668,"matched_functions_percent":73.79026,"complete_code":2521152,"complete_code_percent":57.46137,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":520}},{"timestamp":"2026-10-12T17:41:30Z","commit_sha":"dd5218db66ddba1ab5d0bf08ebb91aa2a2af7033","commit_message":"matching.md: spilled-parameter slot placement rule (b210 RE), closes 00471370","measures":{"fuzzy_match_percent":75.19751,"total_code":4387560,"matched_code":3299336,"matched_code_percent":75.19751,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9668,"matched_functions_percent":73.79026,"complete_code":2521152,"complete_code_percent":57.46137,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":520}},{"timestamp":"2026-10-12T17:41:09Z","commit_sha":"5cec6775a8278fbfcf9b8f794b626f818da6ffff","commit_message":"Match hierarchy controller update 00471370\n\nThe parent matrix is a function-scope local assigned just before the node\nloop. b210 coalesces that copy into param_4, so the spilled parameter takes a\nquadword slot (0x140) as in retail instead of a packed parameter home (0x14c).\nRegisters the ten data symbols the function references.","measures":{"fuzzy_match_percent":75.19751,"total_code":4387560,"matched_code":3299336,"matched_code_percent":75.19751,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9668,"matched_functions_percent":73.79026,"complete_code":2521152,"complete_code_percent":57.46137,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":520}},{"timestamp":"2026-10-12T17:35:58Z","commit_sha":"10b18e861e33587b3dd8d5f6a0f69e06e23ad408","commit_message":"Keep selection/count state in its native halfword (26 to 25 edits)","measures":{"fuzzy_match_percent":75.0356,"total_code":4387560,"matched_code":3292232,"matched_code_percent":75.0356,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9667,"matched_functions_percent":73.78263,"complete_code":2472560,"complete_code_percent":56.353874,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":519}},{"timestamp":"2026-10-12T17:34:16Z","commit_sha":"447505c2eb558958d2991a49b1b96c8b4f5a990c","commit_message":"Recover retail stale selection path and count reuse (37 to 26 edits)\n\nFix the decompiler's not-found early return: retail updates selection with the last swap index, unset when no swap ran. Preserve that stale read without inventing an initializer.","measures":{"fuzzy_match_percent":75.0356,"total_code":4387560,"matched_code":3292232,"matched_code_percent":75.0356,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9667,"matched_functions_percent":73.78263,"complete_code":2472560,"complete_code_percent":56.353874,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":519}},{"timestamp":"2026-10-12T17:31:18Z","commit_sha":"204312fc9024cdb341473c9f1408c72ccf5bc672","commit_message":"00471370: recover RpHAnimHierarchy/RpHAnimNodeInfo views of param_1 (fnalign 7 -> 5)","measures":{"fuzzy_match_percent":75.0356,"total_code":4387560,"matched_code":3292232,"matched_code_percent":75.0356,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9667,"matched_functions_percent":73.78263,"complete_code":2472560,"complete_code_percent":56.353874,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":519}},{"timestamp":"2026-10-12T17:29:27Z","commit_sha":"1a46d2ee904e528758dfaf2eecf52d335b03785a","commit_message":"00471370: re-read the created interpolator through its slot (fnalign 12 -> 7)","measures":{"fuzzy_match_percent":75.0356,"total_code":4387560,"matched_code":3292232,"matched_code_percent":75.0356,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9667,"matched_functions_percent":73.78263,"complete_code":2472560,"complete_code_percent":56.353874,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":519}},{"timestamp":"2026-10-12T17:16:29Z","commit_sha":"54e127709bf1fdb8a63436e4d2818ebd8417f98a","commit_message":"00471370: distinct created-flag addresses and re-read interpolator slot (fnalign 13 -> 12)","measures":{"fuzzy_match_percent":75.0356,"total_code":4387560,"matched_code":3292232,"matched_code_percent":75.0356,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9667,"matched_functions_percent":73.78263,"complete_code":2472560,"complete_code_percent":56.353874,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":519}},{"timestamp":"2026-10-12T17:03:50Z","commit_sha":"31bd856aff4b9ce34eeaf410197561ee8109c6f4","commit_message":"Improve draw queue snapshot lifetimes (56 to 38 edits)","measures":{"fuzzy_match_percent":75.0356,"total_code":4387560,"matched_code":3292232,"matched_code_percent":75.0356,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9667,"matched_functions_percent":73.78263,"complete_code":2472560,"complete_code_percent":56.353874,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":519}},{"timestamp":"2026-10-12T16:52:34Z","commit_sha":"4541ef10852304bd9edaa92b2a06382800e8f5ad","commit_message":"Bank an earlier worker's guarded improvements: 002b6ec0 128 -> 56, 001d8010 90 -> 37, 0048b340 notes\n\nThese were left uncommitted in the worktree; owners verify with no sibling\nregressions and both functions keep their NONMATCHING guards.","measures":{"fuzzy_match_percent":75.0356,"total_code":4387560,"matched_code":3292232,"matched_code_percent":75.0356,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9667,"matched_functions_percent":73.78263,"complete_code":2472560,"complete_code_percent":56.353874,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":519}},{"timestamp":"2026-10-12T16:50:28Z","commit_sha":"362449cf841e3bf1fceb31376eee413c9c250c8c","commit_message":"Match func_001f14f0 with native result phases and modeled allocation","measures":{"fuzzy_match_percent":75.0356,"total_code":4387560,"matched_code":3292232,"matched_code_percent":75.0356,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9667,"matched_functions_percent":73.78263,"complete_code":2472560,"complete_code_percent":56.353874,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":519}},{"timestamp":"2026-10-12T16:28:52Z","commit_sha":"acf49035912398d4cdc0c45cd7e4c47a02e6bd20","commit_message":"Recover the native reflected-result remap phase (4 to 2)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T16:19:47Z","commit_sha":"f593115970f8fb2df5236cdea806585ce955fa54","commit_message":"Recover the missing-recipient final-exit branch (5 to 4)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T16:14:36Z","commit_sha":"b52273b435255962212d94b5038bd0b91eb4accc","commit_message":"Recover the party damage accumulator lifetime (16 to 5)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T16:14:01Z","commit_sha":"47c7d89c4c6d8b9d78db2dbd5eb5c1320ab9396c","commit_message":"Use the native critical-count predicate (18 to 16)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T16:13:21Z","commit_sha":"ffc7edfa0b766d98f41de736b6f6081b6f92c2cc","commit_message":"Recover the party reset index phase (22 to 18)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T16:12:48Z","commit_sha":"2e868f72d40f22aa0f73c657a98284779ffa9eac","commit_message":"Separate party input index from its loop-test view (23 to 22)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:58:12Z","commit_sha":"2a80cd1b57fdae290bec8d8d1e4dd70883a3b24d","commit_message":"Separate unit counter comparison and address views (24 to 23)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:57:36Z","commit_sha":"b79b89836e43fc27be66496af257ffcc15700e52","commit_message":"Forward zero-extended skill through retail word ABI (26 to 24)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:48:47Z","commit_sha":"c626926f485ad67546648cadb711e56bc8d9fa05","commit_message":"Order persona ratio-table evaluation in 001f14f0 (28 to 26)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:43:29Z","commit_sha":"f380dfcaa4636c3c08dc6e0937e90f472d926e9e","commit_message":"Restore party input byte mask in 001f14f0 (31 to 28)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:40:24Z","commit_sha":"754d54547649c7021aa4cf8b8bd4e500b49f7bab","commit_message":"Restore hit-resolution phase joins in 001f14f0 (33 to 31)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:39:43Z","commit_sha":"93b0526deb7770af0674557503174dca707bc054","commit_message":"Restore final target-array address order in 001f14f0 (34 to 33)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:32:26Z","commit_sha":"11d8cffe4ab32339c2c5a640ab82bedfddc8c9e1","commit_message":"Preserve copied-record flag pointer across exit checks (56 to 34)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:31:34Z","commit_sha":"de1b5e6eb471fcd3c514483a3a1d28447a9a90d7","commit_message":"Separate party reset and exit-mask addressing in 001f14f0 (63 to 56)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:23:19Z","commit_sha":"684b7919229074bebef4189596c5930a854df0f3","commit_message":"Recover fresh reaction-phase index reads in 001f14f0 (77 to 63)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:21:54Z","commit_sha":"0b684a989efebe604cc6888809562186231a7951","commit_message":"Unify record-initialization index phase in 001f14f0 (80 to 77)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:21:27Z","commit_sha":"343bf1bc635ae85ace467b61d45ce36ade49f29f","commit_message":"Separate reaction address phases using recovered hit stride (118 to 80)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:16:42Z","commit_sha":"81d4c45e7ead0ccdfbc2b25ee239302edc8e463c","commit_message":"Use recovered hit-record array for reactions in 001f14f0 (130 to 118)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:10:57Z","commit_sha":"4e0ea304f54f87dc485a256e968bf7203f412af6","commit_message":"Restore damage-factor evaluation order in 001f14f0 (137 to 130)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:09:36Z","commit_sha":"f1c49f1d3cc5a0c3ebc186cf72802a146853185a","commit_message":"Restore hit-message narrowing boundaries in 001f14f0 (140 to 137)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:07:19Z","commit_sha":"cc1e801edd2de0c9a5c427c879943300e7f5e13b","commit_message":"Keep sign-extended messages word-sized in 001f14f0 (143 to 140)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T15:04:13Z","commit_sha":"745d49e1066bb3aea18271438ef823b439490500","commit_message":"Restore tail record-index evaluation in 001f14f0 (166 to 143)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:58:59Z","commit_sha":"07b68196b467ff8a4c5f56a9a01f85053e005c28","commit_message":"Order party-copy locals by captured allocation in 001f14f0 (185 to 166)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:53:23Z","commit_sha":"90013db7aa44619a000db364822b2e7fdcd54c71","commit_message":"Use documented promoted skill ABI in 001f14f0 (189 to 185)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:48:55Z","commit_sha":"52f169a84c72652812c2425e493d7d2d9e8fb9e2","commit_message":"Recover normalized result phase and invariant motion in 001f14f0 (219 to 189)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:46:31Z","commit_sha":"269a72a46fc496b9ab223f2a64f28176a3e16472","commit_message":"Match adjacent target shift addressing in 001f14f0 (227 to 219)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:36:03Z","commit_sha":"0a598cd11fa72f912f949de0712322561f487653","commit_message":"Recover 001f14f0 skill offset snapshot storage (244 to 227)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:34:50Z","commit_sha":"37a23365ee1d544fe19c6f9031e64c6626d77399","commit_message":"Separate 001f14f0 scale constant lifetimes (252 to 244)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:34:10Z","commit_sha":"cf6528fa0b80532737891b0883dd6c6d0b52383f","commit_message":"Restore 001f14f0 cross-phase flags pointer lifetime (258 to 252)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:28:16Z","commit_sha":"90899b7e370ab12b812ffc653ff06afed6f62d0b","commit_message":"Unify 001f14f0 skill-field address order (265 to 258)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:27:17Z","commit_sha":"0858e65e795a7610cc9f9c61523e35f940891d91","commit_message":"Recover 001f14f0 boolean and message value domains (279 to 265)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:25:10Z","commit_sha":"7e34fcac58af3746b20d19c6bffeac4de509a49a","commit_message":"Recover 001f14f0 loop-bound snapshots (292 to 279)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:21:55Z","commit_sha":"b955c72cc347f4257064b56d636d79b611e44562","commit_message":"Restore 001f14f0 context and skill colors (327 to 292)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:20:59Z","commit_sha":"751f763f74f01b7313b3fa0b103f6e5a930e4bf8","commit_message":"Restore 001f14f0 flag update and call roles (333 to 327)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:17:34Z","commit_sha":"3cbc41a3b9b4f0615d387260fcadbd36c8d7d9e2","commit_message":"Align 001f14f0 message spill to retail frame (338 to 333)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:16:11Z","commit_sha":"f0a8423e5de7a24665eefff3b363fdb5a91bc018","commit_message":"Restore 001f14f0 unit and skill register order (371 to 338)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:15:27Z","commit_sha":"9a980517204f5b23830b283254c4d7356e93e767","commit_message":"Recover 001f14f0 scalar frame and widths (474 to 371)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:10:57Z","commit_sha":"28377e52fc2d784aa001d8c4f990d26acdd5668b","commit_message":"Restore 001f14f0 skill-field operand order (476 to 474)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T14:07:21Z","commit_sha":"db3b8f38a4e3d4293162b8dace323a852e3606db","commit_message":"Narrow 001f14f0 skill-table index before stride (478 to 476)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T13:52:31Z","commit_sha":"dc9e2d6dc098f3ab47c94595d35fa66803c6c926","commit_message":"Restore retail's zero-target skip in 001a7720\n\nThe guarded reconstruction used a do-while, but retail branches from 0x001a9790 to the count test at 0x001aadd0. Restore the pretest and fix 00202740's real one-unit contract. fnalign 820 to 819; owner gate 69 MATCH and 2 ASM.","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T13:44:38Z","commit_sha":"10095521ed49bb00f98e7fcf908f05365a3fbcdc","commit_message":"Recover predicate and skill slot contracts in 001a7720","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T13:40:37Z","commit_sha":"7b61973513780eeb9c02b3217b11bfe11de66fd9","commit_message":"Recover typed hit-row and stride spill slots in 001a7720","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T13:36:22Z","commit_sha":"dd2eb015e308b31dfb6b4accd5d5835fb455d754","commit_message":"Recover hit-index snapshot lifetime in 001a7720 (901 to 887 edits)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T13:31:47Z","commit_sha":"89bc3b488a6071c648baa373e97f7ced6e2c2376","commit_message":"Recover separate hit-row and result-pointer lifetimes in 001a59a0","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T13:05:34Z","commit_sha":"45ad0767d85bd6bbbf6e8204d546ba2c69be6c94","commit_message":"Recover predicate comparison widths in 001a7720 (906 to 901 edits)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T12:58:48Z","commit_sha":"613ecff0797add775052292d4c229d8cf1f764b3","commit_message":"Scope measured propagation setting for 001a7720 (907 to 906 edits)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T12:57:24Z","commit_sha":"095ce054b90f61bc7448e2941b267b2352b56b2a","commit_message":"Recover partner-view evaluation order in 001a7720 (917 to 907 edits)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T12:55:04Z","commit_sha":"fdee40ea50c82d04e1b48fc6818f4ae371ce3816","commit_message":"Repair retail dataflow and skill table reloads in 001a7720\n\nCorrect dead split definitions for sp30C and sp4CC that contradict retail stores, recover u16 motion and word-wide flags, and retain the skill offset rather than the table pointer. Guarded fnalign 953 to 917 edits; owner keeps 69 MATCH and 2 ASM.","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T12:48:48Z","commit_sha":"83679052cfb20d7181a57bcc3039979915825029","commit_message":"Recover source unit allocation in 001a59a0 (405 to 343 edits)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T12:45:18Z","commit_sha":"e8b5c22fdb524f5fba87ce2dbf1c0a059fa56a0a","commit_message":"Use timing API narrowing in 001a59a0 (452 to 405 edits)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T12:43:11Z","commit_sha":"2d12ca43ac07f9d67a0155eca453289651539dd7","commit_message":"Recover word-sized hit flag in 001a59a0 (453 to 452 edits)","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T12:17:30Z","commit_sha":"692bc79088c32487644fdf5e5f1dcbb7f49e373b","commit_message":"Restore low and high waypoint offset lifetimes\n\nSnapshot the low point X component before forming the high point byte offset. This preserves the actual interpolation phases and closes both addu operand swaps. Guarded fnalign 41 -> 39, 2320/2320 instructions; owner gate stays 63 MATCH/one ASM without regressions.","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T11:54:28Z","commit_sha":"83331857a264dee45bd66322fb908cd52bb08088","commit_message":"Preserve field camera packed color through native union copy\n\nReuse the matched TitleDrawColor/Color float-and-byte storage convention. A complete four-byte native union copy emits retail lwc1/swc1 without numerical conversion. Guarded fnalign 43 -> 41; owner gate remains 63 MATCH/one ASM.","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T11:48:25Z","commit_sha":"16ce0d62412cb529bd172e14e45a9b77f1f4b096","commit_message":"Restore field camera resume-distance snapshot order\n\nThe real comparison-limit snapshot restores its load order and rollback FPR. Guarded fnalign 47 -> 43; owner verification stays 63 MATCH/one ASM. Document the remaining zero/sqrt allocation web, path pointer operands and packed-colour transport without claiming a compiler floor.","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T11:43:47Z","commit_sha":"b6432e7e039f2d6a98d49f3828775fb43492ec34","commit_message":"Recover camera distance fields and final reload phases\n\nA typed distance view and distinct clamp reload remove 0x28c/0x294 address CSE. Stage the path offset/quotient and chase scale snapshots in retail evaluation order. Guarded fnalign 73 -> 47, now 2320/2320 instructions and exact 0x360 frame; 63 MATCH/one ASM owner gate without sibling regressions.","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T11:31:49Z","commit_sha":"63946b5c0a7d95e677579a07abefecfbe82619f7","commit_message":"Order field camera distance and axis locals by captured FPR graph\n\nRetain the real scalar lifetimes and move only their declaration positions. Model reproduces the capture and predicts retail saved FPRs. Guarded fnalign 105 -> 73; owner verification 63 MATCH/one ASM, no sibling regressions.","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T11:30:12Z","commit_sha":"5713ccb21d9f9055aa3db9bdceeecc0556a1041c","commit_message":"Preserve field camera interpolation and wall evaluation phases\n\nMeasure complementary propagation-off/pullout-off settings, pointer-valued collision inputs, distinct easing reloads, and staged wall alignment scaling. Correct the wall dot-product evaluation order to the retail FPU sequence. Guarded fnalign 157 -> 105, 2321/2320 instructions. Owner verification remains 63 MATCH/one ASM without sibling regressions.","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T11:21:12Z","commit_sha":"7246436484f3c8961fc24c1af769760ee33a86f6","commit_message":"Restore field camera evaluation order and per-role lifetimes\n\nRecover typed frame snapshots and sibling-confirmed interleaved path arguments. Follow the captured allocation model for path-index declaration order and the independent follow-frame lifetime. Move axis snapshots to their actual evaluation phase and correct the dot-product accumulation order contradicted by retail. Guarded fnalign 229 -> 157; owner remains 63 MATCH/one ASM without regressions.","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T11:13:04Z","commit_sha":"debd2b5871358eac9b1df550258a15e085936b29","commit_message":"Recover field camera native vector copies\n\nUse real case 6/7 vector locals and assignments instead of struct casts over arrays. Both retail ld/sd triplet copies are recovered, with unchanged behaviour. Guarded fnalign 242 -> 229; owner verification 63 MATCH and one ASM, no sibling regressions.","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T11:10:21Z","commit_sha":"9c8c4283f5d63faf03e9ad7eb8386b1c7a4e315f","commit_message":"Recover field camera tolerance objects and retail frame\n\nReplace the decompiler's oversized matrix scratch with the actual 12-byte RwMatrixTolerance contract, keep fade colour separate, and order real stack objects by retail slots. Guarded fnalign 725 -> 242; frame 0x3c0 -> 0x360. Owner verification: 63 MATCH, one ASM, no sibling regressions. The changed extent corrects a decompiler type error; accessed data and camera behaviour are unchanged.","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T11:00:37Z","commit_sha":"1449d37268fa2b819c011553cae8d7c7ba2ad37c","commit_message":"Match field NPC AI 0017f490 (369 to 0 edits)\n\nRecover the selected-patrol-bounds lifetime across point clearing and the interpolation phase. Keep cursor before count per captured allocator evidence. Correct Ghidra's dot-product reassociation to retail Y-X-Z evaluation, retain aggregate snapshots, and use canonical symbols with real pointer call contracts. Remove the NONMATCHING fallback and register the required data symbols.\n\nScoped verification: 34 MATCH across k_fldAI and k_draw; eligibility blocking markers and unowned are empty with no unresolved symbols. Lint adds no findings; its sole H003 warning predates these changes.","measures":{"fuzzy_match_percent":74.89666,"total_code":4387560,"matched_code":3286136,"matched_code_percent":74.89666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9666,"matched_functions_percent":73.774994,"complete_code":2430768,"complete_code_percent":55.401363,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":518}},{"timestamp":"2026-10-12T10:48:52Z","commit_sha":"81ba326ed875d3f163dd9f4e79484a54cb63b041","commit_message":"Recover alternate patrol-bound index orientation (10 to 9 edits)","measures":{"fuzzy_match_percent":74.632645,"total_code":4387560,"matched_code":3274552,"matched_code_percent":74.632645,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9665,"matched_functions_percent":73.767365,"complete_code":2410464,"complete_code_percent":54.9386,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":517}},{"timestamp":"2026-10-12T10:46:22Z","commit_sha":"1761723cdc204407010cab4cf08f6d44d94eac3d","commit_message":"Correct marker constructor pointer contract (NPC AI 14 to 10 edits)","measures":{"fuzzy_match_percent":74.632645,"total_code":4387560,"matched_code":3274552,"matched_code_percent":74.632645,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9665,"matched_functions_percent":73.767365,"complete_code":2410464,"complete_code_percent":54.9386,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":517}},{"timestamp":"2026-10-12T10:43:00Z","commit_sha":"01dbdd225851540d406395fc171a673ed950c093","commit_message":"Recover NPC turn arithmetic operand order (17 to 14 edits)","measures":{"fuzzy_match_percent":74.632645,"total_code":4387560,"matched_code":3274552,"matched_code_percent":74.632645,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9665,"matched_functions_percent":73.767365,"complete_code":2410464,"complete_code_percent":54.9386,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":517}},{"timestamp":"2026-10-12T10:41:28Z","commit_sha":"b4aa686c9b42f1325e15bc2f8154d8de2f1bd5b7","commit_message":"Recover NPC speed-scaling operand order (23 to 17 edits)","measures":{"fuzzy_match_percent":74.632645,"total_code":4387560,"matched_code":3274552,"matched_code_percent":74.632645,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9665,"matched_functions_percent":73.767365,"complete_code":2410464,"complete_code_percent":54.9386,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":517}},{"timestamp":"2026-10-12T10:40:19Z","commit_sha":"8b2c82f31f06bb08305aecb6c1df10d370219562","commit_message":"Recover NPC object origin subobject arguments (27 to 23 edits)","measures":{"fuzzy_match_percent":74.632645,"total_code":4387560,"matched_code":3274552,"matched_code_percent":74.632645,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9665,"matched_functions_percent":73.767365,"complete_code":2410464,"complete_code_percent":54.9386,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":517}},{"timestamp":"2026-10-12T10:38:10Z","commit_sha":"020c95eb5b4424b9c64dbfd7ca488d2c2c00212a","commit_message":"Type NPC proximity matrix-position arguments (37 to 27 edits)","measures":{"fuzzy_match_percent":74.632645,"total_code":4387560,"matched_code":3274552,"matched_code_percent":74.632645,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9665,"matched_functions_percent":73.767365,"complete_code":2410464,"complete_code_percent":54.9386,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":517}},{"timestamp":"2026-10-12T10:33:37Z","commit_sha":"c11dd1e2cce1fba8071290d90c2c70fde261e308","commit_message":"Preserve whole NPC patrol-target snapshot (43 to 37 edits)","measures":{"fuzzy_match_percent":74.632645,"total_code":4387560,"matched_code":3274552,"matched_code_percent":74.632645,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9665,"matched_functions_percent":73.767365,"complete_code":2410464,"complete_code_percent":54.9386,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":517}},{"timestamp":"2026-10-12T10:29:56Z","commit_sha":"07b435ca8810b7003c41ad57441824623bfe6a8c","commit_message":"Split NPC facing phase locals using allocator evidence (52 to 43)","measures":{"fuzzy_match_percent":74.632645,"total_code":4387560,"matched_code":3274552,"matched_code_percent":74.632645,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9665,"matched_functions_percent":73.767365,"complete_code":2410464,"complete_code_percent":54.9386,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":517}},{"timestamp":"2026-10-12T10:28:14Z","commit_sha":"9b82973fb96c6ca88cb2cdfd57b8d3e7c6a2d2b5","commit_message":"Recover retail NPC facing dot accumulation (53 to 52 edits)","measures":{"fuzzy_match_percent":74.632645,"total_code":4387560,"matched_code":3274552,"matched_code_percent":74.632645,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9665,"matched_functions_percent":73.767365,"complete_code":2410464,"complete_code_percent":54.9386,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":517}},{"timestamp":"2026-10-12T10:27:19Z","commit_sha":"6d74822b23767aa5c8663bd0d1c723ef2fa0b98b","commit_message":"Restore retail NPC pursuit dot evaluation (96 to 53 edits)","measures":{"fuzzy_match_percent":74.632645,"total_code":4387560,"matched_code":3274552,"matched_code_percent":74.632645,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9665,"matched_functions_percent":73.767365,"complete_code":2410464,"complete_code_percent":54.9386,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":517}},{"timestamp":"2026-10-12T10:26:25Z","commit_sha":"0c8380be249a1c9964c6655e199fb7c5f870b395","commit_message":"Fix NPC patrol dot reassociation to retail MAC order (105 to 96)","measures":{"fuzzy_match_percent":74.632645,"total_code":4387560,"matched_code":3274552,"matched_code_percent":74.632645,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9665,"matched_functions_percent":73.767365,"complete_code":2410464,"complete_code_percent":54.9386,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":517}},{"timestamp":"2026-10-12T10:25:02Z","commit_sha":"304991d3b77c10dd1647d9f089fd96d0275a65a7","commit_message":"Recover NPC AI per-state vector frame order (369 to 105 edits)","measures":{"fuzzy_match_percent":74.632645,"total_code":4387560,"matched_code":3274552,"matched_code_percent":74.632645,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9665,"matched_functions_percent":73.767365,"complete_code":2410464,"complete_code_percent":54.9386,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":517}},{"timestamp":"2026-10-12T10:21:29Z","commit_sha":"40312314739b59e3d5aaeb340f328749cbae3658","commit_message":"Match field actor update func_0018a200","measures":{"fuzzy_match_percent":74.632645,"total_code":4387560,"matched_code":3274552,"matched_code_percent":74.632645,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9665,"matched_functions_percent":73.767365,"complete_code":2410464,"complete_code_percent":54.9386,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":517}},{"timestamp":"2026-10-12T10:13:03Z","commit_sha":"e81933885d499527ae514ef2dccc4db3009267b9","commit_message":"Recover field actor path and endpoint work lifetimes","measures":{"fuzzy_match_percent":74.48787,"total_code":4387560,"matched_code":3268200,"matched_code_percent":74.48787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9664,"matched_functions_percent":73.759735,"complete_code":2371408,"complete_code_percent":54.048447,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":516}},{"timestamp":"2026-10-12T10:10:58Z","commit_sha":"d42e785a31614764b77d74f25923c72a545113d7","commit_message":"Recover field actor typed oscillator work and allocation order","measures":{"fuzzy_match_percent":74.48787,"total_code":4387560,"matched_code":3268200,"matched_code_percent":74.48787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9664,"matched_functions_percent":73.759735,"complete_code":2371408,"complete_code_percent":54.048447,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":516}},{"timestamp":"2026-10-12T10:01:38Z","commit_sha":"2539971043dba626459b46e874433447de33af2e","commit_message":"Recover field actor signed side comparison lifetime","measures":{"fuzzy_match_percent":74.48787,"total_code":4387560,"matched_code":3268200,"matched_code_percent":74.48787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9664,"matched_functions_percent":73.759735,"complete_code":2371408,"complete_code_percent":54.048447,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":516}},{"timestamp":"2026-10-12T09:59:05Z","commit_sha":"aa959c16e9cd59162aba7df5431e4b094cb666ea","commit_message":"Recover field actor full width visibility role","measures":{"fuzzy_match_percent":74.48787,"total_code":4387560,"matched_code":3268200,"matched_code_percent":74.48787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9664,"matched_functions_percent":73.759735,"complete_code":2371408,"complete_code_percent":54.048447,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":516}},{"timestamp":"2026-10-12T09:57:28Z","commit_sha":"db99184308d57cc6bcd626126665cda0eecb430b","commit_message":"Recover field actor oscillator sampling address lifetime","measures":{"fuzzy_match_percent":74.48787,"total_code":4387560,"matched_code":3268200,"matched_code_percent":74.48787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9664,"matched_functions_percent":73.759735,"complete_code":2371408,"complete_code_percent":54.048447,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":516}},{"timestamp":"2026-10-12T09:56:41Z","commit_sha":"71a8c9de6bec67a95648bf30c7a9864f6e13073b","commit_message":"Recover field actor oscillator comparison lifetime","measures":{"fuzzy_match_percent":74.48787,"total_code":4387560,"matched_code":3268200,"matched_code_percent":74.48787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9664,"matched_functions_percent":73.759735,"complete_code":2371408,"complete_code_percent":54.048447,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":516}},{"timestamp":"2026-10-12T09:54:04Z","commit_sha":"1d9700d4be57d7b5aae45b34919dd00161f45300","commit_message":"Recover field actor constant sharing without address hoists","measures":{"fuzzy_match_percent":74.48787,"total_code":4387560,"matched_code":3268200,"matched_code_percent":74.48787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9664,"matched_functions_percent":73.759735,"complete_code":2371408,"complete_code_percent":54.048447,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":516}},{"timestamp":"2026-10-12T09:36:17Z","commit_sha":"6efb8908dd276001f49c1786776ad0505d76fbc5","commit_message":"Recover field actor pointer argument evaluation","measures":{"fuzzy_match_percent":74.48787,"total_code":4387560,"matched_code":3268200,"matched_code_percent":74.48787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9664,"matched_functions_percent":73.759735,"complete_code":2371408,"complete_code_percent":54.048447,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":516}},{"timestamp":"2026-10-12T09:24:05Z","commit_sha":"f2f32b69ebf85881c7f15be6c4127c7b2e211f52","commit_message":"Recover field actor vector and animation lifetimes","measures":{"fuzzy_match_percent":74.48787,"total_code":4387560,"matched_code":3268200,"matched_code_percent":74.48787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9664,"matched_functions_percent":73.759735,"complete_code":2371408,"complete_code_percent":54.048447,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":516}},{"timestamp":"2026-10-12T09:07:57Z","commit_sha":"7bb1ca065869e38d533febd84e3ed11804c9856d","commit_message":"Recover field actor spline constructor contract","measures":{"fuzzy_match_percent":74.48787,"total_code":4387560,"matched_code":3268200,"matched_code_percent":74.48787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9664,"matched_functions_percent":73.759735,"complete_code":2371408,"complete_code_percent":54.048447,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":516}},{"timestamp":"2026-10-12T08:51:57Z","commit_sha":"96205e68f670b5bc6882c28d942c2036f650b03f","commit_message":"Recover field actor per-phase lifetimes and call contracts","measures":{"fuzzy_match_percent":74.48787,"total_code":4387560,"matched_code":3268200,"matched_code_percent":74.48787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9664,"matched_functions_percent":73.759735,"complete_code":2371408,"complete_code_percent":54.048447,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":516}},{"timestamp":"2026-10-12T08:20:42Z","commit_sha":"f6ef88bfb1f757cb30a4ccdeb195f3ca7ce930ce","commit_message":"Recover field actor matrix initialization and selection","measures":{"fuzzy_match_percent":74.48787,"total_code":4387560,"matched_code":3268200,"matched_code_percent":74.48787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9664,"matched_functions_percent":73.759735,"complete_code":2371408,"complete_code_percent":54.048447,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":516}},{"timestamp":"2026-10-12T08:00:21Z","commit_sha":"42f549edc79dcf19c5839b00d0a1724b728faf8c","commit_message":"Preserve field resource publication value lifetimes","measures":{"fuzzy_match_percent":74.48787,"total_code":4387560,"matched_code":3268200,"matched_code_percent":74.48787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9664,"matched_functions_percent":73.759735,"complete_code":2371408,"complete_code_percent":54.048447,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":516}},{"timestamp":"2026-10-12T07:21:32Z","commit_sha":"52f6f0f4da93806b54d156ff42da647f529c65d7","commit_message":"Match message window selection procedure 0027f6f0","measures":{"fuzzy_match_percent":74.48787,"total_code":4387560,"matched_code":3268200,"matched_code_percent":74.48787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9664,"matched_functions_percent":73.759735,"complete_code":2371408,"complete_code_percent":54.048447,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":516}},{"timestamp":"2026-10-12T05:49:12Z","commit_sha":"7294c876c6b5f322ec1ddf0ede055fb66844e0f5","commit_message":"Recover typed minimap scans and trim dead m2c locals","measures":{"fuzzy_match_percent":74.29131,"total_code":4387560,"matched_code":3259576,"matched_code_percent":74.29131,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9663,"matched_functions_percent":73.7521,"complete_code":2337088,"complete_code_percent":53.266235,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":515}},{"timestamp":"2026-10-12T05:39:13Z","commit_sha":"8a5fe52a0d8b442ca51e9c02eb617cb34b0c0658","commit_message":"Refine minimap grid views and visibility row addresses","measures":{"fuzzy_match_percent":74.29131,"total_code":4387560,"matched_code":3259576,"matched_code_percent":74.29131,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9663,"matched_functions_percent":73.7521,"complete_code":2337088,"complete_code_percent":53.266235,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":515}},{"timestamp":"2026-10-12T05:25:10Z","commit_sha":"857307850cfd3e3531e0b44eaecc93a5559b910f","commit_message":"handoff: scan-pointer lever for unthreaded loop entries (00162e10)","measures":{"fuzzy_match_percent":74.29131,"total_code":4387560,"matched_code":3259576,"matched_code_percent":74.29131,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9663,"matched_functions_percent":73.7521,"complete_code":2337088,"complete_code_percent":53.266235,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":515}},{"timestamp":"2026-10-12T05:24:41Z","commit_sha":"f1b0fb3a35f967384ae2eb68e057a5cd5a212c15","commit_message":"00162e10: separate scan pointer for the node search (fnalign 2 -> 1)","measures":{"fuzzy_match_percent":74.29131,"total_code":4387560,"matched_code":3259576,"matched_code_percent":74.29131,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9663,"matched_functions_percent":73.7521,"complete_code":2337088,"complete_code_percent":53.266235,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":515}},{"timestamp":"2026-10-12T05:18:09Z","commit_sha":"9f7b99ce77de11630277f1f1ff5dd2d64053266a","commit_message":"Recover sprite record load ordering and signed border addresses","measures":{"fuzzy_match_percent":74.29131,"total_code":4387560,"matched_code":3259576,"matched_code_percent":74.29131,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9663,"matched_functions_percent":73.7521,"complete_code":2337088,"complete_code_percent":53.266235,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":515}},{"timestamp":"2026-10-12T05:06:13Z","commit_sha":"d13f8dc170aa2450a5ae60015750e893fb9c0b65","commit_message":"Preserve scalar controller flag and retail operand ordering","measures":{"fuzzy_match_percent":74.29131,"total_code":4387560,"matched_code":3259576,"matched_code_percent":74.29131,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9663,"matched_functions_percent":73.7521,"complete_code":2337088,"complete_code_percent":53.266235,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":515}},{"timestamp":"2026-10-12T04:56:38Z","commit_sha":"3a2bcd0d82e733de9649fccfece78b45b5854505","commit_message":"Reduce field-unit initializer residual with bounded hit count","measures":{"fuzzy_match_percent":74.29131,"total_code":4387560,"matched_code":3259576,"matched_code_percent":74.29131,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9663,"matched_functions_percent":73.7521,"complete_code":2337088,"complete_code_percent":53.266235,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":515}},{"timestamp":"2026-10-12T04:33:07Z","commit_sha":"d4722ee299bcca0331d6a6d61ff1a7a56babe9b7","commit_message":"handoff: checkpoint 6843/17 (after46, link50); build speed notes","measures":{"fuzzy_match_percent":74.29131,"total_code":4387560,"matched_code":3259576,"matched_code_percent":74.29131,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9663,"matched_functions_percent":73.7521,"complete_code":2337088,"complete_code_percent":53.266235,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":515}},{"timestamp":"2026-10-12T04:26:05Z","commit_sha":"58aaec6070cd9e9df7889f335ba4fe051010ae38","commit_message":"build: cut WSL launches and parallelize compiles/assembly\n\n- asm.py: map Windows paths to WSL locally (one wslpath per drive) and run\n  WSL tools through one persistent bash per thread; each WSL launch cost\n  about 1.2 s and every assemble paid several.\n- mwccgap assembler: same path mapping; the WSL probe is cached.\n- build.py: content-addressed cache for carved/SDK/data assembly\n  (build/cache/asm), the image read once, and eligibility, link compiles\n  and chunk assembly run on a thread pool (P4_BUILD_JOBS overrides).\n- build_cache.py: thread-unique temporary names and locked stats.\n\nMeasured: warm build 115 s, cold full recompile 599 s (was about 60 min);\nSLUS_217.82 and the ELF are byte-identical.","measures":{"fuzzy_match_percent":74.29131,"total_code":4387560,"matched_code":3259576,"matched_code_percent":74.29131,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9663,"matched_functions_percent":73.7521,"complete_code":2337088,"complete_code_percent":53.266235,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":515}},{"timestamp":"2026-10-12T02:29:50Z","commit_sha":"b7583e0a732f3dde4e5395b0022a0cfe1aeceed5","commit_message":"matching.md: opt_lifetimes splits are frontend locals numbered before codegen temporaries","measures":{"fuzzy_match_percent":74.29131,"total_code":4387560,"matched_code":3259576,"matched_code_percent":74.29131,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9663,"matched_functions_percent":73.7521,"complete_code":2337088,"complete_code_percent":53.266235,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":515}},{"timestamp":"2026-10-12T02:23:29Z","commit_sha":"5753d75c9b1fd2032e9aa178a6fa96573c0b6679","commit_message":"matching.md: peephole copy fold reaches only memory-address operands","measures":{"fuzzy_match_percent":74.29131,"total_code":4387560,"matched_code":3259576,"matched_code_percent":74.29131,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9663,"matched_functions_percent":73.7521,"complete_code":2337088,"complete_code_percent":53.266235,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":515}},{"timestamp":"2026-10-12T02:21:42Z","commit_sha":"051c6d66712128c4b32532141fbb10001cb2120d","commit_message":"matching.md: how b210 numbers locals (locals list, frontend temporaries at the tail, O1 behaviour)","measures":{"fuzzy_match_percent":74.29131,"total_code":4387560,"matched_code":3259576,"matched_code_percent":74.29131,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9663,"matched_functions_percent":73.7521,"complete_code":2337088,"complete_code_percent":53.266235,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":515}},{"timestamp":"2026-10-12T01:48:28Z","commit_sha":"0f9f3403b258613b9648e174d0d950ca08cc7eee","commit_message":"003694d0 MATCH: mode-1 pointer per retail, fn/fn2 assigned from D_00887300, tbl at the unk48/tail draws","measures":{"fuzzy_match_percent":74.29131,"total_code":4387560,"matched_code":3259576,"matched_code_percent":74.29131,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9663,"matched_functions_percent":73.7521,"complete_code":2337088,"complete_code_percent":53.266235,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":515}},{"timestamp":"2026-10-12T01:40:03Z","commit_sha":"adf4468fdf49f0e0ff8691eac27fefb893da6b0e","commit_message":"handoff: checkpoint 6842/18 (after45, link49)","measures":{"fuzzy_match_percent":74.18702,"total_code":4387560,"matched_code":3255000,"matched_code_percent":74.18702,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9662,"matched_functions_percent":73.74447,"complete_code":2331216,"complete_code_percent":53.1324,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":514}},{"timestamp":"2026-10-12T01:24:42Z","commit_sha":"ae0dc612dd553be49fdd21b3f40ce0950aaba0c1","commit_message":"00471370: opt_lifetimes on and per-role parent/animated locals (fnalign 27 -> 18)","measures":{"fuzzy_match_percent":74.18702,"total_code":4387560,"matched_code":3255000,"matched_code_percent":74.18702,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9662,"matched_functions_percent":73.74447,"complete_code":2331216,"complete_code_percent":53.1324,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":514}},{"timestamp":"2026-10-12T01:16:49Z","commit_sha":"6390b26e0c4e0adb0bc24f9e74acd72bac53818f","commit_message":"tools/spill_costs.py: explain b210 spill scores per reference; handoff for 004b8f40/003768e0/003599c0","measures":{"fuzzy_match_percent":74.18702,"total_code":4387560,"matched_code":3255000,"matched_code_percent":74.18702,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9662,"matched_functions_percent":73.74447,"complete_code":2331216,"complete_code_percent":53.1324,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":514}},{"timestamp":"2026-10-12T01:06:49Z","commit_sha":"7df3639f20630b2b66eadf69d49bca65b1fc8f02","commit_message":"003599c0 MATCH: panel width reads spelled index-first per site","measures":{"fuzzy_match_percent":74.18702,"total_code":4387560,"matched_code":3255000,"matched_code_percent":74.18702,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9662,"matched_functions_percent":73.74447,"complete_code":2331216,"complete_code_percent":53.1324,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":514}},{"timestamp":"2026-10-11T22:47:41Z","commit_sha":"8a9e07c8eac9879412b760060562727da42acb1e","commit_message":"003768e0 MATCH: time/step declared before opacity; gp floats 8308/8400/8408","measures":{"fuzzy_match_percent":74.07835,"total_code":4387560,"matched_code":3250232,"matched_code_percent":74.07835,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9661,"matched_functions_percent":73.73683,"complete_code":2284624,"complete_code_percent":52.07049,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":513}},{"timestamp":"2026-10-11T22:35:42Z","commit_sha":"a3d4c631167edba5e9ccbefab15acd8c256242fa","commit_message":"004b8f40 MATCH: midpoint row via effAfterOffsetPtr after the precomputed source offset","measures":{"fuzzy_match_percent":73.98317,"total_code":4387560,"matched_code":3246056,"matched_code_percent":73.98317,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9660,"matched_functions_percent":73.7292,"complete_code":2266208,"complete_code_percent":51.650757,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":512}},{"timestamp":"2026-10-11T22:28:58Z","commit_sha":"ff0dcc8cff8546a1afaee703e1888ba2b211d3ed","commit_message":"handoff: checkpoint 6839/21 (after44, link48)","measures":{"fuzzy_match_percent":73.80704,"total_code":4387560,"matched_code":3238328,"matched_code_percent":73.80704,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9659,"matched_functions_percent":73.72157,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T22:22:38Z","commit_sha":"ea99d010eef93e4d850031048965124db2aee515","commit_message":"handoff: 0047b0c0 MATCH lever; 00162e10/0048b340 probe notes","measures":{"fuzzy_match_percent":73.80704,"total_code":4387560,"matched_code":3238328,"matched_code_percent":73.80704,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9659,"matched_functions_percent":73.72157,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T21:51:04Z","commit_sha":"6d3b9e362cc43eff2cb67b5ec5a289f38bb77025","commit_message":"0047b0c0 MATCH: inline attachment allocation with table/size/count declared before payload","measures":{"fuzzy_match_percent":73.80704,"total_code":4387560,"matched_code":3238328,"matched_code_percent":73.80704,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9659,"matched_functions_percent":73.72157,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T21:40:42Z","commit_sha":"bd708e30cf432e857a93f6adfca64a18e6a30468","commit_message":"0017f490: near-player check passes the model call as an argument","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T21:37:36Z","commit_sha":"b55d763b5bfdc4353e22273224321c88899036da","commit_message":"handoff: per-role locals fix colouring in 0016bdd0; ternary clamp polarity; frame scoping notes","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T21:32:26Z","commit_sha":"f1ff8b6f589bf34a55ff958e9074801a54c42dfc","commit_message":"0016bdd0: real per-role locals declared before piVar1 (single webs); piVar1 now $s0","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T21:22:37Z","commit_sha":"e058f061be03a48dae7c49c7d76d968d04baa47e","commit_message":"0016bdd0: case 4 uses the shifted sv60.y/z (fix stale temporaries from the case 3/4 rewrite)","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T21:19:07Z","commit_sha":"c3e0c638133af5e9c22d656ea079b1b17f947b11","commit_message":"0016bdd0: easing clamp as (limit > f()) ? f() : limit","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T21:17:32Z","commit_sha":"33da9bb1974197fcc9d4b52b0c5b7edd454e38f2","commit_message":"0017f490: speed-limit operand load order","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T21:14:14Z","commit_sha":"c70295e94b1b5f77ee5b77bbfa1182157e1f45c5","commit_message":"0017f490: state 9 load order","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T21:13:52Z","commit_sha":"cbf19e06f11b6e92c3f9c14b1e0d3f412fc9ecac","commit_message":"0017f490: y reads via cast base","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T21:13:07Z","commit_sha":"a7833cdd915ebfb0e7f8b215181243353244a10a","commit_message":"001f14f0: two-label switch order","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T20:46:46Z","commit_sha":"cf0e9c90b7291414fa06aa7d7787f2121914b810","commit_message":"handoff: 0017f490 levers, 0018a200 CSE observation, 004a7830 colouring","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T20:40:12Z","commit_sha":"d2263f26b66d6f23db7e7f8ba19c86b3a188de47","commit_message":"0016bdd0: float field copies, final position struct copy","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T20:07:33Z","commit_sha":"ba7bc7006ff383f6718ef1552277d6d440a49f80","commit_message":"0017f490: toggle store and target copy","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T20:06:49Z","commit_sha":"60413f0ed2563afad20dce1864e179552eaa03c1","commit_message":"0017f490: state 10 clamp and steering order","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T19:48:14Z","commit_sha":"765fc75966ab420dd2e46b5bcd25ae5f0304ceb0","commit_message":"0017f490: state 9 steering order","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T19:45:31Z","commit_sha":"cedb6bf622ff80673f7f4090afd3aba7683988e7","commit_message":"0017f490: height table as 2D float array","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T19:44:53Z","commit_sha":"75570d968ede6c4121e8feb09171e360774b7ba3","commit_message":"0017f490: state 8 forward scaling and target copy","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T19:43:51Z","commit_sha":"7bff63e54adaa249f5a81732c9751207cce7b08c","commit_message":"0017f490: patrol-area exit tests on a stack position","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T19:43:09Z","commit_sha":"9cd8b18a21eb95b48ada0748ace109acee2054eb","commit_message":"0017f490: patrol toggle, height-offset targets","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-11T19:35:14Z","commit_sha":"b0ae839d1650d2adec49ceb71edabf477546f13a","commit_message":"tests: drop 00471370 source-text pins that broke CI as the NONMATCHING body evolved","measures":{"fuzzy_match_percent":73.68086,"total_code":4387560,"matched_code":3232792,"matched_code_percent":73.68086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9658,"matched_functions_percent":73.713936,"complete_code":2246480,"complete_code_percent":51.201122,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":511}},{"timestamp":"2026-10-10T18:39:16Z","commit_sha":"8ce8edfe0f03e741a1061f04cb22d534b2a3a301","commit_message":"handoff part 11: 004b8f40 levers","measures":{"fuzzy_match_percent":72.989815,"total_code":4387560,"matched_code":3202472,"matched_code_percent":72.989815,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9655,"matched_functions_percent":73.69104,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T18:38:58Z","commit_sha":"4bda7e5c495dafbc8afd320740bc47de6841bbbf","commit_message":"004b8f40: block-scope phase-C case-0 locals in retail colour order (fnalign 98 -> 69)","measures":{"fuzzy_match_percent":72.989815,"total_code":4387560,"matched_code":3202472,"matched_code_percent":72.989815,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9655,"matched_functions_percent":73.69104,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T18:30:40Z","commit_sha":"a60a19c6b990b43bfb3d10626d8489f6ef616ec6","commit_message":"004b8f40: block-scope phase-A locals, single-expression half offsets (fnalign 160 -> 98, registers only)","measures":{"fuzzy_match_percent":72.989815,"total_code":4387560,"matched_code":3202472,"matched_code_percent":72.989815,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9655,"matched_functions_percent":73.69104,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T18:18:28Z","commit_sha":"dfadbaba4e8179f4311d1120d3766adb699c60a8","commit_message":"004b8f40: tail copies with inline source; structure now identical to retail (fnalign 160, registers only)","measures":{"fuzzy_match_percent":72.989815,"total_code":4387560,"matched_code":3202472,"matched_code_percent":72.989815,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9655,"matched_functions_percent":73.69104,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T18:17:23Z","commit_sha":"b673ee0978e3d290a9aa01fd9608a867da5d3c38","commit_message":"004b8f40: func_004bc540 takes (work, side, t, out) - retail evaluates the float before the colour pointer at every call; opt_pulloutconstants off (fnalign 209 -> 178, struct 4)","measures":{"fuzzy_match_percent":72.989815,"total_code":4387560,"matched_code":3202472,"matched_code_percent":72.989815,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9655,"matched_functions_percent":73.69104,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T18:13:23Z","commit_sha":"bb642b5e46d2ebf6c6073ddc56f80b140d90c8be","commit_message":"004b8f40: vector struct copies, case-2 prologue order, counter-first loop increments (fnalign 279 -> 209)","measures":{"fuzzy_match_percent":72.989815,"total_code":4387560,"matched_code":3202472,"matched_code_percent":72.989815,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9655,"matched_functions_percent":73.69104,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T18:10:09Z","commit_sha":"9cd12400a9e434a0141f8777272637c9f5df8694","commit_message":"004b8f40: s32 wrap temp, dot/cube forms, bottom-tested strip loop (fnalign 484 -> 279)","measures":{"fuzzy_match_percent":72.989815,"total_code":4387560,"matched_code":3202472,"matched_code_percent":72.989815,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9655,"matched_functions_percent":73.69104,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T18:08:27Z","commit_sha":"6e291c851982dc4860e0664dcfa8cc12f83b2282","commit_message":"004b8f40: Bezier term order, strip side switch, cache update first, camera-target element reads (fnalign 643 -> 484)","measures":{"fuzzy_match_percent":72.989815,"total_code":4387560,"matched_code":3202472,"matched_code_percent":72.989815,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9655,"matched_functions_percent":73.69104,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T18:02:36Z","commit_sha":"c75218d7e879bbae8f5055c4137091ededc5b9e6","commit_message":"004b8f40: retail vec3 stack locals, struct copies and direct strip-loop field loads (fnalign 1040 -> 643)","measures":{"fuzzy_match_percent":72.989815,"total_code":4387560,"matched_code":3202472,"matched_code_percent":72.989815,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9655,"matched_functions_percent":73.69104,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T17:21:09Z","commit_sha":"1c2d6d94eb8472a2949226ebf703f35a1bbb2c42","commit_message":"004b8f40: switch dispatch and retail-order colour/clear/curve phases without the offset helper (fnalign 1262 -> 1040)","measures":{"fuzzy_match_percent":72.989815,"total_code":4387560,"matched_code":3202472,"matched_code_percent":72.989815,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9655,"matched_functions_percent":73.69104,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T17:09:46Z","commit_sha":"7cf85f5329b9bd38f33ef91c692f4b3d4abcfda7","commit_message":"handoff part 11: 00160880 match and the D_007643A4 link fix","measures":{"fuzzy_match_percent":72.989815,"total_code":4387560,"matched_code":3202472,"matched_code_percent":72.989815,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9655,"matched_functions_percent":73.69104,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T16:37:09Z","commit_sha":"e4b16bb30b66d5f948e9f695238e2991d1c7b22a","commit_message":"symbols: D_007643A4 (gp -0x4d4c) so code1_0016 links after the func_00160880 match","measures":{"fuzzy_match_percent":72.989815,"total_code":4387560,"matched_code":3202472,"matched_code_percent":72.989815,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9655,"matched_functions_percent":73.69104,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T15:50:27Z","commit_sha":"d1ae839d75d1d8c71d0b5c65ab02c08e3e114111","commit_message":"handoff part 11: inline-helper and struct probe results","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T15:45:32Z","commit_sha":"03b5f306aabd1c3b36d9279b1a44c931fb456a34","commit_message":"0046b380: border read through its own inline helper, evaluated before the extent subtraction (sdiff 38/81 -> 14/41)","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T15:37:22Z","commit_sha":"3930744330a55a1aa8185a1dee6fd012516f4ebb","commit_message":"handoff part 11: CSE-spelling, conversion-hoist and pressure levers","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T14:55:37Z","commit_sha":"c623f4d37630ea81d06b8172994bfa9c7f3b5b60","commit_message":"001265a0: load order and constant order fixes, pointer texture slot (sdiff 22/99 -> 16/89)","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T14:51:13Z","commit_sha":"1f79e998a0621b275251323f43d7e0062c70ecc8","commit_message":"001265a0: row offset evaluated before the field load (sdiff 24/101 -> 22/99)","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T14:45:23Z","commit_sha":"8f5cdc5bed206e1d1bec9d809fb48c4039818a44","commit_message":"00160880: integer row base, u32 reload in blend branch, > 255 clamps (sdiff 2/8)","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T14:41:30Z","commit_sha":"f480348fa8e957a2f79bbc7a2578676ed86800f3","commit_message":"00160880: rewrite from retail structure (fnalign 376 -> 20, sdiff 4/13)","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T14:21:36Z","commit_sha":"806dcb3f6bb98e55e5ec83c8b86d082e8334613f","commit_message":"001400f0: u8 radar-alpha prototypes, fillX read in loop (sdiff 40/45 -> 2/2)","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T13:48:09Z","commit_sha":"6b09aeeddb5bf020d675ef3af18b676354a128de","commit_message":"00320b80: mode as a spilled s32 local (no stack-slot helper), fnalign 13 -> 12","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T13:37:19Z","commit_sha":"236193f17f1b9d9c961d47def749f3d3bc726c61","commit_message":"handoff part 11: colouring evidence for 00162e10, 004a7830, 0048b340, 0014f310","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T13:16:18Z","commit_sha":"c3cfd435c3b27c6a44ccb1cfdaf0fd5c915aee40","commit_message":"00162e10: weekday test as == 1 { found = 0 } else scan, i before mtx (sdiff 4/86 -> 0/6)","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T12:56:34Z","commit_sha":"d589f9ad68d14001040262f34012028e7530f0dd","commit_message":"handoff part 11: round notes","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T12:55:04Z","commit_sha":"c748a454416d692ceff9101df6423bb68a5cf3f7","commit_message":"00162e10: u16 id before resource slot (sdiff 6/88 -> 4/86)","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T12:45:58Z","commit_sha":"659f4664367dae98ae4253e1c107f23d4b1ff417","commit_message":"001265a0: gp float constants as literals (fnalign 138 -> 130)","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T12:43:10Z","commit_sha":"537cee42a770637b6d34b3d9d23b58c66a8b9685","commit_message":"003768e0: taper step as -1/21 literal (fnalign 149 -> 127)","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T12:40:26Z","commit_sha":"b5d3b90cdc9795e3167ac3e1106bdea86d24f404","commit_message":"002b6ec0: u8 > 0 test, third block recompute (sdiff 17/110 -> 14/108)","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T12:05:46Z","commit_sha":"de5766eb6f17e71a3084bb1d23272faa88ffcb8b","commit_message":"handoff part 11: 001e9950 spill-set match","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T11:47:12Z","commit_sha":"56380beac17fc13df2f0c8d3262f0c17284fbb07","commit_message":"MATCH func_001e9950: s32 skill/kind, per-file s32 skill prototypes (retail passes $s2 unmasked), declaration order for retail's spill set, table read as (u8 *)table + outer * 2 - 2","measures":{"fuzzy_match_percent":72.92053,"total_code":4387560,"matched_code":3199432,"matched_code_percent":72.92053,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9654,"matched_functions_percent":73.68341,"complete_code":2142768,"complete_code_percent":48.83735,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":509}},{"timestamp":"2026-10-10T11:29:17Z","commit_sha":"600b605e9dd24c0bb0e98a12a77a0a2452a828fd","commit_message":"001e9950: kind s32 with per-branch s32 params, !(s16)kind test, func_00242800 takes kind (sdiff 39/68 -> 29/48)","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T10:46:10Z","commit_sha":"9f981fa0b51e88aca4928a7e88e95df6f712ada9","commit_message":"handoff part 11: evaluation-order levers","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T10:45:10Z","commit_sha":"b5c1fe66e23cf4ebb97bb9c0da6b661ba8aae090","commit_message":"002b6ec0: first draw block recomputes (s32)(u32)i * 0x100 (sdiff 19/126 -> 17/110)","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T10:40:34Z","commit_sha":"c79db7be90686794404e3301ce1e8d250866cda3","commit_message":"00162e10: per-block slot recompute forms, resource address after id call, single *cfg deref (sdiff 22/115 -> 6/88)","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T10:29:44Z","commit_sha":"88a2ddd503a2fd6aaed347b786cd6c099fd50940","commit_message":"0047b0c0: matrix loop test (u16)slot; secondary attachment table-first (sdiff 8/64 -> 6/60)","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T10:26:43Z","commit_sha":"531de8ba19ff9c3402d9405cac5b3293a45ccbc4","commit_message":"0047b0c0: index accessor for material/uv value reads (sdiff 14/70 -> 10/66)","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T10:25:58Z","commit_sha":"214598d3fae3f904a083693532037a3b4911de46","commit_message":"0047b0c0: inline setters for the clip and start-frame stores (sdiff 20/81 -> 14/70)","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T10:24:33Z","commit_sha":"e8209164acbd3742dd4f78095880f08ce3a4383e","commit_message":"0047b0c0: entry accessor for startFrame stores, count-first material bound (sdiff 22/88 -> 20/81)","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T10:17:03Z","commit_sha":"d9c14d7b9509198923359a78590cdd9283a8e3b1","commit_message":"0046b380: table-first record reads at three sites (fnalign 102 -> 81)","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T10:11:13Z","commit_sha":"2adf9cc8860771987dc27d3237a7064feb15529c","commit_message":"0046b380: record macro index-first with u32 operands (fnalign 116 -> 102)","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T10:07:38Z","commit_sha":"42c289a868a41a1ecc85e6fd79bb4d391d034b16","commit_message":"0046b380: probe-able; raster base and record field address orders; helper border reads recompute the record address (fnalign 202 -> 116)","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T09:54:29Z","commit_sha":"5fc6d59cbecbc95df259cefa5aa74b130ec2a7e7","commit_message":"handoff part 11: link gate, 0047b0c0/001400f0/0014f310 notes","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T09:44:28Z","commit_sha":"740e2a1605de63d52a856beefadfcadc905bdd67","commit_message":"0014f310: all resource checks through the inline readiness helper","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T09:36:53Z","commit_sha":"fd0cfa9379c88b657a33359147f2ec91426d5d5e","commit_message":"Conversion lever: 001f14f0 567->563, 0017f490 919->913, 004b8f40 1269->1262, 001a7720 1279->1267","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T08:36:22Z","commit_sha":"c5412664c39bccdb857fcf22deadd42a3bd07720","commit_message":"Conversion lever: 003599c0 429->384, 001f14f0 603->567, 001a59a0 651->642","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T08:24:07Z","commit_sha":"5a17e8352b6b45f7c0a1538054556b800383290f","commit_message":"Conversion lever: 001265a0 160->138, 00160880 379->376","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T07:52:15Z","commit_sha":"9c698e53273670a538eb6587c983ef8b1368d218","commit_message":"0047b0c0: signed loop compares, element-relative animation field (sdiff 29/103 -> 22/88)","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T07:25:26Z","commit_sha":"0a0dee4a43050642462037aa8bdf7078f573ea28","commit_message":"00283490 links again: fGpffff names for the literal pool, iGpffffa78c curated (lost TU)","measures":{"fuzzy_match_percent":72.88662,"total_code":4387560,"matched_code":3197944,"matched_code_percent":72.88662,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9653,"matched_functions_percent":73.67577,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T06:29:49Z","commit_sha":"c9928672f624795086586b273e8800de4102f818","commit_message":"MATCH func_0036ee60: (s32)bCount keeps bCount below cIdx so cIdx wins the spill tie","measures":{"fuzzy_match_percent":72.76883,"total_code":4387560,"matched_code":3192776,"matched_code_percent":72.76883,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9652,"matched_functions_percent":73.668144,"complete_code":2107312,"complete_code_percent":48.029247,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":508}},{"timestamp":"2026-10-10T06:15:04Z","commit_sha":"ce6195de7266f60e0455245265762d8b0518a327","commit_message":"002ac750: commutative operand order (344 -> 343)","measures":{"fuzzy_match_percent":72.73564,"total_code":4387560,"matched_code":3191320,"matched_code_percent":72.73564,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9651,"matched_functions_percent":73.66051,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T06:10:38Z","commit_sha":"a6975aaa5a70dc92691c961ed09961116d9538fa","commit_message":"Lever battery: 004b8f40 1297->1269, 001a7720 1346->1279, small gains on 001f14f0/001a59a0","measures":{"fuzzy_match_percent":72.73564,"total_code":4387560,"matched_code":3191320,"matched_code_percent":72.73564,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9651,"matched_functions_percent":73.66051,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T05:16:07Z","commit_sha":"ea19c5b1d1cffe917a19048016e74e73941973a2","commit_message":"Lever battery on large bodies: 00471370 672->542, 001f14f0 687->604, 001a59a0 696->652, 00183b80 770->617, 0018a200 826->814","measures":{"fuzzy_match_percent":72.73564,"total_code":4387560,"matched_code":3191320,"matched_code_percent":72.73564,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9651,"matched_functions_percent":73.66051,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T05:01:39Z","commit_sha":"8023c9fdeceded63993c1934ebb6227b8f250509","commit_message":"Lever battery: 002ac750 358->344, 003599c0 450->429, 003768e0 165->149, 003694d0 37->34","measures":{"fuzzy_match_percent":72.73564,"total_code":4387560,"matched_code":3191320,"matched_code_percent":72.73564,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9651,"matched_functions_percent":73.66051,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T04:27:25Z","commit_sha":"22d83ebe0af20b409e67fc2e7764ccdcbeedd349","commit_message":"Local integer types and decl scope: 001e9950 92->85, 001d8010 91->77, 003768e0 168->165","measures":{"fuzzy_match_percent":72.73564,"total_code":4387560,"matched_code":3191320,"matched_code_percent":72.73564,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9651,"matched_functions_percent":73.66051,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T04:10:11Z","commit_sha":"2c9abf0c518db904cfa53722871c7dbcd6d3852a","commit_message":"handoff: 0019c0d0 MATCH (6831/6860), gates","measures":{"fuzzy_match_percent":72.73564,"total_code":4387560,"matched_code":3191320,"matched_code_percent":72.73564,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9651,"matched_functions_percent":73.66051,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T03:22:06Z","commit_sha":"7c21595c55595f45817ef09e5955ce88ef33ebf8","commit_message":"MATCH func_0019c0d0: literal 1/255 pool constant, default optimisation, function-scope v41/chk, integer-cast slot address","measures":{"fuzzy_match_percent":72.73564,"total_code":4387560,"matched_code":3191320,"matched_code_percent":72.73564,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9651,"matched_functions_percent":73.66051,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T03:15:11Z","commit_sha":"3b04399e21e9ec7e444fe0aa02ef07c6d4daaef0","commit_message":"handoff part 10: literal pools, slti $at compares, cast pointers","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T03:13:31Z","commit_sha":"e5575148ec9ff788238d3c2e74c418d8da70b62a","commit_message":"001d8010: int swap flags as retail (two byte masks gone)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T03:08:44Z","commit_sha":"299b94e897c940f7fee26bbfabd25a231ac4552a","commit_message":"gp pool floats as literals: 0027f6f0 106->104, 002b6ec0 161->155, 0016bdd0 1516->1515","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T02:58:31Z","commit_sha":"046fc20c8be59cbcb05c95f7f824533eae222a01","commit_message":"0019c0d0: literal 1/255 scale and default optimisation (222 -> 10)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T02:53:47Z","commit_sha":"cd2f445f73c38b7eaf21a755bd5364ddc7d02aef","commit_message":"Comparison constants in retail form: 001265a0 162->160, 001a7720 1358->1346","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T02:48:31Z","commit_sha":"72f7a81a922f9cee37bc59a6e1d67d43f331703a","commit_message":"Range tests in retail slti $at form: 00160880 383->379, 001f14f0 689->687, 001a59a0 709->696","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T02:45:53Z","commit_sha":"fe8f474e97ea943a81239c05d9e2b53c0a00154d","commit_message":"001265a0: retail slti $at range-test forms, fade fraction (199 -> 162)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T02:26:48Z","commit_sha":"5383f052f65bb22b44010fe61daa2c4a030efe7c","commit_message":"001265a0: integer-cast function table pointer (209 -> 199)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T02:25:59Z","commit_sha":"f5026fe90997e39fde1598c864598a1617dd68b5","commit_message":"001265a0: record blocks as 0x28-byte array elements, fnTable per call pair (261 -> 209)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T02:25:07Z","commit_sha":"0a94a06a23bab0bc655d2f4bd4140c80abe589b4","commit_message":"Classify Sony crt0 _start (0x00100008) as vendor code; first-party 6830/6860","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":870,"complete_units":507}},{"timestamp":"2026-10-10T02:06:23Z","commit_sha":"b86198acd99afd5996d9c73f9753b81c20dc8d46","commit_message":"0027f6f0: colour locals copied through an address-taking helper (133 -> 106)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:56:46Z","commit_sha":"d8cbbab9389d8421b79509de9f0578e4c95269c7","commit_message":"0017f490: retail branch order for five delay tests and three flags (1018 -> 919)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:54:35Z","commit_sha":"8677377ee55306d685416944b687c18e7e7d5bbd","commit_message":"0017f490: patrol target pick rebuilt from retail (1018 -> 973)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:53:32Z","commit_sha":"724b9cac34164ce31112eafb48cb05bdee07b4b0","commit_message":"0017f490: sibling availability idiom, float accumulator field (1048 -> 1018)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:51:11Z","commit_sha":"7278d56df873d9998d8a1747da444d08a4c0641b","commit_message":"001265a0: CSE-shared function table (262 -> 261); handoff part 8 levers","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:50:03Z","commit_sha":"6009cae3a96daed8cbf074a59ca98558ef9f7aca","commit_message":"001265a0: fade texture lookup in the call, scroll delta first (285 -> 262)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:49:01Z","commit_sha":"4511a469791c8156f2d0c6872d32c1aa043883c9","commit_message":"001265a0: inline alpha bytes (298 -> 285)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:47:59Z","commit_sha":"a53d14de66d692cbca7fb03facac4211cac3f8d6","commit_message":"001265a0: model slot member, direct u8 alphas (316 -> 298)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:46:59Z","commit_sha":"2dc8a1d4302a3d2abe907fd48d7e7a82a491d00b","commit_message":"func_00126090: floats first (retail caller order); 001265a0 324 -> 316","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:46:36Z","commit_sha":"2c89b7029cda55a6c28963df6cce7b23f8049d4b","commit_message":"001265a0: declaration order and clamp form (342 -> 324)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:43:30Z","commit_sha":"2e3870f049672018d709be5a0fb16f9f1202078f","commit_message":"001265a0: glow blend reads the right sinf result; split fade scale (349 -> 342)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:41:55Z","commit_sha":"068f4b04ed80c18bae05c6e5d1900c0c6be99d5a","commit_message":"001265a0: rectangles through a returning copy inline (409 -> 349)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:40:36Z","commit_sha":"678751b5794026486ed5714aac7dd0739efca012","commit_message":"001265a0: int abs prototype, scroll target shift restored, inline size conversion (423 -> 409)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:37:58Z","commit_sha":"14f482268790d018e9e2f6440ae636a61fef8129","commit_message":"001265a0: func_00126090 receives retail's three zero floats (429 -> 423)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:36:21Z","commit_sha":"98a0f31861ae169067047022d5f34560450c8720","commit_message":"001265a0: palette-glow draws in the matched func_00124f70 shape (842 -> 429)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:35:25Z","commit_sha":"e0e94e9dde4b17269320efb73ded5f03947b6cb2","commit_message":"001265a0: colour channels via titlePaletteChannel, drop m2c ACC temporaries (1401 -> 842)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:34:14Z","commit_sha":"f9dcdfbdd8a28b8259697b5dff556971e22d101a","commit_message":"001265a0: fade fractions first, alpha conversions inside the draw calls (1469 -> 1401)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:32:26Z","commit_sha":"5a6a2374833eab7c14526d1fee995ac0adb9a545","commit_message":"001265a0: direct float->u8 alphas, per-call alpha conversion, drop redundant locals (1512 -> 1469)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:30:47Z","commit_sha":"579e451d3a16ce5cb1117634594489d39a4201e6","commit_message":"001265a0: task fields as TitleTaskView members (1618 -> 1512)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:29:22Z","commit_sha":"b51c074136f15ef81545887e71e8942811d489be","commit_message":"001265a0: default CSE/propagation; sprite pointer via TitleTaskView member, void * blend state (1665 -> 1618)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:18:03Z","commit_sha":"e79527d124f996e4ab2fcbda6596ab50e7ca8358","commit_message":"handoff: 001265a0 levers (placeholders, intermediate locals, saved-register locals, propagation)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:15:23Z","commit_sha":"d12b6b4703887d3bef8d372b1cb8c735869aa64b","commit_message":"001265a0: for loops, task pointer first, progressive colour packing (1848 -> 1665)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:09:48Z","commit_sha":"cd688f6c677ba566253272285c906e4549f841bc","commit_message":"001265a0: fnTable pointer and title position locals as retail's s1/f20/f21 (1891 -> 1848)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:05:47Z","commit_sha":"df98e1a8f0a1c9b78d276a8dec05ed5aec856476","commit_message":"001265a0: record id converts after the from-field loads (1897 -> 1891)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T01:04:19Z","commit_sha":"7535db84cb51b0a499fdb6432501f96373a838fb","commit_message":"001265a0: opt_propagation off, hoisted glow ids/from fields, direct float->u8 colours (2595 -> 1897)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:59:48Z","commit_sha":"509519da5809d4958d55520e7d257b75cb69cd51","commit_message":"001265a0: white colour local in s2 as retail; float alpha conversion (2951 -> 2595, prologue matches)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:53:24Z","commit_sha":"467d6a80a49ecd9fe18cca9d86e86caf2b377d38","commit_message":"001265a0: drop m2c int round trips on sinf results and the gp angle","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:52:29Z","commit_sha":"238f030a2036ebbd564383f07f415ae02c69a103","commit_message":"001265a0: rebuild all m2c placeholder expressions from retail; saved FPRs now f20-f24 as retail","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:49:56Z","commit_sha":"9a5e2526adc3669c74216b31eaf34971020e84a2","commit_message":"001265a0: real lerp arguments for the palette-glow calls (replaces m2c placeholders reading stale temps)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:39:22Z","commit_sha":"6060adb33586be8112f9625f9b80d2dda61f9c59","commit_message":"001265a0: sp694 colour intermediate (2550 -> 2452)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:38:42Z","commit_sha":"7d17cd2bf03df028d4298b510cfee6f17105a4b2","commit_message":"001265a0: colour constants through TitleDrawColor locals; frame now retail's 0x6C0 (2604 -> 2550)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:37:30Z","commit_sha":"131febf1495211052dc21a49c3af3706d276bfe7","commit_message":"001265a0: opt_common_subs off with rectangle temporaries (3071 -> 2604)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:36:30Z","commit_sha":"60620a99e2c679cf6548f2d7e4a9e93141c3785c","commit_message":"001265a0: rectangle copies through TitleRect locals (frame 0x510 -> 0x6D0, retail 0x6C0)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:31:58Z","commit_sha":"9f07a67a413ee3e7b65bc61808336075ae22b3cf","commit_message":"001265a0: absolute D_005E538C/D_005E53B4 (retail relocation form)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:26:23Z","commit_sha":"5b5ea0fe8bd1450dbed56fe14279cd56d6b9b1eb","commit_message":"Absolute D_ objects for retail %hi/%lo globals: 0018a200 847->826, 0016bdd0 1518->1516, 0017f490 1071->1048","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:24:28Z","commit_sha":"c1a96533b6c2e6250d9c33303fee3098e3924ce9","commit_message":"0017f490, 0018a200: raw addresses replaced by retail relocation symbols","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:23:27Z","commit_sha":"6f68a33a90a0268cbd54e51d154900379762acbb","commit_message":"0016bdd0: axis table as retail's absolute D_007565xx objects","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:22:16Z","commit_sha":"6313c714584c0d80aa73aa70718d7dda4877446f","commit_message":"0016bdd0 1543->1516, 0017f490 1073->1069: bit copies as float copies, more struct copies","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:19:22Z","commit_sha":"1aa8ae8fdf2d4ca124a84f995d8c5a8d864ca5f3","commit_message":"0016bdd0: negate-then-scale push vectors (1572 -> 1543)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:18:41Z","commit_sha":"1b837286df974e548500202b3bdaeb33f512aa56","commit_message":"0016bdd0: push-out block per IDA, segment struct pair, negate-then-scale (1686 -> 1572)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:15:43Z","commit_sha":"02c9ce45ed36ac0334ac32dd6d859fce7840687c","commit_message":"0016bdd0: normalize calls take the vector base (1688 -> 1686)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:14:24Z","commit_sha":"2322b4f6d171e293b0ad6e68bcab384ea549cf17","commit_message":"0016bdd0: struct stores into the 0x2B0 vector (1724 -> 1688)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:13:33Z","commit_sha":"0be81e92d7d73776dcc3624b0533fbe1042924f6","commit_message":"handoff: Ghidra-body audit levers","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:13:14Z","commit_sha":"f333ea35e90650e26b8f3404cb5baaaa2956d7d9","commit_message":"0017f490: colour struct copy, zero-alpha conversion (1094 -> 1073)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:11:16Z","commit_sha":"a031426297704f4480e1eb36e584c355e42bec9e","commit_message":"Struct-copy vectors: 0016bdd0 1727->1724, 0018a200 868->845","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:09:30Z","commit_sha":"622f6b3f485939d27d96ddd91f91ef73100efa17","commit_message":"0016bdd0: vector copies as struct copies (2517 -> 1727)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:08:10Z","commit_sha":"861b601f27041d5e38ef6cc51456783d3c7d3f14","commit_message":"0017f490: position copies as FldAIVec3 struct copies (1161 -> 1094)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:05:28Z","commit_sha":"066b95a802d527f8f411578b271a2bc479520e3e","commit_message":"0017f490: int delay field (1171 -> 1161)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:04:28Z","commit_sha":"b9d0df044e626c2635e2d2019d530e710410fcaf","commit_message":"0016bdd0: int key searches with break (2548 -> 2517)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-10T00:02:08Z","commit_sha":"ffe14243c23816eec5f1c612a97a281b15d16f8b","commit_message":"0016bdd0: float loads, case 3/4 tail from IDA control flow (2621 -> 2548)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T23:59:52Z","commit_sha":"fd433151436676261c9fc583493728c7613ee980","commit_message":"0016bdd0: float fields stored as floats, not int casts (structural 1139 -> 1068)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T23:56:05Z","commit_sha":"82f2aed25beb2fbdb6bb4d18d6ec5a082ceeb7ec","commit_message":"0017f490, 0016bdd0: address-taken stack vectors as arrays (restores stores b210 dropped from the split scalars)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T23:52:15Z","commit_sha":"fd1603c04ee7d2b6db06612da97d95148819379c","commit_message":"0017f490: int visibility flag (1155 -> 1152)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T23:49:12Z","commit_sha":"1a4391efe887632164a28a5841477d63b905498d","commit_message":"0017f490: unsigned mode byte (1160 -> 1155)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T23:47:26Z","commit_sha":"53f977cc17fffddd63ce5ca4303fadc6b973f83c","commit_message":"Port 1009 worktree bodies: 003694d0 49->37, 001a7720 1486->1358, 00162e10 156->139","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T23:43:34Z","commit_sha":"302f9189152d0a2e383d56ee0eae05362de53cc0","commit_message":"001f14f0: case order in remap (691 -> 689)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T23:41:49Z","commit_sha":"c5faf5b84d178af4f76fa1a2511c100eaac5ab4e","commit_message":"001f14f0: func_0023e6f0 u16 prototype (694 -> 691)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T23:41:11Z","commit_sha":"4591beebe5895259b7408dd053f174bbc896e7d7","commit_message":"001f14f0: u16 callee prototypes with retail evidence (705 -> 694)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T23:36:42Z","commit_sha":"86aeb0a20e72190babdd7c43cfc7244873b93121","commit_message":"001f14f0: result remap switch, u16 special, !-form test (721 -> 705)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T23:31:50Z","commit_sha":"ea276e018c63d0a7ae4dc5dbc4c3a8cd7039f4a3","commit_message":"0014f310: port 1009 worktree body (64 -> 53)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T23:28:42Z","commit_sha":"b21e45bb24052eea864b98c2dd23f85a87292113","commit_message":"00162e10: unit-table accessor (159 -> 156)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T23:26:29Z","commit_sha":"af835815a44b8b7d8067ca76e91db59362af39e0","commit_message":"handoff: part 6 (001fd790 match, ported bodies, residual models)","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T23:17:17Z","commit_sha":"a9d3921369643c8382634301cc6dec1f1d4dcd67","commit_message":"Port improved guarded bodies from the 1009 worktree: 0036ee60 25->1, 0048b340 24->9, 003694d0 135->49, 001d8010 105->87, 0018a200 901->868, 00183b80 787->770, 003599c0 490->450, 001e9950 95->92, 00160880 387->383","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T22:50:13Z","commit_sha":"00363dee2c2f0939b1aba40ff732c59266f35fda","commit_message":"Match func_001fd790 (EPL unit RGBA fade): ported from the parallel agent's worktree","measures":{"fuzzy_match_percent":72.64885,"total_code":4387560,"matched_code":3187512,"matched_code_percent":72.64885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9650,"matched_functions_percent":73.65288,"complete_code":2098784,"complete_code_percent":47.834877,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":507}},{"timestamp":"2026-10-09T22:14:40Z","commit_sha":"5db8e41fd5a0329abcc1bc1020fcbbc22b6255ba","commit_message":"003599c0: absolute palette byte objects (491 -> 490)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T20:02:13Z","commit_sha":"dad4c326193ac7e479dfa774980289e503ee544e","commit_message":"004b8f40: stack slot grouped into an f32 array (1368 -> 1297)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T20:00:19Z","commit_sha":"a2f7fa59c3cd02902c6d51029ee16e3e00aa06d2","commit_message":"0018a200: stack floats grouped into vec locals (969 -> 901)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T19:57:51Z","commit_sha":"8f3f98c80cdb07ada0b1117e8f4c00a74e4f1a47","commit_message":"00471370: frame layout of the vector group (841 -> 739); tools/frameslots.py","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T19:17:20Z","commit_sha":"f696e2650c661cde87cf72145a107e68e60bfeb5","commit_message":"002b6ec0: base before offset (163 -> 161)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T19:13:40Z","commit_sha":"6bbe5f218b49f7ddb4987d9f96e280ea1e4df6a8","commit_message":"matching.md: multiscore","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T19:13:06Z","commit_sha":"0be91357fe64cbe106d77983e6e6a48c4c1aa85d","commit_message":"tools: multiscore (many candidate copies per compile, ~10x faster scoring)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T18:19:16Z","commit_sha":"2bd7bd96613435aefe2ce819e6e79235442caf86","commit_message":"003768e0: pointer steps in for headers (182 -> 168)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T18:15:55Z","commit_sha":"bb8c96cfcc4ea6e370210e2e82f06b9620742ba1","commit_message":"handoff: 001d8010 progress","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T18:15:16Z","commit_sha":"90b2ea6b4c3a6d956ffff4383181cfd57ac14ac0","commit_message":"001d8010: shared next-index sum (structure 88 -> 37)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T18:14:09Z","commit_sha":"f9f7a8eb713519440077442c4c1ced02fe18a639","commit_message":"001d8010: dot term order (105 -> 101)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T18:13:33Z","commit_sha":"596453925937171483f45b3c8e80bdf539645028","commit_message":"001d8010: masked neighbour picks, depth decl order (123 -> 105)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T18:12:48Z","commit_sha":"74d22d191b1901c9916a17ed7598aa4d53fb8a12","commit_message":"001d8010: cam local in case 4/5 (172 -> 123)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T18:12:19Z","commit_sha":"6c7e88b406d8d3d7b196c974be9ba6d04deb8a5a","commit_message":"001d8010: for-break depth walk, declaration order (185 -> 172)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T18:10:35Z","commit_sha":"7154ee8ce490563c78b0787d3d3c7f33b605d824","commit_message":"001d8010: (u16)i gather index (199 -> 185)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T18:09:53Z","commit_sha":"933a19a1787362137d4ddc17c5e4a9cc7fe28fa5","commit_message":"001d8010: search loops (235 -> 199)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T18:09:06Z","commit_sha":"2bcd38d57ba11f0742b88fcb8abf110176258892","commit_message":"001d8010: unmasked idx store frees a saved register (346 -> 235)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T18:08:23Z","commit_sha":"2ab926dd9a7dd5fc05a6c7991831f8d0f43b16e0","commit_message":"001d8010: call order, sort compare forms (367 -> 346)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T18:05:59Z","commit_sha":"ececc4217d6fa5c6829e667baba17209eff08f74","commit_message":"001d8010: ternary selection, for-break search, unmasked wrap index (457 -> 367)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T18:03:57Z","commit_sha":"ccec611fe362603b3bee37ecc9d831a0938c8997","commit_message":"001d8010: array order and plain scratch views (495 -> 457)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T18:02:57Z","commit_sha":"70778099abc0ca53f669455f5ee112f13e48cf9d","commit_message":"001d8010: u16 mode, ordered remap switch, <= 1 count test (511 -> 495)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T16:02:34Z","commit_sha":"895e4a0b2bd5a00da3b416a7254bde5d3d93e33f","commit_message":"handoff: variable-choice results","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T16:01:38Z","commit_sha":"070d0149fb700acaee4f5cb0eff3decf6d700fd2","commit_message":"varchoice: else-chain and goto-loop liveness checks","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T15:52:29Z","commit_sha":"222db581bb033871a1d0de38febcdb7ef012a0d0","commit_message":"0048b340: last-node pointer lives in dst1 (54 -> 24)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T15:27:40Z","commit_sha":"85d372e25109aa45b10a6edc51b45e3809d15971","commit_message":"00283490: variable choice for two loop values (67 -> 56)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T14:33:08Z","commit_sha":"a345899ddc7073d5d982909286cc7e79a22c385a","commit_message":"matching.md: variable-choice and O1 declaration-order levers","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T14:32:47Z","commit_sha":"87eedb34a51fb172b1f8860b52ae43a9c688422b","commit_message":"tools: sdiff (structural diff), fnside (side-by-side), varchoice (variable-choice moves)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T14:32:23Z","commit_sha":"31db79ae50b3c561ef85660d61d36e3c53f60760","commit_message":"handoff: 00263cb0 MATCH, 6,829/32","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T14:01:59Z","commit_sha":"2714379d728d4ed8e706d320b6e9f17db29c85a9","commit_message":"func_00263cb0: MATCH (case 7 day loop keeps the date in temp_20 and the column in var_2)","measures":{"fuzzy_match_percent":72.59926,"total_code":4387560,"matched_code":3185336,"matched_code_percent":72.59926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9649,"matched_functions_percent":73.64525,"complete_code":2081344,"complete_code_percent":47.43739,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":506}},{"timestamp":"2026-10-09T13:39:00Z","commit_sha":"d5bf8f1f063da58831e3650974852e280cad6128","commit_message":"0027f6f0: assignment-in-test (135 -> 133); handoff notes","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T13:38:05Z","commit_sha":"894fe68cbec1e27cc029ff192b1f967c71a1c138","commit_message":"0027f6f0: declaration climb (155 -> 135)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T13:15:24Z","commit_sha":"1be39eb28465609d6055b3b9420fb5bb68c4760f","commit_message":"00160880: guarded byte-clear helper (401 -> 387)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T13:12:42Z","commit_sha":"591721db3d5de5efbd321d4235ff0e566b87dfbd","commit_message":"0027f6f0: element pointers in the corner loops (270 -> 155)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T13:02:52Z","commit_sha":"94090fe0509c3dc347dc9d3581b58f4b1b459fb0","commit_message":"0014f310: idx*4 then += base (65 -> 64)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T13:02:03Z","commit_sha":"9d6b1c4b03401f2b940ecd82e4fd8b1dbb977eb0","commit_message":"handoff: part 4 (0014f310 513 -> 65, loop conversions)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T12:43:07Z","commit_sha":"84e9ba328d4befde2c0fc63cd061792c9db28242","commit_message":"0014f310: list walker declaration order (70 -> 65)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T12:41:45Z","commit_sha":"8833ba599df1fa60801037dd40d115944d66987d","commit_message":"001a59a0, 001a7720: while loops for m2c label loops","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T12:41:05Z","commit_sha":"782513d4ded9ef122b93a67496c85946155e9c06","commit_message":"002ac750: while loops for m2c label loops (431 -> 358)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T12:39:57Z","commit_sha":"82268aa33ba0dc425c143de6b6ecdfc949a51f4a","commit_message":"0014f310: local and declaration fixes (86 -> 70)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T12:38:12Z","commit_sha":"eab31ad77475951c3da073914925a8d7eb50d7db","commit_message":"0014f310: call-order and prototype fixes (116 -> 86)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T12:34:49Z","commit_sha":"e04d611b10669ac6cd0ebc92d11acb958e45057a","commit_message":"0014f310: table-copy declaration order (132 -> 116)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T12:34:28Z","commit_sha":"d113cb51fd13fd1f9fc0249eee1d0ead86749c33","commit_message":"0014f310: in-test header reads for the frame lists (155 -> 132)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T12:33:18Z","commit_sha":"297a45a793c4dd3a25960ed6e21665b9fedd7c1b","commit_message":"0014f310: shared exit, retail state-machine shape, load order (194 -> 155)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T12:30:34Z","commit_sha":"2736bbee7ca5f6e8a43c4e1515063fb74e3a87a6","commit_message":"0014f310: array indexing, grid sums, pending counters, frame-slot order (219 -> 194)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T12:27:19Z","commit_sha":"385e8f2313017d6643485c72bca5d1d25003a51f","commit_message":"0014f310: hoisted table addresses in the copy loops (260 -> 219)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T12:23:05Z","commit_sha":"1152829aa3f4c506494812879ddae7c33e6c38a5","commit_message":"0014f310: loop-test pointer reads, u8 grid stores, register-ordered declarations (378 -> 260)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T12:19:02Z","commit_sha":"6f4dbe2875bcfb8a4b05291dbfe6d95b8565926f","commit_message":"0014f310: structured loops for the grid searches and HBN reads (513 -> 378)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T12:08:42Z","commit_sha":"e4c1ed2e27ae3172797a945871ebd6f26f2f2989","commit_message":"handoff: 0036ee60, 00183b80","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T11:58:24Z","commit_sha":"87bf70a22d6c69a07c919010d01588da0ed9f6c9","commit_message":"0036ee60: cIdx index copy, cIdx spilled as in retail (36 -> 25)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T11:52:00Z","commit_sha":"55cc1d896c20a2a4f06b65fb6d0f2d2287c6e359","commit_message":"00183b80: inline pure base expressions (826 -> 787)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T11:46:40Z","commit_sha":"027e009a28674230528cb78c4b93941d38fb24a3","commit_message":"handoff: 00320b80 at 13","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T11:45:56Z","commit_sha":"d2c58e93e4212eb646b79fb54083aa26ce5d32a5","commit_message":"00320b80: function-scope col copy keeps the per-iteration extension (21 -> 13)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T11:44:01Z","commit_sha":"ae9726e251918d39b22a3f90a2b42063b5d80596","commit_message":"handoff: 00320b80 findings","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T11:33:20Z","commit_sha":"74b7e95b1dbc3df052413738d2e9889bec8d5cc6","commit_message":"handoff: 001fd790 model","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T11:28:13Z","commit_sha":"e1732f873fb9c59053589e2fbbbf06e005128f5c","commit_message":"handoff: 004a7830 model, 002ac750","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T11:19:25Z","commit_sha":"50772e0f0f932019f0147bf4f8a33f1a1d24544e","commit_message":"002ac750: fold pure m2c temporaries, share disjoint locals (679 -> 431)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T10:36:52Z","commit_sha":"cb86bd225a188bdc010e67cb2ff3afd42d7064eb","commit_message":"003694d0: declaration climb (138 -> 135)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T09:08:49Z","commit_sha":"b6007c3881189a70b21e81d9c6521eb4a10350f8","commit_message":"0046b380: u8 colour helper channels (208 -> 202)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T09:05:53Z","commit_sha":"1b42efcf4c5915ab6bbdbebccd74d2aaac433587","commit_message":"handoff: 0046b380 measurable, 208","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T09:05:19Z","commit_sha":"992c91e1a60e4841d82dfe1aff483ffa9558fd52","commit_message":"0046b380: retail's uninitialised uv/z reads, raster guards removed (830 -> 208)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T08:59:43Z","commit_sha":"e8dca799f53158681ede8fdee70670f837e77d9c","commit_message":"handoff: 6,828/33 after 00490c40","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T08:57:15Z","commit_sha":"3db1199037e18b9a5549acfa002b5df272066be2","commit_message":"matching.md: spill tie-break lever","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T08:35:59Z","commit_sha":"3de8ac642767cf1aa156b64d5c755e6766fe1772","commit_message":"Match func_00490c40 (particle emitter update)","measures":{"fuzzy_match_percent":72.505905,"total_code":4387560,"matched_code":3181240,"matched_code_percent":72.505905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9648,"matched_functions_percent":73.63761,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T08:32:58Z","commit_sha":"cf51e17ad3dad3a1b5eb5748a189e828266b3f93","commit_message":"00490c40: swayBase declared last, named trail index, u8 burst copy (45 -> 25)","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T08:16:46Z","commit_sha":"4e2323655d7697ec093035d3165882be1602c3ae","commit_message":"handoff: 001400f0 findings","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T08:14:02Z","commit_sha":"d71ccc31ca32f72b5f231109b7c1cfc4daf9f31b","commit_message":"fnalign: write the spliced scratch source as bytes (CRLF files with continued macros compiled with doubled line endings)","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T08:10:53Z","commit_sha":"fb472bfe6ff36c1a10123f68c43cb23cf3b6a5cd","commit_message":"003694d0: fn after the 0x58 state set (139 -> 138)","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T08:09:24Z","commit_sha":"99acd908cee912fedd4b72de500d147bacc36f5b","commit_message":"handoff: 003694d0, 003768e0 progress","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T08:07:09Z","commit_sha":"98c21831fdc9165a32fe26066b5ed9a84f20e7ae","commit_message":"003768e0: trail sums from sample fields (264 -> 182)","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T07:47:47Z","commit_sha":"8552b84176642d84581abd2671ae8d4b97f5cc86","commit_message":"003768e0: length before rgba in the prototype (retail parameter copy order)","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T07:43:09Z","commit_sha":"707fdad53aa44e770a86473e452c3ef29c057450","commit_message":"matching.md: surviving-copy lever","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T07:42:20Z","commit_sha":"69ad7fb9e7b51ce3338f63d2018476f93538e070","commit_message":"003694d0: table copy survives while tbl is live (192 -> 139)","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T07:41:27Z","commit_sha":"7eae9d3dfa85608c58a747b4a3c9a9dbd69ba206","commit_message":"003694d0: not-and DC test, unk48 switch (195 -> 192)","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T07:34:00Z","commit_sha":"c129cc737f1f684fa019077f0415ff615cd28c7d","commit_message":"handoff: part 3 progress list","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T07:30:53Z","commit_sha":"13cc10f140303b1719e4a5c207fafa51cc9c55fe","commit_message":"001e9950: outer-loop spelling (98 -> 95)","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T07:07:21Z","commit_sha":"658fae5ad9cffa94068b295f9364d26bfe6a1d74","commit_message":"0027f6f0 (295 -> 270), 003599c0 (498 -> 491): shared locals","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T06:22:56Z","commit_sha":"ed5461445d5679bc4a39dc499d59ec816cd3a53c","commit_message":"0047b0c0 (271 -> 226), 00263cb0 (16 -> 5): guarded-body improvements","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T06:06:21Z","commit_sha":"c7da8bc81c32056824a9ebe7f6a6adab6e5e79d1","commit_message":"handoff: 001ed700 match, 6,827/34; 00263cb0 16 -> 5","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T05:38:16Z","commit_sha":"b7b4dcf8219903b1278ef98428e6bdd249e7ba3f","commit_message":"matching.md: 001ed700 levers; 0036ee60 compare order (38 -> 36)","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T05:33:18Z","commit_sha":"29cc214f75dcb5f27852168e7e62eb7cf6f1605c","commit_message":"code1_001e: replace stale 001ed700 measurements with the match note","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T05:33:07Z","commit_sha":"6c9eb8fd2db19857d06538439c468a715f053468","commit_message":"Match func_001ed700 (field corner layout)","measures":{"fuzzy_match_percent":72.44683,"total_code":4387560,"matched_code":3178648,"matched_code_percent":72.44683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9647,"matched_functions_percent":73.62998,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T05:29:29Z","commit_sha":"620499f4850f2ae0bce9732084579643811ab8de","commit_message":"001ed700: $at compares, entry += 8 argument, list-pointer reuse (80 -> 5)","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T05:13:13Z","commit_sha":"9e3c612e093ed2802f407cb8106a227412a249e0","commit_message":"001ed700: read the list head before the z copy (103 -> 80)","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T05:10:17Z","commit_sha":"66eb5965c3012c7a859c212db55940083cf8a751","commit_message":"handoff: part 3 findings (00263cb0, 0036ee60, 004a7830, 0048b340)","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T05:02:07Z","commit_sha":"bd72505cf8006ef7e687e331de9207189d7367fb","commit_message":"0036ee60: read nA directly (45 -> 38)","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T04:55:56Z","commit_sha":"78687968ef26daa87d5dd5e48f09f284fc74478d","commit_message":"00263cb0: inline the day-column product (18 -> 16, case 8 exact)","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T04:38:31Z","commit_sha":"0b5c3126004e1880c2c6934891b411461382a16f","commit_message":"handoff: October 9 part 3 guarded-body progress","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T04:31:47Z","commit_sha":"4e71ec2d976f7d6c7e5ea4efdb2523e6f8c093a6","commit_message":"matching.md: share-locals lever with liveness caveat","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T04:19:06Z","commit_sha":"a50cdb587ac28681798c366f939328f96a980fc7","commit_message":"00263cb0 (48 -> 18) and 00283490 (75 -> 67): share locals with disjoint live ranges","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T01:59:14Z","commit_sha":"5e48c5d33d7feee756a973adf9ab4ca89a0934ed","commit_message":"001ed700: corner loop reuses group (119 -> 103)","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T01:38:04Z","commit_sha":"f059480775b80f1db886a271a0a52748d84e6002","commit_message":"001ed700 guarded body: best-block, tail loops and declaration climb (217 -> 119)","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T01:25:24Z","commit_sha":"dd2d637de9fbdabc1b1ef485458b8bd97f4ed777","commit_message":"001ed700 guarded body: switch corners, struct-copied position pairs (457 -> 217)","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T01:22:02Z","commit_sha":"b5db24faa11bec8fc44b79a65ef399724e46eb10","commit_message":"matching.md: where daddiu constant loads come from","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T01:11:21Z","commit_sha":"5021a5f101b7b421827ca5843deca58b659694fd","commit_message":"Handoff: CSE gating investigation","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T01:08:32Z","commit_sha":"b14fe2dc7fe63addd5bf9487fb0ceb42767467c4","commit_message":"0047b0c0 guarded body: capacity init and layerResource local (277 -> 271)","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T00:55:45Z","commit_sha":"340470f0770be74c3f4328e524551fe6b7cd032a","commit_message":"001400f0 guarded body: (u8)(u32) radar alpha (56 -> 51)","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-09T00:54:08Z","commit_sha":"5094666e4d9fe6dcf9ea7213ea7ba4d478f36b3b","commit_message":"crt0 note: asm-function route blocked by MWCC asm (no %hi/%lo)","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-08T21:33:02Z","commit_sha":"c13e18ee5e72ad9339cb781f402ee7c1abdc4b4c","commit_message":"Handoff: 6826/35, 004b6030, verify-after-pragma-removal note","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-08T20:56:56Z","commit_sha":"35b62b7aeda62a2179594a4205c4309496506da9","commit_message":"004b6030: restore required opt_loop_invariants/opt_lifetimes pragmas (measured)","measures":{"fuzzy_match_percent":72.3841,"total_code":4387560,"matched_code":3175896,"matched_code_percent":72.3841,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9646,"matched_functions_percent":73.622345,"complete_code":2046176,"complete_code_percent":46.635853,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":505}},{"timestamp":"2026-10-08T20:50:04Z","commit_sha":"5ec1e410268a8ced408ca8d63873e1316c7bad48","commit_message":"Docs: $2 quad-copy, FPR declaration-order and hoist-naming levers; handoff 6825/36","measures":{"fuzzy_match_percent":72.33269,"total_code":4387560,"matched_code":3173640,"matched_code_percent":72.33269,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9645,"matched_functions_percent":73.614716,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T20:44:38Z","commit_sha":"8f6e835cb1243e739d742d4c8d9911e32a381d6f","commit_message":"Match 00497ce0: $2 quad carries, saved-register declaration order, explicit -1 hoist","measures":{"fuzzy_match_percent":72.33269,"total_code":4387560,"matched_code":3173640,"matched_code_percent":72.33269,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9645,"matched_functions_percent":73.614716,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T20:41:58Z","commit_sha":"96ea44e79afe4b8c1d77417c2e6017cdfe58c965","commit_message":"Match 0048cdf0: port from func_0048d8c0, FPR colour order by declaration, quad copies through $2","measures":{"fuzzy_match_percent":72.27762,"total_code":4387560,"matched_code":3171224,"matched_code_percent":72.27762,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9644,"matched_functions_percent":73.607086,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T20:12:14Z","commit_sha":"f390e57ae7d3616ed7bc9dcd6c8448aaa8c61f14","commit_message":"Match 00485630, 00485870, 0048d8c0: quad copies through $2 as retail (user-approved H009 waiver)","measures":{"fuzzy_match_percent":72.21818,"total_code":4387560,"matched_code":3168616,"matched_code_percent":72.21818,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9643,"matched_functions_percent":73.59945,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T19:41:36Z","commit_sha":"f24906e6b697b07642d28b0d38dcc050267a137c","commit_message":"0016bdd0: func_003bb5b0 float time argument","measures":{"fuzzy_match_percent":72.13431,"total_code":4387560,"matched_code":3164936,"matched_code_percent":72.13431,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9640,"matched_functions_percent":73.57655,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T19:41:02Z","commit_sha":"1f7863769fa888b336d3262a87e808c0be1aa17c","commit_message":"0016bdd0 guarded body: float field reads and RwMatrixRotate argument order per retail (1792 -> 1637)","measures":{"fuzzy_match_percent":72.13431,"total_code":4387560,"matched_code":3164936,"matched_code_percent":72.13431,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9640,"matched_functions_percent":73.57655,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T19:39:48Z","commit_sha":"842833abd48857367dd9c66f0010984d93821c37","commit_message":"001265a0 guarded body: restore dropped MAC expressions from retail (3340 -> 3069)","measures":{"fuzzy_match_percent":72.13431,"total_code":4387560,"matched_code":3164936,"matched_code_percent":72.13431,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9640,"matched_functions_percent":73.57655,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T19:34:50Z","commit_sha":"ddc8fbcecb9a80dfda826c57573edaa309d40b54","commit_message":"001265a0 guarded body: plain unsigned casts (3424 -> 3340), note missing MAC expressions","measures":{"fuzzy_match_percent":72.13431,"total_code":4387560,"matched_code":3164936,"matched_code_percent":72.13431,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9640,"matched_functions_percent":73.57655,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T19:33:52Z","commit_sha":"591e6987c64a1cacb9cade9ef4980365dabbbd4f","commit_message":"0017f490 guarded body: plain unsigned casts, CSE on (1795 -> 1218)","measures":{"fuzzy_match_percent":72.13431,"total_code":4387560,"matched_code":3164936,"matched_code_percent":72.13431,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9640,"matched_functions_percent":73.57655,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T19:32:41Z","commit_sha":"5c860b4d03bcc5aba270db266e3b61892fc57454","commit_message":"0018a200 guarded body: float stores and float call arguments per retail","measures":{"fuzzy_match_percent":72.13431,"total_code":4387560,"matched_code":3164936,"matched_code_percent":72.13431,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9640,"matched_functions_percent":73.57655,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T19:15:11Z","commit_sha":"4ce81fe0ee8d5cf5b09c36195f4606cf4708705d","commit_message":"Docs: 00260600 match, counts 6820/41","measures":{"fuzzy_match_percent":72.13431,"total_code":4387560,"matched_code":3164936,"matched_code_percent":72.13431,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9640,"matched_functions_percent":73.57655,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T19:14:53Z","commit_sha":"f69ca18138b64ae3443120516e26172172fdaecf","commit_message":"00183b80 guarded body: switch dispatch, fabsf clamps, product order (879 -> 826)","measures":{"fuzzy_match_percent":72.13431,"total_code":4387560,"matched_code":3164936,"matched_code_percent":72.13431,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9640,"matched_functions_percent":73.57655,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T19:11:13Z","commit_sha":"b67fd9d5c83ef884210135699be572fe8740caf8","commit_message":"00471370 guarded body: retail angle-limit tests (856 -> 841 edits)","measures":{"fuzzy_match_percent":72.13431,"total_code":4387560,"matched_code":3164936,"matched_code_percent":72.13431,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9640,"matched_functions_percent":73.57655,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T19:10:26Z","commit_sha":"f82587a838611e4e125519f662a49000131b4cc0","commit_message":"Match func_00260600: struct point tables, retail argument order, loop conversion in place","measures":{"fuzzy_match_percent":72.13431,"total_code":4387560,"matched_code":3164936,"matched_code_percent":72.13431,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9640,"matched_functions_percent":73.57655,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T19:03:46Z","commit_sha":"7985c2678b0c3a5e328cd104a489309ec66c13b9","commit_message":"Docs: 0027d970 match, guarded-body audit lever, counts 6819/42","measures":{"fuzzy_match_percent":72.08544,"total_code":4387560,"matched_code":3162792,"matched_code_percent":72.08544,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9639,"matched_functions_percent":73.568924,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T18:49:09Z","commit_sha":"3705b6f5e4b5132b235d6a5d8bdda75544fe1158","commit_message":"003599c0 guarded body rewritten without m2c temporaries (598 -> 498 edits)","measures":{"fuzzy_match_percent":72.08544,"total_code":4387560,"matched_code":3162792,"matched_code_percent":72.08544,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9639,"matched_functions_percent":73.568924,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T18:41:44Z","commit_sha":"b0e8fe4c7a6dd1e584ef4326e85474589beb9421","commit_message":"Match func_0027d970: retail constants, struct table copies, inline search and readiness helpers","measures":{"fuzzy_match_percent":72.08544,"total_code":4387560,"matched_code":3162792,"matched_code_percent":72.08544,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9639,"matched_functions_percent":73.568924,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T18:36:28Z","commit_sha":"6adf41031e96014499e3b9d34a750a5c8f7436f4","commit_message":"0027d970 guarded body checked against retail: 510 -> 189 edits","measures":{"fuzzy_match_percent":71.92243,"total_code":4387560,"matched_code":3155640,"matched_code_percent":71.92243,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9638,"matched_functions_percent":73.56129,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T18:28:06Z","commit_sha":"7e42d23f929472151a4d7d38cefbb23f0dbf65b7","commit_message":"0027f6f0 guarded body: 331 -> 301 edits via multi-definition locals","measures":{"fuzzy_match_percent":71.92243,"total_code":4387560,"matched_code":3155640,"matched_code_percent":71.92243,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9638,"matched_functions_percent":73.56129,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T18:18:52Z","commit_sha":"ad9f1ba91a8c1acf123e08b683e2de2d355825c2","commit_message":"Guarded improvements from block-declaration climbs: 0047b0c0 378 -> 277, 003768e0 270 -> 265","measures":{"fuzzy_match_percent":71.92243,"total_code":4387560,"matched_code":3155640,"matched_code_percent":71.92243,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9638,"matched_functions_percent":73.56129,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T18:04:24Z","commit_sha":"6b569f84b9652554c22c89d654c9a8bdc0829275","commit_message":"Guarded improvements: 00283490 82 -> 75 (shared depthColor), 001400f0 63 -> 56 (block declaration order)","measures":{"fuzzy_match_percent":71.92243,"total_code":4387560,"matched_code":3155640,"matched_code_percent":71.92243,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9638,"matched_functions_percent":73.56129,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T17:55:55Z","commit_sha":"3318beed5a9bd87e3cf761bda4b34654f051255e","commit_message":"00162e10 guarded body: word-aligned matrix copy (173 -> 159 edits)","measures":{"fuzzy_match_percent":71.92243,"total_code":4387560,"matched_code":3155640,"matched_code_percent":71.92243,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9638,"matched_functions_percent":73.56129,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T17:53:36Z","commit_sha":"73e2910d50f0981fd8dab6eb2896e9d8cdf04b21","commit_message":"Docs: 00282250 match, second-definition lever, October 9 counts","measures":{"fuzzy_match_percent":71.92243,"total_code":4387560,"matched_code":3155640,"matched_code_percent":71.92243,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9638,"matched_functions_percent":73.56129,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T17:31:36Z","commit_sha":"f5162eaffb40f5766ebefd11356a19529dc66b8c","commit_message":"Match func_00282250: keep retail's early locals with second definitions","measures":{"fuzzy_match_percent":71.92243,"total_code":4387560,"matched_code":3155640,"matched_code_percent":71.92243,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9638,"matched_functions_percent":73.56129,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T17:24:27Z","commit_sha":"780d50e53f1d973715119b1309f33cf8c18cf032","commit_message":"Rewrite 0019c0d0's guarded body from retail (1021 -> 222 edits); climb 00160880 and 001ed700 declarations","measures":{"fuzzy_match_percent":71.83236,"total_code":4387560,"matched_code":3151688,"matched_code_percent":71.83236,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9637,"matched_functions_percent":73.55366,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T17:10:50Z","commit_sha":"848e56f54bc8897810bacdd78568d1f5e350f38c","commit_message":"Document the one-element copy and load-local levers; October 9 handoff","measures":{"fuzzy_match_percent":71.83236,"total_code":4387560,"matched_code":3151688,"matched_code_percent":71.83236,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9637,"matched_functions_percent":73.55366,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T17:07:54Z","commit_sha":"fb2562194e2fcff8701811833550f6372c9f1c63","commit_message":"Lower 00263cb0's guarded body to 48 edits: keep retail's load variables","measures":{"fuzzy_match_percent":71.83236,"total_code":4387560,"matched_code":3151688,"matched_code_percent":71.83236,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9637,"matched_functions_percent":73.55366,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T16:03:28Z","commit_sha":"2512f560cc08eb621c67112f79e5d780359c914a","commit_message":"Match func_004aed70: one-element array copies keep the life reload","measures":{"fuzzy_match_percent":71.83236,"total_code":4387560,"matched_code":3151688,"matched_code_percent":71.83236,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9637,"matched_functions_percent":73.55366,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T06:47:04Z","commit_sha":"357ce1dea77cd36fd6e2497d53105d9946b2034d","commit_message":"Clear 002b6ec0's queue count before the counter (guarded, 163 edits)","measures":{"fuzzy_match_percent":71.787506,"total_code":4387560,"matched_code":3149720,"matched_code_percent":71.787506,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9636,"matched_functions_percent":73.54602,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T06:45:01Z","commit_sha":"f0158d76ea6bab945683f7c7472ba18354beac6d","commit_message":"Rewrite 002b6ec0's guarded body from retail asm (164 edits)","measures":{"fuzzy_match_percent":71.787506,"total_code":4387560,"matched_code":3149720,"matched_code_percent":71.787506,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9636,"matched_functions_percent":73.54602,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T06:35:25Z","commit_sha":"b5abe111dc50f100f43586ec4eb5b5c2cdaf9a52","commit_message":"Record 00282250's expression-propagation finding","measures":{"fuzzy_match_percent":71.787506,"total_code":4387560,"matched_code":3149720,"matched_code_percent":71.787506,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9636,"matched_functions_percent":73.54602,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T06:30:56Z","commit_sha":"ad857bb60a51820cac19f204413f9067a46cfbfa","commit_message":"Rework 003694d0's colour copies and alpha conversions (guarded, 195 edits)","measures":{"fuzzy_match_percent":71.787506,"total_code":4387560,"matched_code":3149720,"matched_code_percent":71.787506,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9636,"matched_functions_percent":73.54602,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T06:28:04Z","commit_sha":"2a04af727e7c676a327e10d4a967bb4a81fe3072","commit_message":"Copy 004aed70's position as a block so the call reloads life (guarded, 8 edits)","measures":{"fuzzy_match_percent":71.787506,"total_code":4387560,"matched_code":3149720,"matched_code_percent":71.787506,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9636,"matched_functions_percent":73.54602,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T06:24:59Z","commit_sha":"a52331f115bec7c62e04ce7123eb82fb4a1fab22","commit_message":"Rewrite 0047b0c0 chunk dispatch as a switch (guarded, 378 edits)","measures":{"fuzzy_match_percent":71.787506,"total_code":4387560,"matched_code":3149720,"matched_code_percent":71.787506,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9636,"matched_functions_percent":73.54602,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T06:21:49Z","commit_sha":"74ec2a19ddb29ca5a464d504d9d87c16decb3f75","commit_message":"Record the October 8 guarded improvements and blockers","measures":{"fuzzy_match_percent":71.787506,"total_code":4387560,"matched_code":3149720,"matched_code_percent":71.787506,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9636,"matched_functions_percent":73.54602,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T06:11:22Z","commit_sha":"6ba7e830d20855b116be527f29f4c5caf5dfcc7f","commit_message":"Reorder 0036ee60 guarded declarations (45 edits)","measures":{"fuzzy_match_percent":71.787506,"total_code":4387560,"matched_code":3149720,"matched_code_percent":71.787506,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9636,"matched_functions_percent":73.54602,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T05:52:23Z","commit_sha":"daf7bb9290ec7f87a88a96e09c99aab470b881e3","commit_message":"Rework 0027f6f0's guarded booleans, counters and call arguments (331 edits)","measures":{"fuzzy_match_percent":71.787506,"total_code":4387560,"matched_code":3149720,"matched_code_percent":71.787506,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9636,"matched_functions_percent":73.54602,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T05:33:39Z","commit_sha":"dffb670e927982bd788dcefc45bccfa4c6edc692","commit_message":"Reorder 00263cb0's guarded declarations (75 edits)","measures":{"fuzzy_match_percent":71.787506,"total_code":4387560,"matched_code":3149720,"matched_code_percent":71.787506,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9636,"matched_functions_percent":73.54602,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T05:14:16Z","commit_sha":"32ad40e2b593eded9f00b787182449b288b4fde0","commit_message":"Keep source-bound recovery tests valid after Field promotion\n\nExtract bounded Field witnesses through lexical function boundaries, retain mutation controls, and require the promoted C owner through the existing link floor. Keep the frozen guarded replay explicitly historical. Use the existing guarded-region parser for Model tests so an internal pragma pop cannot truncate the fallback.\n\nValidated 879 tests (two absent-middleware skips), full production build/verifier/progress and both retail hashes; all prior matches retained. No production source changes.","measures":{"fuzzy_match_percent":71.787506,"total_code":4387560,"matched_code":3149720,"matched_code_percent":71.787506,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9636,"matched_functions_percent":73.54602,"complete_code":2041360,"complete_code_percent":46.52609,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":504}},{"timestamp":"2026-10-08T03:55:46Z","commit_sha":"ed8113fa1d9aae4622609fa17dee52018aad70e4","commit_message":"Document the reassignment CSE lever and inline by-value parameter copies","measures":{"fuzzy_match_percent":71.665344,"total_code":4387560,"matched_code":3144360,"matched_code_percent":71.665344,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9634,"matched_functions_percent":73.53076,"complete_code":2003952,"complete_code_percent":45.673496,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":502}},{"timestamp":"2026-10-08T03:53:52Z","commit_sha":"75f49b54d11d16c713a9fabbdd11469f26a680ae","commit_message":"Recover guarded Field movement semantics with bounded replay","measures":{"fuzzy_match_percent":71.665344,"total_code":4387560,"matched_code":3144360,"matched_code_percent":71.665344,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9634,"matched_functions_percent":73.53076,"complete_code":2003952,"complete_code_percent":45.673496,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":502}},{"timestamp":"2026-10-08T03:36:17Z","commit_sha":"6c2d2eb1df6e7e0abe437ced073fd8cf39eeab85","commit_message":"Match func_00222210 through a by-value logo title helper","measures":{"fuzzy_match_percent":71.665344,"total_code":4387560,"matched_code":3144360,"matched_code_percent":71.665344,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9634,"matched_functions_percent":73.53076,"complete_code":2003952,"complete_code_percent":45.673496,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":502}},{"timestamp":"2026-10-08T03:07:31Z","commit_sha":"e9d98e0cee63689771be610b9ab67acd522b8275","commit_message":"Record the latest guarded improvements in the handoff","measures":{"fuzzy_match_percent":71.6008,"total_code":4387560,"matched_code":3141528,"matched_code_percent":71.6008,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9633,"matched_functions_percent":73.523125,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T03:06:55Z","commit_sha":"958ffe27ad6a7d28e37c4da202b152977b095e66","commit_message":"Rewrite 00162e10's guarded body from retail asm (180 edits)","measures":{"fuzzy_match_percent":71.6008,"total_code":4387560,"matched_code":3141528,"matched_code_percent":71.6008,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9633,"matched_functions_percent":73.523125,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T02:56:58Z","commit_sha":"1cddedae5a892ab7e44a9e4afa424d913e9c4b87","commit_message":"Restructure 00263cb0's guarded body to retail's instruction count (102 edits)","measures":{"fuzzy_match_percent":71.6008,"total_code":4387560,"matched_code":3141528,"matched_code_percent":71.6008,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9633,"matched_functions_percent":73.523125,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T02:52:26Z","commit_sha":"189dbe4a9257270547c5fa01b02cc38f7eb4a2c6","commit_message":"Read 004b6030's memcpy sizes as u32 (guarded, 23 edits)","measures":{"fuzzy_match_percent":71.6008,"total_code":4387560,"matched_code":3141528,"matched_code_percent":71.6008,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9633,"matched_functions_percent":73.523125,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T02:51:26Z","commit_sha":"a3f4b12a66ddcdbfe79fe0360cfbc1152b4e7131","commit_message":"Inline 00260600's y-size conversions (guarded, 243 edits)","measures":{"fuzzy_match_percent":71.6008,"total_code":4387560,"matched_code":3141528,"matched_code_percent":71.6008,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9633,"matched_functions_percent":73.523125,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T02:49:37Z","commit_sha":"f652c0662abc8cdfd0b39987f8f3e23003d678e8","commit_message":"Convert 00260600's colour argument to u32 in the guarded body (261 edits)","measures":{"fuzzy_match_percent":71.6008,"total_code":4387560,"matched_code":3141528,"matched_code_percent":71.6008,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9633,"matched_functions_percent":73.523125,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T02:37:52Z","commit_sha":"4fb54170bc1f583daf795fca7d7f575417b55796","commit_message":"List this session's guarded improvements in the handoff","measures":{"fuzzy_match_percent":71.6008,"total_code":4387560,"matched_code":3141528,"matched_code_percent":71.6008,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9633,"matched_functions_percent":73.523125,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T02:37:10Z","commit_sha":"b4bb5089c74130d6d61ea6a2d1649d96073c7fe5","commit_message":"Port 00283490 onto its matched calendar sibling (guarded, 485 edits)","measures":{"fuzzy_match_percent":71.6008,"total_code":4387560,"matched_code":3141528,"matched_code_percent":71.6008,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9633,"matched_functions_percent":73.523125,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T02:26:16Z","commit_sha":"7564c39f641896c1a336d6c0776fa63ff35e933b","commit_message":"Replace the stale 002ba080 guarded body with a 77-word rewrite","measures":{"fuzzy_match_percent":71.6008,"total_code":4387560,"matched_code":3141528,"matched_code_percent":71.6008,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9633,"matched_functions_percent":73.523125,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T02:16:44Z","commit_sha":"e810dfac5e91292da78f68149d618a1dae2a52f6","commit_message":"Record the 004afe20 match in the handoff","measures":{"fuzzy_match_percent":71.6008,"total_code":4387560,"matched_code":3141528,"matched_code_percent":71.6008,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9633,"matched_functions_percent":73.523125,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T01:57:57Z","commit_sha":"fc4c09acd76701c423e03f29288e5f347d663fca","commit_message":"Match func_004afe20","measures":{"fuzzy_match_percent":71.6008,"total_code":4387560,"matched_code":3141528,"matched_code_percent":71.6008,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9633,"matched_functions_percent":73.523125,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T01:45:00Z","commit_sha":"56b41e2567b2902d4551a840bae3547a9fa905db","commit_message":"Hoist 001400f0's fill-loop constants in the guarded body (77 edits)","measures":{"fuzzy_match_percent":71.528595,"total_code":4387560,"matched_code":3138360,"matched_code_percent":71.528595,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9632,"matched_functions_percent":73.515495,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T01:43:24Z","commit_sha":"2a3c260096e39ee3fb49eb78e91844919f83b893","commit_message":"Document the opt_pulloutconstants lever","measures":{"fuzzy_match_percent":71.528595,"total_code":4387560,"matched_code":3138360,"matched_code_percent":71.528595,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9632,"matched_functions_percent":73.515495,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T01:43:13Z","commit_sha":"67cea7f05c9496afe386a5705fb0ffc387360bc2","commit_message":"Update the handoff for 0029fbb0 and 004941f0","measures":{"fuzzy_match_percent":71.528595,"total_code":4387560,"matched_code":3138360,"matched_code_percent":71.528595,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9632,"matched_functions_percent":73.515495,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T01:42:31Z","commit_sha":"dadbd2ec56a47f4c528734e9d6d78b32db5b8d55","commit_message":"Match func_004941f0","measures":{"fuzzy_match_percent":71.528595,"total_code":4387560,"matched_code":3138360,"matched_code_percent":71.528595,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9632,"matched_functions_percent":73.515495,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T01:32:37Z","commit_sha":"dd1a605f25057ec984d3e62ca16592327414932e","commit_message":"Reduce the 0048b340 guarded body to 54 edits","measures":{"fuzzy_match_percent":71.501976,"total_code":4387560,"matched_code":3137192,"matched_code_percent":71.501976,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9631,"matched_functions_percent":73.50786,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T01:26:38Z","commit_sha":"fb98a5ae33212890fd7a8d4663a7abe29489be23","commit_message":"Document the conversion and address-temporary levers","measures":{"fuzzy_match_percent":71.501976,"total_code":4387560,"matched_code":3137192,"matched_code_percent":71.501976,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9631,"matched_functions_percent":73.50786,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T01:16:35Z","commit_sha":"1e0ce8a012b3ca8762d19bf14119bf52aa280a5d","commit_message":"Recover guarded Model controller semantics and reproducible evidence","measures":{"fuzzy_match_percent":71.501976,"total_code":4387560,"matched_code":3137192,"matched_code_percent":71.501976,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9631,"matched_functions_percent":73.50786,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T01:07:08Z","commit_sha":"6652265946e31871f29f54f3c778efe4bc944adb","commit_message":"Match func_0029fbb0","measures":{"fuzzy_match_percent":71.501976,"total_code":4387560,"matched_code":3137192,"matched_code_percent":71.501976,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9631,"matched_functions_percent":73.50786,"complete_code":1949456,"complete_code_percent":44.43144,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":501}},{"timestamp":"2026-10-08T01:05:38Z","commit_sha":"a76d3380eb0d72cf9db3d6a3496c38618d049ab5","commit_message":"Close most of 004b6030's colouring (27 edits)","measures":{"fuzzy_match_percent":71.45967,"total_code":4387560,"matched_code":3135336,"matched_code_percent":71.45967,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9630,"matched_functions_percent":73.50023,"complete_code":1929312,"complete_code_percent":43.97232,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":500}},{"timestamp":"2026-10-08T01:01:52Z","commit_sha":"259235a11afcfdef07be182366bb34717e3cc23a","commit_message":"Record the 0029fbb0, 00490c40 and 004b6030 residuals in the handoff","measures":{"fuzzy_match_percent":71.45967,"total_code":4387560,"matched_code":3135336,"matched_code_percent":71.45967,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9630,"matched_functions_percent":73.50023,"complete_code":1929312,"complete_code_percent":43.97232,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":500}},{"timestamp":"2026-10-08T00:57:52Z","commit_sha":"869a78a56637a21e01ae710840ffaebc390b2b81","commit_message":"Unfold four more 0029fbb0 table reads (6 edits)","measures":{"fuzzy_match_percent":71.45967,"total_code":4387560,"matched_code":3135336,"matched_code_percent":71.45967,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9630,"matched_functions_percent":73.50023,"complete_code":1929312,"complete_code_percent":43.97232,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":500}},{"timestamp":"2026-10-08T00:54:29Z","commit_sha":"2340dd6e9df7b3e90c7ce1eacdaa367c55765683","commit_message":"Unfold the 0029fbb0 0x104 table read (12 edits)","measures":{"fuzzy_match_percent":71.45967,"total_code":4387560,"matched_code":3135336,"matched_code_percent":71.45967,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9630,"matched_functions_percent":73.50023,"complete_code":1929312,"complete_code_percent":43.97232,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":500}},{"timestamp":"2026-10-08T00:50:56Z","commit_sha":"835446a3226a0a21ef30556d3893d16253ceb6b8","commit_message":"Replace the 004b6030 guarded body with a 55-word rewrite","measures":{"fuzzy_match_percent":71.45967,"total_code":4387560,"matched_code":3135336,"matched_code_percent":71.45967,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9630,"matched_functions_percent":73.50023,"complete_code":1929312,"complete_code_percent":43.97232,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":500}},{"timestamp":"2026-10-08T00:30:13Z","commit_sha":"781469795990547a270a408cfb4dd437801caea0","commit_message":"Replace the 00490c40 guarded body with a 57-word rewrite","measures":{"fuzzy_match_percent":71.45967,"total_code":4387560,"matched_code":3135336,"matched_code_percent":71.45967,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9630,"matched_functions_percent":73.50023,"complete_code":1929312,"complete_code_percent":43.97232,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":500}},{"timestamp":"2026-10-08T00:15:31Z","commit_sha":"67f300639f338d9c39635218d3cf568021d33f34","commit_message":"Record the 6,810 / 51 first-party state and the sprite-pair levers","measures":{"fuzzy_match_percent":71.45967,"total_code":4387560,"matched_code":3135336,"matched_code_percent":71.45967,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9630,"matched_functions_percent":73.50023,"complete_code":1929312,"complete_code_percent":43.97232,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":500}},{"timestamp":"2026-10-08T00:15:13Z","commit_sha":"fe5fee6088e702b941fb1398edf0d2d57b347940","commit_message":"Update the 00320b80 guarded body to the s16-counter reconstruction","measures":{"fuzzy_match_percent":71.45967,"total_code":4387560,"matched_code":3135336,"matched_code_percent":71.45967,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9630,"matched_functions_percent":73.50023,"complete_code":1929312,"complete_code_percent":43.97232,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":500}},{"timestamp":"2026-10-08T00:10:44Z","commit_sha":"8bfe5ae1ecdbbdaf7fb3482b0bf99c0abd55b2e2","commit_message":"Replace the 004aed70 and 0048b340 guarded bodies with closer rewrites\n\n004aed70 is 12 edits from retail and 0048b340 is 65 (was 160). The owner notes\nlist what is still open.","measures":{"fuzzy_match_percent":71.45967,"total_code":4387560,"matched_code":3135336,"matched_code_percent":71.45967,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9630,"matched_functions_percent":73.50023,"complete_code":1929312,"complete_code_percent":43.97232,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":500}},{"timestamp":"2026-10-08T00:04:19Z","commit_sha":"bf4b293f3fa2a92510c6fbc4ff02e8e4f8adb8a9","commit_message":"Name the packed colour slot in the COP2 pack asm instead of a frame offset\n\nb210 inline asm resolves a local's name to its frame slot, so the store keeps\nretail's sw/lw pair without a hardcoded offset.","measures":{"fuzzy_match_percent":71.45967,"total_code":4387560,"matched_code":3135336,"matched_code_percent":71.45967,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9630,"matched_functions_percent":73.50023,"complete_code":1929312,"complete_code_percent":43.97232,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":500}},{"timestamp":"2026-10-08T00:00:06Z","commit_sha":"ff2f5f96ab71399cea76af2eb715823d306b8d7d","commit_message":"Drop the stale 004b1ad0 floor notes","measures":{"fuzzy_match_percent":71.45967,"total_code":4387560,"matched_code":3135336,"matched_code_percent":71.45967,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9630,"matched_functions_percent":73.50023,"complete_code":1929312,"complete_code_percent":43.97232,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":500}},{"timestamp":"2026-10-07T23:59:58Z","commit_sha":"ef23b99ef7b6f0c822f10510ff10d0a4ab2a166a","commit_message":"Match func_004b1ad0, the screen-space sibling of func_004a5fc0\n\nSame COP2 pack and frame-info struct as func_004a5fc0; the corners are\nprojected through the camera depth range with hoisted screen constants.","measures":{"fuzzy_match_percent":71.45967,"total_code":4387560,"matched_code":3135336,"matched_code_percent":71.45967,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9630,"matched_functions_percent":73.50023,"complete_code":1929312,"complete_code_percent":43.97232,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":500}},{"timestamp":"2026-10-07T23:53:42Z","commit_sha":"36f7c47553ab7fff1d34cbb1711f4f8edc12b001","commit_message":"Match func_004a5fc0 with a rewritten billboard sprite update\n\nRetail stores the packed colour from inside the COP2 asm and reloads the slot,\nso the pack asm writes the frame slot through an \"=m\" output (user decision,\n2026-10-07). The UV rect/size/corner block is one frame-info struct.","measures":{"fuzzy_match_percent":71.3871,"total_code":4387560,"matched_code":3132152,"matched_code_percent":71.3871,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9629,"matched_functions_percent":73.4926,"complete_code":1929312,"complete_code_percent":43.97232,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":500}},{"timestamp":"2026-10-07T23:12:55Z","commit_sha":"46a226201da5e193aedd7a7f04550b62debe84a1","commit_message":"Match Camp party-panel controller func_00363610\n\nRecover typed panel rows, motion state, ordering node and provider ABIs.\nPreserve the explicitly authorized retail unwritten-roster behavior and\ndocument its ordering-node overlap.\n\nWhole-owner proof matches all 2772 live bytes, seven jump-table entries,\nand six siblings. Cold full build passes both retail hashes with all\nseven owner functions C-linked; first-party verification is 6808/6861.\nIndependent source/ABI and actual-link reviews pass.","measures":{"fuzzy_match_percent":71.318184,"total_code":4387560,"matched_code":3129128,"matched_code_percent":71.318184,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9628,"matched_functions_percent":73.48496,"complete_code":1929312,"complete_code_percent":43.97232,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":500}},{"timestamp":"2026-10-07T22:28:47Z","commit_sha":"0f2db7a706fe3b63971f2b1fc2b801b6df4ac59d","commit_message":"Record 6,807 / 54 first-party state and the 00497ce0 quad-copy floor","measures":{"fuzzy_match_percent":71.25473,"total_code":4387560,"matched_code":3126344,"matched_code_percent":71.25473,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9627,"matched_functions_percent":73.47733,"complete_code":1924496,"complete_code_percent":43.862556,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":499}},{"timestamp":"2026-10-07T22:07:09Z","commit_sha":"2ab6b846617f3a9f41a546d4b7ae20323252d787","commit_message":"Match func_004968a0 and restore effPolygonThunder link eligibility\n\nfunc_004956b0 referenced fGpffff80ec and func_004968a0 fGpffff80e0, neither a\nlinker-resolvable data symbol, so the unit fell back to retail bytes and the\nlinked TU count dropped to 603. Both are now registered with their retail GP\nload as evidence, and func_004968a0 reads 0.95 through the existing iGpffff80d4.","measures":{"fuzzy_match_percent":71.25473,"total_code":4387560,"matched_code":3126344,"matched_code_percent":71.25473,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9627,"matched_functions_percent":73.47733,"complete_code":1924496,"complete_code_percent":43.862556,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":499}},{"timestamp":"2026-10-07T21:01:26Z","commit_sha":"4b665e0869c18eb8e263c20c11f835656ba67245","commit_message":"Guard memcard C ownership against silent assembly fallback","measures":{"fuzzy_match_percent":71.13475,"total_code":4387560,"matched_code":3121080,"matched_code_percent":71.13475,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9625,"matched_functions_percent":73.46207,"complete_code":1924496,"complete_code_percent":43.862556,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":499}},{"timestamp":"2026-10-07T20:54:28Z","commit_sha":"81ee8a8bfef2b96d99559ce3244c07c8b39560ce","commit_message":"Add regalloc_order_search.py and document the declaration-order search","measures":{"fuzzy_match_percent":71.13475,"total_code":4387560,"matched_code":3121080,"matched_code_percent":71.13475,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9625,"matched_functions_percent":73.46207,"complete_code":1924496,"complete_code_percent":43.862556,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":499}},{"timestamp":"2026-10-07T20:52:18Z","commit_sha":"dd37ad78f09a1906655b3467d8d6fa44eb9acca1","commit_message":"Record the 6,805 / 56 first-party state and the Wind family method","measures":{"fuzzy_match_percent":71.13475,"total_code":4387560,"matched_code":3121080,"matched_code_percent":71.13475,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9625,"matched_functions_percent":73.46207,"complete_code":1924496,"complete_code_percent":43.862556,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":499}},{"timestamp":"2026-10-07T20:31:03Z","commit_sha":"506ed011822405aaad5e8c68aa552275d2667c56","commit_message":"Match func_004a3640, completing the effPolygonWind strip family","measures":{"fuzzy_match_percent":71.13475,"total_code":4387560,"matched_code":3121080,"matched_code_percent":71.13475,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9625,"matched_functions_percent":73.46207,"complete_code":1924496,"complete_code_percent":43.862556,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":499}},{"timestamp":"2026-10-07T20:22:15Z","commit_sha":"e049c9fbb829b865f3d0ba484f728fe21873d7fd","commit_message":"Restore memcard C linkage with verified save-header symbol","measures":{"fuzzy_match_percent":71.077866,"total_code":4387560,"matched_code":3118584,"matched_code_percent":71.077866,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9624,"matched_functions_percent":73.45444,"complete_code":1924496,"complete_code_percent":43.862556,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":499}},{"timestamp":"2026-10-07T20:11:30Z","commit_sha":"45b8091d75902df339aa9661c670118fcddb0eda","commit_message":"Match func_004a2310 from the func_004a4a10 strip shape","measures":{"fuzzy_match_percent":71.077866,"total_code":4387560,"matched_code":3118584,"matched_code_percent":71.077866,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9624,"matched_functions_percent":73.45444,"complete_code":1921328,"complete_code_percent":43.79035,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":498}},{"timestamp":"2026-10-07T20:06:10Z","commit_sha":"8be9e71759028dbefee0197c7f28040e3fdd0e1f","commit_message":"Match func_004a4a10 with a VU0 strip rewrite and model-derived FPR order","measures":{"fuzzy_match_percent":71.02244,"total_code":4387560,"matched_code":3116152,"matched_code_percent":71.02244,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9623,"matched_functions_percent":73.4468,"complete_code":1921328,"complete_code_percent":43.79035,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":498}},{"timestamp":"2026-10-07T18:57:32Z","commit_sha":"fbc394ae2790be37f7337eef2a1203bfd8fda523","commit_message":"Match func_004647c0 without the non-retail icon lookup checks","measures":{"fuzzy_match_percent":70.972115,"total_code":4387560,"matched_code":3113944,"matched_code_percent":70.972115,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9622,"matched_functions_percent":73.43917,"complete_code":1921328,"complete_code_percent":43.79035,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":498}},{"timestamp":"2026-10-07T18:50:39Z","commit_sha":"d9819d31c063e65f9d2a1fb6d2076902737e79b1","commit_message":"Record the October 7 first-party state: 6,801 MATCH / 60 ASM","measures":{"fuzzy_match_percent":70.901,"total_code":4387560,"matched_code":3110824,"matched_code_percent":70.901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9621,"matched_functions_percent":73.43153,"complete_code":1921328,"complete_code_percent":43.79035,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":498}},{"timestamp":"2026-10-07T18:28:53Z","commit_sha":"a8c166ab742a453504f86e7a243b74456a296320","commit_message":"Record the 00148280 use of the second-name lever","measures":{"fuzzy_match_percent":70.901,"total_code":4387560,"matched_code":3110824,"matched_code_percent":70.901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9621,"matched_functions_percent":73.43153,"complete_code":1921328,"complete_code_percent":43.79035,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":498}},{"timestamp":"2026-10-07T18:28:36Z","commit_sha":"a400ac55fdf14e73f1c706630cc0a939373b261c","commit_message":"Match func_00148280 with shared tail-loop counters and an ent/cur walk","measures":{"fuzzy_match_percent":70.901,"total_code":4387560,"matched_code":3110824,"matched_code_percent":70.901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9621,"matched_functions_percent":73.43153,"complete_code":1921328,"complete_code_percent":43.79035,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":498}},{"timestamp":"2026-10-07T18:20:52Z","commit_sha":"e4c1a6d6d201e78ecd0d307a354567d92c4da0a6","commit_message":"Document the second-name lever and add the b210 IR dump tool","measures":{"fuzzy_match_percent":70.7865,"total_code":4387560,"matched_code":3105800,"matched_code_percent":70.7865,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9620,"matched_functions_percent":73.423904,"complete_code":1921328,"complete_code_percent":43.79035,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":498}},{"timestamp":"2026-10-07T18:01:46Z","commit_sha":"6065d640d81069c5042abda9e74dee7d4b33fb78","commit_message":"Match func_001d53e0 with a converted frame copy","measures":{"fuzzy_match_percent":70.7865,"total_code":4387560,"matched_code":3105800,"matched_code_percent":70.7865,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9620,"matched_functions_percent":73.423904,"complete_code":1921328,"complete_code_percent":43.79035,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":498}},{"timestamp":"2026-10-07T17:58:42Z","commit_sha":"fb3de3b363ee94117c15322fc2f026ebf03e20b1","commit_message":"Match func_001b05d0 with a table copy of the scan base","measures":{"fuzzy_match_percent":70.75331,"total_code":4387560,"matched_code":3104344,"matched_code_percent":70.75331,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9619,"matched_functions_percent":73.416275,"complete_code":1921328,"complete_code_percent":43.79035,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":498}},{"timestamp":"2026-10-07T17:51:55Z","commit_sha":"fc283b44b5a704a0229522f3b96ed444a4dfb824","commit_message":"Match func_0024be40 with a cursor copy of the weather row","measures":{"fuzzy_match_percent":70.742004,"total_code":4387560,"matched_code":3103848,"matched_code_percent":70.742004,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9618,"matched_functions_percent":73.40864,"complete_code":1874768,"complete_code_percent":42.72917,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":497}},{"timestamp":"2026-10-07T17:20:00Z","commit_sha":"e841b7b79bcc152f5686b9c434f317cad5c39032","commit_message":"Bring the guarded func_0048b340 body to 160 words","measures":{"fuzzy_match_percent":70.72669,"total_code":4387560,"matched_code":3103176,"matched_code_percent":70.72669,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9617,"matched_functions_percent":73.40101,"complete_code":1847936,"complete_code_percent":42.117622,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":496}},{"timestamp":"2026-10-07T17:10:34Z","commit_sha":"45a7aa4a45316566553d446a6796020376c9de00","commit_message":"Match func_0048f5f0 from the func_0048ec50 family shape","measures":{"fuzzy_match_percent":70.72669,"total_code":4387560,"matched_code":3103176,"matched_code_percent":70.72669,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9617,"matched_functions_percent":73.40101,"complete_code":1847936,"complete_code_percent":42.117622,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":496}},{"timestamp":"2026-10-07T16:25:29Z","commit_sha":"74138e81c34ee4aa132943530ed3fcab13f8ca26","commit_message":"Share the $v0 colour unpack helper; bring func_004941f0 to 4 words","measures":{"fuzzy_match_percent":70.54618,"total_code":4387560,"matched_code":3095256,"matched_code_percent":70.54618,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9614,"matched_functions_percent":73.37811,"complete_code":1847936,"complete_code_percent":42.117622,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":496}},{"timestamp":"2026-10-07T16:20:15Z","commit_sha":"41398a173e716dfdfdd2407c92a28fcfbc6aa16a","commit_message":"Match func_004b4430","measures":{"fuzzy_match_percent":70.54618,"total_code":4387560,"matched_code":3095256,"matched_code_percent":70.54618,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9614,"matched_functions_percent":73.37811,"complete_code":1847936,"complete_code_percent":42.117622,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":496}},{"timestamp":"2026-10-07T16:16:15Z","commit_sha":"2f60ab3d26f25c5a6186222ad39a824d6388c369","commit_message":"Match func_004b36b0","measures":{"fuzzy_match_percent":70.500595,"total_code":4387560,"matched_code":3093256,"matched_code_percent":70.500595,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9613,"matched_functions_percent":73.370476,"complete_code":1847936,"complete_code_percent":42.117622,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":496}},{"timestamp":"2026-10-07T12:57:44Z","commit_sha":"0600edf70ec0ee8edac5db9abb7470153e4315c9","commit_message":"Match scene light overrides with retail shared return","measures":{"fuzzy_match_percent":70.46049,"total_code":4387560,"matched_code":3091496,"matched_code_percent":70.46049,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9612,"matched_functions_percent":73.36285,"complete_code":1847936,"complete_code_percent":42.117622,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":496}},{"timestamp":"2026-10-07T08:45:28Z","commit_sha":"b14b8bd008e64617d7168c602691b4148a5d6f41","commit_message":"Match func_004a0c00","measures":{"fuzzy_match_percent":70.40615,"total_code":4387560,"matched_code":3089112,"matched_code_percent":70.40615,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9611,"matched_functions_percent":73.35521,"complete_code":1837648,"complete_code_percent":41.88314,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":495}},{"timestamp":"2026-10-07T08:15:25Z","commit_sha":"a21a5d1dd0978767e5b779ae0a454695accb5c9b","commit_message":"Bring the guarded func_0048d8c0 body to 7 differing words","measures":{"fuzzy_match_percent":70.35583,"total_code":4387560,"matched_code":3086904,"matched_code_percent":70.35583,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9610,"matched_functions_percent":73.34758,"complete_code":1837648,"complete_code_percent":41.88314,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":495}},{"timestamp":"2026-10-07T07:13:57Z","commit_sha":"7895d08d37e7fdf9fa357aad31d0be545d34c1e5","commit_message":"Record the spill-choice requirement for func_0036ee60","measures":{"fuzzy_match_percent":70.35583,"total_code":4387560,"matched_code":3086904,"matched_code_percent":70.35583,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9610,"matched_functions_percent":73.34758,"complete_code":1837648,"complete_code_percent":41.88314,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":495}},{"timestamp":"2026-10-07T06:44:19Z","commit_sha":"043d67232f40ae3977fae9f43246eaf8b5ec60c3","commit_message":"MATCH func_00324680: shared row counter under opt_lifetimes and (s32) on/off conversions\n\nThe label loop reuses the row counter i under scoped opt_lifetimes, so its\nsplit lifetime is numbered after the sign-extended copy, and on/off are\npassed as (s32) conversions so they stay locals (the 00323d00 lever).\nOwner verify: only this row changes.","measures":{"fuzzy_match_percent":70.35583,"total_code":4387560,"matched_code":3086904,"matched_code_percent":70.35583,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9610,"matched_functions_percent":73.34758,"complete_code":1837648,"complete_code_percent":41.88314,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":495}},{"timestamp":"2026-10-07T06:41:22Z","commit_sha":"ae0fe4d68bf3c374304ee1a16177acee023b8b88","commit_message":"Document the three-axis scaled-product and repeated clamp-product levers","measures":{"fuzzy_match_percent":70.303314,"total_code":4387560,"matched_code":3084600,"matched_code_percent":70.303314,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9609,"matched_functions_percent":73.33995,"complete_code":1837648,"complete_code_percent":41.88314,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":495}},{"timestamp":"2026-10-07T06:39:29Z","commit_sha":"e8bd1d835968cbd00bccc7042a8ef1a2f53ecc42","commit_message":"MATCH func_00225ec0: in-place scaled products, shared cutscene return, repeated clamp product\n\npx = delta.x; px *= scale (per axis) keeps the products unfused ahead of\nthe three add.s; the two cutscene arms share one return after the if/else;\nthe ground clamp writes 1.25f * top in both places, which loads top before\nthe constant. Owner verify: only this row changes.","measures":{"fuzzy_match_percent":70.303314,"total_code":4387560,"matched_code":3084600,"matched_code_percent":70.303314,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9609,"matched_functions_percent":73.33995,"complete_code":1837648,"complete_code_percent":41.88314,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":495}},{"timestamp":"2026-10-07T05:24:56Z","commit_sha":"bc51189cce4a2e4371cd690d7c16d244483b2b0a","commit_message":"Restore seven exact first-party bodies\n\nUser decision (2026-10-07): exact C may read an uninitialised local where\nretail demonstrably does, documented at the read; and a unit may declare a\ncallee's parameter differently from the definition when retail's argument\norder proves it (one documented H011).\n\n- func_00475cd0, func_0045f790 (primLine3D), func_00480f20,\n  func_0015f000, func_0022a730, func_001ee610: the byte-exact bodies that\n  cc70c569 demoted only for their uninitialised reads, each with a comment\n  citing the retail read.\n- func_002239a0: keep-alive conversions for r/base, plus this unit's u16\n  view of func_0011b480's id parameter, which is the only way the id load\n  follows the window-pointer argument.\n\nFull verify changes only these seven rows (6,788 MATCH / 73 ASM). The full\nlink keeps 658 linked TUs and both retail hashes. Lint: +1 H011 (the\nper-unit declaration) and +1 H003 (001ee610's scoped opt_loop_invariants,\nmeasured).","measures":{"fuzzy_match_percent":70.256996,"total_code":4387560,"matched_code":3082568,"matched_code_percent":70.256996,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9608,"matched_functions_percent":73.33231,"complete_code":1837648,"complete_code_percent":41.88314,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":495}},{"timestamp":"2026-10-07T04:08:49Z","commit_sha":"5f3b7d30111852c11b6080685bf52ce61109a457","commit_message":"Record the matched-corpus census of local survival and argument order","measures":{"fuzzy_match_percent":70.013405,"total_code":4387560,"matched_code":3071880,"matched_code_percent":70.013405,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9601,"matched_functions_percent":73.27889,"complete_code":1827312,"complete_code_percent":41.647568,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":492}},{"timestamp":"2026-10-07T03:30:21Z","commit_sha":"4abfdd5bf1eb004f60dd5ea096ca3811932f0a75","commit_message":"Fix the lever bullet order","measures":{"fuzzy_match_percent":70.013405,"total_code":4387560,"matched_code":3071880,"matched_code_percent":70.013405,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9601,"matched_functions_percent":73.27889,"complete_code":1827312,"complete_code_percent":41.647568,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":492}},{"timestamp":"2026-10-07T03:30:13Z","commit_sha":"18b2097cc0f867ea4e0604edc05bd99e40f47dd9","commit_message":"Add the 002e5ae0 and 002239a0 keep-alive examples","measures":{"fuzzy_match_percent":70.013405,"total_code":4387560,"matched_code":3071880,"matched_code_percent":70.013405,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9601,"matched_functions_percent":73.27889,"complete_code":1827312,"complete_code_percent":41.647568,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":492}},{"timestamp":"2026-10-07T03:29:30Z","commit_sha":"e5e6a53d7d68757c474579b6972ebd15eef3b659","commit_message":"MATCH func_002e5ae0: keep slotp alive and split the scan counter\n\nslotp is declared after level and read as *(u8 **)(u32)slotp in the first\nmembership search; the repeated conversion keeps it a local at its\ndeclared number. The expanded scan reuses the first scan's counter i under\nopt_lifetimes, so the split lifetime is numbered after the per-entry index\n(the func_001b11c0 lever). Together they give retail's saved registers.\n1860/1872 bytes, zero tail; full verify changes only this row (6,781 MATCH\n/ 80 ASM); full link keeps 658 linked TUs and both retail hashes.","measures":{"fuzzy_match_percent":70.013405,"total_code":4387560,"matched_code":3071880,"matched_code_percent":70.013405,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9601,"matched_functions_percent":73.27889,"complete_code":1827312,"complete_code_percent":41.647568,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":492}},{"timestamp":"2026-10-07T02:56:43Z","commit_sha":"ab778719a7b6e3577ed55c34b6adaa0dab4897ee","commit_message":"Record the measured conversion-first argument order rule","measures":{"fuzzy_match_percent":69.97073,"total_code":4387560,"matched_code":3070008,"matched_code_percent":69.97073,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9600,"matched_functions_percent":73.271255,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T02:55:48Z","commit_sha":"788260f759cf2c459c4a0e92fa2fd552f80037bb","commit_message":"Bring func_002239a0 from 57 to 2 edits with the keep-alive lever\n\nDeclaring r and base after the loop counter and forming the first two\nopening-state addresses as (u32)r + offset keeps r a local at its declared\nnumber, giving retail's $s3/$s2. The two remaining words are the order of\nthe window-pointer and id argument loads at the func_0011b480 call; a u16\nparameter fixes it but breaks four matched s32 callers, so the body stays\nguarded with the measurements recorded.","measures":{"fuzzy_match_percent":69.97073,"total_code":4387560,"matched_code":3070008,"matched_code_percent":69.97073,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9600,"matched_functions_percent":73.271255,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T02:49:17Z","commit_sha":"33d62d793f66e29c54d8f947cefccf9749cfb84c","commit_message":"MATCH func_00323d00: repeated (s32) conversions keep hidden/shown as locals\n\nDeclaring hidden and shown before res and passing them as (s32)shown,\n(s32)hidden at all six calls makes the frontend copy each local into a\nCSE temporary inside the later draw blocks. That copy use stops b210's\npropagatecopyinstructions from folding them into their arithmetic\ntemporaries, so they keep low declared numbers and colour to retail's\n$s4/$s3, with res in $s1. 1800/1808 bytes, zero tail; full verify changes\nonly this row (6,780 MATCH / 81 ASM); full link keeps 658 linked TUs and\nboth retail hashes. Lever documented in docs/matching.md.","measures":{"fuzzy_match_percent":69.97073,"total_code":4387560,"matched_code":3070008,"matched_code_percent":69.97073,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9600,"matched_functions_percent":73.271255,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T02:17:24Z","commit_sha":"08abe77a490dadc0be73a7176b28129541b80325","commit_message":"State the call-argument precondition of the saved-register declaration rule","measures":{"fuzzy_match_percent":69.92953,"total_code":4387560,"matched_code":3068200,"matched_code_percent":69.92953,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9599,"matched_functions_percent":73.263626,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T01:54:58Z","commit_sha":"1286764792ac0840474d980217e96d874cf4ba96","commit_message":"Add b210_micro.py and record measured local-survival rules","measures":{"fuzzy_match_percent":69.92953,"total_code":4387560,"matched_code":3068200,"matched_code_percent":69.92953,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9599,"matched_functions_percent":73.263626,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T01:32:40Z","commit_sha":"75b7e4189dfe80025898e1f9eca258cdaa7a9024","commit_message":"Add regalloc_whatif.py: replay b210's simplify stack and search renumberings","measures":{"fuzzy_match_percent":69.92953,"total_code":4387560,"matched_code":3068200,"matched_code_percent":69.92953,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9599,"matched_functions_percent":73.263626,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T01:31:31Z","commit_sha":"b3b38a6ee532e7f3e1e7f73ac47aacfd84352636","commit_message":"Record the colouring-model requirement for func_00148280","measures":{"fuzzy_match_percent":69.92953,"total_code":4387560,"matched_code":3068200,"matched_code_percent":69.92953,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9599,"matched_functions_percent":73.263626,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T01:21:06Z","commit_sha":"e777c04e19157e3a9e2efc21d9ba5a66dadf8e09","commit_message":"Record the colouring-model requirement for func_004a7830","measures":{"fuzzy_match_percent":69.92953,"total_code":4387560,"matched_code":3068200,"matched_code_percent":69.92953,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9599,"matched_functions_percent":73.263626,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T01:16:24Z","commit_sha":"cf4eba2f40ae873daf52cde6219850cf31c8af6e","commit_message":"Record the .end liveness finding on func_00485630","measures":{"fuzzy_match_percent":69.92953,"total_code":4387560,"matched_code":3068200,"matched_code_percent":69.92953,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9599,"matched_functions_percent":73.263626,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T01:02:12Z","commit_sha":"5ffdad5548a098fb6d2ca7e46300dd5895b85b1a","commit_message":"Record the 00323d00 renumbering requirement from the colouring model","measures":{"fuzzy_match_percent":69.92953,"total_code":4387560,"matched_code":3068200,"matched_code_percent":69.92953,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9599,"matched_functions_percent":73.263626,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T00:50:43Z","commit_sha":"706e4cf921976b5d119b07c4705074ff06592862","commit_message":"Document the post-colouring CSE lever","measures":{"fuzzy_match_percent":69.92953,"total_code":4387560,"matched_code":3068200,"matched_code_percent":69.92953,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9599,"matched_functions_percent":73.263626,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T00:50:22Z","commit_sha":"559d1768968e8ae7c28912ff387c1de4a21c8d9e","commit_message":"MATCH func_00375f00: integer address forms let post-colouring CSE copy the record pointer\n\nThe two state stores form the record address as (u32)arg0 + idx and\narg0 + (u32)idx. The frontend treats these as different from the pointer\nexpression, so arg0 and idx stay live in $s1/$s0, and b210's post-colouring\nremovecommonsubexpressions turns each recomputed addu into move from\n$s2, exactly retail's code. No optimization-level pragma is needed.\n156/160 bytes with a zero tail; full verify changes only this row\n(6,779 MATCH / 82 ASM); full link keeps 658 linked TUs and both retail\nhashes.","measures":{"fuzzy_match_percent":69.92953,"total_code":4387560,"matched_code":3068200,"matched_code_percent":69.92953,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9599,"matched_functions_percent":73.263626,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T00:16:05Z","commit_sha":"c1d0855c46051d7ca8f503340de977302f415653","commit_message":"Fix a duplicated line in the colouring notes","measures":{"fuzzy_match_percent":69.92588,"total_code":4387560,"matched_code":3068040,"matched_code_percent":69.92588,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9598,"matched_functions_percent":73.25599,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T00:15:59Z","commit_sha":"b3c1756653c25f95fb423b1e048fc1670d07f911","commit_message":"Record the validated simplify-stack model and the required renumberings for two floors","measures":{"fuzzy_match_percent":69.92588,"total_code":4387560,"matched_code":3068040,"matched_code_percent":69.92588,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9598,"matched_functions_percent":73.25599,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T00:05:02Z","commit_sha":"002ac6bc48631c356a5e1edef2f4197700777411","commit_message":"Keep tool tests; drop per-function contract and native behavior tests\n\nThe verifier (byte equality with retail per function), the full link\n(both retail hashes, C-link membership) and lint are the matching gates.\nTests remain where they cover tooling those gates rely on but do not\nexercise: marker/comment parsing, header staging, relocation and image\nhandling, symbol tables, report and progress generation.\n\nRemoved 73 test modules that pinned the source text, declarations or\n32-bit native behaviour of individual game functions, with their 60\nfixtures, native32_support.py and tools/run_persona_alpha_contracts.py.\nFor matched functions they re-proved what byte equality already proves;\nfor guarded floors they pinned one spelling of non-matching C, which\nworks against further matching. Suite: 1,151 tests in ~20 min ->\n833 tests in ~1 min, all passing.","measures":{"fuzzy_match_percent":69.92588,"total_code":4387560,"matched_code":3068040,"matched_code_percent":69.92588,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9598,"matched_functions_percent":73.25599,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-07T00:02:07Z","commit_sha":"f01c883e06d51098d0bd57fb586addee5a2fd357","commit_message":"Record the audited verify.py digest in the asm regeneration manifest\n\nverify.py is a fallback-generator input. regenerate_asm --check with the\nnew verifier reproduces all 11,154 fallback files byte-for-byte and keeps\nthe two hand-maintained files unchanged.","measures":{"fuzzy_match_percent":69.92588,"total_code":4387560,"matched_code":3068040,"matched_code_percent":69.92588,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9598,"matched_functions_percent":73.25599,"complete_code":1808128,"complete_code_percent":41.21033,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":491}},{"timestamp":"2026-10-06T09:04:46Z","commit_sha":"5f9393897af852734ea57b2fa3288b36136ccb2e","commit_message":"Integrate byte-aligned digit color storage with native validation\n\nPreserve the guarded fallback and all 74 matched siblings. Fresh four-context owner verification and integrated retail image checks pass with all prior C linkage retained. This repairs the pending source without adding C-match credit; first-party count remains 6773 MATCH / 88 ASM.","measures":{"fuzzy_match_percent":69.646545,"total_code":4387560,"matched_code":3055784,"matched_code_percent":69.646545,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9593,"matched_functions_percent":73.21783,"complete_code":1773216,"complete_code_percent":40.414627,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":489}},{"timestamp":"2026-10-06T07:42:53Z","commit_sha":"3a28c449bd3d2fcde0f86b03368887b9905b30d3","commit_message":"Match battle fade and After geometry from native compiler evidence\n\nPromote two complete C recoveries, preserve the material caller contract, and repair guarded shuffle trail storage and pass limits. Complete-owner code, relocation, data and behavior checks preserve the existing matches. The sealed integrated build passes both retail hashes with 6773 first-party matches and 88 remaining assembly fallbacks; update the progress records and source-bound continuation checkpoint.","measures":{"fuzzy_match_percent":69.646545,"total_code":4387560,"matched_code":3055784,"matched_code_percent":69.646545,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9593,"matched_functions_percent":73.21783,"complete_code":1773216,"complete_code_percent":40.414627,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":489}},{"timestamp":"2026-10-06T02:23:39Z","commit_sha":"4b32b6ccbb935945461838d8981ba508f675358a","commit_message":"Scope Fcl resource and alpha values to the late draw phase","measures":{"fuzzy_match_percent":69.39347,"total_code":4387560,"matched_code":3044680,"matched_code_percent":69.39347,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9589,"matched_functions_percent":73.1873,"complete_code":1757424,"complete_code_percent":40.0547,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":488}},{"timestamp":"2026-10-06T02:17:48Z","commit_sha":"547f7570b08028582b503804a8848b8e09ce1a37","commit_message":"Remove artificial getter calls from the guarded field controller","measures":{"fuzzy_match_percent":69.39347,"total_code":4387560,"matched_code":3044680,"matched_code_percent":69.39347,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9589,"matched_functions_percent":73.1873,"complete_code":1757424,"complete_code_percent":40.0547,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":488}},{"timestamp":"2026-10-06T01:59:19Z","commit_sha":"3f5780e305bfdadb7d25256624a80d482beaa459","commit_message":"Document retail resource inputs required for first-party recovery","measures":{"fuzzy_match_percent":69.39347,"total_code":4387560,"matched_code":3044680,"matched_code_percent":69.39347,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9589,"matched_functions_percent":73.1873,"complete_code":1757424,"complete_code_percent":40.0547,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":488}},{"timestamp":"2026-10-06T01:12:31Z","commit_sha":"ddd29f917b856e58625876a46d0c7d125297e54d","commit_message":"Record neutral b210 Order allocation evidence","measures":{"fuzzy_match_percent":69.39347,"total_code":4387560,"matched_code":3044680,"matched_code_percent":69.39347,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9589,"matched_functions_percent":73.1873,"complete_code":1757424,"complete_code_percent":40.0547,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":488}},{"timestamp":"2026-10-06T01:09:24Z","commit_sha":"655d261d671b7deeae9f7581a6611f047580e2f2","commit_message":"Match angular cone emitter with explicit phase lifetime\n\nRecover func_0048ec50 at 2308/2320 bytes and 23 exact code references. Verify all 73 owner functions, 589 resolved references, no allocated data, and guarded compilation. Complete GNU relink preserves all real placements and both retail hashes.","measures":{"fuzzy_match_percent":69.39347,"total_code":4387560,"matched_code":3044680,"matched_code_percent":69.39347,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9589,"matched_functions_percent":73.1873,"complete_code":1757424,"complete_code_percent":40.0547,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":488}},{"timestamp":"2026-10-06T00:51:00Z","commit_sha":"08765195dc091e3cbf349385a98ec8f950e5d904","commit_message":"Match cone emitter with complete vector contracts\n\nVerify func_0048e2f0 at 2244/2256 bytes with 20 exact references and twelve zero-alignment bytes. Preserve 72 sibling functions and all 584 owner references. Recompile the physical owner and guarded profile, then relink the complete image with authenticated inputs; both retail hashes pass.","measures":{"fuzzy_match_percent":69.34059,"total_code":4387560,"matched_code":3042360,"matched_code_percent":69.34059,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9588,"matched_functions_percent":73.179665,"complete_code":1757424,"complete_code_percent":40.0547,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":488}},{"timestamp":"2026-10-06T00:44:14Z","commit_sha":"75f7565e1b1cd1491ac0201172a14a1a2a2912b2","commit_message":"Resolve selection-window jump-table provenance","measures":{"fuzzy_match_percent":69.28917,"total_code":4387560,"matched_code":3040104,"matched_code_percent":69.28917,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9587,"matched_functions_percent":73.172035,"complete_code":1757424,"complete_code_percent":40.0547,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":488}},{"timestamp":"2026-10-06T00:12:12Z","commit_sha":"696ca03872816a4bd1eab7332a30b60accadce0a","commit_message":"Match motion emitter and repair guarded first-party contracts\n\nRecover func_0048c4e0 with its hardware-aligned XYZ object representation.\nThe actual current owner matches all 73 functions and 581 code references;\nthe promoted C body is linked into the retail-identical executable.\n\nCorrect packet and frame call contracts, complete battle output storage,\nchoice-window callback reloads, draw-queue state handling, sprite arithmetic\nand particle records. Preserve the recovered follower, skill and vector\nwork while retaining every remaining non-exact assembly fallback.\n\nRecord authenticated source, native proof, replay and progress evidence.\nFirst-party status is 6,767 MATCH / 94 ASM; full matching remains unfinished.\nBoth retail hashes pass, all 44 focused tests pass, and changed-owner lint\nhas no errors. Preserve byte-pinned historical proof inputs in Git.","measures":{"fuzzy_match_percent":69.28917,"total_code":4387560,"matched_code":3040104,"matched_code_percent":69.28917,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9587,"matched_functions_percent":73.172035,"complete_code":1757424,"complete_code_percent":40.0547,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":488}},{"timestamp":"2026-10-05T21:31:52Z","commit_sha":"1ce92c4949e3501076f2a0d7db836d48ea826e48","commit_message":"Restore rain and texture-strip C linkage\n\nDefine seven independently recovered GP-relative data symbols so both promoted owners remain eligible for source linkage. Preserve all existing bindings, function bodies and eligibility checks.\n\nValidation: full verifier 6766 first-party MATCH/95 ASM; cold build restores 8586 C-linked functions/658 units and both retail hashes; 1152 ordinary tests pass with two documented middleware skips. Independent address/storage review and 15 replay cases pass.","measures":{"fuzzy_match_percent":69.23958,"total_code":4387560,"matched_code":3037928,"matched_code_percent":69.23958,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9586,"matched_functions_percent":73.164406,"complete_code":1757424,"complete_code_percent":40.0547,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":488}},{"timestamp":"2026-10-05T19:51:51Z","commit_sha":"41501dac148e55ea8f7ab68c87e69450808064f3","commit_message":"Recover camp drawing objects and renderer contracts\n\nRepair complete XY/color/vertex payloads, unselected font style, sprite and descriptor arguments, radar opacity/depth, and the SDK render-state contract. Preserve the earlier renderer and comparator recovery with an explicit source-hash bridge.\n\nKeep both functions guarded: camp still has 85 alignment edits and 637 resolved differing words; renderer has 21 words. Actual owner verification preserves 124 MATCH and two ASM rows, 1454 code references and 39 data references in seven sections. Joint guarded compilation preserves all 124 C siblings, both comparators and the earlier renderer candidate.","measures":{"fuzzy_match_percent":69.23958,"total_code":4387560,"matched_code":3037928,"matched_code_percent":69.23958,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9586,"matched_functions_percent":73.164406,"complete_code":1751376,"complete_code_percent":39.916855,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":487}},{"timestamp":"2026-10-05T15:27:51Z","commit_sha":"a1cede7894141323ec6bb833af87a776aa19cc60","commit_message":"Match battle camera sequence with coherent packet and color contracts\n\nPromote 001b4880 to exact production C with real packet returns, complete\ncolor phases and consistent sound-stop callers. Preserve all seven prior\nmatches and every other verifier row except ten proved literal-name records.\n\nKeep the existing opening-controller fixture consistent with the provider\ncontract and partition the exhaustive Camp-alpha fixture without dropping\nany cases, assertions, controls or runtime limits. Add portable replay notes.","measures":{"fuzzy_match_percent":68.98067,"total_code":4387560,"matched_code":3026568,"matched_code_percent":68.98067,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9582,"matched_functions_percent":73.13387,"complete_code":1751376,"complete_code_percent":39.916855,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":487}},{"timestamp":"2026-10-05T05:17:50Z","commit_sha":"9938a483606bdf00f62f489664457d722850eb09","commit_message":"Match Sway particle update with explicit scalar lifetimes\n\nPromote 00492100 to exact production C with real Sway records, complete\ninitialized snapshots and byte-neutral canonical declarations. Add native\nregression tests and current-source replay notes while retaining the actual\nopaque trail-provider and numerical domain limits. Preserve sibling code,\nreference bindings, the preceding six matches and both retail hashes.","measures":{"fuzzy_match_percent":68.9194,"total_code":4387560,"matched_code":3023880,"matched_code_percent":68.9194,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9581,"matched_functions_percent":73.12624,"complete_code":1751376,"complete_code_percent":39.916855,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":487}},{"timestamp":"2026-10-05T03:45:25Z","commit_sha":"1d1c7bfe6a1052e69b9265b62cbf34901cbc2aa8","commit_message":"Match Wave particle update with explicit scalar lifetimes\n\nPromote 0048b9e0 to exact production C with complete Wave records and real\nscalar and snapshot lifetimes. Preserve all sibling code and references,\ntarget-owned initialization, both retail hashes, and the preceding five\nmatches. Add current-source regression tests and replay documentation that\nretains the actual opaque trail-provider and numerical domain limits.","measures":{"fuzzy_match_percent":68.86397,"total_code":4387560,"matched_code":3021448,"matched_code_percent":68.86397,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9580,"matched_functions_percent":73.11861,"complete_code":1751376,"complete_code_percent":39.916855,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":487}},{"timestamp":"2026-10-04T21:47:28Z","commit_sha":"90f7c9c8321347f7fa6b572183a7edc33205a7de","commit_message":"Match combine layout controller with transition phase lifetimes\n\nPromote 002eb270 to exact production C with two consecutive transition\nphases, preserving the real aggregate-return positions and provider reads.\nComplete all 41 functions in y_fclCombine. Add current-source native checks\nand portable replay notes; retain exact sibling/data bindings, both retail\nhashes, and the preceding four matched functions.","measures":{"fuzzy_match_percent":68.80344,"total_code":4387560,"matched_code":3018792,"matched_code_percent":68.80344,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9579,"matched_functions_percent":73.11098,"complete_code":1751376,"complete_code_percent":39.916855,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":487}},{"timestamp":"2026-10-04T19:09:54Z","commit_sha":"152236fb5194d005feadb25cf6efb921d339c79d","commit_message":"Match battle opening controller with coherent packet contracts\n\nPromote 001b2380 to exact production C with reviewed pointer lifetimes,\npacket results and equipment-count interfaces. Preserve sibling code,\ncanonical references and both retail hashes. Add source-bound native\nchecks and replay documentation with the retained resource-domain limits.","measures":{"fuzzy_match_percent":68.63241,"total_code":4387560,"matched_code":3011288,"matched_code_percent":68.63241,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9578,"matched_functions_percent":73.10334,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-04T02:15:13Z","commit_sha":"fa980eedbd5732a5f986d27166c525503b0f94dc","commit_message":"Match combination-row renderer with coherent narrow contracts\n\nPromote 0031ac10 to exact production C using the reviewed signed row and\nlevel contracts and real lookup-scalar reuse for delay. Preserve sibling\ninstructions, canonical references, native boundary tests and both retail\nhashes. Add current public replay instructions alongside historical proof.","measures":{"fuzzy_match_percent":68.53759,"total_code":4387560,"matched_code":3007128,"matched_code_percent":68.53759,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9577,"matched_functions_percent":73.09571,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-04T00:11:36Z","commit_sha":"a9d7c7c58e35602a5fea100df12eff31e328e4a5","commit_message":"Match field event controller and complete snapshot storage\n\nPromote 00172e00 to exact production C with coherent field-provider\ncontracts and the complete 112-byte snapshot. Preserve sibling code,\ncanonical references and both retail hashes. Add native contract tests\nand current replay instructions while retaining historical receipts.","measures":{"fuzzy_match_percent":68.40559,"total_code":4387560,"matched_code":3001336,"matched_code_percent":68.40559,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9576,"matched_functions_percent":73.08808,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-03T21:07:22Z","commit_sha":"18c3a8d4c1ef76c780c68ebc1f4b110cb559ed18","commit_message":"Match primitive quaternion matrix callback\n\nPromote 00480940 to exact production C with canonical SDK calls and\nnative boundary tests. Add one first-party match while preserving the\nretail image and all sibling functions. Document the target-specific\nRenderWare REPLACE contract and the provider-source limitation.","measures":{"fuzzy_match_percent":68.262634,"total_code":4387560,"matched_code":2995064,"matched_code_percent":68.262634,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9575,"matched_functions_percent":73.080444,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-03T18:59:33Z","commit_sha":"e43b98577449c5b2232c974e48bd023c7060ca79","commit_message":"Repair guarded Title helpers and Field AI normalization\n\nIntegrate reviewed Title record/speed and helper-call contracts alongside\nField AI normalization storage and float-result transport. Preserve both\nproduction owners, all matches, linked reports and retail hashes.\nKeep controllers guarded and include bounded audit source history.","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-03T17:39:17Z","commit_sha":"cc8b37b365acbf7b2b56d0b9e32d9d0a579e8be2","commit_message":"Recover guarded Title palette, entry and matrix contracts\n\nIntegrate the reviewed palette, model-call, callback-entry and matrix\nstorage repairs. Preserve production matches, linked reports and retail\nhashes, with the controller still guarded and assembly-backed.\nInclude bounded source history for reproducible historical audits.","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-03T16:29:23Z","commit_sha":"3686cbd1a9335bc20463f8c24b81127c6eb09e8c","commit_message":"Repair guarded Title state, color and sprite contracts\n\nIntegrate the reviewed Title chain through sprite-alpha value flow while\npreserving production matches, linked reports and both retail hashes.\nKeep the controller guarded and assembly-backed. Include focused contracts\nand bounded source history for reproducible archival audits.","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-03T14:47:11Z","commit_sha":"53c93aa4525a72d6eeadbe0cfb3b8f8b8e4c34e3","commit_message":"Repair guarded Battle storage and Title drawing contracts\n\nPreserve all production matches, linked report and both retail hashes.\nKeep controllers guarded and assembly-backed. Add reviewed native contract\nfixtures and scoped evidence; normalize only documented receipt paths.","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-03T12:51:44Z","commit_sha":"862a8d1e00d9aa26086aef62bfabdc583e1b1851","commit_message":"Repair guarded Fcl/Battle and scene-command contracts\n\nPreserve all production matches and both retail hashes. Keep guarded\ntargets unpromoted and add focused source-contract tests.","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-02T18:54:07Z","commit_sha":"f6a8c57a1485a869dc5dbd1cc27a2c5184996f1c","commit_message":"Recover guarded message-window selection source and handle contracts\n\nPreserve all existing first-party matches and both retail hashes. Keep\n0027F6F0 guarded: reduce the source residual from 769 to 590 aligned edits.\nAdd actual-source native tests and bounded recovery evidence.","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-02T05:16:38Z","commit_sha":"354c1add1e0cbd8b2370020672423767475d8681","commit_message":"Initialize community menu origin with typed float zeros\n\nPreserve both retail hashes and all linked matching windows. Include focused strict initialization/readback tests and verification evidence.","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-01T23:58:44Z","commit_sha":"437b07af2470a2452b3fc1ba5f9769ce0adff243","commit_message":"Use real aligned vertex storage in the immediate rectangle helper\n\nReplace scalar-plus-padding with the actual aligned 64-float output and typed\nstate/saved-array accesses. Preserve all 60 owner functions and entire objects.\nActual helper and typed-provider tests pass with independent controls. Both\nretail hashes and the complete 8586-window linked report remain unchanged.\nInclude user-approved validation documentation and logs. No new match claimed.","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-01T18:10:32Z","commit_sha":"58553aa1b6ffd6d42c58f623d1d97677e00b1be3","commit_message":"Recover typed queued rectangle payload and vertex storage\n\nUse coherent caller unions and owned packet views, remove incompatible helper\naliasing, and give the callback its real 64-float vertex buffer. Preserve all\n89 owner functions and complete production/guarded objects. Actual-body queue,\npayload and geometry tests pass with independent controls. Both retail hashes\nand 8586 linked windows remain unchanged. Generic dispatcher/backend and\nguarded-controller limitations remain explicit; no new match is claimed.","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-01T16:36:35Z","commit_sha":"c6c82910d63538b3d8eb8e14b0b860f89eb09d53","commit_message":"Unify ordering-table constructor return declarations\n\nDeclare the actual queued-node pointer result consistently in both providers\nand all caller owners. Preserve 69 functions and complete production/guarded\nobjects. Actual provider tests and independent controls pass. Both retail\nhashes and all 8586 linked windows remain identical with 604 C objects.\nNo rectangle API change or new matching count.","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-01T13:14:14Z","commit_sha":"61b8a7526e6ebc2f2a012a707f678d25a8a04d17","commit_message":"Use the real pointer ABI for font resource loading\n\nReplace incompatible wide alias calls with the actual resource-pointer loader\nand close all caller declarations. Correct the unsigned flag query contract.\nPreserve 208 affected functions and all code/data/reference bindings. Actual\nprovider tests pass 4006 cases per O0/O2 and independent controls. Both retail\nhashes and 8586 linked windows remain unchanged with 604 C objects. No match gain.","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-01T12:05:42Z","commit_sha":"b1f024ba5e0f6c1b525a6ecb83bbb7d2ee1808cf","commit_message":"Use one canonical queued primitive batch work type\n\nUnify constructor and callback work storage without changing public APIs or\nany compiled bytes. Verify all 8 owner functions, 3200 actual-body cases at\nO0/O2, negative controls and complete main projection. Both retail hashes and\nall 8586 linked windows remain unchanged with 604 C objects. No match gain.","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-01T10:12:16Z","commit_sha":"b690bb2cf0afdae66301fa6422f6997c4715a91f","commit_message":"Forward explicit message handles through procedure and userdata APIs\n\nRepair 22 omitted forwarding arguments with coherent provider declarations.\nPreserve all 187 affected functions and all guarded bodies. Full retail image\nand ELF hashes pass with unchanged 604 C objects and 8586 linked windows.\nActual-body native tests pass 12800 cases at O0/O2 plus negative controls.\nNo new exact matching function is claimed.","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-01T09:28:42Z","commit_sha":"55484acc8a525b07c7faf0e4ebcfec540baea36e","commit_message":"Use the defined color-word read in the matched effect callback","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-01T06:48:25Z","commit_sha":"725b5756604b687ed21759dacf0c15105d714ecc","commit_message":"Match persona task renderer through coherent byte-alpha contracts","measures":{"fuzzy_match_percent":68.25461,"total_code":4387560,"matched_code":2994712,"matched_code_percent":68.25461,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9574,"matched_functions_percent":73.072815,"complete_code":1582176,"complete_code_percent":36.060497,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":486}},{"timestamp":"2026-10-01T01:08:57Z","commit_sha":"01480d7430343d1ce72abc20e336ed3bf7eedb98","commit_message":"Match battle approach with coherent providers and preserved C linkage","measures":{"fuzzy_match_percent":68.18131,"total_code":4387560,"matched_code":2991496,"matched_code_percent":68.18131,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9573,"matched_functions_percent":73.06518,"complete_code":1540128,"complete_code_percent":35.102154,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":485}},{"timestamp":"2026-09-30T23:16:44Z","commit_sha":"a78c378b3da3cc826aea3c66462ee1f07f287759","commit_message":"Recover exact community portrait renderer and provider contracts\n\nPromote func_0035aff0 with exact owner, relocation, data, and sibling\nverification. Preserve live provider loads and the real Im2D object layouts.\nDocument the active Sky2 pipeline's lane use and control flow, and test\nactual source providers with native fixtures and negative controls.\n\nWhole-owner verification: 79 MATCH, 1 ASM. Full linked image and ELF hashes\nmatch retail; 8,586 linked functions in 658 units. Ordinary repository\nsuite: 860 tests, OK (25 skip records). Pragma audit: all 43 spellings\nrecognized. Native portrait fixtures and negative controls pass at O0/O2.","measures":{"fuzzy_match_percent":68.128075,"total_code":4387560,"matched_code":2989160,"matched_code_percent":68.128075,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9572,"matched_functions_percent":73.05755,"complete_code":1540128,"complete_code_percent":35.102154,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":485}},{"timestamp":"2026-09-30T21:27:08Z","commit_sha":"8407da0ac22444a65389d64fc01aae67e3d481fd","commit_message":"Recover six data aliases to restore four C-linked owners","measures":{"fuzzy_match_percent":68.06462,"total_code":4387560,"matched_code":2986376,"matched_code_percent":68.06462,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9571,"matched_functions_percent":73.04992,"complete_code":1540128,"complete_code_percent":35.102154,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":485}},{"timestamp":"2026-09-30T13:09:33Z","commit_sha":"a988b1dd4e5098431a84057eae7247a99e30f3c4","commit_message":"Match grid and ring renderer with native vertex records","measures":{"fuzzy_match_percent":68.06462,"total_code":4387560,"matched_code":2986376,"matched_code_percent":68.06462,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9571,"matched_functions_percent":73.04992,"complete_code":1510992,"complete_code_percent":34.43809,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":483}},{"timestamp":"2026-09-30T12:01:27Z","commit_sha":"00eaecac292ee22bfae1137f937d97eb52964b28","commit_message":"Match debug list-window controller with native construction and live callbacks","measures":{"fuzzy_match_percent":67.98439,"total_code":4387560,"matched_code":2982856,"matched_code_percent":67.98439,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9570,"matched_functions_percent":73.04228,"complete_code":1510992,"complete_code_percent":34.43809,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":483}},{"timestamp":"2026-09-30T11:50:25Z","commit_sha":"6022e4d2ce8ab2b246a4854e538052030e2c2c71","commit_message":"Match Fcl cursor controller with independent counter lifetimes","measures":{"fuzzy_match_percent":67.894684,"total_code":4387560,"matched_code":2978920,"matched_code_percent":67.894684,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9569,"matched_functions_percent":73.03465,"complete_code":1510992,"complete_code_percent":34.43809,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":483}},{"timestamp":"2026-09-30T10:18:03Z","commit_sha":"bec04bed26b913dc4f14034cb63c4fa9b0323054","commit_message":"Match configuration renderer with complete snapshots and live callback fields","measures":{"fuzzy_match_percent":67.7696,"total_code":4387560,"matched_code":2973432,"matched_code_percent":67.7696,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9568,"matched_functions_percent":73.027016,"complete_code":1510992,"complete_code_percent":34.43809,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":483}},{"timestamp":"2026-09-30T09:43:22Z","commit_sha":"2c1a7e80b401fd25c6efc52d32ddb2c8acde11c2","commit_message":"Match persona-menu renderer with complete color and fade lifetimes","measures":{"fuzzy_match_percent":67.69886,"total_code":4387560,"matched_code":2970328,"matched_code_percent":67.69886,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9567,"matched_functions_percent":73.01939,"complete_code":1502400,"complete_code_percent":34.242268,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":482}},{"timestamp":"2026-09-30T08:41:32Z","commit_sha":"afb7d643ab4de45f595bb05a9454cc3b835b98af","commit_message":"Match skill-menu renderer with complete draw packets","measures":{"fuzzy_match_percent":67.59457,"total_code":4387560,"matched_code":2965752,"matched_code_percent":67.59457,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9566,"matched_functions_percent":73.01176,"complete_code":1491936,"complete_code_percent":34.003773,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":481}},{"timestamp":"2026-09-30T08:36:34Z","commit_sha":"09bc9ed88d0719c9929f0a7e8d0ccb21e91f8126","commit_message":"Recover community menu renderer 00356a10 with coherent byte opacity ABI","measures":{"fuzzy_match_percent":67.47604,"total_code":4387560,"matched_code":2960552,"matched_code_percent":67.47604,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9565,"matched_functions_percent":73.00412,"complete_code":1480272,"complete_code_percent":33.73793,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":480}},{"timestamp":"2026-09-30T07:51:23Z","commit_sha":"2f948e5dbef9301bb033293d9bd072e8c55c3e7c","commit_message":"Match Cmb card dispatcher and preserve native value contracts","measures":{"fuzzy_match_percent":67.23573,"total_code":4387560,"matched_code":2950008,"matched_code_percent":67.23573,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9564,"matched_functions_percent":72.99649,"complete_code":1480272,"complete_code_percent":33.73793,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":480}},{"timestamp":"2026-09-30T07:03:22Z","commit_sha":"5cf459a125aeaca908a1361bee37907c4461463c","commit_message":"Match shuffle result state machine and repair rotation ABI","measures":{"fuzzy_match_percent":67.15222,"total_code":4387560,"matched_code":2946344,"matched_code_percent":67.15222,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9563,"matched_functions_percent":72.98885,"complete_code":1435856,"complete_code_percent":32.725616,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":479}},{"timestamp":"2026-09-30T05:54:29Z","commit_sha":"badc42a3a3fd2ff7ee7304dc59181c74e477f24f","commit_message":"Match the animated menu renderer in C\n\nRecover func_0035fd60 with the actual Vec2f, integer rectangle, palette and opacity snapshots. Preserve fractional scrollbar coordinates and the last row's label alpha.\n\nWhole owner: 77 MATCH / 3 unchanged ASM, all 79 sibling bodies and relocations identical. Resolve all 106 target relocations; validate native literals, owned data and link eligibility. Independent 32-bit behavior fixture passes 2556 scenarios at O0/O2 and rejects 20 regressions. Tooling suite: 837 tests, 27 skipped.","measures":{"fuzzy_match_percent":67.05194,"total_code":4387560,"matched_code":2941944,"matched_code_percent":67.05194,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9562,"matched_functions_percent":72.981224,"complete_code":1424240,"complete_code_percent":32.460865,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":478}},{"timestamp":"2026-09-30T05:45:08Z","commit_sha":"9cde1a84025457fce0dca7e8064101b9d132e48a","commit_message":"Match event blur-filter task construction in C","measures":{"fuzzy_match_percent":66.8882,"total_code":4387560,"matched_code":2934760,"matched_code_percent":66.8882,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9561,"matched_functions_percent":72.973595,"complete_code":1424240,"complete_code_percent":32.460865,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":478}},{"timestamp":"2026-09-30T05:16:37Z","commit_sha":"7e683539f8573832f9a5c3a7387c4d65297c4bd1","commit_message":"Match shuffle side quads and particle renderer in C\n\nRecover func_00385970 with ordered animation phases, native Vec2f snapshots, complete RGB blend arithmetic, and late particle reads. All 4752 bytes match with 47 resolved relocations; 94 sibling bodies and all allocated literals remain unchanged. Add the newly exposed GP angle symbol using five consistent retail references.\n\nValidation: owner 92 MATCH and 3 unchanged vendor ASM, all 90 first-party functions matched; 95-function object eligible for linking. Four native behavior builds pass, all 23 regression mutants rejected. Unit suite: 810 passed, 27 skipped. Scoped lint has no errors. Full image and C-linkage proof will be checked in exact-commit CI.","measures":{"fuzzy_match_percent":66.78427,"total_code":4387560,"matched_code":2930200,"matched_code_percent":66.78427,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9560,"matched_functions_percent":72.96596,"complete_code":1413920,"complete_code_percent":32.225655,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":477}},{"timestamp":"2026-09-30T04:47:32Z","commit_sha":"b28525d87aa00ec932794e4d8eb1b8faf756bf8e","commit_message":"Match the equipment-menu renderer in C\n\nRecover func_00131a00 with native opacity conversions, position snapshots,\nnatural halfword row loops and a coherent u16 border-mode contract.\n\nWhole-owner verification: all 51 functions match across both affected units.\nTarget: 10920 bytes, 0 differing words, retail 0x110 frame; all 85\nrelocations checked and the remaining 8 bytes are zero alignment.\nThe 43-function helper-provider object remains byte-identical.\n\nValidation: 671 behavior scenarios in four sanitizer builds, 810 tests\npassed and 27 skipped, scoped lint has no integrity errors. Both owners\npass link-eligibility and owned-data placement checks. Full image hashes\nrequire the provisioned CI toolchain.","measures":{"fuzzy_match_percent":66.675964,"total_code":4387560,"matched_code":2925448,"matched_code_percent":66.675964,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9559,"matched_functions_percent":72.95833,"complete_code":1413920,"complete_code_percent":32.225655,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":477}},{"timestamp":"2026-09-30T04:12:57Z","commit_sha":"75e83e942678660bdbf1d84cd7ec5d4a775de2b7","commit_message":"Restore guarded movie list-window and Fcl coordinate contracts","measures":{"fuzzy_match_percent":66.426895,"total_code":4387560,"matched_code":2914520,"matched_code_percent":66.426895,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9558,"matched_functions_percent":72.95069,"complete_code":1400128,"complete_code_percent":31.911312,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":476}},{"timestamp":"2026-09-30T03:30:29Z","commit_sha":"9896e8d8eb775613888af8e0212eec0a50b0c125","commit_message":"Merge remote-tracking branch 'origin/main' into work/finish-first-party-20260929","measures":{"fuzzy_match_percent":66.426895,"total_code":4387560,"matched_code":2914520,"matched_code_percent":66.426895,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9558,"matched_functions_percent":72.95069,"complete_code":1400128,"complete_code_percent":31.911312,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":476}},{"timestamp":"2026-09-30T02:26:06Z","commit_sha":"06794ddb26f6c075e2254f70f4d44fea40ba258f","commit_message":"Match the result-screen renderer in C\n\nRecover func_0021fea0 with the retail 0x120 frame, real position snapshots,\npretested loops, correct rectangle/format arguments, and call lifetimes.\nEnable the matched C body and keep the digit-renderer signature coherent\nwith both callers. Scoped loop invariants retain interpolation constants.\n\nVerification with MWCCPS2 b210 -O2 -Iinclude:\n- Whole owner: 13/13 MATCH; target 5676/5680 bytes with one zero tail word\n- Zero differing instruction words; all 65 target relocations resolved\n- All 12 siblings retain identical raw code and relocation records\n- Owned 64-byte rodata placement verified; no assembly/volatile steering\n- Unit tests: 837 run, 805 passed, 32 skipped; lint: zero errors\n- Unchanged C body: 11 behavior scenarios, 2555 assertions across each of\n  four GCC builds, including 32-bit pointer-layout and sanitizer checks\n\nSource SHA-256: ee9eb5dff5376162983293ff02cd8cc46b27416df860252c7d11af6d51f21659\nFull linked-image verification is deferred to the proprietary CI job;\nthe cloud checkout lacks the complete split and b119/EE-GCC toolchain.","measures":{"fuzzy_match_percent":66.426895,"total_code":4387560,"matched_code":2914520,"matched_code_percent":66.426895,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9558,"matched_functions_percent":72.95069,"complete_code":1400128,"complete_code_percent":31.911312,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":476}},{"timestamp":"2026-09-30T01:44:29Z","commit_sha":"a5f69b503915af2f64e0a003ec91e45e9c3528ed","commit_message":"Restore memory-card poll output-pointer contract","measures":{"fuzzy_match_percent":66.29744,"total_code":4387560,"matched_code":2908840,"matched_code_percent":66.29744,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9557,"matched_functions_percent":72.94306,"complete_code":1388912,"complete_code_percent":31.655682,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":475}},{"timestamp":"2026-09-30T00:53:00Z","commit_sha":"b885cef46c3e30e6e55f294ec2369a17d39a075b","commit_message":"Recover guarded unit fades and LineNova VU geometry","measures":{"fuzzy_match_percent":66.29744,"total_code":4387560,"matched_code":2908840,"matched_code_percent":66.29744,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9557,"matched_functions_percent":72.94306,"complete_code":1388912,"complete_code_percent":31.655682,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":475}},{"timestamp":"2026-09-30T00:35:04Z","commit_sha":"b9326cdab2bb7b3934dd924adb0c5b12d5ae8141","commit_message":"Publish canonical Fcl selector delay declaration","measures":{"fuzzy_match_percent":66.29744,"total_code":4387560,"matched_code":2908840,"matched_code_percent":66.29744,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9557,"matched_functions_percent":72.94306,"complete_code":1388912,"complete_code_percent":31.655682,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":475}},{"timestamp":"2026-09-29T23:20:36Z","commit_sha":"e3240cd63ac67997acc193b0a0bae211d1be0be8","commit_message":"Record successful CI proof for six Flash matches","measures":{"fuzzy_match_percent":66.17819,"total_code":4387560,"matched_code":2903608,"matched_code_percent":66.17819,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9556,"matched_functions_percent":72.93543,"complete_code":1388912,"complete_code_percent":31.655682,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":475}},{"timestamp":"2026-09-29T22:24:55Z","commit_sha":"3cc9595e8da8baf2ceb4192e7930e7520ff4584e","commit_message":"Match six Flash particle functions and repair guarded native compiles","measures":{"fuzzy_match_percent":66.17819,"total_code":4387560,"matched_code":2903608,"matched_code_percent":66.17819,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9556,"matched_functions_percent":72.93543,"complete_code":1388912,"complete_code_percent":31.655682,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":475}},{"timestamp":"2026-09-29T20:09:53Z","commit_sha":"664f368d75c1e4eb0b443e03f994ef214b8aea20","commit_message":"Improve guarded Flash and weather reconstructions","measures":{"fuzzy_match_percent":65.86896,"total_code":4387560,"matched_code":2890040,"matched_code_percent":65.86896,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9550,"matched_functions_percent":72.88963,"complete_code":1388912,"complete_code_percent":31.655682,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":475}},{"timestamp":"2026-09-29T19:58:00Z","commit_sha":"fe5ce6e8eb19cf651e28caf704321927af730694","commit_message":"Remove stale source-shape assertions from date consumer test","measures":{"fuzzy_match_percent":65.86896,"total_code":4387560,"matched_code":2890040,"matched_code_percent":65.86896,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9550,"matched_functions_percent":72.88963,"complete_code":1388912,"complete_code_percent":31.655682,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":475}},{"timestamp":"2026-09-29T02:18:34Z","commit_sha":"a72f5154d8db831270fab5815ea3e8254fbe75c0","commit_message":"Promote battle action and fix stream contracts","measures":{"fuzzy_match_percent":64.73849,"total_code":4387560,"matched_code":2840440,"matched_code_percent":64.73849,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9541,"matched_functions_percent":72.820946,"complete_code":1218512,"complete_code_percent":27.771973,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":471}},{"timestamp":"2026-09-28T18:06:58Z","commit_sha":"344bca2110734d98eb8740fff6b5d0a6c3bbe08f","commit_message":"docs: update documentation","measures":{"fuzzy_match_percent":63.26669,"total_code":4387560,"matched_code":2775864,"matched_code_percent":63.26669,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9522,"matched_functions_percent":72.67593,"complete_code":1060512,"complete_code_percent":24.170883,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":460}},{"timestamp":"2026-09-28T17:15:46Z","commit_sha":"7d63163f46c30a50704ce38aca3bf1f3cb882f75","commit_message":"Match title rendering and the ANALYZE action","measures":{"fuzzy_match_percent":63.26669,"total_code":4387560,"matched_code":2775864,"matched_code_percent":63.26669,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9522,"matched_functions_percent":72.67593,"complete_code":1060512,"complete_code_percent":24.170883,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":460}},{"timestamp":"2026-09-28T16:24:31Z","commit_sha":"c7c8734ada7452fd69a38b9ca3788b78fbd232b7","commit_message":"Match the assistance action and close its packet interfaces","measures":{"fuzzy_match_percent":63.143066,"total_code":4387560,"matched_code":2770440,"matched_code_percent":63.143066,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9520,"matched_functions_percent":72.66066,"complete_code":1060512,"complete_code_percent":24.170883,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":460}},{"timestamp":"2026-09-28T15:13:40Z","commit_sha":"67153c5441f4ea4a53a8501bb2b8e5786d594948","commit_message":"Match the battle recovery action and its status contract","measures":{"fuzzy_match_percent":63.11353,"total_code":4387560,"matched_code":2769144,"matched_code_percent":63.11353,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9519,"matched_functions_percent":72.65303,"complete_code":1060512,"complete_code_percent":24.170883,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":460}},{"timestamp":"2026-09-28T14:47:52Z","commit_sha":"4c01ee4caac047d08acb6ec22e16f3bbd8337469","commit_message":"Match Fcl resource and digit renderers","measures":{"fuzzy_match_percent":63.076332,"total_code":4387560,"matched_code":2767512,"matched_code_percent":63.076332,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9518,"matched_functions_percent":72.6454,"complete_code":1060512,"complete_code_percent":24.170883,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":460}},{"timestamp":"2026-09-28T14:18:37Z","commit_sha":"67dd74d16158e4fdf5c721e0a0a6e712dca438f8","commit_message":"Match six battle, item-panel and effect-clone functions","measures":{"fuzzy_match_percent":62.873943,"total_code":4387560,"matched_code":2758632,"matched_code_percent":62.873943,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9516,"matched_functions_percent":72.630135,"complete_code":1060512,"complete_code_percent":24.170883,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":460}},{"timestamp":"2026-09-28T12:31:15Z","commit_sha":"b647343cfaaedf9c8c1864389b5a656ca9131143","commit_message":"Align field shadow runtime fixture with production interfaces","measures":{"fuzzy_match_percent":62.426132,"total_code":4387560,"matched_code":2738984,"matched_code_percent":62.426132,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9507,"matched_functions_percent":72.56144,"complete_code":1060512,"complete_code_percent":24.170883,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":460}},{"timestamp":"2026-09-27T22:00:26Z","commit_sha":"6b4dc5aad92384b8f979860d99be05dfef51d4a0","commit_message":"Recover six first-party shadow, map, date and line functions\n\nReplace the remaining assembly fallbacks for func_00179fc0,\nfunc_0017acc0, func_0018e810, func_00313d20, func_0034ddf0 and\nfunc_0034e360 with matching C. Align the shadow callbacks, menu\nproviders, date consumers and vertex writer with their real interfaces.\n\nGenerate five newly referenced GP data mappings from retail relocation\nevidence so both shadow and map owners retain C link eligibility. Preserve\nboth case-colliding historical probes under distinct Windows-safe names.\nRefresh the matching handoff and generated progress records.\n\nValidation: 9507 MATCH / 3595 ASM, including 6687 / 6861 first-party\nmatches; both retail SHA-1 hashes pass and all 594 C owners remain linked.\nThe full suite runs 820 tests with 10 skips; all 14 native recovery tests\npass with zero skips. Source-honesty lint has zero errors, and generated\nprogress validation passes.","measures":{"fuzzy_match_percent":62.426132,"total_code":4387560,"matched_code":2738984,"matched_code_percent":62.426132,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9507,"matched_functions_percent":72.56144,"complete_code":1060512,"complete_code_percent":24.170883,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":460}},{"timestamp":"2026-09-27T00:51:08Z","commit_sha":"7438a8378957ea760d429870063bc241f02f45e3","commit_message":"Match seven recommended functions and align shared ABI contracts\n\nActivate matching C for 0045b7c0, 00475cd0, 0048a980, 001dd920, 002f0f00, 002fbea0, and 00304580. Migrate shared declarations and callers, preserve supporting recoveries, and update campaign records.\n\nKeep 001a43a0 and 00485630 ASM-backed: their remaining register-allocation differences are unresolved.\n\nVerification: full-tree scan plus subsequent Fcl-owner verification reports 9501 MATCH / 3601 ASM. The full retail link passes both expected SHA1s. The complete Fcl owner compiles with NON_MATCHING, and errors-only decomp lint passes.","measures":{"fuzzy_match_percent":62.212803,"total_code":4387560,"matched_code":2729624,"matched_code_percent":62.212803,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9501,"matched_functions_percent":72.51565,"complete_code":1020768,"complete_code_percent":23.265049,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":457}},{"timestamp":"2026-09-26T17:20:49Z","commit_sha":"5285eb2e1adcfeae1dad1edbd0df8ca820f31107","commit_message":"Reproduce the Kosaka field prototype of func_00478140; match func_00162680\n\nSurvey of every retail caller of func_00477c40 and func_00478140, each\nmeasured under the 32-bit, (u32, u16) and u16 prototypes\n(docs/probe_archive/Prototype_mismatch_00477c40_00478140_20260926.md).\n\nfunc_00478140: the definition's type parameter is int-width. It forwards\nthe type unmasked to the same helpers as func_0047ac90, which forwards\nits type unmasked to func_00477c40, and mdlSE's func_0047df40 fills that\nparameter with an unmasked int. The Kosaka field callers (func_00162680,\nfunc_0015e960, K_Cmd_CREATE_MDL, func_001658b0) pass u16 values unmasked.\nThat module now shares one waived prototype in\ninclude/Kosaka/k_model_internal.h. func_00162680 is installed (MATCH), and\nfunc_001658b0 drops its u32 copy of the model code (still MATCH).\n\nfunc_00477c40: no mismatch is proven, so nothing lands. Only the id\nseparates the callers, and the 32-bit side comes from mdlManager's\nreconstructed plumbing. func_001b1d70 stays ASM until that is typed.\n\nVerified: the 22 affected files go from 875 to 876 MATCH with no\nregressions and no WRONG SYMBOL. H011 drops from 2333 to 2331. Both SHA-1\nOK with 594 objects linked, and 817 tests pass.","measures":{"fuzzy_match_percent":60.369774,"total_code":4387560,"matched_code":2648760,"matched_code_percent":60.369774,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9492,"matched_functions_percent":72.44695,"complete_code":1016128,"complete_code_percent":23.159296,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":456}},{"timestamp":"2026-09-25T18:30:59Z","commit_sha":"f490439fc70aedef37e934dd29d273c9b2861991","commit_message":"Count fully linked progress only for ASM-free C files","measures":{"fuzzy_match_percent":52.16184,"total_code":4387560,"matched_code":2288632,"matched_code_percent":52.16184,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9402,"matched_functions_percent":71.76004,"complete_code":848512,"complete_code_percent":19.33904,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":443}},{"timestamp":"2026-09-25T17:32:59Z","commit_sha":"e3859c6a5ded9c8af671282f8b4089926c490628","commit_message":"Use Debian objcopy for PS2 assembly in CI","measures":{"fuzzy_match_percent":52.16184,"total_code":4387560,"matched_code":2288632,"matched_code_percent":52.16184,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":9402,"matched_functions_percent":71.76004,"complete_code":3381288,"complete_code_percent":77.06534,"complete_data":0,"complete_data_percent":100,"total_units":869,"complete_units":599}},{"timestamp":"2026-09-22T16:35:06Z","commit_sha":"693a76fa02f25d9518af151bbde41bf7e798e3b1","commit_message":"Extend context proposals with the expanded anchor set","measures":{"fuzzy_match_percent":48.30457,"total_code":4387560,"matched_code":2119392,"matched_code_percent":48.30457,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8707,"matched_functions_percent":66.455505,"complete_code":1239504,"complete_code_percent":28.250418,"complete_data":0,"complete_data_percent":100,"total_units":517,"complete_units":191}},{"timestamp":"2026-09-22T16:16:25Z","commit_sha":"42c8c936799342ffeb533c273b292174c9954be9","commit_message":"Recover the final particle update, camera setup, and field queries","measures":{"fuzzy_match_percent":48.30457,"total_code":4387560,"matched_code":2119392,"matched_code_percent":48.30457,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8707,"matched_functions_percent":66.455505,"complete_code":1204040,"complete_code_percent":27.442131,"complete_data":0,"complete_data_percent":100,"total_units":490,"complete_units":180}},{"timestamp":"2026-09-22T15:30:42Z","commit_sha":"b287c53e35988d864bd7382ef8f10a0ef9d3ddf7","commit_message":"Recover four first-party functions and preserve their source linkage","measures":{"fuzzy_match_percent":48.1773,"total_code":4387560,"matched_code":2113808,"matched_code_percent":48.1773,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8703,"matched_functions_percent":66.42497,"complete_code":1204040,"complete_code_percent":27.442131,"complete_data":0,"complete_data_percent":100,"total_units":490,"complete_units":180}},{"timestamp":"2026-09-22T13:08:04Z","commit_sha":"457acdb30c641ac5d68ce03c80e361aa128ec526","commit_message":"Complete RenderWare and CRI source unit ports","measures":{"fuzzy_match_percent":47.862957,"total_code":4387560,"matched_code":2100016,"matched_code_percent":47.862957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8699,"matched_functions_percent":66.39445,"complete_code":1204040,"complete_code_percent":27.442131,"complete_data":0,"complete_data_percent":100,"total_units":490,"complete_units":180}},{"timestamp":"2026-09-22T13:05:58Z","commit_sha":"f8bd21cb6bdfbf87fe6b635775210f1ff2689f22","commit_message":"Recover six first-party render, community and dungeon functions","measures":{"fuzzy_match_percent":47.728577,"total_code":4387560,"matched_code":2094120,"matched_code_percent":47.728577,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8585,"matched_functions_percent":65.524345,"complete_code":1203992,"complete_code_percent":27.441038,"complete_data":0,"complete_data_percent":100,"total_units":481,"complete_units":178}},{"timestamp":"2026-09-22T11:38:14Z","commit_sha":"2260985773b9b9c7b7a9aeb487ee0e2aa80f909f","commit_message":"Recover twelve first-party functions and align texture visitor contracts\n\nRecover battle camera and panel routines, the persona growth preview, model motion and resource loading, flare and color updates, radar drawing, and the card-effect controller as exact C. Complete the interrupted ring-segment verification with bounded color-table views and full owned-data proofs.\n\nShare the actual texture visitor signature across its definition and four callers. The typed callback preserves all 178 affected functions' native instructions, relocations and data.\n\nThe authenticated first-party checkpoint advances from 6488 MATCH / 372 ASM to 6500 MATCH / 360 ASM. Each new recovery has current-source native and official owner evidence, unmasked relocation and data proofs, and unchanged sibling coverage. Retain the preceding worker investigations and closure notes.","measures":{"fuzzy_match_percent":47.47732,"total_code":4387560,"matched_code":2083096,"matched_code_percent":47.47732,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8579,"matched_functions_percent":65.47855,"complete_code":1206104,"complete_code_percent":27.489174,"complete_data":0,"complete_data_percent":100,"total_units":481,"complete_units":179}},{"timestamp":"2026-09-22T10:04:58Z","commit_sha":"c14b4471326a7cfc6bb9787cb1dbe5f2cd43b68d","commit_message":"Recover RenderWare core plugin attachment","measures":{"fuzzy_match_percent":47.09442,"total_code":4387560,"matched_code":2066296,"matched_code_percent":47.09442,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8567,"matched_functions_percent":65.38696,"complete_code":1206104,"complete_code_percent":27.489174,"complete_data":0,"complete_data_percent":100,"total_units":481,"complete_units":179}},{"timestamp":"2026-09-22T09:37:26Z","commit_sha":"f619f467c225de7d4c134f94ae40770972b5d9e2","commit_message":"Recover 35 verified first-party functions from the interrupted campaign","measures":{"fuzzy_match_percent":47.08312,"total_code":4387560,"matched_code":2065800,"matched_code_percent":47.08312,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8566,"matched_functions_percent":65.37933,"complete_code":1206104,"complete_code_percent":27.489174,"complete_data":0,"complete_data_percent":100,"total_units":481,"complete_units":179}},{"timestamp":"2026-09-22T08:58:10Z","commit_sha":"ee914830d10fac8e0b161d49ee179e4979278ae1","commit_message":"Resolve CRI identities and clump offsets","measures":{"fuzzy_match_percent":42.141144,"total_code":4387560,"matched_code":1848968,"matched_code_percent":42.141144,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8454,"matched_functions_percent":64.5245,"complete_code":1082504,"complete_code_percent":24.67212,"complete_data":0,"complete_data_percent":100,"total_units":481,"complete_units":176}},{"timestamp":"2026-09-22T08:08:17Z","commit_sha":"00c07b0a0efd0ce60d7cfe0a3fdc2c5efc5ac040","commit_message":"Correct CRI ownership and CI dependency locks","measures":{"fuzzy_match_percent":42.14005,"total_code":4387560,"matched_code":1848920,"matched_code_percent":42.14005,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8453,"matched_functions_percent":64.51687,"complete_code":1082504,"complete_code_percent":24.67212,"complete_data":0,"complete_data_percent":100,"total_units":481,"complete_units":176}},{"timestamp":"2026-09-22T07:09:32Z","commit_sha":"7387466730343d079f63ca47da0a1fbeebfd7cd6","commit_message":"Finish RenderWare and CRI recovery\n\nPort exact vendor functions, recover UV animation names, and make the standalone CI tooling self-contained.","measures":{"fuzzy_match_percent":42.14005,"total_code":4387560,"matched_code":1848920,"matched_code_percent":42.14005,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8453,"matched_functions_percent":64.51687,"complete_code":1082504,"complete_code_percent":24.67212,"complete_data":0,"complete_data_percent":100,"total_units":481,"complete_units":176}},{"timestamp":"2026-09-20T16:26:16Z","commit_sha":"402dbb6dadbe148a076e8561ae0f32e1d01efe67","commit_message":"audit every volatile: nine were dead, five are false matches\n\nAll 18 H001 sites were inside functions reporting MATCH, which is the\ndangerous arrangement: if the `volatile` is a codegen trick then the MATCH\nwas bought with a construct retail's source cannot have had.  Each site was\ntested by deleting the `volatile`, then by the permitted pragmas, then\nagainst retail's own instructions.\n\nNine were doing NOTHING.  Deleting them keeps the match exactly:\n  code1_0029.c  func_0029ecb0  8 sites, 63 MATCH before and after\n  code1_0034.c  func_0034a8b0  1 site,  28 MATCH before and after\nThe 0029 pad-input reads are genuinely re-read by retail (offsets 36/172/\n308/444 and 56/192/328/464) - the scoped `opt_loop_invariants on` already\nthere is what earns that, not the casts.  On 0034 the hoisted spelling was\ntried and correctly rejected: retail has the `lui` before the loop and the\n`lwc1` inside it, so the four re-reads are real.\n\nFive are load-bearing, and are now recorded as DEMOTION CANDIDATES with the\nalternatives that were measured and failed:\n  h_cdvd.c        func_00455b70  plain, both assignment orders, the field\n                                 inlined at the call, and three pragmas -\n                                 every one loses the match on a two-word\n                                 load-order swap.  The agent also checked\n                                 the struct: sdkCdvd.c:120 writes the field\n                                 plainly, so \"a driver would mark it\n                                 volatile\" does not hold.\n  shdPersona.c    func_0011c3e0  plain 21 words, hoisted 75 and provably\n                                 wrong (retail loops to 0x0011C404, loads\n                                 ten times plus once after), plain plus\n                                 loop pragma 449.\n  code1_0045.c    func_0045ed60  a lying prototype.  Its old note argued\n                                 for keeping it; all three claims were\n                                 re-measured and hold.\n  k_fldUnit.c     func_00163990  plain 32 words, scoped pragma 32, whole\n                                 unit 25.\n  code1_003c_cw119.c func_003c4140 four volatile locals.  Plain, a `u8[4]`\n                                 written and read back, and an extra\n                                 pragma all lose it.  b119 unit, so b210\n                                 intuitions may not transfer.\n\nOne is legitimate and now says why: effPolygonTrack.c func_004938e0 reads a\nstack slot that the COP2 block writes with a hard-coded `sw $2, 0x90($sp)`.\n`sp90` has its address taken nowhere, so b210 rightly concludes no asm\ntouched it and the \"memory\" clobber does not reach it.  A plain read, an\n`\"=m\"(sp90)` asm output, and an address-taken local were each measured and\neach loses the match.  That volatile is the block's output path, not a\nreload hack.\n\nAlso by hand, func_00304580 in y_fclCombine.c: seven `s64` temps forcing\n`__floatdisf` where retail converts in 32 bits.  Six were the\n`(s64)(x << 0x30) >> 0x30` sign-extend-from-16 idiom, one a gratuitous cast\naround an `s32` sum.  Retail at 0x00304F7C is `addiu $2, $19, 0x149` /\n`mtc1 $2, $f0` / nop / `cvt.s.w $f12, $f0` - inline, no call - and all 33\nconversions in that listing are `cvt.s.w`.  Helpers 3 -> 0, edits\n2299 -> 2279, words 3791 -> 3778.\n\nH001 18 -> 9.  Image 3d1d3d2b, SLUS 4eeec036, 646 tests, lint 0 errors.","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T15:48:37Z","commit_sha":"1c9247f96732c910476c611ed40081d01cd7b706","commit_message":"helper census round, and two floors that were invisible\n\nSix floors had s64 temps forcing MWCC runtime conversion calls that retail\ndoes not make.  Each fix was checked against retail's own listing first;\nthe census only pointed at them.\n\n  func_00314ef0  4 -> 0 helpers  242 -> 82 edits   +17.0% OUTSIDE -> +1.9%\n  func_002a7920  4 -> 0          910 -> 759        1562 -> 1556, toward retail\n  func_00356a10  8 -> 0          2865 -> 2820      2708 -> 2690, toward retail\n  func_002da0a0  3 -> 0          1199 -> 1180      1260 -> 1255, toward retail\n  func_002f0f00  6 -> 0          2929 -> 2909      in band, see below\n  func_00267b20  2 -> 0          169 -> 158        deficit 8 -> 0\n\nMy acceptance rule for these was wrong and Dh2f0f00 showed why.  I had\nrequired the object instruction count to move toward retail.  On a body\nalready SHORTER than retail that forbids the right answer: a helper call is\n`jal` plus argument shuffling and is always longer than the `lwc1` that\nreplaces it, so a correct removal must move the count further away.  The\nrule now applies the count check only when the object is longer, and judges\na short floor on retail's shape plus the edit count.  func_0019c0d0 came\nback with no change banked under that rule, which is the rule working.\n\ntools/libcall_scan.py counts the OBJECT only.  It cannot check whether\nretail makes the same call: the disassembly names every callee by address,\nand while build/slus21782.elf does carry 22309 symbols those names are\nproject metadata, not something the retail bytes authenticate.  Both the\ntool and the datCalc note now say so, and nine tests pin the wording and\nthe relocation parsing so the scanner cannot quietly become vacuous.\n\nTwo floors were not being measured at all, which is worse than measuring\nthem badly:\n\n  func_0023e6f0 stopped compiling when `extern s32 func_00243e30(u16 *)`\n  was added at datCalc.c:3667.  That note says it was placed \"so earlier\n  implicit uses are unaffected\" - true, but this body is later in the file\n  and passes its `u8 *` parameter.  Cast both call sites the way line 3788\n  already does.  Retail 2732 vs object 2774, +1.54% INSIDE, 1370 edits.\n  The old \"Not banked: count outside band\" verdict was wrong as well.\n\n  func_003e3110 was raw m2c output whose K&R scaffolding externs\n  contradicted the real prototypes at lines 57-58, so it had never\n  compiled.  Dropped the duplicate rows and the fourteen unused m2c\n  typedefs and macros, gave the three externs used only here real\n  parameter lists.  Retail 118 vs object 118 - exact - and 96 edits.\n\nNeither was noticed because a guarded body is never compiled by build.py\nand gate_audit.py reported both inside a bare \"24 could not be measured\"\ntally that read like rounding noise.  It now names every one and separates\na BROKEN body from the 23 markers that simply sit on an INCLUDE_ASM row\nwith nothing under them.  Tree-wide: 560 inside, 20 outside, 0 broken.\n\nImage 3d1d3d2b, SLUS 4eeec036, 646 tests, lint 0 errors / 295 warnings.","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T15:01:37Z","commit_sha":"18812e73b5b7ee395362fbe7ccb661fd72f7da35","commit_message":"libcall_scan: state that only the object side is counted and why retail cannot be machine-checked","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T14:48:31Z","commit_sha":"d66c4f35504b8a8d0c95ee67b5a387a4aa564eaf","commit_message":"remove two dead locals that were not load-bearing; both functions still MATCH byte-exactly","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T14:38:28Z","commit_sha":"ed5390b4a590c61e78d5f54bcd807799cd133e9f","commit_message":"func_00235520 1724->1636 and 3211->3187: the fix is the RHS, not the declaration; helper census 8->0","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T14:24:21Z","commit_sha":"4474cc1a20bcc51991dd3454ab147b6c536d54de","commit_message":"func_002ed430 2856->2559, func_003191c0 763->667; name func_00235520's surplus as eight __floatdisf calls","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T13:35:41Z","commit_sha":"73ccc27c70d155e73236c681a4d4c0ccc98e869a","commit_message":"tools/libcall_scan.py: find bodies pulling in runtime helpers retail never calls","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T13:30:09Z","commit_sha":"09cab5e220be33652f2515d9224c17adbcb1ba35","commit_message":"func_0016bdd0 back inside the band at -3.0%, deficit 203->69","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T13:24:04Z","commit_sha":"18008196ee63a8486e92454583fba9d5b37ba3d5","commit_message":"func_0044fa90 132->101: hoist the float the body reloaded, un-hoist the pointer it cached; func_0027f6f0 1039->766","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T13:16:01Z","commit_sha":"2e67f79276adef2a75fc9d376a339d3e450ae264","commit_message":"func_002566d0: the compact unsigned form is better here but leaves the band, both measured","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T13:08:45Z","commit_sha":"93b08f622e3623ac3c3c746a8f49410112c65ce1","commit_message":"func_002cdf80 into the band; record that owner_of.py must be run on the literal batch list","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T13:05:39Z","commit_sha":"cffcc247424a04ffdce6e6c784f0ef6acfb3ede9","commit_message":"double the unsigned conversion with an add, not a multiply: func_0026a020 into the band, two more floors","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T12:43:07Z","commit_sha":"3b26379d9c51af0e4fcf62494a6d7626fa5a1afa","commit_message":"func_004a5fc0 into the band: (u32) not (u16) drops eight redundant andi masks","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T12:28:34Z","commit_sha":"4b1f207517e10351e2b4fe87c5fda0c35d1b80f1","commit_message":"ABSENT recovery round: func_001265a0 exact 4404/4404, func_00212270 into the band, seven skeleton arms","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T11:56:31Z","commit_sha":"4ec489386f3dc93898a2ed1f40ea5fc4607a12d6","commit_message":"CROSS-aware round: func_001fd790 566->306 exact, func_00185850 785->402, func_0021be80 and func_004b1ad0 into the band","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T11:21:28Z","commit_sha":"527b6a0632175785959e8b42b3758d5a88ef0f45","commit_message":"deficit_scan: distinguish an alignment CROSS from genuinely absent code","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T11:15:16Z","commit_sha":"f3d59b1db2d7accbedd34e265ecb86d315dcba70","commit_message":"func_002f0f00 4120->2929 and into the band; one reload line worth 836 edits","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T11:06:29Z","commit_sha":"a38ec7b7addd45f77b2dd2f2e65300e12dd8c391","commit_message":"tools/owner_of.py: refuse a dispatch batch whose functions share a file","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T11:01:43Z","commit_sha":"90b63aaf3d60fd39cbd8b6834ef1b91faff0502c","commit_message":"func_00471370 to an exact 1776/1776; func_0023a6b0 805->188; func_001f14f0 float suffixes -44","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T10:41:33Z","commit_sha":"f78b71f5e6df12e5a60d1d4513735b71f9b7a371","commit_message":"func_004b8f40 2907->1716 with an exact 1932/1932 count; func_0017f490 3015->2407; func_00257900 back inside the band","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T10:07:33Z","commit_sha":"167e60795ba3547a845e88afce35d643dc2a8671","commit_message":"func_00356a10: the hand-written unsigned-conversion idiom is correct, (f32)(u32) is 486 edits worse","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T09:08:46Z","commit_sha":"85b045c278ca42165bb353373db766939d9893db","commit_message":"handoff: arm order is exhausted as a mechanical lever, four of 167 floors responded","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T08:50:09Z","commit_sha":"3a655dbb006bc5db1fb3393939037c42cc3445e6","commit_message":"func_002de5a0: retail's three saved floats named, hoisting them leaves the gate","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-20T08:33:35Z","commit_sha":"0360227d0a4194cb84500a5cf63ac554b38a79c2","commit_message":"Refresh the audited verifier input pin without changing fallback bytes","measures":{"fuzzy_match_percent":41.077957,"total_code":4387560,"matched_code":1802320,"matched_code_percent":41.077957,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8011,"matched_functions_percent":61.143337,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T16:09:27Z","commit_sha":"cb77ff2751b46e13aeb8b768c3e9538625eccc0e","commit_message":"regsave_scan: only $f20-$f31 are callee-saved","measures":{"fuzzy_match_percent":40.850403,"total_code":4387560,"matched_code":1792336,"matched_code_percent":40.850403,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8005,"matched_functions_percent":61.09754,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T16:07:13Z","commit_sha":"02898dd4b9478373e4948a22be1cc11106c9c3b3","commit_message":"func_00152170 MATCH via RenderWare callback typing; func_00233bc0 switch 148 edits to 70","measures":{"fuzzy_match_percent":40.850403,"total_code":4387560,"matched_code":1792336,"matched_code_percent":40.850403,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8005,"matched_functions_percent":61.09754,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T15:53:25Z","commit_sha":"8c005fe9e0e0cea6a53cd096508d4132fe9df797","commit_message":"func_00288af0: retail's dispatch is a switch, 409 edits to 104; handoff 7av","measures":{"fuzzy_match_percent":40.82269,"total_code":4387560,"matched_code":1791120,"matched_code_percent":40.82269,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8004,"matched_functions_percent":61.08991,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T15:48:14Z","commit_sha":"3a6a8e7eabe8487767cc27bab294f6521d30ec85","commit_message":"unbank func_00471370 (+44.2%); keep func_0047b0c0 at -4.6% with its gate stamp","measures":{"fuzzy_match_percent":40.82269,"total_code":4387560,"matched_code":1791120,"matched_code_percent":40.82269,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8004,"matched_functions_percent":61.08991,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T15:41:37Z","commit_sha":"9f866b745ebe7184d7ee33f0aef76cedf797dff4","commit_message":"reinstall func_0017d3c0 guarded (TU eligibility restored); name func_0015d310's callees","measures":{"fuzzy_match_percent":40.82269,"total_code":4387560,"matched_code":1791120,"matched_code_percent":40.82269,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8004,"matched_functions_percent":61.08991,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T15:35:19Z","commit_sha":"745ea72cdec809258e8d9d70054495d5fd2ac496","commit_message":"func_00242990 and func_0015d310 MATCH; revert k_fldAI.c body that unlinked its TU","measures":{"fuzzy_match_percent":40.82269,"total_code":4387560,"matched_code":1791120,"matched_code_percent":40.82269,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8004,"matched_functions_percent":61.08991,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T15:01:26Z","commit_sha":"19d2eb4d35c240d0931c073619afc141ad11cc06","commit_message":"regsave_scan: compare nop density too, with tests for the prologue decoder","measures":{"fuzzy_match_percent":40.724228,"total_code":4387560,"matched_code":1786800,"matched_code_percent":40.724228,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8002,"matched_functions_percent":61.074646,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T14:58:02Z","commit_sha":"5ec17617400b4cc7a414f6040f1109982529d324","commit_message":"install func_002da0a0's inside-band body (1260/1240)","measures":{"fuzzy_match_percent":40.724228,"total_code":4387560,"matched_code":1786800,"matched_code_percent":40.724228,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8002,"matched_functions_percent":61.074646,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T14:57:09Z","commit_sha":"f46f8b7ae32e796d10c510af558f93326a34338f","commit_message":"func_00308f40 inside the gate by dropping schedule on; handoff 7at and 7au","measures":{"fuzzy_match_percent":40.724228,"total_code":4387560,"matched_code":1786800,"matched_code_percent":40.724228,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8002,"matched_functions_percent":61.074646,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T14:44:08Z","commit_sha":"d821ba1070d4d03bf06b4d59bf0ed7cfaa99f498","commit_message":"install func_0035aff0's inside-band body (700/696, 167 edits)","measures":{"fuzzy_match_percent":40.724228,"total_code":4387560,"matched_code":1786800,"matched_code_percent":40.724228,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8002,"matched_functions_percent":61.074646,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T14:42:27Z","commit_sha":"80b10076914c1f8f11a030bf44a5394f5e64d234","commit_message":"func_00467bd0: retail's stack buffer, real func_004688d0 prototype, no dead arm","measures":{"fuzzy_match_percent":40.724228,"total_code":4387560,"matched_code":1786800,"matched_code_percent":40.724228,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8002,"matched_functions_percent":61.074646,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T14:30:52Z","commit_sha":"6cb0a123da5e8bbcb7b2b2026b83967f7c877417","commit_message":"func_00216e60 inside the gate; add tools/regsave_scan.py","measures":{"fuzzy_match_percent":40.724228,"total_code":4387560,"matched_code":1786800,"matched_code_percent":40.724228,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8002,"matched_functions_percent":61.074646,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T14:27:41Z","commit_sha":"1f0a64bb1e457f9170596b347b4e8fa3b5a3b41e","commit_message":"func_002561f0: unsigned byte extraction, retail's mask set, drop the dummy local","measures":{"fuzzy_match_percent":40.724228,"total_code":4387560,"matched_code":1786800,"matched_code_percent":40.724228,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8002,"matched_functions_percent":61.074646,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T14:16:38Z","commit_sha":"47cc02f50ecacd37749f7b114d7d4663353d9415","commit_message":"handoff 7as: a short frame aliases locals and costs hundreds of edits","measures":{"fuzzy_match_percent":40.724228,"total_code":4387560,"matched_code":1786800,"matched_code_percent":40.724228,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8002,"matched_functions_percent":61.074646,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T14:15:51Z","commit_sha":"5da56d560999e03df71851c7b7400308728fc4cf","commit_message":"revert three unjustified pragmas; keep the propagation fix that reaches an exact count","measures":{"fuzzy_match_percent":40.724228,"total_code":4387560,"matched_code":1786800,"matched_code_percent":40.724228,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8002,"matched_functions_percent":61.074646,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T14:09:19Z","commit_sha":"8e055b0dd8b534e4bdb2e67845ad67a6bb916a17","commit_message":"bring func_00164230 and func_0022a730 inside the gate; effPolygonWind exact count","measures":{"fuzzy_match_percent":40.724228,"total_code":4387560,"matched_code":1786800,"matched_code_percent":40.724228,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8002,"matched_functions_percent":61.074646,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T13:48:13Z","commit_sha":"e53b14bddd44536bd166ab6222bc7f5ffd6ceb36","commit_message":"handoff 7ar: where the early return goes decides the layout","measures":{"fuzzy_match_percent":40.724228,"total_code":4387560,"matched_code":1786800,"matched_code_percent":40.724228,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8002,"matched_functions_percent":61.074646,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T13:47:56Z","commit_sha":"e669b8bafc87bd9010a6d87f867a4cc27253f655","commit_message":"func_003c1bd0 MATCHES: the zero return is an else on the outer test","measures":{"fuzzy_match_percent":40.724228,"total_code":4387560,"matched_code":1786800,"matched_code_percent":40.724228,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8002,"matched_functions_percent":61.074646,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T13:33:30Z","commit_sha":"a237e46804a35820f037a493dbd59928e1bcf01e","commit_message":"bank arm-order and hoist repairs across btlFormation, code1_001b, shuffle, effPolygonFlash","measures":{"fuzzy_match_percent":40.72058,"total_code":4387560,"matched_code":1786640,"matched_code_percent":40.72058,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8001,"matched_functions_percent":61.067013,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T13:26:26Z","commit_sha":"ff96c7c6e0ca0c4f509f00894a2f509c33797066","commit_message":"func_00137890: restore the retail colour addresses and panel flag polarity","measures":{"fuzzy_match_percent":40.72058,"total_code":4387560,"matched_code":1786640,"matched_code_percent":40.72058,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8001,"matched_functions_percent":61.067013,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T13:13:56Z","commit_sha":"ed3e0a7c6044ca5adce24936c2b8d18aad78725a","commit_message":"hoist repeated address materialisation in six floors; tag the eff_after guard","measures":{"fuzzy_match_percent":40.72058,"total_code":4387560,"matched_code":1786640,"matched_code_percent":40.72058,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8001,"matched_functions_percent":61.067013,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T12:52:33Z","commit_sha":"9175bd1cb5517879c66a96db636866127d01b1bf","commit_message":"handoff 7aq: edits per instruction finds relocated blocks","measures":{"fuzzy_match_percent":40.72058,"total_code":4387560,"matched_code":1786640,"matched_code_percent":40.72058,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8001,"matched_functions_percent":61.067013,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T12:45:47Z","commit_sha":"9114620625d74f1227acf5c024d975b93edec4e6","commit_message":"record the shdMisc hoist history check","measures":{"fuzzy_match_percent":40.72058,"total_code":4387560,"matched_code":1786640,"matched_code_percent":40.72058,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8001,"matched_functions_percent":61.067013,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T12:19:04Z","commit_sha":"9e518a4c4ea181b095bcf4e52907e4759d349cca","commit_message":"handoff 7ao: the four steps that matched func_001b6ab0","measures":{"fuzzy_match_percent":40.72058,"total_code":4387560,"matched_code":1786640,"matched_code_percent":40.72058,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8001,"matched_functions_percent":61.067013,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T12:18:46Z","commit_sha":"6b623868f2a91358e772505518cec60e7460617b","commit_message":"func_001b6ab0 MATCHES: table-base hoist, first-use init, retail block layout","measures":{"fuzzy_match_percent":40.72058,"total_code":4387560,"matched_code":1786640,"matched_code_percent":40.72058,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8001,"matched_functions_percent":61.067013,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T12:14:00Z","commit_sha":"2a9a2576a164c9d3b56847609de79f7fc20ab068","commit_message":"bank four floors; make boundary reconciliation skip probe scratch","measures":{"fuzzy_match_percent":40.72058,"total_code":4387560,"matched_code":1786640,"matched_code_percent":40.72058,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8001,"matched_functions_percent":61.067013,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T12:00:01Z","commit_sha":"641f914ae3503208d4b46f3703bd92ff45fac8bc","commit_message":"func_0015d310: retail's counted for takes it 97 words to 14 at an exact count","measures":{"fuzzy_match_percent":40.688858,"total_code":4387560,"matched_code":1785248,"matched_code_percent":40.688858,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8000,"matched_functions_percent":61.05938,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T11:40:15Z","commit_sha":"a6ae9f1eb2884c443fcef67ad1609ae9572e20eb","commit_message":"bank func_001f14f0 and func_00321e60 cold floors; delete a phantom block from func_0031e5b0","measures":{"fuzzy_match_percent":40.688858,"total_code":4387560,"matched_code":1785248,"matched_code_percent":40.688858,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8000,"matched_functions_percent":61.05938,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T11:28:44Z","commit_sha":"6f2875cfd48f33feb8f28b7fc78d09542d3b4751","commit_message":"close the code1_001c margin; document residual pairs on eight near-MATCH floors","measures":{"fuzzy_match_percent":40.688858,"total_code":4387560,"matched_code":1785248,"matched_code_percent":40.688858,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8000,"matched_functions_percent":61.05938,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T11:12:02Z","commit_sha":"7fa7100b04631000d78ccdc2cfe75d2d3eda036f","commit_message":"lint M004: a note between a marker and its INCLUDE_ASM steals the next function's owner","measures":{"fuzzy_match_percent":40.688858,"total_code":4387560,"matched_code":1785248,"matched_code_percent":40.688858,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8000,"matched_functions_percent":61.05938,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T10:43:59Z","commit_sha":"b5daa3ccbf48247a88fda33b2486943a77131584","commit_message":"bank code1_0026 cold floor; record cmpEquip/datCalc/code1_0012 decompositions","measures":{"fuzzy_match_percent":40.688858,"total_code":4387560,"matched_code":1785248,"matched_code_percent":40.688858,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8000,"matched_functions_percent":61.05938,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T09:28:43Z","commit_sha":"44eded78c6194d25f7b20dbc8d7ae8c184716792","commit_message":"recover func_001cb970 to an exact count; two more cold reconstructions inside the gate","measures":{"fuzzy_match_percent":40.688858,"total_code":4387560,"matched_code":1785248,"matched_code_percent":40.688858,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8000,"matched_functions_percent":61.05938,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T08:55:42Z","commit_sha":"d72ec9f22881fb03b00145e520e4ea620b9d6ba6","commit_message":"close deficits in y_draw, code1_0013/0014/0046, k_fldResource; document the closest first-party floors","measures":{"fuzzy_match_percent":40.688858,"total_code":4387560,"matched_code":1785248,"matched_code_percent":40.688858,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":8000,"matched_functions_percent":61.05938,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T07:45:47Z","commit_sha":"58009ef8776f2beb6c55da8d066119dec1fdbbc3","commit_message":"repair eight out-of-gate floors: prototypes, address materialisation, delay-slot scheduling","measures":{"fuzzy_match_percent":40.67755,"total_code":4387560,"matched_code":1784752,"matched_code_percent":40.67755,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7997,"matched_functions_percent":61.036484,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T07:09:59Z","commit_sha":"8e8310a7525d8fa94b34abf1b6610601f518339b","commit_message":"close hole-against-lump composition defects: func_001a17d0 matches at 298/298","measures":{"fuzzy_match_percent":40.67755,"total_code":4387560,"matched_code":1784752,"matched_code_percent":40.67755,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7997,"matched_functions_percent":61.036484,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T06:22:59Z","commit_sha":"a2cd9525d720cd696954eb264382272fe428b5e8","commit_message":"close eight more out-of-gate floors; add handoff 7aa on holes cancelling against lumps","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T05:40:33Z","commit_sha":"bc3267af114b2b488871bbda4d5b6820f1b86b22","commit_message":"close seven out-of-gate floors; document UB-driven store deletion as handoff 7z","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T05:13:12Z","commit_sha":"67f10c709a17dd0c0414060a500ad3bd326cc5b4","commit_message":"add tools/gate_audit.py and stamp 68 out-of-gate floors with their real counts","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T04:51:30Z","commit_sha":"eb328c6e61e1231cac5f29d42395547a0c24e053","commit_message":"adjudicate func_0035fd60: the 1522 floor was outside the gate; keep the in-gate body and add handoff 7y","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T04:45:27Z","commit_sha":"27089f55eeffc7f47b064cb2df83ebfa89c3d428","commit_message":"census round three: five floors improved; delete the stale hardware-asm mirror that ate three workers' output","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T04:00:18Z","commit_sha":"c385f31dfc6ffe80bcdfc55aed5a9549c1992452","commit_message":"trace an sd surplus to a missing prototype (func_00263cb0 915->908); add tools/missing_prototypes.py and handoff 7w, 7x","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T03:41:35Z","commit_sha":"9e894b0f5382c67e478795fe189a3f8337bae9d6","commit_message":"census round two: nine floors improved, signedness solver extended to four spellings","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T02:53:13Z","commit_sha":"d46975ed366f388f3c66834fa1d4f7763b33cc10","commit_message":"add tools/solve_signedness.py: census-driven signedness solver with count gating and feedback writeback","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T02:02:45Z","commit_sha":"d42dd7cdcaa9ddb84968ee0c7afcb61ac07ef9e2","commit_message":"close four count gaps and bank them; reject two false gate passes; add handoff 7t and 7u","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T00:48:00Z","commit_sha":"2ac9b3622d89b16c58f1c18ca23a366607ef0407","commit_message":"bank six cold reconstructions including func_00263cb0 after writing its missing switch arm; add handoff 7s","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-19T00:11:16Z","commit_sha":"3c9ef0fc1ce9fbf9025ce7ff1f5e6056c4eb166b","commit_message":"bank seven more cold reconstructions; scan the 7r accumulator class; recover a mirror-tree diagnosis","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T23:26:01Z","commit_sha":"31240fdf7ba047ae129d967e1264d6d109c7066e","commit_message":"bank eight cold reconstructions; document the b210 FPU accumulator rule as handoff 7r","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T22:45:08Z","commit_sha":"6e08b2011b2dbbb478fa7a1f2e6f6f6e393afae3","commit_message":"bank seven more cold reconstructions; close the func_001f4e50 row-struct hypothesis","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T21:57:52Z","commit_sha":"2c7eadb16d574bf7375f635d07242a59479ee020","commit_message":"improve func_001f4e50 57->13 via the row-address form; bank six cold reconstructions","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T21:22:41Z","commit_sha":"58464708ab0df8be5556385411c9fb614dbcbf46","commit_message":"match: func_00100670 recovered from the archive; bank four more floors; record the archive staleness","measures":{"fuzzy_match_percent":40.650204,"total_code":4387560,"matched_code":1783552,"matched_code_percent":40.650204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7996,"matched_functions_percent":61.02885,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T20:42:04Z","commit_sha":"7e57fd8469386d82af333a54618914d6d147f3f8","commit_message":"match: func_001c79f0 and func_0025dd30; correct the 7c parameter-order claim; recover two archived bodies","measures":{"fuzzy_match_percent":40.60717,"total_code":4387560,"matched_code":1781664,"matched_code_percent":40.60717,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7995,"matched_functions_percent":61.021217,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T20:23:45Z","commit_sha":"be6ec11e6674cf162105acdf8a3bdd45c118acc1","commit_message":"bank six more untried functions; re-probe the exchange class against handoff 7o (88 measurements, all ties)","measures":{"fuzzy_match_percent":40.54153,"total_code":4387560,"matched_code":1778784,"matched_code_percent":40.54153,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7993,"matched_functions_percent":61.005955,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T19:51:58Z","commit_sha":"0f89f9ae081d696f15fb569472638e9c0e09d025","commit_message":"match: func_001eca10 (11->0) via handoff 7o; teach residual_signature.py the register-class and exchange signatures","measures":{"fuzzy_match_percent":40.54153,"total_code":4387560,"matched_code":1778784,"matched_code_percent":40.54153,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7993,"matched_functions_percent":61.005955,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T19:32:33Z","commit_sha":"4b6d24f8a91570f1e9d57b60236fd9e88839581e","commit_message":"improve: func_0013fb50 34->28 by splitting a shared loop counter; seven more untried functions","measures":{"fuzzy_match_percent":40.519287,"total_code":4387560,"matched_code":1777808,"matched_code_percent":40.519287,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7992,"matched_functions_percent":60.99832,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T18:52:05Z","commit_sha":"a699bc7aa08d8053e548b25e41882eccf6cdd856","commit_message":"recover: eight more untried functions; document the exchanged-register-pair class","measures":{"fuzzy_match_percent":40.519287,"total_code":4387560,"matched_code":1777808,"matched_code_percent":40.519287,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7992,"matched_functions_percent":60.99832,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T18:16:20Z","commit_sha":"f03cf6103aadb7921a172e9703036bdabbe3df4e","commit_message":"recover: seven more untried functions; characterise five register-pair floors","measures":{"fuzzy_match_percent":40.519287,"total_code":4387560,"matched_code":1777808,"matched_code_percent":40.519287,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7992,"matched_functions_percent":60.99832,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T17:22:27Z","commit_sha":"386f9059decc6b3bd440fa8b393c9fe73d2fe1e9","commit_message":"recover: seven more untried functions; document the do-not-tidy rule","measures":{"fuzzy_match_percent":40.519287,"total_code":4387560,"matched_code":1777808,"matched_code_percent":40.519287,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7992,"matched_functions_percent":60.99832,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T16:50:47Z","commit_sha":"df5413810f22ba42eb20a3d34ba76a6fe07e32be","commit_message":"recover: eight more untried functions; prove three more floors closed","measures":{"fuzzy_match_percent":40.519287,"total_code":4387560,"matched_code":1777808,"matched_code_percent":40.519287,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7992,"matched_functions_percent":60.99832,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T16:17:38Z","commit_sha":"2cd60155a9bb98ad8e664b244f8ce78d011971a5","commit_message":"recover: eight more untried functions; document the subscript-form lever","measures":{"fuzzy_match_percent":40.519287,"total_code":4387560,"matched_code":1777808,"matched_code_percent":40.519287,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7992,"matched_functions_percent":60.99832,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T15:31:47Z","commit_sha":"d59e250ec35e35b88387fe7dd65e582c4516b67c","commit_message":"match: func_00153d60; recover seven more untried functions; prove two 2-word floors","measures":{"fuzzy_match_percent":40.519287,"total_code":4387560,"matched_code":1777808,"matched_code_percent":40.519287,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7992,"matched_functions_percent":60.99832,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T14:54:27Z","commit_sha":"f01bb5575c459a6eff42d1f69e094c4b00746c50","commit_message":"recover: eight more untried functions as measured floors","measures":{"fuzzy_match_percent":40.465317,"total_code":4387560,"matched_code":1775440,"matched_code_percent":40.465317,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7991,"matched_functions_percent":60.99069,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T14:30:37Z","commit_sha":"6670f1376a49e9c4727a5e4b7c4d0de0b4bedd66","commit_message":"tools: feed matched signatures back to romwright; eight more untried functions","measures":{"fuzzy_match_percent":40.465317,"total_code":4387560,"matched_code":1775440,"matched_code_percent":40.465317,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7991,"matched_functions_percent":60.99069,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T14:00:15Z","commit_sha":"d9f7850d73f5aa91899280483fea405e95dc3c45","commit_message":"tools: add romwright_decompile.py; recover eight more untried functions","measures":{"fuzzy_match_percent":40.465317,"total_code":4387560,"matched_code":1775440,"matched_code_percent":40.465317,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7991,"matched_functions_percent":60.99069,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T13:16:44Z","commit_sha":"2c2ba230f9e0edda5ea442f0acee610a28a6287c","commit_message":"recover: eight more untried functions as measured floors","measures":{"fuzzy_match_percent":40.465317,"total_code":4387560,"matched_code":1775440,"matched_code_percent":40.465317,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7991,"matched_functions_percent":60.99069,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T12:41:04Z","commit_sha":"bce099e5d787cdcc86eae6cd9ce2dae11432b2f7","commit_message":"match: func_002b4250; recover: seven more untried functions as measured floors","measures":{"fuzzy_match_percent":40.465317,"total_code":4387560,"matched_code":1775440,"matched_code_percent":40.465317,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7991,"matched_functions_percent":60.99069,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T12:09:50Z","commit_sha":"f329232956a4156a97c1f8eb2d2901a9f5807b16","commit_message":"recover: first C bodies for eight untried functions, banked as measured floors","measures":{"fuzzy_match_percent":40.421192,"total_code":4387560,"matched_code":1773504,"matched_code_percent":40.421192,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7990,"matched_functions_percent":60.983055,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T10:09:05Z","commit_sha":"ed9358a3973932526a49412acc4960f6b636bb63","commit_message":"tools: add residual_signature.py, the mask/conversion census","measures":{"fuzzy_match_percent":40.421192,"total_code":4387560,"matched_code":1773504,"matched_code_percent":40.421192,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7990,"matched_functions_percent":60.983055,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T09:04:05Z","commit_sha":"5f5192ffb8f79c2f223eb4a2a5d4b00b1c13d4ed","commit_message":"docs: record the exhausted permuter run over the eight smallest floors","measures":{"fuzzy_match_percent":40.407333,"total_code":4387560,"matched_code":1772896,"matched_code_percent":40.407333,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7989,"matched_functions_percent":60.97542,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T08:16:54Z","commit_sha":"b1ebe10c95721db6237ea2dee8bdd3eb6724b982","commit_message":"docs: rule out the mwcc speed/size axis as the CSE explanation","measures":{"fuzzy_match_percent":40.407333,"total_code":4387560,"matched_code":1772896,"matched_code_percent":40.407333,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7989,"matched_functions_percent":60.97542,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T08:10:56Z","commit_sha":"b93344fd5b6b27125121996f7566feb881c16ef7","commit_message":"docs: record the CSE-versus-rematerialise blocker and everything ruled out","measures":{"fuzzy_match_percent":40.407333,"total_code":4387560,"matched_code":1772896,"matched_code_percent":40.407333,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7989,"matched_functions_percent":60.97542,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T08:03:14Z","commit_sha":"29f973ab087cd3f8110e79e70821c8320c49ed8c","commit_message":"btlShuffleDraw func_003742b0: record the pointer-local measurement","measures":{"fuzzy_match_percent":40.407333,"total_code":4387560,"matched_code":1772896,"matched_code_percent":40.407333,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7989,"matched_functions_percent":60.97542,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T07:55:23Z","commit_sha":"8d9d1d5b306e901f64d1bf9629df1be81ba67b03","commit_message":"code1_0031 func_00311930: record the -O2 CSE experiments that rule out removing the pragma","measures":{"fuzzy_match_percent":40.407333,"total_code":4387560,"matched_code":1772896,"matched_code_percent":40.407333,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7989,"matched_functions_percent":60.97542,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T07:48:23Z","commit_sha":"1c23289f4bb94eb5a5e57270178b0c115d391677","commit_message":"docs: measured scope check - only func_00100008 (crt0) is not C-expressible","measures":{"fuzzy_match_percent":40.407333,"total_code":4387560,"matched_code":1772896,"matched_code_percent":40.407333,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7989,"matched_functions_percent":60.97542,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T07:39:59Z","commit_sha":"eb10a2d74d796e45b0a5521c738937f37621c2b4","commit_message":"four floors: in-body prototypes take their live definitions' parameter order (1286->1282, 361->359, two ties)","measures":{"fuzzy_match_percent":40.407333,"total_code":4387560,"matched_code":1772896,"matched_code_percent":40.407333,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7989,"matched_functions_percent":60.97542,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T07:28:09Z","commit_sha":"c4e3bbd17b97956a0fa2991a4ba5918dd9b4213f","commit_message":"shdPersona func_001187b0: 130 -> 114 (func_0034f4a0 parameter order, (s16) casts without the s32 step)","measures":{"fuzzy_match_percent":40.407333,"total_code":4387560,"matched_code":1772896,"matched_code_percent":40.407333,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7989,"matched_functions_percent":60.97542,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T07:16:57Z","commit_sha":"e2789a22a82227cbffaeef1fac2245aad268fcaa","commit_message":"effPolygonRing func_00499e40: 94 -> 93, quad slots at retail's frame offsets","measures":{"fuzzy_match_percent":40.407333,"total_code":4387560,"matched_code":1772896,"matched_code_percent":40.407333,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7989,"matched_functions_percent":60.97542,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T06:55:42Z","commit_sha":"ef34f03c023326c53675f74b39ad8687c78fce5a","commit_message":"btlShuffleDraw func_003753f0: 183 -> 181 via the plain (f32)(u32) cast","measures":{"fuzzy_match_percent":40.407333,"total_code":4387560,"matched_code":1772896,"matched_code_percent":40.407333,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7989,"matched_functions_percent":60.97542,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T06:36:55Z","commit_sha":"fc8a75e502c196d717d5b5bd00c802cdc3cbdca4","commit_message":"shdMisc func_00364680: 411 -> 402 with the proven parameter order and direct float parameters","measures":{"fuzzy_match_percent":40.407333,"total_code":4387560,"matched_code":1772896,"matched_code_percent":40.407333,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7989,"matched_functions_percent":60.97542,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T06:29:44Z","commit_sha":"812f97204662c0048951f8ebce382767a3d07a58","commit_message":"three more floors: plain float casts (56->51, two ties with fewer edit groups)","measures":{"fuzzy_match_percent":40.407333,"total_code":4387560,"matched_code":1772896,"matched_code_percent":40.407333,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7989,"matched_functions_percent":60.97542,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T06:07:05Z","commit_sha":"ed6204aaf7a429b9128906c1f29862a3a05c495e","commit_message":"docs: record the float-parameter-copy lever","measures":{"fuzzy_match_percent":40.377796,"total_code":4387560,"matched_code":1771600,"matched_code_percent":40.377796,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7988,"matched_functions_percent":60.967793,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T05:37:58Z","commit_sha":"eb0bbe5b6a295b6545116e60c0dcaa7ee54781b1","commit_message":"btlShuffleDraw func_00375f00: record the measured copy-vs-rematerialise wall","measures":{"fuzzy_match_percent":40.377796,"total_code":4387560,"matched_code":1771600,"matched_code_percent":40.377796,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7988,"matched_functions_percent":60.967793,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T05:20:41Z","commit_sha":"a29dee3e22030fa6267d90ad3f7821b8f0611d8f","commit_message":"code1_0021: func_0020e420/func_0020e690 declarations take their live definitions' parameter order","measures":{"fuzzy_match_percent":40.377796,"total_code":4387560,"matched_code":1771600,"matched_code_percent":40.377796,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7988,"matched_functions_percent":60.967793,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T05:14:29Z","commit_sha":"80d51c8708f19ce9126f84efe73ec084c9be532b","commit_message":"docs: record the next-action queue from the parameter-order and argument-move scans","measures":{"fuzzy_match_percent":40.377796,"total_code":4387560,"matched_code":1771600,"matched_code_percent":40.377796,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7988,"matched_functions_percent":60.967793,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T05:09:46Z","commit_sha":"4dd6f897b0658dc00e7a314b11a7a11edafea8f4","commit_message":"sdkPrimitive func_0045da40: take the parameter order from its MATCHed caller; document the caller-wins rule","measures":{"fuzzy_match_percent":40.377796,"total_code":4387560,"matched_code":1771600,"matched_code_percent":40.377796,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7988,"matched_functions_percent":60.967793,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T05:02:22Z","commit_sha":"98d4828201a77a3f1171d7ca1f4fab84c256232c","commit_message":"align every func_0045d6e0 declaration with the MATCHed definition (f32 before s32); ABI-neutral, no MATCH change","measures":{"fuzzy_match_percent":40.377796,"total_code":4387560,"matched_code":1771600,"matched_code_percent":40.377796,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7988,"matched_functions_percent":60.967793,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T04:44:18Z","commit_sha":"f1612d10a218faaa8c01be9d6aa30186fa71ab7c","commit_message":"docs+notes: opt_common_subs off and optimization_level 1 change the float-to-int conversion temporary","measures":{"fuzzy_match_percent":40.377796,"total_code":4387560,"matched_code":1771600,"matched_code_percent":40.377796,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7988,"matched_functions_percent":60.967793,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T04:36:37Z","commit_sha":"93b191cfb5918338e273074127e3e2f9ff1cf710","commit_message":"docs: refresh the matching checkpoint (503 first-party ASM, 92.7% MATCH)","measures":{"fuzzy_match_percent":40.377796,"total_code":4387560,"matched_code":1771600,"matched_code_percent":40.377796,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7988,"matched_functions_percent":60.967793,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T03:44:48Z","commit_sha":"7c4b450a7dd8792cf95f53b9b9d76fa2ad14a444","commit_message":"shdMisc func_00365f00: 25 -> 13 by defining edge_r first (conversion blocks follow definition order)","measures":{"fuzzy_match_percent":40.341328,"total_code":4387560,"matched_code":1770000,"matched_code_percent":40.341328,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7987,"matched_functions_percent":60.96016,"complete_code":1080952,"complete_code_percent":24.636745,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-18T02:02:01Z","commit_sha":"0c42f64821c8163f3b27400e746c7dc395a4ddfd","commit_message":"Handoff: the optimization_level axis is exhausted on close floors; the silent-unknown-pragma trap; the (f32)(u32) idiom","measures":{"fuzzy_match_percent":40.1703,"total_code":4387560,"matched_code":1762496,"matched_code_percent":40.1703,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7982,"matched_functions_percent":60.921997,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-18T01:41:08Z","commit_sha":"41255233db40cbd3472f19ee0e8aa8cbbc4a8379","commit_message":"Bank the code1_0048 and y_smap wave-2 floors","measures":{"fuzzy_match_percent":40.1703,"total_code":4387560,"matched_code":1762496,"matched_code_percent":40.1703,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7982,"matched_functions_percent":60.921997,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-18T01:10:37Z","commit_sha":"80ee4abf033c145450752546da656d6af11e2727","commit_message":"Handoff: the 3% instruction-count gate and decode handoff","measures":{"fuzzy_match_percent":40.1703,"total_code":4387560,"matched_code":1762496,"matched_code_percent":40.1703,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7982,"matched_functions_percent":60.921997,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-18T00:51:02Z","commit_sha":"77bc7eea92b11df1c71137f2afec33b372da85aa","commit_message":"Regenerate symbols after the cold wave","measures":{"fuzzy_match_percent":40.1703,"total_code":4387560,"matched_code":1762496,"matched_code_percent":40.1703,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7982,"matched_functions_percent":60.921997,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-18T00:09:38Z","commit_sha":"74e7373073a6529edf5fcc0fe0b96f6b4db89f2a","commit_message":"Handoff: shared-counter live ranges, compare operand order, switch fallthrough, and the banking rule","measures":{"fuzzy_match_percent":40.1703,"total_code":4387560,"matched_code":1762496,"matched_code_percent":40.1703,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7982,"matched_functions_percent":60.921997,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-17T23:47:23Z","commit_sha":"f06b95f53c0feb80dbb38373530a027ea1149d3f","commit_message":"code1_0048 func_0048a980: record complete pragma exhaustion and the FPR-selection wall","measures":{"fuzzy_match_percent":40.1703,"total_code":4387560,"matched_code":1762496,"matched_code_percent":40.1703,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7982,"matched_functions_percent":60.921997,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-17T23:22:10Z","commit_sha":"3fcbd10f57336b94317da6cb5c8764d101a418d4","commit_message":"Bank the pair-sweep wave: 8 singles and 28 pairs recorded on the twenty closest floors; func_004b2a00 17 -> 15","measures":{"fuzzy_match_percent":40.1703,"total_code":4387560,"matched_code":1762496,"matched_code_percent":40.1703,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7982,"matched_functions_percent":60.921997,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-17T22:45:28Z","commit_sha":"6a9d7acd630c87f1844183a88110eddd9084ef6f","commit_message":"Handoff: the eight-pragma sweep and the opt_dead_assignments find","measures":{"fuzzy_match_percent":40.1703,"total_code":4387560,"matched_code":1762496,"matched_code_percent":40.1703,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7982,"matched_functions_percent":60.921997,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-17T21:54:46Z","commit_sha":"ba0445ea2df64e6ec8a9bc25aef5853ae647d821","commit_message":"k_encount func_00161630: guard the live NONMATCHING body that was dropping the whole TU from the C link (M002)","measures":{"fuzzy_match_percent":40.14988,"total_code":4387560,"matched_code":1761600,"matched_code_percent":40.14988,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7981,"matched_functions_percent":60.914364,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-17T21:18:44Z","commit_sha":"c51698f1e522876dc062df87461e4fcffa0c1dc8","commit_message":"Bank the ranked-floor wave; drop a committed scratch file and the duplicate FUN_0033C490 marker; ignore dotfile scratch under src/","measures":{"fuzzy_match_percent":40.14988,"total_code":4387560,"matched_code":1761600,"matched_code_percent":40.14988,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7981,"matched_functions_percent":60.914364,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-17T20:57:11Z","commit_sha":"471a0b611f82ad65f4a7ff779d61be7d34fd5f5d","commit_message":"Bank the second cold-window wave: floors across 18 owners plus the MMisc1 y_fclItemShopDraw MATCH","measures":{"fuzzy_match_percent":40.14988,"total_code":4387560,"matched_code":1761600,"matched_code_percent":40.14988,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7981,"matched_functions_percent":60.914364,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-17T19:11:13Z","commit_sha":"0363e28b770a734899078f13a4af616548e02da6","commit_message":"Handoff: the K&R definition lever and the -DNON_MATCHING build gate","measures":{"fuzzy_match_percent":40.078037,"total_code":4387560,"matched_code":1758448,"matched_code_percent":40.078037,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7978,"matched_functions_percent":60.891468,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T19:10:32Z","commit_sha":"af0985729b015cd0a508e02ba002bfc819f80b3f","commit_message":"btlAICommand func_001dbba0: K&R signature fixes the guarded build and takes it from unmeasurable to 2 words","measures":{"fuzzy_match_percent":40.078037,"total_code":4387560,"matched_code":1758448,"matched_code_percent":40.078037,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7978,"matched_functions_percent":60.891468,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T19:06:14Z","commit_sha":"f9f0bb18ccafe45d9ef24710e7fd0cf2cc88ac48","commit_message":"Bank width, pragma and cold-window results across 15 owners; fix a duplicate extern that broke code1_0011's guarded build","measures":{"fuzzy_match_percent":40.078037,"total_code":4387560,"matched_code":1758448,"matched_code_percent":40.078037,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7978,"matched_functions_percent":60.891468,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T18:51:17Z","commit_sha":"a501530321e2333cb415944c67cb156671dc16da","commit_message":"Add measure_guarded.py and wscan_pairs.py for guarded-floor measurement","measures":{"fuzzy_match_percent":40.078037,"total_code":4387560,"matched_code":1758448,"matched_code_percent":40.078037,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7978,"matched_functions_percent":60.891468,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T18:32:45Z","commit_sha":"e9461ae38eccd65154b2a3334a104615f185184e","commit_message":"Bank width and schedule improvements across 0012/0015/001c/0021/0029, k_fldFrame, k_fldUnit, y_fclCombineDraw","measures":{"fuzzy_match_percent":40.078037,"total_code":4387560,"matched_code":1758448,"matched_code_percent":40.078037,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7978,"matched_functions_percent":60.891468,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T18:16:13Z","commit_sha":"f38aa22c0a90517a13572594b9971927607b7ae8","commit_message":"Apply schedule on to 13 banked floors (sweep over 163 first-party floors)","measures":{"fuzzy_match_percent":40.078037,"total_code":4387560,"matched_code":1758448,"matched_code_percent":40.078037,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7978,"matched_functions_percent":60.891468,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T17:54:43Z","commit_sha":"351b38b98e839dfe2e8f768f852ccbc138ad8228","commit_message":"Fix CI: re-pin the generated-ASM manifest to the current tools/verify.py\n\nCI has been red since d2d93c43. That commit taught verify.is_generated to\nskip probe_variants' staged copies, and verify.py is a pinned generator\ninput for the fallback corpus, so make regenerate-asm refused to run.\n\nAudited rather than rubber-stamped: extract_nonmatching_asm.py consumes\nverify.py only through is_generated(), which it calls to skip non-source\nfiles while walking src/**/*.c. Enumerating that walk under the old and new\npredicates on a clean clone yields the same 394 sources, and\ntools/regenerate_asm.py --check under the pinned requirements reproduces\nall 11152 generated files byte-for-byte with the 2 hand-maintained ones\nuntouched.","measures":{"fuzzy_match_percent":40.078037,"total_code":4387560,"matched_code":1758448,"matched_code_percent":40.078037,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7978,"matched_functions_percent":60.891468,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T15:21:14Z","commit_sha":"29d0fe8e6b51ab6ea737f2569d0f60cca9cd1477","commit_message":"Bank near-match floors across 0039/003a/003b/003c/003d/0041/004b/0051/0052 and cold 001b","measures":{"fuzzy_match_percent":40.009846,"total_code":4387560,"matched_code":1755456,"matched_code_percent":40.009846,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7975,"matched_functions_percent":60.86857,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T04:10:45Z","commit_sha":"789089775454d40d24ee00932f65c8f433cbb792","commit_message":"Clean func_003645c0: drop the named-constant locals\n\nThe decimal formatter stays byte-exact without the four locals that\nonly held 0x2E, 2, 3 and 10; MWCC hoists those constants itself under\nthe opt_loop_invariants bracket, which is the load-bearing part (59\nwords without it).  The digit-count return that keeps the index in\n$v0 remains.","measures":{"fuzzy_match_percent":39.90373,"total_code":4387560,"matched_code":1750800,"matched_code_percent":39.90373,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7971,"matched_functions_percent":60.83804,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T03:43:20Z","commit_sha":"501046921f64a19355144bedfdbb0db5d1bbb1d1","commit_message":"Match func_001fb480; bank three batch-6 floors\n\nfunc_001fb480 (code1_001f) is byte-exact: the scale block is written\n`x = a + (-b) * c` so it contracts to adda.s/madd.s, each negation and\neach display-field conversion is staged in its own local, the\nsignature is float-first (ABI-identical; the four callers keep their\nobjects), and the function sits in an opt_propagation-off bracket that\nkeeps the D_00887300 base in a saved register.\n\nFloors banked behind NON_MATCHING with owner notes: func_00354ba0\n(16 words, 306/306 instructions, two setup-order swaps), func_0010be60\n(440 words, 1808/1856 bytes) and func_004b6030 (534 words).","measures":{"fuzzy_match_percent":39.90373,"total_code":4387560,"matched_code":1750800,"matched_code_percent":39.90373,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7971,"matched_functions_percent":60.83804,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T03:22:06Z","commit_sha":"3e795ed72fbb2a936f1e89b9202c3d6a4e958118","commit_message":"Match func_00103f00; bank five batch-5 floors\n\nfunc_00103f00 (code1_0010) is byte-exact.  Three shapes carried it:\nthe colour bytes are u32 locals so `(f32)r` is the bltz/srl/or/cvt\nunsigned conversion with the mtc1 and `& 1` hoisted; the loop index and\nquad pointer are block-scoped inside each half, which puts the hoisted\nlui in $v0 and the counter in $t1 instead of rotating every temporary;\nand the position pair is an f32[2] filled by an 8-byte struct copy,\nwhich stops MWCC folding `256.0f + x` and the y reload across the two\nhalves into saved FPU registers.  The near-Z read in the loop is\nRwIm2DGetNearScreenZ() through a prefix of RenderWare's\nRwGlobals/RwDevice at ourGlobals: an array element there hoists the\nwhole load, the member access hoists only the lui.\n\nFloors banked behind NON_MATCHING with owner notes: func_00296850\n(455 words, 1578/1578 instructions), func_0046d750 (248),\nfunc_003694d0 (759), func_0035fd60 (~1264, 1704/1793), func_004bb1d0\n(879).  Handoff 7i gains the block-scope, struct-copy, ourGlobals and\ninteger-address levers.","measures":{"fuzzy_match_percent":39.811104,"total_code":4387560,"matched_code":1746736,"matched_code_percent":39.811104,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7968,"matched_functions_percent":60.815144,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T02:56:20Z","commit_sha":"01c60fc54b9d212741f3b16ed266e928890fef2d","commit_message":"Bank func_00267b20 and func_00179fc0 floors in their owners\n\nBoth were left outside the checkout by their agents.  func_00267b20's\ntwelve-argument reconstruction measures 304 words here (445 emitted\nagainst 452, frame -0xDB0 exact) with the owner's s64 fifth and sixth\nint parameters, 8 better than the s32 form it was measured with.\nfunc_00179fc0 measures 337 (462 emitted against 464, frame 0x100) with\nthe D_00887300 base hoisted under opt_propagation off and local\ndeclarations for the three callees the owner declares late or not at\nall.  Both stay INCLUDE_ASM in production.","measures":{"fuzzy_match_percent":39.777187,"total_code":4387560,"matched_code":1745248,"matched_code_percent":39.777187,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7967,"matched_functions_percent":60.80751,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T02:24:51Z","commit_sha":"98d1fa255ef9f7ce098db8114f56e98a25c400c6","commit_message":"Reconstruct func_00210c70 to a 367-word floor\n\nUntried before this.  Two m2c blanks came out of the retail image: the\nadda.s/msub.s pair is `2.2f - 1.2f * x`, whose operands are gp-relative\npool constants at gp-0x7EF0 and gp-0x7D84 read straight out of\norig/SLUS_217.82, and the 0x432C0000 immediates are 172.0f.  The\nout-parameter block func_0020e690 and func_0020ea60 fill is one\n0x18-byte struct at sp+0xA0, which m2c splits into five scalars.\n\n377 emitted instructions against retail's 400.  Eighteen of the missing\ntwenty-three are a second float-to-u8 conversion of 255.0f * rate that\nretail performs twice and this build folds into one; opt_common_subs\noff recovers it but costs more elsewhere.  The other four are retail\nkeeping 20.0f * (1.0f - rate) as its own multiply where this build\ncontracts the add into a madd.","measures":{"fuzzy_match_percent":39.726498,"total_code":4387560,"matched_code":1743024,"matched_code_percent":39.726498,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7966,"matched_functions_percent":60.799877,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T02:12:19Z","commit_sha":"ac31de2df9ab7c551135dd2db84cbb5366d60d1f","commit_message":"MATCH func_00142f20, plus three measured floors\n\nfunc_00142f20 matches - the fourth of the menu state machines closed\nthis session - and its caller cmpMain.c now declares the state word as\nu32 *.\n\nFloors, production unchanged:\n- func_0013ea20 at 473 words (code1_0013).  m2c DROPPED two switch\n  label sets here, printing `switch (x) { <body> <body> }` with no\n  case lines; retail's compare chain recovers them as an s8 result\n  tested 3, 2, 1, 0 with case 2 re-arming the panel and case 3\n  returning 2.  That was 43 missing instructions.  Nine remain, from\n  the inner switch's 0/1 arms hopping through the switch end where\n  retail jumps straight to the function exit.\n- func_00122a40 at 324 words (code1_0012), 804 of 804 instructions\n  with all 46 relocations resolved; its declaration takes (void *,\n  u8 *), not (void).\n- func_002df020 at 219 words (y_fclShopDraw), frame 0xC0; residual is\n  a work/tmp register swap plus a two-word branch-around-goto shift.","measures":{"fuzzy_match_percent":39.726498,"total_code":4387560,"matched_code":1743024,"matched_code_percent":39.726498,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7966,"matched_functions_percent":60.799877,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T02:01:58Z","commit_sha":"5b9cd9b205103a68ad5d37be448bd65644dd2e61","commit_message":"MATCH func_0013caa0, plus two measured floors\n\nfunc_0013caa0 is the same menu state machine as func_0013d8b0 beside\nit, and nine of m2c's call arguments are stale registers -\nfunc_001312b0, func_001318c0, func_00134b60, func_00134be0,\nfunc_0013d5d0, func_0013d470, func_00452490 and two func_00134560\nsites all take one fewer.  The two pick-list tests are\n`if ((n = func_00453960(buf)) > 0)`: assigning inside the condition\nkeeps the count in $v0 for the blez, where a separate statement moves\nit to a saved register first.  Two words, then zero.\n\nfunc_002239a0 at 179 words, 1328B/1328B with 332 of 332 instructions;\nresidual is an $s2/$s3 colour permutation plus scheduling.  Its two\ndeclaration fixes are part of the measurement: func_00452560 takes an\ns32 per sdkTask.c, and the D_008C024x pad words are arrays.\n\nfunc_001774a0 at 183 words over 27 edits, 345 of 345 instructions with\nall 49 jal relocations resolved; residual is stack slot placement.","measures":{"fuzzy_match_percent":39.67654,"total_code":4387560,"matched_code":1740832,"matched_code_percent":39.67654,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7965,"matched_functions_percent":60.792244,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T01:57:34Z","commit_sha":"5ef6d741468ac06fb7d986e4429ab7ae4e15931f","commit_message":"MATCH func_0013d8b0 and func_00111bc0\n\nfunc_0013d8b0 is the same menu state machine as func_0035e8b0,\nfunc_0035f0c0 and func_003627b0 - `*arg1 = (var_2 = 1);`, a switch on\n*arg0 whose arms break to a shared `return 0`, the fade arm returning\n2, and a 0x30-byte query buffer read at +0x24.  Two spellings did the\nrest: the party-slot address is `(u8 *)(index * 2) + (u32)arg2`, which\ngives retail's index-then-base addu, and the two func_002bb140\nswitches are written `case 0:` before `case 1:` so their compare\nchains come out 1-then-0.  m2c's &jtbl_00746A80 arguments to\nfunc_0010b7f0 and func_00354030 are stale registers; both take none.\n387 draft lines, 16 words on first compile, then 0.\n\nfunc_00111bc0 matches: 1852B against a 1856-byte window.  The m2c\ndraft's overlapping stack arrays are one s32 buf[344] at sp+0x80, and\nthe batched float block is a Vec4 struct copy.","measures":{"fuzzy_match_percent":39.619286,"total_code":4387560,"matched_code":1738320,"matched_code_percent":39.619286,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7964,"matched_functions_percent":60.784615,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T01:45:04Z","commit_sha":"44b598387469ba4d4602db6c2725034b716b90d4","commit_message":"Reconstruct func_00152170 to a 241-word floor\n\nUntried before this, and three findings matter more than the number.\nThe context is the SECOND parameter - retail's `move $s1,$a1` - so the\nfield-draw callback is (s32, u8 *); the seven slots in this file that\nstore it now carry a `void (*)(void)` cast and every other function in\nthe unit still verifies.  The two four-float camera copies are Vec4\naggregate assignments: retail batches four lwc1 then four swc1, while\nfield-by-field stores interleave them.  And the draw-state table\naddress is held in $s0 across the tail calls.\n\n305 emitted instructions against retail's 304, with ten edits.  What is\nleft is MWCC rematerialising lui/addiu for &D_00887300 at four of those\ncalls because the address is a link-time constant it folds through the\nlocal; opt_propagation off stops that and reaches 165 words but\nperturbs 71 instructions elsewhere, so it does not earn the pragma.","measures":{"fuzzy_match_percent":39.4891,"total_code":4387560,"matched_code":1732608,"matched_code_percent":39.4891,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7962,"matched_functions_percent":60.76935,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T01:32:42Z","commit_sha":"97908749de526d4f6ef0d6d0f0f11306e873f382","commit_message":"Four more measured floors\n\n- func_0047ce00 at 5 words (code1_0047), 584B against a 592-byte window\n  with 146 of 146 instructions and four edits.  Reading the 0x40 field\n  directly rather than through a staged pointer was 65 words to 47, and\n  inlining case 2's success path instead of branching to a shared tail\n  was 65 to 23; together they give 5.  `lhu` rather than `lh` on the\n  header fields drops the edit count from 6 to 4.  Residual is pure\n  scheduling.  The func_0047e450 declaration is corrected to s32, s32 to\n  match its provider in mdlSE.c, in the same edit.\n- func_0015b3e0 driven from 376 to 284 (code1_0015), 1780B/1792B with\n  445 of 445 instructions and an exact 0x120 frame.  All-direct loads\n  were worth 61 words, u16 limits 16, and the (u8) keep 11.\n- func_00331a20 at 26 words (code1_0033), 1388B/1392B with 51\n  relocations; residual is the work/level register pair and the bound\n  test going to $at.\n- func_00196d00 at 245 words (code1_0019), a first reconstruction.","measures":{"fuzzy_match_percent":39.4891,"total_code":4387560,"matched_code":1732608,"matched_code_percent":39.4891,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7962,"matched_functions_percent":60.76935,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T01:22:26Z","commit_sha":"9d11c8e7fb1580f6d2e97ae17b53934d6e80c1d1","commit_message":"MATCH func_0035f0c0, and two measured floors\n\nfunc_0035f0c0 is built from func_0035e8b0 in the same file, which is\nthe same state machine already matched: `*arg1 = (resultFlag = 1);`, a\nswitch on *arg0 whose arms break to a shared `return 0`, and a fade arm\nreturning 2.  Four of m2c's call arguments are stale registers -\nfunc_0035c830, func_0035cfb0, func_0035dcc0 and func_0035dd40 all take\nthe context alone - and the two query arguments are full words, not the\ns16 narrowings m2c printed.  The inner *(s32 *)(arg2 + 0x1C) switches\nare written `case 0:` before `case 1:` so their compare chains come out\n1-then-0 like retail's.  241 words to 19 to 0.\n\nfunc_00169320 (k_fldFrame) banked at 155 words from a 268-word archive,\n1112B against a 1120-byte window with 278 of 278 instructions.  The old\narchive was behaviourally wrong: it stored the edge point for both new\nentries and reused the absolute distance.\n\nfunc_0048a980's 5-word floor is now recorded in its owner.  The\nresidual is a cvt.w.s destination register, the same wall as\nfunc_00311930 and func_0034ddf0, and four fresh negative probes leave\nit identical.","measures":{"fuzzy_match_percent":39.4891,"total_code":4387560,"matched_code":1732608,"matched_code_percent":39.4891,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7962,"matched_functions_percent":60.76935,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T01:15:19Z","commit_sha":"4396abf5550c2d77c66b0c3d1d29af7091edcc4e","commit_message":"Reconstruct func_0038c100 to a 361-word floor\n\nUntried before this.  Two facts carried it.  arg0 is a u8 *: m2c types\nit u8 ** and then scales arg0 + 0x1A4 by four, while retail's $s1 is\nthat address in bytes and every field read is relative to it.  And the\nwindow animation carries two scale factors, not one - retail saves both\n$f20 and $f21 across the calls and multiplies 4096.0f by each.  The\nsecond is 1.0f in every arm here, so writing it as the literal folds\nthe whole conversion away and costs 22 instructions; assigning it per\narm took 371 words to 361 and 362 emitted instructions to 397 against\nretail's 409.\n\nThe unsigned-to-float conversions are already exact:\n(f32)(u32)*(u16 *)state reproduces retail's bltz/srl/or sequence\ndirectly, and staging it through a u32 local changes nothing.\nTwelve instructions are still missing across eight sites of one or two.","measures":{"fuzzy_match_percent":39.460293,"total_code":4387560,"matched_code":1731344,"matched_code_percent":39.460293,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7961,"matched_functions_percent":60.761715,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T01:06:54Z","commit_sha":"1bb7bdbe14749d5d040d3be4e33bfe60186be980","commit_message":"Handoff: EABI argument registers and three allocation levers\n\nInteger arguments five through eight arrive in $t0-$t3, so a function\nwhose asm never touches the incoming stack can still take eight of them\n- func_00256460 is seven ints and five floats where m2c printed six.\nA clamp written > LITERAL keeps the value in $v0 with the test in $at\nwhile >= LITERAL+1 moves it to $v1, which was twelve words on\nfunc_00245030.  A local array's size sets the next local's stack slot.\nAnd an 8-byte struct copy through a typed pointer emits lwc1/swc1 where\nretail uses lw/sw.","measures":{"fuzzy_match_percent":39.460293,"total_code":4387560,"matched_code":1731344,"matched_code_percent":39.460293,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7961,"matched_functions_percent":60.761715,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T01:01:41Z","commit_sha":"bb38dc973a97899845869d8e9d8c1b9f63742489","commit_message":"MATCH func_00458ce0, plus six measured floors\n\nfunc_00458ce0 matches: 0 differing words, 540B against a 544-byte\nwindow with a 4-byte zero tail and 19 exact relocations.  It needed one\nnew recovered symbol, D_00711890_abs.\n\nFloors, production unchanged in all six:\n- func_0036d3e0 at 244 words (pscRes, first reconstruction).  The\n  pixel-format switch's labels reverse inside each group as well as\n  across them - `case 20: case 36: case 44:` emits retail's 0x2C, 0x24,\n  0x14 chain - and the source pointer is initialised from arg0 before\n  the depth is cleared, then advanced by 0x40.  Residual is a\n  saved-register rotation over 250 declaration orders.\n- func_00164880 at 313 words from 370 (k_fldUnit), 422 emitted against\n  431, 45 of 45 relocations resolved.\n- func_002d4760 at 399 words (y_fclShopDraw), 511 against 500, frame\n  0x100 exact; residual register colour and scheduling.\n- func_002e5000 at 90 words from 103 (y_list), 604B/624B.  Two semantic\n  findings recorded: the table is D_00882F70[0] by HI16/LO16, not the\n  gp-relative spelling, and func_003129b0 takes three arguments - m2c's\n  fourth is a dead $a3 leftover.\n- func_0048a460 at 15 words (mdlEffect).  An 11-word variant exists but\n  returns a value the retail function does not; that is a false\n  prototype, so 15 is the floor.\n- func_0052d9a0 at 2 words (code1_0052).  This unit is ee-gcc 2.96, not\n  MWCC: retail schedules movn-max, daddu, movn-min and this build emits\n  the adjacent swap.  All 24 source orders give the same result.","measures":{"fuzzy_match_percent":39.460293,"total_code":4387560,"matched_code":1731344,"matched_code_percent":39.460293,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7961,"matched_functions_percent":60.761715,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T00:41:50Z","commit_sha":"8d5dc6fde54b5b840605bab93d58c92dbc016e2d","commit_message":"MATCH func_0018ced0, and a 48-word floor for func_00256460\n\nfunc_0018ced0 matched on the first reconstruction.  The dispatch reads\nthe pair at iGpffff9db0 with only the first word cached - retail\nreloads *(s32 *)(ctx + 4) at every test, so the long (major, minor)\nchains are written out rather than staged in a local.  The story flag\nis s8, which re-extends on each read the way retail does, and the\nsub-state is u8, whose reads carry the andi.\n\nfunc_00256460 is a first reconstruction at 48 words with 153 emitted\ninstructions against retail's 153.  Its signature is 7 ints and 5\nfloats: the MIPS EABI passes integer arguments 5-8 in $t0-$t3, and arg4\nis forwarded to func_0045e6a0 untouched, which is why retail never\nreloads it.  The vertex table needs an explicit two-word CopyPair loop -\nletting MWCC copy the 8-byte struct emits lwc1/swc1 where retail uses\nlw/sw - and the colour buffer is u8[20][4], which is what places the\nposition array at 0xC0 and makes the frame 0x140.  Hoisting the four\nbase-colour bytes above the loop took 66 words to 48.  What is left is\nFPU scheduling: retail issues both 255.0f products before the main\ncolour and only then the two divisions, while this build sinks each\nproduct onto its own division.","measures":{"fuzzy_match_percent":39.447895,"total_code":4387560,"matched_code":1730800,"matched_code_percent":39.447895,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7960,"matched_functions_percent":60.75408,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T00:24:08Z","commit_sha":"e76a002052a72861c05f40278d860b8e87dd179a","commit_message":"MATCH func_00454640 and func_001a2d70; two more floors\n\nsdkCdvd is now 11/11.  func_00454640's last three words were the scan\nloop's hoist order, and typed cache indexing fixes it: with\n`extern HCdvdCache D_008C8780[]` and `slot = &D_008C8780[i]` the\ncompiler forms base + i * 0x94 itself and materialises the request\npointer first, where any explicit base initializer puts the base first.\nThe node and cache layouts are now real structs recovered from the\noffsets the body was already using; the four functions that still index\nthe cache by hand cast to u8 * and are byte-identical.\n\nfunc_001a2d70 matches.  The two words an earlier pass could not place\nwere retail's redundant bltz range check, dead after the andi: the u8\nconversion plus an explicit `if (kind < 0) goto fallback` reproduces it,\nand opt_propagation off keeps that lowering alongside the repeated unit\nloads that opt_common_subs off already preserved.  The function is a\nvoid action callback - D_005f6e20[10].update - so func_00194590's\n64-bit packet UID is discarded here; its s32 declaration in the unit is\nunchanged.\n\nFloors: func_0044fa90 at 314 words (sdkDbprt, archived), func_0018c7e0\nat 40 words over 25 edits with all 19 relocations resolved (archived),\nwhose measurement also corrects func_00110960's argument types.","measures":{"fuzzy_match_percent":39.38663,"total_code":4387560,"matched_code":1728112,"matched_code_percent":39.38663,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7959,"matched_functions_percent":60.746452,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-17T00:19:10Z","commit_sha":"2462c3280263ae9d6b686ac0a89750a35157c4dd","commit_message":"MATCH func_00245030, and four banked floors\n\ndatScript is now 4/4.  func_00245030's 34-arm dispatch needed three\nshapes.  The level-difference and parameter tables are typed arrays -\n((f32 *)(DAT_007644E8 + 0x18))[i], not *(f32 *)(base + i * 4) - which\nputs the base load ahead of the index extension.  The three ids that\nfall back to 100 are a switch, not an || chain, so the last compare\nstays a beq with an explicit branch to the default arm instead of being\ninverted.  And every clamp is `>` a literal rather than `>=` its\nsuccessor: `if (tier > 9)` keeps the compared value in $v0 with the\ntest in $at, where `>= 0xA` moves it to $v1.  Count divisions are\ncompound (`step /= 3`), which extends once instead of truncating and\nre-extending.\n\nFloors from the parallel batch, production unchanged in all four:\nfunc_002411a0 at 512 words (switch dispatch beats ||, 512 vs 563;\nsaved-register rotation plus an extra $s7), func_001441e0 at 425 with\nits declaration corrected to s32 in the same edit as the body,\nfunc_0015b3e0 at 376, and func_0036ee60 refreshed from a stale note to\na measured 292 - its residual is retail's sq/lq spills, which b210\ncannot express from C, plus a dead draw arm b210 deletes.\n\ncode1_0016: func_00162680 306 -> 302 by reversing the second switch's\nlabel order.","measures":{"fuzzy_match_percent":39.338127,"total_code":4387560,"matched_code":1725984,"matched_code_percent":39.338127,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7957,"matched_functions_percent":60.731186,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T23:55:38Z","commit_sha":"a8db2e5a63719969de74177270715e75b31582b8","commit_message":"Handoff: sharpen the switch levers\n\nThe reverse-label-order rule covers the whole label sequence, not just\nthe case groups, and the bodies still come out in source order - that\nconflict is func_00463930's residual.  Separately, an outer dispatch\nthat m2c prints as a switch is often an if/else-if chain in retail;\ngrep the asm for jtbl_ to tell the two apart before writing a line.","measures":{"fuzzy_match_percent":39.220707,"total_code":4387560,"matched_code":1720832,"matched_code_percent":39.220707,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7956,"matched_functions_percent":60.723553,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T23:51:16Z","commit_sha":"a8f1a1b58875adda4fe1619ae9a9df4609b319a6","commit_message":"func_00463930 182 -> 155 words\n\nMWCC emits a switch's compare chain in the reverse of the source's\nlabel order - the whole sequence, not just the groups.  Listing the TMX\ndepth codes 1, 2/0xA, 0x13/0x1B, 0x14/0x24/0x2C reproduces retail's\n0x2C-first chain and the body layout that goes with it, and the\npalette-format switch wants its default arm first.\n\nWhat is left is one fact: every case branch is exactly five\ninstructions short, because retail puts the default arm's body between\nthe compare chain and the first case body.  Writing `default:` first to\nforce that costs 45 words elsewhere.","measures":{"fuzzy_match_percent":39.220707,"total_code":4387560,"matched_code":1720832,"matched_code_percent":39.220707,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7956,"matched_functions_percent":60.723553,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T23:48:35Z","commit_sha":"89276b002548842c321ff9c52d232f3bc67a5691","commit_message":"MATCH func_003627b0, and fix its caller's declaration\n\nThe state word is a u32 *, so the dispatch on *arg0 is unsigned - that\nis what keeps retail's sltiu bound check - and every arm that does no\nwork jumps to a shared `return 0` label after the switch rather than\nreturning in place.\n\nsrc/Camp/cmpMain.c declared the callee as taking u8 * and passed the\nraw state pointer.  It now declares u32 * and casts at the call.  The\ncaller's object is unchanged: all 8 of its functions still verify as\nMATCH.","measures":{"fuzzy_match_percent":39.220707,"total_code":4387560,"matched_code":1720832,"matched_code_percent":39.220707,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7956,"matched_functions_percent":60.723553,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T23:41:18Z","commit_sha":"90e5a29e5c5c847d04dc488ebb8be738c6b27e73","commit_message":"Reconstruct func_00207320 to a 310-word floor\n\nUntried before this.  The reconstruction is instruction-for-instruction\nretail's shape - 505 emitted against 504 - once three things went in:\n\n- the outer dispatch is an if/else-if chain, not a switch.  Each arm's\n  body sits inline behind its own bne, and the 1/5/6 arms fall through\n  to a single `return 1`; the inner dispatch on *(s16 *)(arg0 + 4) is a\n  real jump table whose 3/7/2/0 arms break to one shared `return 4`.\n- func_001f0620 takes two arguments, not the six m2c prints.  Retail\n  reuses whichever compare constant is still sitting in $a1 or $a3.\n- the list counter is 32-bit with an explicit & 0xFFFF, which gives\n  retail's andi pair instead of a s16 counter's dsll32/dsra32.\n\nRemaining: saved-register rotation.  Retail numbers arg1=$s0, arg2=$s1,\narg0=$s2, the order their live ranges end; this build numbers arg1=$s1,\narg0=$s0.  250 declaration orders, all pragmas and local aliases for\nboth pointer parameters were measured.  The file's own declaration of\nthe function was `extern void func_00207320();`, which is wrong in both\nreturn type and arity; it is now the real prototype.\n\nbtlShuffleDraw: record that baseline -O2 forms of func_00375f00 measure\n20 words at best, so the optimization_level 1 body stays.","measures":{"fuzzy_match_percent":39.17804,"total_code":4387560,"matched_code":1718960,"matched_code_percent":39.17804,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7955,"matched_functions_percent":60.71592,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T23:18:35Z","commit_sha":"87583557291797d7a0e38454664e6c4b4291ae1b","commit_message":"func_00454640 5 -> 3 words, and MATCH func_002d7300\n\nsdkCdvd: hoisting only the scan loop's base into the `for` header, and\nleaving `node + 8` to opt_loop_invariants, puts both values in retail's\nregisters instead of swapping them.  The remaining three words are the\ntwo hoists being emitted in the opposite order; forcing the order back\nre-swaps the registers, because MWCC numbers them by first use in the\nloop body.\n\ny_fclShopDraw: func_002d7300 matches.  The Vec2f stack slots are u64,\nnot s64, which reproduces the lw-first argument order at all 22\nfunc_002e0620 call sites; the draw table is a Vec2f * rather than the\nf32 arrays m2c printed, which gives the $s1 lwc1 base hoist; and the\ncoordinates are (f32) casts of integer literals, which reproduces every\nfunc_002b2970 cvt.s.w chain including the negative immediates.","measures":{"fuzzy_match_percent":39.17804,"total_code":4387560,"matched_code":1718960,"matched_code_percent":39.17804,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7955,"matched_functions_percent":60.71592,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T23:10:23Z","commit_sha":"ff700757e5dde65805d7db28affbd49f82613d1c","commit_message":"Handoff: the loop-layout levers that matched func_00156cf0\n\nInduction variables are zeroed before the invariants beside them, code\nreached by falling out of a loop belongs after the other return, two\npasses over one grid want two counters, and m2c's pointer type scales\nevery stride it prints.","measures":{"fuzzy_match_percent":39.125164,"total_code":4387560,"matched_code":1716640,"matched_code_percent":39.125164,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7954,"matched_functions_percent":60.70829,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T23:07:46Z","commit_sha":"9accd4136c4cb9134f659319ba8263dfcc03586e","commit_message":"MATCH func_00156cf0\n\nThe m2c draft typed arg0 as s16 *, which turned retail's row stride of\n5 into 10 and the rule stride of 0xC into 0x18; it is a u8 *.  With the\nstrides fixed the reconstruction still sat at 248 words until three\nlayout facts went in:\n\n- the success half is reached by falling out of the 5x5 scan, so it\n  belongs after `return 0` behind a label, not inside the column loop\n  (248 -> 68);\n- the second pass needs its own counter - sharing one with the scan\n  costs 72 words, and it also miscompiles;\n- each loop zeroes its induction variable before computing the\n  invariants beside it, which is the comma initialiser in the three\n  `for` headers (68 -> 0).","measures":{"fuzzy_match_percent":39.125164,"total_code":4387560,"matched_code":1716640,"matched_code_percent":39.125164,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7954,"matched_functions_percent":60.70829,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T22:55:03Z","commit_sha":"4d144553dda8641e12671bdbc9f4019331369b37","commit_message":"Take func_00303610 from 131 to a 32-word floor\n\nTwo things carried it.  arg2 is a u16 *, so the m2c draft's\n*(u8 *)(arg2 + j * 2) double-scales the index; plain arg2[j] gives\nretail's sll 1 plus lhu.  And opt_loop_invariants on hoists the\nconstant 1 that every case's flag set reuses - 145 to 44 words on its\nown - which is exactly the const-hoist the wave-14 note had named but\nnot closed.\n\nRemaining: retail keeps the per-case loop counters in temps and splits\nj/k across $s5/$s3 where this build holds j in $s3 throughout, and it\nzeroes the flag before computing the rule address.  Block-scoped\nper-case counters measure 240; 200 declaration orders are flat.","measures":{"fuzzy_match_percent":39.089424,"total_code":4387560,"matched_code":1715072,"matched_code_percent":39.089424,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7953,"matched_functions_percent":60.700657,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T22:47:05Z","commit_sha":"8c22aade63fb4d2a61abe0ca0a86fe6ac60a223b","commit_message":"Handoff: declaration levers from the untried-function reconstructions\n\nRecords the five that moved real distance this pass: scalar globals\nlanding in small data when retail addresses them absolutely, switch\ncompare chains being emitted in reverse label order, compound\nassignments evaluating the right side first, storing a narrow result\nbefore the test that extends it, and a goto out of a case putting the\nstore on the branch path.","measures":{"fuzzy_match_percent":39.089424,"total_code":4387560,"matched_code":1715072,"matched_code_percent":39.089424,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7953,"matched_functions_percent":60.700657,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T22:42:23Z","commit_sha":"dd20c8abb4185f79cc1d19f3701bb8bd0f87fa5d","commit_message":"Reconstruct func_00154720 to a 177-word floor\n\nUntried before this: no body, no archive.  The reconstruction needed\n32-bit locals for the state and working value and no (s16) cast on the\nreturns - each cast cost a dsll32/dsra32 pair retail does not have -\nplus arg2 case labels written so the compare chain comes out reversed.\n\nThe note also records a variant that moves the shared block to the end\nof the switch: 186 words but 42 edit instructions against 154, so its\nblock layout is much closer to retail's.  probe_search now also tries\nopt_rebuildconditionals off and no_branch_likely on, the two pragmas\nthat came up while chasing the un-inverted branch pairs.","measures":{"fuzzy_match_percent":39.089424,"total_code":4387560,"matched_code":1715072,"matched_code_percent":39.089424,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7953,"matched_functions_percent":60.700657,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T22:19:24Z","commit_sha":"a0a7f1a8865015aa70bd74d7eb8572ba4288b294","commit_message":"Reconstruct func_00454640 to a 5-word floor\n\nThe unit carried a note recording an abandoned attempt at 103 words\nwith no body.  The body now scores 5.  What closed it: case 3 is a\ntop-level label whose body follows the state-4 block, entered by an\nexplicit \"if (state == 3) { readState = 3; goto do_state3; }\" so the\nstore lands on the branch path as retail's does; the reference count\nis a compound -=, which loads 0x35C before 0x35A and stores the\ndifference before the sign extension that feeds the test; the archive\nhandle is stored straight from the call and re-read into the local;\nand opt_loop_invariants on hoists the slot-scan base and target.\n\nThe remaining five words are the two hoisted scan values landing in\n$a1/$a0 rather than retail's $a0/$a1; the note lists what was measured\nagainst that.","measures":{"fuzzy_match_percent":39.089424,"total_code":4387560,"matched_code":1715072,"matched_code_percent":39.089424,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7953,"matched_functions_percent":60.700657,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T22:04:01Z","commit_sha":"1c71a30fa9fb82ba97892a2ef83743509a922b5f","commit_message":"Reconstruct func_00312c60 to a 221-word floor\n\nPreviously carried only a discarded probe note at 924 words with a\n0xB0 frame.  The body now scores 221 with retail's 0xA0 frame: the\nthird parameter is s32 with one hoisted (s8) cast, so the sign\nextension happens once as retail does it rather than per iteration;\nthe deck row and the u16 cell are pointer locals, which restores the\ninner-loop addressing; and the inner index is zeroed before the row is\ncomputed.  opt_loop_invariants on carries the rest.  The residual is\nthe register map through the weighted pick loop.","measures":{"fuzzy_match_percent":39.089424,"total_code":4387560,"matched_code":1715072,"matched_code_percent":39.089424,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7953,"matched_functions_percent":60.700657,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T21:39:44Z","commit_sha":"2ce120230603a78850d7e7e8300be5e7fd22915e","commit_message":"Correct func_00194590's return type; func_001a2d70 floor 25 -> 2 words\n\nm2c emitted the declaration as s64.  Truncating the result into an s32\nlocal cost a dsll32/dsra32 normalisation pair at the call site, which\nwas two of this floor's three remaining edits.  The unit is unchanged\notherwise: 52 matched functions before and after.\n\nThe floor's last two words are retail's bltz jump-table range check,\ndead after the andi and absent from this build's lowering; the note\nlists the subject spellings and pragmas measured against it.","measures":{"fuzzy_match_percent":39.089424,"total_code":4387560,"matched_code":1715072,"matched_code_percent":39.089424,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7953,"matched_functions_percent":60.700657,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T21:13:52Z","commit_sha":"81f3978a8faf3101e648eaaff67095847dc67e87","commit_message":"Deepen the func_002240e0 floor to a structure-exact 118 words\n\nThe declaration order below is the best of 150 measured permutations\nand the scoped opt_propagation off leaves the stream at 218 against\nretail's 218 with no inserts or deletes; the residual is the $s1/$s5\npair and one boolean materialisation.","measures":{"fuzzy_match_percent":39.089424,"total_code":4387560,"matched_code":1715072,"matched_code_percent":39.089424,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7953,"matched_functions_percent":60.700657,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T20:34:55Z","commit_sha":"96fee0f3c9775b304ad09ab40c48828caff67728","commit_message":"Handoff: verify masks relocations, so link the image after symbol work\n\nThe func_002938c0 regression was invisible to verify.py and broke CI\ntwice; tools/build.py names the diverging vram word in about two\nminutes with a warm cache.","measures":{"fuzzy_match_percent":39.071922,"total_code":4387560,"matched_code":1714304,"matched_code_percent":39.071922,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7952,"matched_functions_percent":60.693024,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T20:32:49Z","commit_sha":"21abc176219f4fe21692a0f1fe16f1e12b04ca01","commit_message":"Fix the format-string symbol in func_002938c0's recovered body\n\nThree of the four func_00440b68(&iGpffffa7c0, ...) calls passed\nD_0063C990 where retail passes D_0063C970.  verify.py masks relocated\nfields, so the wrong symbol still scored MATCH; the proprietary link\nresolves them and the image diverged at vram 0x293a94 (addiu $a1, $a1,\n-0x3670 against retail's -0x3690), which is what broke CI on the last\ntwo pushes.\n\nLocal tools/build.py now reports \"loadable image sha1 ... OK\" again.","measures":{"fuzzy_match_percent":39.071922,"total_code":4387560,"matched_code":1714304,"matched_code_percent":39.071922,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7952,"matched_functions_percent":60.693024,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T20:32:29Z","commit_sha":"0608e56f40d89bde4ed9faffcb9c2522f884734a","commit_message":", which is what broke CI on the\nlast two pushes.\n\nLocal  now reports  again.\nEOF\n)","measures":{"fuzzy_match_percent":39.071922,"total_code":4387560,"matched_code":1714304,"matched_code_percent":39.071922,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7952,"matched_functions_percent":60.693024,"complete_code":1107048,"complete_code_percent":25.231518,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-16T16:54:35Z","commit_sha":"538e6f0e6f707a179983625d51112f45f5ac897a","commit_message":"Record the cancelling-error variant on func_001f4e50\n\nSpelling its switch guard 'if (aux > -1)' scores 6 differing words\nagainst the floor's 57, but only because 'slti $at,$v0,0; bnez $at'\nreplaces retail's single 'bltz $v0' and the extra instruction cancels\nthe missing addiu below it, realigning every later branch. The floor\nkeeps retail's comparison; the measurement is archived so the next pass\ndoes not re-find it and read it as progress.","measures":{"fuzzy_match_percent":38.85531,"total_code":4387560,"matched_code":1704800,"matched_code_percent":38.85531,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7943,"matched_functions_percent":60.624332,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-16T16:46:10Z","commit_sha":"d2ea0d648a587e9e635ac24e5908b4eec675a38c","commit_message":"Start the permuter from the installed floor, pragmas included\n\nstrip_opt removed '#pragma optimization_level' from the base and left\nmut_opt to rediscover it. For func_00375f00 that is the difference\nbetween a 4-byte residual and a 632-point start, so the search spent its\nwhole budget climbing back to the body it was given.","measures":{"fuzzy_match_percent":38.85531,"total_code":4387560,"matched_code":1704800,"matched_code_percent":38.85531,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7943,"matched_functions_percent":60.624332,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-16T16:40:11Z","commit_sha":"71b74aeff95569a4218062ddca9de5a6d97787e0","commit_message":"Keep the permuter's candidates semantics-preserving\n\nTwo problems made permuter output untrustworthy on this tree:\n\n- A floor behind a guard compiles its INCLUDE_ASM arm, so every\n  candidate scored 'symbol missing' and the permuter could not run on\n  any guarded function at all. It now replaces the whole guard with the\n  body it is mutating, like probe_variants.py.\n- Scoring only compares bytes, so a mutation that changes behaviour can\n  win. Swapping 'offset = i * 8;' below its own use in func_001b05d0\n  scored 42 -> 19 purely by reading the previous iteration's offset, and\n  reversing a statement run reproduced the same stale read. Both\n  mutations now require that no statement moves across a definition of a\n  name it uses; with that check the same search returns 42, the real\n  floor.","measures":{"fuzzy_match_percent":38.85531,"total_code":4387560,"matched_code":1704800,"matched_code_percent":38.85531,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7943,"matched_functions_percent":60.624332,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-16T16:14:19Z","commit_sha":"9707198dae6f3538dfd55326cfeb6174744b6101","commit_message":"Re-pin the fallback-corpus manifest after the verify.py change\n\nregenerate_asm.py treats tools/verify.py as a generator input, so the\nguard-classification fix stopped 'make regenerate-asm' and with it the\nproprietary build. The edit touched scan_markers; the regenerator only\nuses verify.RetailElf, so the corpus is unaffected - confirmed by\nrunning the check with the pinned toolchain (splat64 0.39.1,\nspimdisasm 1.40.2): 11152 fallback files byte-identical, 2 retained\nfiles unchanged.","measures":{"fuzzy_match_percent":38.85531,"total_code":4387560,"matched_code":1704800,"matched_code_percent":38.85531,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7943,"matched_functions_percent":60.624332,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-13T18:42:11Z","commit_sha":"0e665b1355a464ce823db472db6d57fa96b27c22","commit_message":"Recover func_004a1d70","measures":{"fuzzy_match_percent":38.547165,"total_code":4387560,"matched_code":1691280,"matched_code_percent":38.547165,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7928,"matched_functions_percent":60.509846,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-13T17:44:40Z","commit_sha":"8cb5aa96a51e8690caa1c41aaf7b3e9b29b8f4a6","commit_message":"Recover calendar scheduler task transitions","measures":{"fuzzy_match_percent":38.528202,"total_code":4387560,"matched_code":1690448,"matched_code_percent":38.528202,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7927,"matched_functions_percent":60.502213,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-13T15:56:02Z","commit_sha":"7196a98feafd8fc5a67635d8e137b2812c7b93ea","commit_message":"Recover signed skill menu navigation","measures":{"fuzzy_match_percent":38.504135,"total_code":4387560,"matched_code":1689392,"matched_code_percent":38.504135,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7926,"matched_functions_percent":60.49458,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-13T14:55:11Z","commit_sha":"60ea5dbb79c48a6b8fef45850cc524e6e4a47ed2","commit_message":"Recover skill descriptor cost rendering","measures":{"fuzzy_match_percent":38.48918,"total_code":4387560,"matched_code":1688736,"matched_code_percent":38.48918,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7925,"matched_functions_percent":60.48695,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-13T12:58:32Z","commit_sha":"84d2b7dff36cf9ea51868f8d5f8b7b8a8158bdb6","commit_message":"Recover skill detail rendering","measures":{"fuzzy_match_percent":38.45746,"total_code":4387560,"matched_code":1687344,"matched_code_percent":38.45746,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7924,"matched_functions_percent":60.479317,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-13T11:06:30Z","commit_sha":"2f8545937df0bf59b9083d08274b5bc8615ec8ce","commit_message":"Recover skill grid rendering and descriptor calls","measures":{"fuzzy_match_percent":38.408955,"total_code":4387560,"matched_code":1685216,"matched_code_percent":38.408955,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7923,"matched_functions_percent":60.471684,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-13T10:07:17Z","commit_sha":"03b5678cf2448eccd78694f121d2451ce742cbb7","commit_message":"Recover result dialog opacity callback","measures":{"fuzzy_match_percent":38.37723,"total_code":4387560,"matched_code":1683824,"matched_code_percent":38.37723,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7922,"matched_functions_percent":60.46405,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-13T06:59:28Z","commit_sha":"a7c1443d567fdf73faa7b2a17794c6b9af53345c","commit_message":"Recover field encounter allocation and diagnostic contracts","measures":{"fuzzy_match_percent":38.356808,"total_code":4387560,"matched_code":1682928,"matched_code_percent":38.356808,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7921,"matched_functions_percent":60.456417,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-13T00:41:49Z","commit_sha":"fd3157c25cdf5e3a466e88ee35649ae003689e94","commit_message":"Recover controller heading with the actual vector normalization ABI","measures":{"fuzzy_match_percent":38.339306,"total_code":4387560,"matched_code":1682160,"matched_code_percent":38.339306,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7920,"matched_functions_percent":60.448788,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-12T20:45:47Z","commit_sha":"6464d624c3816e240a5489bc4b3b485a42199d63","commit_message":"Recover decimal result rendering and coherent opacity ABI","measures":{"fuzzy_match_percent":38.314144,"total_code":4387560,"matched_code":1681056,"matched_code_percent":38.314144,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7919,"matched_functions_percent":60.441154,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-12T18:32:24Z","commit_sha":"8dcf34e9af2a520aabeae86e393516b2c17a7384","commit_message":"Recover fusion snapshots, unit sizing, and camera bounds\n\nClose canonical memory callback contracts and preserve exact compiler transplant relocations. Keep compiler scratch sources outside canonical owner scans. Verify 6288 first-party matches, 572 fallbacks, 531 tests, zero lint findings, and both exact retail identities.","measures":{"fuzzy_match_percent":38.300285,"total_code":4387560,"matched_code":1680448,"matched_code_percent":38.300285,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7918,"matched_functions_percent":60.43352,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-12T06:42:32Z","commit_sha":"dc26568129e05a7bdb2eb864a8ea7c599b2b613e","commit_message":"Recover seven first-party functions and repair provider definedness","measures":{"fuzzy_match_percent":38.244858,"total_code":4387560,"matched_code":1678016,"matched_code_percent":38.244858,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7915,"matched_functions_percent":60.410625,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-12T03:13:00Z","commit_sha":"8403d92ae0b0ebf68bcfc14bbe53e83440854e2a","commit_message":"Recover exact field gradient callback","measures":{"fuzzy_match_percent":38.124516,"total_code":4387560,"matched_code":1672736,"matched_code_percent":38.124516,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7908,"matched_functions_percent":60.357197,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-12T00:45:39Z","commit_sha":"7f840d796adb6940f7c75ba9ca3b3ed2c6e9019e","commit_message":"Recover exact bank controller and scheduler callback contract","measures":{"fuzzy_match_percent":38.110657,"total_code":4387560,"matched_code":1672128,"matched_code_percent":38.110657,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7907,"matched_functions_percent":60.349564,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-11T23:43:56Z","commit_sha":"a213359b3acca52cca88f630079cb0251499ed12","commit_message":"Recover exact first-party bank-slot animation","measures":{"fuzzy_match_percent":38.082214,"total_code":4387560,"matched_code":1670880,"matched_code_percent":38.082214,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7906,"matched_functions_percent":60.341934,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-11T23:08:34Z","commit_sha":"2f4d226f950aacf2ebef1e6f42d9497430001689","commit_message":"Recover exact bank slot registration","measures":{"fuzzy_match_percent":38.057415,"total_code":4387560,"matched_code":1669792,"matched_code_percent":38.057415,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7905,"matched_functions_percent":60.3343,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-11T22:57:23Z","commit_sha":"f98f8783f7584fdecc226d02ceae14fcbb98945d","commit_message":"Recover exact calendar override classification","measures":{"fuzzy_match_percent":38.045746,"total_code":4387560,"matched_code":1669280,"matched_code_percent":38.045746,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7904,"matched_functions_percent":60.326668,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-11T22:10:18Z","commit_sha":"c66cd5e764dda7a1ea9db29a2eb95738b94c66f4","commit_message":"Recover exact two-Persona fusion with promoted lookup helpers","measures":{"fuzzy_match_percent":38.034443,"total_code":4387560,"matched_code":1668784,"matched_code_percent":38.034443,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7903,"matched_functions_percent":60.319035,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-11T21:57:40Z","commit_sha":"9d880e2494e4ea5941a3d9f57c5b049adb1a7068","commit_message":"Recover exact result descriptor initialization","measures":{"fuzzy_match_percent":38.01548,"total_code":4387560,"matched_code":1667952,"matched_code_percent":38.01548,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7902,"matched_functions_percent":60.3114,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-11T21:07:00Z","commit_sha":"1bb32108a93d65f7b46a22d0d50e616d9dd8ce46","commit_message":"Recover exact event cleanup with internal unlink linkage","measures":{"fuzzy_match_percent":37.993237,"total_code":4387560,"matched_code":1666976,"matched_code_percent":37.993237,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7901,"matched_functions_percent":60.303772,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-11T20:02:48Z","commit_sha":"de7ec1844ff65cf62338dec1828a170814d420eb","commit_message":"Restore retail diagnostic and lookup data bindings","measures":{"fuzzy_match_percent":37.979744,"total_code":4387560,"matched_code":1666384,"matched_code_percent":37.979744,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7900,"matched_functions_percent":60.29614,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-11T15:42:49Z","commit_sha":"d63de44d8d9199537e0846481869ed232cbcb2c8","commit_message":"Restore explicit result frame buffer forwarding","measures":{"fuzzy_match_percent":37.979744,"total_code":4387560,"matched_code":1666384,"matched_code_percent":37.979744,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7900,"matched_functions_percent":60.29614,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-11T13:32:23Z","commit_sha":"37bd798d0ad34b5dc09fb8b00c8bf5ee6d9ec4d1","commit_message":"Restore explicit AI status predicate contract","measures":{"fuzzy_match_percent":37.979744,"total_code":4387560,"matched_code":1666384,"matched_code_percent":37.979744,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7900,"matched_functions_percent":60.29614,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-11T11:53:30Z","commit_sha":"c628439fba01fcd416fc4f8f25c2acad4f5976dd","commit_message":"Recover reward XP setup and panel quads","measures":{"fuzzy_match_percent":37.979744,"total_code":4387560,"matched_code":1666384,"matched_code_percent":37.979744,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7900,"matched_functions_percent":60.29614,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-11T09:55:47Z","commit_sha":"b6d3e6a78bc0d36d61044c6eef1a43009d2d2f72","commit_message":"Restore complete retail player XP table","measures":{"fuzzy_match_percent":37.897694,"total_code":4387560,"matched_code":1662784,"matched_code_percent":37.897694,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7898,"matched_functions_percent":60.280872,"complete_code":1115272,"complete_code_percent":25.418957,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":176}},{"timestamp":"2026-09-11T09:06:11Z","commit_sha":"af5dc96c550487e62c38f4384cbf3afdeca82bbc","commit_message":"Correct unit-level selector return contract","measures":{"fuzzy_match_percent":37.897694,"total_code":4387560,"matched_code":1662784,"matched_code_percent":37.897694,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7898,"matched_functions_percent":60.280872,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-11T07:58:29Z","commit_sha":"6cc59679010c5c6928c034c7fe1c841337135f2a","commit_message":"Recover two-unit camera framing","measures":{"fuzzy_match_percent":37.897694,"total_code":4387560,"matched_code":1662784,"matched_code_percent":37.897694,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7898,"matched_functions_percent":60.280872,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-11T07:15:35Z","commit_sha":"c0a4381a93cfc8cf2efc65d794c88a15c6c4470f","commit_message":"Recover reward scaling and AI eligibility","measures":{"fuzzy_match_percent":37.874718,"total_code":4387560,"matched_code":1661776,"matched_code_percent":37.874718,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7897,"matched_functions_percent":60.27324,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-11T05:39:49Z","commit_sha":"7a26b5ba60ab2cb56dff636036776fbfb73f1d77","commit_message":"Recover skill costs and battle fade records","measures":{"fuzzy_match_percent":37.852108,"total_code":4387560,"matched_code":1660784,"matched_code_percent":37.852108,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7895,"matched_functions_percent":60.257977,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-11T03:41:21Z","commit_sha":"0c0564558040cdea134bfba782a948f442576cc4","commit_message":"Recover three-pose battle camera initialization","measures":{"fuzzy_match_percent":37.81783,"total_code":4387560,"matched_code":1659280,"matched_code_percent":37.81783,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7893,"matched_functions_percent":60.24271,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-11T03:02:02Z","commit_sha":"e56cf24f00c2eab904f3c949504585f2f3c64f41","commit_message":"Recover battle setup and reconcile maximum SP contracts","measures":{"fuzzy_match_percent":37.79522,"total_code":4387560,"matched_code":1658288,"matched_code_percent":37.79522,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7892,"matched_functions_percent":60.235077,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-11T02:13:50Z","commit_sha":"f6b6f7976425014776287fe54c82603d7a407ea7","commit_message":"Recover battle callbacks, field frames, and resource snapshots","measures":{"fuzzy_match_percent":37.773342,"total_code":4387560,"matched_code":1657328,"matched_code_percent":37.773342,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7891,"matched_functions_percent":60.227448,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-10T23:26:16Z","commit_sha":"6af7ca862670a0807438c9f96e8e64411c22163c","commit_message":"Recover battle labels, party panels, and Persona initialization","measures":{"fuzzy_match_percent":37.634766,"total_code":4387560,"matched_code":1651248,"matched_code_percent":37.634766,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7885,"matched_functions_percent":60.181652,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-10T21:13:19Z","commit_sha":"d499934a14481ba51f96285e29428f36c4d2d83c","commit_message":"Recover model setup, battle collection and field selection","measures":{"fuzzy_match_percent":37.57241,"total_code":4387560,"matched_code":1648512,"matched_code_percent":37.57241,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7882,"matched_functions_percent":60.158756,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-10T18:44:27Z","commit_sha":"49aff6ab2fa6cd7f9fc70d89a34c300a2fe24f7b","commit_message":"Recover signed battle callback state word","measures":{"fuzzy_match_percent":37.46228,"total_code":4387560,"matched_code":1643680,"matched_code_percent":37.46228,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7877,"matched_functions_percent":60.120594,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-10T17:52:26Z","commit_sha":"2e099efd069ba3da249bdfa509d8a5df3c7ff327","commit_message":"Recover event, memory-card and battle interface functions","measures":{"fuzzy_match_percent":37.44587,"total_code":4387560,"matched_code":1642960,"matched_code_percent":37.44587,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7876,"matched_functions_percent":60.11296,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-10T15:31:03Z","commit_sha":"cf46d854b3f82955f986eebe98d4efda859093de","commit_message":"Recover byte-exact shuffle card reconciliation","measures":{"fuzzy_match_percent":37.281406,"total_code":4387560,"matched_code":1635744,"matched_code_percent":37.281406,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7871,"matched_functions_percent":60.0748,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-10T14:35:02Z","commit_sha":"624fdc435151c3f8627a78a450aad7ea628bf6f1","commit_message":"Recover the task-loader parent input contract","measures":{"fuzzy_match_percent":37.262806,"total_code":4387560,"matched_code":1634928,"matched_code_percent":37.262806,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7870,"matched_functions_percent":60.067165,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-10T14:00:14Z","commit_sha":"fe9996f7d984244c605a74a2480d0018b1d960bf","commit_message":"Recover material animation loading","measures":{"fuzzy_match_percent":37.262806,"total_code":4387560,"matched_code":1634928,"matched_code_percent":37.262806,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7870,"matched_functions_percent":60.067165,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-10T13:16:02Z","commit_sha":"e29e33198ae6542cbcd1d17f44b4d4915b08362b","commit_message":"Recover shuffle, fade, packet dispatch and UI interpolation","measures":{"fuzzy_match_percent":37.243114,"total_code":4387560,"matched_code":1634064,"matched_code_percent":37.243114,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7869,"matched_functions_percent":60.059532,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-10T11:47:35Z","commit_sha":"69af6a68a02a74f1b4e35b2228a89c12266996d6","commit_message":"Recover four-keyframe orbit camera","measures":{"fuzzy_match_percent":37.136997,"total_code":4387560,"matched_code":1629408,"matched_code_percent":37.136997,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7864,"matched_functions_percent":60.02137,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-10T10:10:30Z","commit_sha":"4099c2f69b8791738e76e246d338946025f6344e","commit_message":"Recover camera keys and party-panel selection","measures":{"fuzzy_match_percent":37.112926,"total_code":4387560,"matched_code":1628352,"matched_code_percent":37.112926,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7863,"matched_functions_percent":60.013737,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-10T08:08:48Z","commit_sha":"d699178b50676dbfd2c25ae0ab9879e711605220","commit_message":"Recover boot initialization and field rendering with consistent renderer ABI","measures":{"fuzzy_match_percent":37.074272,"total_code":4387560,"matched_code":1626656,"matched_code_percent":37.074272,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7861,"matched_functions_percent":59.998474,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-10T06:04:25Z","commit_sha":"e1993e8f1fe70ed98e447ded4bac065c3edfb8db","commit_message":"Recover ten first-party field, battle and input functions","measures":{"fuzzy_match_percent":37.03817,"total_code":4387560,"matched_code":1625072,"matched_code_percent":37.03817,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7859,"matched_functions_percent":59.983208,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-10T03:16:32Z","commit_sha":"25495f87f3b1776d55775765934cc138edebb256","commit_message":"Recover six first-party slot, loot, drawing and allocator functions","measures":{"fuzzy_match_percent":36.86933,"total_code":4387560,"matched_code":1617664,"matched_code_percent":36.86933,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7849,"matched_functions_percent":59.906883,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-09T23:34:00Z","commit_sha":"d2e28389f128cf464ed04e35b9e8885055524108","commit_message":"Recover 31 first-party functions and typed ABI boundaries\n\nRecover save, script, battle, field, calendar, and drawing paths. Replace synthetic renderer parameters with genuine packed variadics, migrate task and halfword contracts, and register the required GP symbols.\n\nVerify 6213 first-party MATCH / 647 ASM, 172 source objects, both retail SHA-1s, 529 passing tests, and clean source-honesty lint.","measures":{"fuzzy_match_percent":36.774517,"total_code":4387560,"matched_code":1613504,"matched_code_percent":36.774517,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7843,"matched_functions_percent":59.86109,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-09T16:02:29Z","commit_sha":"217acad362d204ab443e067e12d3301d474bcef5","commit_message":"Recover panel callback and rounded rectangle draw","measures":{"fuzzy_match_percent":36.196518,"total_code":4387560,"matched_code":1588144,"matched_code_percent":36.196518,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7812,"matched_functions_percent":59.624485,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-09T14:09:30Z","commit_sha":"b2a4696c7c43dbe41af1e878abf727e7ed82be87","commit_message":"Recover seven first-party resource and script functions","measures":{"fuzzy_match_percent":36.16771,"total_code":4387560,"matched_code":1586880,"matched_code_percent":36.16771,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7810,"matched_functions_percent":59.60922,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-09T11:45:00Z","commit_sha":"6e9f7593159fe661ae5134c15d201304d14f395e","commit_message":"Refresh checked ASM provenance and publish SDK endpoint","measures":{"fuzzy_match_percent":36.05831,"total_code":4387560,"matched_code":1582080,"matched_code_percent":36.05831,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7803,"matched_functions_percent":59.555794,"complete_code":1115160,"complete_code_percent":25.416405,"complete_data":0,"complete_data_percent":100,"total_units":382,"complete_units":175}},{"timestamp":"2026-09-09T10:10:49Z","commit_sha":"27157d6217788af8d5caa16f5b2e0c3abe0bdc07","commit_message":"Recover field task constructor and camera pose updater","measures":{"fuzzy_match_percent":36.027313,"total_code":4387560,"matched_code":1580720,"matched_code_percent":36.027313,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7802,"matched_functions_percent":59.54816,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T09:22:01Z","commit_sha":"95282b783dbe888ae930149ba1c7c686aa7b1413","commit_message":"Recover material color callback and document controller payload blocker","measures":{"fuzzy_match_percent":35.971153,"total_code":4387560,"matched_code":1578256,"matched_code_percent":35.971153,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7800,"matched_functions_percent":59.532894,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T08:56:22Z","commit_sha":"483147fcb74502e1356371866969bac0820d4b60","commit_message":"Recover field transform and panel selection with explicit inputs","measures":{"fuzzy_match_percent":35.945263,"total_code":4387560,"matched_code":1577120,"matched_code_percent":35.945263,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7799,"matched_functions_percent":59.525265,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T08:13:08Z","commit_sha":"060b182e7446ed4cdf03b6edf9c087ab68dc7526","commit_message":"Recover panel composition and canonical drawing contracts","measures":{"fuzzy_match_percent":35.89749,"total_code":4387560,"matched_code":1575024,"matched_code_percent":35.89749,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7797,"matched_functions_percent":59.51,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T07:28:58Z","commit_sha":"004fc1c6f4d508502b98aa09dfa2da0e3097271a","commit_message":"Recover three-sprite panel expansion from retail","measures":{"fuzzy_match_percent":35.870872,"total_code":4387560,"matched_code":1573856,"matched_code_percent":35.870872,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7796,"matched_functions_percent":59.502365,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T07:16:59Z","commit_sha":"317bfbb2f22f30a06bca95a49b57c124918f2f5a","commit_message":"Recover staged panel sprite animation from retail","measures":{"fuzzy_match_percent":35.837322,"total_code":4387560,"matched_code":1572384,"matched_code_percent":35.837322,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7795,"matched_functions_percent":59.49473,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T07:05:20Z","commit_sha":"ff2515a100529c1105f76d39da4fa562e10422a3","commit_message":"Recover panel transition and typed drawing position","measures":{"fuzzy_match_percent":35.80997,"total_code":4387560,"matched_code":1571184,"matched_code_percent":35.80997,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7794,"matched_functions_percent":59.487103,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T06:46:32Z","commit_sha":"0fe20a7821ce6c88ffdc1eef05e5dadc651bb95f","commit_message":"Recover panel state updater from fresh ASM","measures":{"fuzzy_match_percent":35.787727,"total_code":4387560,"matched_code":1570208,"matched_code_percent":35.787727,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7793,"matched_functions_percent":59.47947,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T06:21:51Z","commit_sha":"326ed9ed00c4c19a32607de32697cc2823f5aecc","commit_message":"Recover panel geometry from fresh ASM","measures":{"fuzzy_match_percent":35.765484,"total_code":4387560,"matched_code":1569232,"matched_code_percent":35.765484,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7792,"matched_functions_percent":59.471836,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T05:55:05Z","commit_sha":"bf889febcc58bbe8b669bd67a3a6084a3f782596","commit_message":"Recover field camera callback from fresh ASM","measures":{"fuzzy_match_percent":35.74433,"total_code":4387560,"matched_code":1568304,"matched_code_percent":35.74433,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7791,"matched_functions_percent":59.464203,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T05:22:03Z","commit_sha":"f395b03513bb94fe9778728c33b6e76469b554e1","commit_message":"Recover item-shop polygon renderer from fresh ASM","measures":{"fuzzy_match_percent":35.722816,"total_code":4387560,"matched_code":1567360,"matched_code_percent":35.722816,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7790,"matched_functions_percent":59.45657,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T04:22:11Z","commit_sha":"9fdf3b82aeb779bb860b18267ed6f43349ad0959","commit_message":"Recover four-key camera initializer from fresh ASM","measures":{"fuzzy_match_percent":35.701664,"total_code":4387560,"matched_code":1566432,"matched_code_percent":35.701664,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7789,"matched_functions_percent":59.44894,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T03:31:12Z","commit_sha":"8fc9166e0c8ed7c4d42d45a6c4a52349cc0ae35a","commit_message":"Recover result weight update from a fresh ASM target","measures":{"fuzzy_match_percent":35.679787,"total_code":4387560,"matched_code":1565472,"matched_code_percent":35.679787,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7788,"matched_functions_percent":59.441307,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T02:40:15Z","commit_sha":"d5b7c436b445ef6ae260fbae51081d0054bd208f","commit_message":"Restore integer sprite handle ABI and retain measured draw candidates","measures":{"fuzzy_match_percent":35.659,"total_code":4387560,"matched_code":1564560,"matched_code_percent":35.659,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7787,"matched_functions_percent":59.433674,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T02:23:00Z","commit_sha":"76d1627af8d1bba5043a0ea868db794db8d73a4b","commit_message":"Document canonical text clamp and virtual-pad floors","measures":{"fuzzy_match_percent":35.659,"total_code":4387560,"matched_code":1564560,"matched_code_percent":35.659,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7787,"matched_functions_percent":59.433674,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T01:52:27Z","commit_sha":"79fbe178a04ccf83c10d2fb61d7459bbaf2b395e","commit_message":"Record canonical capped update formation and script floors","measures":{"fuzzy_match_percent":35.659,"total_code":4387560,"matched_code":1564560,"matched_code_percent":35.659,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7787,"matched_functions_percent":59.433674,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T01:20:31Z","commit_sha":"ff18dbfa8469d9497ce5935cf691adf78638c88b","commit_message":"Archive measured script glyph panel and shop source recoveries","measures":{"fuzzy_match_percent":35.659,"total_code":4387560,"matched_code":1564560,"matched_code_percent":35.659,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7787,"matched_functions_percent":59.433674,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T00:24:02Z","commit_sha":"0c1e11c51cbff1faf2a96b1b1844306640fcb6bf","commit_message":"Record normal-value copy boundary measurements","measures":{"fuzzy_match_percent":35.659,"total_code":4387560,"matched_code":1564560,"matched_code_percent":35.659,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7787,"matched_functions_percent":59.433674,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T00:17:18Z","commit_sha":"7ac819d1477115feaabe8927ce7c6150003c9eb6","commit_message":"Record fusion initiative and nearest-action source-shape probes","measures":{"fuzzy_match_percent":35.659,"total_code":4387560,"matched_code":1564560,"matched_code_percent":35.659,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7787,"matched_functions_percent":59.433674,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-09T00:02:15Z","commit_sha":"d424f62ed223fe243f1e6104676efce0631e9344","commit_message":"Match battle curve sampler from coefficient pointer source","measures":{"fuzzy_match_percent":35.659,"total_code":4387560,"matched_code":1564560,"matched_code_percent":35.659,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7787,"matched_functions_percent":59.433674,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T23:48:52Z","commit_sha":"196906812d20bed1a9eda9175d8b2e0f02158260","commit_message":"Record fresh shuffle cached-context experiments","measures":{"fuzzy_match_percent":35.65207,"total_code":4387560,"matched_code":1564256,"matched_code_percent":35.65207,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7786,"matched_functions_percent":59.42604,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T23:21:36Z","commit_sha":"ed51cac48fa40c23428b2f92c6bb5b78fc609da6","commit_message":"Recover exact geometry neighbor construction","measures":{"fuzzy_match_percent":35.65207,"total_code":4387560,"matched_code":1564256,"matched_code_percent":35.65207,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7786,"matched_functions_percent":59.42604,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T22:59:23Z","commit_sha":"de661b5e1d44b2181fd797b894b98333ae89140e","commit_message":"Record exact-size wide-affinity evaluator probe","measures":{"fuzzy_match_percent":35.632378,"total_code":4387560,"matched_code":1563392,"matched_code_percent":35.632378,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7785,"matched_functions_percent":59.41841,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T21:57:29Z","commit_sha":"394f94b6fde816f0ed23b80afe43094bb007db23","commit_message":"Recover exact eight-point route interpolation","measures":{"fuzzy_match_percent":35.632378,"total_code":4387560,"matched_code":1563392,"matched_code_percent":35.632378,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7785,"matched_functions_percent":59.41841,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T20:36:15Z","commit_sha":"a3c70698d55a70ec275ddc99a39b899d22ddcd6f","commit_message":"Recover exact roster assistance selector","measures":{"fuzzy_match_percent":35.61159,"total_code":4387560,"matched_code":1562480,"matched_code_percent":35.61159,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7784,"matched_functions_percent":59.410778,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T19:37:02Z","commit_sha":"c2d984c632a6f7f17d3bc07c02a996581f6a9fac","commit_message":"Recover exact geometry and skill selectors","measures":{"fuzzy_match_percent":35.590805,"total_code":4387560,"matched_code":1561568,"matched_code_percent":35.590805,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7783,"matched_functions_percent":59.403145,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T18:44:27Z","commit_sha":"918571c0acebbc765b596c448da5e7c9c69ea1f9","commit_message":"Recover exact action preparation initializer","measures":{"fuzzy_match_percent":35.545223,"total_code":4387560,"matched_code":1559568,"matched_code_percent":35.545223,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7781,"matched_functions_percent":59.38788,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T17:50:46Z","commit_sha":"cd472f766592962d29883ed30e083d73453e6e52","commit_message":"Recover opposing camera and persona result updater","measures":{"fuzzy_match_percent":35.502556,"total_code":4387560,"matched_code":1557696,"matched_code_percent":35.502556,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7780,"matched_functions_percent":59.38025,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T16:17:20Z","commit_sha":"a49be011a262d2614f1d634433fb59be0b2f346d","commit_message":"Recover alternate camera and battle action sequence","measures":{"fuzzy_match_percent":35.4402,"total_code":4387560,"matched_code":1554960,"matched_code_percent":35.4402,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7778,"matched_functions_percent":59.364983,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T13:40:59Z","commit_sha":"50586035d202b40e831a24993fb0ead7c55da7a0","commit_message":"Recover group and selection camera dispatchers","measures":{"fuzzy_match_percent":35.331528,"total_code":4387560,"matched_code":1550192,"matched_code_percent":35.331528,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7776,"matched_functions_percent":59.349716,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T13:04:19Z","commit_sha":"77f2c3d50e9cb21081cea2cc4bb79b85a8408290","commit_message":"Recover camera positions and parameterized fitting","measures":{"fuzzy_match_percent":35.266254,"total_code":4387560,"matched_code":1547328,"matched_code_percent":35.266254,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7774,"matched_functions_percent":59.334454,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T11:04:58Z","commit_sha":"8b6057e47763a59feebf20b1f2d666f0cb47d5b8","commit_message":"Match enemy camera transition and battle resource selector","measures":{"fuzzy_match_percent":35.192955,"total_code":4387560,"matched_code":1544112,"matched_code_percent":35.192955,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7772,"matched_functions_percent":59.319187,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T10:06:29Z","commit_sha":"18413abf924acd8299d2a63313027e50cc4b4fad","commit_message":"Match state-1A camera initialization and restore setup inputs","measures":{"fuzzy_match_percent":35.155758,"total_code":4387560,"matched_code":1542480,"matched_code_percent":35.155758,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7770,"matched_functions_percent":59.303925,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T09:40:46Z","commit_sha":"6ecab512a9c9bcc7020daa0bb643abd0819e3cdd","commit_message":"Match camera preparation and restore descriptor release contracts","measures":{"fuzzy_match_percent":35.12914,"total_code":4387560,"matched_code":1541312,"matched_code_percent":35.12914,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7769,"matched_functions_percent":59.29629,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T08:53:00Z","commit_sha":"7872689125602ba33717cd306d0f9e3ef7b231ca","commit_message":"Restore task and camera forwarding contracts","measures":{"fuzzy_match_percent":35.09194,"total_code":4387560,"matched_code":1539680,"matched_code_percent":35.09194,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7768,"matched_functions_percent":59.28866,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T08:07:55Z","commit_sha":"7449db630997b42082d8494423ac74fea4f63d1a","commit_message":"Restore battle packet constructor returns and archive fresh probes","measures":{"fuzzy_match_percent":35.09194,"total_code":4387560,"matched_code":1539680,"matched_code_percent":35.09194,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7768,"matched_functions_percent":59.28866,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T07:07:13Z","commit_sha":"c9a50992241c5e1360acdac5c6359c3601f2a548","commit_message":"Restore packet constructor returns and document fresh probes","measures":{"fuzzy_match_percent":35.09194,"total_code":4387560,"matched_code":1539680,"matched_code_percent":35.09194,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7768,"matched_functions_percent":59.28866,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T06:19:29Z","commit_sha":"f7e949e1685656970c86f2693632aed88b69024f","commit_message":"Recover reaction setup and start dispatchers","measures":{"fuzzy_match_percent":35.09194,"total_code":4387560,"matched_code":1539680,"matched_code_percent":35.09194,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7768,"matched_functions_percent":59.28866,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T05:20:36Z","commit_sha":"b5380c1d2f87116d99c7ee84f10605bb0fa74fe7","commit_message":"Recover untouched enemy reaction dispatcher","measures":{"fuzzy_match_percent":35.00989,"total_code":4387560,"matched_code":1536080,"matched_code_percent":35.00989,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7766,"matched_functions_percent":59.27339,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T04:28:29Z","commit_sha":"cc875f59abba5b657baffd116edc4e410cbaf2c2","commit_message":"Recover formation followup and replace an unproven motion floor","measures":{"fuzzy_match_percent":34.954464,"total_code":4387560,"matched_code":1533648,"matched_code_percent":34.954464,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7765,"matched_functions_percent":59.265762,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T04:03:54Z","commit_sha":"71d80f31e4b9bc929c0a87d445a8a2984f5e88cb","commit_message":"Recover fresh battle dispatchers and correct provider contracts","measures":{"fuzzy_match_percent":34.91143,"total_code":4387560,"matched_code":1531760,"matched_code_percent":34.91143,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7764,"matched_functions_percent":59.25813,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T02:29:35Z","commit_sha":"024255bbd46fb0630d8435a603cad82f6e4c939f","commit_message":"Recover fresh social timer state machine","measures":{"fuzzy_match_percent":34.85272,"total_code":4387560,"matched_code":1529184,"matched_code_percent":34.85272,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7763,"matched_functions_percent":59.250496,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T01:28:46Z","commit_sha":"5e13c71c3dcfb31986f8b56336826e4f4435088a","commit_message":"Retain one-word field dispatcher recovery evidence","measures":{"fuzzy_match_percent":34.829746,"total_code":4387560,"matched_code":1528176,"matched_code_percent":34.829746,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7762,"matched_functions_percent":59.242863,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-08T00:23:55Z","commit_sha":"5176e0a376d60ffc71180fa9d69182a4db6d19d2","commit_message":"Recover field raycast and unify clump callback contracts","measures":{"fuzzy_match_percent":34.829746,"total_code":4387560,"matched_code":1528176,"matched_code_percent":34.829746,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7762,"matched_functions_percent":59.242863,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T22:39:45Z","commit_sha":"876687ce230d22801bc5da06c5bea9dc6f50615f","commit_message":"Define task forwarding and enemy bitmap boundary behavior","measures":{"fuzzy_match_percent":34.816982,"total_code":4387560,"matched_code":1527616,"matched_code_percent":34.816982,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7761,"matched_functions_percent":59.23523,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T22:06:36Z","commit_sha":"865a99a0ccc704516e2c6ad7e0edb56b5eafa051","commit_message":"Unify ending-staff resource accessor pointer contracts","measures":{"fuzzy_match_percent":34.816982,"total_code":4387560,"matched_code":1527616,"matched_code_percent":34.816982,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7761,"matched_functions_percent":59.23523,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T21:36:00Z","commit_sha":"9e6d2a8a3de12f9747a7a7a948982ea72e2e6747","commit_message":"Restore explicit ending-resource ownership release","measures":{"fuzzy_match_percent":34.816982,"total_code":4387560,"matched_code":1527616,"matched_code_percent":34.816982,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7761,"matched_functions_percent":59.23523,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T21:16:06Z","commit_sha":"88c28a3f56fd680c24b19e315dd8ead0318ed9c6","commit_message":"Simplify triangle normal candidate and verify caller boundaries","measures":{"fuzzy_match_percent":34.816982,"total_code":4387560,"matched_code":1527616,"matched_code_percent":34.816982,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7761,"matched_functions_percent":59.23523,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T20:49:08Z","commit_sha":"03a6003c3fb28dd89c14bcde4d765de85ed19ec7","commit_message":"Define archived label wrapping and verify compact consumers","measures":{"fuzzy_match_percent":34.816982,"total_code":4387560,"matched_code":1527616,"matched_code_percent":34.816982,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7761,"matched_functions_percent":59.23523,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T19:44:46Z","commit_sha":"a700674e23df93d51248e121fea09a58257a30fd","commit_message":"Refine shuffle initializer floor and verify order preconditions","measures":{"fuzzy_match_percent":34.816982,"total_code":4387560,"matched_code":1527616,"matched_code_percent":34.816982,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7761,"matched_functions_percent":59.23523,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T19:17:08Z","commit_sha":"75fa8c0d2ac6127c45d1683d2ea71470c0fbcf35","commit_message":"Recover sound start routine with explicit argument forwarding","measures":{"fuzzy_match_percent":34.816982,"total_code":4387560,"matched_code":1527616,"matched_code_percent":34.816982,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7761,"matched_functions_percent":59.23523,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T18:50:00Z","commit_sha":"da7fc37265ada249d0cff4a9742e25d71eb8d5bb","commit_message":"Recover exact threshold selector and drawing callback","measures":{"fuzzy_match_percent":34.80422,"total_code":4387560,"matched_code":1527056,"matched_code_percent":34.80422,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7760,"matched_functions_percent":59.2276,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T18:22:19Z","commit_sha":"ac36dbcbb4d14d41580e9b12fcdeb072b6ba9af0","commit_message":"Unify font contracts and archive defined battle candidates","measures":{"fuzzy_match_percent":34.786716,"total_code":4387560,"matched_code":1526288,"matched_code_percent":34.786716,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7758,"matched_functions_percent":59.212334,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T16:44:16Z","commit_sha":"4a9d4b3e50a06ec71bd0bf21998bd72d6ef6e237","commit_message":"Refine tile opacity floor and calendar fallback evidence","measures":{"fuzzy_match_percent":34.786716,"total_code":4387560,"matched_code":1526288,"matched_code_percent":34.786716,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7758,"matched_functions_percent":59.212334,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T16:24:19Z","commit_sha":"91ed3d52cc98272846409d81835fc76165aa9580","commit_message":"Remove undefined combination loop read and refine recovery evidence","measures":{"fuzzy_match_percent":34.786716,"total_code":4387560,"matched_code":1526288,"matched_code_percent":34.786716,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7758,"matched_functions_percent":59.212334,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T15:59:06Z","commit_sha":"592d946f619e819307a6981ef3cfbcfecad11162","commit_message":"Recover exact shop rendering with coherent byte drawing contracts","measures":{"fuzzy_match_percent":34.786716,"total_code":4387560,"matched_code":1526288,"matched_code_percent":34.786716,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7758,"matched_functions_percent":59.212334,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T15:04:44Z","commit_sha":"8911b9eb47c978a4ab62ec52082afdd97996deac","commit_message":"Recover exact packed status maintenance and refine bank evidence","measures":{"fuzzy_match_percent":34.77614,"total_code":4387560,"matched_code":1525824,"matched_code_percent":34.77614,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7757,"matched_functions_percent":59.2047,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T14:24:05Z","commit_sha":"1d53c163fcaf4405ff5b0f119768a95f9889fd4a","commit_message":"Recover exact status-level selection and repair scalar contracts","measures":{"fuzzy_match_percent":34.764107,"total_code":4387560,"matched_code":1525296,"matched_code_percent":34.764107,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7756,"matched_functions_percent":59.197067,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T13:19:05Z","commit_sha":"e90e46133831cff187808de0e2384fdfd1d60eb9","commit_message":"Correct calendar getter contracts and refine draw recovery evidence","measures":{"fuzzy_match_percent":34.752438,"total_code":4387560,"matched_code":1524784,"matched_code_percent":34.752438,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7755,"matched_functions_percent":59.189438,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T12:11:46Z","commit_sha":"3fb2e1a5bdfa837673ff6baa8c12bc73dc9a07b9","commit_message":"Recover exact track dispatch and compatible callback contracts","measures":{"fuzzy_match_percent":34.752438,"total_code":4387560,"matched_code":1524784,"matched_code_percent":34.752438,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7755,"matched_functions_percent":59.189438,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T11:34:16Z","commit_sha":"bf2379f2747e1a5c76a6b13e76f84b2dc98f082c","commit_message":"Recover exact combination inventory finalization","measures":{"fuzzy_match_percent":34.742954,"total_code":4387560,"matched_code":1524368,"matched_code_percent":34.742954,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7754,"matched_functions_percent":59.181805,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T10:39:49Z","commit_sha":"0c0f844b915bb654ebe19da747c2f6ab3a198bfc","commit_message":"Recover archive path normalization and improve nearest selection floor","measures":{"fuzzy_match_percent":34.734932,"total_code":4387560,"matched_code":1524016,"matched_code_percent":34.734932,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7753,"matched_functions_percent":59.17417,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T09:47:13Z","commit_sha":"585e1d803cafb00ca0baaa43fc822813cbd79e59","commit_message":"Recover window creation and correct constructor contracts","measures":{"fuzzy_match_percent":34.72691,"total_code":4387560,"matched_code":1523664,"matched_code_percent":34.72691,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7752,"matched_functions_percent":59.16654,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T08:25:53Z","commit_sha":"a8e557f0db76d2e1dac63defbfa930ae182b6d75","commit_message":"Restore sampled-color callback return contract","measures":{"fuzzy_match_percent":34.716698,"total_code":4387560,"matched_code":1523216,"matched_code_percent":34.716698,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7751,"matched_functions_percent":59.15891,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T07:31:59Z","commit_sha":"4da94a866e4184cfef97b5194f64f233205f1c87","commit_message":"Recover exact message line-group trimming and release ownership","measures":{"fuzzy_match_percent":34.716698,"total_code":4387560,"matched_code":1523216,"matched_code_percent":34.716698,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7751,"matched_functions_percent":59.15891,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T07:10:32Z","commit_sha":"bfeb9ac634fc65c13610e52899051972c171a3e8","commit_message":"Refresh audited ASM generator input after literal relocation support","measures":{"fuzzy_match_percent":34.70904,"total_code":4387560,"matched_code":1522880,"matched_code_percent":34.70904,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7750,"matched_functions_percent":59.151276,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T05:39:23Z","commit_sha":"7dd9945c12f96eb0b61a02f792410bb2d8235caa","commit_message":"Match checked reallocation and texture packet construction","measures":{"fuzzy_match_percent":34.67622,"total_code":4387560,"matched_code":1521440,"matched_code_percent":34.67622,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7748,"matched_functions_percent":59.13601,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T05:01:46Z","commit_sha":"06dc3758e1109b3dbdd107144c301b500563c698","commit_message":"Match final font command parser","measures":{"fuzzy_match_percent":34.64705,"total_code":4387560,"matched_code":1520160,"matched_code_percent":34.64705,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7746,"matched_functions_percent":59.120747,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T04:39:58Z","commit_sha":"1070f7290dab4065cf7ece000f8da6a424a804d6","commit_message":"Match font pool allocation and render traversal","measures":{"fuzzy_match_percent":34.61933,"total_code":4387560,"matched_code":1518944,"matched_code_percent":34.61933,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7745,"matched_functions_percent":59.113113,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T03:59:36Z","commit_sha":"405c7eb50494d9283d61b66cf59ee89a201a1001","commit_message":"Match filtered record selection and rotated quad drawing","measures":{"fuzzy_match_percent":34.580677,"total_code":4387560,"matched_code":1517248,"matched_code_percent":34.580677,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7743,"matched_functions_percent":59.097847,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T03:32:35Z","commit_sha":"b26c588cfb58391e036511273ced1d4326ecd7fd","commit_message":"Match weighted combination selection and packed battle modifiers","measures":{"fuzzy_match_percent":34.544212,"total_code":4387560,"matched_code":1515648,"matched_code_percent":34.544212,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7741,"matched_functions_percent":59.082584,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T02:48:29Z","commit_sha":"302f1114ba04d8fbd2035b8fa813e0fe39324057","commit_message":"Match community flag rebuilding and indexed font insertion","measures":{"fuzzy_match_percent":34.509205,"total_code":4387560,"matched_code":1514112,"matched_code_percent":34.509205,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7739,"matched_functions_percent":59.067318,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T02:06:57Z","commit_sha":"ad5ffd9f9ea4a3eb093ffce4c34cef5b3563c313","commit_message":"Recover list sorting comparator and preserve digit floor","measures":{"fuzzy_match_percent":34.484043,"total_code":4387560,"matched_code":1513008,"matched_code_percent":34.484043,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7737,"matched_functions_percent":59.05205,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T01:33:27Z","commit_sha":"95b0528a06fb03a7970676aacb729df6a9211497","commit_message":"Recover field resource stream loader","measures":{"fuzzy_match_percent":34.469456,"total_code":4387560,"matched_code":1512368,"matched_code_percent":34.469456,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7736,"matched_functions_percent":59.044422,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T00:43:28Z","commit_sha":"14f31ff57cb11a2cfb3f91fa814d84b8ea232551","commit_message":"Generate retail fallback assembly instead of tracking it","measures":{"fuzzy_match_percent":34.446846,"total_code":4387560,"matched_code":1511376,"matched_code_percent":34.446846,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7735,"matched_functions_percent":59.03679,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-07T00:25:52Z","commit_sha":"f991105185b2a189e5a4e5f0a1735c420db4bb71","commit_message":"Add audited clean-checkout assembly regeneration","measures":{"fuzzy_match_percent":34.446846,"total_code":4387560,"matched_code":1511376,"matched_code_percent":34.446846,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7735,"matched_functions_percent":59.03679,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T23:57:29Z","commit_sha":"59d190c7c0ae2e838df968ca7839b0bcc87b8a77","commit_message":"Promote exact persona digit renderer","measures":{"fuzzy_match_percent":34.446846,"total_code":4387560,"matched_code":1511376,"matched_code_percent":34.446846,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7735,"matched_functions_percent":59.03679,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T23:17:32Z","commit_sha":"2f2e4444c9b636c525c0d9d683a32dc32076d34f","commit_message":"Resolve archive addresses without consuming hexadecimal lane prefixes","measures":{"fuzzy_match_percent":34.43773,"total_code":4387560,"matched_code":1510976,"matched_code_percent":34.43773,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7734,"matched_functions_percent":59.029156,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T22:37:28Z","commit_sha":"09cd1ddd217e460a3c1180152127538e7e543578","commit_message":"Recover decoration counter contract and typed mesh evidence","measures":{"fuzzy_match_percent":34.43773,"total_code":4387560,"matched_code":1510976,"matched_code_percent":34.43773,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7734,"matched_functions_percent":59.029156,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T21:40:40Z","commit_sha":"a0d8e82772db7f919d37ccc50a454fadd5081acf","commit_message":"Match translated line rectangle renderer","measures":{"fuzzy_match_percent":34.43773,"total_code":4387560,"matched_code":1510976,"matched_code_percent":34.43773,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7734,"matched_functions_percent":59.029156,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T21:21:40Z","commit_sha":"d3686efec5ba1f9d678d2f1cb844f6c5da0306ee","commit_message":"Archive verified rectangle and projection recovery evidence","measures":{"fuzzy_match_percent":34.42679,"total_code":4387560,"matched_code":1510496,"matched_code_percent":34.42679,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7733,"matched_functions_percent":59.021523,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T20:28:57Z","commit_sha":"b8dbf7666eb973ddcd944cbc7283fac277f8c142","commit_message":"Record bounded text selector and constructor floor probes","measures":{"fuzzy_match_percent":34.42679,"total_code":4387560,"matched_code":1510496,"matched_code_percent":34.42679,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7733,"matched_functions_percent":59.021523,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T20:24:55Z","commit_sha":"d87fb7862d319482b395b02498c404f413d6dbe6","commit_message":"Match line setup renderer with explicit arithmetic lifetimes","measures":{"fuzzy_match_percent":34.42679,"total_code":4387560,"matched_code":1510496,"matched_code_percent":34.42679,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7733,"matched_functions_percent":59.021523,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T20:05:23Z","commit_sha":"ab7cf4611035c5cc7d69492ff93021615106b1dc","commit_message":"Synchronize linked badge with renderer progress","measures":{"fuzzy_match_percent":34.3885,"total_code":4387560,"matched_code":1508816,"matched_code_percent":34.3885,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7732,"matched_functions_percent":59.01389,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T18:28:29Z","commit_sha":"fcbaf732f0d8711d19322842cfc1befca1847fec","commit_message":"Match packed-color propagation with bounded VU bridges","measures":{"fuzzy_match_percent":34.37829,"total_code":4387560,"matched_code":1508368,"matched_code_percent":34.37829,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7731,"matched_functions_percent":59.00626,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T17:10:26Z","commit_sha":"a454a0c7ac2166746421f3d67445f4e9737cb2a6","commit_message":"Match game-data scaling with explicit short arithmetic stages","measures":{"fuzzy_match_percent":34.371723,"total_code":4387560,"matched_code":1508080,"matched_code_percent":34.371723,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7730,"matched_functions_percent":58.998627,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T15:45:59Z","commit_sha":"27e5be0c3452330afdfeed5bb9ddcba74e60bc17","commit_message":"Match model sound cache and canonicalize lookup consumers","measures":{"fuzzy_match_percent":34.362606,"total_code":4387560,"matched_code":1507680,"matched_code_percent":34.362606,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7729,"matched_functions_percent":58.990993,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T14:19:15Z","commit_sha":"2ae2ba9d7d8b105097b8a3294a8fc88cf3e8845b","commit_message":"Preserve renderer allocation gains and rejected floor evidence","measures":{"fuzzy_match_percent":34.35276,"total_code":4387560,"matched_code":1507248,"matched_code_percent":34.35276,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7728,"matched_functions_percent":58.98336,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T13:29:48Z","commit_sha":"5276175a6c47ecb646c6ba430f186c7159087dfd","commit_message":"Match layer animation and restore sound dispatcher return contract","measures":{"fuzzy_match_percent":34.35276,"total_code":4387560,"matched_code":1507248,"matched_code_percent":34.35276,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7728,"matched_functions_percent":58.98336,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T12:11:10Z","commit_sha":"67e43489f45b0dd4ca87b9d4f2f47330b277776e","commit_message":"Match recursive model updates with callback-safe snapshots","measures":{"fuzzy_match_percent":34.269615,"total_code":4387560,"matched_code":1503600,"matched_code_percent":34.269615,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7726,"matched_functions_percent":58.968098,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T11:03:19Z","commit_sha":"939812eac8ab116fa800e32a205dcd1ecb3eb0b1","commit_message":"Match message initialization through text-pointer binding","measures":{"fuzzy_match_percent":34.24482,"total_code":4387560,"matched_code":1502512,"matched_code_percent":34.24482,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7725,"matched_functions_percent":58.960464,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T10:27:13Z","commit_sha":"ce83291657278f79a8977e2d3e4e94f5121db08b","commit_message":"Match model sound callback through inline copy lifetimes","measures":{"fuzzy_match_percent":34.227314,"total_code":4387560,"matched_code":1501744,"matched_code_percent":34.227314,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7724,"matched_functions_percent":58.95283,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T09:56:27Z","commit_sha":"8678870b50e4b5f8e6b29159994cfe0ea230c74f","commit_message":"Restore record extraction pointer return contracts","measures":{"fuzzy_match_percent":34.20799,"total_code":4387560,"matched_code":1500896,"matched_code_percent":34.20799,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7723,"matched_functions_percent":58.945198,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T08:37:35Z","commit_sha":"902affdfb126da79f38ba8320d0e1958f387fb97","commit_message":"Record floor replays and fix archived wind alpha shift","measures":{"fuzzy_match_percent":34.20799,"total_code":4387560,"matched_code":1500896,"matched_code_percent":34.20799,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7723,"matched_functions_percent":58.945198,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T06:53:19Z","commit_sha":"bc9d95558b90c5458fc6a7b9572a9191d40a0cef","commit_message":"Match ratio calculation with paired group statistics","measures":{"fuzzy_match_percent":34.20799,"total_code":4387560,"matched_code":1500896,"matched_code_percent":34.20799,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7723,"matched_functions_percent":58.945198,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T05:40:15Z","commit_sha":"f8718755f6e56c669cfe92bf734d6e7c2ac619c5","commit_message":"Match sound initialization with the recovered return contract","measures":{"fuzzy_match_percent":34.191578,"total_code":4387560,"matched_code":1500176,"matched_code_percent":34.191578,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7722,"matched_functions_percent":58.93757,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T04:03:12Z","commit_sha":"e11e9c37fd849cb3d04381fc247eb35d083a028f","commit_message":"Synchronize published progress after font recovery","measures":{"fuzzy_match_percent":34.181366,"total_code":4387560,"matched_code":1499728,"matched_code_percent":34.181366,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7721,"matched_functions_percent":58.929935,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T02:45:12Z","commit_sha":"0a752dd9c3b3ecb57431ab0d825a5e96dfe0da8e","commit_message":"Recover canonical path-normalization floor and archive rejected levers","measures":{"fuzzy_match_percent":34.16824,"total_code":4387560,"matched_code":1499152,"matched_code_percent":34.16824,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7720,"matched_functions_percent":58.922302,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T01:39:57Z","commit_sha":"6ef2e0c8ef294919919d25fb41f7c3ff5f75906e","commit_message":"Preserve re-certified low-floor candidates and bounded probe evidence","measures":{"fuzzy_match_percent":34.16824,"total_code":4387560,"matched_code":1499152,"matched_code_percent":34.16824,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7720,"matched_functions_percent":58.922302,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-06T00:07:40Z","commit_sha":"b790d82f29ec7441a9306c37bf2a085b0b762b82","commit_message":"Match both blur allocator constant-selection floors","measures":{"fuzzy_match_percent":34.16824,"total_code":4387560,"matched_code":1499152,"matched_code_percent":34.16824,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7720,"matched_functions_percent":58.922302,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T23:21:07Z","commit_sha":"14e0a130ebf10c39b25e3d22757051a7d6e6b9ba","commit_message":"Restore AI skill callback results and preserve measured predicate floor","measures":{"fuzzy_match_percent":34.150734,"total_code":4387560,"matched_code":1498384,"matched_code_percent":34.150734,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7718,"matched_functions_percent":58.907036,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T22:08:42Z","commit_sha":"e8637e0c25b37e22e0774bede85fe2e522a2ce33","commit_message":"Recover AI command predicate and fix helper-bearing probes","measures":{"fuzzy_match_percent":34.150734,"total_code":4387560,"matched_code":1498384,"matched_code_percent":34.150734,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7718,"matched_functions_percent":58.907036,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T20:55:22Z","commit_sha":"ae588e25a46f7bcf170b466372cdf5267bb53e56","commit_message":"Record model sound and material animation recovery evidence","measures":{"fuzzy_match_percent":34.139065,"total_code":4387560,"matched_code":1497872,"matched_code_percent":34.139065,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7717,"matched_functions_percent":58.899406,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T20:32:10Z","commit_sha":"cbd1d3b8e3e058f1093f3572ef6728f2cbf3a72c","commit_message":"Preserve model setup and runtime color callback arguments","measures":{"fuzzy_match_percent":34.139065,"total_code":4387560,"matched_code":1497872,"matched_code_percent":34.139065,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7717,"matched_functions_percent":58.899406,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T19:52:35Z","commit_sha":"e20824d35e225abf67b551d56ccaeeb8431e17d7","commit_message":"Recover model cloning and canonical hierarchy ABI","measures":{"fuzzy_match_percent":34.139065,"total_code":4387560,"matched_code":1497872,"matched_code_percent":34.139065,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7717,"matched_functions_percent":58.899406,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T18:41:41Z","commit_sha":"19390dc7ceb5bf9ec4168e0fd2f09083db809361","commit_message":"Recover animation stepping and dispatch contracts","measures":{"fuzzy_match_percent":34.120102,"total_code":4387560,"matched_code":1497040,"matched_code_percent":34.120102,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7716,"matched_functions_percent":58.891773,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T17:34:23Z","commit_sha":"33d6a5c7b4be718a5f28ada9f02d3d3c2ac1c708","commit_message":"Recover frame lookup and matrix copy helper boundaries","measures":{"fuzzy_match_percent":34.085823,"total_code":4387560,"matched_code":1495536,"matched_code_percent":34.085823,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7714,"matched_functions_percent":58.876507,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T17:00:13Z","commit_sha":"16aab4ca68a15633ee2fe3fc6f21010c1d8d7a6b","commit_message":"Recover model attachment from IDA pointer contracts","measures":{"fuzzy_match_percent":34.06832,"total_code":4387560,"matched_code":1494768,"matched_code_percent":34.06832,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7712,"matched_functions_percent":58.861244,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T16:04:12Z","commit_sha":"98d1c1b2f01b0b609a2c4b818a00e85b7a7fe0e5","commit_message":"Retire stale battle floor and record IDA replays","measures":{"fuzzy_match_percent":34.0603,"total_code":4387560,"matched_code":1494416,"matched_code_percent":34.0603,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7711,"matched_functions_percent":58.85361,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T15:37:14Z","commit_sha":"4390849b7b73931e46a82da6061e0cda6594719e","commit_message":"Recover state and interpolation from IDA evidence","measures":{"fuzzy_match_percent":34.0603,"total_code":4387560,"matched_code":1494416,"matched_code_percent":34.0603,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7711,"matched_functions_percent":58.85361,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T14:28:38Z","commit_sha":"ce10c3cc614d39a2a3d7467954860ba70c073c17","commit_message":"Retain honest compact IDA recovery evidence","measures":{"fuzzy_match_percent":34.044983,"total_code":4387560,"matched_code":1493744,"matched_code_percent":34.044983,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7709,"matched_functions_percent":58.838345,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T13:58:00Z","commit_sha":"41aded065ca0165a97398a35c5f5ca92138cca51","commit_message":"Recover quaternion primitive from IDA evidence","measures":{"fuzzy_match_percent":34.044983,"total_code":4387560,"matched_code":1493744,"matched_code_percent":34.044983,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7709,"matched_functions_percent":58.838345,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T12:59:11Z","commit_sha":"3907d92d4044b533f7158a9274f3d3340d94116f","commit_message":"Restore battle cleanup archive optimization scope","measures":{"fuzzy_match_percent":34.0355,"total_code":4387560,"matched_code":1493328,"matched_code_percent":34.0355,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7708,"matched_functions_percent":58.83071,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T12:29:26Z","commit_sha":"11de0dc54474cbf639d9f47324af453d447def4d","commit_message":"Recover field selection ABI from IDA evidence","measures":{"fuzzy_match_percent":34.0355,"total_code":4387560,"matched_code":1493328,"matched_code_percent":34.0355,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7708,"matched_functions_percent":58.83071,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T12:07:02Z","commit_sha":"88ac3f997f34729b5552166cdc6af4f610801849","commit_message":"Record IDA-backed cut-in resource floor","measures":{"fuzzy_match_percent":34.0355,"total_code":4387560,"matched_code":1493328,"matched_code_percent":34.0355,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7708,"matched_functions_percent":58.83071,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T11:22:03Z","commit_sha":"a412c44d23dbf45d168ac936b001d527a2218e7d","commit_message":"Recover number and battle-list floors from IDA bodies","measures":{"fuzzy_match_percent":34.0355,"total_code":4387560,"matched_code":1493328,"matched_code_percent":34.0355,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7708,"matched_functions_percent":58.83071,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T10:31:51Z","commit_sha":"0a3b00ab469e3993bca70b1f131cc364b6924124","commit_message":"Correct date-state reconstruction using IDA evidence","measures":{"fuzzy_match_percent":34.0355,"total_code":4387560,"matched_code":1493328,"matched_code_percent":34.0355,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7708,"matched_functions_percent":58.83071,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T10:08:33Z","commit_sha":"c3c2d0020dcec3aca16282e1858034fb99e84088","commit_message":"Match scene selection and date callback with faithful typed loops","measures":{"fuzzy_match_percent":34.0355,"total_code":4387560,"matched_code":1493328,"matched_code_percent":34.0355,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7708,"matched_functions_percent":58.83071,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T09:38:06Z","commit_sha":"360d4083fcea1b7099ee7887d6bacc37b2c53071","commit_message":"Recover change-list callback and preserve field task handles","measures":{"fuzzy_match_percent":34.01435,"total_code":4387560,"matched_code":1492400,"matched_code_percent":34.01435,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7706,"matched_functions_percent":58.81545,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T08:39:01Z","commit_sha":"cacbf85bdf50b6d87807b59eb3835502161212c3","commit_message":"Fix frame ID getter ABI and preserve honest probe contracts","measures":{"fuzzy_match_percent":34.00414,"total_code":4387560,"matched_code":1491952,"matched_code_percent":34.00414,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7705,"matched_functions_percent":58.807816,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T07:53:07Z","commit_sha":"c6ab596e7d04a5741fdf9e9cfdb993d118733cae","commit_message":"Match GCC unsigned double conversion with licensed source","measures":{"fuzzy_match_percent":34.00414,"total_code":4387560,"matched_code":1491952,"matched_code_percent":34.00414,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7705,"matched_functions_percent":58.807816,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T07:39:03Z","commit_sha":"ab84e5cb4da850255d312efa7f7c8a07cf0bc051","commit_message":"fix: correct runtime ownership and probe semantics","measures":{"fuzzy_match_percent":34.00414,"total_code":4387560,"matched_code":1491952,"matched_code_percent":34.00414,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7705,"matched_functions_percent":58.807816,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T06:44:45Z","commit_sha":"5adf5b6256e216ab61568985678730962ce795cd","commit_message":"fix: forward community IDs through flag helpers","measures":{"fuzzy_match_percent":34.00414,"total_code":4387560,"matched_code":1491952,"matched_code_percent":34.00414,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7705,"matched_functions_percent":58.807816,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T05:49:55Z","commit_sha":"69de83074918430bc8bc2ff1f65213aca6765225","commit_message":"Recover packed selection bitfields and preserve honest wind reconstruction","measures":{"fuzzy_match_percent":34.00414,"total_code":4387560,"matched_code":1491952,"matched_code_percent":34.00414,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7705,"matched_functions_percent":58.807816,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T05:02:32Z","commit_sha":"84be814b09bf1c7e42ae9c248bfbea91b5022369","commit_message":"Harden decomp lint integrity checks and make source heuristics advisory","measures":{"fuzzy_match_percent":33.99575,"total_code":4387560,"matched_code":1491584,"matched_code_percent":33.99575,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7704,"matched_functions_percent":58.800182,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T04:13:16Z","commit_sha":"e71aec170ed5b37075a2c5acc5defc4f5179b9d5","commit_message":"Match battle classifier and weighted action selector","measures":{"fuzzy_match_percent":33.988457,"total_code":4387560,"matched_code":1491264,"matched_code_percent":33.988457,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7703,"matched_functions_percent":58.79255,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T03:25:24Z","commit_sha":"76340d53797c7da574be015f3d4c17738e49bcbc","commit_message":"Repair scheduler call ABI and define elapsed timer wrapping","measures":{"fuzzy_match_percent":33.974236,"total_code":4387560,"matched_code":1490640,"matched_code_percent":33.974236,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7701,"matched_functions_percent":58.777287,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T03:09:36Z","commit_sha":"a3d6f1b56009f89070bfd8c93e925366276c90f4","commit_message":"Fix font constructor return ABI and refresh message floor evidence","measures":{"fuzzy_match_percent":33.974236,"total_code":4387560,"matched_code":1490640,"matched_code_percent":33.974236,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7701,"matched_functions_percent":58.777287,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T02:24:51Z","commit_sha":"fdad43df408adbc7a22151376be26aa6e6262619","commit_message":"Match message constructor and unify its caller prototypes","measures":{"fuzzy_match_percent":33.974236,"total_code":4387560,"matched_code":1490640,"matched_code_percent":33.974236,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7701,"matched_functions_percent":58.777287,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T02:10:45Z","commit_sha":"834cc23c4aac9485b36b773389b43686bf88bce1","commit_message":"Record four-register message pruning reconstruction","measures":{"fuzzy_match_percent":33.964027,"total_code":4387560,"matched_code":1490192,"matched_code_percent":33.964027,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7700,"matched_functions_percent":58.769653,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T01:49:10Z","commit_sha":"ef4c91fbf051b2121b14905e4c1fd7f176f7a4f0","commit_message":"Match message relocation wrapper with private decoder helper","measures":{"fuzzy_match_percent":33.964027,"total_code":4387560,"matched_code":1490192,"matched_code_percent":33.964027,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7700,"matched_functions_percent":58.769653,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T01:27:38Z","commit_sha":"04b838d8bfaa369e83a603ada028180c6e03b54d","commit_message":"Fix archive marker lookahead and correct threshold buffer","measures":{"fuzzy_match_percent":33.962204,"total_code":4387560,"matched_code":1490112,"matched_code_percent":33.962204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7699,"matched_functions_percent":58.76202,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T00:49:44Z","commit_sha":"1617850ab8537a97d5499a25f21ed68b4b639fdf","commit_message":"Reject event cleanup false match with omitted call arguments","measures":{"fuzzy_match_percent":33.962204,"total_code":4387560,"matched_code":1490112,"matched_code_percent":33.962204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7699,"matched_functions_percent":58.76202,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T00:38:21Z","commit_sha":"b5003b7170e5ee2cbb8ba2e0ee85526ff77656b9","commit_message":"Match ring allocation and message slot installation with typed addresses","measures":{"fuzzy_match_percent":33.962204,"total_code":4387560,"matched_code":1490112,"matched_code_percent":33.962204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7699,"matched_functions_percent":58.76202,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T00:12:48Z","commit_sha":"f2581b6936fed08bfbe46c729701e8af5b6c3b44","commit_message":"Match category lookup by separating equivalent index masks","measures":{"fuzzy_match_percent":33.946888,"total_code":4387560,"matched_code":1489440,"matched_code_percent":33.946888,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7697,"matched_functions_percent":58.746758,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-05T00:02:57Z","commit_sha":"97613f949119aafdcf3a78f5a589687ce04dfb5c","commit_message":"Match calendar record query with shared null selection join","measures":{"fuzzy_match_percent":33.941418,"total_code":4387560,"matched_code":1489200,"matched_code_percent":33.941418,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7696,"matched_functions_percent":58.739124,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-04T23:51:37Z","commit_sha":"036e90818a825d0105f6962b8290eb9b5cb6b04b","commit_message":"Match countdown update and resource path query without ABI changes","measures":{"fuzzy_match_percent":33.933758,"total_code":4387560,"matched_code":1488864,"matched_code_percent":33.933758,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7695,"matched_functions_percent":58.73149,"complete_code":1031064,"complete_code_percent":23.499712,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-04T08:19:38Z","commit_sha":"8752ba7d955c652ccbf19d4b4297bc4fab0ae194","commit_message":"solo + lanes: waves 40-44, +12 (first-party 7670 MATCH)\n\nSolo closures (9): func_00366670 and func_003679c0 (code1_0036.c),\nfunc_002cacd0 (y_fclShopDraw.c), func_00159a60 (code1_0015.c),\nfunc_00165380 (k_fldUnit.c), func_0016e590 (code1_0016.c),\nfunc_0019db40 and func_001951f0 (code1_0019.c), func_004adb50\n(code1_004a.c), func_00485c80 (code1_0048.c).\nLane closures (3): func_004601c0 (code1_0046.c, W41c46),\nfunc_002099c0 (code1_0020.c, W44c20).\n\nLevers recorded in docs/matching.md: u8-by-value struct param\nmaterialisation, `*(s32 *)&local` readback after a VU0 asm island,\nrematerialised base+i*stride slot address under opt_common_subs off,\nallocator-table hoist under opt_propagation off, `> N-1` for sltiu $at.\n\nLane residue reverted: W44c1a left func_001a06d0 and W44c20 left\nfunc_0020f730 as live MISMATCH bodies after the lanes died; both regions\nrestored to bare INCLUDE_ASM with orphan externs removed. Archived\nnear-miss probes under docs/probe_archive/ (W42c14, W42c1a, W42c20,\nW44c14). New data symbols in config/symbol_data_addrs.txt with retail\nlow16 evidence; symbols_recovered.txt regenerated.\n\nverify: 7670 MATCH, 0 MISMATCH; lint 0; pragma audit OK; gate 22\npre-existing failures; both link SHA1s unchanged.","measures":{"fuzzy_match_percent":33.700005,"total_code":4387560,"matched_code":1478608,"matched_code_percent":33.700005,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7670,"matched_functions_percent":58.54068,"complete_code":1028648,"complete_code_percent":23.444649,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-04T05:09:18Z","commit_sha":"2e02eda8eac42b08d06fbb388a5f29c0f8b07cee","commit_message":"lanes: wave 39 + solo, +3 (func_0015a7c0 code1_0015.c, func_00367b80 code1_0036.c, func_002b2290 y_smap.c)\n\n- func_0015a7c0 (W39c15d lane): threshold/copy helper, nd 0.\n- func_00367b80 (solo): PairBits font-draw wrapper; opt_common_subs off keeps\n  the raw alpha argument in $s1 and re-masks at each of its two uses.\n- func_002b2290 (solo, nd 409 -> 0): three levers - `p = &q->b[j]` struct\n  member address so the s16 sign-extension is redone at the loop head;\n  opt_loop_invariants on for the loop-3 constant hoist and loop-1 addu\n  order; `y = t; z = -99.0f + y;` copy blocks c + a*b fusion into\n  adda.s/madd.s and the fresh name gives the constant-first add.s.\n- W39 probe archives for 003742b0, 00377eb0, 00156800, 001b33c0,\n  001b7520, 0011c3e0 (measured, no live non-MATCH bodies).\n- Wave 40 lanes (code1_0014/0021/0026, y_fclCombine) died at spawn on the\n  provider limit; no edits.\n\nverify: 7658 MATCH, 0 MISMATCH; lint 0; pragma audit OK; both SHA1s OK.","measures":{"fuzzy_match_percent":33.50199,"total_code":4387560,"matched_code":1469920,"matched_code_percent":33.50199,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7658,"matched_functions_percent":58.449093,"complete_code":1028648,"complete_code_percent":23.444649,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-04T03:35:05Z","commit_sha":"e88d391d0899ca03abcf741d419683f455f8754d","commit_message":"lanes: wave 38, +2 (func_004623a0 code1_0046.c, func_003130e0 fclCombineMisc.c)\n\nWave 38 ran six never-attempted-function lanes; the provider rate-limited\nand then dropped DNS mid-wave, so the wave banks what was clean: two\nclosures, prototype corrections in code1_0019.c / k_fldUnit.c that keep every\nexisting MATCH, two evidence-backed float gp symbols (fGpffff81f0/81b0; the\nlane's 0x7612B0 for 81b0 was off by 0x10 and is corrected to 0x7612A0), and\nfive measured probe archives (00198dd0 nd132, 00205e00 nd2 - a u8\ntwo-constant join retail holds as daddiu $s0 without andi, which no narrow\nunsigned spelling reaches, 00205950 nd146, 004ad030 nd320, 00163990 nd173).\nFive uncompiled m2c dumps a lane filed as archives were removed.\n\nLANE_RULES.md hard rule 0: lanes never spawn subagents (user directive; the\nsession cap is 4 concurrent agents). Total MATCH 7655, first-party 6025/6861\n(87.8%), TU count 172, both SHA1s OK, gate tests at the 22 baseline.","measures":{"fuzzy_match_percent":33.459328,"total_code":4387560,"matched_code":1468048,"matched_code_percent":33.459328,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7655,"matched_functions_percent":58.426193,"complete_code":1028648,"complete_code_percent":23.444649,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-04T01:07:39Z","commit_sha":"8a7c04e42c979c14cea66b1ae01f57c72cdedecd","commit_message":"verify: RenderWare is a vendor address span; RenderWare 3.5 PS2 SDK as reference\n\nThe block 0x0038F990-0x00417510 joins VENDOR_CODE_RANGES: it is RenderWare\nGraphics 3.7 (core, world, rp*/rt* plugins, sky2 driver), prebuilt by\nCriterion with b119 and linked between Atlus's last unit (ed_res.c ends at\n0x0038F950; 0x0038F990 already calls _rwerror/RwErrorSet) and the CRI span.\n291 of its functions are byte-exact from the RenderWare source, the module\nregistration table and every rwID constant sit inside it. First-party is\ntherefore 6023/6861 (87.8%) whatever promoted unit a block function still\nsits in; total MATCH 7653, TU count 172, both SHA1s OK.\n\n../rwsdk-v3.5-ps2 (binary SDK, sky2 headers + libraries with symbol names\nfor the driver/plugin functions the 3.7 source lacks) is recorded as a\nreference: its sky2 rwplcore.h uses exactly the alignment settings\ninclude/rw/ps2/ostypes.h reproduces (RWGLOBALSIZE now 16*1024 like it);\nits objects are a different version and do not fingerprint against retail\n(build/rw35_fid.json), so they name functions, never match them.","measures":{"fuzzy_match_percent":33.420307,"total_code":4387560,"matched_code":1466336,"matched_code_percent":33.420307,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7653,"matched_functions_percent":58.41093,"complete_code":1028648,"complete_code_percent":23.444649,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-04T00:54:54Z","commit_sha":"400129c5bbac035136d47acc418f403fbc54117b","commit_message":"RenderWare port: -O4,p -inline auto; 45 verbatim units, 291 functions; README and wiki\n\nThe block's build flags, pinned by measurement (config/version_flags.txt):\n`-O4` (at -O2 b119 inverts every plain `while`; from -O3 the verbatim\nsource is exact), `-inline auto` (inlined same-unit callees beside their\nout-of-line copies) and `-DRWBUILDNUMBER=55` (chunk headers carry 0x37).\nA whole-file compile of the 3.7.0.2 sources at those flags fingerprints\n360 byte-exact functions against the block (build/rw_fid.py; 130 at -O2,p).\n\nThe port is now tool-driven:\n- build/rw_fid.py: fingerprint every source function against the retail\n  windows, order-consistent per file (strictly increasing addresses).\n- build/rw_port.py <dir>/<file>.c --install: verbatim unit under\n  src/renderware/<dir>/, markers for the mapped functions, file statics as\n  retail-addressed externs (registered from the relocations), aliases for\n  callees not yet ported, markers stripped from anything that does not\n  verify. 44 generated units plus the hand-ported rwgrp.c.\n- build/rw_dedupe.py: identical-body ties (RegisterPluginStream /\n  GetPluginOffset / Close wrappers) are settled by the file statics: every\n  static resolves to one address from its unique-window functions, every\n  function referencing it must agree (re-pointed via retail immediates or\n  unmarked), every caller's retail jal must name the callee's window.\nResult: 45 units, 291 MATCH, no WRONG SYMBOL / WRONG CALLEE. The 269\nsuperseded entries were removed from code1_003b/c/d/e.c, their cw119\nsiblings and src/rw/rwcore_grouped.c (marker counts reconcile exactly,\nremaining parent matches unchanged; in-place extern prototypes keep the\ncallers' declaration state). \n\ntools/build.py: a unit carrying code no marker owns is ineligible rather\nthan a build error. tools/verify.py: src/renderware is third-party like\nsrc/rw (the block was never Atlus's code), so the first-party denominator\nis 7663 with 6409 MATCH (83.6%); total MATCH 7653 (+130). TU count 172,\nboth SHA1s OK. pragma_audit skips the verbatim vendor sources.\n\nREADME rewritten (how it works, the mixed retail build table, setup with\nboth compilers, rules, layout). Ten wiki pages under wiki/ ready to push\nto the GitHub wiki once its first page exists; CONTRIBUTING no longer\npoints at the missing ROADMAP.md; docs/compiler-floors.md records that the\nmovz floor was the wrong compiler.","measures":{"fuzzy_match_percent":33.420307,"total_code":4387560,"matched_code":1466336,"matched_code_percent":33.420307,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7653,"matched_functions_percent":58.41093,"complete_code":1028648,"complete_code_percent":23.444649,"complete_data":0,"complete_data_percent":100,"total_units":374,"complete_units":172}},{"timestamp":"2026-09-03T21:23:44Z","commit_sha":"2d7d252ff634216bfd1abc78f858c18d63b511ff","commit_message":"renderware: baerr.c, balist.c, batkbin.c ported (+6 net); -inline auto, RWBUILDNUMBER=55\n\nWave 37 (six RenderWare port lanes; the session crashed mid-wave and three\nof the six left partial units). Salvaged and finished:\n  src/renderware/plcore/baerr.c    _rwErrorOpen/_rwErrorClose/RwErrorSet/RwErrorGet\n  src/renderware/plcore/balist.c   the nine _rwSList* functions (incl. the two\n                                   that were in code1_003d_cw119.c and the one\n                                   in src/rw/rwplcore_grouped.c)\n  src/renderware/plcore/batkbin.c  all seven _rwPluginRegistry* stream helpers,\n                                   including InvokeRights (movz) and\n                                   WriteDataChunks (inlines GetSize)\n  src/renderware/plcore/rwgrp.c    + _rwChunkGroupClose\nAll verbatim; the only edits are `if (x) { do {...} while (x); }` for loops\nb119 would otherwise invert in a fresh unit (noted as /* P4 */).\n\nTwo build facts recovered from the residuals, now in config/version_flags.txt\nfor every b119 unit: retail was built with `-inline auto` (WriteDataChunks\ncarries GetSize inline while the out-of-line copy is also emitted) and\nRWBUILDNUMBER=55 (every chunk header call passes 0x37, the tree defaults to\n101). The 21 superseded entries were removed from code1_003d.c, code1_003e.c,\ntheir cw119 siblings and rwplcore_grouped.c (parent MATCH counts unchanged\napart from the moves). batkbin.c is link-eligible: TU count 171.\n\nThe three lanes that died left bamatrix/babinmtx/bavector placeholders or\nmid-edit corruption; dropped. build/LANE_RULES.md records the lessons (marker\ninside a doc comment = pragma invisible; the do/while spelling; confirm a\nmapping by disassembly first). 6532 MATCH (83.0%), 0 WRONG SYMBOL/CALLEE,\nboth SHA1s OK.","measures":{"fuzzy_match_percent":32.309166,"total_code":4387560,"matched_code":1417584,"matched_code_percent":32.309166,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7523,"matched_functions_percent":57.418716,"complete_code":1028456,"complete_code_percent":23.440271,"complete_data":0,"complete_data_percent":100,"total_units":334,"complete_units":171}},{"timestamp":"2026-09-03T20:19:46Z","commit_sha":"26aa1a02ae9d4ce108736ebefb94c1eebf33e81d","commit_message":"renderware: per-source-file units under src/renderware/; rwgrp.c is the first\n\nThe port keeps the RenderWare tree's layout: src/renderware/<dir>/<file>.c\nper source file, registered as a b119 speed unit. _rwChunkGroupOpen moves\nfrom code1_003e_cw119.c into src/renderware/plcore/rwgrp.c, which carries\nrwgrp.c's include list (a PS2 osintf.h shim added under include/rw/ps2),\nits RWCHUNKGROUPGLOBAL macro and its statics as retail-addressed externs.\nThe unit is link-eligible: TU count 170 (link floor raised), both SHA1s\nOK. verify: a marker row without a decodable address no longer breaks the\ncallee map. 6526 MATCH unchanged.","measures":{"fuzzy_match_percent":32.281086,"total_code":4387560,"matched_code":1416352,"matched_code_percent":32.281086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7518,"matched_functions_percent":57.380554,"complete_code":1028088,"complete_code_percent":23.431885,"complete_data":0,"complete_data_percent":100,"total_units":331,"complete_units":170}},{"timestamp":"2026-09-03T20:10:53Z","commit_sha":"8ee890296cc2e52cf19c6bd7c49dbc4e4dc345ff","commit_message":"RenderWare 3.7 source port: headers vendored, per-version flags, first verbatim function\n\nThe code1_0039..003e block is RenderWare Graphics 3.7 (core/plcore, core,\npipe/p2, world): func_003e46e0 is _rwChunkGroupOpen from rwgrp.c line for\nline (0x40412 = rwMEMHINTDUR_GLOBAL | rwID_CHUNKGROUPMODULE, sizeof\nRwChunkGroup 0x21, D_008872E0 + module.globalsOffset = RWPLUGINOFFSET on\nthe engine instance, D_008873F8[0] = RWSRCGLOBAL(memoryAlloc)); the retail\nELF carries the 3.7.0.x version word. The 3.7.0.2 source is checked out\nbeside the repo (../rwsrc-v3.7.0.2) as the reference tree.\n\nInfrastructure:\n- include/rw: the public headers (misc/inc), the internal plcore/core/\n  pipe-p2/world/driver-common/driver-null headers, a PlayStation 2\n  ostypes.h (long long RwInt64, 16-byte matrix/vector alignment,\n  RWGLOBALSIZE so RwEngineInstance is the static ourGlobals array at\n  0x008872E0) and libc shims for the <stdlib.h>-style includes.\n- config/version_flags.txt: extra compile flags per compiler version key;\n  the b119 units get -nosyspath and the include/rw paths, applied by\n  verify.unit_compile_flags in verify and build.\n- verify.py: functions ported under their library names are located by\n  their marker, so WRONG CALLEE checks calls to them; include/rw is\n  third-party for lint; pragma_audit skips the vendored headers (their\n  MSVC/ICL pragmas sit under _MSC_VER guards).\n- code1_003e_cw119.c: _rwChunkGroupOpen ported verbatim (RWFUNCTION /\n  RWASSERT / RWRETURN as written), byte-exact; chunkGroupModule and the\n  three rwgrp.c statics registered at their retail addresses.\n- build/rw_hints.json + build/rw_hints.py: rwID/memory-hint constants, gp\n  slots and jal targets per block function for source mapping.\n- build/LANE_RULES.md: RenderWare port section.\n\nFull verify 6526 MATCH (83.0%), 0 WRONG SYMBOL/CALLEE, TU count 169, both\nSHA1s OK.","measures":{"fuzzy_match_percent":32.281086,"total_code":4387560,"matched_code":1416352,"matched_code_percent":32.281086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7518,"matched_functions_percent":57.380554,"complete_code":1027960,"complete_code_percent":23.428967,"complete_data":0,"complete_data_percent":100,"total_units":330,"complete_units":169}},{"timestamp":"2026-09-03T19:49:01Z","commit_sha":"795669b058fc52f84acff1005e8b455da76c5521","commit_message":"link_floor: record code1_003a.c leaving the link after func_003a3de0 moved to its cw119 sibling","measures":{"fuzzy_match_percent":32.281086,"total_code":4387560,"matched_code":1416352,"matched_code_percent":32.281086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7518,"matched_functions_percent":57.380554,"complete_code":1027960,"complete_code_percent":23.428967,"complete_data":0,"complete_data_percent":100,"total_units":330,"complete_units":169}},{"timestamp":"2026-09-03T19:48:28Z","commit_sha":"92c161fa8d0f096a728342cc80b4649c6f142e59","commit_message":"lanes: b119 near-miss wave 36, +7; code1_003a_cw119.c unit\n\nfndiff-guided wave over the block's archived b210 near misses re-measured\nunder b119 with schedule on (25 at nd<=12). Six lanes, seven closures:\n  003a: func_003a3de0 (new src/promoted/code1_003a_cw119.c, speed unit,\n        registered in compiler_units/speed_units)\n  003c: func_003c59f0 func_003c00e0 func_003cc370\n  003d: func_003d5e90\n  003e: func_003e01e0 func_003e23e0\nLane 003e died on a provider rate limit with seven probes live; the two\nthat verified MATCH were kept and their parent stubs removed, the rest\ndropped (8c60 nd4 / 5110 nd8 archived). Lane 003c reports its four\nremaining targets stall only on the `-O2,p` alignment nop, which the\nplain -O2 003c cw119 unit cannot emit - candidates for a speed sibling.\n0 WRONG SYMBOL, 0 MISMATCH. Full verify 6526 MATCH (83.0%); TU count 169,\nboth SHA1s OK.","measures":{"fuzzy_match_percent":32.281086,"total_code":4387560,"matched_code":1416352,"matched_code_percent":32.281086,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7518,"matched_functions_percent":57.380554,"complete_code":1027960,"complete_code_percent":23.428967,"complete_data":0,"complete_data_percent":100,"total_units":330,"complete_units":169}},{"timestamp":"2026-09-03T18:49:19Z","commit_sha":"521494782ba816258f3e434dddfbb4a039783fa0","commit_message":"docs: record the interleaved-move prologue as a b119 floor (func_003c47c0)","measures":{"fuzzy_match_percent":32.252277,"total_code":4387560,"matched_code":1415088,"matched_code_percent":32.252277,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7511,"matched_functions_percent":57.327126,"complete_code":1095656,"complete_code_percent":24.971874,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":169}},{"timestamp":"2026-09-03T17:17:25Z","commit_sha":"462a615301ebd972654efa1e792c244bc5422d22","commit_message":"lanes: b119 wave 35, +2 (func_003bb4a0, func_003e47c0)\n\nSecond pass over the never-attempted RenderWare block under b119. Four\nlanes, two closures; eight measured candidates archived (003b: bb210\nnd47, b6f00 nd82; 003c: 66c0 nd100, 9b30 nd120, a5a0 nd59; 003d: dda50\nnd274, de4d0 nd343; 003e: 8ed0 nd17 - the fresh-unit prologue floor).\nD_0070AF50 registered for func_003bb4a0. 0 WRONG SYMBOL, 0 MISMATCH.\nFull verify 6519 MATCH (82.9%); TU count 169, both SHA1s OK.","measures":{"fuzzy_match_percent":32.252277,"total_code":4387560,"matched_code":1415088,"matched_code_percent":32.252277,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7511,"matched_functions_percent":57.327126,"complete_code":1095656,"complete_code_percent":24.971874,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":169}},{"timestamp":"2026-09-03T16:27:19Z","commit_sha":"29a7e1512fcf9d2788e9562c0484c36f50354c59","commit_message":"verify: cross-check data-symbol relocations; b119 lanes wave 34 (+9); 7 wrong-symbol matches fixed\n\nverify.py now records each relocation's candidate addend and, for every\nMATCH function, checks that symbol address + addend reproduces retail's\ngp-relative / %hi / %lo immediate (WRONG SYMBOL, hard failure, same\nstanding as WRONG CALLEE). gp-relative displacements must also be within\ngp's reach, since the comparison is mod 64K. Byte comparison masks these\nfields, and the full-link SHA1 covers only link-eligible units - the\ncw119 units are not, and neither were the three b210 units below.\n\nFirst run found seven latent wrong symbols in MATCH functions, all fixed\nand re-verified MATCH:\n  code1_003b_cw119 func_003b6da0  iGpffffb680 -> iGpffffaa7c\n  code1_003c_cw119 func_003c9940  iGpffffb6f8 -> iGpffffb700, D_008873F8[0x46] -> [0]\n  code1_003e_cw119 func_003e2f60  iGpffffb768 -> iGpffffb788 (registered)\n  btlCamera        func_001cca60  DAT_00761188 -> fGpffff8110 (two sites)\n  code1_0045       func_0045ee00  D_008872F8 -> fGpffff8200 (64K out of gp reach)\n  k_fldUnit        func_00165fb0  file-static D_007643D8 shadowing iGpffffb2e8;\n                                  the increment site is iGpffffb2e4\ntests/test_wrong_symbol.py covers the addend, carry, gp-range and\nunresolvable-symbol contracts.\n\nWave 34 (five b119 lanes on never-attempted block functions, +9):\n  003b: func_003bff30 func_003bffc0 func_003bfe90\n  003c: func_003c4140\n  003d: func_003ded20 func_003d3460 func_003d35f0\n  003e: func_003e46e0 func_003e0f80\n  0039: none (0/8)\nLane 003e died on a provider rate limit with a MISMATCH func_003e02c0\nlive and an open schedule bracket; both cleaned (candidate archived).\nLane 0039's six raw m2c \"archives\" and its unverified symbol\nregistrations for an unclosed function were dropped.\n\nbuild/LANE_RULES.md gained the b119-lane section. Full verify 6517 MATCH\n(82.8%), 0 MISMATCH, 0 WRONG SYMBOL; TU count 169, both SHA1s OK.","measures":{"fuzzy_match_percent":32.241703,"total_code":4387560,"matched_code":1414624,"matched_code_percent":32.241703,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7509,"matched_functions_percent":57.31186,"complete_code":1095656,"complete_code_percent":24.971874,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":169}},{"timestamp":"2026-09-03T15:18:49Z","commit_sha":"02ff59ae425d8a1438e37e4d6bde702bfe95476d","commit_message":"ci: resolve the cw3.0.1b119 compiler in the proprietary build\n\nThe +16 cw119 commit failed CI at verify: \"code1_0039_cw119.c is built\nwith compiler version 'cw3.0.1b119', which is not configured\". The\nprivate dependencies repository now carries cw3.0.1b119/mwccps2.exe\n(MWCCPS2 3.0.1 b119 040914, md5 5b9681a90ee0f6c4b0e0048a48699eb9; runs\nunder wibo with no LMGR326B.DLL). The Dockerfile installs a second wibo\nwrapper, mwccps2-cw3.0.1b119.exe over P4_MWCC_CW3_0_1B119_BINARY, and\nexports P4_MWCC_CW3_0_1B119 to it, which is how tools/verify.py resolves\nthe version key. The workflow checks the file exists in the private\ncheckout (P4_PRIVATE_MWCC_B119_PATH, default cw3.0.1b119/mwccps2.exe)\nand passes the mounted path into the container.\n\nReproduced locally in the same image and command line (podman, private\nlayout mounted at /opt/p4): 6508 first-party MATCH, both SHA1s OK.","measures":{"fuzzy_match_percent":32.192837,"total_code":4387560,"matched_code":1412480,"matched_code_percent":32.192837,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7500,"matched_functions_percent":57.243168,"complete_code":1095656,"complete_code_percent":24.971874,"complete_data":0,"complete_data_percent":100,"total_units":329,"complete_units":169}},{"timestamp":"2026-09-03T10:27:00Z","commit_sha":"0d670097ed303f693894f87c0efa6da11c0bd8a0","commit_message":"floors: +4 (mdlSE.c func_0047e450, k_encount.c func_00161bb0, code1_0017.c func_00170f60, code1_003a.c func_003a55a0)\n\n- func_0047e450 (668/672, nd 5 -> 0): the record advance is the signed\n  `(size + 0x3F) / 64 * 64` idiom; hand-written shifts with an explicit\n  negative branch were the archived \"register-class\" residual (same\n  lever as func_00455ea0).\n- func_00161bb0 (208/208, untried -> 0): both table bases, the constants\n  1 and -1, and the s16 id's sign extension are loop invariants that\n  retail hoists; measured `opt_loop_invariants on` does the hoisting\n  (nd 45 without it); `id == *(u16 *)(q + 2)` keeps the bne order.\n- func_00170f60 (580/592, nd 8 -> 0): the 12-byte D_005F1758 origin is a\n  plain Vec3 struct assignment (ld + lwc1, sd + swc1); the archived\n  s64/f32 pair through two globals also forced a dead `sp60[0] = &sp50`.\n- func_003a55a0 (412/416, nd 7 -> 0): schedule on + no_branch_likely on\n  (the file is schedule-off, branch-likely-on there), the k_encount\n  static-inline helper for the offset-first `addu $a0,$a0,$s1`, and the\n  last flag body's `goto dispatch_end` so the exit is a shared backward\n  branch with `ld $ra` in its delay slot.\n\nAlso measured (not installed): func_003a2950's `&= (u64)-0x10000` emits\nretail's `lui / pcpyld $v0,$zero,$v0` exactly - pcpyld is reachable from\nC. docs/matching.md records all four levers.\n\nThe parallel lane wave died three times on the provider's overall\nmessage rate limit (~17 minutes in, every lane); no lane closure\nsurvived, one lane regressed a sibling before dying, all lane edits\nreverted. Continuing single-agent.\n\nFull verify 6476 MATCH (82.3%), 0 MISMATCH. TU count 169, both SHA1s OK.","measures":{"fuzzy_match_percent":32.108597,"total_code":4387560,"matched_code":1408784,"matched_code_percent":32.108597,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7468,"matched_functions_percent":56.99893,"complete_code":1095656,"complete_code_percent":24.971874,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":169}},{"timestamp":"2026-09-03T10:04:46Z","commit_sha":"253f288ea0e935bf4154400dea2f997cc256002e","commit_message":"floors: +1 (code1_0045.c func_0045b430)\n\nfunc_0045b430 (532/544, nd 8 -> 0): the same hoisting lever as\nfunc_00275a60. Index the global slot array directly with an s16 counter\nunder measured `opt_loop_invariants on`, so the compiler hoists the base\ninto $v1 ahead of the loop as retail (a named base local is coloured\n$a0, the archived nd 8). The empty second loop is a separate s16 counter\nzeroed BEFORE the D_008E4018 store, which gives it $v1 and leaves the\nfirst counter's $a1 alone.\n\nFull verify 6472 MATCH (82.3%), 0 MISMATCH. TU count 169, both SHA1s OK.","measures":{"fuzzy_match_percent":32.065567,"total_code":4387560,"matched_code":1406896,"matched_code_percent":32.065567,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7464,"matched_functions_percent":56.968403,"complete_code":1095656,"complete_code_percent":24.971874,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":169}},{"timestamp":"2026-09-03T09:58:42Z","commit_sha":"f839db4dbc84302331df642212f951530e6a008e","commit_message":"floors: +1 (frFontRaster.c func_00275a60)\n\nfunc_00275a60 (364/368, nd 8 -> 0): the loop bound written as the fresh\nexpression `i < count - 1` under measured `opt_loop_invariants on`. The\ncompiler hoists it itself, after the body's temporaries have taken\n$a1..$a3, so the bound lands in $a0 and the next-node pointer in $a1 as\nretail; every named `limit` local is coloured first and takes $a1 (the\narchived \"register-colouring cycle\" at nd 8). Lever recorded in\ndocs/matching.md next to the func_00455ea0 split-`+=` note: allocation\nORDER decides $v0/$v1/$aN, and hoisting or splitting changes that order.\n\nFull verify 6471 MATCH (82.3%), 0 MISMATCH. TU count 169, both SHA1s OK.","measures":{"fuzzy_match_percent":32.05317,"total_code":4387560,"matched_code":1406352,"matched_code_percent":32.05317,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7463,"matched_functions_percent":56.96077,"complete_code":1095656,"complete_code_percent":24.971874,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":169}},{"timestamp":"2026-09-03T09:51:36Z","commit_sha":"c998a04bbf3f3ade0b642734b4f3c24c63072686","commit_message":"floors: +1 (sdkCdvd.c func_00455ea0)\n\nfunc_00455ea0 (200/208, nd 7 -> 0): the rounded record advance is a\nsigned `/ 64 * 64` (retail sra + bgez fix-up), written as a SECOND\n`entry += ...` after `entry += 0x100`. One combined expression colours\nthe base into $v1 and the fix-up into $v0; the split keeps entry+0x100\nin $a0 and size+0x3f in $v1 as retail. The archived note's\n\"$v0/$v1 temp-pool coalescing floor\" was the combined spelling.\n\nFull verify 6470 MATCH (82.2%), 0 MISMATCH. TU count 169, both SHA1s OK.","measures":{"fuzzy_match_percent":32.04478,"total_code":4387560,"matched_code":1405984,"matched_code_percent":32.04478,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7462,"matched_functions_percent":56.953136,"complete_code":1095656,"complete_code_percent":24.971874,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":169}},{"timestamp":"2026-09-03T09:41:52Z","commit_sha":"c4d28fdf487a90426fce4fdce416dffa671c3004","commit_message":"floors: +1 (code1_0045.c func_0045ed60); undo a snapshot that swept in lane scratch\n\nfunc_0045ed60 (148/160, nd 4 -> 0): `volatile u8 *arg0` keeps retail's\nthree identical 4-byte reloads without `opt_common_subs off`, which had\nalso un-CSEd the `3, 3` argument pair (retail li $a2,3 / move $a3,$a2).\nopt_propagation off keeps the colors pointer early in $t1. Recorded in\ndocs/matching.md.\n\nThe previous push (\"ci: take the published denominator...\") was\nsnapshotted while a lane wave was mid-flight and captured three lanes'\nhalf-finished edits (code1_001b.c, code1_003a.c, code1_003d.c: a live\nNONMATCHING body and reverted markers) plus a 3055-line scratch copy\nsrc/promoted/_probe_code1_003c.c whose 209 duplicated markers failed the\nmarker tripwire and the canonical-map test on CI. All four restored to\nthe state before that commit; markers 134/83/163 as committed. The wave\nitself died on a provider rate limit with no closures; its archives are\nkept. .gitignore now excludes src/**/_probe_*, src/**/_lane*, *.bak and\n*.orig so a snapshot cannot pick up lane scratch again.\n\nFull verify 6469 MATCH (82.2%), 0 MISMATCH. TU count 169, both SHA1s OK.\nProgress endpoints and README regenerated.","measures":{"fuzzy_match_percent":32.04004,"total_code":4387560,"matched_code":1405776,"matched_code_percent":32.04004,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13102,"matched_functions":7461,"matched_functions_percent":56.945503,"complete_code":1095656,"complete_code_percent":24.971874,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":169}},{"timestamp":"2026-09-03T08:07:12Z","commit_sha":"c08f2f715bc04e64b5e8edc9c37d00f844224acc","commit_message":"floors: +2 (cmmMisc.c func_002492b0, func_002490b0)\n\nBoth \"branch-shape floors\" (out-of-line NULL block / bne-plus-b-to-found) fall to the join-copy lever:\n- func_002492b0 (184/192, nd25 -> 0): both failure paths goto one `p = NULL; t = p;` block and the success path copies `t = p` before the join; the return is `if (t == NULL) return 0; return 1;`.\n- func_002490b0 (200/208, nd24 -> 0): the hit path copies the index (`k = i; goto found;`), the exhausted path sets `k = -1`; `if (k != -1) return entry; return NULL;` places the NULL return out of line as retail.\n- Re-probed, annotated: func_00208b00 (nd19 -> 6: u16 var/return, named idx2; base-load order remains), func_00110a60 (nd10: fallback load lands in $s1 directly), func_0048a460 (nd11: FPR colouring of divisor/dividend).\n\nFull verify 6465 MATCH, 0 MISMATCH. TU count 168, both SHA1s OK.","measures":{"fuzzy_match_percent":32.001022,"total_code":4387560,"matched_code":1404064,"matched_code_percent":32.001022,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7457,"matched_functions_percent":56.91932,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-09-03T07:43:26Z","commit_sha":"89802a89a31b2160dd0a98d32d851343b49411d7","commit_message":"floors: +1 (frFont.c func_00271a40)\n\n- func_00271a40 (292/304, nd18 -> 0): \"load-sinking + CSE-of-mask floor\" retired - opt_propagation off, three differently spelled masks of the loop index (`i & 0xff`, `(u32)i & 0xff`, `(u32)(u8)i`) so none is CSE'd with another (retail andi s2/s1/v0), and the free-slot pointer computed into a saved local before func_00454bd0 (retail addiu s1 before the jal); the table base then stays in $a1 for both the par load and the slot address. Stale #ifdef NON_MATCHING body removed.\n- frFont.c's two `optimization_level 1 / opt_common_subs on` brackets are now push/pop scoped: the unit was net +2 `opt_common_subs on` all along, hidden from decomp_lint P001 because the first occurrence sat inside the dropped NON_MATCHING block. All 52 functions in the unit still MATCH.\n- Re-probed, still open (annotated): func_0026e010 (nd20 -> 12: store the allocator result to the stack slot before the saved copy; remaining loop-counter $a1/$v1 colouring), func_00375f00 (O1 archive nd8 in the live unit; idx/arg0 stay saved while retail addresses through p).\n\nFull verify 6463 MATCH, 0 MISMATCH. TU count 168, both SHA1s OK.","measures":{"fuzzy_match_percent":31.991905,"total_code":4387560,"matched_code":1403664,"matched_code_percent":31.991905,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7455,"matched_functions_percent":56.904053,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-09-03T07:23:07Z","commit_sha":"fbbedcb2da20b0aa978d22c79ac964d0febd3b67","commit_message":"floors: +3 (code1_0028.c func_0028c3f0, cmmCommunity.c func_00108590, code1_004a.c func_004a7e30)\n\n- func_0028c3f0 (400/400, nd16 -> 0): \"slot-search branch shape floor\" retired - opt_propagation off keeps the `slot = &nodes[i]; node = *slot` pair, and the search hit copies the entry into a second pointer before the goto (`t = match; goto found;`); the copy keeps retail's bne / b-to-call-tail pair while the fall-through `t = NULL` reaches the shared call.\n- func_00108590 (592/592, nd14 -> 0): opt_loop_invariants on hoists the u16->int widening of the earned value into both predecessors of the threshold loop (retail's `move v1,zero` / `andi v1,v1` before the join).\n- func_004a7e30 (1044/1056, nd16 -> 0): the \"p4_add_f32 scaffolding\" was never needed - storing the sum directly (`*(f32 *)(arg1 + 0x10) = temp_f26 + temp_f1;`) or into a fresh temp keeps retail's `add.s f1,f26,f1`; assigning back into temp_f1 makes mwcc put the coalesced operand first.\n- func_0047f850: index scale bug fixed in the archive (nd16 -> 13); the remaining count/tbl/entry colouring rotation survives 48 declaration layouts and the AST permuter (annotated).\n\nFull verify 6462 MATCH, 0 MISMATCH. TU count 168, both SHA1s OK.","measures":{"fuzzy_match_percent":31.984976,"total_code":4387560,"matched_code":1403360,"matched_code_percent":31.984976,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7454,"matched_functions_percent":56.89642,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-09-03T07:02:24Z","commit_sha":"03d6dbb737f6239dcef7c78e3e30727d92a77b13","commit_message":"floors: +1 (code1_001f.c func_001fc300)\n\n- func_001fc300 (416/416, nd14 -> 0): D_00881440_abs[] extern (absolute table, [1] for the second slot); opt_loop_invariants on keeps the table base and the constant 1 hoisted above the scan loop; the two mode-1 blocks are `var = 1; if (slot == arg0) { t = var; } else { var = 0; t = var; } return (s8)t;` - the copy at the join keeps retail's `b join` trampoline (same lever as func_0018a010), under opt_rebuildconditionals off so the if/else is not folded to xor/sltiu.\n- Re-probed, still open (archives annotated): func_0038fd30 (needs schedule on + no_branch_likely on in that unit, then a six-float load-sinking residual), func_0014be50 (array externs + while loop reach nd13; header-copy order vs early-return constant CSE).\n\nFull verify 6459 MATCH, 0 MISMATCH. TU count 168, both SHA1s OK.","measures":{"fuzzy_match_percent":31.9383,"total_code":4387560,"matched_code":1401312,"matched_code_percent":31.9383,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7451,"matched_functions_percent":56.87352,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-09-03T06:39:41Z","commit_sha":"a3b76922c3747d49642a71ae0fbb454a6beed1ee","commit_message":"floors: +1 (code1_001f.c func_001f2cc0); matching.md levers\n\n- func_001f2cc0 (496/496, nd12 -> 0): the second loop's slot index is `(u16)var * 4` (its own mask, not CSE'd with the loop test) while the stored count is `(var & 0xFFFF) + 1` (CSE'd with the test, retail $a0); the counter store address is offset-first integer arithmetic `temp + (u32)D_0076449C`. Stale #ifdef NON_MATCHING body removed.\n- func_001f62f0 re-probed nd12 -> 6 (archive annotated: callee-argument order and two variable-vs-temp addu orders).\n- docs/matching.md: (f32)(u32) cast idiom, constant-first mul.s, recompute-vs-CSE spellings, statement-of-its-own under propagation off.\n\nFull verify 6458 MATCH, 0 MISMATCH. TU count 168, both SHA1s OK.","measures":{"fuzzy_match_percent":31.928818,"total_code":4387560,"matched_code":1400896,"matched_code_percent":31.928818,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7450,"matched_functions_percent":56.865887,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-09-03T06:19:13Z","commit_sha":"3d3820ef80ec5585d3adbf9a930697005c40cdae","commit_message":"floors: +2 (code1_004b.c func_004bc540, shdMisc.c func_003657d0)\n\n- func_004bc540 (1960/1968, nd11 -> 0): \"scheduler's reversed sll/lw order\" retired - `arg1 = arg1 << 3;` as its own statement under opt_propagation off keeps the shift ahead of the table loads.\n- func_003657d0 (752/752, nd9 -> 0): the four byte->float sites are plain `(f32)(u32)x` (mwcc emits the bltz / srl-andi-or / mtc1 / cvt / add.s idiom itself with retail's $v1 destination; the archive spelled it by hand and coloured $v0); the angle multiply written as one expression `iGpffff8094 * (f32)var_20` puts the GP constant first in mul.s.\n- func_0024be40 (cmmScript.c) re-probed to the same nd8 s0/s2 pairing (archive annotated; AST permuter 20k compiles).\n\nFull verify 6457 MATCH, 0 MISMATCH. TU count 168, both SHA1s OK.","measures":{"fuzzy_match_percent":31.917513,"total_code":4387560,"matched_code":1400400,"matched_code_percent":31.917513,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7449,"matched_functions_percent":56.858253,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-09-03T05:48:40Z","commit_sha":"bcddd8bc27da9816654d841def67462aaa4ffd94","commit_message":"floors: +1 (code1_0047.c func_0047ed60)\n\n- func_0047ed60 (432/432, nd7 -> 0): the retry counter is stored as an s32 sum and re-read through the s16 slot so the reload forwards to dsll32/dsra32 after the sh (retail); the call argument re-reads the slot as `*(s16 *)((u32)arg0 + 8)` so it is not CSE'd with the forwarded value and stays a real lh. The -1 constant then keeps $a0 across both uses.\n- Re-probed and still open (archives annotated): func_001f9cf0 (assignment order drives both the saved-register pair and the emission order; 120 declaration orders, AST permuter 18k compiles), func_0045b430 (table-base/index temp colouring, 120 declaration positions).\n\nFull verify 6455 MATCH, 0 MISMATCH. TU count 168, both SHA1s OK.","measures":{"fuzzy_match_percent":31.855518,"total_code":4387560,"matched_code":1397680,"matched_code_percent":31.855518,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7447,"matched_functions_percent":56.84299,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-09-03T05:07:25Z","commit_sha":"25312b3d0a2dd664bb2f6025bc5e910f3777441d","commit_message":"floors+lanes: wave 44, +7 (btlPanelAnalyze.c func_00218ea0, sdkCdvd.c func_004559b0, code1_001a.c func_001a0f40, code1_0029.c func_002915f0, code1_0018.c func_0018a010, code1_0021.c func_0021e9a0, nLine.c func_0034bea0)\n\nSix archived \"floors\" (nd 2-14) closed by single levers, one lane closure:\n- func_001a0f40 (440/448): \"source-first reassociation ruled out\" was wrong - mwcc keeps source operand order for `named + named` but commutes an inline product on the left; one named local per address term under opt_propagation off (nd2 -> 0).\n- func_002915f0 (408/416): opt_propagation off with u16-typed block-scope callee prototypes keeps `weapon` materialised between the index shift and base add; index/five locals stay literal or a sixth saved register appears (nd4 -> 0).\n- func_0018a010 (344/352): branch-to-branch trampoline reproduced by assigning a scratch `p` in the inner if/else and `base = p` after it (the copy keeps the join block alive through mwcc's one-level fold); named `slot` per store for the addu order (nd6 -> 0).\n- func_0021e9a0 (448/448): one s16 `sum` local with `> 0x63` clamp shares $v0 across dsll32/dsra32/slti/li (nd6 -> 0).\n- func_0034bea0 (636/640): \"preheader move/andi order not source-drivable\" retired - u8 local loaded before the counter init and masked after it, under opt_propagation off (nd8 -> 0).\n- func_00218ea0 (440/448): lane draft nd14; AST permuter found the lever in 407 compiles: re-derive the source pointer from src_base inside the copy loop (`src = (s32 *)src_base` per iteration, consumed after) drops src_base to $s0.\n- func_004559b0 (440/448): lane UCdvd (push/pop opt_propagation off, typed table base, assignment-in-condition NULL check, block-scope 5-arg prototype).\n- Two wrong-symbol bugs caught by the full link (scoped verify masked both): btlPanelAnalyze.c lane had fGpffff847c/fGpffff80cc swapped (0.8 vs 0.85) and named them iGp*; nLine.c archive used iGpffff8094 where retail's immediate is fGpffff84a4 (both pi/2). Registered fGpffff847c = 0x0076156c.\n- func_00103c40 (code1_0010.c) nd23 -> 4 archived (jump-table base $a0 vs $a1 is a colouring side effect; 96 case orders swept). Killed-lane drafts for code1_0020.c/code1_0036.c/code1_001b.c archived and reverted. docs/matching.md: \"Salvage the lane drafts\" section with this session's levers.\n\nFull verify 6454 MATCH, 0 MISMATCH. TU count 168, both SHA1s OK.","measures":{"fuzzy_match_percent":31.845673,"total_code":4387560,"matched_code":1397248,"matched_code_percent":31.845673,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7446,"matched_functions_percent":56.835358,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-09-03T03:20:54Z","commit_sha":"0ea398a2110820660fdc288ab879e157497e2604","commit_message":"lanes+salvage: wave 43, +2 (y_draw.c func_002b9e10, code1_002b.c func_002bc890); link floor 166 -> 168\n\n- y_draw.c func_002b9e10 (332/336 nd0): beats the documented \"RHS-load-first scheduling wall\": opt_propagation off with the fGpffff8504 global copied into a local after the 0x194 field local gives retail's load order; the post-compare entry-pointer recompute is `p + (u32)i * 0x220` (not CSE'd with the s32 form); declaration order q,p,i,r colours s0..s3. Old nd-3/nd-56 notes removed.\n- code1_002b.c func_002bc890 (328/336 nd0): lane T2b, block-scope pointer/result locals and explicit labels.\n- Registered fGpffff8504 = 0x007615f4 (retail lwc1 -0x7AFC($gp), image f32 0.1) and D_00793E80 = 0x00793e80 (retail lui/addiu at 0x002B9ED0). Resolving them also makes evtModel.c and y_fclShopDraw.c link-eligible: 168 TUs, floor raised deliberately.\n- rprandom_grouped.c func_003b7ca0 reached nd2 (lane TRnd + 16 Main spellings): lbu/sll swap in the sp4C block survives every association and pragma; archived. cmmMisc.c func_00249370 (nd77) and code1_0036.c func_003672d0 (nd142) archived.\n\nFull verify 6447 MATCH, 0 MISMATCH. TU count 168, both SHA1s OK.","measures":{"fuzzy_match_percent":31.77274,"total_code":4387560,"matched_code":1394048,"matched_code_percent":31.77274,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7439,"matched_functions_percent":56.781925,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-09-03T01:57:07Z","commit_sha":"43e64c995d5773d6d21131f23b853249c3d3a188","commit_message":"lanes+salvage: wave 42, +4 (y_CmbCardEff.c func_0033fa30, code1_0018.c func_0018dde0, code1_001b.c func_001b1280, code1_001f.c func_001f39d0)\n\n- y_CmbCardEff.c func_0033fa30 (224/224 nd0): the rejected volatile closure re-spelled legally: plain s64/f32 locals staged through the frame under push/pop opt_propagation off give retail's [addiu a1][lui][ld][lui][lwc1][sd][swc1] order. Old \"scheduler-CSE floor\" note removed.\n- code1_0018.c func_0018dde0 (332/336 nd0): lane draft nd9, finished by Main: compare with the elapsed-time subtraction on the left, and a block-scope prototype with an s64 third parameter so iGpffffb278 materialises into $a2 first.\n- code1_001b.c func_001b1280 (316/320 nd0): lane draft nd12, finished by Main: declare i before count (a2/a3 colouring) and fold `count == 1` into the switch as `case 1: default: return;`.\n- code1_001f.c func_001f39d0 (300/304 nd0): lane draft nd30, finished by Main: opt_propagation off bracket, and the 0x70 field loaded into the existing u16 temp then cast (s16) at both uses, which gives retail's lh v0 / move s0,v0 copy.\n- Provider rate limit killed 5 of 6 lanes mid-flight this wave; y_draw.c func_002b9e10 draft (non-compiling) restored to INCLUDE_ASM. mdlManager.c func_00475b90 archived at nd89.\n\nFull verify 6445 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.757423,"total_code":4387560,"matched_code":1393376,"matched_code_percent":31.757423,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7437,"matched_functions_percent":56.76666,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-03T01:27:00Z","commit_sha":"848e5901a80cca2d20dec7cae7e657614756ab98","commit_message":"lanes: waves 40-41, +3 (code1_0033.c func_0033d550, code1_0045.c func_00452760, sdkCdvd.c func_004555d0)\n\n- code1_0033.c func_0033d550 (212/224, nd0): block-scope func_002b8300 prototype with the f32 parameters first (same spelling as code1_002e.c) plus a bracketed opt_propagation off.\n- code1_0045.c func_00452760 (264/272, nd0): push/pop opt_propagation off keeps the constant 3 in $a0 across the loop.\n- sdkCdvd.c func_004555d0 (220/224, nd0): beats the documented \"32->64 extension floor\": store the u32 offset to the s32 field and reload it into the s64 slot so the lw sign-extension feeds sd/lq/sq; 128-bit copy via the tree's `signed __int128` spelling (lane's mode(TI) normalised). Old floor comment removed.\n- REJECTED: y_CmbCardEff.c func_0033fa30 scored 224/224 nd0 but only via `volatile` staging of ordinary data (H001) and a packed struct; file restored to INCLUDE_ASM, body archived as docs/probe_archive/RCard_0033fa30_volatile_body.c.\n- Wave 40 (0/3): y_fclShopDraw.c func_002e0100 (nd132), cmmRankUp.c func_00256460 (nd126), shdMisc.c func_00364320 (nd60) archived.\n- func_00396520 (code1_0039.c) re-probed: `+=` products give retail's mtc1/adda/madd chain and a first-declared zero local reserves f0 and reproduces retail's f1-f8 colouring; residual is 4 words (ww/dot register choice, zero placement). AST permuter 41k compiles bottomed at 179. Findings recorded in docs/probe_archive/U3963_00396520_body.c.\n\nFull verify 6441 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.730438,"total_code":4387560,"matched_code":1392192,"matched_code_percent":31.730438,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7433,"matched_functions_percent":56.736126,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-03T00:10:48Z","commit_sha":"d755e58a68e2be5d5aa5d83e114e0b8e31d742a6","commit_message":"docs: wave 39 archives (code1_001c.c func_001c09b0 nd551, func_001c04e0 nd592, func_001cb610 nd161)\n\nNo source changes; verify state unchanged (6438).","measures":{"fuzzy_match_percent":31.714027,"total_code":4387560,"matched_code":1391472,"matched_code_percent":31.714027,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7430,"matched_functions_percent":56.713226,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T23:44:36Z","commit_sha":"c37ad6864d209bb3742b9cd8cddf8ef1901ac7fa","commit_message":"lanes: wave 38, +1 (code1_001c.c func_001cf350, ex-\"COP1 floor\")\n\n- code1_001c.c func_001cf350 (992/992, nd0): lane O1a in a jj workspace -\n  explicit-field frame struct, block-scoped externs, 550.0f clamp in the\n  integer cvt form, gp pre-multiply before the divide, split final multiply\n  chain for the COP1 operand order. Region spliced; relocations checked.\n- Archived without closing: func_001cfad0 (nd460), func_001cacd0 (247 words,\n  fparg0 parked in f25 vs retail f24).\n\nFull verify 6438 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.714027,"total_code":4387560,"matched_code":1391472,"matched_code_percent":31.714027,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7430,"matched_functions_percent":56.713226,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T23:19:55Z","commit_sha":"ac6a4c07475dd1c30dd10a27abfcd1a7f2549abf","commit_message":"lanes: wave 37, +1 (code1_001c.c func_001cf730, ex-\"COP1 floor\")\n\n- code1_001c.c func_001cf730 (920/928, nd0): lane N1c in a jj workspace -\n  explicit-field frame struct, 0.0f + x + y*z / 0.0f + x - y*z for the\n  adda/madd/msub chains, quaternion loaded into four named f32 locals before\n  the stores. Function region spliced onto the parent; relocations checked\n  (DAT_0076112c gp offset 0x803c).\n- Archived without closing: func_0032f4d0 (nd921), func_003212e0 (nd329).\n\nFull verify 6437 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.691418,"total_code":4387560,"matched_code":1390480,"matched_code_percent":31.691418,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7429,"matched_functions_percent":56.705593,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T22:47:01Z","commit_sha":"bba048ae54ae39eca80268f119bf1ba055dff633","commit_message":"docs: wave 36 archives; the parked-call-result saved-register rule (func_0032c480 nd31 -> nd13)\n\n- y_fclCombineDraw.c func_0032c480: lanes' register rotation residual is a\n  call result used directly as an argument and parked across an inner call -\n  it takes the lowest saved register below declared locals. Remaining 4\n  words are the final call's pointer-chain/constant interleave. Archived.\n- func_00329310 (nd272, lane MFe) archived.\nNo source changes; verify state unchanged (6436).","measures":{"fuzzy_match_percent":31.670267,"total_code":4387560,"matched_code":1389552,"matched_code_percent":31.670267,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7428,"matched_functions_percent":56.697964,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T22:11:13Z","commit_sha":"8ae00ccd0172f97135b3ecfb298f44d1b721d368","commit_message":"lanes: wave 35 (draw family via per-lane jj workspaces); +1\n\n- y_fclCombineDraw.c func_00324410 (616/624, nd0): lane IFa - s8 arg2 park,\n  block-scope s16-returning func_002b6970 compared as (s64)... == 1, block-\n  scope narrow-typed func_002b6af0 prototype for the float/int materialisation\n  order, and `20.0f + ((y = sp68.y), y)` for the retail lwc1/lui/nop/add.s\n  sequence. Only the INCLUDE_ASM line replaced (the lane's copy had also\n  dropped a neighbour's measured note; spliced the function region onto the\n  parent instead).\n- Lanes LFb/LFc ran in `jj workspace add` checkouts (/tmp/p4ws_lane*) so two\n  agents could work the same file; both archived without closing:\n  func_0032fbc0 (nd200, saved-register rotation + ldr/ldl on a 64-bit load),\n  func_0031ddf0 (nd279, frame size and colouring). Also archived:\n  func_00204b80 (nd196), func_002258b0 (nd527).\n\nFull verify 6436 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.670267,"total_code":4387560,"matched_code":1389552,"matched_code_percent":31.670267,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7428,"matched_functions_percent":56.697964,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T21:20:36Z","commit_sha":"a7df1a9b35f81e1d7aa095d745dc9655a2c1e956","commit_message":"floors+lanes: one more peephole closure, wave 34 archives; +1\n\n- code1_003d.c func_003d5fb0 (84/96): peephole off keeps the allocated-slot\n  reload; a named `self` copy under opt_propagation off issues the flags load\n  from $a0 before the park (the archive needed volatile).\n- code1_003d.c func_003d0460: peephole off fixes all six *arg1 reloads (nd34)\n  but also removes retail's tail-merge branch into the epilogue with ld $ra in\n  the delay slot - second mutually exclusive peephole case (archived, noted).\n- Wave 34 (fresh 0039/003c/003e functions): 0 closures; archives for\n  func_003990a0 (nd196), func_00399bf0 (nd236), func_003ce9e0 (54 words),\n  func_003e7d50 (65 words). All lane files verified unchanged vs parent.\n\nFull verify 6435 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.656046,"total_code":4387560,"matched_code":1388928,"matched_code_percent":31.656046,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7427,"matched_functions_percent":56.69033,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T20:44:52Z","commit_sha":"76d74c49aea3703722c5840dc1b77950d704d20e","commit_message":"lanes+floors: wave 33 and two more peephole closures; +3\n\n- code1_0038.c func_00389370 (720/720): lane G38, ex-\"COP1 floor\" - block-scope\n  narrow-typed prototype for the 14-argument func_0034f4a0 call, inline\n  (u16)(4096.0f*q) colour args, plain adda/madd chains.\n- code1_003c.c func_003c4040 (132/144) and code1_003e.c func_003e8dc0\n  (152/160): the `*slot = result; result = *slot` idiom with peephole off;\n  8dc0 additionally needs the list head written through a pointer local and\n  D_008873A0 through its own symbol because peephole off also drops the\n  redundant-lui merge. Relocation immediates hand-checked against retail\n  (these 003x units are not link-eligible).\n- Archived, reverted: func_003bb5b0 (nd975, lane G3b), func_0032c480 (nd214,\n  lane GFcl; its revert had also deleted nine pre-existing file-scope externs\n  - file restored to parent exactly).\n\nFull verify 6434 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.653858,"total_code":4387560,"matched_code":1388832,"matched_code_percent":31.653858,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7426,"matched_functions_percent":56.682697,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T19:59:11Z","commit_sha":"c517ffc4df1ccaa558c9e9b8d3b4dccc98b95705","commit_message":"floors: store-to-load forwarding is a peephole; four volatile-parked bodies closed legally; +4\n\n- `#pragma peephole off` (recognised by b210, compile-probed; function-granular)\n  keeps the post-store reload that retail has in the 0039-003e allocator idiom\n  `*slot = result; result = *slot;`. Access types, aliases and every optimiser\n  knob (opt_propagation/common_subs/pointer_analysis/global_optimizer/\n  lifetimes off) forward it. New matching.md entry.\n- code1_003c.c func_003c3e90 (132/144), code1_003e.c func_003e2570 (128/128)\n  and func_003e8080 (132/144): the archives had reached nd0 only with a banned\n  volatile; peephole off closes them without it.\n- code1_003d.c func_003de8c0 (236/240): the archived volatile and\n  optimization_level 3 were pre-,p artefacts; plain schedule/no_branch_likely\n  bracket matches under the unit's -O2,p.\n- code1_003a.c func_003a8500: peephole off reproduces both reloads; nd12\n  saved-register colouring remains (archived). func_003bcd50: the same\n  peephole also keeps the s32->s64 guard shifts retail lacks - mutually\n  exclusive, noted in its archive.\n\nFull verify 6431 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK (measured\nwith the three in-flight lane files at parent).","measures":{"fuzzy_match_percent":31.63052,"total_code":4387560,"matched_code":1387808,"matched_code_percent":31.63052,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7423,"matched_functions_percent":56.659798,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T19:33:55Z","commit_sha":"918e1cd9470bf8a184887c478a1f10b0c42ad04a","commit_message":"lanes: wave 32, +2 (COP1-pool and draw-family openings)\n\n- code1_0038.c func_0038cab0 (700/704, nd0): ex-\"COP1 accumulator floor\",\n  closed by lane D38 with typed state/vertex structs.\n- y_fclCombineDraw.c func_003205f0 (888/896, nd0): ex-\"draw-family floor\",\n  closed by lane EFcl using the narrow-type block-scope declarations.\n- Attempted, archived, reverted: func_001cb610 (nd172), func_002b4ad0\n  (1244/1248, 150 words), func_00324410 (lane killed mid-draft), and E3a's\n  003a targets (rate-limited before a body compiled). Three lane drafts were\n  reverted to parent exactly (orphan externs, whitespace, a compile-broken\n  body); y_symbol.c's draft had made the TU lose link eligibility while live.\n\nFull verify 6427 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.615568,"total_code":4387560,"matched_code":1387152,"matched_code_percent":31.615568,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7419,"matched_functions_percent":56.629265,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T18:53:14Z","commit_sha":"18ded68796d50f4c1e8b6ce77cfb13ea140ec430","commit_message":"floors: the y_fclCombineDraw \"s64-parameter-normalization floor\" is narrow-type canonicalisation; +1\n\n- y_fclCombineDraw.c func_003146f0 (68/80, the file's oldest parked entry at\n  nd23): the late dsll32/dsra32 into $a3 is an s8 CALLEE parameter (block-scope\n  declaration of func_0011b480) fed by the store-forwarded byte reload\n  `*(s8 *)(obj + 0xC)`, which mwcc materialises in argument order; casts of the\n  parameter are hoisted ahead of the loaded arguments. Every dsll32/dsra32\n  pair in that family is s8/s16 canonicalisation (entry params, s16 callee\n  returns, s8 callee params) - the 37 remaining functions there are open, not\n  floors. New matching.md entry.\n- code1_0039.c func_003963c0 / func_00396520: re-measured, not COP1 floors.\n  00396520 is now instruction-exact at the exact size with only FPR colouring\n  left (loads-first block needs opt_propagation off + operand locals; retail\n  compiled with scheduling off); 003963c0's residual is memory-homed\n  quaternion locals loaded from an uninitialised slot with no stores.\n  Both archived with the measurements.\n\nFull verify 6425 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK (measured\nwith src/Yajima/y_symbol.c at parent; a lane's in-flight draft there is not\npart of this commit).","measures":{"fuzzy_match_percent":31.579102,"total_code":4387560,"matched_code":1385552,"matched_code_percent":31.579102,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7417,"matched_functions_percent":56.614,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T18:15:58Z","commit_sha":"be1a5955e79d3e1d7efe909cfc6276e01aa4316f","commit_message":"floors: four \"COP1 floor\" archives opened and closed; +4\n\nThe \"COP1 accumulator-chain floor\" archives (41 functions, no source\nprobing) are not floors - MAC chains come from plain C. First four opened:\n- btlCamera.c func_001bc660: no COP1 at all; dead `while ((n = i) == 0)`\n  history shift with the fused `[i--]` subscript and pointer+index\n  addressing for addu base,index.\n- code1_0020.c func_00208870: the archive's nd10 was a wrong float argument\n  (0.0f, the hoisted $f12 zero); prototype corrected.\n- code1_0020.c func_0020e420: parameter-order entry parks (new matching.md\n  entry), u32 colour word, (s8)(u8) into u64, in-place masks, block-scope\n  s64 callee declaration, i=0 before the masks. New symbol iGpffffa580\n  (0x00763670, \"%d\") registered and confirmed by the full link.\n- code1_003a.c func_003a9e50: schedule/no_branch_likely bracket plus a\n  forward goto over both return-0 blocks to keep retail's layout.\nReverted five rate-limit-killed lane drafts (nd160-921) to parent.\n\nFull verify 6424 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.577278,"total_code":4387560,"matched_code":1385472,"matched_code_percent":31.577278,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7416,"matched_functions_percent":56.606365,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T13:00:22Z","commit_sha":"fc20cb84850e060d02f315b6c1dc4f17bca3f11e","commit_message":"floors: two nd4 near-misses closed (aggregate slot typing, unprototyped call); +2\n\n- k_fldAI.c func_0017ea10 (nd4 -> 0): the 24-byte slot is `FldAIVec3 ab[2]`\n  and `out = ab[0]` between Vec3-typed locals gives retail's ld/lwc1/sd/swc1;\n  the unaligned ab[1] copies are the three-lwc1 form. Dropped the invented\n  {s64; f32} FldAIProj type. Second closure of the 12-byte aggregate rule.\n- code1_0017.c func_00178870 (nd4 -> 0): retail's mask order (andi $a2\n  before the lhu loads, andi $a3 after) is an unprototyped call - u16 local\n  for b plus an explicit (u16) cast on a under `extern s32 func_00161630();`\n  (sole caller in the unit). Any prototyped u16 parameter hoists the $a3\n  mask before the loads. New matching.md entry.\n- Archived as measured floors after re-probing: code1_003c.c func_003cbf30\n  (scheduler move placement) and func_003cc250 (lw hoisted above sd $ra;\n  no pragma/level/build reaches it), code1_0045.c func_0045ed60 (reloads\n  need opt_common_subs off, which kills the `move $a3,$a2` constant CSE).\n\nFull verify 6420 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.544823,"total_code":4387560,"matched_code":1384048,"matched_code_percent":31.544823,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7412,"matched_functions_percent":56.575832,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T12:22:30Z","commit_sha":"d46022b405cc339b8b83990d5a575deef45e07c4","commit_message":"floors: two nd2 near-misses closed by measured operand/return rules; +2\n\n- code1_0013.c func_00135520 (nd2 -> 0): retail add.s $f21,$f0,$f21 is a\n  *new* value in a dead register, not `temp_f21 += 130.0f`; assign the sum\n  to the dead temp_f20 and recompute 467.0f + x for the last call.\n  Measured: `x += c`/`x = c + x` put the variable first; a fresh name puts\n  the constant first (matching.md \"Commutative add.s operand order\").\n- datCalc.c func_00232c70 (nd2 -> 0): u8 return (daddiu $v0,$zero,K into\n  the return register, `v >>= 1` avoids the extra mask); the matched caller\n  func_002384b0 keeps its no-mask call through a block-scope\n  `extern u32 func_00232c70(u8 *, s32);` declaration, reproducing the\n  cross-unit prototype split retail had (datScript.c declares it s32).\n  Measured in isolation: b210 accepts the conflicting block-scope\n  declaration silently and drops the promotion andi.\n- code1_001a.c func_001a0f40: not closed; the archive note records the\n  coupled floor (index-first addu vs hoisted $a1 gp load flip together\n  across 30 spellings). File restored exactly.\n\nFull verify 6418 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.523672,"total_code":4387560,"matched_code":1383120,"matched_code_percent":31.523672,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7410,"matched_functions_percent":56.56057,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T11:59:42Z","commit_sha":"9c4e5aae1950bf07265eaf26e2f32aac33307462","commit_message":"floors: the prologue-order \"floor\" on 00356170 was the temporary rule; +1\n\ncode1_0035.c func_00356170 (nd8 -> 0, \"independent prologue-order floor\"):\nretail parks $a2 into $t1 after the two stack spills; mwcc parks it at\nentry. Naming the copy after the spills under opt_propagation off puts\nthe move where retail has it. 96/96.\n\nThe sibling func_00117310 parks $t0 into a callee-saved $s0 and mwcc\norders those parks with $t0 first regardless of source (20 spellings);\nonly a genuine conversion instruction moves it. Recorded in its archive.\n\nmatching.md: new \"Parameter parking moves\" entry.\nFull verify 6416 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.507626,"total_code":4387560,"matched_code":1382416,"matched_code_percent":31.507626,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7408,"matched_functions_percent":56.545303,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T11:44:42Z","commit_sha":"df8678ae2582ffde7556a21f0b3f4af3a9cb32de","commit_message":"docs: the -O2,p block's remaining residuals are not a compiler-version question\n\nCross-build check of the speed block's three open shapes (sd $ra sunk\ninto a branch delay slot, a load kept below a mult, an s64 counter with\naddiu) against mwcps2 2.4-001213, 3.0.1-020123, 3.0.3-020716, b74, b119,\nb151, b198 and b210, each under -O2,p and -O3,p: no build reproduces any\nof them (2.4 saves $ra with sq). Recorded under the mixed-FLAGS section;\nbuilds cached in ~/opt/mwcc_all for future probes.\n\nFour fresh-target lanes were killed by the provider rate limit at nine\nminutes; live bodies archived (PoA_00164fa0 nd148, PoB_00485870 nd388,\nPoD_002a4d10 nd291) and the files restored. No source change.\n\nFull verify 6415 MATCH, 0 MISMATCH.","measures":{"fuzzy_match_percent":31.505438,"total_code":4387560,"matched_code":1382320,"matched_code_percent":31.505438,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7407,"matched_functions_percent":56.53767,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T11:30:50Z","commit_sha":"fd9a8ba0f262a750c7cc6220439e4bc015bef51f","commit_message":"lanes: +2 from the speed-unit mechanism; 81.6%\n\nFirst wave over the -O2,p block with the mechanism in place (4 lanes, 13\narchived near-misses). Two closed on the alignment nop alone:\n\n- code1_003e.c func_003e30c0 (H3E1 archive nd9 -> 0): linked-list goto\n  loop under schedule on + no_branch_likely on; the filled back-edge\n  slot's nop is now supplied by ,p.\n- code1_003a.c func_003a3d50 (FP3A archive nd12 -> 0): same.\n\nThe other eleven stay open with scheduler-order residuals the pragma\nscheduler does not reproduce (sd $ra sunk into a beqz delay slot, mult\nplaced in a jalr delay slot, a load hoisted over a mult where retail\nkeeps source order); measured unchanged across -O2,p/-O3,p/-O4,p, so the\nblock's remaining difference from our build is not the level either.\nArchives updated per target.\n\nFull verify 6415 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.505438,"total_code":4387560,"matched_code":1382320,"matched_code_percent":31.505438,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7407,"matched_functions_percent":56.53767,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T10:53:51Z","commit_sha":"8f1518fc817d318e17d89774556f22a534fd8740","commit_message":"tooling: per-unit -O2,p (config/speed_units.txt); the 0039-003e block is a speed build; +1\n\nThe \"one trailing nop retail keeps\" cited by every archive in code1_0039..\n003e is MWCCPS2's optimize-for-speed variant: `-O2,p` inserts an alignment\nnop after a filled back-edge delay slot so the next forward-branch target\nis 8-aligned. Plain -O2 never emits it and no matched function in the\ntree has the shape.\n\n`,p` is command-line state: no #pragma spelling reaches it (optimize_for_\nsize off is recognised but inert; ~30 other spellings are unrecognised)\nand it survives a later #pragma optimization_level N. So it is carried\nper translation unit, on the config/gcc_units.txt pattern:\n\n- config/speed_units.txt lists code1_0039/003a/003b/003d/003e.\n- tools/verify.py: speed_units()/is_speed_unit()/unit_compile_flags()\n  rewrite -O<n> to -O<n>,p for listed units in _mwccgap_command.\n- tools/build.py: _mwccgap_flags takes the source path through to the\n  same helper, so the cache key and the link compile see the flag.\n\nEvidence: a full verify under a GLOBAL -O2,p loses 962 matched functions;\nthe five listed units lose zero of their 293; code1_003c.c loses 1/105\n(func_003c99f0, held back); ordinary game units lose 20-35% each.\nWith the mechanism on, full verify is unchanged at 0 MISMATCH and both\nlink SHA1s hold. Unit suite: 530 tests, 0 errors, 22 baseline failures.\n\n- btlShuffleDraw.c func_00378280 (lane, nd105 -> 0): the six hand-\n  expanded float conversions replaced by casts, plus opt_loop_invariants\n  on to hoist the FMA constants.\n\nmatching.md: \"mixed-FLAGS build\" section under the mixed-toolchain one.\nFull verify 6413 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.500332,"total_code":4387560,"matched_code":1382096,"matched_code_percent":31.500332,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7405,"matched_functions_percent":56.522404,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T10:05:02Z","commit_sha":"cab9828bbad571bd24bfb22afe5877e6d37aaf36","commit_message":"floors: a 12-byte aggregate copy's load order is the locals' slot alignment; +1\n\ncode1_001c.c func_001cff00 (nd2 -> 0), the \"independent adjacent memory\naccess order\" floor's smallest member: retail loads ld then lwc1 for a\nVec3 copy. That is `d = s` between two struct-typed top-level locals -\nmwcc knows each local sits in its own 8/16-aligned slot and uses ld for\nthe first 8 bytes. Inside a packed \"frame\" struct the member's type\nalignment (4) forces three lwc1, and pointer helpers / casts give the\nother orders. The lane's frame struct dissolved into `Vec3 target; Vec3\nsource; struct { f32 first[10]; u8 second[0x28]; } fr;`, which lands on\nretail's slot offsets exactly (0x40/0x68/0x90/0xA0). func_003e4180 now\ndeclared with its f32 return in this TU.\n\nFull verify 6412 MATCH, 0 MISMATCH (verified before the lane wave\nstarted). TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.485746,"total_code":4387560,"matched_code":1381456,"matched_code_percent":31.485746,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7404,"matched_functions_percent":56.51477,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T09:55:12Z","commit_sha":"327ddc7e33f08f262b5814b4b7f6fe95365f6ec6","commit_message":"floors: call-argument setup order is a parameter-type / address-taking choice; +2\n\n\"Call-argument setup order before a JAL\" is retired from the floor list\nwith both of its archived members closed.\n\n- itfMesManager.c func_002782c0 (nd10 -> 0, the \"independent pair\"\n  floor): a stack-buffer address is materialised FIRST when it is cast to\n  an integer or the callee's parameter is integer-typed, and LAST (after\n  the register moves) when the buffer is passed as-is to a pointer-typed\n  parameter. func_00278450's third parameter retyped char * (it only\n  passes the value on; stays MATCH). The grandfathered NON_MATCHING stub\n  replaced by the match.\n- cmmRankUp.c func_0025b0f0 (nd24 -> 0): the mirror case. Retail hoists\n  `addiu $a0,$sp,0x5C` above the store into that slot and `addiu\n  $a1,$sp,0x40` between the two quad stores: the address is taken into a\n  pointer local at that point under opt_propagation off, with the stores\n  themselves left direct.\n\nBoth measured on isolated probes first (8 spellings), then applied.\nmatching.md entry rewritten with both recipes.\n\nFull verify 6411 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.4697,"total_code":4387560,"matched_code":1380752,"matched_code_percent":31.4697,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7403,"matched_functions_percent":56.507137,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T09:47:05Z","commit_sha":"a18722f18f346ab0c82c32eee3e3ada351ea207f","commit_message":"lanes: +1; seven of eight lanes killed by the provider rate limit again\n\n- code1_0026.c func_0026f5e0 (nd23 -> 0): temporary-liveness split of a\n  reused local into four, (s64)(s16) cast for the dsll32/dsra32 pair,\n  commutative-addu swap, s32* do-while copy loop, switch written 0,1,2,3,6\n  for the reverse test order, opt_common_subs off + opt_propagation off.\n\nSeven lanes died at the ~30 minute mark on the model provider's message\nrate limit. Live bodies measured, archived and reverted by hand:\n003bcd50 (nd28: the new (s64)0 guard is exact, all residual is one stray\nretail nop after the filled back-edge delay slot - the same nop as\n003b4230; the body also used volatile), 002b74f0 (nd360), 00243a30\n(nd343), 00485630 (nd8 but built on __asm__ volatile blocks, invalid;\nredo with the VU intrinsics), 00204b80 and 0045c640 (compile errors).\nKoF's unused D_00764564 removed with its body.\n\nFull verify 6409 MATCH, 0 MISMATCH (includes the six float-to-byte\nclosures from the previous commit). TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.452927,"total_code":4387560,"matched_code":1380016,"matched_code_percent":31.452927,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7401,"matched_functions_percent":56.49187,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T09:08:04Z","commit_sha":"6badb8da5f8084d6829643b62659d91d1ef9c164","commit_message":"floors: the slti $at idiom is a spelling grid, and the $zero entry guard is a 64-bit compare; +2\n\nTwo more entries from the \"Known compiler floors\" list measured against\nb210 while the lane pool was rate-limited.\n\n1. `slti $at` branch-temp idiom. 24 probes. The register is chosen by\n   spelling and by whether the branch is an if-skip or a loop back-edge /\n   early return: `<=`/`>` always lower through $at; `<`/`>=` use $vN\n   exactly when the emitted branch is bnez; loops and early returns\n   invert the if table. Three of the four register x sense combinations\n   are reachable; only `$vN + beqz` never appears. Same table for slt\n   with a register operand and for sltiu. Full grid added to the \"slt\n   $at vs slt $v0\" section; floor entry retired.\n\n2. The `slt $at,$zero,$rN; beqz $at` entry guard cited by six archived\n   near-misses in code1_003b.c (\"b210 folds to blez or colours a named\n   register\"). It is a 64-bit compare: `if ((s64)0 < length)` where\n   `length` came from an lw is free (lw sign-extends) and reproduces the\n   guard exactly while the loop compare stays 32-bit; `schedule on`\n   fills the two delay slots retail fills (move a2 / addiu a1) and\n   `no_branch_likely on` keeps the body branch plain. Closed\n   func_003bcf10 and func_003bcfb0 (twins), 18/18 words each.\n   For a PARAMETER the cast costs dsll32/dsra32, so retail's source must\n   declare it s64; func_003b4230 is down to one word that way (its s32\n   counter compared against the s64 parameter would need an extension\n   retail does not have - still open).\n\nFull verify 6402 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.357748,"total_code":4387560,"matched_code":1375840,"matched_code_percent":31.357748,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7394,"matched_functions_percent":56.43844,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T08:40:10Z","commit_sha":"61c665355bb1dbce7d6b8887e405d57191c4eeb7","commit_message":"lanes: +3; 6400, four lanes killed by a provider rate limit\n\nTenth wave. 8 targets, 3 closed.\n\n- sdkChkmem.c func_0044f140: the nd1 body recovered from the previous\n  cut-off lane. The one word was a shared-tail join; split work/result\n  locals with `result = work` at the end of each arm and a single return,\n  under opt_propagation off. Closed in ten minutes.\n- code1_0048.c func_00484010 (nd42 -> 0): var_20 declared before\n  temp_19/temp_18 for s4; block-scoped src/dst in the copy loop; s32 loop\n  counters with s16 bounds.\n- datCalc.c func_00241bc0 (RDAT archive, \"raw-parameter lifetime plus\n  path/extension layout\"): closed with the rules written since -\n  `(u16)arg3` per-use narrowing, boolean flag via `(u32)(x != 0) != 0`\n  for sltu, `goto one; return 0; one: return 1;` tail, K&R definition\n  for the unused arg4, cached-pointer reload, scaled-offset local with an\n  integer-cast base.\n\nFour lanes (JoB/JoC/JoE/JoG) were killed by the model provider's rate\nlimit ~30 minutes in, leaving bodies live. Measured, archived and\nreverted by hand: 002b7cd0 (nd352), 0047ce00 (compile error), 00389370\n(nd203, 728/720), 0026fd90 (nd162). func_002e6630 reverted by its lane\nat nd120 (a1/v1 base colouring).\n\nFull verify 6400 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.354101,"total_code":4387560,"matched_code":1375680,"matched_code_percent":31.354101,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7392,"matched_functions_percent":56.423172,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T08:05:57Z","commit_sha":"13ff83ce9e4a517a3f77d67311b3321152667416","commit_message":"lanes: +2; six lanes cut off mid-work, all bodies archived and reverted\n\nNinth fresh wave. 8 targets, 2 closed before the lane pool was\ninterrupted; the other six were left live in the tree and were archived\nand restored by hand (5 MISMATCH, 1 COMPILE_ERROR at cutoff).\n\n- code1_001b.c func_001b15b0 (nd419 -> 0): cached +0x29C pointer in the\n  sole saved register, reload after calls instead of a second saved\n  local; func_00243e90 declared s16 (dsll32/dsra32 sign extension).\n- code1_0047.c func_0047eb20 (nd144 -> 0): direct pointer expressions for\n  s3/s2/s1, u16 status/target narrowing, reverse switch order.\n\nArchived at cutoff (bodies are the live state, unmeasured by the lane):\nIoA_00483a00 (compile error), IoB_002b6340 (nd132), IoD_00235110 (nd240),\nIoE_0038fb50 (nd262), IoG_002e5000 (nd288), IoH_0044f140 (nd1: only\nfour words differ, a genuine near-miss for the next lane on sdkChkmem.c).\n\nFull verify 6397 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.317999,"total_code":4387560,"matched_code":1374096,"matched_code_percent":31.317999,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7389,"matched_functions_percent":56.400276,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T06:55:58Z","commit_sha":"2edd9aba85a35b4f0123ff7012a175749b34a154","commit_message":"lanes: +3; one lane yielded with a live MISMATCH, reverted by hand\n\nEighth fresh wave with the full rule set. 8 targets, 3 closed.\n\n- shdPersona.c func_0011e490: explicit goto joins for the false-tail\n  layout, separate u16 pair locals, separate inner-loop counters for the\n  $t1/$a3 colouring, positive-count branch for the blez tail.\n- effGeometry.c func_00483e10 (nd128 -> 0): saved-register order for\n  s2/s1/s5/s0, u16 masked arg local, `temp_2 * 4 + temp_2 * 2` bound,\n  loop-entry init order (middle counter before indexed pointer).\n- y_draw.c func_002b6590 (nd416 -> 0): opt_propagation off + schedule off\n  + opt_common_subs off bracket (rematerialises both 2.0f divisors), s16\n  loop index copied through a named s32 offset with a comma-address\n  expression.\n\nLane defect: the evtMain.c lane yielded with func_002894b0 live at\nMISMATCH and no archive. Recovered the body from the jj operation log,\narchived it as HoA_002894b0_body.c, and restored evtMain.c exactly.\n\nAttempted, archived, reverted: func_00235320 (nd20), func_00458ce0\n(nd36), func_0033e5c0 (nd39, saved-register rotation), func_001b05d0\n(nd37).\n\nFull verify 6395 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.291378,"total_code":4387560,"matched_code":1372928,"matched_code_percent":31.291378,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7387,"matched_functions_percent":56.38501,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T05:48:56Z","commit_sha":"5cd652870c10ee172a2e0ce2bec55f99dfa22f17","commit_message":"lanes: +7; best wave of the campaign, 81.3%\n\nSeventh fresh wave with the full rule set. 8 targets, 7 closed.\n\n- evtMain.c func_0028aaf0: var_20/var_19 declaration order; s32 temp_18;\n  switch written 6, 0xA, 0x27, 0x2B, 0x24 for the reverse test order and\n  boolean tail; reversed comparison operands for the slt $at destination.\n- shdSprite.c func_0025ef20 (was annotated \"known load-sinking floor\",\n  nd9): bottom-test for loops, count fields reloaded rather than named,\n  split alignment/size arithmetic, `(u8 *)(i) + totalSize` for the addu\n  operand orientation.\n- code1_0012.c func_0012dea0: opt_loop_invariants on bracket (measured\n  removal nd383), reverse-written switch (tests 3,2,1,0), raw u8/u16\n  field widths.\n- effGeometry.c func_00482dc0 (nd255 -> 0): u16 masked arg local, loop\n  bound written `temp_2 * 4 + temp_2 * 2` for the sll/sll/addu order. No\n  COP2 in the target.\n- code1_0017.c func_0017c670 (704B): interleaved fixed-arity prototype for\n  func_00178c20, call-specific third prototype for the f15 copy order.\n- code1_0035.c func_00359400: opt_loop_invariants on bracket, s32 loop\n  counters with goto loop shape, direct f32-to-u16 casts for the\n  c.ole.s/bc1t/cvt/mfc1/andi sequence.\n- y_draw.c func_002b7f20 (archived WYDR as a \"preheader hoist + tail\n  layout wall\"): opt_loop_invariants on + schedule off + opt_propagation\n  off bracket, s16 copied loop index with a coalesced q/base expression for\n  the $a2/$a1/$v1 cascade; func_00461390's third parameter is void *.\n\nAttempted, archived, reverted: func_001187b0 (nd407, GoGtry37).\n\nFull verify 6392 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.251995,"total_code":4387560,"matched_code":1371200,"matched_code_percent":31.251995,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7384,"matched_functions_percent":56.36211,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T05:05:44Z","commit_sha":"8e4107bfe95785038c768b317789a90c712afda4","commit_message":"lanes: +5; 81.2%, two lane defects caught before commit\n\nSixth fresh wave with the full rule set. 8 targets, 5 closed.\n\n- evtMain.c func_00287d90 (nd399 -> 0): old-style four-parameter\n  definition (arg3 stays in $fp), var_18/var_17 declaration swap, u16\n  call_idx temporaries, s32 var_9 for cvt.w/mfc1 into $a5, fixed-s32\n  prototype for func_00269820, `while (var_17 < 4)` for the rotated loop.\n- code1_0012.c func_0012d410: opt_loop_invariants on + opt_propagation off\n  bracket, post-store counter ordering. New D_005E5810/5B60/5BB8.\n- code1_0035.c func_0035c480: opt_propagation off bracket, `arg1 & 0xFFFF`\n  temp, switch dispatch shape. New iGpffffa968/a96c.\n- code1_0021.c func_0021bbb0: interleaved float/GPR prototype for\n  func_00365f00, union float/int views for the colour locals. New\n  fGpffff84cc.\n- k_vpad.c func_004b5950 (720B): saved-register order for i/hasField,\n  u8 colour register rotation, aggregate stack layout.\n\nLane defects caught by the post-wave audit and fixed by hand:\n- code1_0012.c had been rewritten LF-only (2323 CRLF -> 0); restored to\n  all-CRLF. The pragma bracket lacked its measured justification, tripping\n  H003 twice; added the comment (push placed above it so the waiver sits\n  within decomp_lint's three-line site scope).\n- code1_0017.c lane had registered two alias GP symbols (fGpff8558,\n  iGpff8214) for addresses already named canonically; removed before it\n  reverted.\n\ndocs/matching.md: branch-only block at a loop entry = coalesced copy\n(`p = s0;` before an inner loop), measured; explains the 0028ad90 shape.\n\nAttempted, archived, reverted: func_001f5bd0 (nd12), func_00175f70\n(nd27), func_00157700 (nd489, 740B vs 688B).\n\nFull verify 6385 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.156816,"total_code":4387560,"matched_code":1367024,"matched_code_percent":31.156816,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7377,"matched_functions_percent":56.308678,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T04:22:46Z","commit_sha":"9ac205e867beb05ca17effa3582974986a369fdb","commit_message":"lanes: +5; 81.1%\n\nFifth fresh wave with the full rule set. 8 targets, 5 closed.\n\n- code1_001f.c func_001f6930 (704B, nd471 -> 0): reverse-written switch\n  order, opt_propagation off bracket with saved-register order, per-arm\n  caller-saved result copy, goto loop CFG, `<= 1` for the slti $at form.\n- code1_0010.c func_001036d0: fixed-arity local prototype\n  func_00450340(s64, void *) so the GP value materialises before the\n  format address. New iGpffff85c8 = 0x007616B8.\n- code1_0011.c func_00112610: aggregate Color4 stack ordering, named alpha\n  materialisation, ABI-shaped helper prototype for func_00113280.\n- code1_0012.c func_00125e80: FPU saved-register order f22/f21/f20,\n  float-first argument materialisation, s32 counter with sltiu. New\n  D_005E55E0, D_005E5610.\n- frFont.c func_00273cc0: no_branch_likely on + opt_rebuildconditionals\n  off bracket, union-backed stack-byte layout, s8 character normalisation.\n\nAttempted, archived, reverted: func_0028ad90 (nd2 - retail loads the\ninner-loop test into $a1 via a branch-only entry block that no plain\nwhile/for/do/for(;;)-break spelling reproduces; six spellings measured),\nfunc_0021de90 (nd5, $v1 vs $at compare), func_0017c010 (nd14).\n\nFull verify 6380 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.","measures":{"fuzzy_match_percent":31.087894,"total_code":4387560,"matched_code":1364000,"matched_code_percent":31.087894,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7372,"matched_functions_percent":56.270515,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T03:38:53Z","commit_sha":"a47c82af51a7c1be945d42fcfb45dfdee71af4b8","commit_message":"lanes: +3; CI green again\n\nFourth fresh wave with the full rule set. 8 targets, 3 closed.\n\n- code1_001f.c func_001f0620: `!call()` spelling for the sltu/xori boolean\n  normalisation at six negated-call returns; scoped\n  opt_rebuildconditionals off bracket for the branch layout.\n- code1_0016.c func_0016f3b0: opt_loop_invariants on inside push/pop for\n  the loop schedule; FPU declaration order temp_f0, temp_f4, temp_f3,\n  temp_f2.\n- mdlManager.c func_004746b0: named s32 scaled-offset local plus the\n  comma-address expression shape from matched func_00479e60 to get\n  retail's base-plus-index operand order.\n\nAttempted, archived, reverted: func_0021e9a0 (nd6, DgE9), func_00170f60\n(nd8, DoF), func_00271d10 (nd51), func_0014e950 (nd158), func_00110a60\n(nd10, D0H110A60ARCH).\n\nFull verify 6375 MATCH, 0 MISMATCH. TU count 166, both SHA1s OK.\nCI: free checks and proprietary build both green on the previous push\nafter the pragma_scope_audit restore and the rotated deps token.","measures":{"fuzzy_match_percent":31.016054,"total_code":4387560,"matched_code":1360848,"matched_code_percent":31.016054,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7367,"matched_functions_percent":56.23235,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-02T02:58:48Z","commit_sha":"d743240b56b6d1e366f8d0c9e291ceee17602b6b","commit_message":"ci: restore tools/pragma_scope_audit.py library API\n\nA lane in ykkwrxssmupy overwrote the module with an ad-hoc script that\ndropped lint()/main(); tests/test_pragma_scope_audit.py has errored on\nevery CI run since. Restored the file byte-identical to ykkwrxssmupy-.\nUnit suite: 0 errors; the 22 local compiler-dependent failures are the\ndocumented baseline and are skipped on CI.","measures":{"fuzzy_match_percent":30.975212,"total_code":4387560,"matched_code":1359056,"matched_code_percent":30.975212,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7364,"matched_functions_percent":56.20945,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-01T07:21:30Z","commit_sha":"6de995dfc070ad15354623bb2077adacc079204b","commit_message":"tools: make the AST permuter keep its best body; archive a score-28 candidate\n\ntools/permute_ast.py tracked best_fn/best_score across the whole search but\nonly ever wrote --out on an exact match, so every run that improved a\nfunction and then failed printed the number and threw the code away. That\nmakes the archive workflow in tools/permute_archived.py useless for exactly\nthe runs that made progress. It now writes the best body on exit whenever it\nbeat the base score, with a header recording score, base, seed and compile\ncount, and a warning that the output is raw permuter junk to be reduced with\ntools/permute_min.py.\n\ntools/permute_archived.py gained the matching --out passthrough.\n\nWhy it matters here: on func_001dea90 the AST back end goes from base 45 to\n28, and seed variance is large -- 90-second seeds produced 28, 37 and 43, and\na 600-second seed managed only 35. Short seeds run many times beat long ones,\nso discarding the good seeds was the dominant loss. Archived the best result\nas docs/probe_archive/PERM_001dea90_score28_body.c.\n\nMeasured this round, recorded so it is not repeated:\n  - text permuter (tools/permute.py) is exhausted for this class: across\n    func_00232c70 (2), func_00356170 (8), func_00178870 (4) and\n    func_0044ee70 (6) it improved zero base scores over multiple seeds, and\n    self-terminates in 60-160s regardless of --time.\n  - running six permuters concurrently is counterproductive: each spawns its\n    own parallel compiles, and the same seed that reaches 31 alone in 60s\n    reached only 44 when sharing the machine. Run them sequentially.\n  - the permuter score is finer-grained than normalized_diff; base 45 here\n    corresponds to the archive's recorded nd7.\n\nNo closures. verify.py holds at 6308/7866 first-party MATCH (80.2%), 0\nMISMATCH; decomp_lint 0 errors; src/ byte-identical to parent.","measures":{"fuzzy_match_percent":30.243393,"total_code":4387560,"matched_code":1326704,"matched_code_percent":30.237854,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7300,"matched_functions_percent":55.720936,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-01T06:31:48Z","commit_sha":"d665d50e32eede6bf6fb8683f72c58a9f32c361b","commit_message":"src: finish removing varargs-only prototypes; AST permuter now runs on 59/60\n\nFollow-up to the previous commit, which only handled `typedef int\n(*code)(...)`. 21 more files carried other varargs-only spellings, chiefly\n`extern void (*D_008873EC[])(...)` and live casts of the form\n`((void (*)(...))DAT_008873ec_abs[0])(x)`. All are opaque function-pointer\nforms; pycparser rejects a prototype whose only parameter is an ellipsis,\nso each one kept tools/permute_ast.py from parsing its translation unit.\n\nRewrote `)(...)` -> `)()` only. That pattern requires a closing paren\nimmediately before the ellipsis, so it cannot touch a genuine variadic like\n`(int, ...)`, which always has a comma first, nor the several `func_xxx(...)`\noccurrences that appear inside comments.\n\nEffect: a 60-file sample of sources containing unmatched functions goes from\nlargely AST-blocked to 59 parsing and 1 blocked. That matters because the\ntwo permuters are not interchangeable -- measured last commit on\nfunc_001dea90, text reached 44 from base 45 and stalled across three seeds,\nwhile the AST back end reached 37 and was still improving when its budget\nexpired.\n\nCodegen-neutrality proven again rather than assumed, and this round included\nlive casts rather than only a typedef: verify.py holds at 6308/7866\nfirst-party MATCH (80.2%) with 0 MISMATCH, and a full rebuild still produces\nloadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78 and\nSLUS_217.82 sha1 4eeec0360cf2715535d9f7e52eb69d786fb0158c. decomp_lint 0\nerrors.","measures":{"fuzzy_match_percent":30.237854,"total_code":4387560,"matched_code":1326704,"matched_code_percent":30.237854,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7300,"matched_functions_percent":55.720936,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-01T06:27:17Z","commit_sha":"41c96dc24e907b91b64700871ab8306373186837","commit_message":"src: replace the Ghidra `(*code)(...)` typedef so the AST permuter can run\n\n26 files carried `typedef int (*code)(...);`, a Ghidra-ism used only as an\nopaque function-pointer type in casts like `(code *)&func_001da2f0`. MWCC\ntolerates a varargs-only prototype; pycparser does not, and it was the sole\nreason tools/permute_ast.py aborted with CandidateConstructionFailure on\nthose translation units. Replaced with `typedef int (*code)();`.\n\nThis matters because the two permuters are not equivalent. Measured on\nfunc_001dea90 (nd7, btlAICommand.c), same archived body, same window:\n\n  tools/permute.py   (text) base 45 -> best 44, and seeds 2 and 3 moved it\n                     no further; runs self-terminate after 60-160s\n  tools/permute_ast.py      base 45 -> best 37 in 6741 compiles / 420s,\n                     still improving when the budget expired\n\nThat is consistent with the note in permute_ast.py's own docstring: text\nmutation cannot restructure code the way the AST passes do. The typedef was\nblocking the only permuter that helps.\n\nAlso measured, and the reason this was worth chasing: across six near-miss\ntargets the text permuter improved exactly zero base scores\n(func_00232c70 2->2, func_00356170 8->8, func_00178870 4->4,\nfunc_0044ee70 6->6), so the text back end is exhausted for this class.\n\nCodegen-neutrality is proven, not assumed: verify.py holds at 6308/7866\nfirst-party MATCH (80.2%) with 0 MISMATCH, and a full rebuild that\nrecompiled 27 objects still produces loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78 and SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c. decomp_lint 0 errors.\n\n31 files still contain other `(...)` spellings and remain AST-blocked; they\nwere left alone because they were not needed to unblock this run.","measures":{"fuzzy_match_percent":30.237854,"total_code":4387560,"matched_code":1326704,"matched_code_percent":30.237854,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7300,"matched_functions_percent":55.720936,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-01T06:07:59Z","commit_sha":"269adeeb501fdff8d55f91348cab25bd64720201","commit_message":"tools: permute_archived.py -- drive the permuter from the near-miss archive\n\ntools/permute_sweep.py discovers permuter targets by scanning for `#ifdef\nNON_MATCHING` bodies, which finds 86 functions. It cannot see the 829\narchived bodies for still-unmatched functions, because this tree holds 0\nMISMATCH by policy and those functions are bare INCLUDE_ASM in src/ with\ntheir best reconstruction living in docs/probe_archive/ instead. That is\nthe gap: the archive is full of nd2-nd9 candidates, which is precisely the\nresidual range a permuter is good at.\n\npermute_archived.py splices an archived body back in, drives the permuter,\nand always restores the source unless the permuter actually wins, so a\nlosing run can never leave a live non-MATCH body behind. Line endings are\npreserved (the tree is CRLF).\n\nBoth back ends are wired: tools/permute_ast.py by default, and\ntools/permute.py via --text for the common case where pycparser cannot\nparse the TU (reported as CandidateConstructionFailure).\n\nMeasured while validating:\n  func_00232c70  AST permuter reads base_score 2, agreeing with the\n                 archive's recorded nd2, then dies inside decomp-permuter's\n                 process_pragmas on an unbalanced `_permuter sameline`\n                 counter when it regenerates C. Pragma-bearing files need\n                 --text.\n  func_001dea90  text permuter ran 1828 compiles in 163s, improved\n                 base_score 45 -> 44, no match. Its own residual classifier\n                 reports 14x register-allocation/scheduling and 9x\n                 other/structural, consistent with the lane's finding that\n                 the remaining words are first-loop $a0/$a2 coloring.\n\nNo src/ changes; verify.py unchanged at 6308/7866, 0 MISMATCH.","measures":{"fuzzy_match_percent":30.237854,"total_code":4387560,"matched_code":1326704,"matched_code_percent":30.237854,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7300,"matched_functions_percent":55.720936,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-01T05:59:53Z","commit_sha":"6dbe6c645aa0811bfd5678f33d1c00bd66a0c881","commit_message":"archive: track the 1377 near-miss candidate bodies; fix probe_archive CRLF bug\n\nThe near-miss archive lived under build/, which .gitignore excludes, so the\ncampaign's most valuable accumulated asset was untracked and existed only on\none machine. 1377 files, 7.0 MB, 992 carrying measurement headers, and 829\nof them correspond to functions that are still unmatched -- i.e. 829 live\nleads, one disk failure from gone. This session already lost an IDA SDK\ncheckout and a plugin source to a /tmp wipe; same class of risk.\n\nMoved build/*_body.c{,.txt} -> docs/probe_archive/ and repointed the four\ntools that glob them (probe_archive.py, residual_census.py,\narchive_to_guard.py, recon_pool.py), including their docstrings and a stale\n\"build/probe_archive.py\" invocation inside residual_census.py.\n\nFixed a real latent bug found while smoke-testing the move: probe_archive.py\nread the source in default text mode and wrote it back with newline=\"\\n\".\nThe tree is CRLF, so its restore-in-finally silently rewrote every line of\nwhatever file a lane pointed it at -- a 2556-line whole-file diff on\ndatCalc.c. It now reads and writes with newline=\"\" and its INCLUDE_ASM regex\ntolerates a trailing carriage return. Restore is byte-exact, verified.\n\nWhy this matters beyond hygiene: the archive headers are load-bearing. This\nwave, build/D232_00232c70_body.c's header supplied the decisive fact for\nfunc_00232c70 (a u8 return makes both daddiu constants exact but moves\nallocation), which no amount of fresh probing had found, and several lanes\nre-tested spellings the headers already recorded as failures.\n\nNear-miss wave itself: 0 closures, all 8 targets reverted clean, but two\nimproved and are archived for the next attempt --\n  func_0034ac00  nd9 -> nd5  (entry = base + ((s32)(s64)(s16)counter << 9)\n                 closes 48/52; s16 bumped split closes 252/256)\n  func_001dea90  nd9 -> nd7  (second loop incl slt $at closed by reversing\n                 the comparison to `if (random > total)`)\nThe reversed-comparison lever came from the validated compare_destination\nexperiment in the mwccps2-debugger corpus; this is its first confirmation on\na real function. Also recorded, measured directly against our compiler:\nconstant materialisation never emits daddiu (return 1 / 1LL / (long long)1 /\ns64 return / 64-bit store all give addiu); only a 64-bit add with a register\noperand does. That retires a whole family of speculative width probes.\n\nVerification: decomp_lint 0 errors, pragma audit OK, verify.py 6308/7866\nfirst-party MATCH (80.2%), 0 MISMATCH -- unchanged, no src/ edits in this\ncommit.","measures":{"fuzzy_match_percent":30.237854,"total_code":4387560,"matched_code":1326704,"matched_code_percent":30.237854,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7300,"matched_functions_percent":55.720936,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-01T05:13:18Z","commit_sha":"8ebec3ddade3ccd08bb5ace0650a3827713d80e2","commit_message":"lanes: +7; add Ghidra decompile corpus covering all unmatched functions\n\nTwo things: a second reference corpus, and the wave that ran alongside it.\n\ntools/ghidra_headstart.py + docs/ghidra_headstart/ (1808 functions, 170\nfiles, 0 failures). Ghidra -- via the ghidra-emotionengine-reloaded\nextension already backing build/RECON_dis.py -- models the Emotion\nEngine's 128-bit world that Hex-Rays cannot. Concretely, on\nfunc_004aaee0 (effBlurFilter.c) Hex-Rays emits\n\n    __asm { sqc2 $0, 0($s3) }\n\nwith no type, no destination link and an ambiguous $0, while Ghidra emits\n\n    undefined1 auVar3 [16];\n    auVar3 = _sqc2(in_vf0);\n    *pauVar6 = auVar3;\n\ni.e. a typed 128-bit store tied to the same struct as the surrounding\nfields, indexed in 16-byte steps. From the Hex-Rays version you cannot\ntell this zeroes a quadword and would likely emit four 32-bit stores and\nnever match.\n\nCoverage effect: after the plugin work, 362 of 1562 functions in the\nHex-Rays corpus still had an __asm island. All 362 decompile cleanly under\nGhidra (0 unreadable; 117 use a real 128-bit type, 85 lift VU0/MMI as\nintrinsics), so every unmatched first-party function now has at least one\nclean decompiler reference. The corpus was then extended to all 1808 so\nboth references exist everywhere. Neither supersedes the other: Hex-Rays\nreads better for ordinary integer code, Ghidra for anything 128-bit.\n\nWave closures (+7), all verified independently then through the full link:\n- func_00203670 (code1_0020.c)  -- retail memset call func_0043f9c8 plus\n  void* helper arg; nd73 -> nd8 -> exact\n- func_001d41b0 (code1_001d.c)  -- stored-pointer load form\n  *(u16 *)(*(u8 **)(result+4)+8) reproduced retail's address schedule\n- func_00474ba0 (mdlManager.c)  -- opt_propagation off + local struct layout\n- func_00269c70 (mt_sceneFunc.c) -- opt_propagation off, absolute globals\n- func_0026c190 (mt_sceneFunc.c) -- opt_propagation off + field temporaries\n- func_0021b1f0 (code1_0021.c)  -- opt_loop_invariants + declaration order\n- func_0036fbe0 (btlShuffle.c)  -- declaration/type shaping for callee-saved\n  coloring and sign-extension schedule\n\nEvery lane again reported the cleaned structure as correct; all failures\nwere compiler floors (register coloring, addiu-vs-daddiu width, store\nscheduling), never misread logic. Near-misses banked: func_00209870 nd6,\nfunc_0025f110 nd8, func_001dea90 nd9.\n\nVerification: decomp_lint 0 errors, pragma audit OK, verify.py 6308/7866\nfirst-party MATCH (80.2%), 0 MISMATCH, loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78 OK, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c OK.","measures":{"fuzzy_match_percent":30.237854,"total_code":4387560,"matched_code":1326704,"matched_code_percent":30.237854,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7300,"matched_functions_percent":55.720936,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-01T04:30:09Z","commit_sha":"839b9661c10a41f98a49c6d9b75e9e82863f12d9","commit_message":"lanes: clean-corpus wave, +3\n\nFirst wave run against the corpus regenerated with the fixed Hex-Rays\nplugin. Targets were selected specifically for pseudocode that is now\n100% island-free, which earlier waves never had.\n\nClosures (each independently verified, then full link+SHA1):\n- func_00265f40 (src/cldDayChange.c) -- closed with measured\n  opt_loop_invariants on/off; loop-invariant hoisting produced the exact\n  FPU/address schedule for the 272B window.\n- func_001f0c50 (src/promoted/code1_001f.c) -- closed with measured\n  opt_loop_invariants plus explicit one=0x10000>>16 and declaration order.\n- func_0018f7b0 (src/promoted/code1_0018.c) -- closed with integer-address\n  locals, bottom-test loops and measured opt_propagation off to preserve\n  the shared invariant-one register.\n\nEvery lane reported the cleaned IDA structure as structurally correct;\nall non-closures were compiler floors (register coloring, call-argument\nsetup order, addiu-vs-daddiu width), not misread logic. Notable\nnear-misses recorded for future work: func_00232c70 nd2 (datCalc.c,\naddiu vs daddiu only), func_0044ee70 nd6 (sdkChkmem.c, store-vs-argument\norder), func_001f39d0 nd8.\n\nTwo lanes left live non-MATCH bodies against the contract and were\nreverted manually (func_003cad90 in rprandom_grouped.c, func_00144b80 in\ncode1_0014.c); both files are byte-identical to parent.\n\nAlso vendored tools/ida_plugin/ida-emotionengine.py (oct0xor) for COP2/VU0\ndisassembly: cop2 previously decoded as a raw word, now reads as real VU0\nvector instructions. It improves readability only -- Hex-Rays still cannot\nmodel VU0, so those stay islands. Confirmed no decompiler regression.\nREADME records the survey of other PS2 IDA plugins and why they do not\napply.\n\nVerification: decomp_lint 0 errors, pragma audit OK, verify.py\n6301/7866 first-party MATCH (80.1%), 0 MISMATCH, loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78 OK, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c OK.","measures":{"fuzzy_match_percent":30.187166,"total_code":4387560,"matched_code":1324480,"matched_code_percent":30.187166,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7293,"matched_functions_percent":55.667507,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-01T03:28:04Z","commit_sha":"1c897180121823f21738e302d2f2d17e4d4ea9f8","commit_message":"tools: fix the biggest Hex-Rays defect (sq/lq spills) via plugin; regen corpus\n\nObtained the IDA SDK (open source, github.com/HexRaysSA/ida-sdk, tag\nv9.4.0-sdk.1 == installed IDA) into ~/ida-sdk, added a CMake build under\ntools/ida_plugin, and fixed the largest remaining pseudocode defect.\n\nsq/lq callee-saved spills -- FIXED. This was the biggest one: 5100 of the\nbinary's functions contain sq/lq and 5099 of those decompiled with an\n__asm island, and it was not cosmetic (sampling 400 sq/lq-only functions,\nthe island intruded into the body in 260, i.e. 65%).\n\nTwo earlier attempts had failed by trying to LIFT these into microcode,\nwhich crashes Hex-Rays with MERR_INTERR (239 crashes over 1725 functions)\nbecause analyze_prolog() runs first and builds a frame-slot-width model\nfrom the raw dt_byte16 operand that the filter then contradicts. Lifting\nis the wrong goal: a callee-saved spill has no meaning in C and should be\nELIDED like any ordinary `sd $s0,off($sp)` save. Marking the instruction\nIM_PROLOG/IM_EPILOG via the \"$ ignore micro\" netnode sidesteps the prolog\nanalyzer's model instead of contradicting it. Pairing is conservative --\nonly a `sq $r,off($sp)` with a matching `lq $r` at the same offset -- so a\nsq doing real work mid-body is never marked. Decoded from the raw\ninstruction word, so it does not depend on r5900 itype numbering.\n\nAlso fixed MMI pcpyld/pcpyud: these were failing silently because\nstore_operand() does not reach these destinations, so apply() returned\nMERR_INSN and Hex-Rays fell back to the very island it should remove.\nWriting the destination via reg2mreg() fixes it.\n\nMeasured, mandatory before/after control over the whole affected\npopulations (both baselines 0 failures):\n  MMI    (142 fns): 142 ok, 0 fail, islands 142 -> 139\n  sq/lq (5085 fns): 5085 ok, 0 fail, islands 810 -> 555\nCorpus regenerated: 1562 functions, 76.8% now fully clean.\n\nNOT SHIPPED (second measured negative result, kept and documented): a\nfilter for EE pipeline-1 (mult1/div1/mfhi1...), MMI bitwise\n(pand/por/pxor/pnor) and VU0 moves (qmtc2/qmfc2). Every subset regressed\nthe decompiler, bisected in three stages (12/51, 12/44, 6/38 failures;\n0/0 with it disabled), and the \"reads consume never-written kregs\" theory\nwas tested and disproved -- making all reads lookup-only did not move the\ncounts. install_microcode_filter for it is commented out.\n\nRepaired the IDB along the way: concurrent idalib sessions corrupted it\n(open rc 4, hexrays init false); rebuilt from the ELF, 12397 functions.\n\nNo src/ changes; first-party MATCH unchanged at 6298/7866, 0 MISMATCH.","measures":{"fuzzy_match_percent":30.170391,"total_code":4387560,"matched_code":1323744,"matched_code_percent":30.170391,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7290,"matched_functions_percent":55.644608,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-09-01T02:11:31Z","commit_sha":"aa121bb48b7fb2e24e28d912e1ce0ed469c73ee7","commit_message":"tools: preserve EE Hex-Rays lifter source in-repo; MMI findings\n\nThe built ee_mac_lifter.so was installed with its only source copy in\n/tmp, which was then wiped -- a live binary with no recoverable source.\nSource reconstructed and moved into the repo so that cannot recur.\n\nMMI/128-bit investigation (the gap that leaves pcpyld as an __asm island):\n- discovered MMI itypes empirically (pcpyld=0x171, 639 occurrences, the\n  dominant MMI op; operands are dt_qword, so unlike sq/lq they carry no\n  analyze_prolog frame-width hazard)\n- pcpyld/pcpyud modelled with real microcode: validated on func_003a29f0,\n  where `_$V0 = -2; __asm { pcpyld $v0,$zero,$v0 }` became the real\n  logic `v11 &= ~1uLL; / else / v11 |= 1u;`\n- a second tier emitting all other MMI as intrinsic helper calls REGRESSED\n  the decompiler and was deleted, not shipped. Controlled measurement over\n  all 153 MMI-containing functions:\n      without plugin  : 153 ok,  0 failed\n      with helper tier:  82 ok, 71 FAILED\n  The regressed .so has been removed from ~/ida-pro-9.4/plugins; the\n  decompiler is back to 153 ok / 0 fail. A before/after control run is now\n  documented as a mandatory acceptance test and shipped as\n  tools/ida_plugin/ee_lifter_acceptance.py.\n\nsq/lq measurement (recorded because it reprioritises the work): this, not\nMMI, is the largest remaining pseudocode defect -- 5100 functions contain\nsq/lq vs 153 containing MMI, and of 400 sampled sq/lq-only functions the\nasm island intrudes into the function body in 260 (65%), so it is not just\nprologue/epilogue noise. Prior attempts failed by trying to LIFT these;\nthe untried and more promising approach is to ELIDE them via\nset_ignore_micro/IM_PROLOG/IM_EPILOG, which sidesteps analyze_prolog's\nwidth model rather than contradicting it. Not prototypable from idalib\n(IM_* absent from the Python API); needs the C++ SDK, which is not shipped\nwith IDA and was lost in the same wipe.\n\nNo src/ changes. Tree verified at 6298/7866 first-party MATCH (80.1%),\n0 MISMATCH, unchanged from parent.","measures":{"fuzzy_match_percent":30.170391,"total_code":4387560,"matched_code":1323744,"matched_code_percent":30.170391,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7290,"matched_functions_percent":55.644608,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T22:34:17Z","commit_sha":"c79dfb1554449f2368fe9f271237ad76802f5733","commit_message":"lanes: s128 technique closure, +1\n\nApplied the session's newly-validated __int128/s128 technique to two\nsibling \"128-bit-slot\" functions sharing func_003130e0's exact retail\npattern (documented in the file's floor notes).\n\n- fclCombineMisc.c func_003133b0: closed. Local `typedef signed __int128\n  s128` for the 16-byte sq/lq slot, narrowing (s64) cast for the actual\n  compare, plus source-shaped continue/masked-u16 update matching. Object\n  724B, window 736B, normalized_diff 0.\n- fclCombineMisc.c func_00312220: not closed. Real progress documented in\n  the floor note (nd381 -> nd97 using the same technique); remaining\n  residual is register-allocation/control-flow layout, not the type\n  spelling. Cleanly reverted to bare INCLUDE_ASM with an updated note.\n\nOne lint fix applied during verification: the closed function's initial\nform used `register u16 *input;` (H008: banned register storage-class\nhint). Removed it, confirmed the function still MATCHes and decomp_lint\nreturns 0 errors.\n\nGPREL16 cross-checked: iGpffffb3d4 (multiple offsets) and DAT_007644c4\nalias both retail_imm 0xb3d4, matching.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings (unchanged).\ntests.test_pragma_audit: OK.\nFull verify.py: 6298/7866 first-party MATCH (80.1%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":30.170391,"total_code":4387560,"matched_code":1323744,"matched_code_percent":30.170391,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7290,"matched_functions_percent":55.644608,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T21:52:31Z","commit_sha":"8cf6268c4bf126f902712e83368e9fdad8c63de0","commit_message":"recon: correct outdated 128-bit-slot floor notes in fclCombineMisc.c\n\nThree archived floor-note comments (func_00312220, func_003130e0,\nfunc_003133b0) claimed 'no legal C data-size spelling' / 'u_long128 read-\nback still lowers through a scalar load' for the 128-bit sq/lq slot\npattern. That was wrong: typedef signed __int128 s128 (the real, working\ntechnique, already proven elsewhere in this tree and documented in this\nsession's docs/matching.md correction) genuinely lowers to lq/sq.\n\nUpdated all three notes to record the corrected technique and, for\nfunc_003130e0 specifically, two focused attempts this session that used\nit to reduce the residual from nd528/541 down to nd163 (712B vs 720B, 63\ndiffering words, a register-allocation/control-flow residual, not a\ntype-spelling wall) without reaching an exact MATCH - left as bare\nINCLUDE_ASM per policy, but flagged as worth another attempt rather than\na genuine floor.\n\nComment-only change: marker count, INCLUDE_ASM lines, and all function\nbodies are byte-identical; confirmed via diff line-count check on marker/\nINCLUDE_ASM lines (0) and unchanged scoped lverify (5 MATCH, 6 ASM, 0\nMISMATCH/COMPILE_ERROR/SIZE_MISMATCH).","measures":{"fuzzy_match_percent":30.153616,"total_code":4387560,"matched_code":1323008,"matched_code_percent":30.153616,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7289,"matched_functions_percent":55.636974,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T21:18:04Z","commit_sha":"148dc129f208c6f94405d92d83b8df02d83cdfb8","commit_message":"docs: correct outdated 128-bit lq/sq floor claim; __int128 works\n\nThe 'no genuine 128-bit type in this repo... reaching these needs a real\nquadword type first' claim was factually wrong: mwccps2.exe recognizes\n__int128 (confirmed via compiler-binary string extraction and a direct\ncompile probe emitting exactly lq/sq for a same-size load/store), and\nthree functions already MATCH on this exact shape using a locally-declared\ntypedef signed __int128 s128 (effBlurFilter.c func_004ab3f0/func_004ab930,\nevtPolygonMovie.c, shdSprite.c) - the doc simply never got updated after\nsomeone solved it.\n\nFound the limitation by direct probe: __int128 supports assignment\n(scalar/array/struct-field/param/return) but not == or relational\ncomparison (illegal data size). This matches retail's actual pattern:\nwhat looks like a 128-bit compare is never a real 128-bit compare, only\na fast 16-byte lq/sq block move followed by a narrower scalar reload\nand ordinary compare.\n\nApplied the technique to func_003130e0 (Event/Fcl/fclCombineMisc.c,\ndocumented this session as a '128-bit slot wall' floor, previously stuck\nat nd481 using a scalar-alias workaround). Real structural progress: the\ns128 store plus (s64)-cast compare reproduces retail's exact sq/lq/bne\ninstruction shape and exact -0xB0 stack frame with correct register\ncoloring, reducing the residual to a control-flow/call-argument-order\nshape (nd328) - did not reach full MATCH, reverted to bare INCLUDE_ASM\nper policy (never leave a live MISMATCH in the tree). Documented as\ngroundwork for a future attempt, not a closure.\n\nNo source changes beyond the doc correction; fclCombineMisc.c confirmed\nbyte-identical to its jj parent.","measures":{"fuzzy_match_percent":30.153616,"total_code":4387560,"matched_code":1323008,"matched_code_percent":30.153616,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7289,"matched_functions_percent":55.636974,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T20:16:07Z","commit_sha":"1eaf490b27ff25c1eb2d2aa86fbecb5faa636693","commit_message":"lanes: near-miss closure wave 2, +1\n\nSecond fndiff-guided near-miss wave. 5 targets attempted, 1 closed.\n\n- k_texStrip.c func_00190680: same argument-materialization lever as its\n  sibling func_001909f0 (u32 casts on two spill slots across both\n  func_003deff0 call sites) - nd20 -> 0.\n\nThe other 4 (k_texStrip.c func_00190920, btlPanelAnalyze.c func_00218ea0,\nbtlResultSimple.c func_0021ed10, code1_0034.c func_0034ac00) were each\ngiven a focused, lever-guided attempt (call-argument scheduling,\nsaved-register coloring, digit/slti polarity, loop-counter width shaping)\nand confirmed as genuine compiler floors matching matching.md's documented\ncategories; all cleanly reverted to bare INCLUDE_ASM.\n\nEvery GPREL16 relocation checked; func_00190680's final body has none\n(only R_MIPS_26 calls).\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings (unchanged).\ntests.test_pragma_audit: OK.\nFull verify.py: 6297/7866 first-party MATCH (80.1%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":30.153616,"total_code":4387560,"matched_code":1323008,"matched_code_percent":30.153616,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7289,"matched_functions_percent":55.636974,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T19:38:43Z","commit_sha":"c06e816d2cad6a880effd83f4f13372881570d16","commit_message":"lanes: near-miss closure wave, +3\n\nPivoted method: instead of cold-start disassembly reconstruction, targeted\n6 specific functions with small known nd residuals (4-57) discovered by\nearlier waves this session, using fndiff.py's row-level output to identify\nthe exact matching.md lever for each residual shape.\n\n- k_texStrip.c func_001909f0: argument-materialization order - casting two\n  spill slots to u32 in a 5-argument call reordered the load-before-move\n  sequence to match retail (nd10 -> 0).\n- y_CmbCardEff.c func_0033fb90: pointer-typed displacement staging through\n  a u32 destination forced retail's address-before-float evaluation order\n  (nd8 -> 0).\n- btlResultSimple.c func_0021f340: explicit destination pointer + direct\n  lvalue store/test broke a saved-register coloring conflict and forced\n  retail's address-materialization order (nd57 -> 0).\n\n3 of 6 targets closed; the other 3 (k_texStrip.c func_001916a0, mdlSE.c\nfunc_0047e450, frFontRaster.c func_00275a60) confirmed as genuine\ndocumented compiler floors (call-argument setup order, saved-register\ncoloring cycle) after focused lever attempts, cleanly reverted.\n\nOne integrity fix applied by the orchestrator: one lane left a live\n#ifdef NON_MATCHING candidate body in mdlSE.c instead of reverting to\nbare INCLUDE_ASM as this wave's instructions required (the repo's actual\nbaseline there was bare ASM, not a pre-existing grandfathered NONMATCHING\nbody as the lane's assignment text assumed) - reverted to exact parent.\n\nEvery GPREL16 relocation across all 3 closures independently cross-checked\nagainst its own scoped-verify retail_imm; none mismatched.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings (unchanged).\ntests.test_pragma_audit: OK.\nFull verify.py: 6296/7866 first-party MATCH (80.0%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":30.1383,"total_code":4387560,"matched_code":1322336,"matched_code_percent":30.1383,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7288,"matched_functions_percent":55.62934,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T19:06:48Z","commit_sha":"d601640759bb34b3a0a264b23f637c568660052e","commit_message":"docs: record 60-knob pragma sweep negative results (zero closures)\n\nRediscovered docs/matching.md's referenced tools/knob_sweep.py no longer\nexists in this tree; replicated its technique directly (strings -a on the\nmwccps2.exe binary + tools/pragma_audit.py's warn_illpragma probe helper)\nto find 60 previously-unswept base pragma names (120 on/off spellings)\nbeyond the 9 already proven in this tree.\n\nSwept all 120 spellings against 8 representative documented floors, one\nper distinct floor pattern (scheduler-residual delay-slot addu, 128-bit\nsq/lq slot compare, COP1 adda/madd/msub chains, two saved-register-\nrotation floors, FPU-accumulator, VU0/COP2 s128 canonicalization,\nregister/schedule/quad-shape) - 960 total compiles, dispatched across 8\nparallel investigation lanes, every tracked source file verified\nbyte-identical to jj parent both during and after the sweep.\n\nZero exact matches. Recorded as exhausted for these 8 floor categories so\nthe sweep is not blindly re-run. Notable findings: opt_pointer_analysis on\ncrashes mwccgap; opt_generateconditionalassignments on triggers an MWCC\ninternal compiler error (InstrSelection.c:3893); opt_repositioncode/\nopt_rotateloops on give real but function-specific, non-generalizing\nnd swings in both directions; the remaining ~53 base names have zero\nmeasurable effect on any of the eight probes.\n\nNo source changes; this is documentation of a completed negative-result\ninvestigation.","measures":{"fuzzy_match_percent":30.11241,"total_code":4387560,"matched_code":1321200,"matched_code_percent":30.11241,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7285,"matched_functions_percent":55.60644,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T18:21:26Z","commit_sha":"8aa50ce133bad9e4fce83afbbddba1f6584eca14","commit_message":"lanes: wave 43, +3\n\nSecond density-rescan wave focused on genuinely fresh files (excluding\nthe large low-density files exhaustively probed in waves 33-41). 16 lanes\neach covering 3-4 small/medium files; heavy floor density confirmed across\nmost of this band (COP1 MAC chains, VU0/s128 canonicalization, saved-\nregister rotation - all documented per-function in matching.md's existing\nfloor taxonomy).\n\n- cmpPersona.c: func_001370e0, func_001371a0\n- k_fldMipmap.c: func_0018bfb0\n\nOne integrity fix applied by the orchestrator: LaneW43_12 closed\ncmpPersona.c's func_001371a0 with a load-bearing `#pragma opt_loop_invariants\non/off` pair but positioned its measured-justification comment 79 lines\naway (attached to a different, earlier pragma) rather than within 3 lines\nof the actual pragma site, tripping decomp_lint's H003 banned-pragma check.\nVerified the pragma is genuinely load-bearing (removing it produces\nMISMATCH) and added a correctly-positioned measured comment for both the\non and off pragma lines; confirmed function still MATCHes and lint is\nclean.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings (unchanged).\ntests.test_pragma_audit: OK.\nFull verify.py: 6293/7866 first-party MATCH (80.0%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":30.11241,"total_code":4387560,"matched_code":1321200,"matched_code_percent":30.11241,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7285,"matched_functions_percent":55.60644,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T17:14:31Z","commit_sha":"c2bf74f6581c6632eb6e1b3e5b72b70cbcefade5","commit_message":"lanes: wave 42, +9\n\nFirst wave using the new per-file MATCH-density rescan method against\npreviously-attempted-but-not-closed functions (revisit pass, not limited\nto never-touched targets), 20 lanes each covering 3-6 small/medium files.\n9 closures across 8 files.\n\n- code1_0010.c: func_00104510\n- code1_0011.c: func_00110960\n- code1_001d.c: func_001d6ad0\n- code1_001f.c: func_001f56d0\n- code1_0027.c: func_00270100\n- code1_0029.c: func_00296720\n- code1_0038.c: func_0038b530\n- k_fldLmap.c: func_00188690, func_001887f0\n\nOne integrity fix applied by the orchestrator mid-wave: LaneW42_9's\nfunc_002b3720 candidate in code1_002b.c broke the whole-file compile\n(calling func_002b1260/func_002b1320 with 1 argument against their 2-param\nextern prototypes - a genuine reconstruction bug, not a compiler quirk);\ndiagnosed by binary-isolating the two new bodies and reverted before the\nlane's own final check. Second integrity fix: LaneW42_8 mistakenly deleted\ntwo pre-existing grandfathered `#ifdef NON_MATCHING` guarded candidate\nbodies in itfMesManager.c instead of restoring them exactly on revert;\nrestored to exact parent state.\n\nEvery GPREL16 relocation across all 9 closures independently cross-checked\nby the orchestrator against its own scoped-verify retail_imm; none\nmismatched. Several more pre-existing (not introduced this wave) GP-symbol\nlow-16/retail_imm deltas were flagged informationally by lanes\n(code1_0034.c fGpffff8504, code1_0045.c D_008872F8) - not acted on this\nwave since full build SHA1s remain green and these predate this session's\nchanges to those files; worth a dedicated audit pass later.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings (unchanged).\ntests.test_pragma_audit: OK.\nFull verify.py: 6290/7866 first-party MATCH (80.0%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":30.056614,"total_code":4387560,"matched_code":1318752,"matched_code_percent":30.056614,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7282,"matched_functions_percent":55.58354,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T16:27:28Z","commit_sha":"a2b7e3c47e6f9b2f8457e63c132b38aed6d1c4a8","commit_message":"docs: record the per-file MATCH-density rescan targeting method\n\nWaves 33-40 discovered that recon_queue.json (the original candidate list\nthis campaign dispatched against) predated and undercounted the tree's\nfirst-party ASM set by 500+ functions. Rebuilding the target list every\nwave from a fresh full verify.py report, grouped by file and sorted by\nMATCH density, closed 400+ never-before-attempted functions that the\nqueue-driven method had never surfaced. Documented the recipe, the\nsibling-lane-on-shared-file coordination protocol for large low-density\nfiles, and the bottom-out signal (below ~25% density with no fresh names\nleft) for recognizing a file has become genuine floors.\n\nNo source changes; wave 41 (dispatched same session) found this backlog\nalready near-exhausted and closed 0 new functions after two independent\nattempts on the remaining 8 files, confirming the bottom-out signal.","measures":{"fuzzy_match_percent":29.948309,"total_code":4387560,"matched_code":1314000,"matched_code_percent":29.948309,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7273,"matched_functions_percent":55.514847,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T10:52:38Z","commit_sha":"2b96220e1ab148ca3166971dad8aba7b4b38bdf9","commit_message":"lanes: wave 40, +7\n\nSecond wave against the high-density backlog, this time including several\nhuge low-density files split into A/B sibling lanes on the same file\n(code1_0020.c, code1_003b.c, code1_003c.c, code1_003e.c) coordinating via\nhub before each edit. 20 lanes; 7 closed.\n\n- code1_0020.c: func_0020b5b0\n- code1_0022.c: func_0022bad0\n- code1_0036.c: func_00362630\n- code1_0038.c: func_00389cb0\n- code1_003b.c: func_003bba90\n- code1_003c.c: func_003cbde0\n- k_fldUnit.c: func_00162c30\n\ncode1_0013.c, code1_001c.c, code1_003e.c (both halves), code1_0039.c,\ncode1_0013.c, sdkUttmx.c, code1_001a.c, y_fclShopDraw.c, y_fclCombine.c,\ny_fclCombineDraw.c, cmmRankUp.c: all attempted, cleanly reverted to bare\nINCLUDE_ASM. One post-lane integrity fix applied by the orchestrator:\ncode1_003e.c had a cosmetic marker/blank-line drift (NONMATCHING suffix\ndropped, one blank line lost) left by a reverted probe on func_003e2750 -\nrestored exactly to parent form (0 net source diff for that file).\n\nEvery GPREL16 relocation across all 7 closures independently cross-checked\nby the orchestrator against its own scoped-verify retail_imm; none\nmismatched. Two pre-existing informational flags noted for future\ninvestigation (not part of this wave's changes, no action taken):\nfunc_0039b380 (code1_0039.c) has two GP-relative symbols whose registered\nlow-16 (iGpffffb5dc/iGpffffb5e0) differ from a lane's reported scoped\nretail_imm (b5ec/b5f0) - needs the wave-27-style full-link verification\nbefore concluding it is a real defect, since the function is already\nMATCH and full build SHA1s are green this wave.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings (unchanged).\ntests.test_pragma_audit: OK.\nFull verify.py: 6281/7866 first-party MATCH (79.8%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":29.948309,"total_code":4387560,"matched_code":1314000,"matched_code_percent":29.948309,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7273,"matched_functions_percent":55.514847,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T10:02:00Z","commit_sha":"326216ef2ead490a35d5136bf35e7f33a15c81bd","commit_message":"lanes: wave 39, +15\n\nFirst wave against the newly-discovered high-density backlog (725\ncandidates across 45 files that predate/exceed recon_queue.json's original\ncoverage). 20 lanes dispatched; 15 closed, all cleanly reverted where not\nclosed.\n\n- code1_0012.c: func_001221a0, func_00123e80\n- code1_0014.c: func_00141d80\n- code1_0015.c: func_0015b240\n- code1_0018.c: func_00185150\n- code1_0019.c: func_00192cd0\n- code1_001b.c: func_001b1b30\n- code1_001d.c: func_001d5b20\n- code1_001e.c: func_001ee250, func_001ef4d0, func_001ef5f0\n- code1_0021.c: func_00213d20, func_0021b330\n- code1_0046.c: func_00462bf0\n- shdPersona.c: func_0011dd50\n\ncode1_0017.c, code1_0026.c, code1_0035.c, code1_0045.c, code1_0048.c,\ncode1_001f.c, datCalc.c, mdlManager.c, y_draw.c: all attempted, cleanly\nreverted to bare INCLUDE_ASM (register-allocation/scheduling floors on\nthis pass).\n\nEvery GPREL16 relocation across all 15 closures independently cross-\nchecked by the orchestrator against its own scoped-verify retail_imm;\nnone mismatched.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings (unchanged).\ntests.test_pragma_audit: OK.\nFull verify.py: 6274/7866 first-party MATCH (79.8%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":29.895796,"total_code":4387560,"matched_code":1311696,"matched_code_percent":29.895796,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7266,"matched_functions_percent":55.461414,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T09:10:46Z","commit_sha":"0b87610baf4e8cb6ae90b5d3629133f3a67fa379","commit_message":"lanes: wave 38, +3\n\nContinuing the file-local-sibling-context reconstruction method. 6 lanes,\nall reported cleanly this wave (no lost job records).\n\n- k_fldFrame.c func_0016b260 MATCH.\n- frFont.c func_002746e0 MATCH.\n- code1_0016.c func_0016f130 MATCH (func_0016bdd0, the documented direct-\n  scratchpad hardware function in this same file, correctly left untouched).\n\nsdkWrap.c func_00466c60, k_encount.c func_00161bb0, k_fldFrame.c's other\ntargets, frFont.c's other 8 targets, and code1_0016.c's other 5 targets\nwere attempted and cleanly reverted to bare INCLUDE_ASM (register-\nallocation/scheduling floors).\n\nEvery GPREL16 relocation across all 3 closures independently cross-checked\nby the orchestrator against its own scoped-verify retail_imm; none\nmismatched.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings.\ntests.test_pragma_audit: OK.\nFull verify.py: 6259/7866 first-party MATCH (79.6%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":29.735342,"total_code":4387560,"matched_code":1304656,"matched_code_percent":29.735342,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7251,"matched_functions_percent":55.34692,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T08:26:07Z","commit_sha":"48c6fb85b15a441db9d301754b2a2772cc08c48c","commit_message":"lanes: wave 37, +9\n\nContinuing the file-local-sibling-context reconstruction method. 19 lanes\ndispatched; 2 hit a backend outage before writing anything (confirmed no\nfile changes from those two), the remaining 17 attempted real work but\nonly 7 of those 17 lanes' final self-reports were retrievable (job\nrecords expired and the agents were not discoverable in the artifact\nregistry for the other 10 -- same class of issue as wave 36).\n\nIndependent verification of the full working tree found 6 real closures\nplus 3 more from the retrievable lane reports, and 25 real MISMATCH\nscattered across 10 files (some files mixing a genuine closure with a\nbroken sibling target in the same file). Every MISMATCH was individually\nreverted to its exact bare INCLUDE_ASM/original-comment form; five files\nneeded surgical per-function reverts (rather than whole-file restore) to\npreserve a genuine closure sitting next to a broken one in the same file,\nincluding removing now-orphaned extern declarations and restoring one\nincidentally-touched brace style on an unrelated, untouched function.\n\n9 closures across 7 files: cmpEquip.c func_001312b0 and func_00134560,\nsdkChkmem.c func_0044eaa0, y_fclItemShopDraw.c func_0033bf90,\nk_fldResource.c func_00150970, k_vpad.c func_004b5c60, code1_0010.c\nfunc_00102780 and func_00103a60, fclBankManager.c func_002e12e0.\n\nEvery GPREL16 relocation across all 9 closures independently cross-checked\nby the orchestrator against its own scoped-verify retail_imm; none\nmismatched this wave.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings.\ntests.test_pragma_audit: OK.\nFull verify.py: 6256/7866 first-party MATCH (79.5%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":29.703617,"total_code":4387560,"matched_code":1303264,"matched_code_percent":29.703617,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7248,"matched_functions_percent":55.32402,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T07:27:58Z","commit_sha":"d224ac1edbe450f65ed2b84eb2b37cba09a3de91","commit_message":"lanes: wave 36, +1\n\ncode1_0037.c: func_00370290 MATCH (fresh reconstruction from retail\ndisassembly and Ghidra decompile).\n\nnLine.c: cleanup only, no matching change -- removed a stale pre-existing\n`#ifdef NON_MATCHING` scaffold body for func_0034bea0 left over from an\nearlier session; the function was already and remains a bare INCLUDE_ASM\nfallback.\n\n8 of 16 lanes this wave left broken candidates in the tree without\nreverting (results unretrievable: job records expired and the agents were\nnot discoverable in the artifact registry, so no self-report could be\nrecovered). Independent verification found: code1_0011.c with 46\nCOMPILE_ERROR entries across the whole file (an undefined-identifier\nscoping bug broke every downstream function, not just the assigned\ntargets); real MISMATCH left in Kernel/mc.c (func_002a4d10),\ncldDayChange.c (func_00266050), cmmMisc.c (3 functions), frFontRaster.c\n(2 functions), code1_0031.c (2 functions), code1_0044.c (2 functions),\nand code1_0047.c (1 function). All 8 files restored via\n`jj restore --from @-` to the exact wave-35 parent revision.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings.\ntests.test_pragma_audit: OK.\nFull verify.py: 6247/7866 first-party MATCH (79.4%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":29.571972,"total_code":4387560,"matched_code":1297488,"matched_code_percent":29.571972,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7239,"matched_functions_percent":55.255325,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T06:48:05Z","commit_sha":"845ea60f2b5c75bc7a5206584e6fff7a7f1f7ac6","commit_message":"lanes: wave 35, +9\n\nContinuing the file-local-sibling-context reconstruction method. 20 lanes,\n9 closures across 9 files:\n\n- sdkFiler.c func_004685c0, evtEffect.c func_00291080 (corrected a dead,\n  unused, mis-derived iGpffff5848 extern to the retail-correct iGpffffa7b8\n  -- confirmed via grep that the old symbol had zero references anywhere\n  else in the tree before removal), eff_afpack.c func_004b6900,\n  code1_0049.c func_00492b20 (uses legitimate sqc2 VU0 quadword-store\n  inline asm), k_clumpInstance.c func_001921a0, k_fldLmap.c func_00188200,\n  effPolygonTrack.c func_004936d0, y_symbol.c func_002b3c70,\n  datPersona.c func_0010b7f0.\n\nOne lane (y_symbol.c) explicitly reported it had not run its mandatory\nfinal scoped-verify/audit before yielding on a second in-flight target\n(func_002b4250); independent verification found a real MISMATCH left in\nthe tree (object 1816B vs 1936B window, normalized_diff 1221) and it was\nreverted to the exact bare INCLUDE_ASM fallback, preserving the file's\nother genuinely-closed func_002b3c70 and the header type-signature fixes\n(D_007EFA04, func_002b11c0/func_002b1210) that target legitimately needed.\n\nEvery GPREL16 relocation across all 9 closures independently cross-checked\nby the orchestrator against its own scoped-verify retail_imm; none\nmismatched this wave.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings.\ntests.test_pragma_audit: OK.\nFull verify.py: 6246/7866 first-party MATCH (79.4%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":29.56322,"total_code":4387560,"matched_code":1297104,"matched_code_percent":29.56322,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7238,"matched_functions_percent":55.247692,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T05:45:22Z","commit_sha":"f3cb6859ffa7046c103ede55e973c0b14028394e","commit_message":"lanes: wave 34, +8\n\nContinuing the file-local-sibling-context reconstruction method. First\ndispatch (20 lanes) hit a total backend outage (`getaddrinfo ENOTFOUND\nchatgpt.com`) before any lane wrote a file -- confirmed via `jj st` showing\nzero changes -- so it was retried clean with the identical target list.\nThe retry hit stale-instance ownership conflicts (the pre-outage lane\nprocesses were still alive and got revived by peer messaging); resolved\neach by designating the retry lane authoritative and telling the stale\ninstance to stand down with no edits, verified via `jj st` before trusting\nany result.\n\n8 closures across 6 files:\n- btlShuffleCalc.c: func_00371c70, func_003720c0, func_00373750 (all 3\n  targets in the file closed).\n- btlShuffleSeq.c: func_00379090.\n- evtModel.c: func_00291b60.\n- mdlMatAnim.c: func_00480670.\n- btlTarget.c: func_001ec8c0.\n- datUnit.c: func_00231630.\n\nEvery GPREL16 relocation across all 8 closures independently cross-checked\nby the orchestrator against its own scoped-verify retail_imm (per the\nwave-33 wrong-symbol lesson); none mismatched this wave.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings.\ntests.test_pragma_audit: OK.\nFull verify.py: 6237/7866 first-party MATCH (79.3%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":29.44689,"total_code":4387560,"matched_code":1292000,"matched_code_percent":29.44689,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7229,"matched_functions_percent":55.178993,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T04:41:37Z","commit_sha":"62be2a51d14ae1c0c780a57a182a0f5091733835","commit_message":"lanes: wave 33, +10\n\nPivoted method: with the never-attempted-function backlog and naive\nnear-miss-comment mining both exhausted (see docs/matching.md), this wave\nused the doc's proven \"reconstruction with file-local sibling context\"\napproach -- files with many existing MATCH functions and only 1-5 remaining\nASM functions, reconstructed from fresh disassembly using the file's own\nmatched siblings for struct-layout/type/calling-convention conventions.\n20 lanes, 10 closures:\n\n- btlBoss.c func_0022ff70, k_clump.c func_00463100, tnEffect.c\n  func_00481a20, code1_0023.c func_00230c00, k_command.c func_00177120,\n  code1_0027.c func_002704f0, mdlEffect.c func_0048a340, code1_002e.c\n  func_002e7010 and func_002e7510, effBlurFilter.c func_004a8da0.\n\nCaught a real wrong-symbol defect that scoped verify's relocation masking\ncannot see (the same bug class documented in docs/matching.md's \"A MATCH\ndoes not prove the right global\"): effBlurFilter.c's func_004a8da0\nreferenced `fGpffff8044` (0x00761134) at one site, but that relocation's\nactual retail immediate is 0x8084, matching the file's existing\n`fGpffff8084` (0x00761174, the K_View_SetFov threshold constant already\nused elsewhere in this same function). Both symbols are legitimately\ndistinct globals used elsewhere in the file/tree, so the wrong one compiled\nclean and scored MATCH under masking; only a per-relocation retail_imm\ncross-check (and, if missed, the full linked-image SHA1) would have caught\nit. Fixed by correcting the reference; full `tools/build.py` link confirms\nboth baseline SHA1s unchanged after the fix.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings.\ntests.test_pragma_audit: OK.\nFull verify.py: 6229/7866 first-party MATCH (79.2%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).\nWSGate_run.py 803ade54: GATE BLOCKED at tests, 22 pre-existing failures\n(documented baseline, not a regression).","measures":{"fuzzy_match_percent":29.346243,"total_code":4387560,"matched_code":1287584,"matched_code_percent":29.346243,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7221,"matched_functions_percent":55.11793,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T03:39:08Z","commit_sha":"c1402a78aa141f2c97fb7fd4fd1f8f8d150e833e","commit_message":"docs: record recon-queue exhaustion and near-miss-mining measurement\n\nRecords this continuation's method fix (rebuild the recon target list from\nthe full recon_queue.json filtered by individually-attempted function\nnames, not by whole-file exclusion) and its result (waves 22-32, +66 net\nfirst-party matches, 6153 -> 6219), then documents that both the\nnever-attempted-function avenue and a follow-up near-miss-comment-mining\navenue are now measured exhausted at this point in the campaign. Also\nrecords a live recurrence of the H001-volatile-passes-a-FUNCTION-scope-\nwaiver trap (func_00399bf0) and a misattributed-comment correction, as a\nfresh example of an already-documented failure mode.\n\nNo source/matching changes; docs/matching.md only.","measures":{"fuzzy_match_percent":29.241947,"total_code":4387560,"matched_code":1283008,"matched_code_percent":29.241947,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7211,"matched_functions_percent":55.0416,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T03:34:17Z","commit_sha":"0229595001f734f2b75eadcf0c03bb7b6236cc95","commit_message":"lanes: wave 32, +0 (documentation/policy fix only)\n\nThe fresh never-attempted backlog (recon_queue.json) is now exhausted\nexcept documented hardware floors (code1_003a.c DMA family, sdkUttmx.c\nfunc_00463ea0, code1_0016.c func_0016bdd0). This wave targeted 5 specific\nfunctions whose existing source comments documented a genuinely close\nprior near-miss with a plausible remaining lever:\n\n- code1_001e.c func_001e7ab0 (nd 1): confirmed the daddiu/addiu width\n  residual cannot be forced via s64/u64 typing of the reset constant\n  without regressing the object size; floor confirmed, no change.\n- code1_004f.c func_004f9910 (nd 4) and func_004f13c0 (nd 6): both\n  confirmed as ee-gcc2.96-vs-3.2 ABI/codegen floors -- an ABI-correct\n  3-argument reconstruction of func_004f13c0 reproduces retail's exact\n  88-byte object under an isolated ee-gcc2.96 compile, but this repo's\n  configured gcc_units path for code1_004f.c uses ee-gcc3.2, which does\n  not reproduce it. Worth a dedicated follow-up investigating whether\n  code1_004f.c's gcc_units compiler-version pin is itself wrong.\n- k_vpad.c func_004b5800 (nd 5/8 discrepancy in the existing note):\n  re-confirmed nd 5 as the true floor (retail's three trailing zero\n  words are post-jr alignment padding that no legal-C source shape\n  reproduces without being dead-code-eliminated); corrected nothing in\n  source since the function was already bare INCLUDE_ASM.\n- code1_0039.c func_00399bf0: corrected a genuinely misattributed\n  comment. The prior nd44->36->18 slot-loop probe history documented on\n  this marker actually describes the unrelated 00399fd0/0039a200\n  slot-search family; retail func_00399bf0 is an allocator/state-switch\n  routine with no loop. A lane initially closed it as MATCH using\n  `volatile` on an ordinary allocator-struct field (p+0x80) to force a\n  post-store reload -- this is banned H001 compiler-steering (not a\n  hardware address) and was caught and reverted despite passing scoped\n  verify's masked check. Comment rewritten to document the corrected\n  attribution and the real (unresolved) floor.\n\nNo functional/matching changes. decomp_lint: 0 errors, 5 pre-existing\nH003W warnings. tests.test_pragma_audit: OK. Full verify.py: 6219/7866\nfirst-party MATCH (79.1%, unchanged), 0 MISMATCH. tools/build.py\n--progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":29.241947,"total_code":4387560,"matched_code":1283008,"matched_code_percent":29.241947,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7211,"matched_functions_percent":55.0416,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T02:21:47Z","commit_sha":"595d9eba5a13d6e6b3a67dc638241a3a864f3d48","commit_message":"lanes: wave 31, +2\n\nevtModel.c: func_00291fa0 MATCH (event-model state machine: timer-state\nconversion, per-state alpha/rotation updates, angle threshold counters,\nflag handling, vector copy-back; opt_rebuildconditionals off bracketed in\npush/pop).\n\ncode1_0034.c: func_0034f9d0 MATCH (switch/draw body using aggregate first\nparameter and matching FP/GPR ABI ordering across all 122 renderer calls;\nlocally widened the shared color-channel helper declarations func_0034f2e0/\nf320/f460/f4a0 from s8 to u8 to preserve exact caller codegen -- verified\nthis is per-translation-unit only, no shared header, other files' own\nextern declarations of the same functions are untouched).\n\n18 of 20 lanes this wave correctly declined their target (documented as\nattempted-not-closed with a clean revert to bare INCLUDE_ASM, verified via\neach lane's own scoped lverify + manual baseline diff). One lane\n(LaneKField, k_field.c func_00155360) reported hitting a forced wrap\nmid-iteration with a live MISMATCH still in the tree and an unfinished\nfinal-revert check; restored via `jj restore --from @-` after independent\nverification. Also removed a stray tracked scratch file\n(src/Graphics/Effect/tmpacd4861p.c) and stray build .o artifacts left by\nanother lane's exploration.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings.\ntests.test_pragma_audit: OK.\nFull verify.py: 6219/7866 first-party MATCH (79.1%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":29.241947,"total_code":4387560,"matched_code":1283008,"matched_code_percent":29.241947,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7211,"matched_functions_percent":55.0416,"complete_code":948632,"complete_code_percent":21.620947,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":166}},{"timestamp":"2026-08-31T01:25:00Z","commit_sha":"fa836140c986560ca13711d63fcb8c6e54aeadcc","commit_message":"lanes: wave 30, +1\n\nlogoDraw.c: func_0012bbb0 MATCH (state-machine body; integer-cast u32\nallocator-table base reproduces retail's $s2 hoist of D_008873F4 at both\ncall sites).\n\n13 of 16 lanes in this wave failed mid-flight with a backend routing error\n(`getaddrinfo ENOTFOUND chatgpt.com`, surfaced as `openai-codex/gpt-5.6-luna`)\nand left broken candidate bodies in the tree: 8 MISMATCH, 1 SIZE_MISMATCH,\n1 NONMATCHING scaffold, and evtPMFileReader.c had a systemic COMPILE_ERROR\nacross 6 functions from a bad extern signature. All 13 files (plus one\norphaned symbol registration in config/symbol_data_addrs.txt for the\nnever-closed k_fldMipmap.c func_0018bfb0) restored to the pre-wave parent\nrevision via `jj restore --from @-`.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings.\ntests.test_pragma_audit: OK.\nFull verify.py: 6217/7866 first-party MATCH (79.0%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).","measures":{"fuzzy_match_percent":28.789396,"total_code":4387560,"matched_code":1263152,"matched_code_percent":28.789396,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7209,"matched_functions_percent":55.026333,"complete_code":1093384,"complete_code_percent":24.920092,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-31T01:01:49Z","commit_sha":"afeb9548639c030b4562ebf8cd143e46e5c85354","commit_message":"lanes: wave 29, +1\n\nbtlFormation.c: func_001d3090 MATCH (switch-statement rewrite matching\nretail's ascending-order block layout, RtQuat struct batch load/store for\nthe rotation field).\n\nWave 29's model-identity side-thread (a broadcast asking all 16 lanes what\nmodel they were) interrupted every other lane mid-iteration on a near-miss\ncandidate. None of the other 15 targets closed; 7 lanes had left a live\nMISMATCH body in the tree when they parked (func_0037c720, func_0037ef40,\nfunc_0035dfb0, func_0033c490, func_00161630, func_0010c750, func_0044f720,\nfunc_004594c0) and one (sdkSndcom.c func_0045c640) had an unwaived\n`#pragma schedule off` (H003) plus its own live MISMATCH. All 8 reverted to\ntheir bare INCLUDE_ASM fallback exactly matching the pre-wave parent\nrevision (verified via diff against `jj file show -r @-` for every touched\nfile). Also removed an orphaned, never-independently-verified\niGpffff83d8 symbol registration left behind by the reverted\nbtlResultSimple.c attempt.\n\ndecomp_lint: 0 errors, 5 pre-existing H003W warnings.\ntests.test_pragma_audit: OK.\nFull verify.py: 6216/7866 first-party MATCH (79.0%), 0 MISMATCH.\ntools/build.py --progress-report: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c (both match baseline).\nWSGate_run.py 803ade54: GATE BLOCKED at tests, 22 pre-existing failures\n(documented baseline, not a regression).","measures":{"fuzzy_match_percent":28.766056,"total_code":4387560,"matched_code":1262128,"matched_code_percent":28.766056,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7208,"matched_functions_percent":55.0187,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-31T00:17:02Z","commit_sha":"1f1d27b5330f5ef99d4a5cada9b1f829a3706ff1","commit_message":"lanes: wave 28, +11\n\nTwenty-third parallel-lane wave, 16 lanes covering ~44 never-attempted\nfunctions across the thinning backlog (code1_004b, code1_0029,\ncode1_002a, code1_0028, effParticle, k_fldEvent, btlUnit, evtMisc,\nk_fldAI, btlShuffleResult, effPolygonWind, effPolygonThunder,\ncode1_001b, eff_after, code1_003d, cmpEquip). Eleven closures:\nfunc_00131730 (cmpEquip.c, new absolute symbol D_005E9FA0 registered\nwith verified HI16/LO16 match), func_00487160 (effParticle.c),\nfunc_00172360 (k_fldEvent.c), func_002aa450 (code1_002a.c),\nfunc_0029f790 (code1_0029.c), func_00196610/func_00196040\n(btlUnit.c), func_0028ee00/func_0028d390 (evtMisc.c),\nfunc_00285dd0/func_0028b7b0 (code1_0028.c, one using the pre-existing\n`#pragma push`/`#pragma pop` scoping idiom already used in 10 other\nfiles).\n\nApplied last wave's two new lane rules throughout (no untested\npragma keywords; verify new GP-relative/absolute symbol addresses\nagainst scoped lverify's own retail_imm before registering) --\nzero pragma or symbol-substitution defects this wave. Full build\nSHA1 confirmed clean on the first attempt.\n\nNo other functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":28.73907,"total_code":4387560,"matched_code":1260944,"matched_code_percent":28.73907,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7207,"matched_functions_percent":55.011066,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T22:54:41Z","commit_sha":"74bb1329f10328c703371cfe574c60e2366732d5","commit_message":"lanes: wave 27, +19\n\nTwenty-second parallel-lane wave, 16 lanes covering ~50 never-attempted\nfunctions across another fresh batch (btlMain, code1_0016, cmpSkill,\ncode1_0015, cmmScript, btlPanelCursor, mdlSE, sdkChkmem,\nbtlShuffleSeq, shdWindow, sdkPrimitive, rprandom_grouped,\nmt_sceneFunc, evtMain, btlPanelAnalyze, k_fldEnvironment). Nineteen\nclosures: func_00269db0/func_0026c310 (mt_sceneFunc.c),\nfunc_0025db00/func_0025e4a0 (shdWindow.c), func_00154be0\n(k_fldEnvironment.c), func_00137fb0/func_0013a060 (cmpSkill.c),\nfunc_00379240 (btlShuffleSeq.c), func_00168060 (code1_0016.c),\nfunc_00218760 (btlPanelAnalyze.c), func_0024f160 (cmmScript.c),\nfunc_0015bae0/func_0015ac60/func_001579b0 (code1_0015.c),\nfunc_001b96e0/func_001b7b30/func_001b7e70 (btlMain.c),\nfunc_0044ef70/func_0044ec60 (sdkChkmem.c).\n\nCaught and fixed one serious correctness defect this wave, distinct\nfrom prior waves' cosmetic/pragma-balance issues: the mt_sceneFunc.c\nlane used `#pragma alias NEW OLD` to reinterpret five existing global\nsymbols as byte arrays for typed sub-field access. MWCC b210 actually\nrejects `#pragma alias` outright (\"illegal #pragma\", confirmed by a\ndirect compile probe) -- it is not a real pragma in this compiler\nversion. Because the referenced \"_abs\" symbol names are independently\nresolvable through config/symbols_recovered.txt (consumed by the\nlinker's LCF, entirely bypassing the C-level pragma), the functions\nstill linked and scored MATCH under scoped, relocation-masked verify.\ntests/test_pragma_audit.py caught it (failures 22 -> 23) by literally\ncompiling a probe against real MWCC. Fixed by dropping the dead\npragma lines; the underlying declarations were already legitimate and\nneeded no other change. Full test suite back to the documented\n22-failure baseline.\n\nSeparately, `tools/build.py`'s full-link SHA1 check caught a second,\nmore serious defect the scoped verify's relocation masking cannot see\nat all: k_fldEnvironment.c's newly-closed func_00154be0 referenced\n`iGpffff9e18` (a real, already-used gp-relative symbol, \"%s %d\") at a\ncall site where retail's actual encoded immediate resolves 8 bytes\nfurther, to a distinct unregistered format string (\"%s\"). Scoped\nverify masks every relocation-affected byte, so a plausible-but-wrong\nsymbol reference scores identically to a correct one; only a full\nlink, which must resolve every relocation to a real address, exposed\nthe wrong final byte. Registered the missing symbol\n(iGpffff9e20 = 0x00762f10) in config/symbol_data_addrs.txt with\nevidence, regenerated config/symbols_recovered.txt, and corrected the\ncall site. Confirmed via loadable-image and SLUS_217.82 SHA1 match\nafter the fix. This class of bug (a plausible sibling GP-relative\nsymbol substituted for the correct one) is invisible to every check\nin the campaign's toolkit except a full build; a lighter-weight\nper-relocation symbol/address cross-check was prototyped but produces\ntoo many false positives against legitimate base+field-offset access\npatterns to be useful as-is, and was discarded rather than committed\nhalf-working.\n\nNo other functional change. Both SHA1s unchanged from the documented\nbaseline (3d1d3d2b9d6ccb60836db239ab49674223025a78 /\n4eeec0360cf2715535d9f7e52eb69d786fb0158c).","measures":{"fuzzy_match_percent":28.41707,"total_code":4387560,"matched_code":1246816,"matched_code_percent":28.41707,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7196,"matched_functions_percent":54.927105,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T21:02:35Z","commit_sha":"4deb151b17162db9ab4dc60741d9a9785d951e92","commit_message":"lanes: wave 26, +4\n\nTwenty-first parallel-lane wave, 14 lanes covering ~65 never-attempted\nfunctions across another fresh batch (btlEPL, datCalc, btlShuffleDraw,\ncode1_0010, fclCombineMisc, code1_001f, k_fldResource, btlCamera,\ncode1_0037, y_fclCombine, code1_004a, code1_002b, y_draw, btlShuffle).\nFour closures: func_001cdaf0 (btlCamera.c), func_00100e60\n(code1_0010.c), func_00370640 and func_00370cd0 (code1_0037.c, exact\naggregate stack layout/padding and ABI-correct helper prototype\norder).\n\nAlso completed and independently verified a full first-party\nhardware-access re-census this wave (19 of the documented 21 hardware\nfunctions re-derived from scratch via a fresh disassembly scan with\nstrict register-invalidation tracking, matching the existing\ndocs/matching.md list exactly for the 18-function fromSPR/toSPR DMA\nfamily plus timer init; the 2 direct-scratchpad functions are named\nbut their access mechanism needs data-relocation tracing, not code\nscanning, to re-derive). No source changes from this, informational\nonly.\n\nNo other functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":27.963425,"total_code":4387560,"matched_code":1226912,"matched_code_percent":27.963425,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7177,"matched_functions_percent":54.782078,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T20:08:28Z","commit_sha":"aaad1aacf000594e7f844140003c5cb5c3d34639","commit_message":"lanes: wave 25, +8\n\nTwentieth parallel-lane wave, 14 lanes covering ~90 never-attempted\nfunctions across another fresh batch (code1_0013, effPolygonFlash,\nk_fldFrame, code1_001d, code1_003e, code1_0046, mc.c, code1_0039,\ny_CmbCardEff, shdMisc, y_list, code1_0049, code1_003b, code1_0035).\nClosures: func_00461560/func_00461be0 (code1_0046.c, localized\nopt_propagation brackets around callback-table setup),\nfunc_002e55c0 (y_list.c), func_003e5550 (code1_003e.c),\nfunc_0035e8b0 (code1_0035.c), func_001d5130 (code1_001d.c),\nfunc_002a4570 (mc.c).\n\nCaught and fixed one integrity defect: a lane's schedule/\nno_branch_likely pragma bracket around its new func_003e5550\nreconstruction closed no_branch_likely but never closed schedule,\nleaving `#pragma schedule on` active for roughly 115 lines and every\nfunction in between (all still bare INCLUDE_ASM, so no byte impact\nyet, but decomp_lint's P001 balance check caught it before it could\nsilently affect a future reconstruction attempt in that span).\nRestored the missing `#pragma schedule off`.\n\nNo other functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":27.86861,"total_code":4387560,"matched_code":1222752,"matched_code_percent":27.86861,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7173,"matched_functions_percent":54.751545,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T19:16:48Z","commit_sha":"571bbb222659bed246a4377a6d2d8b1d26284cc9","commit_message":"lanes: wave 24, +5\n\nNineteenth parallel-lane wave, 14 lanes covering ~130 never-attempted\nfunctions across genuinely fresh files this time (cmmRankUp,\nshdPersona, y_smap, mdlManager, code1_0012/0014/0017/0018/001e/0026/\n0039/003a/003c/0045). Five closures: func_0012e2f0 (code1_0012.c,\nopt_loop_invariants on / opt_rebuildconditionals off bracket) and\nfour in code1_0045.c (func_0045c870, func_0045ce40, func_0045d6e0,\nfunc_0045d890 -- a related family of debug/depth-render helpers\nsharing a save/restore register-table idiom).\n\nCaught and fixed three integrity defects this wave, none of which\nhad produced an observable MISMATCH yet but all of which were latent\ncorrectness risks:\n- code1_0045.c: a lane's revert of its one non-closing target\n  (func_00452870) silently dropped the `// FUN_00452CE0` marker\n  comment on the next function -- verify.py's denominator would have\n  silently undercounted by one. Restored the marker.\n- code1_0018.c: a lane's revert left a `#pragma opt_propagation off`\n  bracket unclosed (the paired `on` and its comment were deleted),\n  leaving ~14 functions spanning roughly 230 lines compiled under the\n  wrong pragma state. It happened not to change any of their bytes\n  yet, but was a ticking trap for the next lane to touch that region.\n  Restored the closing pragma and comment.\n- code1_0026.c: two extern declarations left behind by a reverted\n  attempt, one fully orphaned and one redundant with an\n  already-working implicit declaration. Removed both.\nAlso reverted one dropped blank line (code1_0039.c) to restore exact\nbyte-for-byte baseline formatting outside the real diffs.\n\nNo other functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":27.667315,"total_code":4387560,"matched_code":1213920,"matched_code_percent":27.667315,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7165,"matched_functions_percent":54.690483,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T18:12:34Z","commit_sha":"18cd7a62872926ee2242539d5833b7510667e0ee","commit_message":"lanes: wave 23, +6\n\nEighteenth parallel-lane wave, 14 lanes covering ~130 never-attempted\nfunctions, second pass over the deepest-backlog files (excluding\ntargets already attempted this session). Six closures: func_00201410\n(code1_0020.c, corrected forward declaration -- retail passes two\nextra f32 args in $f12/$f13 that the original 3-arg stub never\nexposed; sole call site updated, no other real caller exists),\nfunc_003aa0b0 (code1_003a.c), func_003cb900 (code1_003c.c),\nfunc_00367420/func_003676f0/func_00367d00 (code1_0036.c, closed\ntogether via a shared #pragma opt_propagation off bracket and\nordered float locals matching retail's texture/constant load\nschedule).\n\nOne cosmetic drift caught and reverted: a lane reformatted an\nunrelated function's brace style (K&R to Allman) while working\nnearby; restored to match baseline exactly.\n\nNo other functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":27.55536,"total_code":4387560,"matched_code":1209008,"matched_code_percent":27.55536,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7160,"matched_functions_percent":54.652317,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T16:56:50Z","commit_sha":"585375643b239ed7e01c75c4249de6882e6e2daf","commit_message":"lanes: wave 22, +1 (func_003a8640)\n\nSeventeenth parallel-lane wave, 12 lanes covering ~120 never-attempted\nfunctions across the deepest-backlog files identified by re-scanning\nthe full recon queue (rather than only untouched files): code1_0039,\n_003a, _003b, _003c, _003d, _003e, _001a, _001b, _0015, _0046,\ny_fclCombine, code1_0048. One closure: func_003a8640 (schedule on /\nno_branch_likely on / opt_rebuildconditionals off / opt_propagation\noff reproduces retail's index-refresh branch scheduling).\n\nCaught and fixed six policy violations this wave: y_fclCombine.c,\ncode1_0015.c (x3), code1_001b.c, code1_003a.c, code1_003c.c (x5), and\ncode1_0046.c (x5) each had a lane report \"attempted-not-closed\" or\nsimilar while a live non-matching C body (and in three cases,\norphaned extern declarations, struct typedefs, and one wrong-return-\ntype extern signature the failed attempt introduced) remained\ncommitted. Reverted every one to its exact byte-for-byte baseline,\nconfirmed 0 MISMATCH per file, and fixed one genuine but incompletely\nlanded match (func_003a8640 itself compiled correctly, but its\nclosing `#pragma schedule off` had drifted more than three lines from\nits `measured` justification comment, tripping H003) by moving the\njustification adjacent to the pragma instead of reverting a real win.\n\nNo other functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":27.470758,"total_code":4387560,"matched_code":1205296,"matched_code_percent":27.470758,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7154,"matched_functions_percent":54.606518,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T11:08:23Z","commit_sha":"e3c2b470d56054b4309c4ce9bf0071ac4b5944e2","commit_message":"lanes: wave 21, +5\n\nSixteenth parallel-lane wave, 12 lanes covering 24 never-attempted\nfunctions across 12 fresh files. Five closures: func_0046ab90\n(sdkSpr.c), func_00372960 and func_00372d60 (btlShuffleCalc.c, full\nsweep), func_002e7ac0 (code1_002e.c), func_0034d890 (nLine.c).\n\nCaught and fixed three policy violations this wave: three lanes\n(sdkSnd.c, btlShuffleSeqShuffle5.c, and a briefly-live one in\ncode1_002e.c that self-corrected) reported \"attempted-not-closed\" in\ntheir own summaries while their own scoped lverify showed nonzero\nMISMATCH -- meaning a live non-matching C body was left committed\ninstead of reverted to INCLUDE_ASM. Reverted both remaining files to\ntheir exact pristine baseline (sdkSnd.c and btlShuffleSeqShuffle5.c\nhad zero genuine matches between them, nothing worth preserving) and\nconfirmed 0 MISMATCH in each before proceeding. Seven other lanes\nclosed 0 net, hitting genuine floors (saved-register rotation,\nFPU/accumulator scheduling, rematerialization) already characterized\nthis session.\n\nNo other functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":27.45909,"total_code":4387560,"matched_code":1204784,"matched_code_percent":27.45909,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7153,"matched_functions_percent":54.598885,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T10:12:23Z","commit_sha":"dcf2cb271efb75224cdda3d841b15723b061b4d1","commit_message":"lanes: wave 20, +2 (func_00332060, func_00332520)\n\nFifteenth parallel-lane wave, 12 lanes covering 32 never-attempted\nfunctions across 12 fresh files. Both closures from LaneFclTalk,\nsweeping y_fclTalk.c to 8/8 MATCH: func_00332060 closed directly;\nfunc_00332520 needed a named u32 intermediate plus offset-first\naddress arithmetic (`offset + (u32)work`, not `work + offset`) to\nmatch MWCC's addu operand order for the shifted-index address\ncomputation -- a real, reusable instance of the \"source-level operand\norder drives register-select for commutative ops\" lever.\n\nTen other lanes closed 0; hit genuine floors already characterized\nthis session (FPU accumulator chains, raw sq/lq on 128-bit slots\nthat canonicalize regardless of C spelling, saved-register rotation,\nrematerialization).\n\nRemoved a stray empty scratch file\n(src/promoted/tmpf5_0gm4m.c) a lane left behind mid-probe.\n\nNo other functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":27.341301,"total_code":4387560,"matched_code":1199616,"matched_code_percent":27.341301,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7148,"matched_functions_percent":54.560722,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T09:20:54Z","commit_sha":"3c951e5c8d6ef764409539f416a29168bcd26c0e","commit_message":"lanes: wave 19, +3 (func_002ab0e0, func_002ab550, func_002abb30)\n\nFourteenth parallel-lane wave, 10 lanes covering 30 never-attempted\nfunctions across 10 fresh files. LaneTitleVisual closed all three of\nits assigned targets in titleVisual.c (float-first prototype reuse\nplus an opt_propagation off/on bracket around a cached pointer),\nbringing that file to 7/7 MATCH. Other nine lanes closed 0; effects\nparticle/window/panel-analyze/rprandom/etc. hit genuine floors\n(FPU accumulator chains, pextlb/pextlh packed-MMI, saved-register\nrotation) already characterized this session.\n\nNo other functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":27.301552,"total_code":4387560,"matched_code":1197872,"matched_code_percent":27.301552,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7146,"matched_functions_percent":54.545456,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T08:26:27Z","commit_sha":"23dfb9596c9d02934e02024946d6c5d8259e56b2","commit_message":"lanes: wave 18, +3 (func_0028c080, func_0029f070, func_00286780)\n\nThirteenth parallel-lane wave, 10 lanes covering 37 never-attempted\nfunctions across 10 fresh files. Three closures: func_0028c080\n(code1_0028.c), func_0029f070 (code1_0029.c), func_00286780\n(evtMain.c).\n\nFixed an H001 lint regression from func_0029f070: three ordinary\nreads of D_008C024E (an input-flag global, not a hardware address)\nwere marked volatile, left over from the lane's experimentation.\nConfirmed via build/RECON_probe.py that the plain (non-volatile)\nreads still produce an exact MATCH (nd=0, 1824/1824 bytes) --\nremoved all three qualifiers rather than write a measured\njustification for a trick that wasn't load-bearing.\n\nNo other functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":27.248312,"total_code":4387560,"matched_code":1195536,"matched_code_percent":27.248312,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7143,"matched_functions_percent":54.522556,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T07:20:13Z","commit_sha":"e4b37e19ff0f0b890b6f03db0100bdb1486c3e88","commit_message":"lanes: wave 17, +7 (best wave this session)\n\nTwelfth parallel-lane wave, 10 lanes covering 46 never-attempted\nfunctions across 10 fresh files. Seven closures: func_004b3470 and\nfunc_004b41c0 (effLineNova.c), func_0024c0e0 (cmmScript.c),\nfunc_0013a530 (cmpSkill.c, needed a two-pragma recipe:\nopt_common_subs off + opt_loop_invariants on for the conversion\npreheader, opt_common_subs back on before the table loop),\nfunc_0035c830 and func_0035cb00 (cmpConfig.c), func_00168ec0\n(code1_0016.c).\n\nFixed one lint regression from the wave: cmpSkill.c had an orphaned\nextra `#pragma opt_common_subs on` (already re-enabled earlier in\nthe same function) left over from the func_0013a530 reconstruction,\ntripping decomp_lint's P001 unbalanced-pragma check. Removed; the\nfunction's own scoped verify is unaffected (still 12/16 MATCH, 0\nmismatch after the fix).\n\nAlso fixed a real crash bug found via a comprehensive IDA batch\ndecompile covering the full 1725-function ASM backlog (a resource\nrequested this session to replace the m2c scratch corpus as lane\nreference material): the ee_mac_lifter Hex-Rays plugin's sq/lq\nmicrocode filter (added last session) crashed Hex-Rays with\nMERR_INTERR on any function whose prologue saves enough registers\nfor the decompiler's own stack-frame analyzer to disagree with the\nfilter's claimed operand width -- 239 of 1725 functions hit it. Two\nfix attempts (dtype override, then raw stx/ldx emission) both failed\nidentically; removed sq/lq handling entirely rather than ship a\ncrashing plugin. Cost: clean-decompile count in the reference batch\ndropped from 1280/1725 to 189/1725 (sq/lq spills are in nearly every\nnon-trivial function's prologue), but zero crashes remain except 2\nunrelated, undiagnosed cases in code1_0039.c. FPU accumulator-chain\nlifting (adda.s/suba.s/mula.s/madda.s/msuba.s/madd.s/msub.s) and the\nbc0f/bc0t disassembly fix are unaffected.\n\nNo other functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":27.161156,"total_code":4387560,"matched_code":1191712,"matched_code_percent":27.161156,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7140,"matched_functions_percent":54.499657,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T05:18:30Z","commit_sha":"ca59e7da85e83f8d57786f7773a80229ebcdff66","commit_message":"lanes: wave 15, +1 (func_001d8e50); doc: external MWCC PS2 precedent\n\nEleventh parallel-lane wave, 10 lanes covering 82 never-attempted\nfunctions across 10 fresh files. One closure: func_001d8e50\n(code1_001d.c).\n\nLaneEffPolyFlash-2 confirmed pextlb/pextlh packed-color widening\ncannot be emitted from legal C at any MWCCPS2 b210 optimization\nlevel (all 8 effPolygonFlash.c targets hit it identically) --\nindependently corroborated by AshfordFamily/recvx-decomp (Resident\nEvil Code: Veronica X, confirmed mwccps2.exe toolchain, 64% matched):\ntheir movz/movn and pextlw/pextlh/pcpyld code is inline-asm-only\nthroughout, same as our own movz/movn census concluded.\n\nThat same external project also has the identical bc0f/bc0t DMA-wait\nidiom marked \"100% matching!\", confirming MWCC really does let\ninline-asm bc0t/bc0f branch to plain C statement labels including\nlabels outside the enclosing block -- validating the goto-shaped\nreconstruction technique attempted (and reverted) for func_003a4d50\nlast wave. Recorded in docs/matching.md with the exact idiom and the\nconcrete next step (retry with the block-duplication bug fixed).\n\nNo other functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":27.051025,"total_code":4387560,"matched_code":1186880,"matched_code_percent":27.051025,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7133,"matched_functions_percent":54.446224,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T04:13:26Z","commit_sha":"de538a8a47d739f6e8e4f0c8983ff1fdd9d8ed8e","commit_message":"lanes: wave 14, +2 (func_003b47f0, func_00189600)\n\nTenth parallel-lane wave, 10 lanes covering 142 never-attempted\nfunctions across 10 genuinely fresh files (excluded every file\ntouched by waves 11-13). Two closures: func_003b47f0 (code1_003b.c)\nand func_00189600 (code1_0018.c, struct-copy shaping).\n\nAlso extended the ee_mac_lifter IDA plugin (tooling only, not\ntracked in this repo) to cover mula.s/madda.s/msuba.s -- the\nremaining EE FPU accumulator-chain variants beyond adda.s/suba.s/\nmadd.s/msub.s -- discovered while a lane's target (func_004165a0)\nstill showed an asm island under the plugin fixed earlier this\nsession. Confirmed fixed (func_004165a0 now decompiles clean) with\nno regression on the two functions the original fix targeted.\n\nNo other functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":27.026594,"total_code":4387560,"matched_code":1185808,"matched_code_percent":27.026594,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7132,"matched_functions_percent":54.43859,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T03:25:26Z","commit_sha":"c27111d96dc7a1fd0b1750283c75a89b9c51e33b","commit_message":"docs: record goto-shaped reconstruction attempt for func_003a4d50\n\nAttempted a full goto-per-basic-block reconstruction mirroring the\nretail control flow exactly (forward bnez into cold wait-blocks,\nbackward goto to resume); reached MATCH19/MISMATCH1 with the object\n1136B against a 1072B window, larger than retail -- evidence MWCC\nduplicated a small multiply-entered block rather than sharing it.\nReverted per policy; recorded the specific next-step hypothesis\n(remove the triple-entry label vs. matching the duplication) so a\nfuture attempt does not re-derive the register mapping, tail-value\nformula, or wait idiom from scratch.\n\nNo functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":26.996326,"total_code":4387560,"matched_code":1184480,"matched_code_percent":26.996326,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7130,"matched_functions_percent":54.423325,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T03:15:21Z","commit_sha":"6a1fd28d91f0d1c9bacfa3c360b39d87ac0cc30a","commit_message":"lanes: wave 13, +2 (func_0016a960, func_00121f20)\n\nNinth parallel-lane wave, 10 lanes covering 127 never-attempted\nfunctions across 10 files. Two closures survived: func_0016a960\n(k_fldFrame.c, MWCC-compatible parameter reordering) and\nfunc_00121f20 (code1_0012.c, Point/Color struct reconstruction).\n\nLane003a's assignment included the six fromSPR/toSPR DMA functions\nin code1_003a.c, unblocked this session by the bc0f/bc0t lint fix;\nnone closed (correctly judged too large for the wave's budget and\nskipped per instructions). A dedicated follow-up attempt on the\nsmallest of the six (func_003a4d50, 1072 bytes) reached MISMATCH:\nthe retail control flow places its hardware-wait blocks as\nout-of-line cold code reached by forward branches with a backward\ngoto, not natural if/while fallthrough (bnez skips *into* the wait\nblock rather than an if-body containing it) -- confirmed by manual\nbyte-level diff against a real MWCC compile. Reverted to bare\nINCLUDE_ASM per policy; needs a goto-based 1:1 block reconstruction,\nnot the nested-if shape both Ghidra and IDA's decompilers show.\n\nNo other functional change. Both SHA1s unchanged.","measures":{"fuzzy_match_percent":26.996326,"total_code":4387560,"matched_code":1184480,"matched_code_percent":26.996326,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7130,"matched_functions_percent":54.423325,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T02:23:00Z","commit_sha":"ed946a86e338b5b642ac3456ff5758a313294db6","commit_message":"lint: allow bc0f/bc0t COP0-condition branches; record DMA-wait idiom\n\ndecomp_lint's H009 inline-asm allowlist was missing bc0f/bc0t. The EE's\nDMAC channel-drain arbitration signal is wired into COP0's condition\nline and is readable only via bc0f/bc0t -- there is no mfc0 for it, so\nthis is exactly the \"no C expression exists\" case the rule intends to\npermit, same as the existing mfc0/di/ei/sync entries.\n\nInvestigated the six never-attempted fromSPR/toSPR DMA functions in\ncode1_003a.c (part of the 18-function hardware family docs/matching.md\nalready flagged as blocked). Confirmed via a real MWCCPS2 compile\n(build/RECON_probe.py) that b210 accepts sync.l/sync.p/bc0f literally.\nRecovered the global and per-channel DMAC register map from the retail\noffsets; documented the wait idiom and the remaining control-flow\ncomplexity (hand-scheduled backward cross-jumps between wait/poll\nblocks) in docs/matching.md as a scoped, not-yet-closed lane target.\n\nNo functional change to any first-party body; both SHA1s unchanged.","measures":{"fuzzy_match_percent":26.967882,"total_code":4387560,"matched_code":1183232,"matched_code_percent":26.967882,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7128,"matched_functions_percent":54.408062,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T02:02:23Z","commit_sha":"dee02ddf425baa5f92c0b4906382de71a99e7870","commit_message":"lanes: wave 12, 0 net closures; fix unbalanced pragma from wave-11 lane\n\nEighth parallel-lane wave, 10 lanes each covering 2-7 small files from\nbuild/recon_queue.json. Every assigned target across all 10 files\nturned out to already carry a `measured` floor comment from a session\nbefore this one -- the unfiltered recon_queue.json (unlike\nrecon_queue_fresh.json) does not exclude previously-attempted\nfunctions, and these particular files had already been mined. 0 new\nMATCH this wave; every lane correctly recognized and skipped the\npre-measured targets without re-attempting, confirming the\nfloor-comment convention is working as intended.\n\nCaught and fixed during independent post-wave verification: a lane\nfrom this wave's edits to code1_002b.c left a `#pragma\nopt_propagation off` (guarding func_002b5120, pre-existing, still\nMATCH) with no matching `on` before end of file -- decomp_lint's P001\nrule (unbalanced pragma on/off pairs) caught it. Restored the missing\n`#pragma opt_propagation on` immediately after func_002b5120's closing\nbrace; re-verified 0 MISMATCH and func_002b5120 still MATCH.\n\nNet: 6136 first-party MATCH, unchanged from wave 11; 0 MISMATCH.\ndecomp_lint: 0 errors (5 pre-existing H003W baseline-redundant-pragma\nwarnings, unrelated). build.py --progress-report confirms both output\nhashes unchanged: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c. Gate script reports the same\npre-existing environment gaps documented earlier this campaign -- not\nregressions from this change.","measures":{"fuzzy_match_percent":26.967882,"total_code":4387560,"matched_code":1183232,"matched_code_percent":26.967882,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7128,"matched_functions_percent":54.408062,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-30T00:47:07Z","commit_sha":"66d18cab68a9864ecbd61cde2c889cdfaca3e3c1","commit_message":"lanes: close 3 more never-attempted functions (wave 11)\n\nSeventh parallel-lane wave, first to target genuinely fresh territory:\nbuild/recon_queue.json (unfiltered, 779 entries) minus every file any\nlane touched in waves 5-10, ranked by never-attempted-function density\nper file. Closed 3 to MATCH: func_002a9100 (src/Kernel/mc.c, 1212B,\nneeded `#pragma opt_common_subs off` for retail's saved-register\nallocation and repeated `sra`), func_003e49a0 and func_003e53b0\n(code1_003e.c).\n\nHalf the assigned files (y_CmbCardEff.c, effPolygonFlash.c, btlEPL.c,\nmost of cmmRankUp.c) turned out to already carry `measured` floor\ncomments from sessions before this one -- confirming\nbuild/recon_queue.json (unlike recon_queue_fresh.json) does not filter\nout previously-attempted functions. Every lane correctly recognized\nand skipped these per the floor-comment rule; 0 wasted re-attempts\nbeyond the initial read. ~60 other attempted targets across the\nremaining files stayed INCLUDE_ASM as new compiler-floor residuals,\nclosest candidates archived under build/<LANE>_<addr>_body.c.\n\nNet: 6133 -> 6136 first-party MATCH, 0 MISMATCH. decomp_lint: 0 errors\n(5 pre-existing H003W baseline-redundant-pragma warnings, unrelated).\nbuild.py --progress-report confirms both output hashes unchanged:\nloadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78,\nSLUS_217.82 sha1 4eeec0360cf2715535d9f7e52eb69d786fb0158c. Gate script\nreports the same pre-existing environment gaps documented earlier this\ncampaign -- not regressions from this change.","measures":{"fuzzy_match_percent":26.967882,"total_code":4387560,"matched_code":1183232,"matched_code_percent":26.967882,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7128,"matched_functions_percent":54.408062,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-29T23:54:05Z","commit_sha":"83a70c975094ff8111318cac915ad075a74899bd","commit_message":"tools: remove exhausted-avenue and one-off investigation scripts\n\nRepo review flagged tools/ and tests/ as carrying too much one-off\ncampaign scaffolding relative to what the decomp actually needs going\nforward. Removes 10 tool scripts (plus their 3 paired tests) whose\navenue docs/matching.md's own table already records as fully\nexhausted, or whose one historical finding is already captured in\nthat document and does not need a re-runnable script:\n\n- tools/twin_census.py, twin_find.py, twin_diff.py -- the P3 FES\n  twin-porting avenue (41 attempted, 8 closed, closed out).\n- tools/knob_sweep.py -- the MWCC pragma knob sweep (15 flag sets x\n  128 bodies, 0 closures).\n- tools/decl_disagreements.py, callee_decl_census.py,\n  sibling_census.py -- one-off census scripts for single historical\n  findings already recorded in docs/matching.md.\n- tools/hw_access_census.py, reachability_census.py -- produced the\n  \"21 functions genuinely touch hardware\" / \"98% of remaining work is\n  reachable from plain C\" findings, both permanently recorded in\n  docs/matching.md; not needed as a re-runnable tool.\n- tools/decompme.py -- decomp.me upload helper, unused this campaign.\n\nKept every other tool, including the full decomp-permuter family\n(permute.py, permute_ast.py, permute_min.py, permute_sweep.py --\npermute_ast.py wires up the REAL upstream simonlindholm/decomp-permuter,\nnot a reimplementation, confirmed functional against this repo's mwcc\n+ verify.py scoring this session) and every generic archive/probe/try\nutility (park*.py, probe_*.py, try_*.py, archive_to_guard.py,\nstrip_seed_guards.py, revert_mismatches.py, recon_*.py) since those\nremain reusable by any future wave, not tied to one exhausted avenue.\ntools/eegcc_shim.py is kept: verify.py's `_compile_gcc` genuinely\ndepends on it for every unit listed in config/gcc_units.txt.\n\nAlso removes a.out (stray compiled ELF object), a stray disassembly-\ndump text file, and an agent session-continuity note that did not\nbelong in the tree, with .gitignore rules to keep them out.\n\nVerification: `python -m unittest discover -s tests` still shows only\nthe pre-existing 22 CanonicalMapTests failures (same environment gap\ndocumented throughout this campaign, unrelated to this change; test\ncount dropped from 577 to 528, matching the 3 removed test files).\ndecomp_lint: 0 errors. build.py --progress-report confirms both output\nhashes unchanged: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c. No src/ files touched.","measures":{"fuzzy_match_percent":26.925581,"total_code":4387560,"matched_code":1181376,"matched_code_percent":26.925581,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7125,"matched_functions_percent":54.385162,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-29T23:26:49Z","commit_sha":"62263b2dd305c6d3ed0a2cf57139846b27e8a772","commit_message":"lanes: close 1 more never-attempted function (wave 10); repo cleanup\n\nSixth parallel-lane wave, 10 lanes covering the richest remaining\nnever-attempted-function files with the ida_headstart pseudocode\ncorpus as a first-pass reference (faster than a live Ghidra\nround-trip per target). Closed 1 to MATCH: func_001acbb0\n(code1_001a.c). ~90 other attempted targets across 10 files stayed\nINCLUDE_ASM as compiler-floor residuals or untouched under the lane's\nattempt budget; several are now confirmed to require real privileged\nhardware synchronization (di/sync.p/mfc0/ei/bc0f) rather than ordinary\nC, a new finding recorded for a future avenue.\n\nAlso removes three files that do not belong in this repository,\nflagged during review: a.out (a stray compiled ELF object), a stray\ndisassembly-dump text file, and an agent session-continuity note\ncommitted by a previous session. .gitignore gained rules to keep\nthem out going forward.\n\nNet: 6132 -> 6133 first-party MATCH, 0 MISMATCH. decomp_lint: 0 errors\n(5 pre-existing H003W baseline-redundant-pragma warnings, unrelated).\nbuild.py --progress-report confirms both output hashes unchanged:\nloadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78,\nSLUS_217.82 sha1 4eeec0360cf2715535d9f7e52eb69d786fb0158c. Gate script\nreports the same pre-existing environment gaps documented earlier this\ncampaign -- not regressions from this change.","measures":{"fuzzy_match_percent":26.925581,"total_code":4387560,"matched_code":1181376,"matched_code_percent":26.925581,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7125,"matched_functions_percent":54.385162,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-29T21:45:45Z","commit_sha":"98ac1232147f0f79ad205c2c2d554f0fdd0f75ba","commit_message":"docs: confirm two wave-9 near-misses as scheduler floors\n\nTargeted follow-up on the two closest wave-9 near-misses\n(func_002b3720 nd 3, func_004bc540 nd 11) rather than a fresh lane\nwave. Both confirmed as genuine MWCC -O2 instruction-scheduler floors,\nnot source-shape problems:\n\nfunc_002b3720 (code1_002b.c): retail loads both halves of a Vec2\nstruct copy into separate float registers before storing either\n(interleaved load/load/store); three source variants -- the original\nsequential `out.x = src[0]; out.y = src[1];`, named temporaries\nforcing both loads before either store, and a single 64-bit\n`*(s64*)&out = *(s64*)src` copy -- all produced byte-identical or\nworse output. The scheduler reorders independent loads/stores by its\nown dependency heuristic, not source statement order, exactly as\nalready documented for func_0048aff0's residual in a prior commit.\n\nfunc_004bc540 (code1_004b.c): retail reverses an sll/lw pair at\noffsets 0x30/0x34 relative to the wave-9 lane's closest candidate;\nsame scheduler-reordering class, left as-is given the just-confirmed\npattern that reordering source statements does not change it.\n\nBoth left as bare INCLUDE_ASM with a `measured` comment recording the\nexact residual and archive path, so no future session re-attempts\nthem via source reordering.\n\nNo MATCH count change: 6132 first-party MATCH, 0 MISMATCH, 0 lint\nerrors. build.py --progress-report confirms both output hashes\nunchanged: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c.","measures":{"fuzzy_match_percent":26.904795,"total_code":4387560,"matched_code":1180464,"matched_code_percent":26.904795,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7124,"matched_functions_percent":54.37753,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-29T21:34:10Z","commit_sha":"7026ae8120e3b1678601ec39ed3732cb229bc82b","commit_message":"lanes: close 1 more never-attempted function (wave 9)\n\nFifth parallel-lane wave, 10 lanes each covering 2-4 small files (the\nnever-attempted-function supply per file has thinned to 1-6 each after\nwaves 5-8 worked through the richest files). Closed 1 to MATCH:\nfunc_002b32d0 (code1_002b.c, 75-scanned file).\n\n~55 other attempted targets across 30 files stayed INCLUDE_ASM: VU/MMI\ncompiler-floor cases, FPU accumulator/register-scheduling residuals,\nor pre-existing `measured` floor comments correctly skipped without\nre-attempting. Two near-misses worth a future targeted pass:\nfunc_004bc540 (code1_004b.c, nd 11, retail scheduler swaps a two-word\nsll/lw pair) and func_002b3720 (code1_002b.c, nd 3). Every lane\nconfirmed 0 MISMATCH and an unchanged scanned-function total per file\nbefore reporting; no markers were lost this wave.\n\nYield continues to decline as the wave exhausts richer files: 12, 5,\n7, 2, 1 across waves 5-9 (excluding the 2 reverted rule violations).\nRunning total: 27 closed across 5 waves. The remaining ~285 fresh-queue\ntargets are now overwhelmingly singles/pairs per file with no\nsame-file MATCH anchor, consistent with docs/matching.md's file-local-\nsibling predictor -- this is close to the point where the next\npivot (see docs/matching.md's avenue table) is warranted.\n\nNet: 6131 -> 6132 first-party MATCH, 0 MISMATCH. decomp_lint: 0 errors\n(5 pre-existing H003W baseline-redundant-pragma warnings, unrelated).\nbuild.py --progress-report confirms both output hashes unchanged:\nloadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78,\nSLUS_217.82 sha1 4eeec0360cf2715535d9f7e52eb69d786fb0158c. Gate script\nreports the same pre-existing environment gaps documented earlier this\ncampaign (missing 32-bit toolchain artifacts, unrelated\nCanonicalMapTests failures) -- not regressions from this change.","measures":{"fuzzy_match_percent":26.904795,"total_code":4387560,"matched_code":1180464,"matched_code_percent":26.904795,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7124,"matched_functions_percent":54.37753,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-29T20:38:43Z","commit_sha":"69fac5263ce9d7a2680bec1c481a02418631692d","commit_message":"docs: record waves 6-8 outcomes and the two verification-gap lessons","measures":{"fuzzy_match_percent":26.891302,"total_code":4387560,"matched_code":1179872,"matched_code_percent":26.891302,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7123,"matched_functions_percent":54.369896,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-29T20:32:52Z","commit_sha":"86a4b7e5a1783f88453b27860cf14ff59a9b625d","commit_message":"lanes: close 2 more never-attempted functions (wave 8)\n\nFourth parallel-lane wave against build/recon_queue_fresh.json, 10\nlanes each restricted to one file. Closed 2 to MATCH: func_004ae0a0\n(code1_004a.c, 588B) and func_0018efe0 (code1_0018.c, 932B).\n\n~35 other attempted targets across the 10 files stayed INCLUDE_ASM as\ngenuine compiler-floor residuals (register/frame layout, FPU\nscheduling); closest candidates archived under\nbuild/<LANE>_<addr>_body.c. Diminishing yield vs waves 6-7 (2/~37\nattempted here, down from 5/40 and 7/50) -- these files have fewer\nalready-MATCH siblings per never-attempted target than the earlier\nbatches, consistent with the \"file-local sibling\" predictor from\ndocs/matching.md's wave-5 writeup.\n\nEvery lane confirmed its file's scanned-function total unchanged\nbefore reporting (the marker-drop check added to\nbuild/recon_methodology.md after wave 7); no markers were lost this\nwave.\n\nNet: 6129 -> 6131 first-party MATCH, 0 MISMATCH. decomp_lint: 0 errors\n(5 pre-existing H003W baseline-redundant-pragma warnings, unrelated).\nbuild.py --progress-report confirms both output hashes unchanged:\nloadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78,\nSLUS_217.82 sha1 4eeec0360cf2715535d9f7e52eb69d786fb0158c. Gate script\nreports the same pre-existing environment gaps documented earlier this\ncampaign (missing 32-bit toolchain artifacts, unrelated\nCanonicalMapTests failures) -- not regressions from this change.","measures":{"fuzzy_match_percent":26.891302,"total_code":4387560,"matched_code":1179872,"matched_code_percent":26.891302,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7123,"matched_functions_percent":54.369896,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-29T19:34:22Z","commit_sha":"729798ec1f280c34ebd6c72408556babf0a03d99","commit_message":"lanes: close 7 more never-attempted functions (wave 7)\n\nThird parallel-lane wave against build/recon_queue_fresh.json, 10\nlanes each restricted to one file, targeting files with an existing\nMATCHed sibling (per the \"Wave 5 breaks the cliff\" finding in\ndocs/matching.md). Closed 7 to MATCH: func_0021d4a0 and\nfunc_00213e20 (code1_0021.c, 1152B/1168B), func_001974f0 and\nfunc_0019e220 (btlUnit.c, 1228B/764B), func_001437b0 (code1_0014.c,\n956B), func_001cc5d0 (btlCamera.c, 1028B), func_001a1450\n(code1_001a.c, 896B).\n\n~50 other attempted targets across the 10 files stayed INCLUDE_ASM,\neach a genuine compiler-floor residual (register allocation, FPU\nscheduling, saved-register live ranges) with no volatile/inline-asm\nshortcuts; closest candidates archived under build/<LANE>_<addr>_body.c.\nOne lane (LaneShdPersona) correctly recognized every assigned target\nin shdPersona.c already carried a prior-session `measured` rejection\ncomment and skipped all seven without re-attempting, per\nbuild/recon_methodology.md's floor-comment rule.\n\nCaught and fixed during independent post-wave verification (before\nthis commit): two lanes' edits had silently dropped the `// FUN_xxx`\nmarker comment for a function they were not even assigned to touch\ndirectly (func_001acbb0 in code1_001a.c lost its marker during a\nrevert; func_0013c700 in code1_0013.c lost both its marker and its\nINCLUDE_ASM line entirely during an unrelated reorder in code1_0013.c).\nBoth silently drop a function from verify.py's denominator without\nproducing a MISMATCH or COMPILE_ERROR signal -- caught only by diffing\nthe full-project scanned-function count (12720 -> 12718) against the\npre-wave baseline. Restored both; scanned count and MATCH set now\nmatch exactly (12720 total, +7 net MATCH, 0 dropped).\n\nNet: 6122 -> 6129 first-party MATCH, 0 MISMATCH. decomp_lint: 0 errors\n(5 pre-existing H003W baseline-redundant-pragma warnings, unrelated).\nbuild.py --progress-report confirms both output hashes unchanged:\nloadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78,\nSLUS_217.82 sha1 4eeec0360cf2715535d9f7e52eb69d786fb0158c. Gate script\nreports the same pre-existing environment gaps documented earlier this\ncampaign (missing 32-bit toolchain artifacts, unrelated\nCanonicalMapTests failures) -- not regressions from this change.","measures":{"fuzzy_match_percent":26.856295,"total_code":4387560,"matched_code":1178336,"matched_code_percent":26.856295,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7121,"matched_functions_percent":54.35463,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-29T18:25:53Z","commit_sha":"ddd44a8c416be9f47e522ede55746eafe2018d88","commit_message":"docs: refresh session-continuity notes for waves 5-6","measures":{"fuzzy_match_percent":26.691828,"total_code":4387560,"matched_code":1171120,"matched_code_percent":26.691828,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7114,"matched_functions_percent":54.301197,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-29T18:23:30Z","commit_sha":"cc178a78698e220c2b180e38ecc9f0d232373023","commit_message":"lanes: close 5 more never-attempted functions (wave 6)\n\nSecond parallel-lane wave against the ranked never-attempted-function\nqueue (build/recon_queue_fresh.json), 10 lanes each restricted to one\nfile. Closed 5 to MATCH: func_00124970 (code1_0012.c, 572B),\nfunc_001d4eb0 (code1_001d.c, 628B), func_00466280 (code1_0046.c,\n756B), func_00481f30 and func_004824a0 (code1_0048.c, 760B/596B).\n\n35 other attempted targets across the same 10 files stayed at\nINCLUDE_ASM: either a genuine compiler-floor residual (register\nallocation, FPU scheduling) confirmed by decomp_lint-clean probes with\nno volatile/inline-asm shortcuts, or left untouched under the lane's\nattempt budget. Every attempted-but-unclosed candidate is archived\nunder build/<LANE>_<addr>_body.c with its object/window/nd for future\nsessions. Three live MISMATCH bodies left behind by LaneFldFrame2 in\nk_fldFrame.c (func_00169780, func_0016a960, func_0016b080) were caught\nduring independent verification and reverted to bare INCLUDE_ASM\nbefore this commit.\n\ndocs/matching.md updated: new avenue-table row and a \"Wave 5 breaks the\ncliff\" section documenting that file-local sibling context, not\nabsolute function size, is what predicts a reconstruction closing (the\nprior wave closed 432-656B functions, well above the previously\nrecorded 256-byte cliff). build/recon_methodology.md gained a pitfall\nentry about the banned volatile/inline-asm compiler-steering idioms\nfound and reverted in the previous commit.\n\nNet: 6117 -> 6122 first-party MATCH, 0 MISMATCH. decomp_lint: 0 errors\n(5 pre-existing H003W baseline-redundant-pragma warnings, unrelated).\nbuild.py --progress-report confirms both output hashes unchanged:\nloadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78,\nSLUS_217.82 sha1 4eeec0360cf2715535d9f7e52eb69d786fb0158c. Gate script\nreports the same pre-existing environment gaps documented earlier this\ncampaign (missing 32-bit toolchain artifacts, unrelated\nCanonicalMapTests failures) -- not regressions from this change.","measures":{"fuzzy_match_percent":26.691828,"total_code":4387560,"matched_code":1171120,"matched_code_percent":26.691828,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7114,"matched_functions_percent":54.301197,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-29T17:09:37Z","commit_sha":"e9b07c44558162b8067598befc734246afc6242e","commit_message":"lanes: close 13 never-attempted functions across 10 units; revert 2 rule-violating bodies\n\nParallel-lane wave against the ranked never-attempted-function queue\n(build/recon_queue.json) closed 13 functions to MATCH across\nbtlMain.c, k_fldFrame.c, and eight code1_*.c promoted units: 6106 ->\n6119 first-party MATCH.\n\nTwo of those 13 turned out to be policy violations, found and\ncorrected via decomp_lint before this commit:\n- func_0019df20 (code1_0019.c): a `*(volatile f32 *)&x` read-back was\n  used to force retail's stack round-trip (H001, banned). The only\n  clean-C form that reaches nd 0 needs that banned idiom; reverted to\n  bare INCLUDE_ASM. Attempt archived at\n  build/Lane0019_misc_0019df20_body.c.\n- func_0048aff0 (code1_0048.c): a hand-written `__asm__` block forced\n  an exact match on ordinary MIPS instructions (H009, banned). Replaced\n  with a real C reconstruction (keyframe interpolation with a 3-way\n  mode switch), verified independently against Ghidra's decompile of\n  the retail function. Reaches object 560B == window 560B, nd 12 (an\n  MWCC -O2 scheduler reordering of two independent subtractions,\n  confirmed not controllable via source statement order). Reverted to\n  bare INCLUDE_ASM per project rule; attempt archived at\n  build/L48_0048aff0_body.c.\n\nNet from the wave after both reverts: 6106 -> 6117 (+11), 0 MISMATCH.\n\ndecomp_lint: 0 errors (5 pre-existing H003W baseline-redundant-pragma\nwarnings, unrelated). build.py --progress-report confirms both output\nhashes unchanged: loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78, SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c. Gate script reports the same\npre-existing environment gaps documented earlier this campaign\n(missing 32-bit toolchain artifacts, unrelated CanonicalMapTests\nfailures) -- not regressions from this change.","measures":{"fuzzy_match_percent":26.615248,"total_code":4387560,"matched_code":1167760,"matched_code_percent":26.615248,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7109,"matched_functions_percent":54.263035,"complete_code":1094904,"complete_code_percent":24.954735,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":168}},{"timestamp":"2026-08-28T23:14:39Z","commit_sha":"83d34282d1604503aeed04cdd5ca3f05a92f6644","commit_message":"recon: reconstruct func_0036aa20, a triangle-strip index table generator\n\nNever-attempted function (779-entry ranked queue, this session's higher-yield\navenue after the near-miss residual pool saturated). Ghidra headless decompile\nof a freshly created function boundary gave the algorithm directly: an 8-row,\n6-column nested loop writing alternating even/odd-row triangle-strip index\nsextets into D_00884690 (an existing u16[] global, already declared and used\nelsewhere in gc_model.c), followed by a bounds-check pass and a pointer-diff\nassertion, both calling the existing func_0046d730(file, line) assert helper.\n\nTwo non-obvious fidelity requirements found by diffing against retail\ninstruction-by-instruction:\n\n- The v/t1/t2 accumulator locals must be s32, not u16. u16 locals force MWCC\n  to emit an andi $reg,0xffff truncation mask after every arithmetic op index\n  (declared-width truncate-and-reuse), which retail never does -- retail lets\n  the 16-bit `sh` store truncate once at write time and keeps the running\n  index in a plain 32-bit register between stores.\n- The even/odd-row parity test is NOT loop-invariant hoisted in the source:\n  it is written directly inside the 6-iteration column loop and repeated\n  again after it for the row-tail, matching Ghidra's decompile exactly.\n  Hoisting it to wrap the whole inner loop (the \"obviously equivalent\"\n  refactor) changes MWCC's block layout enough to leave 40 extra bytes and\n  duplicate the column-counter increment.\n\nAlso found and fixed by direct diff: retail duplicates the `p += 6` pointer\nadvance inside each if/else branch at different positions relative to the v\nupdate (rather than hoisting it to a single shared statement after the\nif/else), and declaring `col` before `row` (matching retail's local\ndeclaration order) is required for MWCC to allocate $t0/$a3 the way retail\ndoes instead of swapping them.\n\nVerified: src/Main/Social/pscModel.c scoped verify 6/7 MATCH, 0 MISMATCH\n(object 432B / window 432B, normalized_diff 0). Full verify.py: 6106/7866\nfirst-party MATCH (was 6105), 0 MISMATCH. decomp_lint clean (4 pre-existing\nH003W warnings, unrelated). build.py --progress-report: both loadable image\nand SLUS_217.82 SHA1 unchanged and OK.","measures":{"fuzzy_match_percent":26.483238,"total_code":4387560,"matched_code":1161968,"matched_code_percent":26.483238,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7098,"matched_functions_percent":54.17907,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-28T22:41:50Z","commit_sha":"40cc409faccd9a602acc2d5d22ef845432c82861","commit_message":"tools: run the ee-gcc pipeline natively on Linux, no root needed\n\ntools/eegcc_shim.py assumed Windows+WSL unconditionally: it staged the\ncompiler and every input into a C:/tmp path and invoked ee-gcc through\ncmd.exe -> wsl.exe -> bash. That path is preserved exactly, gated behind\nplatform.system() == \"Windows\"; a new additive branch runs ee-gcc directly\nwhen not on Windows, since there is no WSL boundary to cross and nothing to\nstage.\n\nVerified end to end on this machine, not just at the binary level:\ntools/verify.py src/promoted/code1_004f.c (a config/gcc_units.txt unit) went\nfrom 87/87 COMPILE_ERROR to 13 MATCH / 65 ASM / 9 MISMATCH -- real signal,\nnot a blanket failure. This unit holds no first-party functions\n(is_gcc_unit-excluded), so the change has no effect on the project's scored\nmetric; it only unblocks WSGate's ee-gcc-dependent nd_audit step.\n\nGetting there needed no root access. This machine's ee-gcc/cc1/as binaries\nare dynamically-linked 32-bit x86 ELF executables requiring glibc.i686,\nwhich is not installed and dnf install needs sudo this session does not\nhave. Downloaded the glibc/libgcc RPMs with \"dnf download\" (a plain fetch,\nno install step, no root) to ~/opt/glibc32, and used patchelf with\n--set-interpreter and --set-rpath (also fetched via dnf download, extracted\nby hand with rpm2cpio) to repoint each binary's ELF interpreter and rpath\nat the extracted libraries. The compiler's own MIPS objcopy was missing\nfrom this machine's toolchain copy entirely; Fedora's\nbinutils-mips64-linux-gnu cross package supplies one that reads/writes\nthis codebase's R5900 objects fine for section/symbol stripping purposes.\n\nThe move-macro rewrite already in this file (GNU as expands it to \"or\",\nPs2EeAs to \"daddu\") is what makes substituting GNU as for Sony's\nproprietary Ps2EeAs viable at all on a machine that has neither; it was\nnot touched.\n\nKnown residual, not closed here: 3 of 15 preserved gcc-unit archive bodies\ndrift under this exact substitution (nd_audit reports measured nd 29/17/30\nagainst noted 26/2/26), and running recover_symbols against this toolchain\nchanges config/symbols_recovered.txt enough to fail ~22 test_reconcile\nunit tests. Both point at a real but narrower fidelity gap between GNU as\nand genuine Ps2EeAs beyond the one macro difference already documented,\nconfined entirely to vendor-excluded gcc units. Left config/\nsymbols_recovered.txt untouched rather than committing a result calibrated\nagainst this substitution.\n\nbuild/WSGate_run.py's declaration-environment check still cannot run here\n(build/WSGate_decl_env_check.py was not part of this machine's build/\nmirror); unrelated to ee-gcc.","measures":{"fuzzy_match_percent":26.473392,"total_code":4387560,"matched_code":1161536,"matched_code_percent":26.473392,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7097,"matched_functions_percent":54.171436,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-28T22:40:49Z","commit_sha":"318e31b661dac2e8bad531cf10395c4bea0bcbfe","commit_message":"tools: run the ee-gcc pipeline natively on Linux, no root needed\n\ntools/eegcc_shim.py assumed Windows+WSL unconditionally: it staged the\ncompiler and every input into a C:/tmp path and invoked ee-gcc through\ncmd.exe -> wsl.exe -> bash. That path is preserved exactly, gated behind\nplatform.system() == \"Windows\"; a new additive branch runs ee-gcc directly\nwhen not on Windows, since there is no WSL boundary to cross and nothing to\nstage.\n\nVerified end to end on this machine, not just at the binary level:\ntools/verify.py src/promoted/code1_004f.c (a config/gcc_units.txt unit) went\nfrom 87/87 COMPILE_ERROR to 13 MATCH / 65 ASM / 9 MISMATCH -- real signal,\nnot a blanket failure. This unit holds no first-party functions\n(is_gcc_unit-excluded), so the change has no effect on the project's scored\nmetric; it only unblocks WSGate's ee-gcc-dependent nd_audit step.\n\nGetting there needed no root access. This machine's ee-gcc/cc1/as binaries\nare dynamically-linked 32-bit x86 ELF executables requiring glibc.i686,\nwhich is not installed and dnf install needs sudo this session does not\nhave. Downloaded the glibc/libgcc RPMs with  (a plain fetch,\nno install step, no root) to ~/opt/glibc32, and used  (also fetched via dnf download, extracted by\nhand with rpm2cpio) to repoint each binary's ELF interpreter and rpath at\nthe extracted libraries. The compiler's own MIPS objcopy was missing from\nthis machine's toolchain copy entirely; Fedora's binutils-mips64-linux-gnu\ncross package supplies one that reads/writes this codebase's R5900 objects\nfine for section/symbol stripping purposes.\n\nThe -macro rewrite already in this file (GNU as expands it to ,\nPs2EeAs to ) is what makes substituting GNU  for Sony's\nproprietary Ps2EeAs viable at all on a machine that has neither; it was not\ntouched.\n\nKnown residual, not closed here: 3 of 15 preserved gcc-unit archive bodies\ndrift under this exact substitution (nd_audit reports measured nd 29/17/30\nagainst noted 26/2/26), and running recover_symbols against this toolchain\nchanges config/symbols_recovered.txt enough to fail ~22 test_reconcile\nunit tests. Both point at a real but narrower fidelity gap between GNU as\nand genuine Ps2EeAs beyond the one macro difference already documented,\nconfined entirely to vendor-excluded gcc units. Left config/\nsymbols_recovered.txt untouched rather than committing a result calibrated\nagainst this substitution.\n\nbuild/WSGate_run.py's declaration-environment check still cannot run here\n(build/WSGate_decl_env_check.py was not part of this machine's build/\nmirror); unrelated to ee-gcc.","measures":{"fuzzy_match_percent":26.473392,"total_code":4387560,"matched_code":1161536,"matched_code_percent":26.473392,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7097,"matched_functions_percent":54.171436,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-28T22:09:02Z","commit_sha":"d5372dee7b503c5b37bda653b2333f478c7556ef","commit_message":"recon: close func_002b2e70 with a ternary clamp\n\nnd 5 -> 0. The archived m2c-derived body was already byte-identical except\nfor one clamp: retail's\n\n    switch (var_10 < temp_3) { case 0: var_10 = temp_3; break; }\n\ncompiles to a different register choice (var_4's dying slot reused for the\nsum) than the ternary form of the exact same logic:\n\n    var_10 = (var_10 < temp_3) ? var_10 : temp_3;\n\nwhich reproduces retail's fresh-register choice exactly. switch(bool) vs\nplain if/if-else was confirmed load-bearing first (plain if regresses to\nnd 31); the ternary is a third, better spelling of the same clamp. This is\na new, transferable lever: MWCCPS2 b210 codegens a compare-and-clamp\nassignment differently depending on switch/if/ternary phrasing, independent\nof the underlying logic.\n\n14 other variants tried and rejected on this exact site before the\nternary: fresh/block-scoped named locals for the sum (worse, nd 12),\nduplicating the assignment per switch arm (worse, nd 28), direct\nassignment from the sum (worse, nd 23), and opt_common_subs/propagation/\nlifetimes/scalarizeliveranges all off (no change).\n\nVerified: tools/verify.py MATCH, 0 differing words; decomp_lint 0 errors;\nfull first-party verify 6104 -> 6105/7866, zero regressions, zero marker\ndrift, both SHA1s confirmed unchanged via a separate tools/build.py run\n(image sha1 3d1d3d2b..., SLUS_217.82 sha1 4eeec036...).\n\nGate note: tools/build.py's WSGate_run.py could not be run to full\ncompletion on this machine. Its nd_audit step needs the ee-gcc toolchain,\nwhich requires 32-bit x86 compatibility libraries (glibc.i686) not\ninstalled here and not installable without root; its declaration-\nenvironment check references build/WSGate_decl_env_check.py, which this\nmachine's build/ mirror does not have. Both failures reproduce byte-\nidentically on the unmodified tree (confirmed by reverting this change and\nre-running), so they predate and are unrelated to it. The commit's actual\ncorrectness claim rests on tools/verify.py and decomp_lint, which are the\nbyte-exactness and hygiene authorities and both ran clean.","measures":{"fuzzy_match_percent":26.473392,"total_code":4387560,"matched_code":1161536,"matched_code_percent":26.473392,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7097,"matched_functions_percent":54.171436,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-28T20:50:11Z","commit_sha":"dbc1ee439063d7a4644f63d73f93c5aaf0ee0ca4","commit_message":"docs: correct the CONVERSATION.md push-credential claim\n\nWrong in the previous commit: push actually works fine via gh's credential\nhelper (already authenticated, keyring-backed). which gh failed only\nbecause ~/.local/bin wasn't on PATH in the shell that checked it.","measures":{"fuzzy_match_percent":26.46683,"total_code":4387560,"matched_code":1161248,"matched_code_percent":26.46683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7096,"matched_functions_percent":54.163803,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-28T20:48:55Z","commit_sha":"a0ed84332c9ad46ad550e7592525996a50aa357f","commit_message":"docs: link this conversation, add an IDA Hex-Rays head-start pool\n\nCONVERSATION.md: session id 01a002a5-f866-7000-a28e-dea7a2f78d1a, resumable\nhere via 'omp --continue' now that the transcript is registered under this\nmachine's ~/.omp/agent/sessions/-Projects-Persona 3 Decomp/. Records the\ncampaign state as of commit 33dc7013 and this machine's environment:\ngit+jj co-located clone, the retail ELF and archive corpus copied over,\nMWCCPS2 running byte-exact through wibo (verified: a full tools/verify.py\nrun here reproduces 6104/7866 first-party MATCH exactly, byte-for-byte\nagainst the workstation), and IDA Pro 9.4 with a headless idalib venv.\nNo push credentials are configured on this machine yet; noted explicitly.\n\ndocs/ida_headstart/: tools/ida_headstart.py batch-decompiles every\nstill-unmatched first-party function through Hex-Rays as a second,\nindependent head-start alongside the existing m2c output under\nsrc/generated/. 1756 of 1762 targets decompiled in one 5.6-minute run.\nWritten under docs/, not src/, specifically so decomp_lint's first-party\nsource walk never sees it -- confirmed unchanged at 326 files after adding\n1762 reference files.\n\nVerified against real campaign targets. On an 848B DMA routine it correctly\nreconstructed nested unrolled loops that src/generated/'s m2c output is\ndocumented to mis-render, and rendered retail's hardware addresses as\nMEMORY[0x1000D000] etc, independently corroborating\ntools/hw_access_census.py's findings from a wholly separate tool. On the\nFPU multiply-accumulate chain this campaign already proved is a genuine\nb210 floor, Hex-Rays disassembles every instruction correctly but drops the\naccumulator chain itself into a raw __asm{} island -- everything around it\nstill decompiles to correct C, and the island needs hand translation using\nthe measured rules already in docs/matching.md.\n\nReference only, never compiled: IDA's pseudo-types (__int64, _DWORD, _$F0\nregister aliases) are not MWCC input.\n\nNo metric change: nothing under src/ touched. decomp_lint 0 errors, same\n4 pre-existing warnings.","measures":{"fuzzy_match_percent":26.46683,"total_code":4387560,"matched_code":1161248,"matched_code_percent":26.46683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7096,"matched_functions_percent":54.163803,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-21T21:27:06Z","commit_sha":"33dc70136d0b04e7a384de3b839dc6f72ce39670","commit_message":"recon: wave 4 closes nothing, and the sub-cliff pool is nearly empty\n\n19 never-attempted targets, every one under the 256-byte cliff, four lanes,\n0 matches. The cliff is real but not sufficient: being small is necessary for\na match, not enough for one. Four waves now stand at 3 matches in 62\nattempts, all three from wave 1.\n\nThird correction to the never-attempted census, again in the optimistic\ndirection. Lanes never agreed on an archive filename: besides *_body.c and\n*_body.c.txt the tree holds WT17_004140F0.c, WLFcl_004555d0_base.c and\nothers, and 137 still-unmatched functions carry an attempt under a name the\n_body globs miss. A wave-4 lane spent most of its run rediscovering three of\nthem. recon_pool.py now accepts any .c/.txt under build/ whose NAME encodes an\naddress and whose CONTENT looks like C; the content test keeps probe drivers,\ndisassembly dumps and scope reports out.\n\nNever-attempted first-party has gone 2274 -> 1186 -> 1061 across this session,\nand the tractable end is gone: 0 functions at a window of 128B or less, 7 at\n256 or less, 56 at 400 or less.\n\nWave 4 also re-confirmed the stale-archive problem from a third angle: two\nK3B6 archives cited at nd 34 and nd 18 measure nd 103 and nd 106 under the\ncurrent TU.\n\nRepairs: code1_003c.c line 2790's schedule-off bracket closer lost its\nfunction-scope waiver when a lane inserted an archive note above the marker,\nturning a pre-existing clean pragma into an H003 error; it now carries its own\nsite-scope measured note. Both bracketed functions (func_003cf9b0,\nfunc_003cfa30) still MATCH.\n\nNine bodies archived under build/. Source diffs are comment-only, zero code\nlines added. 6104/7866, zero regressions, zero marker drift, lint 0 errors,\nboth SHA1s unchanged.","measures":{"fuzzy_match_percent":26.46683,"total_code":4387560,"matched_code":1161248,"matched_code_percent":26.46683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7096,"matched_functions_percent":54.163803,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-21T19:19:55Z","commit_sha":"213e897da9c5dfe71ff68b9bf2e3e6d25cd7321b","commit_message":"tools: measure whether the remaining work is reachable from C\n\nThe question 'is the rest just C we have not shaped' was being answered from\nbelief. reachability_census.py answers it with a control: count each unusual\ninstruction class over MATCHED and unmatched first-party functions. A matched\nfunction is proof by construction that b210 emits that instruction from plain\nC in this tree.\n\n  class                       matched  unmatched\n  COP2 (VU0 macro mode)            45         62   reachable\n  MMI (EE multimedia)              43         95   reachable\n  lqc2/sqc2 (VU0 quadword)         38         67   reachable\n  COP0 (mfc0/mtc0/tlb/eret)         3         29   reachable\n  sync                              3         29   reachable\n  syscall                           1          1   reachable\n  movz/movn                         0         31   NEVER matched\n\nThe recurring 'VU0 floor' belief is false here: 45 functions we already match\ncontain COP2 macro-mode instructions, and the same holds for MMI and the\nquadword VU0 loads.\n\nmovz/movn is the sole exception and two independent lines agree. Zero of 6104\nmatched functions contain one, and compiling ten conditional-select idioms\n(ternary, if-assign, inverted, ==0, named temporary, unsigned, pointer-indexed,\nselect-or-zero, zero-or-select, float) at -O0/-O1/-O2/-O3/-O4 and with\n-inline all / -opt speed / -opt space produces none in .text at any setting.\nRetail's uses did not come from C through this compiler.\n\nNote the trap that nearly reversed this conclusion: scanning a whole .o for\nthe opcode pattern reports a confident 14 hits at EVERY optimisation level,\nbecause relocation entries and the symbol table contain matching bytes. The\ncensus scans SHF_EXECINSTR sections only.\n\nNet: 31 of the 1762 remaining first-party functions contain movz/movn and 29\nhave it as their only unusual content. The other 1731, 98%, contain nothing\nthat has not already been produced from C elsewhere in this tree. The language\nis not the obstacle; finding the exact shape is, and above 256 bytes we have\nnot found one yet.\n\nNo metric change: 6104/7866, both SHA1s unchanged, lint 0 errors.","measures":{"fuzzy_match_percent":26.46683,"total_code":4387560,"matched_code":1161248,"matched_code_percent":26.46683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7096,"matched_functions_percent":54.163803,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-21T18:56:31Z","commit_sha":"e098853c1d3ae80b3b6068906b736fba16c9b549","commit_message":"tools: census which unimplemented functions genuinely touch hardware\n\nvolatile is banned here as compiler-steering and required for a real device\naccess, and nothing decided that split from evidence. hw_access_census.py\nreads the retail bytes of every first-party function still on INCLUDE_ASM and\nreports the ones that DEREFERENCE a hardware address. 21 do:\n\n  fromSPR/toSPR DMA, 18 functions -- 0x1000D000 D_CHCR, D010 D_MADR,\n    D020 D_QWC, D080 D_SADR, 0x1000D400 toSPR, 0x1000E010 D_STAT, paired\n    with scratchpad at 0x70000000. code1_003a.c and code1_003b.c transfer\n    routines plus sdkUttmx.c func_00463ea0.\n  Timer 0 init, 1 -- func_00100350 writes T0_COUNT/MODE/COMP/HOLD.\n  Direct scratchpad, 2 -- func_0016bdd0 and func_00174e10 read 0xBF800004.\n\nNone is under the 256-byte cliff (smallest 608B), so none is a near-term\ntarget; the value is knowing that volatile is correct there when they are\nattempted.\n\nTwo traps, both of which gave confident wrong answers first. Segment masking\nis mandatory: EE code reaches devices through KSEG1, so the fromSPR channel\nappears as lui 0xB000 / ori 0xD000 and a literal 0x1000xxxx scan finds\nnothing. And a constant in a register is not an access: func_0039c730 looked\nlike an sq to 0x10000000 but a lui 0x1000 was feeding an or that builds a GIF\ntag word, after which lw v0,-0x477c(gp) reloaded the register while the scan\nstill credited it the stale upper half. Requiring a real dereference, and\ninvalidating a register on load, cut 34 candidates to 21.\n\ndecomp_lint gains the same segment masking, because without it a legitimate\n*(volatile u32 *)0xBF800004 scratchpad access is reported as H001. It\ndeliberately excludes 0xBF800000 and 0x3F800000 from the mask: 0xBF800000 is\n-1.0f as well as the KSEG1 scratchpad base -- retail's own func_001774a0 does\nlui v0,0xbf80; mtc1 v0,f1, which is the float -- and masking it would hand a\nfree volatile waiver to any line mentioning +/-1.0f.\n\nLint output is unchanged: 0 errors, the same 4 pre-existing H003W warnings.\n6104/7866 first-party, zero regressions, zero marker drift, both SHA1s\nunchanged.","measures":{"fuzzy_match_percent":26.46683,"total_code":4387560,"matched_code":1161248,"matched_code_percent":26.46683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7096,"matched_functions_percent":54.163803,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-21T18:15:14Z","commit_sha":"b836b320d1caacced4dd6441d0809806f7746965","commit_message":"recon: measure the near-miss pool instead of trusting it\n\nWave 3 attacked the archived near-miss pool with reconstruction rather than\nspelling permutation. It closed nothing, and the reason is worth more than a\nmatch would have been: the pool's own numbers were wrong, and two lanes\nreached for banned compiler-steering to get past the residuals.\n\nArchive notes record a CLAIMED nd, written by hand as a lane ends, and it\ngoes stale. tools/recon_pool.py --measure now installs each archived body,\nscores it, and restores the file. Claimed vs measured on the top nine:\n\n  001932f0   1 ->  1     003bcf10   2 -> 32\n  001e7ab0   1 ->  1     003bcfb0   2 -> 32\n  00232c70   2 ->  2     003b6da0   6 -> 55\n  00178870   4 ->  4     several archives no longer compile at all\n  003cc250   4 ->  4\n  0045ed60   4 ->  4\n\nSome quoted nd 0 values came from INCLUDE_ASM self-compares, not bodies.\n\nTwo lanes produced nd-0 bodies that were rejected and archived:\nfunc_0045ed60 and func_003c3e90 both reached zero only by casting a\nnon-hardware pointer to volatile to defeat b210's CSE. Before rejecting\n0045ed60 I checked whether retail's repeated loads could be honest aliasing:\na direct u8* cast, a local u8*, a char* source and stores through the\ndestination all let b210 collapse the load groups, scoring nd 59-66 and\nlosing ~44 bytes. So the shape is not reachable from honest C.\n\ndecomp_lint did not catch either one. Its H001 waiver has FUNCTION scope, so\na measured: note written to justify a pragma silently licenses a volatile in\nthe same body, and the construct here was a volatile CAST rather than a\ndeclaration. Both holes are documented; treat a lane's clean lint run as\ninsufficient evidence and read its diff for volatile by eye.\n\nAlso promoted the three lane tools out of the gitignored build/ into tools/,\nwhere they are actually tracked: recon_dis.py (EE-aware disassembly through\nheadless Ghidra), recon_probe.py, recon_pool.py. recon_probe.py now preserves\na marker line verbatim -- it was rebuilding '// FUN_XXXXXXXX' and silently\ndropping the NONMATCHING suffix that 183 files use.\n\nDurable b210 findings from the wave: movz conditional-move tails are a real\nfloor (no C spelling at any -O level emits movz); the retail entry guard\nslt $at,$zero,$reg + beqz is not reachable from C, which folds to\nblez/bltz or colours a named register; the func_003cc250 optimization_level 1\nclaim in-tree is false, nd 4 is the park.\n\nNo metric change: 6104/7866 first-party, zero regressions, zero marker drift,\nboth SHA1s unchanged. Source diffs are comment-only; every non-MATCH body is\narchived under build/ with the tree restored to bare INCLUDE_ASM.","measures":{"fuzzy_match_percent":26.46683,"total_code":4387560,"matched_code":1161248,"matched_code_percent":26.46683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7096,"matched_functions_percent":54.163803,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-21T15:23:48Z","commit_sha":"9e109717d513a306e50ab29f02a1009c2657fc3e","commit_message":"recon: EE-aware disassembly, and the 256-byte cliff\n\nWave 2 ran the wave-1 reconstruction method against larger never-attempted\nfunctions and closed NOTHING in 16 attempts. Pooling both waves by retail\nwindow size separates the results completely:\n\n  window     attempted  matched\n  <= 256 B       8         3\n  257-400 B      6         0\n  > 400 B        6         0\n\nEvery match came from 256 bytes or less. Cold reconstruction works only at a\nsize where the whole function fits in one piece. Since the corrected census\nleaves just 8 never-attempted first-party functions under 256 bytes, that\navenue is nearly spent, and build/wave3_pool.json now lists the successor:\n117 functions still INCLUDE_ASM while carrying an archived body at\n0 < nd <= 25, 84 of them at window <= 400.\n\nbuild/RECON_dis.py now disassembles through a headless GhidraMCP server\nrunning ghidra-emotionengine-reloaded (r5900:LE:32:default), which decodes\nthe Emotion Engine ops rabbitizer cannot: mula.S/madda.S/madd.S/msub.S/\nadda.S/suba.S and the COP2/VU macro ops. rabbitizer printed those as\n'.word 0x46...' INVALID and, worse, named float registers inside them with\nINTEGER register names, so $a2 silently meant $f6 -- two lanes each lost an\nhour to it. The new backend is stdlib-only, so it runs under -E -s with\nPYTHONNOUSERSITE set and the unset dance is gone. rabbitizer remains as an\nautomatic fallback.\n\nNo metric change: 6104/7866 first-party, zero regressions, zero marker drift,\nboth SHA1s unchanged. Nine wave-2 bodies archived under build/; one of them\nhad left code1_003e.c failing to compile in its entirety (an array-typed\nfunction-pointer global assigned as a scalar), which is repaired here.","measures":{"fuzzy_match_percent":26.46683,"total_code":4387560,"matched_code":1161248,"matched_code_percent":26.46683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7096,"matched_functions_percent":54.163803,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-21T13:04:52Z","commit_sha":"15523fd32057705618e0c0a636659cd7dfb908a7","commit_message":"recon: reconstruct three never-attempted first-party functions\n\nPivot from residual-polishing to reconstruction of never-attempted\nfunctions. Nine prior avenues had converged on ~0.6% yield (1 closure in\n~175 hand lanes); a four-lane reconstruction wave closed 3 of 13 attempted.\n\n  func_0028b6b0  code1_0028.c  244/256  (was parked ASM at nd 8)\n  func_003b6cc0  code1_003b.c  212/224\n  func_003e1cb0  code1_003e.c  256/256\n\nfirst-party MATCH 6101 -> 6104 of 7866; zero regressions, zero marker\ndrift, zero MISMATCH rows.\n\nTwo reusable b210 levers, both measured:\n  - retail's doubled beqz comes from NESTED ifs; b210 CSEs an && chain\n    but does not collapse nested ifs.\n  - a table local at the loop-body head forces retail's sll-before-lw\n    body-head instruction order.\n\nCensus corrections. The code1_0041..0052 families are vendor address\nspans (CRI/SDK/CRT) excluded by verify.is_vendor_address, so work there\ncannot move the metric. Counting archives by the *_body.c glob alone\nmissed *_body.c.txt: the true never-attempted first-party population is\n791, of which only 8 are under 256 bytes and 480 exceed 1 KB.\n\nNine archived near-misses with full findings under build/.","measures":{"fuzzy_match_percent":26.46683,"total_code":4387560,"matched_code":1161248,"matched_code_percent":26.46683,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7096,"matched_functions_percent":54.163803,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-16T17:38:27Z","commit_sha":"6b16b59c4ef41c870f78796026fa2d4cac68548e","commit_message":"tools: sweep the MWCC command-line flag axis, per unit and per body\n\nEvery verify compiles with exactly -O2 -Iinclude and that baseline had never\nbeen questioned. build/flag_sweep.py sweeps 15 flag sets per translation unit;\nbuild/flag_sweep_bodies.py sweeps them per archived body. Both are committed so\nthe negative stays re-derivable.\n\nA per-UNIT sweep is structurally incapable of finding anything: an unmatched\nfunction is an INCLUDE_ASM line, so it never reaches the compiler, and the only\nfunctions such a sweep can move are ones that already match. btlShuffle.c holds\n21/21 under every neutral flag set, loses 6 at -O1 and all 21 at -O3/-O4, which\nconfirms both that -O2 is correct and that the flags do reach mwcc. In\npragma-heavy units the sweep reads as a flat line because file-scope\noptimization_level overrides -O: code1_003e.c reports an identical 73 MATCH at\nevery -O level.\n\nPer body, over 124 archived near-misses at nd <= 60, exactly one flag set moved\na residual materially: func_00311930 goes 48 -> 6 under -O1 - which its own\narchive already documents under a function-scoped optimization_level 1 bracket,\nfive residual words in FPU destination-register choice. A rediscovered floor,\nnot a new opening.\n\nCaveat recorded with the tools: normalized_diff rewards a smaller object, so an\n8-byte stub against a 1120-byte window outscores a real attempt. Two apparent\n-O3 wins were exactly that.\n\nNo source change: first-party 6101/7866, 0 MISMATCH, 7866 scanned; lint 0\nfindings; gate clean; image sha1 unchanged.","measures":{"fuzzy_match_percent":26.450054,"total_code":4387560,"matched_code":1160512,"matched_code_percent":26.450054,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7093,"matched_functions_percent":54.140903,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-16T16:55:19Z","commit_sha":"331de7e122ba4999f91927321e481d88aee4e2aa","commit_message":"tools: per-function compiler census; the remaining work is all b210\n\nbuild/prologue_census.py applies the config/gcc_units.txt discriminator (retail\nsaves callee-saved registers with sd under ee-gcc, sq under MWCCPS2) to every\nfunction rather than per translation unit, reading image.bin directly.\n\nResult: of 1765 unmatched first-party functions, 1539 have an MWCC prologue,\n226 are leaves that save nothing, and ZERO have a GCC prologue. Nothing is\nwaiting on an ee-gcc split; every remaining function is reachable in principle\nwith the compiler in use. The GCC populations noted in gcc_units.txt for\ncode1_0041/code1_0044 are all above 0x00417510, inside the vendor ranges.\n\nThe census also isolated the 226 unmatched leaves, which cannot carry the\nsaved-register colouring residual that walls most of the corpus. 82 were never\narchived; a 16-lane wave over the 20 smallest closed zero, hitting COP1\naccumulator chains or ordinary word-level walls at nd 12-64. Leaf-ness does not\npredict closure either.\n\nAlso repaired: a lane wrote tools/verify_config.local.json with a wrong mwcc\npath, which silently turned every scoped verify into COMPILE_ERROR; restored\nfrom tools/build_config.local.json. A whole-file write also truncated\ncode1_003e.c to zero bytes mid-wave; recovered and proven byte-identical to the\nbaseline (69623 bytes, 170 markers).\n\nNo source change: first-party 6101/7866, 0 MISMATCH, 7866 scanned; lint 0\nfindings; gate clean; image sha1 unchanged.","measures":{"fuzzy_match_percent":26.450054,"total_code":4387560,"matched_code":1160512,"matched_code_percent":26.450054,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7093,"matched_functions_percent":54.140903,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-16T15:22:16Z","commit_sha":"8906613777db00f00f80f5b13f0f4c1e18255222","commit_message":"tools: near-size P3 twin search, and the measurement that retires it\n\nbuild/twin_nearsize.py relaxes the exact twin join from identical window sizes\nto +/-4 instructions, scoring masked-instruction alignment with an opcode\nhistogram gate so it finishes. It reports 57 pairs at ratio >= 0.80, 26 of them\nnew.\n\nA 16-lane wave over the best of those closed zero, and the lanes explain why:\nat that tolerance the score matches a shape FAMILY, not a source function. The\nfunc_001a0f40 donor is a 200-byte function against a 448-byte window; the\nfunc_0047ce00 donor dispatches through a jump table where P4 uses a chain; the\nfunc_001bfc00 donor needs P3-only RtQuat and extended BtlUnit fields. One donor\nwas also plain banned inline asm. The size constraint in the original join was\ndoing real work: a twin is only a twin at ratio 1.000 with equal windows.\n\nKept because the census is cheap and the negative is worth being able to\nre-derive; docs/matching.md records the row so nobody retries it.\n\nNo source change: first-party 6101/7866, 0 MISMATCH, 7866 scanned; lint 0\nfindings; gate clean; image sha1 unchanged.","measures":{"fuzzy_match_percent":26.450054,"total_code":4387560,"matched_code":1160512,"matched_code_percent":26.450054,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7093,"matched_functions_percent":54.140903,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-16T14:20:28Z","commit_sha":"97f3e6dd155dc4757bf1538ddfde40639b741bb8","commit_message":"docs: state where the remaining 1765 first-party functions stand\n\nA 16-lane wave over never-attempted functions in 89-98% dense units closed\nzero. That seam built most of this campaign, so its stopping is the important\nresult, and the table now records every avenue with its attempt and closure\ncount: twin ports 8/41, permuter 8 across all corpora and bands, archive tail\n0, m2c band 0, undersized archives 1/32, never-attempted dense units 0/16.\n\nWhat the lanes found is consistent: the remaining never-attempted functions are\nlarge and their residuals land on the same walls the ground corpus sits on.\nfunc_00250ad0 (2720B, only gap in a 98% unit) reduces to COP1 adda.s/madd.s\nchains; func_0036d3e0 (1152B, only gap in a 97% unit) to a callee-saved\nrotation at nd 51. The exhaustive-empty-case hypothesis for k_command\nfunc_00177120/func_001774a0 is retired: adding cases 2 and 4-9 explicitly gives\nnd 75 and 348 differing words.\n\nAlso repaired this wave: a dropped // FUN_001F08C0 marker equivalent in\ng_data.c (duplicate FUN_00105A50 introduced by a lane) and a code1_004a.c\ncompile break from a re-declared extern - both reverted.\n\nNo source change: first-party 6101/7866, 0 MISMATCH, 7866 scanned; lint 0\nfindings; gate clean; image sha1 unchanged.","measures":{"fuzzy_match_percent":26.450054,"total_code":4387560,"matched_code":1160512,"matched_code_percent":26.450054,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7093,"matched_functions_percent":54.140903,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-16T13:24:06Z","commit_sha":"8be39de8058632fce6e8ba84fd8253a768ef162d","commit_message":"docs: hand lanes over the m2c near-miss band close nothing either\n\nSixteen lanes took the sixteen best-scoring m2c candidates the unlock exposed\n(scores 5-48, several exact-size) and closed zero. Their residuals are the same\nregister-colouring and branch-layout walls the archived bodies already sit on,\nreached from a different direction. An m2c seed is worth a measurement and a\nblock map, not a candidate.\n\nAlso repaired during the wave: a lane dropped the // FUN_001F08C0 marker from\ncode1_001f.c, which silently removes a matched function from the denominator.\nCaught by diffing the marker SET against jj @- rather than trusting counts.\n\nNo source change: first-party 6101/7866, 0 MISMATCH, 7866 scanned; lint 0\nfindings; gate clean; image sha1 unchanged.","measures":{"fuzzy_match_percent":26.450054,"total_code":4387560,"matched_code":1160512,"matched_code_percent":26.450054,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7093,"matched_functions_percent":54.140903,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-16T12:25:35Z","commit_sha":"8537747dca0d71f5874978d3c41144ae5a0df9c5","commit_message":"tools: unlock the m2c seed corpus, then close it with measurement\n\ngenerated_bodies() prepended the M2C typedef/#define prelude to the BODY, so an\nactivated seed put typedefs on the line directly below its // FUN_ marker.\npermute.scan_markers names a marker from the line beneath it, so the marker\nstayed nameless and every permuter run on that seed died with \"no // FUN_\nmarker for func_xxxxxxxx\" - reported as a harness error, never as a compile\nfailure, which is why it went unnoticed. 447 of the first-party generated seeds\nwere unusable for that reason alone.\n\nThe prelude now goes in the note, above the marker. It is pure text\nsubstitution, so it cannot change a byte of any object. Usable first-party\nseeds 503 -> 531; scored population 56 -> 206.\n\nWith the corpus unlocked, both engines were run over it: text at 180s across all\n531 cracked zero, and AST at 1200s across the 26 that scored 1-40 cracked zero.\nThe only classifier `match` rows are seven vendor addresses, which score nothing\nfor the metric. The m2c seed question is now settled by measurement: archives\nare the permuter corpus, m2c candidates are not.\n\nNo source change: first-party 6101/7866, 0 MISMATCH; lint 0 findings; gate\nclean; image sha1 unchanged.","measures":{"fuzzy_match_percent":26.450054,"total_code":4387560,"matched_code":1160512,"matched_code_percent":26.450054,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7093,"matched_functions_percent":54.140903,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-16T06:49:53Z","commit_sha":"be4da69f980a9976c0863f61d74a9e36735334be","commit_message":"docs: record the AST budget curve, including where it stops paying\n\nThree more sweeps at a 1200s AST budget: 1 crack from the 41 seeds scored 1-12,\n2 from the 62 scored 13-40, and 0 from the 110 scored 41-120. Combined with the\nearlier 200-300s runs this fixes the budget rule: spend AST time generously on\nscores <= 40, never above it, and expect nothing from raising text-engine time.\n\nEight permuter closures now, all in functions no hand wave had ground.\n\nNo source change: first-party 6101/7866, 0 MISMATCH; lint 0 findings; gate\nclean; image sha1 unchanged.","measures":{"fuzzy_match_percent":26.450054,"total_code":4387560,"matched_code":1160512,"matched_code_percent":26.450054,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7093,"matched_functions_percent":54.140903,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-16T00:03:13Z","commit_sha":"f15dd8b4e832ea0ae3451200aa507f3047d639a1","commit_message":"first-party: +2 (6101/7866), deep AST budget on the 13-40 band\n\nfunc_0032b770 (y_fclCombineDraw) and func_0011bf10 (shdPersona), both found by\ntools/permute_sweep.py --engine ast at 1200s per function over the 62 archive\nseeds the text engine had scored 13-40.\n\nBoth had resisted hand waves: 0032b770 was ported from its P3 FES twin and\nstalled at nd 16 on saved-register/prologue ordering, and shdPersona had four\nlanes probe its neighbourhood without moving anything.\n\nThe AST budget curve is now measured across three bands: at 200-300s the engine\ncracked 2 of 93 seeds scored 1-30; at 1200s it cracked 1 of 41 scored 1-12 and\n2 of 62 scored 13-40. Longer AST budgets keep paying, unlike text-engine budget,\nwhich was measured to buy nothing.\n\nBoth hits were re-verified by splicing and scoring, then reduced with\ntools/permute_min.py and re-verified.\n\nverify: 12720 scanned, 7093 MATCH, 0 MISMATCH; first-party 6101/7866.\nlint 0 findings; gate clean (+2, no regressions); image sha1 unchanged.","measures":{"fuzzy_match_percent":26.450054,"total_code":4387560,"matched_code":1160512,"matched_code_percent":26.450054,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7093,"matched_functions_percent":54.140903,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-15T20:27:47Z","commit_sha":"c6ed9764a86dd1a6550a57023c7f50a8ff2ca41a","commit_message":"first-party: +1 (6099/7866), func_0045aac0 at a deep AST budget\n\nsrc/sdkSnd.c func_0045aac0, found by tools/permute_sweep.py --engine ast at\n1200s per function over the 41 archive seeds the text engine had scored 1-12.\nEvery hand probe recorded in its own header - direct-table, pointer-temporary,\nparameter-type, remasked and pragma spellings - had stalled at normalized_diff\n7-12 on the argument-materialization order.\n\nThis is the budget lever the text engine does not have: the same function saw\nno movement at 200s and 300s AST budgets, and one crack at 1200s. Text-engine\nbudget buys nothing (measured previously); AST budget does.\n\nThe stale ` NONMATCHING` marker suffix was cleared, otherwise verify reports\nSTALE_NONMATCHING for a body that now matches.\n\nverify: 12720 scanned, 7091 MATCH, 0 MISMATCH; first-party 6099/7866.\nlint 0 findings; gate clean (+1, no regressions); image sha1 unchanged.","measures":{"fuzzy_match_percent":26.421974,"total_code":4387560,"matched_code":1159280,"matched_code_percent":26.421974,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7091,"matched_functions_percent":54.12564,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-15T18:20:46Z","commit_sha":"40e4c86805b1e80bbf77291a344173cc84328d59","commit_message":"docs: correct the permuter record with five measured sweeps\n\nThe tree documented the decomp-permuter as exhausted. It is seed-limited: after\nthe archive-note fix made 53 more archives measurable, re-seeding produced five\nclosures in two sweeps, every one in a function no hand wave had ground.\n\nRecorded: which engine reaches what (text on 461 archive seeds cracked 3; AST on\nthe 93 seeds text scored 1-30 cracked 2; AST on the 365 seeds scored above 30\ncracked 0), that the AST engine had never run here because pycparser and toml\nwere missing and are invisible under PYTHONNOUSERSITE=1, that m2c candidates do\nnot parse for AST and score nothing under text, and the permute_sweep splice\ntrap that silently deletes markers when the target is a bare INCLUDE_ASM.\n\nNo source change: first-party 6098/7866, 0 MISMATCH; lint 0 findings; gate\nclean; image sha1 unchanged.","measures":{"fuzzy_match_percent":26.415775,"total_code":4387560,"matched_code":1159008,"matched_code_percent":26.415775,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7090,"matched_functions_percent":54.118008,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-15T12:55:59Z","commit_sha":"53d7067489b9378f1682ce11f459448704b3adf4","commit_message":"first-party: +2 (6098/7866), decomp-permuter AST engine\n\nfunc_00296600 (code1_0029) and func_0027d800 (itfMsgProcedure_Window), both\nfound by tools/permute_sweep.py --engine ast over the 93 first-party seeds the\ntext engine had scored 1-30.\n\nThe AST engine had never actually run on this tree: it needs pycparser and toml,\nneither of which was installed, and it is invisible under PYTHONNOUSERSITE=1.\nWith them installed and that variable unset it constructs, and it restructures\ncode where the text engine only reorders - which is exactly what the scored\ntail needs. func_00296600 had resisted four hand waves (best nd 8, saved-register\nrotation) and func_0027d800 was never attempted.\n\nBoth hits were re-verified by splicing them in and scoring, not trusted from the\nsweep log; func_00296600 was then reduced with tools/permute_min.py and\nre-verified (12 -> 9 permuter temporaries, still exact).\n\nverify: 12720 scanned, 7090 MATCH, 0 MISMATCH; first-party 6098/7866.\nlint 0 findings; gate clean (+2, no regressions); image sha1 unchanged; linked\nobjects 1446/1863.","measures":{"fuzzy_match_percent":26.415775,"total_code":4387560,"matched_code":1159008,"matched_code_percent":26.415775,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7090,"matched_functions_percent":54.118008,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-15T11:26:28Z","commit_sha":"a11ee1b144696061cbcf1907f978b7e00adc68d9","commit_message":"first-party: +3 (6096/7866), decomp-permuter cracks\n\nfunc_003ca430 (code1_003c), func_001ee490 (code1_001e) and func_002e6b20\n(y_list), all found by tools/permute_sweep.py with the text engine.\n\nThe reason this sweep produced cracks where the last one produced none is the\nseed population, exactly as docs/matching.md predicts: the permuter cracks\nbodies nobody has hand-ground. Fixing the archive-note comment terminator made\n53 archives in code1_003c measurable for the first time, and re-seeding the\nsweep from the 461 first-party archives that now compile turned up three\nfunctions no wave had ever ground.\n\nfunc_003ca430 keeps a scoped `#pragma optimization_level 3`; at the file\ndefault its eleven func_003e8930 registration results fold into a different\naccumulate/branch chain. Two measured waivers added for the pragma brackets.\n\nScored tail for the next pass, now measured rather than guessed: nd 1\nfunc_002774d0 and func_001932f0, nd 2 func_00232c70, nd 3 func_00165fb0,\nnd 4 func_00178870 / func_0045ed60 / func_00153300 / func_003cc250.\n\nverify: 12720 scanned, 7088 MATCH, 0 MISMATCH; first-party 6096/7866.\nlint 0 findings; gate clean (+3, no regressions); image sha1 unchanged.","measures":{"fuzzy_match_percent":26.400824,"total_code":4387560,"matched_code":1158352,"matched_code_percent":26.400824,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7088,"matched_functions_percent":54.10274,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-15T08:06:22Z","commit_sha":"427bc8f75bd2d74f3ee7fb7649221a47f5b6b456","commit_message":"tools: stop archive notes with embedded */ from breaking the unit\n\narchive_to_guard re-emitted an archive measurement note verbatim above the\nmarker. Notes that mention a pointer type carry a literal `*/` in their prose\n(\"levers ruled out: parameter u8*/u32* forms\"), which closes the comment early\nand makes the whole translation unit fail to parse.\n\nMeasured cost: 56 archived bodies in src/promoted/code1_003c.c alone were\nunmeasurable, and several lanes this week reported the symptom as a mysterious\nunit-wide COMPILE_ERROR they could not attribute. Re-running\nbuild/arch_classify.py with the fix drops the compile-error bucket from 110 to\n61 and adds 53 first-party archives to the measured set, the best of which are\nfunc_003cc250 (104/112, nd 4), func_003c9940 (172/176, nd 6) and func_003ca830\n(92/96, nd 14).\n\nAll 53 were then attempted by a 16-lane wave; none closed, so the unit is now\nmeasured rather than invisible. No source change: first-party 6093/7866,\n0 MISMATCH; lint 0 findings; gate clean; image sha1 unchanged.","measures":{"fuzzy_match_percent":26.375298,"total_code":4387560,"matched_code":1157232,"matched_code_percent":26.375298,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7085,"matched_functions_percent":54.07984,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-15T06:57:39Z","commit_sha":"b6d921283f42c7128f8852061851275677606b64","commit_message":"first-party: +1 (6093/7866), func_001f58d0\n\nA missing-block lane rebuilt the body from the retail block map and reached the\nexact 304-byte window at normalized_diff 2; the last two words were both\ncommutative addu transpositions. Writing the base-plus-offset as a pointer add\nclosed the first, and indexing the record array directly\n`temp_4 + ((s32 *)(temp_4 + 4))[index * 3]` closed the second.\n\nThe rest of the wave measured out: of sixteen undersized archives, one had a\ngenuinely missing block (func_00279030 omitted a real func_00272ba0 call, seven\ninstructions, which took it from 424B to 452B against a 448B window), two were\nnot undersized at all once retail zero-padding was accounted for, and the other\nthirteen already expressed every retail block, leaving register-allocation\nresiduals. Their block maps are recorded in the lane archives under build/.\n\nverify: 12720 scanned, 7085 MATCH, 0 MISMATCH; first-party 6093/7866.\nlint 0 findings; gate clean (+1, no regressions); image sha1 unchanged.","measures":{"fuzzy_match_percent":26.375298,"total_code":4387560,"matched_code":1157232,"matched_code_percent":26.375298,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7085,"matched_functions_percent":54.07984,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-15T06:34:35Z","commit_sha":"6f7f2e9deea1197ed1772f5c59aa57f16e68030b","commit_message":"tools: measure and classify the archived candidate corpus\n\nbuild/arch_measure.py activates every archived `#ifdef NON_MATCHING` body one\nat a time and scores it, because verify.py never scores a guarded body, so a\nguarded corpus reports nothing. build/arch_classify.py additionally diffs the\nobject against the retail window word by word and names the residual class:\nimmediate, width, register, opcode or size.\n\nMeasured over 726 archives: 520 first-party scored, 30 at nd <= 10, 53 at\nnd <= 20. Classified over 686 first-party archives: 361 are `size` (the body\nis missing or carrying a whole block; 75 within 4 bytes, 220 within 16), 166\nare invisible to the permuter harness, 110 no longer compile, and only ~45\nhave a pure word-level residual. Exactly four of those are single-kind, and\nall four were then probed to a floor.\n\ndocs/matching.md records the P3 FES twin-port recipe that produced this\nsession's eight closures (masked-instruction fingerprint join, donor asm\nclassification, immediates always being the residual) and the archive census\nabove, whose consequence is to stop mining the near-miss tail.\n\nNo source change: verify first-party 6092/7866, 0 MISMATCH; lint 0 findings;\ngate clean; image sha1 unchanged.","measures":{"fuzzy_match_percent":26.368368,"total_code":4387560,"matched_code":1156928,"matched_code_percent":26.368368,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7084,"matched_functions_percent":54.07221,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-15T05:09:24Z","commit_sha":"14a6795419190213c3f2e21fb183aba6121512ba","commit_message":"first-party: +2 (6092/7866), P3 FES twin ports\n\nfunc_001d75d0 (code1_001d) and func_001e7400 (code1_001e), both ported from\ntheir byte-identical Persona 3 FES twins with P4 immediates taken from the\nretail window: iGpffffb3ac, field 0xD04, loop bound 0x30, singleton 0xDC4,\nclear mask 0xFFFBFFFF for the first; formation field 0x170 (donor 0x148) and\nthe P4 callee set for the second.\n\nTwelve further twins were attempted and archived: donors were portable C but\nthe P4 counterpart diverges by more than immediates (nd 33-505). Running\ntotal for the technique: 8 closures from 41 candidate twins.\n\nverify: 12720 scanned, 7084 MATCH, 0 MISMATCH; first-party 6092/7866.\nlint 0 findings; gate clean (+2, no regressions); image sha1 unchanged.","measures":{"fuzzy_match_percent":26.368368,"total_code":4387560,"matched_code":1156928,"matched_code_percent":26.368368,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7084,"matched_functions_percent":54.07221,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-15T04:50:23Z","commit_sha":"bda74fe53a25896e111394d9bcccb9d929dbe358","commit_message":"first-party: +5 (6090/7866), P3 FES twin ports\n\nfunc_001538a0 (code1_0015), func_001da930 (code1_001d), func_001cca60\n(btlCamera), func_001e7640 and func_001ed060 (code1_001e), each ported from\nits byte-identical Persona 3 FES twin and finished against the P4 retail\nwindow.\n\nThe recurring residual in a twin port is an IMMEDIATE, never the shape: three\nof these five closed by correcting field offsets the donor supplied from P3\n(0x18 -> 0x1c, resource[5] -> resource[6], 0x2cc -> 0x318) and one by loading\na field the port had passed by address.\n\nAlso repaired in this wave: a mangled `SM(...)` line and a duplicated tail\nmarker in code1_001c/code1_001e that made the whole unit COMPILE_ERROR, a\nhelper spliced between a marker and its INCLUDE_ASM (NO_SYMBOL), and four\nfile-scope extern declarations a lane deleted, which had silently regressed\nfunc_001c6650 in btlCamera.\n\nArchived near-misses: build/K1E_001e7ab0_body.c (nd 1, addiu-vs-daddiu width)\nand build/K1E_001ef4d0_body.c (one surplus register move).\n\nverify: 12720 scanned, 7082 MATCH, 0 MISMATCH; first-party 6090/7866.\nlint 0 findings; gate clean (+5, no regressions); image sha1 unchanged.","measures":{"fuzzy_match_percent":26.35524,"total_code":4387560,"matched_code":1156352,"matched_code_percent":26.35524,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7082,"matched_functions_percent":54.056942,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-15T03:51:45Z","commit_sha":"946022d6a31a1bd218cafc1ae496fd565b1fc33b","commit_message":"first-party: +1 (6085/7866), cross-tree twin port from P3 FES\n\nfunc_002a2980 in src/Yajima/y_timeLimit.c ported from its byte-identical\nPersona 3 FES twin at P3 0045b190 (src/Yajima/y_timeLimit.c), including the\nyTimeBlend helper; P4 immediates, field offsets and the sin helper\n(func_0044b7b0) taken from the P4 retail window.\n\nRebuilt the shared-P3 map against the live P3 metrics snapshot (6922 P3\nMATCH addresses, not the stale 1-address read): build/shared_p3_new.json.\nA masked-fingerprint join (SPECIAL/MMI kept whole, J/JAL opcode only,\nbranches and I-type immediates masked) finds 41 first-party P4 targets whose\nP3 twin is a verified match; the 15 highest-confidence were attempted this\nwave. Most donors turned out to be inline-asm bodies (banned) or portable C\nwhose P4 counterpart diverges by more than immediates.\n\nverify: 12720 scanned, 7077 MATCH, 0 MISMATCH; first-party 6085/7866.\nlint 0 findings; gate clean (+1, no regressions); image sha1 unchanged.","measures":{"fuzzy_match_percent":26.297623,"total_code":4387560,"matched_code":1153824,"matched_code_percent":26.297623,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7077,"matched_functions_percent":54.018776,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-15T02:31:42Z","commit_sha":"97bdb52fef1addb4ce97c7f6f917376502933b9e","commit_message":"docs: record measured target-selection findings from four zero-yield waves\n\nFour 16-lane waves closed nothing. Every failure traced to target selection:\nan entire wave spent inside VENDOR_CODE_RANGES (code1_0042/0043/0044/004c/\n004d/0051 score zero against the first-party metric), a wave on the exhausted\ntiny-window seam (only four first-party ASM rows are <=32B and all four are\ndocumented floors), a wave re-grinding the measured near-miss tail (130 source\nrevisions across twelve nd 5-28 residuals, none moved), and a permuter sweep\nseeded with 4387 m2c candidates that cracked zero.\n\nCorrect first-party never-attempted total at 6084/7866 is 1778 rows.\n\nNo source change: verify 12720 scanned, 7076 MATCH, 0 MISMATCH, first-party\n6084/7866; lint 0 findings; gate clean; image sha1 unchanged.","measures":{"fuzzy_match_percent":26.282671,"total_code":4387560,"matched_code":1153168,"matched_code_percent":26.282671,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7076,"matched_functions_percent":54.011143,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-14T23:50:30Z","commit_sha":"fef75131744441f9d4c71cff5cda10a9ecc516cf","commit_message":"first-party: +2 (6084/7866), wave U salvage\n\nfunc_001f6770 (code1_001f) and func_002b3ae0 (y_symbol) closed.\nTen source files were NUL-corrupted by concurrent lane writes and were\nrestored byte-identical from 803ade54; four surviving live mismatches\n(cmpConfig 0035cb00, cmpEquip 00131730, code1_0039 0039beb0,\nnLine 0034ba30) reverted to their INCLUDE_ASM state.\n\nverify: 12720 scanned, 7076 MATCH, 0 MISMATCH; first-party 6084/7866.\nlint 0 findings; gate clean; image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78.","measures":{"fuzzy_match_percent":26.282671,"total_code":4387560,"matched_code":1153168,"matched_code_percent":26.282671,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7076,"matched_functions_percent":54.011143,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-14T22:04:30Z","commit_sha":"803ade54bbb4f8b895ffa52e62e89349617ad3c7","commit_message":"first-party: +6, crossing 54% of the whole image byte-exact\n\nFirst-party 6076 -> 6082 of 7866 (77.24% -> 77.32%); tree-wide 7068 -> 7074,\nwhich is 54.00% of the image. Zero regressions, zero MISMATCH, image unchanged at\n3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n  func_0049a370  effPolygonRing     364/368  opt_propagation off fixes a GLOBAL\n  func_001bd390  code1_001b         352/352  opt_common_subs off keeps a masked index\n  func_001839e0  code1_0018         416/416  one cached callback, cases 0..4\n  func_00275c00  frFontRaster       assignment order inside a list update\n  func_00221770  btlResultSimple    368/368\n  func_004bc1e0  eff_after          previously written off as register rotation\n\n## Four new levers, each named by its instruction effect\n\n**`opt_propagation off` on an ADDRESSING MODE.** `func_0049a370` needed a\n`quadSrc`/`quad` local pair plus a measured `opt_propagation off` bracket to make\n`D_00713CE0` materialise as retail's `lui`/`addiu`/`lq`. Every prior use of that\npragma in this campaign fixed a register; this is the first time it fixed how a\nglobal is addressed.\n\n**`opt_common_subs off` to preserve a per-use load.** `func_001bd390` (three saved\nregisters: base, counter, current) needed a separate `ability` load and the\nbracket, because the compiler was hoisting one masked index that retail recomputes\nat each use.\n\n**Assignment order inside a linked-list update.** `func_00275c00` closed with\nthree `u32 *` locals (current, previous, loop temp), tail conditions written\n`!= 0` first rather than `== 0`, and critically `previous = temp` BEFORE\n`current = temp[6]`. Frameless, no saved registers, no pragmas.\n\n**One cached untyped callback.** `func_001839e0` is a 416-byte switch dispatcher\nthat closed with a two-argument signature whose first argument is unused, a single\n`u8 *callback = (u8 *)D_00887300`, every call made through a cast function\npointer, and cases 0..4 written directly. No pragmas at all.\n\n## A floor label retracted for the fourth time\n\n`func_004bc1e0` in eff_after.c carried an archive classifying it as \"register\nrotation, operand and address reuse\" at nd 34/49. That names none of the five\ncompiler-level families, so TEFF treated it as open and closed it. Four such\nlabels have now fallen this way. The rule stands: only movz/movn, COP1 accumulator\nchains, standalone MMI with no COP2 in the statement, the framed tail-j forwarder,\nand retail `sd $sN` earn the word floor.\n\n## Floors proven with instruction AND address\n\n  func_00498f10  adda.s 0x00498FF0 + madd.s 0x00498FF4\n  func_00499e40  adda.s 0x00499F24 + madd.s 0x00499F28\n  func_0021fa40  adda.s/madd.s at 0x0021FCFC/FD00, FD14/FD18, FE00/FE04\n  func_0021fea0  adda.s 0x00220D94 + madd.s 0x00220D98\n  func_00390680  adda.s/madd.s 0x00390A84 and again at 0x00390FB8\n  func_003963c0, func_00396520  mula.s/madda.s/madd.s immediately\n  func_003a03a0  pcpyld 0x003A04FC     func_003a0aa0  pcpyld 0x003A0D74\n  func_003a14f0  pcpyld 0x003A153C\n  func_003a1730, func_003a1c40  scalar sq/lq canonicalisation\n\n## Instruction deficits, now the standard vocabulary\n\nLanes report absent instructions rather than diff numbers, and the numbers are\nsmall enough to act on: `func_00275a60` 1, `func_0018a010` 1, `func_0021ed10` 1,\n`func_001f1030` 1 surplus, `func_0021f340` 2, `func_003a2340` 2 surplus,\n`func_0034ba30` 3, `func_001f0dd0` 5, `func_00177120` 6, `func_004b53c0` 6 after\nreducing locals from 16, `func_001774a0` 10, `func_0021ef70` 18 surplus,\n`func_00275d80` 18 with the frame 416 against retail's 448 and s4/s5 unsaved.\n\nT04B's progression on `func_004b53c0` is the pattern to copy: 304/368 (16 absent)\n-> 344 (6 absent) -> 368 exact size with the frame corrected from 0x50/four saves\nto 0x40/three saves, landing at nd 76. The deficit was locals, exactly as the\nprologue said.\n\n## Tooling note\n\n`fndiff.py` reported \"differing words 2\" with no `!` rows on `func_00275c00`,\nwhich `verify.py` scores nd 0 / MATCH. Trust the verify ROW STATUS: fndiff's count\nincludes relocation and tail accounting that verify masks correctly.\n\n## Repairs\n\nThree live non-matching bodies survived the cutoff and I reverted them by hand:\n`func_00177120` and `func_001774a0` in k_command.c (a lane reported them restored\nwhile verify still saw both) and `func_003eb3b0` in rwcore_grouped.c. Marker counts\nconfirmed at 26 and 309 afterwards. The mid-splice phantom compile errors appeared\nagain in rwcore_grouped.c and were again sound on inspection.\n\nNearest unclosed: func_003cbf30 nd 3, func_00103c40 nd 4, func_00275a60 nd 8 with\na 1-instruction deficit, func_0033fa30 nd 19 exact size, func_0034ac00 nd 14 exact\nsize, func_003a2290 1-instruction surplus.\n\nPublished: 7074/13101 matching, 1438 C-linked.","measures":{"fuzzy_match_percent":26.265898,"total_code":4387560,"matched_code":1152432,"matched_code_percent":26.265898,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7074,"matched_functions_percent":53.995876,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-14T20:59:21Z","commit_sha":"71e7d06541bd0d33ba440d20c186883ed44a77e1","commit_message":"first-party: +7, and eleven floors proven with their exact instructions\n\nFirst-party 6069 -> 6076 of 7866 (77.16% -> 77.24%); tree-wide 7061 -> 7068.\nZero regressions, zero MISMATCH, image unchanged at\n3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n  func_00194c90  btlPacket           296/304  completes that file at 3/3 MATCH\n  func_001d3ba0  btlFormation        352/352  struct-typed stack aggregate\n  func_001ec790  btlTarget           opt_propagation off\n  func_0033be40  y_fclItemShopDraw   324/336  opt_loop_invariants bracket\n  func_00103b00  code1_0010          308/320\n  func_003e12f0  code1_003e          the (u8 *) signature other files declare\n  func_003e2650  code1_003e\n\n## The frame lever, stated precisely\n\nSFRM's `func_001d3ba0` is the clearest demonstration yet of how to control a\nframe from C. A struct-typed stack aggregate with EXPLICIT GAP FIELDS -\n`offsets[3]`, gap, `transformed[3]`, gap, a 32-byte gap, `base[3]`, gap,\n`result[3]`, gap - forced retail's exact `sp48`/`sp64`/`sp112`/`sp128` slots and a\n144-byte frame. Paired with `extern u8 D_00609470[]` at block scope, where a\nscalar declaration had produced a `$gp` load instead of retail's absolute address.\n\nThat is the answer to the question this campaign keeps hitting: you cannot ask\nMWCC for a stack layout, but you can describe one and it will honour it.\n\n## Instruction deficits, not diff numbers\n\nLanes now report undersized candidates in instructions, and the diagnostic value\nis obvious in S3C1's progression on `func_003c9d40`: 256 bytes (16 instructions\nabsent) -> 288/320 (8 absent) -> 324/320 (1-instruction surplus). Each step found\nreal missing work. Compare the same lane's `func_003cbf30`, stuck at nd 3, where\nfive more shapes were ruled out and the deficit is zero - a genuinely different\nproblem.\n\nDeficits recorded this wave: `func_003e9830` 10 instructions, `func_00390520` 23,\n`func_003c4a80` 12, `func_00177120` 6, `func_001774a0` 10, `func_0027a150` 3,\n`func_002774d0` 3, `func_003ea130` 3, `func_003cfff0` 1, `func_0040a500` 1.\n\nSRWA also retracted its own earlier misreading, which is worth recording: its\n`func_003e99a0` measurement of 304/336 was a genuine 8-instruction deficit, not a\n\"shared object race\". The disassembled prefix agreed with retail right up to the\nomitted block, which is exactly what makes this failure mode feel like a\nscheduling residual when it is not.\n\n## Eleven floors with proving instructions and addresses\n\n  func_003c0960  movz $20,$0,$2      0x003c0edc\n  func_003c2cf0  movz $17,$0,$2      0x003c307c\n  func_003cd720  movn $5,$0,$17      0x003cd8f8 and movn $6,$3,$17 at 0x003cdeb4\n  func_003fd520  movz $a2,$a1,$v0    +0x40\n  func_003c3ae0  adda.s/madd.s       0x003c3be4/0x003c3be8\n  func_003cb300  mula.s/madda.s/madd.s  0x003cb494/98/9c\n  func_003c1d40  mula.s/madda.s/madd.s  +0x70..+0x7c\n  func_003cf140  pcpyld $3,$3,$6     0x003cf2b8, no COP2 in statement\n  func_00402970  pcpyld x6           +0x48/+0x78/+0xB8/+0xC8/+0xE0/+0xF0\n  func_0040eee0  pcpyld x7           +0x34/+0x4C/+0x60/+0x74/+0x88/+0xBC/+0xD0\n  func_00402c10  pcpyld x4 plus a privileged COP0 di/sync.p/mfc0 c0_sr/ei run\n\nThat last one is worth the distinction SRWA drew: the COP0 sequence is NOT the\nblocker, because privileged instructions are legitimate inline-asm territory\nunder H009. It is blocked by the standalone MMI. Naming which of two candidate\nfloors actually applies is the difference between a useful archive and a wrong one.\n\n## Phantom blockers cost more than real ones\n\nFive times this wave a lane reported a shared-file compile break and stalled on\nit. I checked each directly - `sed -n` on the cited line, a comment- and\nstring-aware brace scan, a full scoped verify - and every one was sound: the file\ncompiled, braces balanced, marker count intact. Each was a snapshot taken while a\nsibling was mid-splice.\n\nThe rule that handles it is already in the brief and needs no coordination: when a\nverify names a function that is not yours, restore your own body, re-run once,\nproceed. One lane reported three phantoms and lost most of its budget to them.\n\nAlso caught and cleared: four live non-matching bodies at cutoff\n(`func_003e9830`, `func_003ea130`, `func_0040a500`, and `func_003e2800` left by a\ncancelled lane, which I reverted by hand).\n\nNearest unclosed: func_003cbf30 nd 3 (five more shapes ruled out),\nfunc_00103c40 nd 4, func_003c9d40 1-instruction surplus, func_0040a500 nd 30 with\na 1-instruction deficit, func_001d3950 nd 14, func_0034ac00 nd 14 exact size,\nfunc_003720c0 nd 16.\n\nPublished: 7068/13101 matching, 1438 C-linked.","measures":{"fuzzy_match_percent":26.215939,"total_code":4387560,"matched_code":1150240,"matched_code_percent":26.215939,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7068,"matched_functions_percent":53.95008,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-14T19:10:51Z","commit_sha":"29d03cb87680bde1cf27bc64c9dc3de171c57472","commit_message":"first-party: +10 again, and undersized candidates are a missing block, not a residual\n\nFirst-party 6059 -> 6069 of 7866 (77.00% -> 77.16%); tree-wide 7051 -> 7061.\nZero regressions, zero MISMATCH, image unchanged at\n3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n  func_0027a970  code1_0027   736/736   `count > 4U` (not >=5) for retail sltiu $at\n  func_00293710  code1_0029   frame 160, s4-s0 + f20-f23, interleaved signature\n  func_001e9770  code1_001e   468/480   direct `(u32)x > y` guard -> retail sltu $at\n  func_001d1310  code1_001d   416/416   `(f32)(s32)(field*scale)` + direct branch tree\n  func_00112300  code1_0011   union {s64; f32[2]} + interleaved renderer prototypes\n  func_002e7920  code1_002e\n  func_002e82b0  code1_002e\n  func_00486840  code1_0048   u_long128 return + early-path return value, VU asm exact\n  func_004940d0  code1_0049   280/288   frame 0, no saves, a0-a2 in, a3 scratch\n  func_00186ac0  k_fldLmap    460/464   f32 `0.0f` store -> retail mtc1 $zero + swc1\n\nThird consecutive wave at +9, +10, +10 using the same targeting rule: rank by\n\"no archive exists\", never by archived normalized_diff.\n\n## The one thing that separates closing lanes from the rest\n\nFrame-first. Every closure this wave came from a body written AFTER the retail\nprologue was decoded: `func_004940d0` needed frame 0 with zero saved registers\nand `a0`-`a2` incoming with `a3` scratch; `func_00293710` needed a 160-byte frame\nsaving `s4`-`s0` plus `f20`-`f23` and an INTERLEAVED `(s16,s32,f32,f32,f32,f32,\ns32,u8*)` signature; `func_00112300` needed a `union { s64 whole; f32 values[2]; }`\nand interleaved renderer prototypes.\n\nAnd the converse is now measured precisely, thanks to RRWA expressing deficits in\nINSTRUCTIONS rather than bytes:\n\n  func_003ed540   244/272   7 instructions absent\n  func_003ed850   232/272  10 instructions absent\n  func_003fe210   248/272   6 instructions absent\n  func_003f24a0   264/288   6 instructions absent\n  func_003f4950   292/304   3 instructions absent\n  func_00112830  2096/2192 96 bytes short, retail frame 0x120 with 9 saved regs\n\nAn undersized candidate is a MISSING BLOCK or a missing argument - an early\nreturn the decompiler folded away, a second loop path, an error branch. No\nordering probe or pragma can conjure absent instructions, and \"nd 158\" hides\nthat while \"seven instructions absent\" names it. I redirected that lane from\nporting M2C candidates to transcribing the retail window instruction by\ninstruction, accounting for every one.\n\n## Two markers were deleted and both were caught by counting\n\nRRWA noticed `rwcore_grouped.c` scanning 308 instead of 309. Audit showed\n`func_003ed7e0` deleted ENTIRELY - marker and `INCLUDE_ASM` both - between\n`func_003ed650` and `func_003ed850`. Restored from `jj file show -r main`; the\nmarker set now matches baseline exactly. RDAT independently found and repaired a\nmissing `// FUN_00232D80` in datCalc.c, and R399 restored a dropped\n`FUN_00398540`.\n\nThis is the only defect class the verifier cannot report: lint passes, the marker\naudit passes, the row set looks clean, and the scanned denominator quietly shrinks\n- which inflates the published percentage. Counting markers before and after is\nthe only detector, and three lanes exercised it this wave.\n\n## New source levers, each with its instruction evidence\n\n  storing `0.0f` as f32        -> retail `mtc1 $zero` + `swc1`\n                                 (an s32 zero store came out 8 bytes short)\n  `count > 4U` not `>= 5`      -> retail `sltiu $at`\n  direct `(u32)x > y` in the   -> retail `sltu $at`; a comparison landing in $at\n  if, never via a local           is what MWCC emits when it is consumed\n                                 immediately by a branch and never materialised\n  `u_long128` return + early   -> matched a VU-asm function's aggregate path\n  path return value\n\n## H009 repair\n\n`func_00486840` closed with an inline-asm block containing only `sw` - ordinary\ncomputation, which rule H009 forbids. Merged those three stores into the\npreceding COP2 statement, where GPR plumbing is explicitly permitted because it\nrides along with a `cfc2`. Lint went 1 error to 0 and the function still verifies\nMATCH at 296/304 nd 0.\n\nFloors newly confirmed with proving instructions: `func_003fd520` (`movz $a2,$a1,\n$v0` at +0x40), `func_003f02d0` and `func_003f03f0` (COP1 chains), `func_003c39c0`\n(`movz $s1,$zero,$v0` at +0xDC), `func_00188320` (`adda.s` at 0x001884DC +\n`madd.s` at 0x001884E0), `func_0026c190` (`adda.s`/`msub.s`).\n\nNearest unclosed: func_003cbf30 nd 3, func_003de8c0 nd 6 (two shapes newly ruled\nout), func_0026ba60 nd 15, func_00396940 nd 15, func_003f2760 nd 28 exact size,\nfunc_00269c70 nd 31 exact size.\n\nPublished: 7061/13101 matching, 1438 C-linked.","measures":{"fuzzy_match_percent":26.168167,"total_code":4387560,"matched_code":1148144,"matched_code_percent":26.168167,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7061,"matched_functions_percent":53.89665,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-14T18:04:34Z","commit_sha":"1febeba350a60004da92b1c0beb069e91e701fc0","commit_message":"first-party: +10, crossing 77%, and one file gave six\n\nFirst-party 6049 -> 6059 of 7866 (76.90% -> 77.00%); tree-wide 7038 -> 7051.\nZero regressions, zero MISMATCH, image unchanged at\n3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n  func_00270b80  code1_0027      280/288\n  func_00270ca0  code1_0027      392/400\n  func_0027b310  code1_0027      424/432\n  func_0027a780  code1_0027      492/496\n  func_0027ac50  code1_0027      564/576\n  func_0027ae90  code1_0027      616/624\n  func_001106f0  code1_0011      280/288\n  func_001eec60  code1_001e      176/176   u8* return + shared return-tail goto\n  func_003cbcf0  code1_003c      236/240   frame/signature first, then field order\n  func_0048a650  mdlEffect       444/448   raw[0x50], 3 saved FP locals, COP2 asm\n  func_003d4d80  rpworld         128/128   typed stack[2] + explicit branch return\n  func_003d4e10  rpworld         128/128   same shape, closed as a pair\n  func_003f4be0  rwcore_grouped  168/176   six GP globals declared block-scope\n\nSecond never-attempted wave. The strategy that produced +9 last time produced\n+10 again, so it is not noise: rank by \"no archive exists\", never by archived nd.\n\n## code1_0027.c: six of six\n\nQ027 was given four never-attempted functions in a file no lane had opened and\nclosed all four, then continued and closed two more. Six for six, and every\ncandidate landed 8 to 16 bytes UNDER its window, which is the whole story: the\nframe and signature were right before a line of body was written. Its method,\nin order:\n\n  1. match retail's saved-register frame and the parameter signature first\n  2. block-scope callee declarations, including an old-style declaration for\n     func_0027a150 to reproduce argument materialisation order\n  3. force the alias reload retail performs\n  4. reproduce retail's addu operand order\n  5. match local declaration order for register allocation\n\nCompare the lanes that closed nothing: QRWB attempted fifteen functions and\nfourteen came out UNDERSIZED (216/224, 224/240, 208/240, 140/240, 188/240,\n192/240, 208/256, 236/256 ...). Undersized means missing work, and no amount of\nreordering fixes it. QRT2's five attempts were all OVERSIZED by 8-20 bytes -\ntoo many long-lived locals, so too many saved registers and too big a frame.\nBoth patterns are frame-and-signature errors diagnosable from the retail\nprologue in under a minute, before any body is written.\n\n## Two floor labels retracted, both by measurement\n\nQCMP catalogued retail `c.le.s` / `trunc.w.s` / `andi 0xffff` on one path and\n`sub.s` / `trunc.w.s` / `or 0x80000000` / `andi` on the other as a \"guard floor\nb210 deletes\", with exact offsets in two functions. That sequence is MWCCPS2's\nOWN float-to-unsigned conversion, emitted from a plain `(u32)f` or `(u16)f`\ncast - the compiler picks a path, converts, and biases the high one. Eight\nfunctions in this campaign closed on that idiom. Archives corrected; the\n`adda.s`/`madd.s` chain in the same file remains a genuine floor.\n\nQ1EE labelled a three-operand `mult $v0,$a0,$s8` a floor. Also retracted: b210\ndoes emit rd-form `mult`, proven two waves ago when another lane's plain C\nproduced the identical raw word. That function then measured nd 5.\n\nOnly five families earn the word floor: movz/movn, COP1 accumulator chains,\nstandalone MMI with no COP2 in the same statement, the framed tail-j forwarder,\nand retail `sd $sN` where MWCC emits `sq`. Everything else is a defect until\nmeasured.\n\n## Negative results worth their cost\n\nQTEX had three functions at nd 20/10/10 whose residuals all pointed at one\ncallee, `func_003deff0`. It derived the true signature from the retail prologue\n- `s32 func_003deff0(void *, s32, s32, s32, s32)` - confirmed the existing calls\nalready passed all five, probed the canonical declaration at block scope in all\nthree, and measured no change. The residual is genuine argument-materialisation\norder, now recorded as ruled out in three archives instead of being rediscovered.\n\nQRWA closed func_003f4be0, which a previous lane had skipped as unattemptable\nbecause six GP globals at -0x47FC through -0x5428 had no recovered declarations.\nDeclaring them block-scope from the retail offsets was the entire fix.\n\n## Files closed as complete censuses\n\n  btlAICommand.c   9/9 rows archived; paddub MMI and adda.s/msub.s floors\n  rt2d_grouped.c   5 COP1/movz floors, 5 oversized attempts, no rows left\n  k_texStrip.c     5/5 archived, including the shared-callee negative result\n  fclBankManager.c 4/4; mdlEffect.c 4/4 after one closure\n  cldDayChange.c   2 COP1 floors + 1 triage; rpworld.c fully MATCHED\n\nNearest unclosed: func_003cbf30 nd 3, func_001e9770 nd 5 (retail `sltu $at` vs\ncandidate `$v0`), func_003de8c0 nd 6, func_00477ca0 nd 9, func_00110a60 nd 18,\nfunc_0048a460 nd 19 (exact size), func_003f2760 nd 28 (exact size).\n\nPublished: 7051/13101 matching, 1438 C-linked.","measures":{"fuzzy_match_percent":26.06533,"total_code":4387560,"matched_code":1143632,"matched_code_percent":26.06533,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7051,"matched_functions_percent":53.82032,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-14T16:52:22Z","commit_sha":"6d3e9de87c526db7b62ec52d9440da2fb5083b67","commit_message":"first-party: +9, the best wave of the campaign, by abandoning archived near-misses\n\nFirst-party 6040 -> 6049 of 7866 (76.79% -> 76.90%); tree-wide 7027 -> 7038.\nZero regressions, zero MISMATCH, image unchanged at\n3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n  func_00200770  code1_0020      488/496   Frame aggregate + Vec3 aggregate copy\n  func_0020bd70  code1_0020      496/496   callback (u8*,u8*) from raw a1 first touch\n  func_001e9f20  code1_001e      304/304   direct field loads + declaration order\n  func_001ea050  code1_001e      304/304   same shape, closed as a pair\n  func_003cc170  code1_003c      200/208   schedule+no_branch_likely, explicit labels\n  func_003c9c20  code1_003c      224/224   s32 sp[2] aggregate + reordered labels\n  func_00380980  code1_0038      588/592   high-mask order, index*2 table stride\n  func_00471010  mdlManager      452/464   opt_common_subs off + declaration order\n  func_00477fb0  mdlManager      400/400   `return arg2;` return-tail shape\n  func_00402390  rwcore_grouped  116/128   COP2 asm body (tree-wide only)\n  func_004115d0  rwcore_grouped  148/160   callback alloc + no_branch_likely (tree-wide)\n\nEleven closures against two in each of the previous two waves. The change was\ntarget selection, not effort.\n\n## Why this worked: never-attempted, not archived\n\nThe last two waves ranked targets by archived normalized_diff and returned +1 each.\nThat ranking was worthless because 14 of 16 lanes found their archive's number\nstale — one recorded nd 7 re-measured at nd 91 with the object oversized. So this\nwave ignored archives entirely and censused functions with NO archive at all:\n1572 first-party non-vendor rows nobody had ever opened. Sixteen lanes took the\nsmallest per file.\n\nA never-attempted function has no stale number and no prior lane's dead ends to\nre-walk. Nine of eleven closures came from files whose open rows had never been\ntouched.\n\n## Two floor labels disproven\n\nPMDL was assigned three functions whose file header recorded them as floors and\ntold not to trust notes that do not name one of the five compiler families\n(movz/movn, COP1 accumulator, standalone MMI, framed tail-j, ee-gcc sd). Two\nclosed:\n\n  func_00477fb0  noted \"slot-coalescing / saved-register rotation floor\"\n                 -> `return arg2;` forces retail's move-v0 before the shared\n                    tail; pointer params and distinct pair0/pair1 structs did\n                    the rest. A return-tail shape as the last blocker after the\n                    frame is already exact is new to this campaign.\n  func_00471010  noted \"CSE-of-mask floor\"\n                 -> measured `opt_common_subs off` plus declaration order\n                    var19/temp18/var17/var17_2, with (u32) inner guards\n                    producing retail's sltiu.\n\nBoth headers now record why the old label was wrong. Any \"floor\" note that does\nnot name a compiler family should be treated as an undiagnosed defect.\n\n## The addiu-versus-daddiu family finally moved\n\nThree functions sat at nd 1-2 on a single word where retail emits daddiu/daddu\nand MWCC emits addiu/addu, after prior lanes exhausted widening the CONSTANT and\nthe LOCAL. PRW1 widened the RETURN TYPE instead: a u64 return materialises\nretail's `daddu $v0,$a0,$zero`, taking func_00402410 from nd 8 to nd 5 at exact\nsize. Not closed, but the mechanism is now source-reachable, which it was not\nbefore. u64 and s64 measure identically, so there is no signedness lever.\n\n## The ee-gcc boundary in code1_0041.c is measured\n\nconfig/gcc_units.txt says that file is 66 ee-gcc functions and 24 MWCC with a\nsingle transition in address order, and cannot be split until someone finds it.\nP041 censused the prologue save instruction of all 38 first-party rows and all\n120 vendor-side rows: every first-party row uses `sq` or has no saved registers;\nevery vendor row with saves uses `sd`. The transition is exactly 0x00417510,\ncoinciding with the VENDOR_CODE_RANGES boundary. Recorded in the file's comment.\n\n## Whole files closed as floor censuses\n\n  code1_001c.c        21/21 remaining rows are COP1 accumulator floors\n  y_fclCombineDraw.c  31/31 classified (s64-param, unaligned load, float-pair)\n  code1_0038.c        6 COP1 floors; no unarchived rows remain\n  code1_0022.c        census complete, 6 COP1 floors among them\n\nThose four files need no future lane.\n\n## Repairs\n\n- P390 died mid-run (websocket transport error) leaving a live 344-byte\n  non-matching body for func_00394e70 in code1_0039.c. Found by scoped verify and\n  reverted by hand.\n- I reverted func_004115d0 as an unclaimed live MISMATCH (144/160 nd 44) while\n  PRW2 was improving it to a 148-byte MATCH in the same window, and had to ask\n  them to re-apply. Lesson recorded for the shared-file protocol: a lane taking a\n  function outside its assigned list must announce it, and no candidate should sit\n  live at a non-matching state across another lane's snapshot.\n- rwcore_grouped.c broke twice from three lanes splicing concurrently (a\n  `return NULL;` in an s32 function; then duplicate stubs in the mwccgap\n  temporary). Protocol tightened to splice-measure-rollback in one sequence, with\n  lane-specific scoped report paths.\n\nNearest unclosed for the next wave: func_003cbf30 nd 3 (two words, return move\nvs q load), func_00402470 and func_00402510 nd 5, func_003de8c0 nd 6 (two words),\nfunc_00477ca0 nd 9, func_00209dc0 nd 10, func_003a55a0 nd 15, func_0020b800 nd 19.\n\nPublished: 7038/13101 matching, 1438 C-linked.","measures":{"fuzzy_match_percent":25.965046,"total_code":4387560,"matched_code":1139232,"matched_code_percent":25.965046,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7038,"matched_functions_percent":53.72109,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-14T15:13:25Z","commit_sha":"3f25ad998de19153365ba28c045a35e27dd9ce9a","commit_message":"first-party: +1, and archived nd figures are systematically stale\n\nFirst-party 6039 -> 6040 of 7866 (76.77% -> 76.79%); tree-wide 7025 -> 7027.\nZero regressions, zero MISMATCH, image unchanged at\n3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n  func_00354280  code1_0035        528/528  saved-register split + declaration order\n  func_0040d0a0  rwcore_grouped    112/112  callback-array body + no_branch_likely bracket\n\nSixteen lanes were pointed at every first-party archived near-miss at nd <= 12\n(44 functions across 20 files, most untouched for three waves). Two closed. The\nwave's real product is a measurement nobody had made.\n\n## Archived nd figures are stale, and badly\n\nEvery lane was told to re-measure before trusting a header. Fourteen of sixteen\nfound their archive's number wrong in the current declaration environment, most\nof them by a wide margin:\n\n  func_003bcbe0    nd 7  -> nd 91, object 168 vs 160 window (oversized)\n  func_00482230    nd 11 -> nd 130, and the residual moved to a different site\n  func_0018f7b0    nd 49 -> nd 126\n  func_002915f0    nd 38 -> nd 109\n  func_00313b50    nd 56 -> nd 152\n  func_00355550    nd 33 -> nd 84\n  func_003c4220    nd 28 -> nd 81\n  func_003c5fd0    nd 88 -> nd 93\n  func_003f6990    nd 12 -> nd 37\n  func_003ed7e0    nd 7  -> nd 10\n  func_00135520    nd 12 -> nd 19\n  func_003b7060    nd 30 -> nd 78\n  func_003b6540    nd 31 -> nd 96\n  func_00144b80    (archived near-miss) -> nd 174, oversized\n\nSo the nd <= 12 census I built this wave from was largely fiction: those numbers\nwere recorded against declaration environments that no longer exist. Only the\nruled-out lists are durable. Every archive header touched this wave now carries\na fresh measurement, and future target ranking must re-measure first or it will\nrank noise.\n\n## The two closures\n\nfunc_00354280 (528/528, was nd 9): the raw decompiler had fused two values. Split\nthem - a separate `temp_16 = arg1 + 0x100` and a distinct loop counter - then\ndeclaration order `temp_8, var_17, var_16, temp_16` reproduced retail's s0/s1\nreuse exactly. Third consecutive wave where declaration order closed a function\nand no pragma did.\n\nfunc_0040d0a0 (112/112): plain generated body over the `D_00753330`/`D_00753340`\nabsolute globals and a `iGpffffb984` selector into a callback array, with a\nmeasured `no_branch_likely` bracket. Counts tree-wide, not first-party.\n\n## Near-misses that moved without closing\n\nWorth recording because each names its own remaining word:\n\n  func_00311930   nd 48 -> nd 6 under function-scoped optimization_level 1;\n                  residual is MWCC choosing $f1 where retail uses $f0\n  func_001d4eb0   nd 9 -> nd 5 by inlining the product-scale loads\n  func_00356870   nd 10 -> nd 6 by reversing three upper bounds to `0x1B >= var`\n                  form; remainder is short-field sign extension\n  func_003fd630   nd 16 with the first 24 bytes exact\n  func_001eec60   nd 2, one register ($a2 versus retail $v0)\n  func_0044ee70   nd 6, retail stores `sh $0,8($v0)` before the argument move\n\n## Floor censuses completed for whole files\n\nFour lanes proved their files have nothing left worth probing, which is a real\nresult: NCMB covered all 15 remaining rows of y_CmbCardEff.c and nLine.c (COP1\naccumulator, stack-allocation, FPR-coloring floors); NKRN all 7 of sdkChkmem.c\nand sdkCdvd.c; NSCR all 5 of cmmScript.c (adda.s/madd.s counts from decompme:\n29/27 in one function); NCMM both its files exhausted.\n\nThe `movz`/`movn` conditional-move floor was confirmed again in code1_003c,\nrwcore_grouped and rt2d_grouped. A new floor family: MWCCPS2 coalesces\naddress-taken s64 buffers into a smaller frame than retail (0x150 vs 0x1A0),\nwhich blocks the entire 0x84-stride state-machine family in y_CmbCardEff.c.\n\n## Repairs and process\n\n- Two lanes measured `schedule off` fixing nothing on their target while\n  regressing 13 and 14 sibling functions respectively. Both reverted. A pragma\n  must be bracketed inside the function and the whole unit re-verified.\n- N014 omitted a measured `opt_loop_invariants off` bracket during a probe,\n  regressed func_0014e2a0, detected it and fixed it.\n- N18C initially left near-miss bodies in src behind guards, then removed them\n  to build/ on its own.\n- A lane clobbered `build/verify_report.json` with a scoped run, which silently\n  invalidated my baseline census; caught by row-count comparison and restored\n  from the previous full-tree snapshot. Scoped verifies must not write the\n  tree-wide report path.\n\nPublished: 7027/13101 matching, 1438 C-linked.","measures":{"fuzzy_match_percent":25.878984,"total_code":4387560,"matched_code":1135456,"matched_code_percent":25.878984,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7027,"matched_functions_percent":53.637127,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-14T12:14:28Z","commit_sha":"1f3adc9e4aa543ed67e04f328213cac270ee1a5c","commit_message":"first-party: +1, and a wave aimed at the wrong functions entirely\n\nFirst-party 6038 -> 6039 of 7866 (76.76% -> 76.77%); tree-wide 7022 -> 7025.\nZero regressions, zero MISMATCH, image unchanged at\n3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n  func_004867e0  code1_0048         96/96    declaration order\n  func_003d79b0  rt2d_grouped      108/112   statement order + schedule/no_branch_likely\n  func_003ef5b0  rwcore_grouped     92/96    typed RwLink/RwList/RwNode locals\n\nThree closures, one of which counts toward first-party. That ratio is the point\nof this commit, and the reason is a targeting error I made and then corrected.\n\n## The wrong wave\n\nI censused ~440 \"untouched trivial 4-48 byte functions\" in code1_0041-0044,\n004c, 004d and 0051 and dispatched sixteen lanes at them. They closed zero. Both\nreasons were already documented in this repo and I had not read them:\n\n- every one of those files is inside VENDOR_CODE_RANGES (tools/verify.py:\n  0x417510-0x44E830, 0x4BD628-0x52D8C0, 0x70C850-0x70E140), so they are absent\n  from the first-party denominator entirely;\n- they are ee-gcc 2.96 units, not MWCCPS2 units. config/gcc_units.txt records\n  the separator: retail saves callee-saved registers with `sd`, MWCCPS2 3.0.1b210\n  emits `sq` at every optimisation level in all three builds on disk with no\n  BackEnd option that changes it.\n\nThe lanes rediscovered that from five files independently, plus a second\nGCC-only shape nobody had written down: the framed tail-jump forwarder\n(`addiu $sp,-N` / `sd $ra` / `ld $ra` / `j target` / `addiu $sp,N` in the delay\nslot). MWCCPS2 emits only 8 bytes frameless, or 28-32 framed with `jal`, across\neighteen tested optimization/tailcall/schedule combinations. I twice broadcast\nthe wrong pragma direction before three lanes' measurements corrected me.\n\nI cancelled that wave, reverted its five touched files, and re-censused with the\nvendor filter applied. The genuine untouched first-party pool is 2075 functions\nwhose smallest windows are 32-96 bytes, not 4-24. The second wave ran on those.\n\nRecorded as a managed skill so the filters are applied before dispatch, not after.\n\n## What the correct wave found\n\nSixteen lanes, ~70 functions attempted, three closed, everything else archived\nwith measurements. The floor families, counted rather than asserted:\n\n- **movz/movn conditional move.** Five lanes hit it independently in five files;\n  plain C ternaries, explicit ifs and assignment forms all compile to a branch.\n  F3C0 found it in three of four assigned functions.\n- **COP1 accumulator chains** (mula.s/madda.s/madd.s/adda.s/msub.s). Four\n  functions in code1_0035 alone.\n- **Standalone MMI** (pextlb/pextlh/ppach/ppacb/pcpyld/pexew) with no COP2 in\n  the statement - banned by H009 and a floor regardless.\n\nThree lanes corrected their own briefs, which is worth more than the closures:\n\n- F3D1 disproved a floor F3D0 had just recorded. F3D0 archived two functions as\n  \"rd-form mult floor\"; F3D1's candidate emitted the identical raw word\n  0x02063018, proving MWCC does emit the EE three-operand `mult`. Both archives\n  were amended - the residual is instruction ORDER, not a missing instruction.\n  A wrong floor label is worse than none, because it closes the door permanently.\n- FRW1 established the convention for rwcore_grouped's 217 remaining untouched\n  functions: typed self-referential RwLink/RwList/RwNode locals reproduce retail\n  list codegen where raw pointer temporaries do not - and the same lane's\n  func_003ef650 came out 128 bytes against a 96-byte window precisely because\n  four untyped pointer locals stayed live across a call that retail spanned with\n  a 16-byte frame.\n- F350 and F3C1 independently hit the same two-word prologue residual\n  (nd 8, differing bytes 0x08/0x10 and 0x0C/0x10) in unrelated files, with\n  F2D0's func_003d68b0 showing the mirror ordering. I read F350's retail bytes as\n  argument home-stores and predicted address-of-parameter or K&R would reproduce\n  them. I measured both myself: address-of gives 88B/nd 56, K&R gives 236B/nd 199\n  against the array-staged body's 96/96 nd 8. Hypothesis disproven and recorded\n  in the source; the residual is a genuine ordering floor, which is a stronger\n  conclusion than \"prologue scheduling\".\n\nBoth closures that did land came from ORDER - declaration order in one case,\nstatement order in the other - and none from a pragma.\n\n## Repairs\n\n- code1_001b.c lost `extern void func_001b0d00(s32, s32)` at file scope; the\n  gate's declaration-environment stage caught it and blocked. Restored.\n- code1_003c.c had a live NONMATCHING body (func_003c5fd0, a nested-goto\n  candidate behind a no_branch_likely bracket) and an unjustified closing\n  `#pragma schedule off`. Both fixed. Two lanes had spent messages agreeing the\n  pragma was \"pre-existing and outside my ownership\"; it was neither.\n- Four lanes left live mismatches mid-run and were told to restore immediately.\n  code1_0035.c ended with a live body whose marker carried NONMATCHING, which\n  verify reports as ASM rather than measuring - a state worth knowing about,\n  since it hides a non-matching body from the row census.\n\nBest remaining near-misses, all archived with offsets and ruled-out lists:\nfunc_00482230 (428/432 nd 11, 252 bytes exact, constant/pointer $v1<->$a0\nexchange), func_00356170 and func_003c47c0 (nd 8 prologue-order family),\nfunc_003de280 (52/64 nd 5), func_00398350 (148/160 nd 6), func_003df870 and\nfunc_003df8a0 (nd 8, tail delay-slot order).\n\nPublished: 7025/13101 matching, 1438 C-linked.","measures":{"fuzzy_match_percent":25.864399,"total_code":4387560,"matched_code":1134816,"matched_code_percent":25.864399,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7025,"matched_functions_percent":53.62186,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-14T09:32:54Z","commit_sha":"07ca5c9f3f6f34e79f55a3b1c457c4a0ae5689e9","commit_message":"first-party: +2 from the pair hypothesis, and a case-corrupted INCLUDE_ASM caught\n\nFirst-party 6036 -> 6038 of 7866 (76.74% -> 76.76%). Zero regressions, zero\nMISMATCH, image unchanged at 3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n  func_00453250  code1_0045  192/192\n  func_00453310  code1_0045  192/192\n\nThe pair hypothesis was worth testing and it held, once. Three lanes were given\ntwo functions each that shared a size and a differing-offset set within one file,\non the theory that one source shape appearing twice closes twice. code1_0045\ndelivered exactly that: arg1 is u16 in both prototypes and definitions, plus the\nsecond-branch pointer split into two assignments to force retail's addu operand\norder, and both functions closed together in 13 minutes. The other two pairs did\nnot - code1_003c's 3e90/4040 and code1_003e's 46e0/83a0 both turned out to share\na residual FAMILY rather than a shape, so solving one would not have transferred.\nWorth repeating on exact-offset-match pairs, not on merely similar ones.\n\nThe store/reload family is now well characterised and unsolved. Five functions\nacross four files (003c3e90, 003c4040, 003e46e0, 003d5fb0, and 003b6da0's\nepilogue) all want retail's sw-then-lw-then-branch where MWCC folds the reload\ninto a register reuse. Every honest lever failed: narrow destination types, unions\nread narrow, pointer aliasing, globals, struct fields the callee can reach,\nschedule off, O1, opt_propagation off. Z3C1 got closest at nd 1 with everything\nelse exact - retail lw against candidate lhu at one offset - and the only spelling\nthat produced the reload was a union read narrow, which is scaffolding and was\ncorrectly refused. A volatile version of 003e46e0 matched exactly and was rejected\nunder H001. This is the largest coherent cluster left and it needs a mechanism\nnobody has found yet, not more probes.\n\nTwo floors are now closed properly rather than left open. func_001932f0 sat at\nnd 1 - one word, addiu against retail daddiu - through three lanes; Z019 measured\nthe whole narrow family (u8/s8/u16/s16 destinations, and each as an initializer\ncast) and every narrow initializer reproduces nd 1 exactly while every narrow\ndestination costs 55 to 85. Its sibling func_00232c70 at nd 2 got the same\ntreatment including u32 and enum constants and guard-polarity spellings. Both are\nrecorded as bounded floors with the full probe list, so no future lane needs to\nre-derive them.\n\nCorrections the lanes made to their own briefs, which is the most valuable output\nof the wave:\n- Z375 disproved my classification. I had read the archive's 0x44-0x54 offset run\n  as one call's argument set; it is a literal-5 store sequence. The real defect is\n  that retail holds one base in $s2 and reuses it at all three sites while the\n  candidate recomputes it - a live-across-call lifetime, not an argument order.\n- Z3A3 turned \"scheduling residual\" into arithmetic: object 136 against a 144-byte\n  window is 8 bytes, which is exactly the two nops retail has at 84 and 108. The\n  body is two instructions SHORT, not mis-scheduled. Its preincrement loop now\n  reproduces retail's load/count/sltu/beqz exactly at nd 12, down from 14.\n- Z3BF, Z3D5, Z3C2 and Z1AD all found their archived nd figures stale under the\n  current declaration environment: nd 6 re-measured 7, nd 15 re-measured 24, nd 20\n  re-measured 443. I told the wave to trust the ruled-out list and re-measure the\n  number, and that instruction paid for itself four times.\n\nTwo hygiene defects found and fixed:\n- Z3C2 left func_003ca830's near-miss body in src behind #ifdef NON_MATCHING. That\n  is the shape that took a translation unit to 209 COMPILE_ERROR earlier; it is now\n  in build/ only.\n- Z178 restored INCLUDE_ASM with the symbol case-corrupted to func_0017CD60. The\n  marker was intact and the count unchanged, so every check we run passed - but\n  verify keyed a DIFFERENT row, silently retiring the real one. Caught only by\n  diffing the row key sets before and after. Adding that comparison to the wave\n  census, since neither the marker audit nor the denominator check can see it.\n\nBudget held: 20 minutes per function, median around 13, longest lane 32 and no\ncancellations needed.\n\nPublished: 7022/13101 matching, 1438 C-linked.","measures":{"fuzzy_match_percent":25.85747,"total_code":4387560,"matched_code":1134512,"matched_code_percent":25.85747,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7022,"matched_functions_percent":53.59896,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-14T08:32:35Z","commit_sha":"441259957ad1c8f58600967e09cee13a59f14b22","commit_message":"first-party: +5, and concurrent-lane rules that actually hold\n\nFirst-party 6031 -> 6036 of 7866 (76.67% -> 76.74%). Zero regressions, zero\nMISMATCH, image unchanged at 3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n  func_003cb250  code1_003c  176/176    func_003a7970  code1_003a  188/192\n  func_003cc2c0  code1_003c  176/176    func_003561d0  code1_0035  116/128\n  func_003dd830  code1_003d  200/208\n\nAll sixteen lanes finished inside the cutoff this time, with elapsed minutes\nreported per function. No cancellations were needed and no live non-matching body\nwas left anywhere.\n\n# Running eleven lanes across four shared files\n\nFour translation units carried multiple lanes: code1_003c had three, and\ncode1_003b, code1_003d and code1_003e had two each. Two failure modes appeared\nand both are now rules rather than lessons.\n\n**The unit must compile between measurements, not only at the end.** Two lanes\nstalled their file-mates: an in-progress body assigned three `void`-declared\ncallees to `u8 *`, and another referenced an undefined `zero`. Every lane sharing\na file must compile the whole translation unit to measure anything, so a\nnon-compiling intermediate state blocks all of them. Draft inconsistent bodies\nunder `build/` and paste them in only when they compile.\n\n**Whole-file probe tools are banned on a shared file.** `try_parked.py`,\n`try_bodies.py` and `probe_archive.py` snapshot the file, splice a body, compile,\nthen restore the ORIGINAL bytes, silently discarding whatever a sibling wrote in\nbetween. Block-scope `extern` declarations inside your own function are the\nsubstitute for editing file scope, and lanes used them heavily this wave -\nY3DB corrected eight callees that way without touching file scope once.\n\nThe marker census caught nothing this wave, which is the point: every lane\nreported `grep -c \"^// FUN_\"` unchanged, and one lane explicitly restored a\nneighbour's `FUN_003B3240` marker after a range replacement.\n\n# One declaration correction, verified from retail\n\n`func_003ce2e0` was declared `extern void` at file scope in code1_003c.c, but its\nretail epilogue does `li $v0,1` before `jr $ra`, so it returns `s32`. A lane\nproved that from the disassembly, coordinated with the two other lanes in the\nfile, changed declaration and definition together, then verified the whole unit:\n99 MATCH / 108 ASM against a 97 MATCH / 112 ASM baseline, with the only status\nchanges being two sibling improvements from another lane. The known caller\n`func_003c1bd0` still relocates correctly.\n\nThat pattern - read the epilogue, do not trust either the file-scope declaration\nor the generated source - is worth repeating. Both were wrong here.\n\n# Levers that closed\n\n`func_003cb250` and `func_003cc2c0` needed measured `schedule` plus\n`no_branch_likely` brackets with block-scope typed prototypes, and for cb250 a\ntable-address local of type `void (**)` rather than a cached callback value.\n`func_003a7970` needed an in-body measured `optimization_level 3` plus three\nscoped offset locals with reversed integer-domain address materialisation, and\n`func_003b42e0` corrected to four arguments. `func_003561d0` closed with named\nlocals for the non-literal call arguments in retail's materialisation order plus\na measured `opt_propagation off` - the literal `4` had to stay direct, because\nstaging it reversed the `lw`/`li`.\n\n# Compiler map extended\n\ncode1_0041.c is documented as mixed ee-gcc and MWCC. A lane classified four more\nfunctions by prologue: `func_00414e10` and `func_00414ef0` are MWCC (`sq` of\n`$s1`/`$s0` and `$s2`/`$s1`/`$s0`), while `func_00414b50` and `func_004142b0` are\nframeless with only `sd $ra`, which is not diagnostic either way, so they are\nretained as MWCC candidates on position and instruction style. That determination\nis durable and stops the next lane re-deriving it.\n\n# Twelve archived residuals worth naming\n\n  func_003cc250   104/112  nd 4    prologue: MWCC saves $ra before retail's lw\n  func_003e46e0   120/128  nd 14   store/reload ordering, volatile rejected\n  func_003ca830    92/96   nd 14   addiu/move/addu/sw order\n  func_003a3d50   136/144  nd 14   loop/materialisation order\n  func_003d5fb0    76/96   nd 15   store/reload plus branch layout\n  func_00453250   192/192  nd 16   exact size, register/operand order\n  func_00453310   192/192  nd 16   same shape as 00453250\n  func_003c3e90   124/144  nd 17   post-call store/reload/branch tail\n  func_003c4040   124/144  nd 17   same shape as 003c3e90\n  func_0026ebe0   288/288  nd 17   exact size, register allocation\n  func_003c9a80   164/176  nd 19   branch displacement plus shifted tail\n  func_00375f00   156/160  nd 20   argument staging and base materialisation\n\nTwo pairs there share a shape within one file, which is the most reusable kind of\nfinding: solving 003c3e90 should also close 003c4040, and likewise 00453250 with\n00453310.\n\nPublished: 7020/13101 matching, 1437 C-linked.","measures":{"fuzzy_match_percent":25.848719,"total_code":4387560,"matched_code":1134128,"matched_code_percent":25.848719,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7020,"matched_functions_percent":53.583694,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-14T07:19:03Z","commit_sha":"8fdb4de747169dfa64296fca797d4438b4623acf","commit_message":"first-party: +5, and the budget enforced by cancellation\n\nFirst-party 6026 -> 6031 of 7866 (76.61% -> 76.67%). Zero regressions, zero\nMISMATCH, image unchanged at 3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n  func_00124350  code1_0012     884/896    func_0045e310  sdkPrimitive  908/912\n  func_0045dfd0  sdkPrimitive   832/832    func_00292bb0  evtModel      820/832\n  func_0019ea60  code1_0019     820/832\n\n# The budget is now enforced, and enforcement has a required follow-up\n\nA hard wall-clock cutoff was set at dispatch and I cancelled the one lane still\nrunning when it arrived. Elapsed times were reported per function and the median\nlane finished in about 20 minutes, against 3h1m for a single function last wave.\n\nThe lesson that cost real repair time: **cancelling a lane is not the end of the\njob.** Both cancellations this session left a LIVE non-matching body in the tree,\nwhich would have made the linked image ship our bytes rather than retail's:\n\n  func_0024be40  cmmScript      live MISMATCH, archived at 672/672 nd 8\n  func_0017cd60  code1_0017     live MISMATCH, archived at 764/768 nd 24\n\nSo cancellation must always be followed by verifying the lane's file and\nrestoring the bare INCLUDE_ASM fallback. A third defect of the same family was\ncaught only by the row-count check: `func_00363540` in cmpPartyPanel.c lost its\n`// FUN_00363540` marker while a lane edited the function above it, dropping the\nscanned denominator from 7866 to 7865. A shrinking denominator silently inflates\nthe percentage, so the census must compare row SETS and not just counts.\n\n# Mixed signedness per site, confirmed\n\n`func_0019ea60` is the clearest example yet of why each conversion site must be\nclassified from the retail LOAD rather than treated uniformly. It has both in one\nfunction: five `lhu`-fed sites take `(f32)(u32)`, and three `lh`-fed sites take\n`(f32)(s16)`. Getting that wrong is what left three shdPersona functions at nd\n13-18 two waves ago.\n\n`func_00292bb0` closed in the other direction with a single `(u32)rec->timer2`,\nagainst retail `lwc1`, a `c.le.s` against 0x4F000000, and low `trunc.w.s`/`mfc1`\nversus high `sub.s`/`trunc.w.s`/`mfc1`/`lui 0x8000`/`or`.\n\n# Scaffolding rejected twice\n\nA lane closed `func_004a7e30` at nd 0 using a `static inline p4_add_f32` helper\nintroduced to force retail's add operand order. A wrapper whose body is\n`return a + b;` is semantically identical to writing `a + b`, so its only effect\nis on codegen, and it is inconsistent with its own file: the six functions\nalready closed in code1_004a.c all use plain arithmetic. I rejected it, the\nhelper came out, and the honest `(f32)`-cast form reaches nd 16, so the function\nis archived at 1044/1056 with the header recording explicitly that the helper\nform reaches nd 0 and was rejected. That sentence is the useful part - it tells\nthe next lane the function is fully understood and only one operand order lacks\nan honest spelling.\n\nI also caused a collision here by editing that file after its lane had reported\ncompletion but while it was still live; the lane detected it and repaired it. Do\nnot write to a file until its owner has actually exited.\n\n# Archived with measurements\n\n  func_0024be40  cmmScript      672/672  nd 8    table index/element register cycling\n  func_0017cd60  code1_0017     764/768  nd 24\n  func_0025b0f0  cmmRankUp      324/336  nd 24   improved to 11 differing words\n  func_001534a0  k_fldResource  768/800  nd 164\n  func_002a73c0  mc             780/848  nd 177  confirmed MWCCPS2 via sq $s\n  func_001f5bd0  code1_001f     736/720  oversized\n  func_00222d20  code1_0022     920/896  oversized\n  func_00363200  cmpPartyPanel  812/832  nd 548\n  func_00450a50  code1_0045     936/896  oversized\n  func_00116d40  shdPersona    1112/1152 nd 274\n  func_00291b60  evtModel      1092/1088 oversized\n  func_004a30e0  effPolygonWind 764/768  nd 309\n  func_004a4450  effPolygonWind 824/832  nd 321\n\nPublished: 7015/13101 matching, 1436 C-linked.","measures":{"fuzzy_match_percent":25.828661,"total_code":4387560,"matched_code":1133248,"matched_code_percent":25.828661,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7015,"matched_functions_percent":53.545532,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-14T05:55:17Z","commit_sha":"87f96411ccf0b11523063972da2d7f22c1bf9a34","commit_message":"first-party: +14 from the conversion idiom, and enforce the per-function budget\n\nFirst-party 6012 -> 6026 of 7866 (76.43% -> 76.61%). Zero regressions, zero\nMISMATCH, image unchanged at 3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n  func_001c1f70  code1_001c  596/608    func_004a86c0  code1_004a  460/464\n  func_0029e9e0  code1_0029  520/528    func_004a8250  code1_004a  496/496\n  func_004b3ed0  effLineNova 664/672    func_004a8440  code1_004a  628/640\n  func_00371a60  btlShuffle  312/320    func_002b25d0  y_smap      552/560\n  func_00372200  btlShuffle  416/416    func_0034ee90  code1_0034  572/576\n  func_001b9e50  btlMain     576/576    func_003874c0  code1_0038  644/656\n  func_0034c270  nLine       548/560    func_0038c770  code1_0038  828/832\n\nEvery one of these was selected by decoding retail bytes for the conversion\nidiom's opcode signature and excluding windows containing a COP1 accumulator\nchain, standalone MMI or movz/movn. Thirty-six functions survived that filter;\nthis wave took sixteen and closed fourteen.\n\n# The lever, now at 34 closures across three waves\n\n`or` feeding `mtc1` feeding `cvt.s.w` is MWCCPS2's own unsigned-int-to-float\nconversion; `or` after `mfc1` with `lui 0x8000` is its float-to-unsigned. A\n`c.ole.s` against 0x4F000000 is the idiom's path SELECTION, not a source `if`.\nRetail's source held a plain cast, so the fix is to write one cast and delete the\nwhole hand-written structure.\n\nOne refinement earned this wave: **classify each site from the retail LOAD.**\n`lbu`/`lhu` means unsigned, so `(f32)(u32)x` or `(f32)(u16)x`; `lb`/`lh` means\nsigned and must stay `(f32)(s16)x`. Getting that wrong is what left three\nshdPersona functions at nd 13-18 in the previous wave.\n\nLevers that combined with the cast: reversed unsigned guards for retail's\n`sltu $at`; an explicit `(f32)` cast on one factor for commutative operand order;\ndifference-first locals reproducing a retail interpolation block; and an\ninterleaved mixed float/int callee prototype\n(`func_0034f0d0(f32, f32, u8 *, f32, f32, u8, u8, u8, u8)`).\n\nA lane initially closed `func_0034ee90` using two `static inline` float helpers\nintroduced \"solely to force retail commutative operand order\". That is\nscaffolding, so I had it test plain alternatives: an explicit `(f32)` cast on one\noperand produced the identical bytes, and both helpers were deleted. Worth\nrepeating as a rule - if a construct exists only to steer codegen, look for the\ncast or the operand order that does it honestly.\n\n# I failed to enforce the budget, and it cost the wave\n\nThe brief set 25 minutes per function. `W031` ran **3h1m** on one function and\n`WSCR` longer, and I let both continue because they were visibly making progress.\nThat was wrong: a slow lane does not merely waste its own budget, it blocks the\ngate, the commit and the next sixteen-lane dispatch behind it, so the cost is the\nwhole wave's throughput rather than one function.\n\n`WSCR` was cancelled mid-probe and had left a LIVE MISMATCH body in\n`src/promoted/cmmScript.c`, which would have made the linked image ship our bytes\ninstead of retail's for that function. Its body is archived at\n`build/WSCR_0024be40_body.c` with the measurement (object 672/window 672, exact\nsize, nd 8) and the note that `func_00246e10`'s canonical signature is\n`s32(s32)` while the file-scope prototype is `u8 *(u16)` - correcting it at file\nscope breaks the pointer assignment at cmmScript.c:1477, so a block-scope\n`extern` is required. The source is back to a bare marker plus INCLUDE_ASM and\nthe unit verifies 45 MATCH / 6 ASM.\n\nCancelling a lane must therefore always be followed by checking its file for a\nlive non-matching body, not just by taking the token count.\n\n# Archived with measurements\n\n  func_00311930  code1_0031   596/608 nd 8   (was oversized at 708; -112 bytes)\n  func_0025b0f0  cmmRankUp    324/336 nd 24  (a probe reached nd 11)\n  func_0011e490  shdPersona   688/688 nd 84\n  func_0034ddf0  nLine        688/704 nd 168\n  func_002b7f20  y_draw       476/512 nd 277\n  func_00108590  cmmCommunity 604/592 oversized\n  func_004a1d70  code1_004a   940/832 oversized\n\nPublished: 7010/13101 matching, 1433 C-linked.","measures":{"fuzzy_match_percent":25.730566,"total_code":4387560,"matched_code":1128944,"matched_code_percent":25.730566,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":7010,"matched_functions_percent":53.507366,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-14T02:13:01Z","commit_sha":"bc1a65cf31c55c60843c07539974d7d9b41510b9","commit_message":"first-party: +11 by targeting the conversion idiom from the retail bytes\n\nFirst-party 6001 -> 6012 of 7866 (76.29% -> 76.43%). Zero regressions, zero\nMISMATCH, image unchanged at 3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n  func_00200980  code1_0020  208/208    func_003889b0  code1_0038  400/400\n  func_00201720  code1_0020  252/256    func_00380bd0  code1_0038  424/432\n  func_0021b500  code1_0021  300/304    func_00142bf0  code1_0014  400/400\n  func_0047f710  code1_0047  288/288    func_001b93c0  btlMain     412/416\n  func_004acb80  code1_004a  316/320    func_003733f0  btlShuffle  416/416\n  func_004ad280  code1_004a  344/352\n\n# Selecting targets by decoding retail, not by guessing\n\nYesterday's finding was that `or` feeding `mtc1` feeding `cvt.s.w` is MWCCPS2's\nOWN unsigned-integer-to-float conversion, and an `or` after `mfc1` with a\n`lui 0x8000` is its float-to-unsigned conversion. Retail's source held a plain\ncast; a body that hand-writes the fixup gets the compiler's registers allocated\nfor that expression instead of for its idiom, producing a small residual that\nresists every naming, typing, lifetime and pragma probe.\n\nRather than wait to trip over more instances, I decoded the retail bytes of every\nopen first-party function and matched the opcode signature directly - `or`\nadjacent to `mtc1`, `mfc1` followed by `lui 0x8000` and `or`, `cvt.s.w` - while\nexcluding windows containing COP1 accumulator chains. **360 open first-party\nfunctions contain the idiom.** This wave took the small ones.\n\nNine of eleven closures wrote nothing but the cast:\n\n  (f32)(u32)x   unsigned word to float\n  (f32)(u16)x   halfword, where retail masks with andi 0xffff or srl 16\n  (u16)(4096.0f * x) and (u8)(255.0f * x)   float to unsigned, keeping only the\n                                           genuine scaling multiply\n\n`func_004acb80` and `func_004ad280` also needed reversed unsigned guards\n(`*(u32 *)(arg0 + 0x74) <= temp` rather than the natural direction) to land\nretail's `sltu $at`. `func_00380bd0` needed a strict `> 0x63`, a `u16` temporary\nand an explicit `& 0xFF` index mask alongside its cast.\n\nRetail's shape at a typical site, for the record: `lhu`/`lbu`, `bltz`, then the\nnon-negative path `mtc1`/`cvt.s.w`, then the negative path\n`srl`/`andi`/`or`/`mtc1`/`cvt.s.w`/`add.s`. All of it comes from one cast.\n\n# What the wave taught about target selection\n\nThe idiom is much more common in large float-heavy functions, so ranking \"files\nwith the most idiom functions\" pulled three lanes onto 672 to 2256 byte\nreconstructions. I redirected two of them mid-flight to the smallest open\nfunctions in their files instead. The lever removes a small register residual\nfrom a body that is otherwise already right; it does not write a thousand-byte\nbody. Worth remembering when mining the remaining 349.\n\n`code1_0038.c` was the highest-value single result: it holds 22 open idiom\nfunctions and both of its targets closed, so the spelling is now established\nthere.\n\n# Floors recorded with evidence\n\n  func_003cc560  code1_003c  standalone pexew/ppacw MMI in one packed-float block\n                             at 0xE4-0x11C; its four (f32)(u32)arg0[i] cast sites\n                             were identified and are NOT the blocker\n  func_0048abd0/b340/c4e0/e2f0  MMI pack plus COP1 accumulator chains\n  func_0035bd20/0035bad0        COP1 mula.s/madda.s/madd.s\n\nStandalone MMI stays banned under H009 even though hand-written MMI would match\nbyte-for-byte: the allowlist is syscall/privileged/COP2-VU0 vocabulary, and\nplumbing only rides along inside a statement that also contains an allowlisted\ninstruction.\n\n# Gate fix: a closure looked like a lost declaration\n\n`build/WSGate_decl_env_check.py` blocked on `src/Battle/btlMain.c` reporting\n`extern u8 func_001b93c0(BtlMainLerpWork *);` lost. It was not lost - it became\n`u8 func_001b93c0(BtlMainLerpWork *) { ... }` when the function matched, with an\nidentical signature. A definition carries strictly more information than the\nprototype it replaces, so the checker now accepts that case.\n\nThis mattered beyond one function: forward-declaring a function and later\ndefining it is what closing a function looks like in any file that references it\nbefore its definition, so the check would have false-positived on every such\nclosure from here on. Verified both directions - the false positive is gone, and\ndeleting a genuine `extern u32 func_00193c70(void);` whose function is not\ndefined in the file is still reported.\n\nPublished: 6996/13101 matching, 1428 C-linked, 168/325 units linked.","measures":{"fuzzy_match_percent":25.55042,"total_code":4387560,"matched_code":1121040,"matched_code_percent":25.55042,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":6996,"matched_functions_percent":53.400505,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-13T23:26:48Z","commit_sha":"01f69fab29469bd227080379d99a50e755ea3818","commit_message":"Make the wave gate's census separator-agnostic, and refresh progress provenance\n\nTwo small correctness fixes, both surfaced by moving the published report off\nobjdiff-cli in the previous commit.\n\n# The gate reported 12720 missing functions against an identical tree\n\n`build/WSGate_run.py`'s census keyed rows on `(name, file)` using the raw path\nstring. `tools/verify.py` emits whichever separator its invocation produced: run\nfrom a Make recipe it writes `src/admini/admini.c`, run directly on Windows it\nwrites `src\\admini\\admini.c`. The gate's own verify pass and its baseline were\nproduced by different invocations after `make objdiff-report` started writing\n`build/verify_report.json`, so every key mismatched and the census reported all\n12720 rows simultaneously missing and added, with `net new MATCH: +6985`, on a\ntree where nothing had changed.\n\nThe census now normalises separators before keying, which is what every other\ncomparison in this campaign already did. The failure mode mattered because it\nwas indistinguishable at a glance from catastrophic loss, and the gate is the\nthing that is supposed to tell those apart.\n\nGate is clean after the fix; image still hashes to\n3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n# Progress endpoints were already current\n\nRegenerated them from a fresh verify to confirm rather than assume: the only\nchange is the recorded provenance path, from `build/objdiff_report.json` to\n`build/verify_report.json`, now that the report generator consumes the verifier\nreport directly. The published figures were already correct at 6985/13101\nmatching and 1427 C-linked, so `progress-pages.yml` correctly did not run on the\nprevious push -- it filters on `progress/**`, and that commit touched only tools,\ntests, the Makefile, CI and the README.\n\nFirst-party remains 6001/7866 (76.29%), 1865 open.","measures":{"fuzzy_match_percent":25.463993,"total_code":4387560,"matched_code":1117248,"matched_code_percent":25.463993,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":6985,"matched_functions_percent":53.31654,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-13T22:55:14Z","commit_sha":"5cf6d167b2ad6439b514a3f22cbdd722374d49cf","commit_message":"Publish the report ourselves, with decomp.dev's standard measure semantics\n\nThe published progress numbers were wrong and I had built them on a wrong\nassumption. Two reference projects settle what the measures mean:\n\n  Gauntlet: Dark Legacy     measure=code          49.80%  labelled \"Code\"\n                            measure=fuzzy_...     77.98%\n                            measure=complete_code 23.90%  labelled \"Linked Code\"\n  Lemmings Paintball        measure=code          17.68%\n                            measure=fuzzy_...     53.32%\n                            measure=complete_code  0.00%  (nothing linked yet)\n\nSo the convention, which objdiff's own schema states outright by documenting\n`complete` as \"complete (or linked)\", is:\n\n  matched_* / code   byte-exact against retail -- the perfect-match figure\n  fuzzy_*            size-weighted partial credit, always >= matched\n  complete_*         shipped in the linked image\n\nThis repo had `complete_*` meaning byte-exact-in-isolation. That is why nothing\nlined up: the standard linked measure had nothing behind it, so I invented a\nnonstandard `linked` category to carry it, tagged it from a build artifact that\ndoes not exist in the CI job that writes the config, and the badge rendered\n`0 / 0`. A number that reads as a measurement is worse than a missing badge.\n\n# Publish from the verifier instead of from object diffing\n\nLemmings Paintball writes its decomp.dev `report.json` directly from its own\ncomparison data rather than having a differ derive it. Doing the same here fixes\na measurement error I had not noticed:\n\n`objdiff-cli report generate` diffed ~26,000 emitted object pairs, and base\nobjects are built with `--skip-asm`, so every function still on an INCLUDE_ASM\nfallback had NO base object and scored zero while its retail bytes still counted\nin the denominator. The published figure tracked object-emission coverage, not\nthe byte-exact function count. It was also fragile: one object failing to emit\ntook CI down, which happened.\n\n`tools/verify.py` already measures, per function, the retail window, the compiled\nobject size and a reloc-masked byte difference against retail. That is strictly\nbetter evidence than a pairwise object diff, so `tools/gen_decomp_report.py` now\nconsumes it and writes the schema-2 report itself:\n\n  one unit per source file, `complete` set from the linked image\n  per-function `fuzzy_match_percent` from the measured byte difference\n  matched_* strictly byte-exact; complete_* strictly linked\n  per-category measures for main / third_party / unclassified / linked\n\n`objdiff.json` and `make objdiff-objects` remain for interactive diffing in the\nobjdiff GUI. They are simply off the publishing path, so `make objdiff-report`\nno longer needs objdiff-cli, a downloaded binary, or 26,000 object files.\n\nPublished now, all computed locally and reproducible:\n\n  total_functions            13101   (the whole program, not just claimed ones)\n  matched_functions           6985   53.32%\n  matched_code_percent       25.46%\n  fuzzy_match_percent        25.46%  equal by construction: every non-matching\n                                     function is a bare INCLUDE_ASM with no C\n                                     body, so it earns no partial credit\n  complete_code_percent      24.95%\n  complete_units            168/325  matches the build's 168 linked TUs exactly\n\n# Correctness details that cost me two wrong attempts\n\nThe denominator now includes the ~380 canonical functions no source file claims,\nas zero-similarity rows. Omitting them shrinks the denominator and inflates every\npercentage, which is the same dishonesty the category split exists to prevent.\nThere is a CI assertion that `total_functions == 13101`.\n\nThe linked set is read from `build/linked_report.json` when the linker has run and\nfalls back to the committed `progress/metrics.json` otherwise, because CI\nregenerates reports in a job that has never linked. That fallback is what the\nfirst attempt was missing.\n\n`make objdiff-report` now always re-runs the verifier rather than treating its\nreport as a file prerequisite: a `build/verify_report.json` left over from a\nscoped run silently published stale numbers, which it did once here.\n\nCI's container step now writes both inputs (`--progress-report` plus\n`verify.py --json`) since `make verify` writes no JSON, and no longer emits\nobjdiff objects.\n\n# Badges\n\nStandard names, so they mean the same thing as on every other project:\n\n  perfect match   measure=code\n  fuzzy match     measure=fuzzy_match_percent\n  linked code     measure=complete_code\n  first-party     measure=matched_functions&category=main\n  all functions   measure=matched_functions\n\n# Tests\n\n`tests/test_gen_decomp_report.py` pins each defect: matched and complete must\ndisagree when one function is byte-exact-but-unshipped and another\nshipped-but-not-exact; fuzzy must never fall below matched; every declared\ncategory must be populated; the denominator must equal the canonical function\ncount; the linked measures must be non-zero with NO build artifact present.\n\nThe badge allowlist gained `code`, `complete_code` and `matched_code`, and the\nfuzzy-labelling rule now covers only `fuzzy_match_percent`, since this report\ndefines the matched family as strictly byte-exact rather than fuzzy-weighted.\n\n577 tests pass; lint and progress validation are clean.","measures":{"fuzzy_match_percent":25.463993,"total_code":4387560,"matched_code":1117248,"matched_code_percent":25.463993,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":6985,"matched_functions_percent":53.31654,"complete_code":1084584,"complete_code_percent":24.719524,"complete_data":0,"complete_data_percent":100,"total_units":324,"complete_units":167}},{"timestamp":"2026-08-13T22:28:20Z","commit_sha":"2ae537eb02814a69ae788c90d027c8aa91841923","commit_message":"first-party: +8 from a compiler conversion idiom, and fix the linked badge reporting 0/0\n\nFirst-party 5993 -> 6001 of 7866 (76.19% -> 76.29%). Zero regressions, zero\nMISMATCH, image unchanged at 3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n# The linked badge was broken and I had not checked it\n\nThe `linked` progress category landed last commit, but the published badge read\n`Linked into the byte-exact image: 0 / 0`. decomp.dev had ingested the category\nNAME and zero units, which is worse than publishing nothing because it reads as\na real measurement.\n\nCause: `make objdiff-report` regenerates objdiff.json from scratch, and the\ngenerator only tagged units when `build/linked_report.json` existed. That file\nis a BUILD ARTIFACT produced by the linker, and CI regenerates the config in a\njob that has never linked, so the `$(wildcard ...)` guard silently degraded to\n\"tag nothing\". Locally the artifact existed, so the local config looked correct\nand I verified the wrong thing -- I checked the file I generated by hand instead\nof the badge decomp.dev actually serves.\n\nFixed by falling back to the committed `progress/metrics.json` endpoint, whose\n`linked.addresses` holds the 1427 linked-and-byte-exact functions and is present\nin every checkout. Proved under the CI condition (artifact moved away, no flag):\nthe category now tags 1427 units, 1427 complete, so the badge renders 1,427\nrather than 0/0. With the artifact present it tags the full 1863 linked\nfunctions of which 1427 are compiled C, so `complete_code_percent` under the\ncategory remains the fraction of shipped linked code that is real C.\n\nLive badge state, checked against decomp.dev rather than inferred:\n\n  complete_units                        6,977 / 13,101   already correct\n  fuzzy_match_percent                   24.76%           already correct\n  complete_units&category=linked        was 0/0          now 1,427\n\nThe test that covered this asserted the OPPOSITE -- that a missing report yields\nan empty set -- which is exactly the behaviour that produced the broken badge.\nIt now asserts the fallback and that a named-but-absent artifact degrades to it.\n\n# +8 first-party, and the reason they closed\n\n  func_004a7c00  code1_004a  416/416    func_0025ea20  code1_0025  484/496\n  func_0014bbe0  k_misc      432/432    func_0025ecd0  code1_0025  588/592\n  func_004633f0  code1_0046  296/304    func_00450050  sdkDbprt    416/416\n  func_001ef7e0  code1_001e  224/224    func_00193450  code1_0019  356/368\n\n`src/Kosaka/k_misc.c` is now fully matching at 7/7.\n\nFive of those eight are one finding. `or` feeding `mtc1` feeding `cvt.s.w` is\nnot arithmetic from the source: it is MWCCPS2's own unsigned-integer-to-float\nconversion, because the hardware `cvt.s.w` is signed and the compiler fixes the\nsign bit with an OR. The mirror shape, an `or` after `mfc1` with a `lui 0x8000`,\nis its float-to-unsigned conversion. Retail's source contained a plain CAST in\nboth directions. A body that hand-writes the fixup still emits an `or` and an\n`mtc1`, but MWCC allocates registers for that expression rather than for its own\nidiom, giving a tiny residual that resists everything.\n\nThree functions in three files shared a byte-identical signature and had\nabsorbed four lanes' probes -- roughly twenty-five distinct shapes, all correctly\nrecorded as failures. They closed together in ten minutes with\n`(f32)(u32)x`. Two more in code1_0025.c closed with the mirror,\n`(u16)(4096.0f * x)`, after deleting a hand-written compare/subtract/OR/mask\nblock the compiler generates itself.\n\nThe lesson is about diagnosis, not about casts: when a small residual repeats\nIDENTICALLY at several sites in one function, suspect a compiler idiom the\nsource should not be spelling out at all, rather than a colouring accident. The\nexhaustive ruled-out lists were exhaustive within the wrong hypothesis.\n\nThe other three: `func_00450050` needed the address materialised through a named\ninteger local so retail's `addiu +0x60` preceded the `lb`; `func_001ef7e0`\nneeded `> 5` instead of the equivalent `>= 6`, which moved the comparison into\n`$at`; `func_00193450` needed nothing at all -- its three \"differing\" trailing\nwords are `0x00000000` retail nops that verify already ignores, and only fndiff\ncounted them, so the archive had recorded a residual that never existed.\n\n# Floors recorded, with evidence\n\n  func_003cb720/003cb870  retail movz; MWCC emits branch+move\n  func_001932f0           addiu vs daddiu at one word; s64/u64/long long returns\n                          and the whole destination-width family ruled out\n  func_00232c70           same family; a u8 return DOES produce exact daddiu at\n                          both sites but costs nd 12 in register churn, so the\n                          mechanism is confirmed and the cure is worse\n  func_0022ff70           retail stages a field through $v0 before $a2; three\n                          lanes have now failed to reproduce the extra hop\n  func_00165fb0           two sb stores with swapped registers plus one\n                          transposed addu; a lookup helper reached nd 2\n\nAlso: archived residual numbers can go STALE. Two bodies archived at nd 2 in\ncode1_003b.c now measure nd 32 in the current declaration environment, so the\ncensus should re-measure rather than trust recorded figures.","measures":{"fuzzy_match_percent":24.833569,"total_code":4350764,"matched_code":1075460,"matched_code_percent":24.718878,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":6969,"matched_functions_percent":53.194416,"complete_code":1080452,"complete_code_percent":24.833614,"complete_data":0,"complete_data_percent":100,"total_units":13101,"complete_units":6985}},{"timestamp":"2026-08-13T20:44:40Z","commit_sha":"61fec9e4fc44c9155d3598341bf7d3f31940d23a","commit_message":"first-party: +5, three more complete units, and repair a translation unit that would not compile\n\nFirst-party 5988 -> 5993 of 7866 (76.13% -> 76.19%). Zero regressions, zero\nMISMATCH, image unchanged at 3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\nClosed:\n\n  func_0015cd70  k_fldNpcTable  416/416    func_00230020  btlBoss     208/208\n  func_0015c800  k_fldNpcTable  552/560    func_00483270  effGeometry 384/384\n  func_00298990  evtScript      488/496\n\nThree translation units are now byte-exact end to end: `src/evtScript.c` 9/9,\n`src/promoted/k_fldNpcTable.c` 12/12, and `src/Battle/btlBoss.c` is at 14/15\nwith only a nd-5 residual left.\n\n# A translation unit was silently uncompilable\n\n`src/promoted/code1_003c.c` failed to compile entirely -- 209 COMPILE_ERROR\nrows, the whole unit dead -- and no wave gate had caught it because the previous\ngate ran before the condition appeared. Cause:\n\n  line  109: extern void func_003cbde0(u8 *, void (*)(u8 *), u8 *);\n  line 2136: s32  func_003cbde0(u8 *, void (*)(u8 *), u8 *) {   /* guarded */\n\nConflicting return types on one signature. The definition sat inside an\n`#ifdef NON_MATCHING` block, which is exactly why it went unnoticed: a guarded\nnear-miss body is not inert, and when anything else in the unit changes it can\ntake the whole file down. `func_003cbe80` had the same collision.\n\nBoth bodies are now archived under `build/` with their measurements preserved\n(nd 86 and nd 57) and their source regions restored to a marker plus bare\n`INCLUDE_ASM`. A tree-wide scan for the same pattern found no other ACTIVE\ncollision; the remaining candidates in code1_001f/0042/0051 are `return\nfunc_x(...)` statements, not definitions, and code1_003e's one real case\ncompiles.\n\nStanding rule from this: a near-miss body belongs in `build/<LANE>_<addr>_body.c`\nwith a measured first line, not in an `#ifdef` in the source. It cannot break a\nbuild there, and it is findable by the next lane instead of being deleted by the\nnext cleanup sweep.\n\n# What the targeting data now says\n\nClosure rate per lane, cumulative:\n\n  last function in an otherwise-matched file, first pass   7 of 16   44%\n  same class, second pass (this wave)                      5 of 16   31%\n  untouched and 129-256 bytes                              5 of 13   38%\n  untouched and <=128 bytes                                4 of 13   31%\n  closest archived residual                                1 of 14    7%\n\nThe file-completion class still leads but has decayed, and the reason is visible\nin the results rather than the rate: the tractable tail of these files is being\nconsumed and what remains is floors. This wave archived four more COP1\naccumulator chains (func_00481a20 at 864 bytes, func_004a8da0, and two in\nprimitive/effBlurFilter) and eight bodies that came out oversized against their\nwindow. Those are not near misses; they are reconstruction problems.\n\nNotably, three lanes closed functions that a previous lane had already archived\nas blocked, so the archives are doing their job:\n\n  - func_00298990 (evtScript, nd 15 archived) closed with named f32 locals for\n    the two multiply operands, assigned in retail's order. The archived header\n    claimed a better \"nd 8\" shape existed; I checked all thirty probe artifacts\n    and every body measured nd 15, so that figure was a differing-WORD count\n    written into a normalized_diff field. The header is corrected.\n  - func_00230020 (btlBoss, nd 6 archived) closed with an explicit switch over\n    all ten tested values with literal returns.\n  - func_00483270 (effGeometry, nd 19 archived) closed by reordering one local\n    ahead of another and swapping two declarations to reproduce retail's\n    saved-register colouring.\n\n# Best unclosed, all with archived bodies and ruled-out lists\n\n  func_0014bbe0  k_misc        432/432  nd 4   both arms `or $v0` vs retail `$v1`\n  func_0022ff70  btlBoss       168/176  nd 5   retail stages a field via $v0\n  func_003c9940  code1_003c    172/176  nd 6   global load vs base addu order\n  func_00106f40  cmmCommunity  356/368  nd 7   saved-register rotation\n  func_003ca320  code1_003c    168/176  nd 10  improved from nd 13\n  func_0025f110  shdSprite     288/288  nd 11  improved from nd 15\n  func_00463100  k_clump       324/336  nd 24  three identical move/addiu swaps\n\n`func_0014bbe0` is now genuinely exhausted: this wave additionally ruled out\nreversed OR operands, differently-typed operands, a named result local, a\nseparate float-conversion local, distinct per-arm locals, split assignment with\na read after the `mtc1`, and a typed read-after-`mtc1`.\n\nPublished figures refreshed: 6977/13101 matching, 1426 C-linked.","measures":{"fuzzy_match_percent":24.759537,"total_code":4350800,"matched_code":1072248,"matched_code_percent":24.644848,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":6961,"matched_functions_percent":53.13335,"complete_code":1077240,"complete_code_percent":24.759584,"complete_data":0,"complete_data_percent":100,"total_units":13101,"complete_units":6977}},{"timestamp":"2026-08-13T19:27:21Z","commit_sha":"74d62b271f345e27017ccf387b9d1d28a3fb844b","commit_message":"first-party: +7 and six whole translation units, plus publish the linked and fuzzy figures\n\nFirst-party 5981 -> 5988 of 7866 (76.04% -> 76.13%). Zero regressions, zero\nMISMATCH, image unchanged at 3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\n# Six translation units are now byte-exact end to end\n\n  src/Script/scrTraceCode.c          43/43   func_0029ad40\n  src/nmCmdList.c                    19/19   func_002bb290\n  src/Graphics/Model/effModel.c      19/19   func_004ac300\n  src/Battle/btlUnit_functions.c     19/19   func_0019e5f0\n  src/Graphics/Effect/effMisc.c      12/12   func_004bd230\n  src/Battle/btlAction.c              9/9    func_001a1190\n\nplus func_00230d30, leaving code1_0023.c at 12/13.\n\n# Targeting by file, not by function\n\nEvery earlier wave picked targets by a property of the function - smallest,\nclosest residual, most mis-declared callees. This one picked the LAST unmatched\nfunction in files whose other functions are all verified byte-exact. Measured\nclosure rate per lane:\n\n  last-function-in-file        7 of 16   44%\n  untouched, <=128 bytes       4 of 13   31%\n  untouched, 129-256 bytes      5 of 13   38%   (but 11 oversized bodies)\n  closest archived residual    1 of 14    7%\n  most mis-declared callees    1 of 13    8%\n\nand the closures were not small: 336, 240, 592, 432, 336 and 592 bytes. Size was\nnever the predictor. What matters is that a file full of matched siblings hands\nyou its callee signatures as facts rather than guesses, and demonstrates the\nunit's conventions in working code a few lines away.\n\n# Levers\n\n  - Block-scope prototypes in bulk. btlAction needed eleven, nmCmdList four.\n    In a file with matched siblings a file-scope change can regress many at\n    once, so the corrected `extern` belongs inside the function that needs it.\n  - Hidden return values. btlAction closed on declaring func_001d3900 and\n    func_001d3700 as returning `BtlPacket *` although their own definitions are\n    `void`: retail leaves the value in $v0 and the caller consumes it.\n  - Integer-domain address arithmetic. scrTraceCode's second pointer sum had to\n    be `(u8 *)((u32)a + (u32)b)` to get retail's addu operand order, with a\n    reversed range guard (`count > raw`) for retail's slt $at.\n  - Interleaved float-first signatures. effMisc required\n    `(f32 angle, const RwV3d *axis, RwMatrix *matrix)` in that order, caller\n    updated, rather than parameters grouped by class.\n  - COP2/VU0 asm is permitted where H009 says it is, and the GPR plumbing in\n    such a statement rides along with it. effModel's retail body is a\n    qmtc2/vitof0/vmul/vftoi0/qmfc2 chain whose pextlb/ppach unwrap the COP2\n    results; that is one hardware idiom, not optimizer steering. Standalone MMI\n    with no COP2 instruction remains banned and remains a floor.\n\n# decomp.dev now publishes the fully-linked and fuzzy figures\n\nThe project's strongest claim - a byte-exact linked image - was not on\ndecomp.dev at all. It only appeared in a self-hosted shields endpoint, while\ndecomp.dev showed `complete_units` (byte-exact in isolation, 6972) with no way\nto ask how much of that is actually linked into SLUS_217.82.\n\nAdded an additive `linked` progress category to objdiff.json, tagging the\nfunctions tools/build.py reports as linked. It is carried ALONGSIDE a unit's\nattribution category, because being linked is orthogonal to which source owns\nthe function; the three attribution categories still partition the units\nexactly once. Two new README badges follow from it: `fully linked C`\n(complete_units over category=linked) and `fuzzy match`.\n\nMeasured: 1863 units carry the category and 1421 of them are complete, which\nagrees exactly with progress/linked.json's independently computed 1421/13101.\nThe gap between 1863 and 1421 is real and worth publishing - a linked TU still\nsplices INCLUDE_ASM for its unfinished functions, so `complete_code_percent`\nunder this category is the fraction of shipped linked code that is compiled C.\n\nThe build is untouched: gen_objdiff only reads the linked report, and the image\nstill hashes to 3d1d3d2b. `--linked-report` is passed only when the report\nexists, so a config generated without one publishes no linked figure rather\nthan a wrong one.\n\nOne test changed rather than being deleted. `test_no_badge_reports_a_fuzzy_measure`\nforbade publishing any fuzzy measure, on the correct grounds that it would\noverstate a byte-identical claim. That also hid genuinely useful information -\nhow close the unfinished 24% is - so it is now\n`test_fuzzy_measures_are_labelled_fuzzy`: a fuzzy measure is allowed only under\na label containing the word, so it can never be read as the byte-exact number.\n\n# Repairs\n\nReverted datUnit.c: its lane replaced a named `gEncountTbl` declaration with a\nGP alias while its target still ended as ASM, so the change cost a declaration\nand bought nothing.\n\n# Best unclosed\n\nfunc_0014bbe0 nd 4 (432/432; both arms emit `or $v0` where retail uses `$v1`;\nhidden-return, lifetime, guard-polarity and single-exit forms all ruled out),\nfunc_0022ff70 nd 5, func_00230020 nd 6, func_003c9940 nd 6, func_0025f110 nd 15,\nfunc_00298990 nd 15.","measures":{"fuzzy_match_percent":24.712374,"total_code":4350816,"matched_code":1070200,"matched_code_percent":24.597685,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":6956,"matched_functions_percent":53.095184,"complete_code":1075192,"complete_code_percent":24.712423,"complete_data":0,"complete_data_percent":100,"total_units":13101,"complete_units":6972}},{"timestamp":"2026-08-13T13:32:44Z","commit_sha":"d82006fd9015be43ee07ddeacad9bc067339853d","commit_message":"first-party: +5, and fix the newline bug that blocked four consecutive gates\n\nFirst-party 5976 -> 5981 of 7866 (75.97% -> 76.04%). Zero regressions, zero\nMISMATCH, image unchanged at 3d1d3d2b9d6ccb60836db239ab49674223025a78.\n\nClosed:\n\n  func_003b7b20  rprandom_grouped  144/144   func_00396f00  code1_0039  176/176\n  func_003a6570  code1_003a        212/224   func_00397120  code1_0039  176/176\n  func_00100230  code1_0010        132/144\n\n# The size cliff is real and now measured\n\nLast wave took all 33 untouched functions of 128 bytes or less and closed 4 of\n13 lanes. This wave took the next tier -- 176 untouched functions at 129-256\nbytes, 13 lanes, same method and the same 20-minute budget -- and closed 5 of\n13. But the distribution is completely different:\n\n  <=128 bytes    4 closures from 33 candidates    12.1%\n  129-256 bytes  5 closures from 74 attempted      6.8%\n\nand the failures are qualitatively worse. At <=128 bytes the archived residuals\nwere mostly single-digit. Here the median archived residual is nd 79, and eleven\nof the archived bodies came out LARGER than their retail window, which means the\ncandidate is not a near-miss at all -- it is a different function that happens to\ncompute the same thing. Reading a 64-instruction window end to end is not the\nsame activity as reading a 20-instruction one.\n\nUseful consequence: the two size bands should be worked differently. Below 128\nbytes, read and derive. Above it, the declaration census and the callee-shape\nlevers matter more than reading, because the residual is rarely local.\n\n# Levers that closed something\n\n  - func_003a6570: corrected func_003b42e0 to 4 arguments, loaded arg0+0x2C\n    before arg0+8, and gave three address roots distinct locals to hold retail's\n    register colouring.\n  - func_00100230: a numeric u32 absolute-base cast rather than a pointer.\n  - func_003b7b20: corrected func_003c1b80 to (s32) plus a measured\n    no_branch_likely bracket.\n  - func_00396f00, func_00397120: live bodies derived from the retail windows.\n\n# Compiler floors recorded\n\nFour more COP1 accumulator chains (func_003e3dc0, func_003e3e60, func_003e8200,\nplus func_003e0130's neighbours) and two MMI sequences (func_003a14f0 pcpyld,\nfunc_003cc680 pexew/ppacw). All are unreachable from compliant C and are now\nannotated so no future lane re-probes them.\n\ncode1_0041.c's mixed-compiler map is now filled in for six more functions: all\nsix are MWCC-built, four frameless, with the ee-gcc transition beginning at\nfunc_00417510. The diagnostic is `sq` of an `$s` register for MWCC versus `sd`;\n`sd $ra` is not diagnostic, and that misreading cost a lane time two waves ago.\n\n# The newline bug\n\n`tools/archive_to_guard.py` rejoined every file it touched with a trailing\nnewline appended unconditionally. src/promoted/code1_0042.c is committed\nWITHOUT one, so every run rewrote its final line, and the gate's\ndeclaration-environment check read that as a lost declaration. It blocked the\ngate in four consecutive waves and I reverted the file by hand each time\ninstead of reading the writer. Fixed by preserving the file's original\ntrailing-newline state; proved by running a full install/strip cycle and\nconfirming the file is byte-identical to main.\n\nAlso repaired a `#pragma schedule off` a lane deleted from code1_003c.c while\ninserting its own comment block directly above its target -- the same\ncomment-block-above-a-marker hazard that has now caused damage three times.\n\n# Best unclosed\n\nfunc_0022ff70 at nd 5 (retail stages a field through $v0 before $a2; all-locals\nargument staging tested and held), func_00230020 at nd 6, func_003c9940 at nd 6\n(candidate computes an address before a global load where retail loads first),\nfunc_003ca320 at nd 13.","measures":{"fuzzy_match_percent":24.643631,"total_code":4350860,"matched_code":1067220,"matched_code_percent":24.528942,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":6949,"matched_functions_percent":53.04175,"complete_code":1072212,"complete_code_percent":24.643679,"complete_data":0,"complete_data_percent":100,"total_units":13101,"complete_units":6965}},{"timestamp":"2026-08-13T11:37:30Z","commit_sha":"bbb212fc95f854d85481e76156eddae18b87bb10","commit_message":"first-party: +4, from reading small untouched functions instead of grinding near-misses\n\nFirst-party 5972 -> 5976 of 7866 (75.92% -> 75.97%). Zero regressions, zero\nMISMATCH, image unchanged at 3d1d3d2b9d6ccb60836db239ab49674223025a78. CI green.\n\nClosed, all at normalized_diff 0:\n\n  func_001852f0  code1_0018  116/128    func_00285330  code1_0028  124/128\n  func_0033e540  code1_0033   96/96     func_00450490  code1_0045   92/96\n\n# Why this pool\n\nA census of the 1894 open first-party functions found 1711 that no lane has\never worked, and only 33 of those are 128 bytes or smaller -- 1107 are over 512\nbytes and are reconstruction problems. This wave took all 33. At 16-32\ninstructions a lane can read the whole retail window and derive the C, which is\nwhat closed all four:\n\n  - func_001852f0: read the retail packet construction directly and wrote it\n    with `_pcpyld`/u64 locals and a 0xFF00000000000000ULL mask.\n  - func_00285330: derived a do/while loop with the table pointer and the\n    comparison constants hoisted, and ordered the locals i/c4/c5/c6 so they\n    land in retail's registers.\n  - func_0033e540: retail copies two 8-byte float pairs as aggregates; typed\n    parameters plus struct assignment reproduced the paired lwc1/swc1 order\n    where m2c's scalar seed could not.\n  - func_00450490: four named local loads in retail's order, reusing two of\n    them, reproduced the load order and FPU colouring exactly.\n\n4 of 13 lanes, against 1 of 14 for the closest-residual pool and 1 of 13 for\nhighest-callee-count. Untouched-and-small is the best-yielding target class\nfound so far, and it is nearly exhausted: 29 of the 33 are now archived with\nmeasured residuals.\n\n# A rejected match worth recording\n\nfunc_00450490 first reached nd 0 with `volatile` reads used to pin the load\norder -- the fifth time this campaign. It was rejected, and on re-measurement\nthe same four loads written as ordinary named locals in retail's order produced\nthe identical bytes. The barrier was never doing the work; the ordering was.\nThat is now the second function where removing a rejected `volatile` and using\nnamed locals kept the match.\n\n# Compiler floors identified\n\nThree of the archived functions are genuinely unreachable in compliant C rather\nthan merely hard: func_003e0130, func_003e0180 and func_003e01e0 are ordinary\nCOP1 `mula.s`/`madda.s`/`madd.s` accumulator chains, and func_003cc680 is an MMI\n`pexew`/`ppacw` sequence. They are recorded as such so no future lane re-probes\nthem.\n\nfunc_004147a0 is in code1_0041.c, documented as a mixed 66-GCC/24-MWCC unit. The\nlane confirmed it is MWCC-built from its prologue -- `sq $s0` is the tell, while\n`sd $ra` is not diagnostic either way -- and archived it at nd 49. That\ndetermination is durable and stops the next lane discarding it on a misread.\n\n# Process\n\nThe 20-minute stopping rule was enforced this time: median lane was well inside\nit and one lane that ran long was cut and told to archive what it had. Repaired\ntwo markers a lane deleted from code1_003e.c (func_003e3e60 lost both its marker\nand its INCLUDE_ASM line, func_003e40b0 lost its marker), reverted an unbalanced\n`schedule on` in code1_0039.c, and reverted the recurring trailing-newline\nartifact in code1_0042.c.","measures":{"fuzzy_match_percent":24.624605,"total_code":4350908,"matched_code":1066404,"matched_code_percent":24.509918,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":6944,"matched_functions_percent":53.003586,"complete_code":1071396,"complete_code_percent":24.624653,"complete_data":0,"complete_data_percent":100,"total_units":13101,"complete_units":6960}},{"timestamp":"2026-08-13T09:15:19Z","commit_sha":"4d1b6b17bc27f5579d82de43ec72d3443e998efa","commit_message":"fix CI, and correct seven functions that were counted as matches but were not\n\nCI is green again, and the first-party count is 5 lower than the last commit\nclaimed because seven of those \"matches\" were assembly fallbacks.\n\n# The CI failure\n\nThe ee-gcc removal fixed `make build`, and the build has been byte-exact ever\nsince - the failing runs since then got all the way through build and verify and\ndied later, at `make objdiff-objects`:\n\n    FAIL promoted/code1_001e:001E7400: 'func_001e7400'   (and five more)\n    FAIL promoted/code1_0045:00450490: 'func_00450490'\n    gen_objdiff: 7 unit(s) failed to emit\n    make: *** [Makefile:115: objdiff-objects] Error 1\n\nThe bare quoted name is a `KeyError`: `gen_objdiff --emit-objects --skip-asm`\ncompiles each unit without assembling its `INCLUDE_ASM` blocks and then slices\nthe named symbol out, and for these seven the symbol was not in the object.\n\n# Why, and why it also inflated the metric\n\nAll seven have their `// FUN_XXXXXXXX` marker INSIDE the `#ifdef NON_MATCHING`\nblock rather than above it:\n\n    /* measured: ... */\n    #ifdef NON_MATCHING\n    // FUN_001E7400            <- inside the guard\n    s32 func_001e7400(void) {\n\n`tools/verify.py` finds markers by scanning text, so it saw a marker with no\n` NONMATCHING` suffix and a symbol that matched retail exactly - because the\nsymbol came from the `#else INCLUDE_ASM` branch, which reproduces the retail\nwindow byte-for-byte by construction. It therefore reported MATCH for seven\nfunctions whose C is not compiled at all. Under `--skip-asm` the fallback is not\nassembled, the symbol disappears, and gen_objdiff failed - which is the honest\nsignal that the MATCH was never real.\n\nMoving each marker above its `#ifdef` and giving it the ` NONMATCHING` suffix,\nwhich is the convention everywhere else in the tree, fixes both: the emit step\nnow reports `emitted 25821, up to date 0, failed 0`, and verify reclassifies the\nseven as ASM.\n\nFirst-party is therefore 5977 -> 5972 of 7866 (75.97% -> 75.92%): +2 real\nclosures this wave, -7 from the correction. The linked image is unchanged at\n3d1d3d2b9d6ccb60836db239ab49674223025a78, because nothing about what the build\nlinks changed - only what the verifier claimed about it.\n\n# The two real closures\n\n  func_00115670  shdSkill      220/224   func_0021b0a0  code1_0021   240/240\n\n`func_00115670` was the closest function in the tree at nd 1 and three loop\nspellings had failed on it. The residual was the loop ENTRY BRANCH, and what\nworked is a trampoline: compute the value before the guard, branch to an entry\nlabel that is neither the test nor the body, assign the induction variable\nthere, then jump to the test. Guarded do/while measured nd 23 and unguarded\nnd 40.\n\n`func_0021b0a0` closed by using direct `(f32)` conversions of an unsigned value\ninstead of a hand-written signed fixup, plus block-scope `DatUnit *` parameters\nat the call site. Adopting the callee's verified `u16` return instead measured\nnd 137, so the call site legitimately disagrees with the definition.\n\n# Targeting\n\nThis wave took the intersection of both signals - mis-declared callees AND an\narchived residual under 20 at correct-or-under size - which is only 23 functions\ntree-wide, and closed 2 of 14. Against 1 of 14 for closest-residual alone and\n1 of 13 for callee-count alone, the intersection is better but not dramatically.\n\nTwelve lanes archived precise residuals with ruled-out lists, and about a dozen\nmore callee signatures were verified against their definitions.\n\nRepairs: reverted collateral damage in nLine.c (a load-bearing forward\ndeclaration removed), sdkChkmem.c (two lost externs), code1_003a.c (a function\npushed from nd 10 to nd 135 by an accidental tree-wide archive install), and the\nrecurring trailing-newline artifact in code1_0042.c; and corrected two nd notes\nthat the audit found had drifted once the guarded bodies became measurable.","measures":{"fuzzy_match_percent":24.614655,"total_code":4350928,"matched_code":1065976,"matched_code_percent":24.49997,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":6940,"matched_functions_percent":52.973057,"complete_code":1070968,"complete_code_percent":24.614702,"complete_data":0,"complete_data_percent":100,"total_units":13101,"complete_units":6956}},{"timestamp":"2026-08-10T10:11:07Z","commit_sha":"cea4096cce32429cba242bfbaf43f45a0d2b0ca5","commit_message":"P4: wave WR — +28 matched functions (5664 -> 5692, 72.0% -> 72.4%)\n\nThirteen lanes, all on pre-filtered fresh targets. first-party MATCH\n5664 -> 5692, ASM 2203 -> 2175. Canonical map unchanged at 13101.\n\n  code1_001b  +5    code1_002b  +5    code1_0048  +3\n  code1_001d  +3    code1_0012/0034 +3   code1_0019 +2\n  code1_0014  +2    code1_001f  +2    code1_001e  +1\n  code1_0011  +1    btlCamera_grouped +1\n\nTargeting is now filtered up front\n\n  Lane target lists were generated by filter rather than by pool size: a\n  window of 640 bytes or less, no note above the marker mentioning a\n  measured nd or a floor or NONMATCHING, no candidate-body archive named\n  for the address, and not in the six barren code1_003b/003c/003d/003e/\n  0039/003a files. 375 of the 2203 remaining functions survived that;\n  1205 were excluded as already probed.\n\n  Lanes were told explicitly not to re-run their own probe check, which\n  had cost a lane its entire run in the previous wave.\n\nThe nearest-neighbour rule did most of the work\n\n  Four waves of evidence now: after a closure, the cheapest next\n  function is the one beside it. code1_001b went one closure to five\n  purely by abandoning list order each time; code1_001d took three\n  consecutive 176-208 byte functions the same way; code1_002b got\n  002BADC0 and 002BAE80 back to back.\n\nShapes worth keeping\n\n  code1_0048's COP2 reconstructions needed the matrix stack object\n  declared `sp50[4]` with a three-argument callback and NO saved return\n  local, and splitting a normal temp_f12 from a COP2 temp_f0 removed the\n  last residual.\n\n  001EB1D0 closed on a callback second argument typed s64 with\n  `((u64)x << 40) >> 40` and the callback table addressed through\n  `(u8 *) + index*8`.\n\nRepair found by the gate\n\n  code1_0041 func_00414b50 was parked claiming nd 19 and measured 41,\n  well past the threshold; reverted to bare INCLUDE_ASM with the body\n  archived at build/ORCH_00414b50_park_nd41.c. That is the third park in\n  three waves whose noted figure was not the measured one.\n\nGate\n\n  decomp_lint          0 errors (4 warnings)\n  verify               13101 scanned, no rows outside MATCH/ASM\n  census vs wave 67    0 missing, 0 regressed, 0 bad\n  nd_audit             128 preserved bodies, 0 drift\n  tests                560 passed\n  progress-validate    OK\n  build                170 eligible C objects\n                       loadable image 3d1d3d2b9d6ccb60836db239ab49674223025a78\n                       SLUS_217.82    4eeec0360cf2715535d9f7e52eb69d786fb0158c","measures":{"fuzzy_match_percent":22.112541,"total_code":4353104,"matched_code":957592,"matched_code_percent":21.997911,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":6610,"matched_functions_percent":50.454163,"complete_code":962584,"complete_code_percent":22.112589,"complete_data":0,"complete_data_percent":100,"total_units":13101,"complete_units":6626}},{"timestamp":"2026-08-10T08:53:55Z","commit_sha":"0ce2617558c0a44a87341b07a43e3053451b7d5b","commit_message":"P4: wave WQ — +29 matched functions (5635 -> 5664, 71.6% -> 72.0%)\n\nThirteen lanes, retargeted onto never-touched code. first-party MATCH\n5635 -> 5664, ASM 2231 -> 2203. Canonical map 13100 -> 13101.\n\nWhy the targeting changed\n\n  Of the 2231 functions remaining before this wave, only 452 had ever\n  had a candidate compiled against them; 1779 had never been touched and\n  95 files had never been opened at all. Previous waves ranked files by\n  ASM count and staffed the biggest pools, but pool size measures\n  DIFFICULTY, not opportunity -- those pools are large precisely because\n  earlier waves failed on them. Four lanes spent four waves on\n  code1_003b/003c/0039/003a for one closure between them.\n\n  So this wave worked only functions with no probe history and a window\n  of 384 bytes or less, bin-packed across twelve lanes, with a single\n  thirteenth lane on the six hard files restricted to converting their\n  existing parks.\n\n  Result: twelve tail lanes produced 29 closures across sixteen files.\n  The hard-file lane produced zero, which is the third wave running that\n  those six files have yielded nothing.\n\n  code1_001d  +6    code1_0013  +4    battle.c    +2 (now 10/10 COMPLETE)\n  code1_0022  +2    btlCamera_grouped +3   code1_0026 +2\n  code1_002b  +2    code1_001e  +2    code1_001f  +2\n  btlFormation_grouped +2   code1_0019 +1  code1_0010 +1\n  nmCmdList   +1    btlBoss     +1\n\nTwelfth hidden sibling registered\n\n  0x001013A0, inside what was a 352-byte window for func_00101350. The\n  owner ends at 0010139C with an infinite `b .-3` and a nop, and a new\n  frame opens immediately after. Reachability is neither a jal nor an\n  adjacent %hi/%lo pair: it is `lui $v1,0x10` at 001024FC with\n  `addiu $v1,$v1,0x13A0` at 00102500, and the game installs it as a\n  callback -- src/Main/mainDraw.c already declares `extern u8\n  D_001013A0[]` and stores its address into a structure field.\n\n  Splitting 352 into 80 + 272 closed func_00101350 outright at nd 0.\n\n  The generalisable part: when a candidate is byte-exact but reports\n  SIZE_MISMATCH, also grep the SOURCE TREE for the interior address as a\n  D_ symbol. A callback installed by address does not appear in any\n  instruction scan. An earlier report of this same address was dismissed\n  on the assumption it was a rotated loop's landing point; it was not.\n\n  tests/test_reconcile.py now also accepts an infinite self-branch as a\n  complete function terminator, since a function that loops forever ends\n  just as definitively as one that returns.\n\nThe skip rule was wrong and was corrected mid-wave\n\n  Lanes were told to skip an address with more than about five archived\n  probes. But nearly every artifact under build/ is a scoped verify\n  report, and a verify report lists every function in the file it\n  covers -- 37,225 distinct addresses have some artifact and 12,846 have\n  more than five. One lane skipped all 22 of its targets and another\n  skipped five whole files before this was caught.\n\n  The rule now counts only a note in the SOURCE above the marker, or a\n  candidate-body archive named for the address. A verify report is never\n  evidence of probing.\n\nGate\n\n  decomp_lint          0 errors (4 warnings)\n  verify               13101 scanned, no rows outside MATCH/ASM\n  census vs wave 67    0 missing, 0 regressed, 1 added (the split sibling)\n  nd_audit             126 preserved bodies, 0 drift\n  tests                560 passed\n  progress-validate    OK\n  build                170 eligible C objects\n                       loadable image 3d1d3d2b9d6ccb60836db239ab49674223025a78\n                       SLUS_217.82    4eeec0360cf2715535d9f7e52eb69d786fb0158c","measures":{"fuzzy_match_percent":21.906488,"total_code":4353276,"matched_code":948660,"matched_code_percent":21.791864,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13101,"matched_functions":6582,"matched_functions_percent":50.24044,"complete_code":953652,"complete_code_percent":21.906536,"complete_data":0,"complete_data_percent":100,"total_units":13101,"complete_units":6598}},{"timestamp":"2026-08-10T07:37:23Z","commit_sha":"b8267190cce30c8cf5c60581e49a3c9532d01076","commit_message":"P4: wave WP — +30 matched functions (5605 -> 5635, 71.3% -> 71.6%)\n\nFourteen lanes. first-party MATCH 5605 -> 5635, ASM 2261 -> 2231.\nCanonical map unchanged at 13100.\n\n  code1_0048               (+5)\n  code1_001c               (+3)\n  code1_0035               (+4)\n  code1_0011 / code1_0036  (+11, from a lane that woke on a broadcast)\n  nmCmdList                (+3)\n  code1_0014               (+2)\n  code1_0027               (+2)\n  code1_003d               (+2)\n  code1_0019               (+2)\n  code1_0021 / code1_0026  (+2)\n  btlCamera_grouped        (+2)\n  sfl_res, evtMisc, code1_001e (+3)\n\nsfl_res.c is now complete at 4/4.\n\nParks are targets, not obstacles\n\n  The correction that produced most of this wave. A park is a body that\n  already reproduces its window to within nd 25 with the object a few\n  words off -- that is nearly-done, and converting one costs far less\n  than a fresh reconstruction because the residual is one or two named\n  things. Seven parks became matches:\n\n    00270780, 00270A80   a static inline helper carrying retail's\n                         parameter order, tried BOTH ways round\n    001CE7F0, 001CEF20,  u32 shifted/masked temporaries under a measured\n    001CF160             optimization_level 1 bracket\n    0028F4F0             the assignment moved inside the if condition\n    0021DBA0             comparison-constant spelling\n\n  Guarded parks correctly report ASM, not MATCH, so none of this\n  inflates the headline: a park is retail bytes in the default build.\n\nFamily substitution keeps paying\n\n  00148000/00148140 and 001D05E0/001D06A0 both closed as pairs -- one\n  shape, substituted offsets. And once any function in a file yields its\n  immediate ASM neighbours yield cheaply; three closures came out of\n  nmCmdList that way.\n\nverify.py no longer shells out to WSL\n\n  tools/verify_config.local.json carried the assembler under the key\n  `p4_as`, but verify.py reads `as_path`, so every compile fell through\n  to `wsl -d Debian -- mipsel-linux-gnu-as` at roughly 1.5 process\n  spawns per second, sustained, for the whole run. Added the key verify\n  actually reads. A scoped verify of code1_003c now takes 2.4 seconds\n  with WSL fully shut down and zero wsl.exe spawns. build.py was never\n  affected -- it takes P4_AS from the environment.\n\nRepairs found by the gate\n\n  shdPersona func_00117310 was parked claiming nd 18 and measured 49,\n  well past the threshold; reverted to bare INCLUDE_ASM and the body\n  archived at build/ORCH_shdPersona_00117310_park_nd49.c.\n\n  code1_0011 func_00110960 was left as an unguarded nd 160 MISMATCH by\n  the lane that woke mid-wave; reverted. Its other eleven closures were\n  checked against the baseline marker sets and kept.\n\nGate\n\n  decomp_lint          0 errors (4 warnings)\n  verify               13100 scanned, no rows outside MATCH/ASM\n  census vs wave 67    0 missing, 0 added, 0 regressed\n  nd_audit             123 preserved bodies, 0 drift\n  tests                560 passed\n  progress-validate    OK\n  build                170 eligible C objects\n                       loadable image 3d1d3d2b9d6ccb60836db239ab49674223025a78\n                       SLUS_217.82    4eeec0360cf2715535d9f7e52eb69d786fb0158c","measures":{"fuzzy_match_percent":21.736406,"total_code":4353424,"matched_code":941288,"matched_code_percent":21.621786,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13100,"matched_functions":6553,"matched_functions_percent":50.0229,"complete_code":946280,"complete_code_percent":21.736454,"complete_data":0,"complete_data_percent":100,"total_units":13100,"complete_units":6569}},{"timestamp":"2026-08-10T05:28:20Z","commit_sha":"4681f03e3166302462eaccc91d862e0be25ffbf8","commit_message":"P4: reclassify the prebuilt vendor libraries as third-party\n\nThe four address spans this repo had been calling a \"foreign toolchain\ncompiler floor\" are CRI Sofdec/ADX/ROFS, the Sony PS2 SDK, and the C\nruntime -- prebuilt ee-gcc objects linked into the image. They are not\nAtlus code and were never going to match under MWCCPS2.\n\nfirst-party 9701 -> 7866 scanned; MATCH 5913 -> 5605; 61.0% -> 71.3%.\nNo function's status changed. Nothing was decompiled or undecompiled;\n1835 rows simply stopped being counted as our work.\n\nEvidence\n\n  1. Stack prologue. MWCCPS2 saves registers across the stack with\n     sq/lq, GCC with sd/ld. Retail uses `sd` of an $s register in these\n     spans, which no MWCCPS2 build or option emits. The test is\n     specifically the prologue -- `sd` also appears in ordinary MWCCPS2\n     code for 64-bit data, and a bare \"contains sd\" scan false-positives\n     on about thirty scattered game functions.\n\n  2. Function alignment, the cleanest discriminator. GCC aligns\n     functions to 8 and MWCCPS2 to 16, so an address at 8 mod 16 cannot\n     be MWCCPS2 output. Inside these spans 42-50% of functions are\n     8-aligned; outside them 0.23% are -- 19 of 8250, and all 19 sat\n     against these very boundaries.\n\n  3. Strings. Decoding the %hi/%lo string references originating inside\n     the spans yields \"(c)CRI\", \"CRI-MW\", \"../../rofs_mai.c\",\n     \"rofs_if.c\", \"rofs_hn.c\", \"rofs_pfs.c\", \"MWSST_Create\",\n     \"MWSFSVR_*\", \"MWSTM_ReqStart\", \"mwPlyStartXX\", \"SceStdioIoctlSema\",\n     \"Sony PS2 Memory Card Format\", \"bug in vfprintf\", and MPEG\n     macroblock decoder errors.\n\n  Worked example: func_0050b6b8 scores 899 under mwcps2-3.0.1b210-060308\n  and is instruction-identical under ee-gcc2.96 -O2 -G0, the only\n  differing row being the `jal` label name. Four different C spellings\n  gave the same score, so the compiler was the variable, not the source.\n  Reproduce with tools/decompme.py --try 0050b6b8 --against\n  ee-gcc2.96,mwcps2-3.0.1b210-060308.\n\nWhy by ADDRESS and not by path\n\n  The promotion step filed these libraries under generic names\n  (code1_0041.c .. code1_0052.c, code2_0070.c), which is the only reason\n  they were ever counted as first-party. They cannot simply be moved:\n  four of those units are mixed, holding real game code as well\n  (code1_004b is 75 game functions against 3 vendor), and relocating a\n  translation unit would change object boundaries and break the exact\n  link. So verify.py grows VENDOR_CODE_RANGES and is_vendor_address()\n  alongside the existing path rule.\n\nBoundaries came from the alignment signal, not by hand\n\n  An earlier hand-written set of four ranges was wrong in both\n  directions: too tight at the bottom of each span, and running 1.9 MB\n  past the top of the last one. Clustering the 8-aligned functions gives\n  three spans instead of four, and the merged result is checked by\n  tests/test_third_party_classification.py against the specific\n  stragglers that disproved the old set.\n\nAlso in this change\n\n  code1_003c: restored two pragma closers deleted during the wave. They\n  looked orphaned but were closing a bracket opened 1300 lines earlier\n  above FUN_003C0640, so removing them left schedule and\n  no_branch_likely on at end of file (two P001 errors). 90 MATCH\n  unchanged either way.\n\n  Wave WO closures retained: code1_0013 func_00130c30 and func_0013b370,\n  code1_0016 func_0016fe80 and func_0016ffd0, code1_0014 func_00144f60,\n  code1_001a func_001a0140, code1_001d func_001d7f10, code1_0039\n  func_0039bdf0. Two of those were family substitutions -- consecutive\n  same-size functions closing on one shape with substituted offsets.\n\n  code1_0048 func_004867e0 parked at measured nd 15.\n\nGate\n\n  decomp_lint          0 errors (4 warnings)\n  verify               13100 scanned, no rows outside MATCH/ASM\n  census vs wave 67    0 missing, 0 added, 0 regressed\n  nd_audit             130 preserved bodies, 0 drift\n  tests                560 passed (6 new for the address rule)\n  progress-validate    OK\n  build                170 eligible C objects\n                       loadable image 3d1d3d2b9d6ccb60836db239ab49674223025a78\n                       SLUS_217.82    4eeec0360cf2715535d9f7e52eb69d786fb0158c","measures":{"fuzzy_match_percent":21.594921,"total_code":4353588,"matched_code":935164,"matched_code_percent":21.480305,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13100,"matched_functions":6523,"matched_functions_percent":49.79389,"complete_code":940156,"complete_code_percent":21.59497,"complete_data":0,"complete_data_percent":100,"total_units":13100,"complete_units":6539}},{"timestamp":"2026-08-10T03:48:25Z","commit_sha":"b9ce1c0c4b3b08ec680c5ed2f5e2954c3e67fc64","commit_message":"P4: wave WN — +44 matched functions (5869 -> 5913, 60.5% -> 61.0%)\n\nSeventeen parallel lanes. first-party MATCH 5869 -> 5913, ASM 3832 -> 3788.\nCanonical map unchanged at 13100.\n\n  code1_0035/0038          (+9)\n  code1_0022/0029          (+6)\n  code1_0014/0016/0012/0015 (+5)\n  code1_001f               (+5)\n  code1_002e               (+4)\n  code1_003d               (+3)\n  code1_0027/0037          (+2)\n  code1_001c               (+2)\n  code1_002a               (+2)\n  code1_0039/001b          (+2)\n  mdlEffect                (+2)\n  code1_0019               (+1)\n  code1_003a               (+1)\n\nTwo more results from files that had been static: code1_003a took its\nfirst closure in three waves, and code1_0029 went 48 -> 53 of 65.\n\nA second documented floor fell\n\n  code1_0027 func_0027b100 was on the corroborated-skip list and closed\n  at nd 0 by porting the generated candidate with four s32 locals\n  reordered and an explicit goto loop layout. With k_clump func_00462eb0\n  last wave that is two skip-list entries broken by simply trying. A note\n  recording that an earlier agent failed is evidence about that agent.\n\nMarker auditing caught two more silent deletions\n\n  FUN_00370410 had vanished from code1_0037 and FUN_003D51C0 from\n  code1_003d. Both lanes' own counts were self-consistent while the\n  markers were missing -- when a marker is deleted the function stops\n  being scanned, so the marker count and the verify row count shrink\n  together. Only the diff against the previous commit sees it. Both\n  restored by their lanes.\n\nRepairs found by the gate\n\n  code1_003c had three unbalanced pragma brackets: schedule and\n  no_branch_likely opened for func_003c42b0 and never closed, and\n  schedule and tailcall opened for func_003cb7d0 with only a comment\n  where the closers should be. An orphaned no_branch_likely off further\n  down had been silently absorbing the first leak. All closed tightly\n  around their own functions; 90 MATCH preserved.\n\n  A park note on code1_0027 func_00270780 drifted from nd 1 to nd 3.\n\n  Confirmed pre-existing debt rather than a regression: code1_0020\n  func_0020b5b0 carries an nd 41 note but is bare INCLUDE_ASM, not a\n  guarded park, and predates this wave.\n\nAlso removed banned volatile casts from cmmRankUp func_00252050,\nreplaced with a measured opt_propagation bracket that preserves the\nmatch.\n\nGate\n\n  decomp_lint          0 errors (4 warnings)\n  verify               13100 scanned, no rows outside MATCH/ASM\n  census vs wave 67    0 missing, 0 added, 0 regressed\n  nd_audit             136 preserved bodies, 0 drift\n  tests                554 passed\n  progress-validate    OK\n  build                170 eligible C objects\n                       loadable image 3d1d3d2b9d6ccb60836db239ab49674223025a78\n                       SLUS_217.82    4eeec0360cf2715535d9f7e52eb69d786fb0158c","measures":{"fuzzy_match_percent":21.547571,"total_code":4353632,"matched_code":933112,"matched_code_percent":21.432955,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13100,"matched_functions":6515,"matched_functions_percent":49.732826,"complete_code":938104,"complete_code_percent":21.547619,"complete_data":0,"complete_data_percent":100,"total_units":13100,"complete_units":6531}},{"timestamp":"2026-08-10T00:35:06Z","commit_sha":"74c8ddfbc6af034a3cd8e73805ef0dcfcc1be847","commit_message":"P4: wave WM — +78 matched functions (5791 -> 5869, 59.7% -> 60.5%)\n\nTwenty parallel lanes. first-party MATCH 5791 -> 5869, ASM 3910 -> 3832.\nCanonical map unchanged at 13100.\n\n  code1_0035/0036/0038      (+8)\n  code1_0012/0014/0015/0016 (+7)\n  code1_002b                (+6)\n  code1_0022                (+5)\n  code1_001b                (+5)\n  code1_003d                (+5)\n  code1_0045/0047           (+5)\n  code1_0017/0028           (+5)\n  code1_0019                (+4)\n  code1_0024                (+4)\n  code1_0026                (+4)\n  code1_0041/004b           (+4)\n  code1_001a                (+4)\n  code1_003b                (+3)\n  code1_003c                (+2)\n  datPersona/btlCamera      (+3)\n  code1_0037, shdMisc       (+2)\n\nFour previously untouched pools were opened this wave: code1_0024 went\n6 -> 30 matched of 35, code1_0047 24 -> 28 of 37, code1_004b 63 -> 66 of\n78, and code1_002b took its first closures in three waves.\n\nA misnamed GP symbol, in use 98 times\n\n  `iGpfffb3ac` -- one `f` short of the naming rule -- appeared 92 times in\n  code1_001f and 3 each in battle.c and btlSound.c. It resolved to the\n  correct address only by accident: recover_symbols.py had emitted it from\n  observed evidence, while the name itself decodes to nothing under the\n  iGpffff + low-sixteen-bits rule. Every affected function reported nd 0\n  MATCH throughout, because verify.py masks relocation immediates.\n  Renamed all 98 to `iGpffffb3ac`; re-verified at 142 MATCH / 45 ASM.\n\n  A second instance of the same class: code1_003c func_003ca6a0 was\n  reading `iGpffffb714` where retail reads `iGpffffb71c` -- two real\n  slots eight bytes apart. Also invisible to verify, also nd 0. Fixed in\n  source, not by registering the wrong name.\n\nMarker ORDER is now audited, not just the set\n\n  Two lanes produced non-ascending markers: one relocated a body above its\n  neighbour, one left a stray duplicate. Function order in a translation\n  unit drives emission order and therefore link layout, so verify.py\n  reports MATCH on two transposed functions while the linked image would\n  fail its sha1. Both were corrected and every lane now reports ascending\n  alongside lost/added/duplicates.\n\nRepairs found by the gate\n\n  code1_003d had an unbalanced `#pragma schedule` -- a duplicate `on` with\n  no matching `off` (P001). The compiler state was already `on`, so\n  removing the redundant pragma balanced the lint with identical codegen.\n  code1_0033 func_0033d550 was left as a stranded nd 59 MISMATCH; reverted\n  to bare INCLUDE_ASM and archived.\n  Two park notes had drifted: 00123b70 noted 4 measured 3, and 00144b80\n  noted 4 measured 8. Both corrected to the measured figures.\n  Removed an empty src/Main/Battle/Data/tmp_1geg6r1.c crash artifact.\n\nProgress endpoints and objdiff.json regenerated so CI stays green.\n\nGate\n\n  decomp_lint          0 errors (4 warnings)\n  verify               13100 scanned, no rows outside MATCH/ASM\n  census vs wave 66    0 missing, 0 added, 0 regressed\n  nd_audit             133 preserved bodies, 0 drift\n  tests                554 passed\n  progress-validate    OK\n  build                170 eligible C objects\n                       loadable image 3d1d3d2b9d6ccb60836db239ab49674223025a78\n                       SLUS_217.82    4eeec0360cf2715535d9f7e52eb69d786fb0158c","measures":{"fuzzy_match_percent":21.260838,"total_code":4353892,"matched_code":920684,"matched_code_percent":21.146229,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13100,"matched_functions":6471,"matched_functions_percent":49.396946,"complete_code":925676,"complete_code_percent":21.260885,"complete_data":0,"complete_data_percent":100,"total_units":13100,"complete_units":6487}},{"timestamp":"2026-08-09T22:41:29Z","commit_sha":"8f659f0297eaffadb9194641bbf364077c6e9736","commit_message":"P4: remove 17 stray files that should never have been tracked\n\nRemoved\n\n  15 permuter/probe candidate dumps at the repository ROOT:\n  cand.json-style scratch written during matching probes, each holding a\n  single candidate C body as a JSON string. Referenced by nothing --\n  no tool, Makefile target, test, workflow, or document reads them.\n\n    cand_71f40.json     cands_38fc0.json    cands_8150.json\n    cand_88200.json     cands_47770.json    cands_8150b.json\n    cands.json          cands_47820.json    cands_8150c.json\n    cands_001dca60.json cands_47dd0.json    cands_8150d.json\n    cands_13e30.json    cands_47f60.json\n                        cands_48d80.json\n\n  tools/addrtest.c -- a five-line scratch probe that declared two\n  externs to observe which addressing mode the compiler picked. Not a\n  tool, not referenced, not built by anything.\n\n  source/Persona4-Decompilation/build/WJ003d_probe_obj/\n  build_WJ003d_f480_probe.c.o -- a compiled object file committed under\n  a bogus nested path when a lane wrote a probe to an absolute-style\n  location instead of build/.\n\n  Tracked files: 11784 -> 11767.\n\nClosed the two gaps that let them in\n\n  There was no ignore rule for the root candidate dumps at all.\n\n  More seriously, the existing `/build/` rule has a LEADING SLASH, which\n  anchors it to the repository root only. The nested\n  source/Persona4-Decompilation/build/... object walked straight past it.\n  Now a build directory is ignored at any depth, and *.o outright.\n\n  Verified the new rules match nothing that is legitimately tracked: of\n  the 11767 remaining files, zero end in .o or sit under a build/\n  directory at any depth.\n\nVerification\n\n  554 tests pass and decomp_lint reports 0 errors after the removals, so\n  nothing depended on any of them.","measures":{"fuzzy_match_percent":20.825756,"total_code":4354368,"matched_code":902128,"matched_code_percent":20.717772,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13100,"matched_functions":6394,"matched_functions_percent":48.809162,"complete_code":906832,"complete_code_percent":20.8258,"complete_data":0,"complete_data_percent":100,"total_units":13100,"complete_units":6409}},{"timestamp":"2026-08-09T22:35:33Z","commit_sha":"1f1e002f7292baf3c8b09a96752b0d42c392bdae","commit_message":"P4: fix CI, plus wave WL — +105 matched functions (5686 -> 5791, 58.6% -> 59.7%)\n\nCI fix\n\n  `progress-validate` has been failing on every push. progress/metrics.json\n  recorded total 13083, the canonical function count at the time the\n  snapshot was last generated. The map has grown since -- promotion and\n  eleven registered hidden functions -- and tools/progress.py rejects a\n  metrics endpoint whose total disagrees with the map, so the job failed\n  on a stale artifact rather than on anything wrong with the tree.\n\n  Regenerated the endpoints from a fresh verifier report and a linked\n  report off a byte-exact build.  objdiff.json had frozen at the same\n  13083 and is regenerated too; that one only produced a warning, but it\n  was the same staleness.\n\n  All free-check steps now pass locally: compileall, 554 tests, config\n  JSON/YAML, progress-validate, ci.yml, and objdiff validation with no\n  stale-unit or missing-category warnings.\n\nWave WL\n\n  Sixteen parallel lanes.\n\n  first-party MATCH 5686 -> 5791, ASM 4013 -> 3910\n  canonical map 13098 -> 13100\n\n  code1_001f   96 -> 115  (+19)\n  code1_001e   45 ->  64  (+19)\n  code1_001c   26 ->  35   (+9)\n  code1_0022/0021/0029     (+8)\n  code1_0018/002e          (+8)\n  code1_0026               (+7)\n  code1_0014/0012/0015/0016 (+5)\n  code1_0033/0036          (+4)\n  code1_003c   85 ->  88   (+4)\n  code1_003d/003e          (+4)\n  code1_0025/0031          (+4)\n  code1_0039/001b          (+3)\n  mdlEffect                (+3)\n  code1_003b               (+2)\n  code1_004a               (+2)\n  k_clump                  (+1)\n\nTwo hidden siblings registered\n\n  0x003E87B0 and 0x003C54C0.  Both are substantial functions with their\n  own prologue and epilogue sharing a window with a preceding 32-byte\n  tail-jump stub, and both are referenced only by a lui/addiu %hi/%lo\n  pair whose halves are NOT adjacent -- which is why the automated sweep\n  reported them unreferenced, since it only pairs a lui with an addiu\n  within four instructions.  003E87B0 is materialised by lui $v1,0x3f at\n  003E8CA0 and addiu two words later; 003C54C0 by lui $a3,0x3c at\n  003CA460 and addiu six instructions later, straddling a jal, and is\n  passed as that call's fourth argument.  All four halves then closed.\n\n  Both are declared in EPILOGUE_SEPARATED_ENTRIES.  The test that\n  re-checks that evidence against the retail image only accepted a\n  `jr $ra` at exactly address-8; it now walks back over inter-function\n  zero padding, within a bounded window, and accepts any register jump\n  with a nop delay slot.  A tail-jump stub ends `lw $v0,..; jr $v0; nop`\n  and terminates its function just as definitively as a return.\n\nMarker auditing changed\n\n  Three markers were silently swallowed by over-broad probe reverts this\n  wave -- 003E8310, 001EC4A0 and 001F14F0 -- and every lane's own audit\n  passed while they were missing.  A file-scoped marker audit cannot\n  detect a deletion: the function stops being scanned, so the marker\n  count and the verify row count shrink together and stay consistent.\n\n  Lanes now diff the marker ADDRESS SET against the previous commit\n  instead.  All three were caught and restored that way, and a tree-wide\n  external audit over 466 files confirms no lost or duplicated markers.\n\nNotes\n\n  func_004ae2f0 keeps literal $gp displacements inside its COP2 blocks\n  rather than a relocation against fGpffff81f4, and now carries a comment\n  saying why.  With no GPREL16 the verifier does not mask the immediate,\n  so it is compared directly against retail and proven equal; both\n  symbolic spellings were tried and one fails to assemble while the other\n  regresses the function to nd 4.\n\n  A \"call-argument materialisation floor\" note on k_clump func_00462eb0,\n  written after seven earlier probes, was wrong: it closes at nd 0 with a\n  measured opt_propagation bracket.\n\nGate\n\n  decomp_lint          0 errors (4 warnings)\n  verify               13100 scanned, no rows outside MATCH/ASM\n  census vs wave 65    0 missing, 0 regressed, 2 added\n  nd_audit             127 preserved bodies, 0 drift\n  tests                554 passed\n  build                170 eligible C objects\n                       loadable image 3d1d3d2b9d6ccb60836db239ab49674223025a78\n                       SLUS_217.82    4eeec0360cf2715535d9f7e52eb69d786fb0158c","measures":{"fuzzy_match_percent":20.825756,"total_code":4354368,"matched_code":902128,"matched_code_percent":20.717772,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13100,"matched_functions":6394,"matched_functions_percent":48.809162,"complete_code":906832,"complete_code_percent":20.8258,"complete_data":0,"complete_data_percent":100,"total_units":13100,"complete_units":6409}},{"timestamp":"2026-08-08T15:11:28Z","commit_sha":"d059bc0db5fcb024c61cda6a336ec7a3486a9b30","commit_message":"Sixth parallel wave: +19 matches, family reconstruction and a settled donor question\n\nFirst-party MATCH 4011 -> 4030 of 4798 (83.6% -> 84.0%); ASM 787 -> 768.\nWhole-tree census against the previous checkpoint: 5538 scanned both sides,\nzero missing, added, regressed or non-MATCH/ASM rows.\n\nThe previous wave exhausted the parked near-miss backlog, so this one attacked\nthe files with many BARE functions, working each as a family: census by retail\nwindow size and shared callees, solve the smallest member of the largest\ncluster, then port by substituting tables, offsets and constants.\n\nFamilies closed\n---------------\nnLine extrema scanners: func_0034d070, func_0034d280, func_0034d490 and\nfunc_0034d690, the complete four-member family, 13 -> 17 of 28. Each needs\nTHREE independent loop index variables, one per scan -- a single shared index\nscores nd 53 -- plus the exact s16 table access and a scoped\nopt_loop_invariants bracket.\n\nmdlMatAnim four-table walkers: func_0047fbf0, func_0047fe90 and func_0047fd10,\n10 -> 13 of 15. All three fell to delaying the reusable entry-pointer\nassignment until after the init call, moving its live-range start to retail's\npoint, plus an interleaved callback prototype.\n\nAlso closed: btlAICommand func_001e26c0 and func_001e2a80 (live-range reuse plus\nopt_rebuildconditionals off), datCalc func_002340c0 at 1900 of 1904 bytes,\nmt_sceneIcon func_0026d890 completing that file, y_draw func_002b6c30,\ny_fclCombineDraw func_00330e50 and func_00320970, itfMsgProcedure_Window\nfunc_0027d3c0, shdPersona func_0011caf0, cmpConfig func_0035ddf0,\nbtlShuffleCalc func_00371f40, eff_afpack func_004b6e80.\n\nThe interleaved-parameter lever\n-------------------------------\nConfirmed repeatedly and now the single highest-yield source shape in this\ncampaign. On the EE ABI float and integer parameters draw from INDEPENDENT\nregister banks, so reordering across classes -- while preserving relative order\nWITHIN each class -- leaves every parameter in the register it already had and\nchanges only the ORDER in which b210 materialises the arguments. A prototype\nthat groups mixed parameters by class is a defect, not a style choice. It closed\nfunc_00330e50, func_0027d3c0, func_00371f40 and func_0047fd10 this wave on top\nof four last wave. Per-TU declarations are normal here; func_0025ecd0 now has\ntwelve distinct declarations, each ordered for its own call sites.\n\nThe P3FES donor question, settled\n---------------------------------\nA repo-wide structural census paired all 787 remaining P4 functions against the\n219 verified-matching files of the sibling Persona 3 FES decompilation, matching\non window size, opcode histogram, ordered call sequence and control-flow shape\nrather than names. Result: ZERO exact portable twins. All twelve exact\nall-donor hits are asm_function, banned_asm or vu0_asm with no usable C. No\nwhole-file correspondence despite 22 basename overlaps. The single credible\nsource-level near-twin in the entire tree is datCalc func_00232b40. Report at\nbuild/W8_donor_report.md. This line of attack has been proposed in three\nseparate waves and is now closed.\n\nSymbols\n-------\nTwo data symbols registered with retail evidence and recovered:\nD_00635938 (error-message table, from func_002340c0's lui/addiu pair) and\niGpffffb440 = 0x00764530 (from func_0032c480's gp-relative load).\ntools/recover_symbols.py emitted 3831 with zero segment failures.\n\nHygiene\n-------\nRemoved src/tmpumhy16b9.c, a compiler temp file that a probe left inside src/,\nand four .W7.orig lane backups plus src/cmmCommunity.c.bak_check from earlier\nwaves. Corrected a drifted nd note on y_list func_002e4960 (body measured 16,\nnote claimed 19). Repaired src/promoted/k_fldUnit.c after a probe restore\ncomputed its end boundary wrongly and silently discarded 125 lines and nine\nfunctions -- caught by a raw marker-count check, which is more reliable than\nbyte length because edits legitimately change length. Several lanes reverted\nguarded parks whose nd exceeded the parking threshold back to plain\nINCLUDE_ASM, archiving the bodies under build/ with their recipes, register\nmaps and ruled-out lists.\n\nVerification\n------------\ndecomp_lint: 320 first-party files, 0 findings.\ntools/verify.py: 4798 first-party scanned, MATCH 4030, ASM 768.\nCensus vs previous checkpoint: no missing, added, regressed or bad rows.\ntools/nd_audit.py: 100 preserved bodies, 0 drift.\npython -m unittest discover -s tests: 554 tests OK.\ntools/build.py: 158 C objects linked; loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78 OK; SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c OK.","measures":{"fuzzy_match_percent":16.451084,"total_code":4363204,"matched_code":713480,"matched_code_percent":16.352203,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4634,"matched_functions_percent":35.42001,"complete_code":717796,"complete_code_percent":16.451122,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4648}},{"timestamp":"2026-08-08T13:05:13Z","commit_sha":"38fd5d34a0addcbb5b4968e2c5122a2efaf22bc4","commit_message":"Fifth parallel wave: +56 matches by attacking the parked near-miss backlog\n\nFirst-party MATCH 3955 -> 4011 of 4798 (82.4% -> 83.6%); ASM 843 -> 787.\nWhole-tree census against the previous checkpoint: 5538 scanned both sides,\nzero missing, added, regressed or non-MATCH/ASM rows.\n\nThis wave changed target selection. Rather than reconstructing bare functions,\nit went after the 183 bodies already PARKED behind #ifdef NON_MATCHING -- 66 of\nwhich sat at nd 10 or below. Each was a complete, structurally correct body a\nhandful of instructions from byte-exact, so the work was diagnosis rather than\nreverse engineering. 16 lanes ran concurrently over the whole tree.\n\nFamilies that fell whole\n------------------------\ny_CmbCardEff 0x84-stride card state machines: func_003407f0, func_00341640,\nfunc_003427a0, func_00343cf0 join the previously matched func_0033fc80 -- five\nmembers, ~23KB of retail code, 23 -> 27 of 35. func_0033fc80 itself went from\nnd 423 to byte-exact on a single prototype reorder.\n\ncmmMisc masked-counter table walkers: func_00247270, func_002474f0,\nfunc_00248240, func_00248a60, func_00248b80, plus func_002485e0 recovered\nfrom collateral damage -- 40 -> 45 of 57. func_00247270 had beaten three prior\nreconstruction attempts.\n\nevtLoadSave record marshalling: func_002951c0, func_00295b80, func_00294610,\n3 -> 6 of 9. effBlurFilter: all four remaining targets, 44 -> 48 of 53.\n\nLevers established\n------------------\nInterleaved parameter order. On the EE ABI float and integer parameters draw\nfrom INDEPENDENT register banks, so moving f32 parameters ahead of integers\nwhile preserving relative order within each class changes argument\nmaterialisation ORDER without changing any register assignment. A prototype\nthat groups mixed parameters by class is a defect, not a style choice. This one\nchange took func_0033fc80 from nd 423 to zero and was then reused successfully\non k_fldLmap func_00188590, btlShuffleDraw func_00374730 and shdSkill\nfunc_00114e50.\n\nCallee prototype defects generally -- a missing argument, a wrong width, a\nnarrow return -- closed roughly a dozen functions. A narrow type on a RETURN\nmasks or sign-extends at the point of capture; a narrow type on a PARAMETER\ntruncates at argument setup. When candidate and retail disagree about an andi\nor a dsll32/dsra32 pair, the question is which declaration carries the narrow\ntype, never what the body does.\n\nSeparate result variable. Where a loop's walking pointer is also the returned\nvalue, b210 merges control flow retail keeps split. Walking p, assigning a\ndistinct r on every exit path and jumping to one shared label with a single\nreturn closed mdlManager func_00478140 and func_0047ac90, frFont func_00273f70\n(nd 113 -> 0) and code1_003c func_003cf9b0.\n\nAddress-taken live-range pinning. Where retail groups all loads then all stores\nand b210 interleaves them, assigning each local's ADDRESS to a named pointer\nbefore its load pins the live range so no load can sink past a store. This\nshape had been written off as a scheduling floor; it closed three evtLoadSave\nfunctions.\n\nLeaving a value unnamed so b210 computes it directly into its consumer's\nregister, and its converse -- assigning in place with |= rather than into a\nfresh temp -- account for a large share of the remaining register residuals.\n\nBuild fix caught by the sha1 gate\n---------------------------------\nsdkPrimitive func_0045db40 and func_0045e6a0 referenced D_00887310[4] where\nretail references D_00887310 itself. verify.py masks relocation immediates, so\nboth scored MATCH at nd 0, but the linker resolved the +0x10 addend to\n0x00887320 and the image diverged at vram 0x45dc94. Corrected to index [0].\nThis is a real blind spot: a wrong relocation ADDEND is invisible to per-object\nverification and only the linked-image sha1 catches it.\n\nTooling\n-------\ntry_bodies.py, knob_sweep.py and draft_probe.py wrote their verify reports to\nfixed paths (build/try_bodies.json and friends). With 16 concurrent lanes, two\noverlapping probes meant one lane read another's report and attributed an\nunrelated function's score to its own candidate -- this produced a phantom nd 4\nthat was caught only because a lane went back to the transcript. All three now\nwrite per-function, per-process paths. try_parked.py, park_probe.py and\ntry_bare.py were already safe.\n\nAlso removed src/cmmCommunity.c.bak_check, a stray backup committed by an\nearlier wave, and four .W7.orig lane backups that had been written into src/.\n\nVerification\n------------\ndecomp_lint: 320 first-party files, 0 findings.\ntools/verify.py: 4798 first-party scanned, MATCH 4011, ASM 787.\nCensus vs previous checkpoint: no missing, added, regressed or bad rows.\ntools/nd_audit.py: 110 preserved bodies, 0 drift.\npython -m unittest discover -s tests: 554 tests OK.\ntools/build.py: 158 C objects linked; loadable image sha1\n3d1d3d2b9d6ccb60836db239ab49674223025a78 OK; SLUS_217.82 sha1\n4eeec0360cf2715535d9f7e52eb69d786fb0158c OK.","measures":{"fuzzy_match_percent":16.237783,"total_code":4363344,"matched_code":704196,"matched_code_percent":16.138906,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4615,"matched_functions_percent":35.274784,"complete_code":708512,"complete_code_percent":16.237822,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4629}},{"timestamp":"2026-08-08T09:49:15Z","commit_sha":"c5486e8ecf881d5a8cc5957522a5af61433fd72f","commit_message":"Fourth parallel wave: +9 matches, family maps for every remaining hot file\n\nfirst-party MATCH 3946 -> 3955 of 4798 (82.2% -> 82.4%), ASM 852 -> 843.\n\nSixteen lanes, each told to survey its file for TEMPLATE FAMILIES before writing\nany C. New byte-exact functions:\n\n  datCalc          func_00231f80 func_00232290   (784-byte exact twins)\n  code1_003d       func_003ddc20 func_003ddf20\n  code1_003c       func_003c3f20\n  y_fclCombineDraw func_00315310\n  frFont           func_002736d0\n  datPersona       func_0010c9e0\n  evtMain          func_0028a560\n\nEight new parked near-misses, including mdlManager func_00478140 nd 1 and\nfunc_0047ac90 nd 1, btlShuffleDraw func_00374730 nd 12, shdPersona\nfunc_001171c0 nd 6, and three code1_003c bodies improved from nd 12 to nd 6.\n\nA NEW SOURCE, and it produced its first match. A sibling Persona 3 FES\ndecompilation sits at source/Persona3-FES-Decompilation with 219 files of\nverified byte-exact code. datPersona func_0010c9e0 was matched by PORTING the\ndonor's implementation of the same routine rather than reconstructing it -\nnd 0 at object 232 of a 240-byte window, needing only a loop-invariant pragma.\nSeven lanes then ran structural fingerprint censuses against the donor\n(24,201 functions in one case) and found no further exact twins in their files,\nwhich is itself worth knowing: shdPersona, y_fclCombine, y_fclShopDraw,\ncmmRankUp, y_CmbCardEff, k_fldUnit, nLine and the battle files are P4-specific.\nThe donor is worth checking per function, not per file.\n\nThe FAMILY MAPS are the wave's main deliverable and are now recorded in the\nlane reports and in file notes. The largest untouched groups:\n\n  y_CmbCardEff  six 0x84-stride card state machines, 2928-8768 bytes\n  cmmMisc       six masked-counter table walkers plus one relative\n  frFont        eight parser/update functions, one saved-register defect\n  y_fclShopDraw seven contiguous-RGBA aggregate draws (the eighth is matched)\n  datCalc       seven repetitive table/stat scans, plus three solved pairs\n  y_list        four two-member groups\n  code1_0043    a three-member func_004258b0 wrapper family\n\nTwo levers were re-confirmed and one refined: the exact-twin port (write one\nmember, substitute constants and offsets - datCalc's 784-byte pair), and\ndeclaration order plus -O1 plus a forward guard, which took frFont func_002736d0\nfrom nd 36 to nd 0.\n\nRepairs made while integrating:\n\n  * src/promoted/code1_003e.c func_003e2570 and func_003e46e0 had been made\n    byte-exact with `*(volatile s32 *)` on ordinary global data to force a\n    store/reload. That is lint H001 and the exact compiler-steering this repo\n    forbids. Both reverted to bare INCLUDE_ASM; the honest non-volatile\n    reconstruction measures nd 31 at object 120 of 128 and that is recorded.\n    Two matches deliberately given up.\n  * src/Event/Fcl/y_fclShopDraw.c was destroyed mid-wave by a bad splice -\n    17 of 38 markers gone, 8 NO_SYMBOL rows, the file down to 1451 lines and\n    the previously earned func_002caef0 match lost. Restored byte-for-byte from\n    the last commit (49775 bytes, 1200 CRLF) and re-verified at 38 scanned /\n    20 MATCH / 18 ASM / 0 NO_SYMBOL.\n  * src/Main/Battle/Data/datPersona.c closed a pragma scope with\n    `#pragma opt_loop_invariants reset`, which the pragma audit does not pair\n    with `on`; changed to `off`, match unaffected.\n  * src/cmmMisc.c had an orphaned `#pragma opt_common_subs off` left behind by\n    a probe.\n\nData symbols registered with retail-instruction evidence, then\ntools/recover_symbols.py re-run: D_008873D0, iGpffffb754 (both load-bearing for\nthe code1_003d matches), D_008BD9C0 and D_008BDAC0.\n\nGate: verify.py census vs p4_wave50.json - 5538 scanned, no missing, no\nregressed, no non-MATCH/ASM rows; decomp_lint 320 files 0 findings; nd_audit\n148 preserved bodies 0 drift; 554 unit tests OK; build.py 158 C objects,\nloadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78 OK, SLUS_217.82\nsha1 4eeec0360cf2715535d9f7e52eb69d786fb0158c OK.","measures":{"fuzzy_match_percent":15.233231,"total_code":4363712,"matched_code":660420,"matched_code_percent":15.134363,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4559,"matched_functions_percent":34.84675,"complete_code":664736,"complete_code_percent":15.23327,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4573}},{"timestamp":"2026-08-08T08:08:51Z","commit_sha":"be2e0947c632451d6071ed89ef85151db15c54ea","commit_message":"Third parallel wave: +20 matches, the code1_0039 slot-search family falls\n\nfirst-party MATCH 3926 -> 3946 of 4798 (81.8% -> 82.2%), ASM 872 -> 852.\n\nSixteen lanes over thirty-two files. The headline is src/promoted/code1_0039.c:\nits fifteen-function slot-search family - every member walking a 64-byte-strided\ntable through the gp-relative pointer at gp-0x4A20, scanning two entries for a\ntype code at offset 0x20 - had been parked at nd 18 to 56 for four sessions.\nThe whole family is now byte-exact. That file went 23 MATCH / 21 ASM to\n39 MATCH / 5 ASM in one pass:\n\n  func_00399fd0 func_0039a030 func_0039a090 func_0039a0f0 func_0039a200\n  func_0039a260 func_0039a2e0 func_0039a340 func_0039a3a0 func_0039a400\n  func_0039a460 func_0039a630 func_0039a690 func_0039a700 func_0039a760\n  func_0039b680\n\nAlso matched: k_fldEvent func_00172ba0, y_fclCombineDraw func_0031e320,\neffModel func_004abe80 and func_004ac640.\n\nNineteen new parked near-misses across the wave, including cmpPartyPanel\nfunc_00363080 nd 2, k_field func_00155bf0 nd 2, k_fldAI func_0017ea10 nd 6,\nmdlSE func_0047e450 nd 7, code1_0048 func_00484b30 nd 6, sdkSpr func_0046d5f0\nnd 9, btlShuffleSeqShuffle4 func_0037d840 nd 2, btlPanelAnalyze func_00218ea0\nnd 19, eff_afpack func_004b6e80 nd 24 and mdlMatAnim func_0047fbf0 nd 17.\n\nThree ABI corrections found by reading retail rather than trusting a\ndeclaration: shdPersona func_001171c0's fifth parameter is a packed s32 value,\nnot `s32 *`; effPolygonTrack func_00486a50 returns `void *` from an `s32`;\ny_fclCombineDraw func_0034ae50 takes the raw 64-bit argument.\n\nA NEW PARKING RULE, after one lane parked seven empty stubs: a park is only\nmeaningful when `object_size` is close to `window`. An 8-byte object against a\n1600-byte window scores nd 7 not because it is close but because a body that\ndoes nothing barely differs in the counted bytes. Those seven were reverted to\nbare markers. Both conditions are now required - nd <= ~25 AND object size\nwithin a few words of the window - and every measured nd must be reported with\nits object/window pair.\n\nRepairs made while integrating:\n\n  * src/promoted/code1_0039.c had fifteen REDUNDANT `#pragma schedule off`\n    opening pragmas - the file's baseline is already off, so each one paired\n    with nothing and left the file fifteen `off` deep (P001). Removed; codegen\n    unchanged, all 39 matches intact.\n  * src/promoted/shdPersona.c, src/cldDayChange.c and src/promoted/code1_0048.c\n    were rewritten from LF to CRLF, turning a handful of real edits into a\n    5826-line whole-file diff. Restored to their original LF endings; the wave\n    diff went from 5207 insertions to 1755.\n  * src/Graphics/Model/effModel.c gained two matches and then silently DROPPED\n    OUT of build.py's eligible-object set, taking all nineteen of its functions\n    with it - 158 linked C objects became 157. Cause: the new body references\n    D_007144B8, and build.py's `resolvable` set is the LCF definitions plus\n    config/symbol_addrs.txt plus source marker names. config/symbol_data_addrs.txt\n    is NOT in it, so an unregistered data symbol makes the whole translation\n    unit unplaceable while verify.py still scores every function MATCH. Nothing\n    in a scoped verify shows this. Registered D_007144B8 with evidence and re-ran\n    tools/recover_symbols.py; 158 restored. This failure mode is now documented\n    in build/LANE_BRIEF.md.\n  * Two parked notes whose `Committed at nd N.` disagreed with the committed\n    body: code1_0043 func_004390c8 (76 -> 84) and scrScriptProcess func_0029d1c0\n    (10 -> 30, its fallback arm having been corrected to INCLUDE_ASM).\n\nGate: verify.py census vs p4_wave49.json - 5538 scanned, no missing, no\nregressed, no non-MATCH/ASM rows; decomp_lint 320 files 0 findings; nd_audit\n147 preserved bodies 0 drift; 554 unit tests OK; build.py 158 C objects,\nloadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78 OK, SLUS_217.82\nsha1 4eeec0360cf2715535d9f7e52eb69d786fb0158c OK.","measures":{"fuzzy_match_percent":15.149466,"total_code":4363760,"matched_code":656772,"matched_code_percent":15.050599,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4550,"matched_functions_percent":34.777958,"complete_code":661088,"complete_code_percent":15.149504,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4564}},{"timestamp":"2026-08-08T04:50:22Z","commit_sha":"22768f604374c60a052d66ad75e2bc1993e5a097","commit_message":"Second parallel wave: +8 matches, the aggregate-copy lever, 17 new parks\n\nfirst-party MATCH 3918 -> 3926 of 4798 (81.7% -> 81.8%), ASM 880 -> 872.\n\nSixteen lanes over twenty-two previously untouched files, several of which had\nbeen written off in earlier sessions. New byte-exact functions:\n\n  g_data          func_00106620 func_0010ffa0\n  code1_0017      func_0017c930\n  y_fclShopDraw   func_002caef0\n  btlShuffleSeq   func_00378f90\n  btlShuffleResult func_00382ba0 func_00383720\n  sdkSnd          func_0045b030\n\nThe headline result is a new lever rather than the match count.\n\nAGGREGATE COPY. When retail emits a GROUP of loads followed by a GROUP of\nstores - especially when the stores go to a stack slot that is then partially\nreloaded - that is not scheduling and not a load-sinking floor. It is a struct\nassignment. b210 never schedules field-by-field assignments that way; field by\nfield gives interleaved load/store pairs and no stack round trip. Retail\n`asm/nonmatchings/evtLoadSave/func_002954f0.s` shows the canonical form: four\n`lh` from the source, four `sh` into an 8-byte stack temporary, three `lh`\nback out, four `sh` to the destination. The source is\n\n    struct S4 { s16 a; s16 b; s16 c; s16 d; };\n    struct S4 tmp = *(struct S4 *)(src + 0xC);\n    *(struct S4 *)(dst + 8) = tmp;\n\nwith the NAMED intermediate as the load-bearing part. y_fclShopDraw\nfunc_002caef0 - 1968 bytes - went straight to byte-exact when five groups of\nfield-by-field RGBA stores became five `*(RGBA *)(t + 0x79) = cN;`.\n\nThe corollary matters as much: reconstruct an aggregate's MEMBER LIST from the\nretail transfer widths. Every `lwc1`/`swc1` pair is an `f32` member, every\n`lw`/`sw` an `s32`, and every `ld`/`sd` is two adjacent 4-byte members that\nb210 PAIRED - not a single 8-byte member. Declaring an `s64` where retail\nmerely paired two words raises the struct's alignment to 8, rounds 12 bytes up\nto 16, and turns a 4-byte `lwc1` tail into an 8-byte `sd`.\n\nTwo more levers confirmed:\n  * `if (value > 0x63)` and `if (value >= 0x64)` are not interchangeable;\n    the first emits retail's `slti $at` + `bnez`. That one word was the whole\n    residual on g_data func_00106620.\n  * Saved-register assignment follows LIVE RANGE START, with declaration order\n    only as a tiebreaker. When reversing the declaration list does not move a\n    pair, move the first ASSIGNMENT of the value retail keeps in the lower\n    register earlier instead.\n\nSeventeen new parked near-misses, all guarded with measured notes:\nbtlShuffleSeq func_00379090 nd 4, datCalc func_00232b40 nd 3,\nbtlShuffleCalc func_00371f40 nd 6, sdkChkmem func_0044ee70 nd 6 and\nfunc_0044f3a0 nd 6, sdkCdvd func_00455ea0 nd 11, sdkSnd func_0045aac0 nd 12\nand func_0045aeb0 nd 9, btlEPL func_001fff40 nd 8, sdkPrimitive func_0045db40\nnd 21 and func_0045e6a0 nd 21, k_fldLmap func_00188590 nd 24 and\nfunc_00189060 nd 15, effPolygonRing func_00499a30 nd 7, effParticle\nfunc_00487c30 nd 27, and evtLoadSave func_00294610 nd 19, func_002951c0 nd 18,\nfunc_002954f0 nd 20, func_00295b80 nd 18.\n\nVU0 VERDICT. The two effect functions reconstructed with real VU0/COP2 inline\nasm reached nd 6 and nd 27 with the VU blocks themselves exact; both residuals\nare ordinary saved-register allocation. So VU0 is not a barrier - the inline\nasm reproduces retail - and the VU0-heavy effect files are worth further\npasses.\n\nRepairs made while integrating:\n  * `src/g_data/g_data.c` had `#pragma alias func_00106850_raw func_00106850`\n    plus an `extern u32 func_00106850_raw(s32)`. MWCC does not implement\n    `#pragma alias`, so the alias was inert and the object carried a call to an\n    undefined symbol; verify.py's relocation masking scored it MATCH anyway.\n    The real signature, confirmed against the m2c oracle in\n    `src/generated/code1_0010.c`, is that func_00106850 takes the raw 32-bit id\n    and narrows it itself. Both functions still match with the honest\n    declaration. The repo's own pragma-audit test caught this.\n  * `src/promoted/effPolygonRing.c` func_00499a30's note claimed a probe-run\n    nd 6 where the committed body measures 7.\n\nGate: verify.py census vs p4_wave48.json - 5538 scanned, no missing, no\nregressed, no non-MATCH/ASM rows; decomp_lint 320 files 0 findings; nd_audit\n149 preserved bodies 0 drift; 554 unit tests OK; build.py 158 C objects,\nloadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78 OK, SLUS_217.82\nsha1 4eeec0360cf2715535d9f7e52eb69d786fb0158c OK.","measures":{"fuzzy_match_percent":15.066049,"total_code":4363920,"matched_code":653156,"matched_code_percent":14.967185,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4530,"matched_functions_percent":34.625088,"complete_code":657472,"complete_code_percent":15.066088,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4544}},{"timestamp":"2026-08-08T02:29:05Z","commit_sha":"445c441532d818b29d31b7c912589cc19a9b8ee3","commit_message":"Parallel wave: +32 first-party matches, and three policy corrections\n\nfirst-party MATCH 3886 -> 3918 of 4798 (81.0% -> 81.7%), ASM 912 -> 880.\n\nTwenty-six lanes over twenty-nine files. New byte-exact functions:\n\n  cmmCommunity   func_001080c0 func_00108290 func_001087e0 func_00108ef0\n  code1_0039     func_003982e0 func_00398540 func_00399b80 func_0039ae30\n                 func_0039b450 func_0039b4b0 func_0039b6e0\n  code1_003c     func_003c9530 func_003c96d0 func_003ca8e0 func_003ca960\n                 func_003ca9d0\n  code1_003d     func_003d4bf0 func_003dd7d0\n  code1_003e     func_003e1db0\n  cmmScript      func_0024a710\n  datPersona     func_0010cad0\n  y_smap         func_002b1260 func_002b1320\n  y_draw         func_002b7750\n  itfMesManager  func_00279a80\n  mc             func_002a9f50\n  btlShuffleDraw func_00375a70\n  y_fclCombine   func_00304410\n  cmpPersona     func_001375f0\n  effLineNova    func_004b32f0\n  shdSkill       func_00114dc0 func_00115420\n\ncmmCommunity is now 36 of 39; it was 21 at the start of the previous session.\n\nSix levers were measured this wave and are now documented in\nbuild/LANE_BRIEF.md and the p4-mwccps2-declaration-levers skill:\n\n 1. Reuse one C local where retail reuses one saved register - including\n    copying a parameter into a local and reusing that local later. Four\n    spellings with a separate variable scored nd 72; reuse scored nd 11, and\n    on func_00108290 the same idea deleted a whole saved register and went\n    nd 553 -> 17.\n 2. b210 assigns saved registers in REVERSE declaration order. Reversing the\n    declaration list turned two functions byte-exact on its own.\n 3. Guard polarity: `if (a < b) return 0; return 1;` gives slt $at + beqz,\n    `if (a >= b) return 1; return 0;` gives slt $v0 + bnez, and a ternary\n    matches neither.\n 4. `#pragma optimization_level 1` bracketed around one function, when the\n    object is a few words short because b210 folded something retail kept.\n    nd 162 -> 17 on one function, byte-exact on two others.\n 5. A named pointer temp pins evaluation order; a GP base hoisted into\n    `u8 *base` plus an integer-domain add reproduces retail's addu order.\n 6. A named boolean local forces retail's `sltu $v0,$zero,$v0`; keeping a\n    constant displacement OUT of a pointer temp lets it fold into the load.\n\nThree corrections to standing policy, all verified against the tooling:\n\n  * VU0/COP2 inline asm is ALLOWED. decomp_lint H009 reads \"inline asm\n    emitting ordinary instructions (not syscall/privileged/COP2/VU0)\", and\n    six first-party files already use it and match. Ordinary-instruction asm\n    stays banned.\n  * COP1 FPU multiply-accumulate is NOT a floor. adda.s/madd.s is just how\n    b210 lowers single-precision `a + b*c`; retail func_004b3470 proves it.\n    Functions were being skipped on sight of madd.s. y_fclCombineDraw's\n    func_0032b770 came in at nd 21 in ordinary C once that was retracted.\n  * A `measured: ... nd N` note above a BARE INCLUDE_ASM marker describes a\n    body that was discarded; only guarded bodies still exist. Several such\n    notes were disproved and rewritten this wave.\n\nTooling:\n  * tools/park_probe.py gains o1/o3/o1_sched/o1_nobl wrappers, closing-pragma\n    `measured` waivers on every wrapper, and a FIX: --apply used to drop the\n    `#ifdef NON_MATCHING` guard entirely and leave a non-retail body compiling\n    into the object. It now re-wraps the guard with the pragmas inside the\n    dead arm. Three bodies damaged by the old behaviour were re-guarded.\n  * tools/try_bare.py takes a per-pid report path and tolerates a missing\n    report instead of crashing the batch.\n  * tools/verify.py: scan_markers no longer aborts when a source vanishes\n    mid-walk, which concurrent lanes were causing.\n  * src/Graphics/Model/mdlManager.c had `INCLUDE_ASM(..., func_00474BA0)` with\n    the symbol in upper case; the object symbol is lower case.\n  * An orphaned `#pragma opt_loop_invariants off` in mdlManager.c that closed\n    a probe scope no longer present (P001).\n  * src/promoted/nLine.c's parked func_0034bea0 body could not compile when\n    unguarded because it calls func_0034c120 above its definition; a\n    guarded-only prototype makes it measurable by nd_audit again.\n\nNotes re-measured and corrected: code1_0039 func_00399fd0 and func_0039a200\n(opt_loop_invariants takes them 36 -> 18), itfMesManager func_00278d50\n(schedule on + opt_common_subs off, 58 -> 43), six code1_0041 bodies whose\nnotes quoted wrapper-assisted numbers the committed body did not carry, and\ncmmScript func_0024c0e0 whose note quoted fndiff's differing-word count as if\nit were verify.py's normalized_diff.\n\nGate: verify.py census vs p4_wave47.json - 5538 scanned, no missing, no\nregressed, no non-MATCH/ASM rows; decomp_lint 320 files 0 findings; nd_audit\n132 preserved bodies 0 drift; 554 unit tests OK; build.py 158 C objects,\nloadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78 OK, SLUS_217.82\nsha1 4eeec0360cf2715535d9f7e52eb69d786fb0158c OK.","measures":{"fuzzy_match_percent":14.934315,"total_code":4363952,"matched_code":647412,"matched_code_percent":14.835451,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4522,"matched_functions_percent":34.56394,"complete_code":651728,"complete_code_percent":14.934354,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4536}},{"timestamp":"2026-08-07T23:32:55Z","commit_sha":"1ec07f4946ee991dc005e2e1f5273ef54ac3ea14","commit_message":"cmmCommunity: two more matches from the separate-result-pointer lever\n\nfunc_001075d0 and func_00108b60 now compile byte-exact. Both are members of\nthe 0010xxxx community-record family whose shared head walks D_00797410 in\n0x10-byte strides looking for a 16-bit id at offset 4. The residual on both\nwas the same one that unlocked the nine-function pass earlier in this file:\nretail's found-exit is a bne/b PAIR because the walking pointer and the\nreturned value are distinct values with distinct live ranges, while b210\nfolds the exit into one merged beq when a single pointer plays both roles.\nGiving the result its own local restores the pair; the two still coalesce\ninto one register so the frame is unchanged.\n\nfunc_00106f40 is parked at nd 7 with its measured note; the remaining\nresidual there is a single argument-materialisation transposition ahead of\nthe call, not a shape problem.\n\nThe prototype for func_00108b60 was widened from (s32, s16) to (s32, s32).\nThe s16 spelling forced a redundant seh on the caller side that retail does\nnot emit - the callee does its own masking.\n\nfirst-party MATCH 3884 -> 3886 of 4798 (81.0%), ASM 914 -> 912.\n\nGate: verify.py census vs p4_wave46.json - 5538 scanned, no missing, no\nregressed, no non-MATCH/ASM rows; decomp_lint 320 files 0 findings;\nnd_audit 103 preserved bodies 0 drift; 554 unit tests OK; build.py 158 C\nobjects, loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78 OK,\nSLUS_217.82 sha1 4eeec0360cf2715535d9f7e52eb69d786fb0158c OK.","measures":{"fuzzy_match_percent":14.759096,"total_code":4364104,"matched_code":639788,"matched_code_percent":14.660237,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4490,"matched_functions_percent":34.319347,"complete_code":644104,"complete_code_percent":14.759135,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4504}},{"timestamp":"2026-08-07T18:10:42Z","commit_sha":"da7e9671df26eb9666f2728ad8093073269efde4","commit_message":"Add tools/try_parked.py; close out the identical-nd cluster hunt\n\n`try_bare.py` only handles a bare `INCLUDE_ASM` line, so every attempt to\nimprove an already-parked body this session was hand-rolled. `try_parked.py`\ndoes it properly: it replaces the whole guarded block, scores each candidate,\nand always restores the file unless `--apply` names a label.\n\nIt also encodes the trap that cost me a false MATCH twice today. A body inside\n`#ifdef NON_MATCHING` is NOT what compiles - the `#else INCLUDE_ASM` arm is - so\na prober that keeps the guard while measuring reports every candidate as ASM at\nnd 0. The tool measures unguarded and only re-guards on `--apply`, with a\ncomment saying why.\n\nWith it, the remaining identical-nd clusters were worked to a conclusion:\n\n* code1_0043 (2 at nd 29). Retail materialises the flag's absolute address once\n  and reuses the %lo displacement for both the load and the clearing store.\n  A pointer local for the flag measures 57 and the plain array form 53, both\n  worse than the committed 29; the current goto shape stays.\n* code1_003b (2 at nd 37). Both need `movz`, which b210 will not emit from C.\n* code1_003d (2 at nd 8). Both need the three-operand `mult rd,rs,rt`.\n* code1_0048 (2 at nd 2) and code1_0051 (2 at nd 2) are register-coalescing\n  residuals of one and two words respectively.\n\nSo of the eight clusters the sweep found, one was a real shared defect worth\nnine matches, one was worth nd 44 -> 36, and the other six are genuinely blocked\non instructions b210 cannot generate or on one-word colouring. That is the\ncluster seam exhausted, and it is worth knowing rather than re-checking.\n\nverify: first-party MATCH 3884 of 4798 (81.0%) unchanged, no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 102 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.745844,"total_code":4364120,"matched_code":639212,"matched_code_percent":14.646985,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4488,"matched_functions_percent":34.304058,"complete_code":643528,"complete_code_percent":14.745882,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4502}},{"timestamp":"2026-08-07T17:55:21Z","commit_sha":"8ceb675d22da8357121f77ffbdc82ddccf327da0","commit_message":"Carry the result-pointer lever into code1_0039: nd 44 -> 36 on a three-function family\n\nFollow-up to the cmmCommunity result. Mining the park sweep for functions\nparked at IDENTICAL nd found eight more clusters; the largest is three\nfunctions in code1_0039 sitting at nd 44 with the same slot-search shape:\nretail's found-exit is a `bne`-to-advance plus `b`-to-shared-tail pair, and the\nloop's walking pointer is also the value the tail stores through.\n\nGiving the result its own pointer, distinct from the walking one, plus entering\nthe loop directly with a do/while, is worth nd 44 -> 36 on func_00399fd0 and\nfunc_0039a200. Not a match this time: what remains is the gp load and the\ncounter zero transposed, the commutative addu that forms the record address,\nthe compare constant materialising inside the loop rather than the preheader,\nand two unfilled delay slots - and `schedule on` fills the slots but shrinks the\nobject to 84 bytes against a 96-byte window (nd 44). Both re-parked with the\nmeasured figure.\n\nfunc_0039a2e0 is in the same cluster but regresses to nd 46 under the shape, so\nit was left at its committed body: near-identical retail listings do not\nguarantee identical source.\n\nAlso probed and refuted: the code1_0048 pair at nd 2 (retail scales the handler\nindex into $a2 where their two matching siblings use $a1). Hoisting the scaled\nindex into its own local, and hoisting the call argument, both leave it at nd 2.\n\nThe identical-nd cluster list is now a standing target list. After cmmCommunity\nthe remaining ones are code1_0039 (3 at 44, now 2 at 36), code1_0039 (2 at 42),\ncode1_003b (2 at 37), code1_003d (2 at 8), code1_0043 (2 at 29), code1_0048\n(2 at 2) and code1_0051 (2 at 2).\n\nOne repair on myself: splicing a body over a parked block with\n`park_probe.blocks` boundaries drops the `#else INCLUDE_ASM #endif` arm, which\nleaves the body live and the verifier reporting NONMATCHING rather than ASM.\nCaught by the census, both re-guarded before this commit.\n\nverify: first-party MATCH 3884 of 4798 (81.0%) unchanged, no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 102 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.745844,"total_code":4364120,"matched_code":639212,"matched_code_percent":14.646985,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4488,"matched_functions_percent":34.304058,"complete_code":643528,"complete_code_percent":14.745882,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4502}},{"timestamp":"2026-08-07T17:27:42Z","commit_sha":"152c1eab1281c980c0dc3810b0e0bd64c7ab3856","commit_message":"Nine matches at once: the community slot-search family falls to a result pointer\n\ncmmCommunity goes 21 -> 30 of 39. All nine functions that had been parked at\nexactly nd 38 are now byte-exact, and the fix is one line of shape.\n\nThese functions scan a 21-entry table for a matching id, then act on the entry.\nRetail emits the found-exit as a PAIR - `bne` to the advance block, then an\nunconditional `b` to the shared tail - and every previous attempt got a single\nmerged `beq` straight to the tail instead. Three sessions of notes had written\nthis off as a branch-shape floor after trying goto, break, switch, continue, the\nm2c verbatim form, and an in-loop return.\n\nThe missing ingredient is a SEPARATE RESULT POINTER. The loop walks `p`; each\nexit path assigns a distinct `r` and jumps to one shared label:\n\n    if (id == 0)                  { r = NULL; goto ret; }\n    ...\n    while (i < 0x15) {\n        if (*(u16 *)(p + 4) == id) { r = p; goto ret; }\n        p += 0x10; i++;\n    }\n    r = NULL;\nret:\n    return r != NULL;\n\nWith `p` itself carrying the result, b210 folds the found-exit into one branch.\nWith `r` distinct from `p` it emits retail's pair. `r` and `p` still coalesce\ninto one register, so no extra move appears. Measured on func_001077f0: the\ngoto/break/continue/two-label forms all sit at nd 44, an in-loop\n`return p != NULL;` reaches nd 46 with the branch pair present but a duplicated\nsltu, and the separate result pointer is byte-exact.\n\nApplying the same head to the eight siblings took all of them: func_001076e0,\nfunc_00107a00, func_00107ac0, func_00107bd0, func_00107ce0, func_00107dc0,\nfunc_00107f00, func_00107fe0. Two needed their flag constants corrected against\nretail while I was there (func_00107f00 sets bit 1 and clears bit 0, not the\nreverse; func_00107fe0 clears bit 1, not bit 0) - each was worth one or two\nwords and would have been invisible under the branch-shape residual.\n\nWorth remembering as a general lever: when several functions in one file are\nparked at the IDENTICAL nd, that is one shared defect, not N independent\nfloors, and it is the highest-value thing in the file.\n\nverify: first-party MATCH 3875 -> 3884 of 4798 (81.0%), no regressions, no lost\nmarkers, no MISMATCH. decomp_lint 0 findings, nd_audit 102 preserved bodies\n0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.745844,"total_code":4364120,"matched_code":639212,"matched_code_percent":14.646985,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4488,"matched_functions_percent":34.304058,"complete_code":643528,"complete_code_percent":14.745882,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4502}},{"timestamp":"2026-08-07T17:06:33Z","commit_sha":"370ece096c7e5d88c44eaab5b346c4e5b6568bbc","commit_message":"Two reconstructions parked in the 257-768 byte band; the band's shape is now clear\n\nFirst wave aimed squarely at the mid-size band (291 bare functions, 92 files).\nNo match, but two functions that had no body at all now have measured\nreconstructions, and one of them documents five levers stacking on a single\nfunction.\n\n**itfMesManager func_00279e90, parked at nd 15** (320-byte window). Built from\nscratch. Five things were each worth measurable ground: loading the halfword\ninto a saved register BEFORE the call, because retail keeps it live across;\nemitting the two func_00274570 calls SEPARATELY, one per branch, rather than\nmerging them after the join; having the else branch RE-READ the value from\nmemory instead of reusing the saved copy; a named local for the scaled offset in\nthe 0x8000 branch; and an index-first addOff helper for that branch's addu. The\nseven words left are the position of one argument load, which\n`opt_propagation off` makes worse.\n\n**nLine func_0034c6c0, parked at nd 13** (352). Body correct; the residual is\nthe prologue, where retail does the float moves before saving the second\nargument and b210 saves first. Capturing the argument into a local - the lever\nthat worked on cmpPersona - does not reorder it here.\n\nThe band is not like the small end. Every lane that reached a second function\nfound the first one was already documented: k_fldLmap's seven are one\nfloat-scheduling family (two reproduced their noted residual exactly, 27 words),\nbtlShuffleCalc's eight all carry floor notes, effBlurFilter's smallest two use\n`sqc2 $vf0` and are unreachable from C, y_fclShopDraw's nineteen are\nargument-scheduling floors. The mid-size band is mostly re-derivation of work\nalready done, not virgin territory.\n\nOne genuinely new finding, from the cmmCommunity lane: the nine sibling\nfunctions all measuring nd 38 share ONE residual - retail wants the loop's\nfound-exit as a `bne`-to-advance plus `b`-to-join pair, and b210 merges it to a\nsingle `beq`-to-join. The return-then form measures 30 and duplicates an sltu.\nCracking that shape would take nine functions at once; it is the highest-value\nsingle target left in the tree.\n\nRepair pass: effBlurFilter had been reformatted end to end (1502 insertions,\n1462 deletions) and btlShuffleCalc left with 31 COMPILE_ERRORs - both reverted\nwholesale. Two more unguarded bodies reverted (mdlManager func_00474ba0 nd 224,\ncmmCommunity func_001077f0 nd 38).\n\nverify: first-party MATCH 3875 of 4798 (80.8%) unchanged, no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 110 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.703887,"total_code":4364168,"matched_code":637388,"matched_code_percent":14.605029,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4479,"matched_functions_percent":34.235268,"complete_code":641704,"complete_code_percent":14.703925,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4493}},{"timestamp":"2026-08-07T16:06:10Z","commit_sha":"ace070fc2dff5f40c0004852beefeefc54e186f4","commit_message":"Close the nd_audit tracking gap: 76 preserved bodies checked becomes 106\n\nForty-five parked bodies carried notes predating the `Committed at nd N.`\nconvention, so `nd_audit` silently skipped them. A parked body outside the audit\nis worse than no body at all: it looks documented, but nothing re-measures it,\nand this campaign has already shipped two notes whose figures did not survive\ntheir own last edit.\n\nAdded a `plain` wrapper to `tools/park_probe.py` - the body exactly as\ncommitted, no pragma - and swept all 57 files with parked bodies to get each\none's real current nd, then appended the figure to its existing note. The\naudit now covers 106 of the 151 parked bodies, up from 76, with zero drift. The\nremaining gap is bodies whose guarded arm does not compile standalone, which the\nprober reports as unmeasurable rather than guessing.\n\nThe measured figures are worth having on their own: cmmCommunity has nine\nsibling functions all pinned at nd 38 and one at 72, which is a family signature\nrather than nine independent floors; evtMisc func_0028f4f0 is at nd 1.\n\nAlso tried and failed: `#pragma schedule off` on the load-sinking family\nidentified last commit (retail interleaves a stack-address materialisation with\nsurrounding stores, b210 sinks it to the call). cmmRankUp func_0025b0f0 measures\n24 with it, 24 without, 203 with `schedule on`. Neither direction of the\nscheduler reaches it, which makes it a genuine floor rather than a pragma gap.\n\nOne lint repair: appending the nd figure to a note in code1_0051 pushed it far\nenough from a closing `#pragma schedule off` that the waiver chain broke. Same\nmechanism as the earlier INCLUDE_ASM waiver trap - the closing pragma now\ncarries its own comment.\n\nverify: first-party MATCH 3875 of 4798 (80.8%) unchanged, no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 106 preserved bodies\n0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.703887,"total_code":4364168,"matched_code":637388,"matched_code_percent":14.605029,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4479,"matched_functions_percent":34.235268,"complete_code":641704,"complete_code_percent":14.703925,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4493}},{"timestamp":"2026-08-07T15:29:17Z","commit_sha":"d96bb67345e1631650c403fd96d731772b9c8dbb","commit_message":"Two reconstructions parked; the load-sinking floor now has a name and two members\n\nNo new match. Two functions that were bare with no body at all now have measured\nreconstructions, and the wave produced enough negative information to redirect\nthe next one.\n\n**cmmRankUp func_0025b0f0, parked at nd 24** (object 324 against a 336-byte\nwindow). Everything matches byte-exact - the 15-entry jump table at\njtbl_00747E50, the byte-fill loop, the 2^31 float conversion arm, the\nD_00636730 quadword copies, the prologue and epilogue. The residual is six\nwords in one argument block: retail interleaves `addiu $a0,$sp,0x5C` between\nthe buffer stores and `addiu $a1,$sp,0x40` between the two lq/sq copies, while\nb210 sinks both address materialisations to just before the jal. Levers that\nlanded on the way: the stack frame as `u8 *` with byte offsets, `*(f32 *)buf`\nrather than a cast of `buf[0]`, declaring the pointer before the loop counter,\nand enumerating all fifteen switch cases so b210 emits a table rather than a\ncompare chain.\n\n**frFont func_00271a40, parked at nd 18** (292 against 304). `opt_common_subs\noff` for the three re-issued `andi` masks, plus writing the store address as\n`par + ((u8)i - idx) * 4 + 0x180` so the two bases are reused before the jal -\nthat last spelling alone was nd 67 -> 18.\n\nBoth residuals are the same shape as mc.c func_002a4d10's documented nd 62:\nretail interleaves stack-address materialisation with surrounding stores, b210\nsinks it to the call. That is now three functions, so it is a family rather\nthan an accident, and `schedule on` makes it worse in all three.\n\nNegative results worth not re-buying: all 19 remaining functions in\ny_fclShopDraw are documented argument-scheduling floors - the smallest,\nfunc_002e0100, was fully reconstructed and pinned at nd 191 across every\nspelling because D_00793E80 is shared between two of its fourteen arguments and\nb210 hoists the shared base. shdPersona func_0011dd50 does NOT yield to the\ncapture-the-parameter lever: a lane reported fndiff showing byte-exact, but\nfndiff counts words on a relocation-masked comparison and verify still measures\n53; the change was reverted.\n\nverify: first-party MATCH 3875 of 4798 (80.8%) unchanged, no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 76 preserved bodies\n0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.703887,"total_code":4364168,"matched_code":637388,"matched_code_percent":14.605029,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4479,"matched_functions_percent":34.235268,"complete_code":641704,"complete_code_percent":14.703925,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4493}},{"timestamp":"2026-08-07T14:42:16Z","commit_sha":"c6f109c139d9366dd8c2c859fedcdf01686c787d","commit_message":"Match cmpPersona func_001377e0; capturing a parameter in a local steers colouring\n\nOne match this wave, and it is a lever the campaign had not isolated before.\n\nfunc_001377e0's logic was right from the first attempt and the whole residual\nwas register assignment: retail colours base=$s2, i=$s1, ptr=$s0 while b210\nproduced base=$s0. Declaration order - which has fixed this class twice before -\ndid nothing. What fixed it was **capturing the incoming parameter into a named\nlocal** (`u8 *base = arg0;`) and using that everywhere instead of the parameter.\nA parameter and a local of the same value are not interchangeable to b210's\nallocator.\n\nAlso repaired from this wave's killed lanes:\n\n* code1_003d func_003d38e0 had been left with a `NONMATCHING` marker but NO\n  `#ifdef` guard, so the body was live and the verifier reported it as a bad\n  status rather than as ASM. Guarded properly. Its note claimed nd 11, which was\n  measured on the UNGUARDED body with the pragmas outside the marker; moved\n  inside the guard where they belong it measures 22, and the note now says so.\n  This is the second time a lane has recorded an nd it measured in a state the\n  committed file is not in.\n* shdSkill.c had been reformatted end to end (270 insertions, 265 deletions) and\n  left with 12 COMPILE_ERRORs; reverted wholesale.\n* Two more unguarded non-matching bodies reverted: cmpPersona func_001370e0\n  (nd 124) and code1_003c func_003cc500 (nd 72 - better than the nd 107 I\n  measured earlier via a switch with `schedule on`, but still far oversized).\n\nNegative results worth not re-buying: btlShuffleDraw func_00375f00 and\nfunc_00375a70 are register-allocation floors where b210 folds three saved\nregisters into one, confirmed against the pointer-arithmetic, inline-repetition\nand pragma variants. shdSkill's small functions are all documented floors at\nnd 3-11.\n\nverify: first-party MATCH 3874 -> 3875 of 4798 (80.8%), no regressions, no lost\nmarkers, no MISMATCH. decomp_lint 0 findings, nd_audit 76 preserved bodies\n0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.703887,"total_code":4364168,"matched_code":637388,"matched_code_percent":14.605029,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4479,"matched_functions_percent":34.235268,"complete_code":641704,"complete_code_percent":14.703925,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4493}},{"timestamp":"2026-08-07T14:14:59Z","commit_sha":"c47a484b2c0ae17f58d60dfb5eead64be774b487","commit_message":"Park code1_003c func_003ca830 at nd 14; the per-symbol relocation lever, measured\n\nNo new match this pass, but func_003ca830 goes from an unmeasured bare marker\nto a parked body at nd 14, and the path there is a clean demonstration of two\nlevers stacking.\n\nThe function stores three handler entry points into its object. Retail\nmaterialises each with its own lui/addiu pair because each offset is folded\ninto its own relocation. Spelling the second and third as `func_003ca740 + 0x40`\nand `+ 0x60` lets b210 common-subexpression the base and leaves two plain\n`addiu` immediates - and plain immediates are NOT relocation-masked by the\nverifier, so they count against the diff. Referencing func_003ca780 and\nfunc_003ca7a0 by their own declared symbols instead was worth nd 65 -> 65 on its\nown (the addresses still sank below the first store), and `#pragma schedule on`\nthen hoisted all three above it: nd 65 -> 14.\n\nThe three words left are the order of `move $v0,$a0`, `addu $t0,$a0,$a3` and\nthe first store. Declaring the returned value first, last, or between the\nhandlers and the record pointer all measure nd 14.\n\nAlso reconstructed and measured, then left bare rather than parked because none\nis structurally close enough to be worth freezing: code1_0043 func_004393a0\n(nd 48), func_0043a920 (nd 48, a nine-argument call whose ninth argument goes on\nthe stack), func_0043e5b0 (nd 53), and code1_003c func_003cc500 (nd 107 - a\nfive-way branch-likely chain over a 64-bit GP mode word; both the if/else-if and\nthe nested-ternary spellings come out far oversized at 144-164 bytes against a\n96-byte window).\n\nOne curated gp symbol added with evidence: iGpffffb8f0 (0x007649E0), the 64-bit\nmode word func_003cc500 masks with ~0x1E0.\n\nverify: first-party MATCH 3874 of 4798 (80.7%) unchanged, no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 75 preserved bodies\n0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.699854,"total_code":4364168,"matched_code":637212,"matched_code_percent":14.600997,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4478,"matched_functions_percent":34.227623,"complete_code":641528,"complete_code_percent":14.699893,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4492}},{"timestamp":"2026-08-07T13:56:42Z","commit_sha":"f4717ec8152015896fef2cc0dacc5b1842bf1417","commit_message":"One more match from the parked sweep, and three more pragma wrappers\n\nExtended `tools/park_probe.py` from four wrappers to seven - added\n`no_branch_likely on`, `schedule on` combined with `opt_common_subs off`, and\n`schedule on` combined with `opt_loop_invariants on` - and re-swept all 57 files\nwith parked bodies (86 measurable bodies, about fourteen minutes).\n\nOne match: code1_0051 func_00513a40, previously parked at nd 7. Retail\nmaterialises the global's address once and keeps it live across the store; b210\nshares that address with the returned constant unless common-subexpression\nsharing is off.\n\nThe combined wrappers found no new matches but did produce useful ceilings:\n`no_branch_likely on` is the best of the seven for the whole code1_0039\nfunc_0039axxx family (nd 36-56, matching their existing parked figures rather\nthan beating them), which corroborates those notes independently; and\nitfMesManager func_00278d50 is best under schedule+cse-off at nd 43.\n\nThe sweep also showed that roughly a dozen parked bodies carry notes predating\nthe `Committed at nd N.` convention, so `nd_audit` measures 74 of the 151 parked\nbodies rather than all of them. That is a gap in the tracking, not a defect in\nany body, but it means a stale note can survive there.\n\nverify: first-party MATCH 3873 -> 3874 of 4798 (80.7%), no regressions, no lost\nmarkers, no MISMATCH. decomp_lint 0 findings, nd_audit 74 preserved bodies\n0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.699854,"total_code":4364168,"matched_code":637212,"matched_code_percent":14.600997,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4478,"matched_functions_percent":34.227623,"complete_code":641528,"complete_code_percent":14.699893,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4492}},{"timestamp":"2026-08-07T13:29:00Z","commit_sha":"7226bee963abde4fe62cfd5056c9a92a86eef995","commit_message":"Six matches; two of them came from re-probing bodies parked before the lever existed\n\nNew tool: `tools/park_probe.py`. It walks every `#ifdef NON_MATCHING` body in a\nfile, recompiles each under four pragma wrappers, and reports any that beats the\nbody's committed nd. The point is that a lever discovered in week three never\ngets applied to anything parked in week one, and 151 bodies had accumulated.\n\nSweeping all 57 files with parked bodies found six candidates, two of them\noutright matches:\n\n* code1_001f func_001f6bf0, nd 9 -> byte-exact under `opt_loop_invariants on`\n* code1_0020 func_0020bac0, nd 41 -> byte-exact under the same\n* code1_0035 func_00356170 nd 63 -> 45, code1_003d func_003ddf80 and\n  func_003ddfd0 nd 38 -> 37 (all `schedule on`), y_list func_002e6b20\n  nd 159 -> 45 (`opt_common_subs off`)\n\nBoth files that gained a match are now 100%: code1_001f 37/37, code1_0020 35/35.\n\nWriting that tool exposed a measurement bug worth flagging, because it produced\na convincing false MATCH: a parked body compiles as INCLUDE_ASM unless you\nreplace the WHOLE guarded block, and reusing one JSON path across probes\nsilently re-reads the previous probe's numbers whenever verify.py fails to\nwrite. The fixed version deletes and re-creates a per-probe report and treats a\nmissing file as failure. Its first, wrong answer said func_00247cb0 matched\nunder `opt_common_subs off`; it is really nd 24, and nd 8 remains its best.\n\nbtlAICommand 248 -> 252 of 263, from a lane that survived 42 minutes:\nfunc_001dca60, func_001dd0d0, func_001debb0, func_001de640. Two coordination\nnotes from that exchange:\n\n* I reverted the whole file with `jj restore` to clear a duplicate marker a\n  killed lane had left, which destroyed two matches the live lane had just\n  made. It messaged me over IRC to ask who owned the file, I explained and\n  handed ownership back, and it redid both. Reverting a file another agent is\n  editing is not a safe repair.\n* That revert also dropped `func_001daf40` entirely - the marker census caught\n  it as `scanned 4798 -> 4797`, and the function was recovered from the parent\n  commit and reinstated. The census is worth more than the match count.\n\nverify: first-party MATCH 3867 -> 3873 of 4798 (80.7%), no regressions, no lost\nmarkers, no MISMATCH. decomp_lint 0 findings, nd_audit 74 preserved bodies\n0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.699488,"total_code":4364168,"matched_code":637196,"matched_code_percent":14.60063,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4477,"matched_functions_percent":34.21998,"complete_code":641512,"complete_code_percent":14.699526,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4491}},{"timestamp":"2026-08-07T12:26:04Z","commit_sha":"5d95a104ba93a263faced3fc8a87307443843e7a","commit_message":"Three matches in cmmMisc; opt_common_subs off is the mask-CSE lever\n\ncmmMisc goes 37 -> 40 of 57. All three needed a pragma this campaign had not\nused before, and it generalises:\n\n**`#pragma opt_common_subs off` is what stops b210 CSEing a re-masked loop\ncounter.** When retail re-issues `i & 0xFFFF` at every call site inside a loop,\nb210's default is to compute it once into a saved register and reuse it. Turning\nCSE off makes it re-issue, which is what the re-masked-counter idiom actually\nneeds. func_00247770 went nd 12 -> 0 with it plus declaring the counter first;\nfunc_00247820 nd 8 -> 0 with it plus the declaration order\ntarget/i/largest/result matching retail's $s0/$s3/$s2/$s1.\n\nfunc_00247f60 needed the other two loop levers together: `opt_loop_invariants\non` to hoist the two search keys and the count into the preheader (nd 53 -> 9),\nthen a goto-sentinel - set a found flag and jump out of the loop, clear it on\nthe fall-through path - plus an inverted final guard (nd 9 -> 0).\n\nFour more in the same file were reconstructed and confirmed as floors rather\nthan guessed at: func_00248d80 (nd 7 - a genuine live-range conflict, the masked\nargument and its replacement cannot both survive the second call the way retail\nhas them), func_002492b0 (nd 20, shared NULL block will not go out of line),\nfunc_002490b0 (nd 50), func_00247dd0 (nd 117). All restored to INCLUDE_ASM\nrather than left half-written.\n\nParked: nLine func_0034ba30 at nd 64. Worth reading: an earlier probe measured\nZERO differing words on it, which sounds like a match and is not - verify counts\nbytes and fndiff counts words, and the object was 212 against a 224-byte window\nwhose real body is also 212 plus three padding nops. The residual is register\ncolouring across nineteen stores.\n\nSeven of eight lanes in this wave were killed inside two minutes; the one that\nsurvived ran for an hour. Their four half-written bodies were reverted before\nthis commit.\n\nverify: first-party MATCH 3864 -> 3867 of 4798 (80.6%), no regressions, no lost\nmarkers, no MISMATCH. decomp_lint 0 findings, nd_audit 76 preserved bodies\n0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.666096,"total_code":4364204,"matched_code":635744,"matched_code_percent":14.567238,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4471,"matched_functions_percent":34.17412,"complete_code":640060,"complete_code_percent":14.666134,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4485}},{"timestamp":"2026-08-07T11:07:51Z","commit_sha":"8e6f4c00b56fc19f3cddde563ce4c4eecc016cdc","commit_message":"Nine matches in code1_003e; that unit goes 15/39 to 24/39\n\nOne lane out of eight ran to completion and took nine functions in a single\nfile: func_003e1c30, func_003e25f0, func_003e3c90, func_003e4760, func_003e50a0,\nfunc_003e6240, func_003e7f50, func_003e7fb0 and func_003e8010. It also parked\nfive more with measured notes (func_003e1a70 nd 45, func_003e2570 nd 30,\nfunc_003e3c20 nd 22, func_003e43c0 nd 35, func_003e46e0 nd 30) and identified\nthree as unwinnable: func_003e32f0 needs `movz`, func_003e3f00 and func_003e4030\nneed FPU multiply-accumulate shapes b210 will not emit.\n\nFourteen curated data addresses added with evidence for that unit, and four\ndeclarations corrected from scalar to array so the references come out absolute\nrather than GP-relative - the addressing-mode lever again, this time at scale.\n\nThe other seven lanes were killed by quota before finishing, leaving four\nunguarded non-matching bodies (datPersona func_0010cad0, btlAICommand\nfunc_001dca60, code1_003c func_003ca830, code1_0043 func_004393a0). All four\nreverted; datPersona's had taken its whole 56-function unit to COMPILE_ERROR.\n\nAlso probed and abandoned: y_smap func_002b1260 and func_002b1320, a pair of\n192-byte functions built around the EE accumulate chain (`adda.s` then\n`msub.s`). A plain three-float copy gets dead-store-eliminated where retail\nwrites and reloads it; a struct assignment restores the stores (nd 115 -> 106)\nbut the whole tail stays a word out of phase. Left bare rather than parked.\n\nCurrent shape of what is left: 934 first-party ASM, of which 151 are parked with\nmeasured bodies and 783 are bare. Only 120 of the bare ones are 256 bytes or\nsmaller; 672 are larger, and 300 of those exceed 1 KB. The cheap seam is close\nto worked out.\n\nverify: first-party MATCH 3855 -> 3864 of 4798 (80.5%), no regressions, no lost\nmarkers, no MISMATCH. decomp_lint 0 findings, nd_audit 75 preserved bodies\n0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.65211,"total_code":4364220,"matched_code":635136,"matched_code_percent":14.553253,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4468,"matched_functions_percent":34.151188,"complete_code":639452,"complete_code_percent":14.652148,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4482}},{"timestamp":"2026-08-07T10:09:41Z","commit_sha":"5b366e4343bf90740da904b2721d9fac5656257c","commit_message":"Two matches, and a wave that mostly bought negative information\n\nMatched: code1_0015 func_0015c440 and code1_0046 func_004614b0 (the latter was\ncarrying a parked nd-69 note; retail materialises the table address once into a\ncallee-saved register and reuses it, which a u32 base cast reproduces).\ncode1_0046 is now 18/18.\n\nThe rest of this eight-lane wave found floors rather than matches, which is\nitself worth recording so the next pass does not re-tread it:\n\n* datCalc: all 23 remaining functions probed and confirmed as floors -\n  base-load sinking, mask CSE, saved-register rotation, s8 const-folding. The\n  closest is func_002340c0, whose first 1300 of 1904 bytes match before\n  return-tail merging diverges. Three of the file's functions are 10-12 KB.\n* shdPersona and y_fclCombineDraw: the small end is already documented floors.\n* y_fclCombine: the smallest remaining function is 352 bytes.\n* itfMsgProcedure_Window: quota-killed mid-reconstruction.\n\nRepair pass, as always. Two lanes left unguarded bodies that broke their units\n(one used C99 mid-block declarations, one was a 261-nd reconstruction) - both\nreverted. Two parked notes claimed an nd their body no longer measures\n(itfMsgProcedure_Window func_0027d3c0 noted 37, measures 104; shdPersona\nfunc_0011dd50 noted 23, measures 53), because the lanes were killed between\ntheir last edit and their last measurement. Notes corrected to the measured\nfigures rather than the remembered ones - nd_audit exists precisely to catch\nthis and it did.\n\nManaged skill p4-mwccps2-declaration-levers rewritten around the guard-polarity\nand re-masked-counter levers, with the parallel-lane rules and the mandatory\npost-wave repair recipe added.\n\nverify: first-party MATCH 3853 -> 3855 of 4798 (80.3%), no regressions, no lost\nmarkers, no MISMATCH. decomp_lint 0 findings, nd_audit 76 preserved bodies\n0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.631521,"total_code":4364292,"matched_code":634248,"matched_code_percent":14.532666,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4459,"matched_functions_percent":34.082397,"complete_code":638564,"complete_code_percent":14.63156,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4473}},{"timestamp":"2026-08-07T09:23:03Z","commit_sha":"3c06cb134c510c93dee13e5daacb73022af338e8","commit_message":"Eight matches; the mask-at-every-use counter idiom, three ways\n\nMatched: code1_0027 func_0027b1c0, code1_002b func_002be100, code1_002e\nfunc_002e6f90, code1_0033 func_00332b60, code1_004a func_004a7a90 and\nfunc_004a7b70, mdlManager func_0047aa30 and func_00479d10.\n\nFour of those are the same underlying shape and the resolution differs by one\ndetail each time, which is worth writing down:\n\nA retail loop whose counter is re-masked at EVERY use (`andi ...,0xffff` or a\n`dsll32`/`dsra32` pair before the compare AND again at the index) is NOT a\nnarrow variable. It is an `s32` counter with an explicit cast written at each\nuse. But the exact spelling matters:\n\n* func_0027b1c0 needed `s32 i = 0;` as its own statement BEFORE the other\n  locals plus an empty for-init `for (; i < n; i++)`; the ordinary for-init\n  emitted the zeroing after the hoisted loads (nd 13). It also needed\n  `(1 << bit) & mask`, not `mask & (1 << bit)`.\n* func_002be100 needed the key and the table base hoisted into locals AND the\n  found-path to return the RAW counter, not a re-masked copy (nd 52 -> 0).\n* func_002e6f90 needed `#pragma opt_loop_invariants on` so the (s16)\n  normalisation of the search value happens once in the preheader (nd 69 at\n  132 bytes against a 128-byte window -> byte-exact).\n* func_0047aa30 needed the body index derived into a SEPARATE local\n  (`idx = (u16)i`) so b210 keeps the loop-head mask and the body-top mask\n  distinct instead of CSEing them into one carried register (nd 68 -> 0).\n\nfunc_00332b60 is a nice find: the `ldr`/`ldl` unaligned pair loads an 8-byte\nSTRUCT passed by value, which the EE ABI packs into the single register $a0.\nAn `s64` would have paired $a0:$a1 and shifted every later argument.\n\nfunc_00479d10 was carrying a documented nd-91 register-colouring note and fell\nto the index-first `addOff` inline helper plus an explicit temp for one load.\n\nParked: code1_0017 func_00178870 (nd 10), y_CmbCardEff func_0033fb90 (nd 25),\ncode1_002e func_002e09e0 (nd 4, two-float copy register colouring).\ncode1_0041's two remaining small functions are genuinely unmatchable - one is\nEE MMI/SIMD (mtsab/qfsrv/pextlb), the other a framed tail jump.\n\nverify: first-party MATCH 3845 -> 3853 of 4798 (80.3%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 75 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.626335,"total_code":4364308,"matched_code":634024,"matched_code_percent":14.52748,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4457,"matched_functions_percent":34.06711,"complete_code":638340,"complete_code_percent":14.626373,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4471}},{"timestamp":"2026-08-07T08:48:35Z","commit_sha":"5e0d858748d5d855c5b1ce8f63a33ddb85961ee6","commit_message":"Ten matches from an eight-lane parallel wave, plus the repair pass it needed\n\nCrossing 80%. Matched: code1_0018 func_0018bed0, code1_0034 func_0034b820 and\nfunc_0034b8d0, code1_003c func_003ca890 / func_003cbc10 / func_003cbc90,\ncode1_003e func_003e3630, code1_0045 func_004534f0, y_draw func_002b68d0, and\ny_fclShopDraw func_002e0300.\n\nTwo of those are worth reading:\n\n* func_002e0300 is a 480-byte window-registrar. It went nd 84 -> nd 18 with\n  `#pragma opt_loop_invariants on` (retail hoists the loop's 0xFF and the 1.0f\n  bit pattern into the preheader) and nd 18 -> MATCH by declaring the result\n  local BEFORE the work pointer, which swaps their $s0/$s1 assignment to\n  retail's.\n* func_0034b820 takes a two-float struct by value in $a1. A whole-struct\n  assignment reproduces retail's two-lwc1-then-two-swc1 bulk copy; two separate\n  field stores interleave at nd 9.\n\nParked with measured notes: y_fclCombineDraw func_00314450 (nd 9) and\nfunc_003144d0 (nd 10) - retail clears their eight-byte packet with a guarded\nbyte loop rather than a call, so the clear is now a `static inline` in that\nfile; the residual is a $a0/$v1 swap that no declaration order moves.\nAlso code1_0039 func_00399b10 (nd 43), code1_003d func_003d8150 (nd 32),\ncode1_003e func_003e1db0 (nd 33), and the six-function code1_0039 family and\ncode1_0043 pair the lanes parked themselves.\n\nSeven curated gp symbols added with evidence for func_004534f0's adjacent s16\nslots: iGpffffba1c through iGpffffba34. recover_symbols emits 3795.\n\nThe wave needed a real repair pass. Six of eight lanes were killed mid-edit and\nleft three unguarded MISMATCH bodies behind; my first attempt to guard them cut\nat the wrong brace because the closing-brace search matched an INNER `}` after\nstrip(), which spliced `#else INCLUDE_ASM #endif` into the middle of a function\nbody and turned three whole units into COMPILE_ERRORs. Fixed by matching a\nclosing brace at column 0. Two lanes also left bare closing `#pragma` lines\nwhose `measured` justification had been consumed - the same waiver-scope trap as\nlast wave, now in the other direction.\n\nverify: first-party MATCH 3835 -> 3845 of 4798 (80.1%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 72 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.605068,"total_code":4364364,"matched_code":633104,"matched_code_percent":14.506215,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4449,"matched_functions_percent":34.005962,"complete_code":637420,"complete_code_percent":14.605106,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4463}},{"timestamp":"2026-08-07T07:49:33Z","commit_sha":"e19bbb5ffd7611e2dd95288d994150660cbda98b","commit_message":"Three matches; retail really does pass an uninitialized first argument\n\nfunc_00193a80 and func_00149620 both register a window with func_00451fc0 and\nboth set up arguments two through eight while leaving $a0 untouched. That is\nnot a decoding mistake: the original C declares a pointer local and never\nassigns it before the call. Writing exactly that -\n\n    u8 *ctx;\n    func_00451fc0(ctx, TABLE, 0x10, 0, 0, init, NULL, NULL);\n\n- matches both byte for byte. Passing NULL instead emits `daddu $a0,$zero` and\ndoes not. Two dozen more bare functions call this registrar, so the shape is\nworth recognising: if the retail listing sets $a1..$a7 and skips $a0, the\nsource has an uninitialized local there.\n\nfunc_0017ccc0 also matched, and needed three declarations the file was missing.\nTwo of them - func_0017c930 and func_0017cc90 - are defined LATER in the same\nfile, so the call site needs forward declarations rather than externs; the\nthird, the D_008873F4 allocator table, was simply absent.\n\nParked: shdScript func_0025ccb0 at nd 42. Getting the outer guard's polarity\nright was most of the distance (nd 129 -> nd 42): retail sends the\nalready-open case out of line and falls through into the create path. The one\nremaining instruction is an `sltu $v0,$zero,$v0` retail emits to booleanise the\nsecond guard's call result before branching. Probed `!= 0` compared against\nzero, a double negation, an explicit named local, and that local typed\nu8/s8/u16/u32/s32 - the typed forms are all worse at nd 63.\n\nverify: first-party MATCH 3832 -> 3835 of 4798 (79.9%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 54 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.573012,"total_code":4364412,"matched_code":631712,"matched_code_percent":14.474161,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4439,"matched_functions_percent":33.929527,"complete_code":636028,"complete_code_percent":14.573051,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4453}},{"timestamp":"2026-08-07T07:30:41Z","commit_sha":"831876a2728b637e5c2a0d6be04dbc9c3a4f3aea","commit_message":"Four matches; a missing table extern and a too-strict prototype were the blockers\n\nMatched: code1_0011 func_00110e80, code1_0020 func_00201650 and func_002038c0,\ncode1_0021 func_00211f90.\n\nBoth compile failures this wave were declaration environment, not decompilation:\n\n* code1_0011 never declared `jtbl_008873EC`, the dispatch table half the\n  promoted units use. Added it.\n* code1_0021 declared `func_00452560(void)` while retail passes it a handle at\n  this call site. Relaxed to an old-style empty list - the third time this\n  helper's prototype has been the blocker, in three different units. Worth\n  checking first whenever a code1_00xx function calls it.\n\nfunc_00201650 takes seven arguments, four of them in $a3/$t0/$t1/$t2. b210 uses\neight argument registers, so wide argument lists are ordinary C here, not a\nsign of a struct being passed.\n\nParked with measured notes:\n\n* code1_0026 func_002677a0 (nd 12) - a cubic Bezier. b210 does emit the EE\n  multiply-accumulate chain (mula.s/madda.s/madd.s) for a sum of four products\n  and gets the four basis terms in retail's order; the residual is purely which\n  FPU register each term lands in. Swapping the two declarations does not move\n  it, because the evaluation order follows the accumulate chain rather than the\n  declarations.\n* code1_0015 func_0015a740 (nd 5) - table base and scaled index swapped between\n  $v1 and $a1; the other declaration order measured nd 11.\n* y_draw func_002b7750 (nd 22) - the load-sinking wall already documented for\n  func_002b6a70 in the same file: retail re-reads the GP work pointer before\n  each of six stores, b210 hoists it.\n\nOne curated gp symbol added with evidence: iGpffffb1b8. recover_symbols re-run,\nemitting 3786.\n\nverify: first-party MATCH 3828 -> 3832 of 4798 (79.9%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 53 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.5653925,"total_code":4364416,"matched_code":631380,"matched_code_percent":14.46654,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4436,"matched_functions_percent":33.906597,"complete_code":635696,"complete_code_percent":14.565431,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4450}},{"timestamp":"2026-08-07T07:07:16Z","commit_sha":"9a8f816242fe7c2142d8cb57f30e9156310602b1","commit_message":"Five matches, and a lint waiver that was leaning on an INCLUDE_ASM line\n\nMatched: code1_001d func_001da130, code1_001f func_001f9750, code1_0028\nfunc_0028b650, code1_003a func_003a16c0, code1_0046 func_004645e0.\n\nThe guard-shape rule from last wave needs its other half. Retail decides which\nside of a two-way guard goes OUT OF LINE, and the C has to agree:\n\n* func_001f9750 and func_004645e0 wanted the constant return out of line, so\n  the body assigns a result variable in an if/else and returns once.\n* func_0028b650 wanted the WORK out of line - retail's `bnez` skips over an\n  inline `move $v0,$zero`. Writing it the first way measured nd 20; inverting\n  to `if (h == 0) return 0;` matched. Read which target the retail branch\n  jumps FORWARD to: that is the out-of-line side.\n\nFilling func_003a16c0's marker exposed a stale lint waiver. `#pragma\noptimization_level 3` at code1_003a.c:188 was passing decomp_lint only because\n`_scan_waiver` skips INCLUDE_ASM lines when it walks up from the enclosing\nmarker - with func_003a16c0 still an assembly fallback, that walk sailed past\nit and found a `measured` comment belonging to a different function six lines\nfurther up. Writing a real body consumed the budget and the pragma became an\nunjustified H003. The pragma is genuinely measured, so it now carries its own\ncomment instead of borrowing a neighbour's. Worth knowing: a waiver that\nresolves through an INCLUDE_ASM line is load-bearing on that function still\nbeing unmatched.\n\nAlso relaxed `s32 *func_00452560(void);` to an old-style empty list in\ncode1_0028 - retail passes it a handle here and nothing at the file's two\nother call sites. The file's nine existing matches are unchanged.\n\nFour curated gp symbols added with evidence: iGpffffb414, iGpffffb614,\niGpffffbab0, iGpffffbab4.\n\nNew managed skill p4-mwccps2-declaration-levers collects the eleven spelling\nlevers this campaign has proven, with the two that are per-row rather than\nuniversal called out as such.\n\nverify: first-party MATCH 3823 -> 3828 of 4798 (79.8%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 50 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.554996,"total_code":4364428,"matched_code":630928,"matched_code_percent":14.456144,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4432,"matched_functions_percent":33.876022,"complete_code":635244,"complete_code_percent":14.555034,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4446}},{"timestamp":"2026-08-07T06:43:27Z","commit_sha":"f9ce16c816f7c422c4616a090f5208e2b712c194","commit_message":"Seven matches; opt_loop_invariants is the preheader hoist\n\nMatched:\n\n* code1_001b func_001bbe80\n* code1_0021 func_00216ca0\n* code1_0033 func_003319c0, func_0033d320\n* code1_0038 func_00388d60, func_00388e40\n* code1_0048 func_00485fe0\n\nThree things worth carrying forward:\n\n* A guard whose failing side returns a constant is not an early return. Both\n  func_003319c0 and last wave's func_002aa3f0 sat one to twenty words off with\n  `if (!cond) return 0;` because retail places the zero-return OUT OF LINE\n  after the taken path. Assigning a result variable in an if/else and\n  returning it once at the end reproduces that layout.\n* Two functions in code1_0038 were unreachable purely because the file relies\n  on implicit declarations: func_0043f9c8 and func_00389180 are used before any\n  prototype, so a new caller gets `int` and the file fails to compile. Adding\n  the two prototypes at the top changed none of the file's 38 existing matches\n  and both new functions matched immediately.\n* func_00485fe0 dispatches through the SAME handler table as code1_0048's four\n  0x484xxx functions, but here retail keeps the +0x1C bias as a real load\n  displacement instead of folding it into the relocation. So the choice between\n  `D_00713480 + idx*0x40 + 0x1C` and `extern u8 D_0071349C[]` is per call site,\n  not per table - read the retail listing each time.\n\nParked with measured notes: the code1_0016 table trio func_00162330 and\nfunc_00162390 (nd 8 each) and func_001622d0 (nd 14). All three needed\n`#pragma opt_loop_invariants on` to get retail's preheader hoist of the 0x750\nstride, worth nd 29 -> nd 14 and nd 19 -> nd 8; what remains is which register\nholds the stride versus the table base. Also code1_001b func_001ba710 (nd 8,\nb210 rotates the four float temporaries by one in every declaration order).\n\nverify: first-party MATCH 3816 -> 3823 of 4798 (79.7%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 50 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.543525,"total_code":4364460,"matched_code":630432,"matched_code_percent":14.444674,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4427,"matched_functions_percent":33.837803,"complete_code":634748,"complete_code_percent":14.543563,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4441}},{"timestamp":"2026-08-07T06:22:57Z","commit_sha":"80da6c0263cd707ef48f24e8e9f690b4b4d97e60","commit_message":"Fifteen matches; four spelling levers, each on its own function\n\nThe one-small-function-per-untouched-file sweep is still the highest-yield\nthing available. Fifteen of eighteen attempts landed byte-exact:\n\n* code1_0011 func_00110680\n* code1_0018 func_0018bf50, func_0018c610\n* code1_0019 func_00195530\n* code1_001a func_001a2ad0, func_001ac620\n* code1_001d func_001d5ac0\n* code1_001e func_001eab60, func_001eb0b0\n* code1_0020 func_002119a0 (moved from code1_0021's list)\n* code1_0021 func_00213ab0, func_00216c40, func_002119a0\n* code1_002a func_002aa3f0, func_002aaa10\n* code1_0045 func_00456840\n\nFour of them needed a specific spelling, and each is reusable:\n\n* `||` over two discrete values becomes a range check. func_0018bf50 wrote\n  `if (v == 5 || v == 6) r = 1;` and b210 emitted `addiu -5 / sltiu 2`, where\n  retail compares twice. A switch with two fallthrough labels measured nd 46\n  and an if/else-if nd 42; explicit `goto`s to a shared set-label matched.\n* The commutative-addu inline helper works here. func_00195530's residual was\n  one word, `addu $v0,$v1,$v0` vs `addu $v0,$v0,$v1`. A `static inline`\n  taking (offset, base) matched it - the same helper shape that made\n  func_00389090 worse last wave, so it really is per-row.\n* An if/else that assigns a variable is not the same as a ternary.\n  func_002aa3f0 with a nested if/else measured nd 1; the identical logic as\n  `r = (X != 0) ? 1 : 2;` inside the outer if/else matched.\n* Array-vs-scalar again: func_00110680 reads a halfword at 0x00797B7A, which\n  retail addresses absolutely. `extern s16 D_00797B7A;` gives a GP-relative\n  lh (nd 58); `extern s16 D_00797B7A[];` with `[0]` matches.\n\nAlso: func_00212240's prototype was too narrow. func_001eab60 passes it two\narguments where func_001eab10 passes one, so it becomes an old-style empty\nparameter list - the second time that fix has been needed in this campaign.\nnd_audit confirms func_001eab10's parked nd 2 did not drift.\n\nParked with measured notes: func_00361ca0 (nd 8, argument order before the\ncall; its `i <= 0` bound is real, retail's back edge is a blez so the body\nruns once), func_0020bac0 (nd 41, retail hoists the ~0x200 mask into the loop\npreheader and keeps it live, and carries a nop at the condition label that\nb210 never emits).\n\nTwo curated gp symbols added with evidence: iGpffffad88, iGpffffb3e0.\nrecover_symbols re-run, emitting 3780.\n\nverify: first-party MATCH 3801 -> 3816 of 4798 (79.5%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 46 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.525768,"total_code":4364508,"matched_code":629664,"matched_code_percent":14.426918,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4420,"matched_functions_percent":33.7843,"complete_code":633980,"complete_code_percent":14.525806,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4434}},{"timestamp":"2026-08-07T05:58:41Z","commit_sha":"0c3a33603212486fac6bb8df35c5f97e43cbd5ae","commit_message":"Nine more matches; the void* callee parameter keeps paying\n\nSolo work, plus one surviving parallel lane (code1_0035).\n\nMatched:\n\n* code1_0022 func_0022a6b0, func_0022bc80\n* code1_004a func_004a77b0\n* code1_004b func_004b1420\n* code1_002b func_002baf40, func_002bacb0\n* y_smap  func_002add10\n* code1_0035 func_003549d0, func_003558a0\n\nTwo levers did the work again, both about how a value is DECLARED rather than\nhow it is written at the call site:\n\n* func_002add10 sat at nd 4 because retail materialises the constant into $a0\n  before the address into $a1 and b210 does the reverse. Hoisting the address\n  into a local, writing it as `&arg1[0xB4]`, and inlining it all measured nd 4.\n  Changing the callback table's declared second parameter from `s32` to\n  `void *` and dropping the cast matched immediately. Same fix as\n  func_00176370 last wave, so this is now two for two.\n* func_002bacb0 sat at nd 8 with the loop index zeroed after the table address\n  was materialised, where retail does it before. Assigning the index in its own\n  declaration ahead of the table pointer's reorders exactly those two words.\n  Both `for` and `while` forms match once the declarations are in that order.\n\nAlso worth recording: func_002bacb0 first measured nd 17 while indexing the\nglobal array directly; hoisting the array base into a local pointer took it to\nnd 8 before the declaration-order fix finished it.\n\nParked: code1_0044 func_00446ed8 (nd 45, retail builds a partially initialised\n0x58-byte record at the frame base and b210 puts the same struct at frame\noffset 0x20), code1_0043 func_0043ac18 (nd 29, retail materialises the flag's\naddress once and reuses the %lo displacement for both the load and the clear),\ncode1_0035 func_00356170 (nd 63) and func_003561d0 (nd 70).\n\nLeft bare after measuring: code1_002b func_002be100 (nd 55 best), code1_004b\nfunc_004bd6b8 (nd 31 only under schedule on, which rewrites the whole frame),\ncode1_0022 func_0022ba40 (nd 62), cmmMisc func_00248d80 and func_00247770\n(nd 105 / nd 162 - both need real reverse engineering, not spelling probes).\n\nSymbol bookkeeping: fourteen curated data addresses added with evidence\n(D_00763C68/6C, D_00764874/78/7C/84/88/90/98/9C, D_007EF9B0, D_007F16F0,\nD_007E8C00, iGpffff83d4, iGpffff8544) and recover_symbols re-run, emitting\n3778. Two of those arrived with the wrong value - `gp - 0x7C2C` is 0x007614C4\nand `gp - 0x7ABC` is 0x00761634, not 0x007014C4/0x00701634 - and were\ncorrected before regeneration.\n\nverify: first-party MATCH 3792 -> 3801 of 4798 (79.2%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 44 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.492193,"total_code":4364628,"matched_code":628216,"matched_code_percent":14.393346,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4405,"matched_functions_percent":33.669647,"complete_code":632532,"complete_code_percent":14.492231,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4419}},{"timestamp":"2026-08-07T04:57:54Z","commit_sha":"8780dec9bbccb1cad0ad89b8d940bc835be21e79","commit_message":"Nine matches across five untouched files\n\nThe productive pattern this wave was picking one small function per file that\nhad never been opened, reading its retail listing, and writing the obvious\nbody. Nine of twelve landed byte-exact:\n\n* code1_0015 func_0015a630, func_0015c590, func_0015c210\n* code1_0038 func_0038dd90, func_0038ce30\n* code1_001b func_001b1940, func_001ba530\n* code1_0048 func_00484970, func_00484a90\n\nThree shapes were load-bearing and are worth remembering:\n\n* Reference the exact symbol retail relocates against. The four code1_0048\n  dispatchers index handler tables at 0x0071349C/A0/A8/B0. Spelling them as\n  `D_00713480 + (idx << 6) + 0x1C` leaves a real `lw $v1,0x1c($v1)`; declaring\n  `extern u8 D_0071349C[];` and dropping the bias folds it into the\n  relocation's low half, which is what retail does. That alone took\n  func_00484970 from nd 1 to MATCH.\n* Advance a pointer instead of indexing past a sub-object. In func_00389090\n  `slot[n + 1]` lets b210 fold the 0x28 sub-object offset into the store\n  displacement; `slot += n; slot[1] = ...` keeps the sub-object base in its own\n  register the way retail does (nd 54 -> nd 3).\n* Spell an overflow guard the way retail compares it. `> 4` compares through\n  $at like retail; `>= 5`, `!(x < 5)`, `5 <= x` and an early-return inversion\n  all compare through $v1 (nd 3 -> nd 1).\n\nParked with measured notes: func_00389090 (nd 1, residual is one commutative\naddu; the static-inline operand-order helper that usually cures those makes it\nmuch worse here, nd 20, in all four call shapes probed), func_00484a40 and\nfunc_00484ae0 (nd 2, retail scales the handler index into $a2 where their two\nmatching siblings use $a1).\n\nTwo curated gp symbols added with evidence and recover_symbols re-run:\niGpffff9e28, iGpffffb218.\n\nverify: first-party MATCH 3783 -> 3792 of 4798 (79.0%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 40 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.469908,"total_code":4364688,"matched_code":627252,"matched_code_percent":14.371061,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4396,"matched_functions_percent":33.600853,"complete_code":631568,"complete_code_percent":14.469946,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4410}},{"timestamp":"2026-08-07T04:33:29Z","commit_sha":"d53c59ce16579f7cd2f385f7ce68c4dde416116f","commit_message":"Array-vs-scalar extern picks the addressing mode; two more matches\n\nThe find this wave is that a global's DECLARATION FORM decides whether b210\nreaches it GP-relative or absolutely. `extern s32 D_0070FC64;` compiles to\nlw $v1,-N($gp); `extern s32 D_0070FC64[];` with `D_0070FC64[0]` compiles to\nthe lui/lw pair retail actually uses. func_0043bc70 goes from nd 39 (wrong\naddressing, undersized object) to nd 29 at retail's exact 72 bytes purely from\nthat change. Worth checking on any function whose fndiff shows R_MIPS_GPREL16\nwhere retail has R_MIPS_HI16/LO16.\n\nMatched:\n\n* code1_0012 func_00121b20 - registers a 15-entry list with func_00451de0.\n* code1_0021 func_00216da0 - formats into an 0x80-byte stack buffer and hands\n  it to func_00278450.\n\nParked with measured notes: func_003bcf10 (nd 47), func_003ddf80 and its\n+0x34 sibling func_003ddfd0 (nd 38, vtable dispatch with the scale factor live\nacross the call), func_0043bc70 (nd 29, residual is retail's real mult/mflo by\n12 where b210 strength-reduces to sll/addu/sll).\n\nSix curated gp symbols added with evidence and recover_symbols re-run:\niGpffff9ca8, iGpffffa598, iGpffffb430/b434/b438, iGpffffb668, plus\niGpffffb708/b70c for the code1_003c node arrays.\n\nNew tooling: tools/try_bare.py and tools/park.py. try_bodies.py resolves the\nregion to replace by scanning outward from the marker, which over-reaches in\nfiles where a long /* measured */ comment sits between two functions - it\nreported COMPILE_ERROR for six already-parked code1_0041 functions that\ncompile fine. try_bare.py replaces exactly the INCLUDE_ASM line, and park.py\nrefuses to touch a marker that is already guarded, which is how that\ndouble-work was caught.\n\nverify: first-party MATCH 3781 -> 3783 of 4798 (78.8%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 37 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.451576,"total_code":4364744,"matched_code":626460,"matched_code_percent":14.352732,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4387,"matched_functions_percent":33.532066,"complete_code":630776,"complete_code_percent":14.451615,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4401}},{"timestamp":"2026-08-07T04:04:30Z","commit_sha":"c0d635aae14dafbe25fe497ea5767ef4da971638","commit_message":"Match three one-per-file functions; an old-style prototype unblocks a fourth\n\nReaching into four files that had never been touched, one small function each:\n\n* code1_0020 func_00201300 - stores four float arguments as truncated ints\n  into a caller-supplied array at word offsets 1..4.\n* code1_0018 func_0018c700 - two-step handle lookup, then a float call. The\n  f32 argument survives across both calls in $f20, which falls out naturally\n  from a plain parameter.\n* code1_0026 func_00266a90 - set bit 1 of the flag word when the lookup\n  succeeds. This one needed func_00452560's prototype relaxed from (void) to\n  an old-style empty list: the retail call here passes the object pointer,\n  while the two existing call sites in the same file pass nothing. Measured\n  both ways - the file's other 9 matches are unchanged and there are no\n  compile errors.\n\ncode1_001e func_001eab10 is parked at nd 2, which is the whole 80-byte object\nminus one register choice: retail materialises the comparison constant 1 into\n$a1, b210 into $v1. Naming the call result in a local leaves it at nd 2, and\ninverting the branch into an early return costs 40 more. Colouring floor.\n\nAlso added the declarations these needed: func_00452490, func_00213b50,\nfunc_001eb860, func_00212240, func_003ef6d0, func_003ef650, func_003f6800,\nD_005F5360.\n\nverify: first-party MATCH 3778 -> 3781 of 4798 (78.8%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 33 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.448146,"total_code":4364756,"matched_code":626312,"matched_code_percent":14.349301,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4385,"matched_functions_percent":33.516777,"complete_code":630628,"complete_code_percent":14.448184,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4399}},{"timestamp":"2026-08-07T03:48:41Z","commit_sha":"5aceb364b898226efcc8ae0a7760692821e5b326","commit_message":"Match five in code1_0017; a pointer parameter type fixes argument order\n\ncode1_0017 goes 11 -> 16 of 25. Two prototype corrections did all the work:\n\n* func_0015f660 returns s32, not void. Three of these functions branch on its\n  result, which a void prototype makes inexpressible. Widening it changed no\n  other function in the file (measured: 11 MATCH before and after).\n* func_001029a0's second parameter is a POINTER, not an s32. This is the\n  interesting one: with `s32` and a `(s32)&sp1C` cast, b210 materialises the\n  buffer address into $a1 BEFORE the constant in $a0, and retail does the\n  reverse (nd 6). Declaring the parameter `void *` and passing `&sp1C`\n  unqualified reorders the two argument materialisations and matches. Naming\n  the address in a local and passing it through a pointer variable both stay\n  at nd 6 - the fix is the callee's declared type, not the call site.\n\nThat is a new lever worth remembering: when a call's argument setup order is\none or two words off and one argument is an address, check whether the callee\nparameter is declared as an integer.\n\nNot matched: func_00178870 (nd 46) and func_003146f0 in y_fclCombineDraw,\nwhich is already parked with a better body than the reconstruction attempted\nhere.\n\nverify: first-party MATCH 3773 -> 3778 of 4798 (78.7%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 32 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.442883,"total_code":4364768,"matched_code":626084,"matched_code_percent":14.344038,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4382,"matched_functions_percent":33.493847,"complete_code":630400,"complete_code_percent":14.442921,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4396}},{"timestamp":"2026-08-07T03:35:10Z","commit_sha":"4e3b5804d2a03af3e149c3ddf7adcf20735d8503","commit_message":"Match four small functions across code1_0010/0011/0015/0016\n\nNone of these needed a pragma; all four are plain -O2 with retail's own delay\nslots. What they needed was the right declarations and, in one case, the right\naddressing spelling.\n\n* func_001002c0 - two func_00440b68 calls with different arities (the\n  old-style prototype in the file already allows that) around func_00100230.\n* func_001105b0 - func_001104d0's first argument is the caller's own arg0,\n  passed through in $a0 without a move, which the disassembly only shows by\n  the ABSENCE of an instruction.\n* func_001560f0 - null guard, cache *(arg0+0x38), assert, store.\n* func_0016eaa0 - two levers at once: the three floats are one E9F0Vec3\n  assignment because retail loads all three before storing any, and the\n  scaled index must be named in an s32 local with the base added TO it so the\n  final addu comes out `index + base` as retail has it. Folding the multiply\n  into the pointer expression emits `base + index` and leaves exactly one\n  differing word (nd 1).\n\nAlso removes a func_00278c60 forward declaration added in error to\nitfMesManager.c: the real definition later in the file has the same signature,\nand the duplicate broke the whole translation unit (85 COMPILE_ERRORs). Caught\nby the marker-census diff before commit.\n\nverify: first-party MATCH 3769 -> 3773 of 4798 (78.6%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 32 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.431754,"total_code":4364780,"matched_code":625600,"matched_code_percent":14.33291,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4377,"matched_functions_percent":33.455627,"complete_code":629916,"complete_code_percent":14.431792,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4391}},{"timestamp":"2026-08-07T03:17:58Z","commit_sha":"b7a6f05e826ba7c1fd9582c421bbd9733e99d98d","commit_message":"Match sdkPak2 func_00468a50, a fallthrough state machine\n\njtbl_007566D0 decodes to a 0..6 state machine where 1->2->3->5->6 fall through\nand case 4 plus the out-of-range default just re-run the loop test. Three\nfurther things were needed on top of the case order, each measured:\n\n* A do/while, not a while. Retail knows D_00922980 is a static array address\n  and enters the switch at the top; the guarded form emits an initial branch\n  to the bottom test (nd 252 -> 177).\n* Gotos so each failure path's `p = NULL` lands out of line after its own case\n  body, where retail places it. Written as a plain `if (...) { p = NULL;\n  break; }` b210 inlines it and everything after shifts (nd 177 -> 165).\n* NOT naming the *(*(p + 0x21C) + 4) load in a local. Retail stores it to\n  +0xC and then RELOADS it for the size computation; a named temp CSEs the two\n  loads away (nd 165 -> 0).\n\nThe size computation itself is `(v * 4 + 0x7FF) / 0x800` - the first 0x7FF is\na round-up in the source and the second one the compiler's signed-divide bias\nfixup, which is why the disassembly appears to add it twice.\n\nverify: first-party MATCH 3768 -> 3769 of 4798 (78.6%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 32 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.424893,"total_code":4364804,"matched_code":625304,"matched_code_percent":14.32605,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4373,"matched_functions_percent":33.425053,"complete_code":629620,"complete_code_percent":14.4249325,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4387}},{"timestamp":"2026-08-07T03:02:48Z","commit_sha":"5f340abc26fcf5394d73ac46060c464fd4fc6440","commit_message":"Park y_list func_002e6b20 at nd 159 with both switch tables decoded\n\nA qsort-style comparator. Both halves select a per-entry field through the\nsame 11-entry switch on *(base + 4); jtbl_00748FE0 and jtbl_00748FB0 decode\nidentically with tools/jtbl.py: cases 0/2/7/8 take offset 0x14, cases 1/5/6/10\ntake 0xA4, and cases 3/4/9 share the out-of-range default, which also takes\n0x14 - so retail itself emits the first and third blocks as byte-identical\nduplicates, which is why the naive \"three distinct cases\" reading of the\ndisassembly is wrong.\n\nThe body compiles to exactly retail's 356-byte object with every instruction\nand the whole block layout in place. The entire nd 159 is one register of\nallocator shift: retail holds the two indices in $a2/$v1 and the selector in\n$v0, b210 uses $a3/$a1 and $v1. Measured identical at nd 159: swapping the two\nindex loads, declaring the indices last, casting the comparison through\n(s32)(u16). s32 indices (nd 197), inlining the second load (nd 251) and\nloading the base first (nd 162) are all worse.\n\nAlso surveyed and left alone: evtMain func_002898b0, whose table decodes fine\nbut whose saved-register assignment runs the opposite way from retail\n($s3..$s0 for the parameters and $s4 for the call result, versus b210's\n$s4..$s1 and $s0) and does not follow declaration order - reordering moved it\nnd 372 -> 370.\n\nverify: first-party MATCH 3768 of 4798 (78.5%) unchanged, no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 32 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.415441,"total_code":4364808,"matched_code":624892,"matched_code_percent":14.316598,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4372,"matched_functions_percent":33.41741,"complete_code":629208,"complete_code_percent":14.415479,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4386}},{"timestamp":"2026-08-07T02:46:28Z","commit_sha":"83212eb60a0a6971fa9a11c6088cd16a0defdcf7","commit_message":"Match nEntry func_002a2420; widen the func_00451fc0 init-callback signature\n\nnEntry.c is now 3/3. jtbl_007486C0 decodes to a 0/1/2/3/5/6 state machine with\ncase 4 and the out-of-range default both falling to the shared `return 0`;\ndeclaring the labels in that object order reproduces the table.\n\nThe blocker was a callback signature, not codegen. func_002a2420 leaves 0 or\n-1 in $v0, but the file declared it `void` because it is passed to\nfunc_00451fc0 as an `init` callback that had been typed `void (*)(u8 *)`.\nWidening the callback parameter to `s32 (*)(u8 *)` - and with it\nfunc_002a1f20, the other callback passed through the same slot - makes the\nreal return type expressible. func_002a2650, which passes both callbacks, is\nunaffected and still matches.\n\nAlso adds curated symbol D_00764630 (gp-0x4AC0) usage; the symbol already\nexisted in symbols_recovered.\n\nverify: first-party MATCH 3767 -> 3768 of 4798 (78.5%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 31 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.415441,"total_code":4364808,"matched_code":624892,"matched_code_percent":14.316598,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4372,"matched_functions_percent":33.41741,"complete_code":629208,"complete_code_percent":14.415479,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4386}},{"timestamp":"2026-08-07T02:30:52Z","commit_sha":"ae48b3608519428f259363693b1fd176afc4b65e","commit_message":"Park effPolygonTrack func_00493080 at nd 3 with its decoded case order\n\njtbl_007568A0 has eight dense entries: 1/2/4/7 pair func_00487650 with a\nper-mode call, 5 and 6 call directly, and 0/3 share the out-of-range assert.\nDeclaring the labels in that object order plus using the file's existing\n`(u8 *, u16, s32 *)` prototype (the s32 second parameter I first assumed cost\na redeclaration error, and the u16 removes the mask from the switch head)\nbrings this from unwritten to nd 3, obj 376 in a 384-byte window.\n\nThe whole residual is one register: retail holds the masked switch value in\n$a2 where b210 uses $v0. Naming it in a u32 local, masking explicitly, and\nboth together all measure nd 3; schedule on is far worse (nd 186).\n\nSurveyed but not attempted: cldDayChange func_00266690 and sdkPak2\nfunc_00468a50. Both decode cleanly with jtbl.py but their bodies are\nadda.s/madd.s/msub.s FPU-accumulator math and a fallthrough state machine\nwith a signed-divide-by-2048 idiom respectively - real reverse engineering\nrather than case-order recovery.\n\nverify: first-party MATCH 3767 of 4798 (78.5%) unchanged, no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 31 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.404522,"total_code":4364812,"matched_code":624416,"matched_code_percent":14.305679,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4371,"matched_functions_percent":33.409767,"complete_code":628732,"complete_code_percent":14.404561,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4385}},{"timestamp":"2026-08-07T02:17:19Z","commit_sha":"3f580889d9e15347ebd36e03a368a4c6ecf84d0d","commit_message":"Match cmpSkill func_0013ac30; widen func_0023d8e0's second parameter to s32\n\njtbl_007469C0 has twenty dense entries mapping index+1 to 0x2B..0x32, with\n9-19 sharing 0x33 and index 0 returning -1; anything >= 0x14 hits the assert.\nDeclaring the labels in that object order is what reproduces the table,\nbecause b210 lays case bodies out in declaration order.\n\nThe interesting part is the prototype. cmpSkill.c declared\n`s16 func_0023d8e0(void *, s16)`, and a note in the file already suspected the\nsecond parameter was really s32. This function proves it: retail passes arg0\nwith a plain `move $a1,$a0` and then masks the COPY, where the s16 prototype\nforced a dsll32/dsra32 sign-extension pair and shifted the entire body\n(nd 177 with the correct case order otherwise in place). Widening the\nparameter matches this function and regresses none of the ten already matching\nin the file - measured both ways with a scoped verify.\n\nverify: first-party MATCH 3766 -> 3767 of 4798 (78.5%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 30 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.404522,"total_code":4364812,"matched_code":624416,"matched_code_percent":14.305679,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4371,"matched_functions_percent":33.409767,"complete_code":628732,"complete_code_percent":14.404561,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4385}},{"timestamp":"2026-08-07T02:01:50Z","commit_sha":"14b6428c3b03b2f469055f8bdc0759360abeec20","commit_message":"Match btlShuffleDraw func_003764b0 from its decoded table; park itfMesManager func_002782c0\n\nBoth came out of the tools/jtbl.py workflow added last commit.\n\nfunc_003764b0: jtbl_007529D0 has ten dense entries of which only case 6 has a\nbody; 0-5 and 7-9 fall straight to the epilogue and >= 10 hits an assert. The\nempty cases must still be listed or b210 emits a compare chain instead of the\ntable, and `default` is declared before them because b210 lays case bodies out\nin declaration order. The parameter list is interleaved (u8*, s32, f32, u8*),\nnot grouped - the float arrives in $f12 between the second and third integer\nargument, and the grouped spelling costs nd 8.\n\nfunc_002782c0 is parked at nd 10 (obj 388 in a 400-byte window). jtbl_00748120\nhas eight dense entries each with its own body; case 1 calls func_002784e0\nwith $a0/$a1/$a2 still holding the entry arguments, so it takes all three.\nThe residual is case 0's argument order: retail materialises $a0 and $a1\nbefore the sp+0x30 buffer address in $a2 and b210 emits the addiu first.\nNaming the buffer in an int local and taking &sp30[0] both measure nd 10;\nschedule on is far worse (nd 203). Four duplicate forward declarations in\nitfMesManager.c that conflicted with the real prototypes were removed.\n\nAlso re-derived cmmMisc func_00247cb0 from jtbl_00747DA0 and reverted: the\ncommitted body already sits at nd 8 and the fresh reconstruction measured the\nsame nd 8, so the existing note stands.\n\nverify: first-party MATCH 3765 -> 3766 of 4798 (78.5%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 30 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.398448,"total_code":4364820,"matched_code":624152,"matched_code_percent":14.299604,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4370,"matched_functions_percent":33.402122,"complete_code":628468,"complete_code_percent":14.398485,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4384}},{"timestamp":"2026-08-07T01:41:40Z","commit_sha":"8b322f4c48bc2b9a643fee03a3105048d13d9ed9","commit_message":"Add tools/jtbl.py; match code1_0012 func_00122720 from its decoded table\n\nReading the switch table out of the retail image is the only way to recover a\nswitch's real case order. verify.py masks relocation-owned bytes, so a body\ncan look byte-exact while its .rodata table is permuted, and a decompiler that\nnever resolved the table prints an if-chain in whatever order it guessed.\n\n`python tools/jtbl.py 0x007466C0 6 --func 0x00122720` prints each entry, the\nbyte offset of each target from the function entry (so entries line up against\na disassembly listing), and the distinct targets in ascending address order -\nwhich is both the fallthrough grouping and the order the case bodies occupy in\nthe object.\n\nFor func_00122720 that gave: entry 0 returns 1, entries 1/2/4/5 share one body\nreturning 0, entry 3 returns 2, and anything >= 6 falls through to a default\nof 1. Declaring the labels in that object order matches immediately, because\nb210 lays case bodies out in declaration order. schedule on is wrong here\n(nd 66).\n\nA scan of the remaining first-party INCLUDE_ASM functions for an indirect\n`jr` on a non-$ra register finds 97 more switch dispatchers, concentrated in\ny_fclCombine (11), y_list (9), itfMsgProcedure_Window (6), y_smap (5) and\ndatCalc (4). Their tables can now be decoded the same way.\n\nverify: first-party MATCH 3764 -> 3765 of 4798 (78.5%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 29 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.393551,"total_code":4364832,"matched_code":623940,"matched_code_percent":14.294708,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4369,"matched_functions_percent":33.39448,"complete_code":628256,"complete_code_percent":14.393589,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4383}},{"timestamp":"2026-08-07T01:27:26Z","commit_sha":"239fc3b21a640487d3164a9b6b44ba3f75635b1f","commit_message":"Match code1_003e func_003e4ad0; park func_003e23e0 at nd 10\n\nfunc_003e4ad0 substitutes a default string when its argument is NULL. Retail\nputs that substitution out of line AFTER the call site and branches back, so\nit needs an explicit goto; the natural `if (arg0 == NULL) arg0 = default;`\nform inlines it and overflows the 80-byte window (nd 55, obj 84). schedule on\nis also load-bearing here.\n\nfunc_003e23e0 sums a circular list. The guarded do/while shape - retail tests\nthe head pointer once before the loop with the accumulator load in the beq\ndelay slot, then again at the bottom - reaches retail's exact 68 bytes; a\nplain `while` costs nd 25 and no pragma costs nd 55. The remaining nd 10 is\nthat retail keeps the D_008872E0 + offset base in $v1 where b210 uses $v0,\nplus one extra nop before the jr; naming the base in a local does not\nre-colour it.\n\nAdds curated symbol D_00724870 = 0x00764870 with evidence. recover_symbols\nregenerated: emitted 3768, segment_failures 0.\n\nRe-probed the func_003e3020 / func_003e3070 / func_003e30c0 list-search\nfamily with a goto layout and left them alone: the bodies already committed\nscore nd 20 / 9 / 9 and the goto forms measure nd 20 / 16 / 16, so the\nexisting notes stand.\n\nverify: first-party MATCH 3763 -> 3764 of 4798 (78.4%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 29 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.390854,"total_code":4364844,"matched_code":623824,"matched_code_percent":14.29201,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4368,"matched_functions_percent":33.386837,"complete_code":628140,"complete_code_percent":14.390892,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4382}},{"timestamp":"2026-08-07T01:09:36Z","commit_sha":"c60892130c9e8d1f915500ffa8c41020291ee210","commit_message":"Match five in code1_0046; six more curated gp symbols\n\ncode1_0046 goes 11 -> 16 of 18. Every one of these was blocked on\ndeclarations rather than on codegen: func_00463520 and func_00468fa0 are task\nregistrations, func_0046a2e0 initialises a 0x1F4-entry pool, func_0046a770\nwalks a linked list, and func_00466600 is a two-value dispatch guard. None\nneeded a pragma - retail leaves the jalr and jr delay slots empty here, so\nschedule on makes all of them worse.\n\nTwo shape notes worth keeping:\n\n* func_0046a770's list walk needs an explicit goto loop. Retail tests the\n  cursor at the TOP and puts both early exits out of line; `while (p != NULL)`\n  rotates the test to the bottom (nd 57).\n* func_00466600's `== 0xC || == 8` guard needs the two tests written as\n  separate `goto`s to a shared call label, matching retail's\n  beq-then-bne-then-fallthrough.\n\nSix more curated symbols with evidence: D_00724BF4, D_00724BF8, D_00724BFC,\nD_00724C00, D_00724C04 (the func_0046a2e0 pool descriptor) and D_00724BC8.\nrecover_symbols regenerated: emitted 3767, segment_failures 0.\n\nfunc_004614b0 is parked at nd 69: the call sequence and constants are right\nbut retail holds the D_00887300 table address in $s0 across two indirect\ncalls while b210 rematerialises the lui/%lo pair at each use, so everything\nafter the first call shifts. A local pointer does not force the save.\n\nverify: first-party MATCH 3758 -> 3763 of 4798 (78.4%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 28 preserved\nbodies 0 drift, 554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.3892565,"total_code":4364856,"matched_code":623756,"matched_code_percent":14.290415,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4367,"matched_functions_percent":33.379192,"complete_code":628072,"complete_code_percent":14.389295,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4381}},{"timestamp":"2026-08-07T00:52:07Z","commit_sha":"1c1992daf58314bad8f1b78d02bd01cb189e7c91","commit_message":"Park the code1_003c setter triple at nd 12 with the retail block layout\n\nfunc_003cc010, func_003cc070 and func_003cc0d0 are the same setter with\ndifferent field offsets (writes 0x40/0x3C/0x44, consults 0x58/0x54/0x5C\nthrough the gp-relative offset at gp-0x4648). All three needed a new curated\nsymbol, iGpffffb9b8 = 0x00764aa8, which recover_symbols had never emitted;\nwithout it there was no way to write the body at all.\n\nExplicit gotos reproduce retail's four-block layout, and schedule on plus\nno_branch_likely on take them from nd 54 to nd 12 (obj 88 in a 96-byte\nwindow). The remaining three words are a CSE the source cannot express:\nretail reads the gp offset TWICE in the null path - once into $v1 for the\n0x58 lookup and again into $a1 in the branch delay slot for the store base -\nwhere b210 merges the two reads. Assigning the offset to a local before the\nlookup instead is worse (nd 23), and `volatile` is banned.\n\nverify: first-party MATCH 3758 of 4798 (78.3%) unchanged, no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings (an earlier revision of\nthis change left duplicate `// FUN_` markers above the parked siblings; the\nM001 rule caught it), nd_audit 27 preserved bodies 0 drift, 554 tests OK,\nbuild.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.378233,"total_code":4364892,"matched_code":623280,"matched_code_percent":14.279391,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4362,"matched_functions_percent":33.340977,"complete_code":627596,"complete_code_percent":14.37827,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4376}},{"timestamp":"2026-08-07T00:36:54Z","commit_sha":"b7e311d8b15f83e3fbabf0db0bf181bb6a1f4522","commit_message":"Match six in code1_003c; register six more gp-relative symbols\n\ncode1_003c goes 10 -> 16 of 41. The file's house pattern is now clear: almost\nevery one of these needs `#pragma schedule on` (retail fills the jal, branch\nand jr delay slots throughout) and about half then need\n`#pragma no_branch_likely on` because b210 turns a null test into `beql`.\n\nSpecific findings:\n\n* func_003c38b0 copies four consecutive floats. Retail loads all four before\n  storing any, which only a whole-struct assignment reproduces; per-field\n  assignments interleave lwc1/swc1 (nd 8). Added a local `Vec4f` typedef for\n  it. Its two result blocks also need the goto layout so the zero case lands\n  before the shared return.\n* func_003c5700 returns 1, not its argument - a single `addiu $v0,$zero,1`\n  that the obvious \"return the object\" reading gets wrong.\n* func_003c2c90 and func_003c47c0 sum three sub-costs, each `call + 0xC`.\n\nSix new curated gp symbols with evidence, all in the 0x007647xx cluster that\ncode1_003c uses to index D_008872E0: iGpffffb8d0, iGpffffb8d4, iGpffffb8e0,\niGpffffb8e4, iGpffffb8e8, iGpffffb8f4. recover_symbols regenerated: emitted\n3758, segment_failures 0. Four functions in this file were unreachable purely\nbecause those symbols did not exist.\n\nParked with measured residuals: func_003c47c0 (nd 8, retail interleaves the\n`move $s1,$a0` between the two saved-register stores) and func_003c3e10\n(nd 9, the tail's count/offset register assignment is swapped).\n\nverify: first-party MATCH 3752 -> 3758 of 4798 (78.3%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 0 drift,\n554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.378233,"total_code":4364892,"matched_code":623280,"matched_code_percent":14.279391,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4362,"matched_functions_percent":33.340977,"complete_code":627596,"complete_code_percent":14.37827,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4376}},{"timestamp":"2026-08-07T00:14:04Z","commit_sha":"75603a8f42b9fbd61ae2273e08cbb111372bc734","commit_message":"Match the code1_004b per-type handler-dispatch family\n\nFour near-identical functions (func_004b5340, func_004b5530, func_004b55a0,\nfunc_004b5620) that call an enable predicate through a gp-relative function\npointer, then dispatch through a 0x1C-strided per-type handler table.\n\nThe reusable finding is how the table address has to be spelled. Retail emits\n`lw base` / `addiu base,SUBOFF` / `addu base,index` / `lw 0(base)`. Writing\nthat as one expression makes b210 fold the sub-table offset into the load\ndisplacement AND flip the addu operands to index-first, which is a 10-14 word\nresidual (nd 40-54). Naming the adjusted base and the scaled index in two\nseparate s32 locals reproduces retail exactly:\n\n    tbl = (s32)iGpffffbba0 + 0x14;\n    idx = *(s32 *)(arg0 + 0x2C) * 0x1C;\n    fn  = *(void (**)(u8 *))(tbl + idx);\n\nfunc_004b5530 has a zero sub-table offset and therefore no addiu, which is\nwhy it matched before the other three - a useful control.\n\nAdds three curated gp-relative data symbols with evidence: iGpffffbba0\n(0x00764c90, the table base), iGpffffbba4 (0x00764c94, the predicate), and\niGpffffb460 (0x00764550, needed by func_001f9750). recover_symbols\nregenerated: emitted 3756, segment_failures 0.\n\nverify: first-party MATCH 3748 -> 3752 of 4798 (78.2%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 0 drift,\n554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.365167,"total_code":4364936,"matched_code":622716,"matched_code_percent":14.266326,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4356,"matched_functions_percent":33.295116,"complete_code":627032,"complete_code_percent":14.365205,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4370}},{"timestamp":"2026-08-06T23:54:02Z","commit_sha":"5f5f3523295c3ce1b2ead690b7d44b664e306287","commit_message":"Match three task-registration functions in code1_0012\n\nfunc_001223d0, func_001236e0 and func_00123a10 are the usual \"allocate a task\nslot, install a callback and a context pointer, hand it to the scheduler\"\nshape. Two notes:\n\n* func_001236e0 needed the gp-relative context read named in a local before\n  the callback store. Retail loads it immediately after the allocator returns\n  and stores it second; inlining `D_007242CC` into the store makes b210\n  materialise the function pointer first (nd 11).\n* func_00123a10's two `*(s32 *)(p + 0x1C) = 1` paths are reached by goto so\n  the assignment is emitted once, out of line, as retail does.\n\nfunc_00123850 is parked at nd 14: identical instructions and an identical\n104-byte object, but retail stores the masked value and loads the +4 field\nbefore sign-extending the second call argument while b210 materialises the\ndsll32/dsra32 pair first. Naming either argument in a local does not move it;\nschedule on is much worse.\n\nfunc_00121b20 and func_00122720 are left on INCLUDE_ASM: the first needs a\ndata symbol at 0x00762d48 that recover_symbols has never emitted, the second\ndispatches through jtbl_007466C0 and needs the jump table decoded before the\ncase order can be reproduced.\n\nverify: first-party MATCH 3745 -> 3748 of 4798 (78.1%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 0 drift,\n554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.354484,"total_code":4364952,"matched_code":622252,"matched_code_percent":14.255643,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4352,"matched_functions_percent":33.26454,"complete_code":626568,"complete_code_percent":14.354523,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4366}},{"timestamp":"2026-08-06T23:39:16Z","commit_sha":"dffa155fa284a1d440c4f1c0a5bd5599f1bc6cad","commit_message":"Match seven in code1_001f, including two u16-mask CSE cases\n\ncode1_001f goes 28 -> 35 of 37. Three findings worth keeping:\n\n* SPELL A REPEATED MASK TWO DIFFERENT WAYS TO DEFEAT CSE. func_001f0b90 and\n  func_001f0bf0 mask the same u16 counter twice per iteration - once for the\n  array index and once for the loop bound - and retail emits both `andi`\n  instructions. Writing both as `i & 0xFFFF` lets b210 fold them into one and\n  the object comes out a word short (nd 57/60). Writing the index as\n  `(u16)i` and the bound as `i & 0xFFFF` produces both and matches. This is\n  the honest alternative to `#pragma opt_common_subs off`, which also matches\n  but would need a waiver.\n* GOTO THE RESULT BLOCKS TO FIX THEIR ORDER. func_001f5680 has a `return -1`\n  and a `return v + 0x11` that retail lays out in that order; plain returns\n  emit them the other way round (nd 8).\n* Branch polarity: func_001f9080's `0x170` field test is `==`, not `!=` -\n  a single row, and the only thing between nd 1 and a match.\n\nfunc_001f6bf0 is parked at nd 9: every instruction matches and the object is\nexactly its 80-byte window, but retail materialises the shift constant before\nthe branch into the loop test and b210 puts it after. Inline `1 << i`, a\nhoisted `one` local and an explicit goto loop all measure nd 9.\n\nverify: first-party MATCH 3738 -> 3745 of 4798 (78.1%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 0 drift,\n554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.348121,"total_code":4364964,"matched_code":621976,"matched_code_percent":14.249282,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4349,"matched_functions_percent":33.24161,"complete_code":626292,"complete_code_percent":14.34816,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4363}},{"timestamp":"2026-08-06T23:20:57Z","commit_sha":"2fd942a130815bf8478c3ff90ee0f43ecf2e7cd1","commit_message":"Complete code1_0029; match five more in code1_002b\n\ncode1_0029.c is now 17/17. All seven were straightforward once the callee\ndeclarations existed: reading the retail disassembly directly and writing the\nobvious C matched every one first or second try. The declarations are the\nwhole trick - draft_probe scored all of them COMPILE_ERROR purely because the\ndestination file never declared func_00452490, func_00452080, func_0045af60,\nfunc_0045a9a0, func_0045aac0, func_00442088, func_0045aeb0 or func_001228a0.\n\ncode1_002b goes 9 -> 14. Two things worth recording from it:\n* EE mwcc passes integer arguments 5-8 in $t0-$t3, not on the stack.\n  func_002bc7a0 and func_002bc7f0 both build a six- and seven-argument call\n  that reads as garbage until you count $t0/$t1/$t2 as arguments.\n* func_002b3230 is a comparator: retail's `sltu` pair plus `negu` is exactly\n  `if (x < y) return 1; return -(s32)(y < x);` with an unsigned callee return.\n\ncode1_003b func_003bd610 and func_003be8a0 are re-parked at nd 37 with the\ncorrect body. Their residual is a conditional move: retail folds the final\n`r ? arg0 : 0` into `movz $s1,$zero,$v0` where b210 emits `beql` + `move`.\nno_branch_likely makes it worse (nd 48-56), `#pragma conditional_move on`\ndoes nothing, schedule does nothing.\n\ntools/try_bodies.py now swallows a whole `#ifdef NON_MATCHING` block when it\nsplices, so parked functions can be re-measured; previously every variant on\na parked function scored COMPILE_ERROR from the dangling `#else`.\n\nverify: first-party MATCH 3726 -> 3738 of 4798 (77.9%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 0 drift,\n554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.334244,"total_code":4365004,"matched_code":621376,"matched_code_percent":14.235406,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4342,"matched_functions_percent":33.188107,"complete_code":625692,"complete_code_percent":14.334282,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4356}},{"timestamp":"2026-08-06T22:55:39Z","commit_sha":"e948c7d89cba2d4da1bb8268efd57ffab38e37ed","commit_message":"Match the code1_0039 guard pair; document the 0039A0xx slot-search family\n\nfunc_003992b0 and func_003993e0 needed three things at once, and the\ncombination generalises: the m2c draft had dropped retail's first argument to\nfunc_003df360 (it is passed through in $a0 untouched), retail lays the three\nexits out of line in the order [return arg0][return 0][call + jump back]\nwhich only an explicit goto layout reproduces (the nested-if spelling merges\nthem, nd 58), and then schedule on plus no_branch_likely on take nd 35 to 0.\n\nfunc_0039a030 is parked as the template for its family: about fifteen\nfunctions from 0039A0xx to 0039A8xx all load a 64-byte-strided table through\nthe gp-relative pointer at gp-0x4A20 (iGpffffb5e0 = 0x007646d0), scan at most\ntwo entries for a type code at offset 0x20, fall back to a NULL slot, then do\none small thing to it. Addressing, the (i + 1) & 0xFF counter, the slti 2\nbound and the whole prologue are byte-exact; the residual nd 46 is that\nretail reaches the store through an out-of-line b and duplicates the\nneg.s into both delay slots where b210 computes it once and falls through.\nSix loop spellings measured identical.\n\nAlso adds the missing func_003df360 / func_00399b10 / func_00399b80 /\niGpffffb5e0 declarations to code1_0039.c, which unblocks draft scoring for\nthe rest of the file.\n\nverify: first-party MATCH 3724 -> 3726 of 4798 (77.7%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 0 drift,\n554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.307904,"total_code":4365044,"matched_code":620232,"matched_code_percent":14.209066,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4330,"matched_functions_percent":33.096386,"complete_code":624548,"complete_code_percent":14.307943,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4344}},{"timestamp":"2026-08-06T22:31:22Z","commit_sha":"1036643e375a17d300c45203f9a0494df3a1e7df","commit_message":"Match 4 more first-party functions from ranked m2c drafts\n\nAdds two levers to the playbook, both found by scoring candidate spellings\nwith tools/try_bodies.py against a fresh tools/draft_probe.py --knobs sweep\nof every ASM function under 256 bytes that has a clean draft (285 of them;\nzero matched outright, but the nd ranking is what pays).\n\n* WALK THE PARAMETER, NOT A FRESH LOCAL. code1_0011 func_00110600 emitted\n  the exact retail instruction sequence with all three live values rotated\n  through the wrong registers (nd 12). Assigning back into  instead of\n  a  local keeps it in $a0 for the whole loop and the function matches.\n* EXPLICIT GOTO LAYOUT FOR OUT-OF-LINE RESULT BLOCKS. code1_0045\n  func_00454460 places  and  out of line after the main\n  body; every nested-if and result-variable spelling merges them into one\n  epilogue two words short (nd 24). Naming the blocks with gotos in retail's\n  physical order matches.\n\nAlso matched code1_0027 func_0027a710 and code1_0035 func_00359340 (draft\nloop shape plus the missing callee declarations).\n\nNew parked bodies with measured residuals: code1_003c func_003cb820 (nd 8,\ncall-argument setup order; the draft was missing retail's ignored second\nparameter, which put the object pointer in $a1 instead of $a2), code1_0041\nfunc_0041f178 and func_0041f1c0 (nd 46, b210 lowers  as\ndsll32/dsrl32 where retail materialises the constant and ANDs), code1_0014\nfunc_0014a190 (nd 26, boolean-result tail layout), code1_003e func_003e5990\n(nd 43, entry-guard materialisation; the draft advanced an s32* cursor by\nfour elements instead of one).\n\nverify: first-party MATCH 3720 -> 3724 of 4798 (77.6%), no regressions, no\nlost markers, no MISMATCH. decomp_lint 0 findings, nd_audit 0 drift,\n554 tests OK, build.py both sha1s unchanged.","measures":{"fuzzy_match_percent":14.30293,"total_code":4365052,"matched_code":620016,"matched_code_percent":14.204092,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4328,"matched_functions_percent":33.081097,"complete_code":624332,"complete_code_percent":14.302967,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4342}},{"timestamp":"2026-08-06T03:20:21Z","commit_sha":"272424fe7c95f7fb6f05ae1fc41f9092f4a2adae","commit_message":"Match first-party twin ports","measures":{"fuzzy_match_percent":14.253473,"total_code":4365184,"matched_code":617876,"matched_code_percent":14.154638,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4308,"matched_functions_percent":32.92823,"complete_code":622192,"complete_code_percent":14.253512,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4322}},{"timestamp":"2026-08-06T01:07:40Z","commit_sha":"4f2861d31ca51752df9f8c0ede744f23dbe4876e","commit_message":"Match promoted 001eb320 with typed call alias","measures":{"fuzzy_match_percent":14.10834,"total_code":4365576,"matched_code":611596,"matched_code_percent":14.009515,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4243,"matched_functions_percent":32.4314,"complete_code":615912,"complete_code_percent":14.108379,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4257}},{"timestamp":"2026-08-06T00:54:17Z","commit_sha":"eaca94334c5cf5c7f193cc82736f7f90a41af43e","commit_message":"Match four promoted leaf routines","measures":{"fuzzy_match_percent":14.106508,"total_code":4365576,"matched_code":611516,"matched_code_percent":14.007682,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4242,"matched_functions_percent":32.423756,"complete_code":615832,"complete_code_percent":14.106546,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4256}},{"timestamp":"2026-08-06T00:32:04Z","commit_sha":"7f2bbcdc023a2912caacca7af757eb15ee05255e","commit_message":"Match two 0022 jump-table routines","measures":{"fuzzy_match_percent":14.099937,"total_code":4365596,"matched_code":611232,"matched_code_percent":14.001112,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4238,"matched_functions_percent":32.39318,"complete_code":615548,"complete_code_percent":14.099977,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4252}},{"timestamp":"2026-08-05T23:50:31Z","commit_sha":"6d71876aafb591df2b990acd2366cd99ce4537fd","commit_message":"Two more matches: the CSE split also fixes an inflated frame\n\nfunc_00484790 and func_004847e0 are release wrappers that read a pointer field, call\nthrough the jump table, then zero three fields including the one they read. Two defects\nstacked: the table called as a bare function, and the read/write pair letting b210 CSE the\n&arg0[0x18] address into a callee-saved register. The second one is more expensive than it\nlooks - holding both the base and the hoisted address needs TWO callee-saved registers, so\nthe frame grows to 0x30 where retail has 0x20 and the whole prologue and epilogue differ.\nReading through the array index and writing through the cast-and-offset fixes the frame\nand the body together.\n\nAlso: applying the sibling's offsets to func_004847e0 by copy-paste scored nd 4 with four\ndiffering words that were all just 0x10/0x14/0x18 where the function wants 0x20/0x24/0x28.\nA residual that small on a shape known to match exactly is worth re-reading as a\ntranscription error before treating it as a compiler difference.\n\nSwept the rest of the jump-table family with both fixes and three brackets: nothing more\ncloses. func_002236c0 (nd 35) and func_00223ee0 (nd 41) are the only two left that even\ncompile; the other 35 reference symbols their files never declare.\n\nFirst-party 3632 MATCH / 1166 ASM, 0 mismatch, lint 0/320, 554 tests, nd_audit clean,\nimage and SLUS sha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":14.095489,"total_code":4365612,"matched_code":611040,"matched_code_percent":13.996664,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4236,"matched_functions_percent":32.377895,"complete_code":615356,"complete_code_percent":14.095527,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4250}},{"timestamp":"2026-08-05T23:16:03Z","commit_sha":"da6d27d0a1a97234e0a7fa07cd538565ba5d4afb","commit_message":"Audit the nd numbers in floor notes; two were wrong\n\nA note saying `nd N` is the least verifiable claim in this repo: the body it describes\nlives inside `#ifdef NON_MATCHING`, so the gate never compiles it and nothing notices when\nthe number stops being true. tools/nd_audit.py splices each preserved body over its own\nINCLUDE_ASM, measures it, and compares against the note.\n\nTwo were wrong, both the same mistake - recording a number without measuring the function\nit is attached to:\n\n  * func_003c3f20 was given its SIBLING's number. Four functions share a shape, one was\n    measured at nd 43, and the note was copied to the rest. The one in a different\n    translation unit actually scores nd 102 - same source, different declarations.\n  * the five-function code1_0039.c cluster claimed nd 17, which does not reproduce at all.\n    Checked three pragma environments to be sure it was not the scope repair that moved it\n    (-O2 baseline, a local -O2 inside an -O3 region, and a local -O2 with no surrounding\n    span): all three give nd 36, so the 17 was wrong when written.\n\nBoth notes now carry the measured value and say why the old one is gone.\n\nThe tool's first version was worse than no tool: reading the last integer anywhere in the\nprose flagged 49 stale bodies out of 19, because notes routinely quote alternatives and\nbefore/after pairs. Only a `nd N` in the note's CLOSING line counts, and the two notes that\nlegitimately end by quoting a rejected spelling's cost now state `nd N as committed`\nexplicitly. 12 tests pin the extractor, since that is where the false positives lived.\n\nAlso probed func_00454460 (three writes to one field, nd 29 - the two-spelling CSE trick\ndoes not extend to three) and re-probed the code1_0039.c cluster with the new levers\n(nd 36, no improvement).\n\nFirst-party 3630 MATCH / 1168 ASM unchanged, 0 mismatch, lint 0/320, 554 tests, image and\nSLUS sha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":14.091981,"total_code":4365620,"matched_code":610888,"matched_code_percent":13.993156,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4234,"matched_functions_percent":32.362606,"complete_code":615204,"complete_code_percent":14.092019,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4248}},{"timestamp":"2026-08-05T22:44:52Z","commit_sha":"6e395a4a9568106a5c247fdd56560c4e6435a27e","commit_message":"Two more matches; the loop-exit nop looks like a real b210 behaviour\n\nfunc_0019d4e0 and func_003c5760 matched, both on levers established earlier this session:\nthe read/write spelling split that stops b210 CSEing a field address into a second\ncallee-saved register, and the positive-test-plus-out-of-line-body goto graph. func_003c5760\nneeded the second one applied FIVE times - written as one `if (a || b || c || d || e)` the\nlast test is inverted and the call goes inline (nd 22); each test needs its own\n`if (...) goto call;`.\n\nTried to automate the transformations rather than keep doing them by hand, and it does not\nwork: a sweep applying the jump-table fix, the doubled-narrowing fix and the read/write\nsplit to every draft closes NOTHING on its own (0 from 214 transformable drafts). Worth\nrecording as a negative result - these classes co-occur with per-function defects, so the\nsweep is only useful for producing a better starting point, not for finding matches. The\nfirst version of that sweep also silently fired on nothing at all because its regex did not\ntolerate m2c's `*(T *)((u8 *)(p) + K)` wrapper cast; 90 'transformable' drafts were really 0.\n\nfunc_003e3370 preserved at nd 22 with what is probably a genuine compiler behaviour named:\nevery instruction matches but retail has one extra nop between the loop's exit branch and\nthe move that materialises the return value, so the epilogue slides a word. This is the\nSECOND function in code1_003e.c with that artifact - func_003e3020 has two consecutive nops\nat its own loop exit - and do-while, while and an explicit goto loop all score nd 22-23, so\nit is not a source shape.\n\nFirst-party 3630 MATCH / 1168 ASM, 0 mismatch, lint 0/320, 542 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":14.091981,"total_code":4365620,"matched_code":610888,"matched_code_percent":13.993156,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4234,"matched_functions_percent":32.362606,"complete_code":615204,"complete_code_percent":14.092019,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4248}},{"timestamp":"2026-08-05T22:01:23Z","commit_sha":"6c1ff84e604584d6e93d5b07a4e1484329c9916e","commit_message":"Two more matches: a hidden first argument and a doubled sign-extension\n\nfunc_003d3a90 is the useful one. The draft passed (0, 0x3F800000, 0x3F800000) as three\nintegers where retail has two floats in $f12/$f13 - so the callee's floats were being sent\nas raw bit patterns. Typing them f32 got it to nd 1, and the last word was the integer 0\nlanding in $a0 where retail has $a1. No three-argument prototype produces that: MWCC gives\nthe first integer $a0 regardless of where the floats sit, so (f32,s32,f32) and\n(f32,f32,s32) both score nd 1. Retail leaves $a0 holding this function's OWN arg0 at the\njal, which means there is a fourth argument and the real signature is\n(ptr, s32, f32, f32). Passing arg0 through closes it.\n\nfunc_0025d530 was the `(s64)(x << 0x30) >> 0x30` idiom applied twice - m2c wrapped an\nalready-narrowed value, so the object carried four dsll32/dsra32 pairs where retail has\none. Writing it as a single (s16) cast is exact.\n\nTwo left with the cause named rather than a floor claimed:\n  * func_00454460 at nd 30 - three writes to the same field let b210 CSE the address into\n    $a1 (addiu $a1, $a0, 0x28 then sw at 0) where retail writes 0x28($a0) every time. The\n    two-spelling trick that fixed func_00355460 is not enough for three writes.\n  * func_0014a190 at nd 26 - typing the parameters s32 instead of u16 removed the two\n    andi masks, but retail fills the bne delay slot with the return value and schedule on\n    makes it worse (nd 50).\n\nFirst-party 3628 MATCH / 1170 ASM, 0 mismatch, lint 0/320, 542 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":14.086849,"total_code":4365620,"matched_code":610664,"matched_code_percent":13.988024,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4232,"matched_functions_percent":32.34732,"complete_code":614980,"complete_code_percent":14.086888,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4246}},{"timestamp":"2026-08-05T21:26:14Z","commit_sha":"f7ae155bff3de05f36173fe1ccdac53bd6a9f737","commit_message":"Four more matches: a CSE-breaking spelling rule and block order in a search loop\n\nThe new lever is worth stating plainly, because it is the opposite of the usual advice:\nthe READ and the WRITE of the same struct field must be spelled DIFFERENTLY. Written\nidentically, b210 CSEs the address into a callee-saved register (addiu $s0, $v1, 0x40 then\nsw at offset 0) and leaves the struct pointer in a caller-saved one; retail keeps the\nPOINTER in $s0 and stores at 0x40($s0). Reading through `((s32 *)p)[16]` and writing\nthrough `*(s32 *)(p + 0x40)` breaks it. That closed func_00355460 and its two siblings\nfunc_0035aec0 and func_0035be70 outright.\n\nfunc_00470d10 closed on block ORDER: retail puts the key comparison at the END of the\nfunction and the pointer advance before it, so the search has to be written as\n`goto compare; advance: ...; compare: if (...) goto advance;`. The natural\ncompare-then-advance loop scores nd 25 with the same instructions in a different order.\n\nfunc_0041f1c0 is left at nd 27 with the cause named: retail materialises the 0x0FFFFFFF\nmask as lui 0xfff / ori 0xffff / and, while b210 uses the 64-bit dsll32/dsrl32 pair for it\nunder every spelling tried (~0xF0000000, the U suffix, an explicit u32 cast, a named\nlocal). Its call also passes the struct pointer in $a3 with $a0 and $a2 untouched, which\nlooks like a four-argument call, but supplying four arguments makes it worse (nd 38) while\nthe mask is still wrong - so that reading is unconfirmed and recorded as such.\n\nFirst-party 3626 MATCH / 1172 ASM, 0 mismatch, lint 0/320, 542 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":14.083421,"total_code":4365632,"matched_code":610516,"matched_code_percent":13.984596,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4230,"matched_functions_percent":32.33203,"complete_code":614832,"complete_code_percent":14.083459,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4244}},{"timestamp":"2026-08-05T20:40:18Z","commit_sha":"a06b0329385a09c27a02d86dba06a3d5892d8635","commit_message":"Three more matches; func_003cf9b0 to nd 2 on block ORDER alone\n\nfunc_0015d270, func_00176a50 and func_004a5de0 matched. The defects were, again, ones\nalready in the notes: a jump table called as a bare function, a loop m2c wrote top-tested\nwhere retail rotates it, and an s32 table element the draft read as u8 (lbu where retail\nhas lw).\n\nSwept the jump-table class properly rather than one at a time: 39 drafts call\n`jtbl_xxxxxxxx(a)` instead of `(*jtbl_xxxxxxxx)(a)`, which is an implicit call to the table\nSYMBOL - it compiles, links and runs wrong. Fixing the call form and trying three pragma\nbrackets on each closed one more; the remaining 38 have further defects on top, but the\ncall form is now right to start from.\n\nfunc_003cf9b0 is the interesting one, preserved at nd 2 of 32 words. schedule on plus\nno_branch_likely on handles the delay slots and the plain bne/bnez. Everything after that\nwas the shape of FOUR un-merged `return NULL` blocks, whose order is observable in the\nobject: reaching the arg2 == 0 case through a goto is what stops case 1's null return from\npushing case 2's body down - the plain `if (arg2 != 0) {...} return NULL;` inside the case\ncosts nd 19 and `break` into a shared tail costs nd 26. The last two words are two swapped\nbranch targets, and neither placing the label inside the switch nor at the end of the\nfunction reverses them.\n\nfunc_00110600 improved 22 -> 21 with the table element typed correctly but is still a\nregister-allocation residual; not committed.\n\nFirst-party 3622 MATCH / 1176 ASM, 0 mismatch, lint 0/320, 542 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":14.075725,"total_code":4365632,"matched_code":610180,"matched_code_percent":13.9769,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4226,"matched_functions_percent":32.30146,"complete_code":614496,"complete_code_percent":14.075762,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4240}},{"timestamp":"2026-08-05T20:10:38Z","commit_sha":"dae4fc4a603edbb0ec1eab7d21b4dc46b688bd4d","commit_message":"Twelve matches from a knob-bracket draft sweep and four m2c defect classes\n\ndraft_probe grew a --knobs mode: each draft is now measured under four pragma brackets\ninstead of plain -O2. The pair that matters is `schedule on` plus `no_branch_likely on` -\nschedule fills retail's branch and jal delay slots, and b210 then reaches for beql/bnel\nwhere retail has plain bne/bnez, so the two travel together. On func_003e4880 that is\nnd 65 plain, nd 26 with schedule alone, nd 0 with both. It found func_0039aa50 and\nfunc_003e4880/48d0 (strupr/strlwr, a pair) outright.\n\nA new source lever, twice: retail tests POSITIVELY and places the if-body out of line\nafter the return path, jumping back to it. The plain `if (cond) { body; } return x;` form\ncompiles inline with a negated skip - nd 31 on func_003e59e0, nd 23 on func_003e44b0 - and\nan explicit goto graph is exact. That is the same shape the switch-chain note describes,\nreached from an if rather than a switch.\n\nThen six functions closed on m2c defect classes already in the notes, which is the point of\nhaving written them down:\n  * `s32 *` advanced by a BYTE offset - func_002121b0, func_00218500, func_00218420 all\n    walked 4x too far and still compiled;\n  * a missing argument - func_00202e00's memcpy-like call had the size in $a1 where retail\n    has it in $a2, so the middle parameter was dropped; func_003cb820 had the same defect\n    in its own signature;\n  * a signed store of 0x8000 - `*(s16 *)p = 0x8000` gives addiu -0x8000 where retail has\n    ori 0x8000, so the store has to go through u16;\n  * `jtbl_008873EC(x)` instead of `(*jtbl_008873EC)(x)` - func_004b18e0;\n  * a load sunk below two stores - func_004b0fd0 and func_004b1030 need the inner pointer\n    hoisted into a local.\n\nfunc_003cb820 stops at nd 8 (2 words): retail materialises argument 1 before argument 3 and\nthree spellings including the array-index form do not move it.\n\nFirst-party 3619 MATCH / 1179 ASM, 0 mismatch, lint 0/320, 542 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":14.069599,"total_code":4365656,"matched_code":609916,"matched_code_percent":13.970776,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4223,"matched_functions_percent":32.27853,"complete_code":614232,"complete_code_percent":14.069637,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4237}},{"timestamp":"2026-08-05T19:20:52Z","commit_sha":"4dddbdaa692997945c6dbb0e77f2308d4021cf74","commit_message":"Reconstruct func_00390230 to nd 6; the residual is a reachable epilogue, not a floor\n\nThis is the best lead the scope repair uncovered: 16 of 19 words byte-exact, and the whole\nresidual is the last two - retail folds `addiu $sp, $sp, 0x30` into the jr $ra delay slot\nwhere b210 emits addiu, jr, nop.\n\nWorth being precise that this is NOT a general floor, because the census says otherwise:\n12 matched first-party functions save registers AND fold the teardown, four of them in\nthis same file. So the shape is reachable; what is missing is the lever. Neither of the\ntwo that work on the neighbours works here - optimization_level 3 (func_0039aab0's lever)\nand 4 both shrink the object to 72 bytes and keep the swap, schedule on (func_003a0260's\nlever) keeps it, and three source shapes (early return, cached handle, uncached double\nload) give the same 3 words. The structural difference is that this one holds arg0 in $s1\nacross a call inside a conditional and then returns it; the matching examples either have\nno return value or no conditional around the call.\n\nAlso probed the code1_003c trio (3 functions, 21 words) and left it alone deliberately:\nretail loads the same gp global THREE times with no CSE and reaches its blocks by backward\nbranches, and nothing from optimization_level 0/1/4, opt_common_subs off or\nopt_propagation off gets below nd 44 - a body that wrong is worse than no record.\n\nFirst-party 3607 MATCH / 1191 ASM, 0 mismatch, lint 0/320, 542 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":14.044394,"total_code":4365716,"matched_code":608824,"matched_code_percent":13.945571,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4211,"matched_functions_percent":32.186806,"complete_code":613140,"complete_code_percent":14.044433,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4225}},{"timestamp":"2026-08-05T18:56:16Z","commit_sha":"dcc48f3ff1daaaec875796ff1478a0cb91739950","commit_message":"Re-score the freed functions; the leak was hiding a lead and helping another\n\nRe-ran draft_probe over the 86 functions the scope repair moved back to the baseline\ncompiler. The result cuts both ways and is worth recording, because it settles whether\nthe per-function bracketing was the right structure:\n\n  * func_003e3020 scored nd 29 under the leaked -O3 and nd 20 at -O2 with its object at\n    exactly the window size - a lead the leak had been masking.\n  * func_003e3370 is the opposite: nd 32 at -O3, nd 85 at -O2.\n\nSo the translation unit is not uniformly one level and the file-wide span was not the\noriginal build's setting either - which is why per-function brackets, not one span or\nnone, is the correct shape.\n\nfunc_003e3020 preserved at nd 20. Everything is right except a one-word shift: retail has\nTWO consecutive nops between the search loop's bnez and the following null test. Six knobs\nleave it unchanged and schedule on shrinks the function to 68 bytes instead. Its awkward\n`if (p == NULL) {} else goto` shape is load-bearing - rewriting the search as a plain\nwhile/break costs nd 46, so the m2c shape is kept and only the names improved.\n\nFirst-party 3607 MATCH / 1191 ASM, 0 mismatch, lint 0/320, 542 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":14.044394,"total_code":4365716,"matched_code":608824,"matched_code_percent":13.945571,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4211,"matched_functions_percent":32.186806,"complete_code":613140,"complete_code_percent":14.044433,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4225}},{"timestamp":"2026-08-05T18:37:38Z","commit_sha":"665bf66709b768ee6faf8ec734c1629e7c16b47d","commit_message":"Tighten leaking pragma scopes: 108 wrongly-compiled functions down to 42\n\nTwo bugs in yesterday's scope audit had to come out first, and both were the kind that\nreport good news:\n\n  * Pragmas inside `#ifdef NON_MATCHING` are preprocessed out and cannot leak, but the\n    audit counted them - most brackets around preserved bodies live there.\n  * The reverse case is a real defect the audit could not see: a pair whose `off` is\n    INSIDE the reference arm and whose `on` is after the `#endif` is balanced in the text,\n    so decomp_lint's P001 is silent, while the build only ever reads the `on` and runs it\n    to end of file. code1_0043.c had exactly that, twice, putting `schedule on` over every\n    function below it. split_pairs() now reports the shape.\n\nThen the repairs, all verified byte-neutral:\n\n  * code1_0043.c's `optimization_level 3` was opened outside the arm to justify a body\n    that lives inside it - so it affected 17 INCLUDE_ASM functions and nothing it was\n    written for. Moved inside, with its restore.\n  * The two split `schedule` pairs moved their restores inside their arms.\n  * code1_0039.c and code1_003e.c genuinely need -O3: flipping either file to -O2 regresses\n    8 matched functions each. So instead of removing the span, the 21 bodies that need it\n    are now bracketed individually and the file-wide span is gone. The 57 INCLUDE_ASM\n    functions those spans reached are back on the baseline compiler.\n\nVerified by flipping each file's pragma and reading the regression count rather than\nassuming: that is what separated the two files that need -O3 from the one that did not.\n\nFirst-party 3607 MATCH / 1191 ASM unchanged, 0 mismatch, lint 0/320, 542 tests, image and\nSLUS sha1s unchanged over 158 objects - the point of the change is that the next probe on\nany of those 57 functions measures the right compiler.","measures":{"fuzzy_match_percent":14.044394,"total_code":4365716,"matched_code":608824,"matched_code_percent":13.945571,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4211,"matched_functions_percent":32.186806,"complete_code":613140,"complete_code_percent":14.044433,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4225}},{"timestamp":"2026-08-05T18:07:59Z","commit_sha":"2a616043c213e13d8184a7b8727dd3138409cc08","commit_message":"Reconstruct the effBlurFilter init pair to nd 8; large-band drafts are exhausted\n\nBoth functions are byte-exact apart from two transposed argument materialisations before\nthe last call: retail moves the already-computed texture pointer into $a0 first and loads\nthe u16 second, b210 loads first and defers the register copy because it is free. Four\nspellings that reorder the arguments compile identically and schedule on costs nd 123, so\nboth are preserved at nd 8 with that recorded. Everything else - both asserts, the *24\ntable stride, the short-circuit - matches.\n\nThe reconstruction came almost free from a matched SIBLING in the same file (func_004ab1c0\nat line 1194 uses the identical `*(s8 *)(D_007143A0 + *(s32 *)(tmp + 0x18) * 24)` idiom\nand the file's own declared signatures). Writing plausible-looking signatures instead\nproduced a whole-file COMPILE_ERROR with 52 collateral failures; copying the neighbour's\ngot nd 8 first try.\n\nAlso ran draft_probe over the whole >560B band: 494 targets, 2 compiling drafts, 0\nmatches. m2c coverage for large functions is effectively nil, so that band needs hand\nreconstruction and the draft pipeline should not be re-run on it.\n\nTwo clusters checked and set aside with reasons rather than ground on: the y_smap pair\nuses adda.s/msub.s (the documented FPU-MAC floor) and the code1_003d trio is dense\nsingle-precision matrix code with an opcode rabbitizer will not name.\n\nFirst-party 3607 MATCH / 1191 ASM, 0 mismatch, lint 0/320, 535 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":14.044394,"total_code":4365716,"matched_code":608824,"matched_code_percent":13.945571,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4211,"matched_functions_percent":32.186806,"complete_code":613140,"complete_code_percent":14.044433,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4225}},{"timestamp":"2026-08-05T17:40:27Z","commit_sha":"e4c2576867715b678f2739bd5548c7d5c26f744a","commit_message":"Audit which pragma scope each function is actually compiled under\n\nA pragma runs to its matching off, not to the end of the function that needed it, so a\nscope opened for one function silently changes the compiler for every function until it\ncloses. tools/pragma_scope_audit.py walks each file tracking the knob state and reports\nwhat is live at every marker: 108 unmatched first-party functions are compiled under a\nnon-default scope. Every probe ever made against those measured the wrong compiler -\nwhich is exactly how func_0039a090 sat at nd 38 until -O2 was scoped back over it (nd 17,\nno source change). 89 lines of code1_0039.c and 8 functions of code1_0015.c are affected.\n\nNothing else in the gate can see this. decomp_lint checks each pragma is justified and\nbalanced within its file; pragma_audit checks the spelling is one b210 recognises. Neither\nasks which functions a scope reaches.\n\nThe audit's own first version reported a perfectly clean tree, because it read markers\nfrom decomp_lint.Source.code - and markers are comments, which that strips. Pragmas must\ncome from the stripped text (floor notes quote them inside block comments) and markers\nfrom the raw lines; a test pins both halves.\n\nAlso preserved the four-function compare cluster (code1_003b.c and code1_003c.c) at nd 43\nwith the polarity difference documented, and cleaned up two orphaned pragma notes left\nbehind by the reverted asm blob - one of which had been silently waiving an unrelated\npragma three lines below it.\n\nFirst-party 3607 MATCH / 1191 ASM, 0 mismatch, lint 0/320, 535 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":14.044394,"total_code":4365716,"matched_code":608824,"matched_code_percent":13.945571,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4211,"matched_functions_percent":32.186806,"complete_code":613140,"complete_code_percent":14.044433,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4225}},{"timestamp":"2026-08-05T17:14:11Z","commit_sha":"acd7e615947ab5bc3baed101940d37aad66c79d4","commit_message":"Work two more ASM-only clusters: eight matches from two shapes\n\ncode1_0014.c, four functions of 16 words differing only in the jal target: a fixed-size\nallocation followed by a dispatch through a gp-relative table entry. First spelling\nmatched.\n\ncode1_0020.c, four functions of 26 words differing in two store displacements: a guarded\npair of s16 writes where retail RE-LOADS the whole `*(*(arg1+376)+1008)` chain for the\nsecond store rather than reusing the local it just tested. Caching it in the local is the\nobvious C and the wrong C.\n\nOne prober bug found the hard way: a template that pasted an index onto a cast expression\nproduced `*(s16 **)(X)[0]` where `(*(s16 **)(X))[0]` was meant. That parses, compiles, and\nreads almost identically - it reported COMPILE_ERROR with 34 collateral failures, and the\nsame body written out by hand matched immediately.\n\nFirst-party 3607 MATCH / 1191 ASM, 0 mismatch, lint 0/320, 526 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":14.044394,"total_code":4365716,"matched_code":608824,"matched_code_percent":13.945571,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4211,"matched_functions_percent":32.186806,"complete_code":613140,"complete_code_percent":14.044433,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4225}},{"timestamp":"2026-08-05T16:51:59Z","commit_sha":"4c8ed6c0bb3c3545f1da2dfb127a8a2c93aa60e4","commit_message":"Find ASM-only structural clusters; a scoped -O3 leak was measuring the wrong compiler\n\ntwin_find only reported unmatched functions that shared a shape with a MATCHED one, and\nthat set is exhausted. --clusters groups unmatched functions against EACH OTHER instead:\n39 clusters covering 91 functions. No template exists so the first one still has to be\nreverse engineered, but the cost is paid once per cluster - which is exactly how the seven\neffPolygonFlash functions went in.\n\nWorked the largest cluster (five functions in code1_0039.c, 21 words, differing only in\nthe returned field offset and the compared constant) and hit something worth recording\nmore than the residual: the function compiles at -O3. A `#pragma optimization_level 3`\nopened far above for an unrelated function is still in scope, so every probe was\nmeasuring the wrong compiler - branch-likely instructions and filled delay slots that -O2\nnever emits. Scoping -O2 back over the body alone took nd 38 -> 17.\n\nPreserved all five at nd 17 with the shape and the two remaining differences documented\n(retail hoists the compared constant into the preheader and enters the body without a\npre-test; opt_loop_invariants makes it worse at nd 43, and the do/while spelling that\nremoves the pre-test costs more than it saves).\n\nOne more scoped-pragma trap on the way: the `extern u8 *D_007646D0;` declaration landed\nbetween a `#pragma schedule on` and its marker, which is the load-bearing region, and\npushed the closing pragma's measured note out of lint's window.\n\nFirst-party 3599 MATCH / 1199 ASM, 0 mismatch, lint 0/320, 526 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":14.028062,"total_code":4365780,"matched_code":608120,"matched_code_percent":13.92924,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4203,"matched_functions_percent":32.125656,"complete_code":612436,"complete_code_percent":14.028101,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4217}},{"timestamp":"2026-08-05T16:26:12Z","commit_sha":"84af76e5f012f8f3535aac9813734c393444e7cf","commit_message":"Crack the effPolygonFlash clear-loop family: seven functions, one shape\n\ndraft_probe over the 161-560B band matched nothing, but it did surface seven functions in\neffPolygonFlash.c sitting at exactly nd 95 / obj 232 of 240 - and twin_diff shows they\ndiffer from each other in ONE word, the loop stride. One shape, seven functions.\n\nThree separate defects had to come off, in order:\n\n1. m2c typed the entry pointer `s32 *` and advanced it by 0x1C, walking 112 bytes where\n   retail walks 28. The loop compiled and read correctly. This is the same silent stride\n   bug that cost the cmmCommunity family nd 135.\n\n2. The -1 stored in the loop is loop-invariant and retail hoists it into the preheader;\n   b210 at -O2 rematerialises it inside the body instead, and no source spelling keeps it\n   live - a named local assigned before the loop still gets rematerialised. opt_loop_\n   invariants produces retail's exact preheader addiu (nd 60 -> 17), so it is what this\n   translation unit was built with; scoped on/off around each function.\n\n3. The last 8 words were argument materialisation order. Retail finishes the texture\n   pointer chain into $a0 before evaluating the size argument; b210 puts the intermediate\n   pointer straight into $a0 and sinks the second load below the multiply. Hoisting the\n   chain into a local does not fix it, and neither does reordering the declarations or the\n   statements - all four spellings score identically. Writing the final step as an ARRAY\n   INDEX (`tex[5]`) rather than a cast-and-offset (`*(s32 *)(tex + 0x14)`) does: the index\n   form makes b210 complete the chain first. That single change closed all seven.\n\nStrides are 7, 11, 6, 6, 10, 11 and 8 words respectively.\n\nFirst-party 3599 MATCH / 1199 ASM, 0 mismatch, lint 0/320, 520 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":14.028062,"total_code":4365780,"matched_code":608120,"matched_code_percent":13.92924,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4203,"matched_functions_percent":32.125656,"complete_code":612436,"complete_code_percent":14.028101,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4217}},{"timestamp":"2026-08-05T15:53:00Z","commit_sha":"804897ab51251d2f985e371f4f92fc2c20d38acb","commit_message":"Score every m2c draft in the 40-160B band: +47 matches, and close the fake-match hole\n\ndraft_probe.py over 462 unmatched first-party windows found 48 drafts that already\ncompile byte-exact. 47 are real and are applied here. The 48th was not C at all:\n\n    asm void func_003c54a0(void) { .set noreorder; .word 0x3C020003; ... }\n\nm2c emits that whole-function asm form for anything it cannot lift, and spliced in it\nMATCHes by construction because it IS the retail bytes. Nothing else in the campaign\ncould tell it from a result - verify.py, fndiff, objdiff and the progress report all\nagree it is perfect.\n\ndecomp_lint should have caught it and did not: ASM_KEYWORD_RE only matches the statement\nform `asm (`, so an `asm`-qualified function DEFINITION escaped every asm rule, and the\none rule that might have applied skips `.word` as 'directives only'. Both are now closed\nby check_asm_function_body, which decodes the .word payload instead of trusting a\nmnemonic: COP0 and COP2/VU0 are whole opcode spaces and syscall/break/sync are SPECIAL\nfuncts, so the PS2 kernel syscall trampolines in code1_0042.c - which legitimately must\nbe .word literals, MWCC's assembler rejecting the mnemonic - stay allowed while ordinary\nloads, stores, arithmetic and even COP1 float are rejected. draft_probe refuses the shape\nat the source too, so the hole is shut from both ends.\n\nAlso stripped 105 redundant `(u8 *)(x)` casts from the new bodies. Three files regressed\nwhen the cast came off and were reverted: there the operand is not a u8 *, so the cast is\nchanging the pointer arithmetic scale rather than restating a type.\n\nFirst-party 3592 MATCH / 1206 ASM, 0 mismatch, lint 0/320, 520 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":13.990684,"total_code":4365836,"matched_code":606496,"matched_code_percent":13.891864,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4196,"matched_functions_percent":32.072155,"complete_code":610812,"complete_code_percent":13.990723,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4210}},{"timestamp":"2026-08-05T15:12:42Z","commit_sha":"a701eb3bf6277f5e012d43d0bec4d90e1c5ddc37","commit_message":"Find the filled-return-delay-slot family; match func_0041f2b8\n\nb210 at -O2 leaves the jr $ra delay slot empty. Retail often does not, and that pair is\na whole-instruction shift no register tuning can fix - so these functions read as small\nunexplained residuals with correct-looking logic. tools/delayslot_census.py finds them:\n35 unmatched first-party functions, 19 with a store in the slot.\n\nTwo facts make the family tractable, both measured rather than assumed:\n  * #pragma schedule on is what lets b210 fill the slot at all - no other knob in the\n    772-probe space moves it, and schedule alone is not enough;\n  * across 3387 matched first-party functions the slot holds a STORE in every case bar\n    the two-instruction `return K;` shape, never the arithmetic computing a return value.\n    So a retail slot holding an andi/addu/mult feeding $v0 is out of reach for b210, and\n    16 of the 35 are separated out on that basis instead of being ground on.\n\nfunc_0041f2b8 closes with schedule on plus a discarded `return p`: the store only sinks\ninto the slot while the pointer it writes through is already in $v0, and without the\nreturn b210 colours it $v1 and leaves a nop (nd 4). func_0041f2d0 now emits the slot\ncorrectly too and is down to pure colouring - retail holds the pointer in $t0 and\nalternates $v0/$v1 across the three loads; noted at nd 6 rather than committed.\n\nAlso checked the alternative explanation properly: func_00419628 and func_0041f2a8 are\nbyte-exact under ee-gcc2.96 and score 160-270 under b210, which looks like the mixed\ntoolchain again - but three functions in the same 0x0041 window already MATCH under\nMetrowerks, and 107 matched functions have a filled slot, so the region is Metrowerks and\nthe gcc score is coincidence on a six-instruction leaf. Reclassifying would have been\nwrong.\n\ntwin_find.py grew a --loose mode that masks register fields as well; it finds zero extra\ncandidates, which is the useful part - the whole-function twin vein is exhausted at 2\nremaining, both large. Its output also no longer writes outside the repo.\n\nFirst-party 3545 MATCH / 1253 ASM, 0 mismatch, lint 0/320, 514 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":13.890659,"total_code":4366116,"matched_code":602168,"matched_code_percent":13.791845,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4149,"matched_functions_percent":31.71291,"complete_code":606484,"complete_code_percent":13.890698,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4163}},{"timestamp":"2026-08-05T14:37:37Z","commit_sha":"85ecf46553526835d4a7ed2178a9e9822d553448","commit_message":"Six more twins; a file-local assert macro was the last blocker\n\nfunc_002e05a0 (one field offset), func_001f83b0 and func_001f8430 (packet id, work size\nand one callback each), func_0019e9f0 and func_00202740 (packet constructors with three\ncallbacks; the second also moves a flag clear from bit 0 to bit 4), and func_00354490.\n\nfunc_00354490 is the interesting one. Its twin func_001064f0 is a bounds-checked table\nread whose check is written K_ASSERT(arg0 < 0x80, 0x4AE) - but K_ASSERT is a macro\ndefined LOCALLY in g_data.c, not in any header. Copied into a placeholder file the name\nsurvives as an implicit function call, which compiles, links, and scores nd 40 while\nlooking completely correct in the source. Expanding the macro by hand is byte-exact.\n\nWorth noting the assert's line number is an explicit argument rather than __LINE__, so a\nfunction can be reproduced at any position in a placeholder file; only the __FILE__\nstring differs, and that is a masked relocation.\n\nFirst-party 3544 MATCH / 1254 ASM, 0 mismatch, lint 0/320, 502 tests, image and SLUS\nsha1s unchanged over 158 objects. Two twin candidates remain, both large.","measures":{"fuzzy_match_percent":13.890189,"total_code":4366120,"matched_code":602148,"matched_code_percent":13.791375,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4148,"matched_functions_percent":31.705267,"complete_code":606464,"complete_code_percent":13.890227,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4162}},{"timestamp":"2026-08-05T14:12:06Z","commit_sha":"922282d98c82aa2d3aa887b85e2c6c11bdcbc6d9","commit_message":"Five more twins, including one byte-identical duplicate\n\nfunc_002183c0 turned out to be BYTE-IDENTICAL to func_00218260 - twin_diff reports zero\ndiffering words - so the twin's body transfers verbatim under the new name. The rest are\none to three constants: func_0018bad0 (field 0x50 -> 0x14), func_001d7bf0 (packet id\n0xB01 -> 0x309 and one callback), func_001d7b60 (0x308 -> 0x30B and one callback), and\nfunc_004b4f90 (dispatch table base and field 0x1C -> 0x14).\n\nfunc_004b4f90 is a good reminder that the DECLARATION FORM is part of the match, not just\nthe constants. Declaring the dispatch table as `extern u32 D_0071465C;` scores nd 41;\nthe array form `extern u8 D_0071465C[];`, which is what the twin's own file uses and what\ndocs/matching.md prescribes for absolute globals, is byte-exact. Same body either way.\n\nFirst-party 3538 MATCH / 1260 ASM, 0 mismatch, lint 0/320, 502 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":13.876816,"total_code":4366148,"matched_code":601568,"matched_code_percent":13.778003,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4142,"matched_functions_percent":31.659407,"complete_code":605884,"complete_code_percent":13.876854,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4156}},{"timestamp":"2026-08-05T13:42:22Z","commit_sha":"ef2358adc246ebc4c9787f723155b74a777e3f2b","commit_message":"Six more structural-twin matches across five placeholder files\n\nContinuing the twin queue: func_00356820 (switch on a field, offset 0x18 -> 0x14),\nfunc_004a6dc0 and func_00268ad0 (release wrappers differing in one callee and one field),\nfunc_0019beb0, func_001f3950 and func_001f3b20 (packet constructors differing in the\npacket id and three callback addresses, all resolved from their lui/addiu pairs).\n\nThe adaptation cost is almost entirely DECLARATION environment, not logic. Three more\ndistinct ways the same body fails to compile in a different file, each reported as a\nwhole-file COMPILE_ERROR:\n  * the callee is already declared with a different parameter type - code1_004a.c has\n    `func_004841c0(s32)` where the twin's file passes a pointer;\n  * the callee is DEFINED later in the same file, so a forward declaration has to match\n    that definition exactly - code1_0019.c defines func_0019be30/be90 as `void f(u8 *)`\n    and `extern void f(void)` collides;\n  * the name appears only inside an INCLUDE_ASM line, which is not a declaration at all.\n\nChecking for an actual `extern` line rather than the bare name, and copying the callee\nsignature from the destination file rather than the twin's, fixes all three.\n\nFirst-party 3533 MATCH / 1265 ASM, 0 mismatch, lint 0/320, 502 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":13.866899,"total_code":4366184,"matched_code":601140,"matched_code_percent":13.768087,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4137,"matched_functions_percent":31.621187,"complete_code":605456,"complete_code_percent":13.866938,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4151}},{"timestamp":"2026-08-05T13:16:56Z","commit_sha":"33183cd5511b0dc9252875dc27d56a3704fd4f75","commit_message":"Match the btlAICommand condition-wrapper cluster: five more twins\n\nFive functions in code1_001d.c are structural twins of btlAICommand func_001db940 and\nfunc_001db990, differing in exactly ONE word each - the address of the condition function\npassed as the last argument. twin_diff resolved each from its lui/addiu pair against the\nknown btlCond_MYTAISEI = 0x001DB900: 0x001D9740, 0x001D97B0 and 0x001DA230.\n\nThe three that use the goto-shift shape also inherit func_001db990's\n#pragma opt_rebuildconditionals pair, whose note there records that removing it costs the\nmatch outright (nd 0 -> 43).\n\nTwo adaptation traps, both of which report as a whole-file COMPILE_ERROR:\n  * `code` is typedef'd differently per file. btlAICommand.c writes\n    `(code *)&btlCond_MYTAISEI`; in code1_001d.c that is `int (**)(...)` against a\n    `int (*)(...)` parameter, and the file's own idiom `(code)f` is required.\n  * A function name appearing inside an INCLUDE_ASM line is NOT a declaration. Checking\n    for the bare name decided three callees were already declared and produced\n    undefined-identifier cascades; the check has to look for an actual `extern` line.\n\nFirst-party 3527 MATCH / 1271 ASM, 0 mismatch, lint 0/320, 502 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":13.85528,"total_code":4366208,"matched_code":600636,"matched_code_percent":13.756468,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4131,"matched_functions_percent":31.575329,"complete_code":604952,"complete_code_percent":13.855317,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4145}},{"timestamp":"2026-08-05T12:51:35Z","commit_sha":"d542354a175a6509935b952c80c55c667c33954c","commit_message":"Match 11 functions by adapting already-matched structural twins\n\nfrFont func_00272b00 matched last commit partly because func_00272b50 next to it was\nalready matched and had the same shape. That generalises: if an unmatched function's\ninstruction sequence is identical to a matched one once immediates are masked out, the\nmatched C is a template and only the constants change.\n\ntools/twin_find.py masks the 16-bit immediate (and the jal target) while keeping opcodes\nand register fields, then reports ASM functions sharing a signature with a MATCHED\nfirst-party function. It found 35; tools/twin_diff.py prints exactly which words differ,\nwhich is the edit to make. Eleven adapted cleanly, most of them one or two constants:\n\n  0014d470  <- 0014d660  field 0x14 -> 0x110 and a different callback\n  00142340  <- 0035dcc0  three constants; same for 003596a0 and 003619b0\n  0012b940  <- 002668f0  one different callee; 00213840 and 00267510 likewise\n  002674b0  <- 00266890  one callback address; 00369470 likewise\n  00202120  <- 00202010  packet id and callback; 002022e0 likewise\n\nMasking jal targets is what makes the search work and is also its trap: two functions can\nshare a shape and call different things, so every hit must be checked with twin_diff\nbefore adapting. A test pins that the mask keeps opcodes and registers but drops targets.\n\nTwo mistakes worth recording. My first batch helper derived the symbol name for the\n\"is it already declared\" check by splitting on '(' and taking the last token, which for\n`extern void (*jtbl_008873EC[])(u8 *)` yields \"void\" - so it decided the array was\nalready declared and three functions failed with undefined-identifier cascades that\nlooked like bad bodies. And code1_0020.c has no `code` typedef, so the twin's\n`*(code *)(x + 0x6c) = (code)f` had to become a plain void-pointer store.\n\nFirst-party 3522 MATCH / 1276 ASM, 0 mismatch, lint 0/320, 502 tests, objdiff\n4140/13083, 1242 C-linked, image and SLUS sha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":13.845492,"total_code":4366232,"matched_code":600212,"matched_code_percent":13.746682,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4126,"matched_functions_percent":31.53711,"complete_code":604528,"complete_code_percent":13.8455305,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4140}},{"timestamp":"2026-08-05T12:21:06Z","commit_sha":"8ba594952d7c759d766f6405bdfcd2d3c6094185","commit_message":"Document the wrong-window check and the detectors that do not work\n\nThree functions in this tree were documented as \"Ghidra splits that portable C cannot\nexpress\" and were nothing of the sort - the boundary was wrong, the window stopped\nmid-loop, and no body could ever have filled it. That is worth checking before writing a\nfunction off, so it is now in the playbook with the exact detector.\n\nThe reliable rule is narrow: an entry whose FIRST instruction is an unconditional `b`\ninto another entry that nothing references (counting jal, j, data words, and lui/%lo\npairs). It found exactly three instances tree-wide, all genuine, and the set is now\nexhausted - re-running the sweep finds nothing.\n\nThe four looser rules I tried are recorded with their false-positive counts so nobody\nburns time on them again: zero references at all flags 2495 entries of which 554 already\nMATCH; adding lui/%lo detection cuts it to 1078 with 100 matches; also requiring a\nnon-terminating predecessor gives 483 with 54 matches; and \"window contains no jr $ra\"\ngives 14 with 5 matches. Reachability alone is simply not evidence - plenty of real\nfunctions have no reference this analysis can see. Only the b-into-unreferenced-entry\nshape is safe, because it identifies the parent independently.\n\nAlso records the safety rules learned the hard way: BRANCH_LANDING_ENTRIES names a parent\nand refuses if that parent is not itself an entry, re-verification needs build/cache/c\ndeleted or a stale object hides the regression, and the boundary total and marker\ntripwire both move and need their reason written down.","measures":{"fuzzy_match_percent":13.820794,"total_code":4366336,"matched_code":599148,"matched_code_percent":13.721986,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4115,"matched_functions_percent":31.453032,"complete_code":603464,"complete_code_percent":13.820833,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4129}},{"timestamp":"2026-08-05T12:12:10Z","commit_sha":"df6a53a3728fa7975c354a4964c1260b91ca32dc","commit_message":"Sweep for the branch-landing defect; a third instance yields func_0027a340\n\nHaving fixed two by hand, swept the whole map for the same shape: an entry whose FIRST\ninstruction is an unconditional `b` into another entry that nothing references. Exactly\none instance was left - 0x0027A340 opens with `b 0x0027A350`, and across the entire retail\nimage 0x0027A350 has zero jal, zero j and zero data-word references while 0x0027A340 has\nthree jal sites. (The EPILOGUE_SEPARATED note calls 0x0027A340 computed-branch-only, which\nis inaccurate but harmless.)\n\nWithdrawing the landing point grows the window from 16 to 48 bytes, which is enough for\nthe function to exist at all: it is a one-line list walk storing a word at +0x14 and\nfollowing +0x24. Onboarded into itfMesManager.c, where the surrounding addresses live, and\nit matches at 44B.\n\nTwo mistakes worth recording. The file already declared this symbol as (u8 *, int) and my\nfirst body used (int, u32), which reports as `identifier redeclared` plus a cascade of\nundefined-identifier errors that reads like a broken body rather than a signature clash.\nThen the replacement left a stray closing brace, which surfaces as `declaration syntax\nerror` on the NEXT function - both times the whole 85-function TU went COMPILE_ERROR and\nthe real cause was one line.\n\nCounts move deliberately: canonical boundaries 13084 -> 13083, tracked markers 5537 ->\n5538 (this one gains a marker). Re-verified with build/cache/c deleted; image and SLUS\nsha1s unchanged over 158 objects.\n\nFirst-party 3511 MATCH / 1287 ASM, 0 mismatch, lint 0/320, 493 tests, objdiff\n4129/13083, 1242 C-linked.","measures":{"fuzzy_match_percent":13.820794,"total_code":4366336,"matched_code":599148,"matched_code_percent":13.721986,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13083,"matched_functions":4115,"matched_functions_percent":31.453032,"complete_code":603464,"complete_code_percent":13.820833,"complete_data":0,"complete_data_percent":100,"total_units":13083,"complete_units":4129}},{"timestamp":"2026-08-05T11:43:12Z","commit_sha":"9e0c59111697774d6d1749ffe9a28741ed164901","commit_message":"Withdraw two bogus branch-landing boundaries; both parents then match\n\nfrFont func_00272b00 and func_00272ba0 were documented here as Ghidra splits that\nportable C could not express. They were a BOUNDARY bug, not a source problem.\n\nEach function opens with an unconditional `b` into its own condition check - a rotated\nloop - and spimdisasm recorded that LANDING point as a second function. The map already\ndeclared the true entries via JAL_REACHABLE_ENTRIES, but nothing withdrew the landing\npoints, so func_00272b00 kept a 52-byte window ending in the middle of its loop and the\n28 bytes holding the bottom test and epilogue were attributed to a function that does not\nexist. No body could ever fill that window.\n\nThe evidence is the mirror of the evidence that justified declaring the parents: scanning\nevery instruction in the retail image finds ZERO jal, ZERO j and ZERO data words targeting\n0x00272B34 or 0x00272BD4, while their parents have 17 and 18 jal sites. reconcile now has\nBRANCH_LANDING_ENTRIES, which refuses to withdraw an address whose declared parent is not\nitself an entry - withdrawing something that is really called is what broke the link when\nan earlier revision withdrew the parents by mistake.\n\nWith 80-byte windows both functions are the obvious nested while-while, the same shape as\nfunc_00272b50 sitting between them, which already matched. Byte-exact at 68B each.\n\nCounts move deliberately and the tests were updated with the reason: canonical boundaries\n13086 -> 13084, tracked markers 5539 -> 5537 (the two orphaned markers went with the\nentries). Re-verified with build/cache/c deleted so no stale object could hide a\nregression: image and SLUS sha1s unchanged over 158 objects.\n\nFirst-party 3510 MATCH / 1287 ASM, 0 mismatch, lint 0/320, 493 tests, objdiff\n4128/13084, 1242 C-linked.","measures":{"fuzzy_match_percent":13.819774,"total_code":4366340,"matched_code":599104,"matched_code_percent":13.720965,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":4114,"matched_functions_percent":31.442986,"complete_code":603420,"complete_code_percent":13.819812,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":4128}},{"timestamp":"2026-08-05T11:11:43Z","commit_sha":"c86ddb2be196e55a7bba6c8c2bd91b8323403204","commit_message":"Preserve cmmCommunity func_00107ac0 with the family's arithmetic repairs\n\nMissed when the slot-scan family was preserved. Same two m2c defects repaired - the\nwalking pointer typed `s32 *` and advanced `+= 0x10`, which walks 64 bytes per record\ninstead of 16, and the undeclared D_00797410 address literal for the base - giving nd 38\nat exactly the 176B window with correct arithmetic. All nine family members now carry a\nbody and share the one branch-shape note.\n\nAlso probed cmmMisc func_00248d80 (draft nd 104) and did not commit it: reconstructing\nfrom the retail listing with s32/s64 returns and s16/s32 locals lands at nd 89-99 with a\n140-148B object against a 160B window, so every variant is undersized and none beats the\ndraft by enough to be worth pinning.\n\nFirst-party 3508 MATCH / 1291 ASM, 0 mismatch, lint 0/320, 493 tests.","measures":{"fuzzy_match_percent":13.816584,"total_code":4366364,"matched_code":598968,"matched_code_percent":13.717775,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4112,"matched_functions_percent":31.422895,"complete_code":603284,"complete_code_percent":13.816622,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4126}},{"timestamp":"2026-08-05T10:59:44Z","commit_sha":"7ea9176948be6f891f1007d8b743465ff2b5130b","commit_message":"Preserve the cmmCommunity slot-scan family with m2c's arithmetic bugs repaired\n\nEight functions (func_001076e0/1077f0/107a00/107bd0/107ce0/107dc0/107f00/107fe0) are one\nfamily: walk 21 records of stride 16 from D_007973A0[0x70] looking for a matching id.\nNone had a body before; all eight now have one at nd 38 (001076e0 at nd 72).\n\nTwo m2c defects had to be repaired before any of them even compiled, and one of them is\nthe dangerous kind. m2c types the walking pointer `s32 *` and advances it with `+= 0x10`,\nwhich walks 64 bytes per record instead of 16 - silently wrong and it still compiles.\nFixing it took 00107ce0 and 00107f00 from nd 135 to nd 38. The other is a bare address\nliteral D_00797410 for the array base that no file declares.\n\nThe residual is one branch shape, now recorded once for the whole family: retail leaves\nthe loop on a match with a bne-to-advance plus b-to-exit PAIR where b210 emits a single\nbeq-to-exit. Measured NOT reachable via goto, break, inverted test with continue,\nadvance-in-else, an explicit entry-goto mirroring retail's block order, do/while, a\nsingle-case switch (right size, booleanised compare), while+break, s16/s32/u16\nsignatures, or eleven control-flow pragmas including opt_rotateloops both ways. An\nin-loop `return` does produce the pair at the exact window size, but then materialises\nits own return value where retail falls into the shared block.\n\nWorth noting the while+break conversion is shape-specific, not universal: it is exactly\nwhat matched evtMain func_00288020 one commit ago, and here it makes things worse\n(nd 48-65).\n\nFirst-party 3508 MATCH / 1291 ASM, 0 mismatch, lint 0/320, 493 tests, image and SLUS\nsha1s unchanged over 158 objects.","measures":{"fuzzy_match_percent":13.816584,"total_code":4366364,"matched_code":598968,"matched_code_percent":13.717775,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4112,"matched_functions_percent":31.422895,"complete_code":603284,"complete_code_percent":13.816622,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4126}},{"timestamp":"2026-08-05T10:46:10Z","commit_sha":"528128c47ca35a011baf898f548e6036722a4a90","commit_message":"Narrow-unsigned local produces daddiu: cmmMisc func_00247cb0 nd 27 -> 8\n\nTwo of the three defects in this function came from ONE wrong type, and the lever is\nreusable. Retail materialises each switch-case constant with `daddiu $s0,$zero,K` and\nloads the call argument separately with `addiu $a0,$zero,K`. With an s32 local b210 emits\n`addiu $s0` and then reuses it via `move $a0,$s0` - wrong instruction AND an unwanted CSE.\nA NARROW UNSIGNED local fixes both at once: it produces the daddiu form, and it stops the\nCSE because the local and the int literal no longer share a type.\n\nThe idiom was confirmed against a function we already match - datCalc func_00243ed0,\nwhere `u16 characterId` compiles its `= 1` to `daddiu $s0,$zero,1`. Worth knowing that a\ndaddiu-from-zero is not evidence of 64-bit source; 13 already-matching functions contain\none.\n\nRemaining 2 words are recorded rather than guessed at: our final two uses emit\n`andi $rX,$s0,0xffff` where retail moves the register unmasked, and b210 will not drop the\nnarrowing even though every assigned value is <= 0x18. Measured dead ends: s64, u64, long\nand unsigned long all revert to addiu (nd 67); u32 keeps the mask off but loses the daddiu\n(nd 27); (u16)/(u8) casts on the constants with an s32 local do not help; casting at the\nuses does not remove the mask; and fourteen type-promotion pragmas including\nopt_unpromotetypes in both directions all leave nd 8.\n\nBody preserved under #ifdef NON_MATCHING - this function had no note at all before, so\nnd 8 is now the resumable starting point instead of an untouched INCLUDE_ASM.\n\nFirst-party 3508 MATCH / 1291 ASM, 0 mismatch, lint 0/320, 493 tests.","measures":{"fuzzy_match_percent":13.816584,"total_code":4366364,"matched_code":598968,"matched_code_percent":13.717775,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4112,"matched_functions_percent":31.422895,"complete_code":603284,"complete_code_percent":13.816622,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4126}},{"timestamp":"2026-08-05T10:32:18Z","commit_sha":"56f3e79021a51572dfef349c7bf8777cfddbbfb6","commit_message":"Match evtMain func_00288020: m2c goto-chains suppress loop rotation\n\nRecovered from the m2c draft, which draft_probe had already ranked top of the worklist\nat nd 26. The entire residual was loop SHAPE, and it is a general m2c artefact worth\nknowing: m2c writes every loop as `if (cond) { body; goto top; }`, and b210 compiles that\nliterally into a top-test loop with an unconditional back-branch. Retail rotates - an\nentry `b` to the test plus a conditional back-branch at the bottom - which is what b210\nemits for an ordinary `while`.\n\nThe function has two outer list walks each containing an inner search, and the two levels\nhad to be done separately to see it. Converting the two OUTER goto-chains to `while` took\nnd 26 -> 10 and left the diff showing only the inner loops; converting those as well, with\n`break` on the hit, closed it. MATCH at 324B.\n\nKeep the surrounding structure while doing it. Converting all four loops at once AND\ncollapsing the trailing if/else that m2c emits after each inner loop scores nd 127 at\n300B - the loop form is the fix, the rest of the draft's shape is already right.\n\nThe lever does not generalise to the cmmCommunity search family, which has the same\ngoto-chain look: rewriting those as while loops reaches the exact 160B window but nd 48,\nworse than the nd 38 goto form. Recorded so it is not retried blindly.\n\nFirst-party 3508 MATCH / 1291 ASM, 0 mismatch, lint 0/320, 493 tests, objdiff 4126/13086,\n1242 C-linked, image and SLUS sha1s unchanged.","measures":{"fuzzy_match_percent":13.816584,"total_code":4366364,"matched_code":598968,"matched_code_percent":13.717775,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4112,"matched_functions_percent":31.422895,"complete_code":603284,"complete_code_percent":13.816622,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4126}},{"timestamp":"2026-08-05T10:03:24Z","commit_sha":"7ef87c9ae7026a4a5d65314d4a6c5ff86975a16a","commit_message":"Fix draft_probe matching forward declarations instead of definitions\n\nm2c files open with declarations like `s32 func_001077f0();`. find_draft matched one,\nthen walked braces from there and captured the NEXT function's body - so the tool was\nmeasuring one function's draft against a different function's window. That does not fail\nloudly; it reads as a plausible bad score, which is the worst kind of wrong. Caught by\neyeballing a draft that turned out to be func_00106f40 under func_001077f0's name.\n\nfind_draft now walks to the end of the signature and requires a `{` before any `;`.\nAttempted drafts go 80 -> 113 and clean-compiling ones 20 -> 29, because definitions that\nwere previously shadowed by an earlier declaration are now found. A test builds a\ngenerated file with the declaration first and the definition after an unrelated function,\nand pins that the right body comes back.\n\nThe corrected ranking also fixes a signature I had guessed wrong by hand: the draft for\nfunc_001077f0 takes s16, not the s32 I had been probing with.\n\nNew leads at the top of the worklist: evtMain func_00288020 at nd 26, cmmMisc\nfunc_00247cb0 at nd 27, and cmmCommunity func_00107ac0 at nd 38 with an exact 176B object.\n\nFirst-party 3507 MATCH / 1292 ASM, 0 mismatch, lint 0/320, 493 tests.","measures":{"fuzzy_match_percent":13.809125,"total_code":4366376,"matched_code":598644,"matched_code_percent":13.710317,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4111,"matched_functions_percent":31.415255,"complete_code":602960,"complete_code_percent":13.809164,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4125}},{"timestamp":"2026-08-05T09:50:30Z","commit_sha":"93efdfaf6e52fb4436589918e7440758e9d74b4d","commit_message":"Score the m2c drafts instead of hand-writing blind: tools/draft_probe.py\n\nsrc/generated/ holds an m2c draft for most un-decompiled functions, but applying them\nin bulk does not work - an earlier attempt spliced 30 at once and produced 242 compile\nerrors, because a draft freely references symbols its destination file never declares.\ndraft_probe splices them one at a time, keeps only what compiles, and ranks the\nsurvivors by normalized_diff, which turns that failure mode into a filter.\n\nOver the 150 game-file INCLUDE_ASM functions with a draft and a window <= 400B: 80 had a\ndraft free of M2C_UNK/M2C_ERROR and 20 compiled cleanly. No outright match, but the\nranking is the point. evtMain func_00288020 sits at nd 26, and four cmmCommunity\nfunctions sit at nd 38 - and those four are ONE family, the same 21-record stride-16 id\nscan as func_001077f0, so the shape is worth solving once rather than four times.\n\nRecorded what that family's blocker is and what does not move it: retail exits the loop\non a match with a bne-to-advance plus b-to-exit PAIR where b210 emits a single\nbeq-to-exit. Unreachable via goto, break, inverted test with continue, advance-in-else,\nan explicit entry-goto mirroring retail's block order, a do/while bottom test, a\nsingle-case switch (which reaches the exact size but booleanises the compare), and\neleven control-flow pragmas including opt_rotateloops both ways.\n\nA test caught a real defect in the cleaner. The M2C_FIELD expander was a regex with\n`[^,]+?` arguments, which cannot handle nesting: given\nM2C_FIELD(M2C_FIELD(p, u8 **, 4), s32 *, 8) it paired the wrong type with the wrong base\nand produced code that STILL COMPILES - the dangerous kind of wrong. Replaced with a\ndepth-aware argument splitter that expands innermost-first and refuses unbalanced input.\n\nTwo functions were deliberately NOT committed. My reconstructions of mdlManager\nfunc_0047aa30 (nd 68 vs a recorded nd 25) and cmmCommunity func_001077f0 (nd 38-44 vs a\nrecorded nd 14) are worse than numbers earlier attempts reached with bodies that were\nnever kept. Committing a worse body would mislead the next attempt, so the notes stand.\n\nFirst-party 3507 MATCH / 1292 ASM, 0 mismatch, lint 0/320, 492 tests.","measures":{"fuzzy_match_percent":13.809125,"total_code":4366376,"matched_code":598644,"matched_code_percent":13.710317,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4111,"matched_functions_percent":31.415255,"complete_code":602960,"complete_code_percent":13.809164,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4125}},{"timestamp":"2026-08-05T09:25:10Z","commit_sha":"bd35f91ed54dcd947651c1972e0e7f9b438dea22","commit_message":"Reclassify 29 proven ee-gcc functions out of first-party\n\nOnly functions carrying a byte-level signature MWCCPS2 b210 provably cannot emit, and\nthat ee-gcc emits exactly:\n\n  absolute getter, `lui rX,%hi / jr $ra / load rY,%lo(rX)` with rX != rY. b210 always\n  reuses the destination register; measured across 8 source spellings, 4 register and\n  lifetime pragmas, all 772 pragma probes and 9039 permute_ast compiles, never below\n  nd 2. Every ee-gcc 2.9/2.95/2.96 at -O2 is exact.\n\n  framed tail jump, `addiu $sp,-N / sd $ra / ld $ra / j target / addiu $sp,N`. b210\n  emits only 8, 28 or 32 bytes across all 18 optimization_level x tailcall x schedule\n  combinations, never retail's 24. ee-gcc2.96 -O2 is exact.\n\nTwo checks stopped this being wider than the evidence. The first flanking test counted\nthe promoted placeholders as first-party neighbours, which is circular - they are the\nthing in question - and it reported 9 getters and 25 tail jumps sitting in first-party\nterritory. Excluding placeholders from the anchors, ALL 34 getter-signature and 259 of\n265 tail-jump-signature functions are flanked by genuine third-party code on both sides\nand NONE lies in a first-party run. Separately, the one getter-signature function that\nalready MATCHes turned out to be hand-written `asm` in src/sce, not compiler output, so\nit does not disprove the signature.\n\nVendor is deliberately not claimed. 18 sit between CRI ADX functions, one between Sony\nROFS functions, and the 0x00446-0x0044b block sits between Sony libmc2 and CRI ADX with\nno way to tell which owns it, so the unit is named for the toolchain and\nTHIRD_PARTY_PREFIXES gains \"middleware/\" rather than filing them under cri/ or sce/.\n\nByte-neutral: none of the eight source files is linked, only markers moved, marker count\nstays 5539, and the image and SLUS sha1s are unchanged over 158 objects. Preserved C\nbodies moved with their functions and stay behind #ifdef NON_MATCHING - they cannot match\nunder b210, which is the point, but they document the semantics if ee-gcc is ever added.\nA test pins that, and that the unit keeps its evidence rather than becoming a dumping\nground for merely-hard functions.\n\nFirst-party 3507 MATCH / 1292 ASM (was 1321), 0 mismatch, lint 0/320, 486 tests.\nHonest first-party share moves 3507/9652 = 36.3%% to 3507/9437 = 37.2%%.","measures":{"fuzzy_match_percent":13.809125,"total_code":4366376,"matched_code":598644,"matched_code_percent":13.710317,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4111,"matched_functions_percent":31.415255,"complete_code":602960,"complete_code_percent":13.809164,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4125}},{"timestamp":"2026-08-05T08:41:52Z","commit_sha":"468d45c026f6053b181b920ecd81294f390ec6d3","commit_message":"Match g_data func_00109190: let b210 emit the unsigned-to-float idiom itself\n\nThe old note called this a \"branch-duplication floor\" at nd 37 with a 188B object against\na 144B window. It was wrong twice over.\n\nThe halve/convert/double branch around the accumulate is not something to write by hand -\nit is b210's built-in UNSIGNED-to-float conversion. Spelling the source `(f32)(u32)x` makes\nthe compiler emit the whole idiom with retail's shared tail; hand-rolling the two arms is\nexactly what duplicated the loop tail and bloated the object by 44 bytes.\n\nWith the cast the size is exact and the only remaining difference was which register held\nwhat: retail keeps the counter in $a0 and the walking pointer in $a1. That is DECLARATION\norder - declaring `u8 *p` before `s32 i` is byte-exact.\n\nMeasured along the way: the reverse declaration order is nd 7, assigning `i = 0` before the\npointer setup is nd 12, a comma-initialised for is nd 12, index arithmetic with no pointer\nlocal is nd 101 at 152B, and fourteen allocation and loop pragmas (opt_lifetimes,\nreg_class_allocs, opt_scalarizeliveranges, cse_hard_reg_gpr, opt_rotateloops,\nopt_reverseloops, opt_strength_reduction, opt_moveinvariantsinaddressexpr and friends) all\nleave it at nd 7. Recorded in place of the old verdict.\n\nFirst-party 3507 MATCH / 1321 ASM, 0 mismatch, lint 0/320, 478 tests, objdiff 4125/13086,\n1242 C-linked, image and SLUS sha1s unchanged.","measures":{"fuzzy_match_percent":13.809125,"total_code":4366376,"matched_code":598644,"matched_code_percent":13.710317,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4111,"matched_functions_percent":31.415255,"complete_code":602960,"complete_code_percent":13.809164,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4125}},{"timestamp":"2026-08-05T08:12:51Z","commit_sha":"f71f177d0c3c82d58548576af8e71b4417692f5d","commit_message":"Match btlShuffleDraw func_00376880: the fix was NOT caching the pointer\n\nIts note already said retail re-loads *arg0 at every use, and the fix follows directly:\ndo not introduce a local for it. A `cur` local lets b210 CSE the load with the loop test\nand the body comes out two instructions short at nd 44; a for(;;)-with-break shape scores\nnd 33; dereferencing *arg0 at each use is byte-exact.\n\nNeeded a forward declaration too. The only caller sits above the definition, so without a\nprototype the implicit `int func_00376880()` collides with the real\n`void func_00376880(u8 **)` and the whole TU fails with 51 collateral errors - which reads\nas a bad body rather than a missing declaration.\n\nmdlManager func_0047aa30 is deliberately left as INCLUDE_ASM. Its note records nd 25 from\na body that was never kept; my reconstruction from the retail listing only reaches nd 68\nat 96B against a 112B window across three loop shapes (plain u16 for, explicit 0xFFFF\nmasks, and the file's index-first addOff carrier). Committing a body worse than the\ndocumented number would just mislead the next attempt, so the note stands alone.\n\nFirst-party 3506 MATCH / 1322 ASM, 0 mismatch, lint 0/320, 478 tests, objdiff\n4124/13086, 1242 C-linked, image and SLUS sha1s unchanged.","measures":{"fuzzy_match_percent":13.805827,"total_code":4366376,"matched_code":598500,"matched_code_percent":13.70702,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4110,"matched_functions_percent":31.407612,"complete_code":602816,"complete_code_percent":13.805866,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4124}},{"timestamp":"2026-08-05T07:49:41Z","commit_sha":"487791afed29e14437e826c6adeecb9d440f848e","commit_message":"Preserve bodies for three floor-noted functions; exhaust 772 pragma probes on one\n\nThree functions in real game files carried floor notes but no source, so nothing was\nresumable. Reconstructed a body for each from the retail listing and preserved it under\n#ifdef NON_MATCHING.\n\nevtMisc func_0028f4f0 lands at nd 1 - a single word. Retail tests `beqz $v0`, the\nuntouched return value, where b210 tests `beqz $a0`, the copy it already made for the\nargument. Ran every one of the 386 pragma spellings b210 accepts, in both directions,\n772 probes in total: zero matches and zero improvements. Also checked it is not another\nmixed-toolchain case - on decomp.me it scores 120 under mwcps2-3.0.1b210 against\n830-1030 under every ee-gcc, so this really is Metrowerks and really is a coalescing\nfloor.\n\nThe other two are an honest partial result. itfMesManager func_00278d50 reconstructs to\nnd 58 and y_fclCombineDraw func_003146f0 to nd 45, while their notes record nd 19 and\nnd 17 from earlier attempts whose source was never kept. I could not reach those numbers\nfrom the listing alone, which is a concrete demonstration of why a floor note without its\nbody is not resumable. Both are now preserved at the number I can actually reproduce.\n\nschedule on and optimization_level 3 each improve two of them (58 -> 44, 45 -> 26 and\n45 -> 38) without matching, so neither pragma is committed - an unjustified pragma that\nonly moves a number is the window-fill defect, not progress. The measurements are\nrecorded in the notes instead.\n\nFirst-party 3505 MATCH / 1323 ASM, 0 mismatch, lint 0/320, 478 tests, image and SLUS\nsha1s unchanged over 158 linked objects.","measures":{"fuzzy_match_percent":13.803707,"total_code":4366380,"matched_code":598408,"matched_code_percent":13.704901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4109,"matched_functions_percent":31.39997,"complete_code":602724,"complete_code_percent":13.803746,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4123}},{"timestamp":"2026-08-05T07:13:20Z","commit_sha":"d9d74076c3eaa946692693fa1cc39d9168bbaf0e","commit_message":"Mine __FILE__ evidence: 1299 functions get a definite translation unit\n\nChecked the Oct 3 2008 prototype ISO for extra __FILE__ evidence. Answer is no: the\nprototype executable SLUS_280.69 carries the IDENTICAL set of 254 source-filename\nstrings as retail, despite being a genuinely different build (different md5, 45.7%% of\nthe common bytes differ). Zero prototype-only filenames.\n\nBut writing the check showed retail's own evidence was badly under-used. tools/tu_audit.py\nreports __FILE__ evidence for only 3 groups; the retail image actually contains 252\nfilename strings, 234 of them referenced by at least one function, attributing 1299\nfunctions in total - 351 currently marked ASM and 160 not scanned at all.\n\ntools/file_evidence.py finds every <name>.c/.h string in the loadable image, then walks\neach canonical window for a lui/%lo pair that materialises the string's address. Assert\nmacros pass __FILE__, so a function that materialises \"btlSupport.c\" lives in\nbtlSupport.c. Results worth acting on:\n\n  65 named translation units have NO file in the tree, covering 196 functions\n     (151 unscanned, 19 ASM, 26 already matched under a placeholder name)\n  11 functions sit in a file the evidence contradicts: two datPersona.c functions are\n     in g_data.c, four k_shadow.c functions are in promoted/code1_0017.c, and five\n     frFont.c functions are in frFontEx.c\n\nTwo things the implementation had to get right. RetailElf.bytes_at only serves function\nwindows, so building an image from those finds no strings at all - the filenames live in\n.rodata and you need the real segment mapping from `segs`. And the %lo half is not always\nan addiu: it is just as often the displacement of a load or store, so matching only\nlui+addiu misses most references.\n\nAlso records why the first prototype scan was abandoned after 39 minutes: the regex used\na lazy `[ -~]{0,120}?` prefix, which backtracks up to 120 times at every byte offset of a\n4.4 GB stream. Matching the extension first with a non-backtracking pass and expanding\nbackwards does the same job on 8.6 MB in under a millisecond, and extracting the\nexecutable out of 3.6 GB of deflate took 23 seconds - the I/O was never the problem.\n\nFirst-party 3505 MATCH / 1323 ASM, 0 mismatch, lint 0/320, 478 tests.","measures":{"fuzzy_match_percent":13.803707,"total_code":4366380,"matched_code":598408,"matched_code_percent":13.704901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4109,"matched_functions_percent":31.39997,"complete_code":602724,"complete_code_percent":13.803746,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4123}},{"timestamp":"2026-08-05T06:19:56Z","commit_sha":"5ea2b8220667fce3dec7f26b0f3a3065bf2cfe49","commit_message":"Attribute unscanned windows so middleware stops inflating the first-party count\n\nverify.py only sees windows carrying a // FUN_ marker; the other 7547 are handed to the\nlink as raw retail bytes and are invisible to every status count. Treating all of them\nas first-party overstates the remaining work, because a large run of them is CRI ADX and\nSony ROFS code - the same region where the ee-gcc signatures cluster.\n\ntools/attribute_windows.py classifies each unscanned window by the third-party flag of\nits nearest SCANNED neighbour on each side:\n\n  scanned 5539: first-party MATCH 3505, first-party ASM 1323\n  unscanned 7547: 3363 flanked by first-party, 2723 flanked by third-party,\n                  1461 mixed\n  first-party excluding third-party-flanked windows: 3505/9652 = 36.3%%\n\nThe obvious implementation is wrong and I had to throw one away. Whole-file address\nspans cannot decide this: cri_adx_grouped.c spans 0x0044db98-0x0052d980 but is\nnon-contiguous, with 943 game functions from mdlManager, effBlurFilter, sdkSnd and\nsdkTask interleaved inside it, so a span test reclassifies real game code AS middleware -\nthe opposite of what an honesty fix should do. A test pins that specific case.\n\nA window is only called middleware when BOTH neighbours are third-party. One-sided and\nedge cases go to `mixed` and are left for real attribution rather than guessed, which is\nwhy 1461 windows stay unclassified instead of being quietly counted either way.\n\nThis only reports. It does not edit sources and it does not touch the published progress\nnumbers; verify.is_third_party stays the single authority for what is third-party.\n\n466 tests, lint 0/320.","measures":{"fuzzy_match_percent":13.803707,"total_code":4366380,"matched_code":598408,"matched_code_percent":13.704901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4109,"matched_functions_percent":31.39997,"complete_code":602724,"complete_code_percent":13.803746,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4123}},{"timestamp":"2026-08-05T06:17:27Z","commit_sha":"8de6732b7951a12ec0547cc0633ee790079b9287","commit_message":"Break cmmMisc func_00249670's commutative addu with an inline helper (nd 6 -> 4)\n\nRetail emits addu $s0,$v0,$s0 - the call result first - and b210 emits addu $s0,$s0,$v0.\nRewriting the expression at the callsite does nothing; the operands have to travel\nthrough a static inline helper's parameter list, which is the documented lever and it\nworks here.\n\nThe trap worth recording: the helper MUST sit above the // FUN_ marker. Put a definition\nbetween the marker and the function body and the name parse breaks - the function\nsilently disappears from the verify report rather than failing loudly, which reads as a\ncompile problem when it is a placement problem. Three variants looked like errors before\nI noticed the row was simply absent.\n\nThe remaining 2 words are the prologue parameter saves: retail move $s1,$a0 then\nmove $s0,$a1, b210 the reverse. Measured unmoved by declaration order (which scores\nnd 15), by reversing the helper's parameters, and by eleven pragmas including\nopt_lifetimes, reg_class_allocs, opt_scalarizeliveranges, opt_serializeassignments,\nopt_repositioncode and opt_movepostops. Recorded above the marker so the next attempt\nstarts from nd 4 instead of nd 6.\n\nFirst-party 3505 MATCH / 1323 ASM, 0 mismatch, lint 0/320, 460 tests, image and SLUS\nsha1s unchanged over 158 linked objects.","measures":{"fuzzy_match_percent":13.803707,"total_code":4366380,"matched_code":598408,"matched_code_percent":13.704901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4109,"matched_functions_percent":31.39997,"complete_code":602724,"complete_code_percent":13.803746,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4123}},{"timestamp":"2026-08-05T06:03:29Z","commit_sha":"644163edb3f97efed18db983c103587b076e4d22","commit_message":"The retail binary is a mixed-toolchain build: two \"floors\" are ee-gcc code\n\nTwo families this repo documented as MWCCPS2 compiler floors are byte-exact under\nee-gcc, which means they were never Metrowerks code and no amount of source shaping\nor pragma work could ever have matched them.\n\n  code1_004c func_004c3410, the absolute getter (lui $v1,%hi / jr / lw $v0,%lo($v1)):\n  b210 stays at nd 2 across 8 source spellings, four register/lifetime knobs and 9039\n  permute_ast compiles (score 9 -> 5, never 0). EVERY ee-gcc 2.9/2.95/2.96 at -O2 is\n  exact. Representative of a 19-function family.\n\n  code1_0044 func_0044b8d8, the framed tail jump (sd $ra / ld $ra / j g / addiu $sp in\n  the delay slot): b210 only ever emits 8, 28 or 32 bytes across all 18 combinations of\n  optimization_level x tailcall x schedule, never retail's 24. ee-gcc2.96 -O2 is exact.\n  Representative of a ~10-function family.\n\nThis is NOT a reason to switch compilers. code1_003b func_003bd560 is byte-exact under\nb210 with no_branch_likely and scores 545-765 under every gcc. The toolchains are\ninterleaved, so the compiler is a per-TU property to discover.\n\nScoping it matters more than matching it. Scanning every window <= 64B for two\nunmistakable gcc shapes finds 299 functions, and 281 of them sit in 0x004C0000-0x0052FFFF\n- a region that is 91%% third-party by scanned count (561 cri_adx_grouped, 93 Sony rofs_*,\n5 cri_adx) against 64 first-party placeholder entries. These families are CRI/Sony\nmiddleware, not game code, so they are out of scope for first-party matching rather than\nbeing work we failed at.\n\nOne negative result worth keeping: whole-file address spans CANNOT decide this.\ncri_adx_grouped.c spans 0x0044db98-0x0052d980 but is non-contiguous, with 943 game\nfunctions from mdlManager, effBlurFilter, sdkSnd and sdkTask interleaved inside it. I\nhad to throw away a first attribution built on spans. Nearest-scanned-neighbour on both\nsides is the honest test: of 7705 unscanned windows, 2723 are flanked by third-party on\nboth sides, 4099 by first-party, and 883 are mixed.\n\ntools/decompme.py does the asm dump and the upload. Four things cost time: decomp.me is\nbehind Cloudflare and needs a decomp-permuter User-Agent; the API is DRF so it serves\nHTML unless the URL carries ?format=json; PATCH on an unclaimed scratch is 403 so the\nsource must be right at creation; and objdump emits bare registers and numeric branch\ntargets where decomp.me wants $-prefixed registers and labels - with the trap that a\nlui immediate also ends in hex and must not be turned into a label.\n\nFirst-party 3505 MATCH / 1323 ASM, 0 mismatch, lint 0/320, 460 tests.","measures":{"fuzzy_match_percent":13.803707,"total_code":4366380,"matched_code":598408,"matched_code_percent":13.704901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4109,"matched_functions_percent":31.39997,"complete_code":602724,"complete_code_percent":13.803746,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4123}},{"timestamp":"2026-08-05T05:41:10Z","commit_sha":"63a4a523a13d5e2bb4f3c6083fcc20ddc44fbda8","commit_message":"Find no_branch_likely: b210 accepts 386 pragmas, we were using 19\n\nThis campaign had been steering b210 with 19 pragma spellings. The compiler accepts\n386, and an unrecognized pragma is ignored SILENTLY, so nothing ever pointed that out.\ntools/knob_sweep.py discovers the real list the same way pragma_audit does - pull\nidentifiers out of mwccps2.exe, validate each under #pragma warn_illpragma on - then\ntries them one at a time on functions that are stuck.\n\nThe first sweep paid for itself. #pragma no_branch_likely on turns four functions\ndocumented as compiler floors into byte-exact matches: b210 emits a branch-likely\n(beql) where retail uses a plain beqz. code1_003b func_003bd560, func_003bd680 and\nfunc_003be910 were nd 4 each; code1_003d func_003d81a0 was nd 14.\n\nIt has to stay a per-function knob, not a build flag: retail really does use\nbranch-likely, 2216 instructions across 1061 functions (beql 937, bnel 1178, blezl 64,\nbgtzl 37). The cheap applicability test is to scan the retail window for opcodes\n0x14-0x17 and only reach for the pragma when there are none.\n\nAlso fixes a measurement bug that had been hiding real progress. The lines between a\n// FUN_ marker and #ifdef NON_MATCHING hold #pragma schedule on and floor notes;\nactivating a body by replacing marker..#endif wholesale drops them, leaving an\nunfilled jr delay slot. That made code1_0041 func_0041f2a8 read as nd 12 at 20 bytes\nwhen it is actually nd 2 at 16. Re-measuring all 81 preserved bodies with the region\npreserved gives an honest worklist, and knob_sweep keeps it that way.\n\nNegative results recorded in docs/matching.md so nobody re-treads them: the\n19-function absolute-getter family, where retail puts %hi in $v1 and b210 reuses $v0,\nresisted 8 source spellings, four register/lifetime knobs, and 9039 permute_ast\ncompiles over 900s (score 9 -> 5, never 0). It is shared as a decomp.me scratch at\nhttps://decomp.me/scratch/r8hUx for anyone who wants a crack at it. func_003963b0,\nwhere b210 lowers x * 0x24 to sll/addu/sll and retail emits a real mult, resisted all\nfour strength-reduction and size knobs.\n\nFirst-party 3505 MATCH / 1323 ASM, 0 mismatch, lint 0/320, 460 tests, pragma audit\nclean, objdiff 4123/13086, 1241 C-linked, image and SLUS sha1s unchanged.","measures":{"fuzzy_match_percent":13.803707,"total_code":4366380,"matched_code":598408,"matched_code_percent":13.704901,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4109,"matched_functions_percent":31.39997,"complete_code":602724,"complete_code_percent":13.803746,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4123}},{"timestamp":"2026-08-05T04:33:17Z","commit_sha":"a99cacfd976623be7d34bc0b3cb02c5a1c3ad747","commit_message":"Match cutinDraw func_00120e20; stop permute_sweep reporting phantom AST hits\n\nAn AST sweep over the 80 preserved-body targets returned two CRACKED_AST hits. One was\nreal and one was not, which is the interesting part.\n\ncutinDraw func_00120e20 is real and cleaned up to ordinary C. Retail splits arg1 into\nhalves through the STACK rather than with a shift: copy it to a local before the first\ncall, then read the two s16 halves back through its address. Two things that look\nredundant are load-bearing - the scratch that feeds `lo`, and the `if (result == 0)\nreturn 0;` ahead of the final `return result;`. Removing either scores nd 17. Renaming\nthe permuter's temp_2/sp1c/var_2 and tidying the casts is byte-identical, so this needed\nno dead code at all. cutinDraw.c is now 100%.\n\nk_vpad func_004b5800 was a phantom. Its saved region calls `inline_fn(work)`, a helper\ndecomp-permuter extracts during its own scoring and permute_ast never writes out, so the\nregion does not compile in the file it came from - nd 245 at 364B when spliced back.\npermute_sweep was reporting that as a win, which sends the next reader chasing something\nunreproducible. It now splices each AST region back and scores it before claiming\nCRACKED_AST, reporting AST_HIT_UNREPRODUCIBLE instead.\n\nThat exposed a real pre-existing bug in splice(): the permuters write only the mutated\nfunction to --out, with no // FUN_ marker, and splice pasted the region OVER the marker\nline - deleting it and making the function invisible to verify.py and fndiff. It now\nkeeps the marker unless the region carries its own, and strips the NONMATCHING tag,\nsince splicing a winner in is exactly when the body stops being a preserved non-match.\nSix tests cover it. The reproduction guard catches BaseException because permute.Target\ncalls sys.exit, which would tear down a sweep worker rather than fail one target.\n\npermute_min gained a statement-splitting pass: the randomizer packs several statements\nper line and every other pass works line-at-a-time, so nothing could reach them. Fixed\nalongside it, the main loop's \"candidate must be shorter\" filter had been silently\ndisabling every in-place rewrite (deref-of-addr, un-double parens) as well.\n\nFirst-party 3501 MATCH / 1327 ASM, 0 mismatch, lint 0/320, 452 tests, pragma audit\nclean, objdiff 4119/13086, 1241 C-linked, image and SLUS sha1s unchanged.","measures":{"fuzzy_match_percent":13.799705,"total_code":4366400,"matched_code":598236,"matched_code_percent":13.700898,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4105,"matched_functions_percent":31.369404,"complete_code":602552,"complete_code_percent":13.799744,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4119}},{"timestamp":"2026-08-05T03:01:59Z","commit_sha":"92f10b1f493875f8333b638d77f200b146e4c7e2","commit_message":"Match code1_0025 func_0025d7e0: the residual was an operator, not a register\n\nIts nd-2 residual was one comparison row where retail names $at and we named $v0\n(slti $at,$v0,0xB / bnez $at). That reads like a register-allocation floor and is not\none: `x >= K` makes b210 materialise the comparison into a general register, while the\nequivalent `x > K-1` branches through the assembler temp the way retail does. Changing\n`>= 0xB` to `> 0xA` - same semantics - is the whole fix. MATCH at 112B.\n\nFound by running permute_ast (MATCH at 113 compiles) and then permute_min, which cut\nthe hit 35 -> 31 lines and left `> (0xB & 0xFFFF) - 1` legible in the residue. That is\nthe minimizer doing the job it was written for two commits ago: the reduction itself is\nstill not committable, but it names the lever.\n\nThe lever is per-comparison, not a blanket rewrite: applying `>= K` -> `> K-1` to all\neight other preserved bodies containing such a comparison produced no match and made\nfive worse. Recorded in docs/matching.md as a lever to try BEFORE declaring an $at row\na floor, with that negative result attached.\n\nAlso measured and documented the framed-tail-jump family in code1_0043/0044 properly.\nRetail wraps a one-line `return g(a);` in a frame AND tail-jumps: sd $ra / ld $ra /\nj g / addiu $sp in the delay slot, 24B. b210 emits exactly three shapes - 8B frameless\njump, 28B framed jal, 32B unscheduled - across all 18 combinations of\noptimization_level 1/2/3 x tailcall on/off x schedule on/off/absent. `#pragma tailcall\noff` is a real pragma and does stop the collapse; it just overshoots by one\ninstruction. That is a measured floor now, not a verdict.\n\nFirst-party 3500 MATCH / 1328 ASM, 0 mismatch, lint 0/320, 444 tests, pragma audit\nclean, objdiff 4118/13086, 1240 C-linked, image and SLUS sha1s unchanged.","measures":{"fuzzy_match_percent":13.795545,"total_code":4366412,"matched_code":598056,"matched_code_percent":13.696737,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4104,"matched_functions_percent":31.361761,"complete_code":602372,"complete_code_percent":13.795583,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4118}},{"timestamp":"2026-08-05T02:25:31Z","commit_sha":"1913cb5955e602d856967cf4e53bb921ab875d63","commit_message":"Fix the pragma-audit test import on a machine with no compiler\n\ntools/verify.py load_config calls sys.exit when the toolchain is unconfigured. That\nis a BaseException, so the `except Exception` guard around it did nothing and the\nmodule raised at import time - which is every CI runner, where no MWCCPS2 exists.\nThe docstring already promised the helper must never raise; now it actually does not.\nVerified by stubbing verify.load_config to sys.exit and importing the module: MWCC\ncomes back None and the compiler-gated tests skip. 444 tests locally.","measures":{"fuzzy_match_percent":13.792979,"total_code":4366412,"matched_code":597944,"matched_code_percent":13.694173,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4103,"matched_functions_percent":31.35412,"complete_code":602260,"complete_code_percent":13.793018,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4117}},{"timestamp":"2026-08-05T01:48:10Z","commit_sha":"220bd627321426a4f7a989873a57aa6c009dd581","commit_message":"Break the effBattleOnly nd-13 floor: the parameter was never a u16\n\nfunc_004b50f0 carried a floor note citing 15+ probed shapes and a b210 register\ncolouring verdict. Retail masks 0xFFFF twice - andi $v0,$s0 for the range check and\nandi $s0,$s0 for the table index - and a u16 parameter cannot produce that, because\nMWCC masks once on entry and reuses the result. The parameter is s32, and the two\nuses must carry DISTINCT CSE keys or b210 folds them back to one: (u16)id in the\ncheck, (id & 0xFFFF) for the index and the stored id. Swapping which spelling goes\nwhere scores nd 88; using either spelling for both scores nd 13 or nd 167. MATCH.\n\neffBattleOnly.c is now link-eligible, so C objects linked from source goes 157 to 158\nwith the image and SLUS sha1s unchanged.\n\nIts sibling func_004b5200 stays ASM but its note is now exact rather than a verdict.\nRetail spends four instructions on the setup-member address (lw base / addiu 4 /\naddu off / lw 0) and b210 has only two shapes: constant-with-index first, giving the\nright instruction count with the operands transposed at nd 7, or base-load first,\nwhich folds the 4 into the load displacement and comes out one instruction short at\n312B. That shortfall shifts every later word, so the apparent nd 105 cliff behind\nall eight base-first spellings is an alignment cascade, not 105 defects.\n\nFirst-party 3499 MATCH / 1329 ASM, 0 mismatch, lint 0/320, 436 tests, objdiff\n4117/13086 complete, 1240 C-linked.","measures":{"fuzzy_match_percent":13.792979,"total_code":4366412,"matched_code":597944,"matched_code_percent":13.694173,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4103,"matched_functions_percent":31.35412,"complete_code":602260,"complete_code_percent":13.793018,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4117}},{"timestamp":"2026-08-05T01:23:03Z","commit_sha":"8d8b3574d2630ea74d3fb05207b1a0d8c0f0bf84","commit_message":"Add a permuter-hit minimizer; it turned a garbage AST win into readable C\n\nThe AST permuter reaches functions text search cannot, but its winning source is\nunusable, and the note left on scrScriptProcess func_0029d1c0 said the missing\npiece was a post-hit minimizer rather than more hand effort. This builds it.\n\ntools/permute_min.py reuses permute.py's Target, so scoring is the same mwccps2\ncompile and the same reloc-masked compare verify.py uses, then greedily applies\none candidate simplification at a time and keeps it only while the score stays 0:\nempty blocks, dead statements, unused declarations, comma operators, no-op masks,\nderef-of-address, assignments buried in expressions, and single-use tool temps.\n\nOn func_0029d1c0 it cut the seed-23 winner from 78 lines to 47 in 323 compiles.\nThat was enough to see the shape, and reading retail then showed the two remaining\noddities were noise too: the function is two ordinary asserts on different lines\nwith an ordinary list splice. The preserved body is now that correct C instead of\npermuter output, and the residual is pinned at three words - retail materialises\nthe third call argument before the first two. Nine source spellings and\nschedule off all sit at nd 10; schedule off changing nothing proves this is codegen\nargument ordering, the genuine-floor case, not the scheduler.\n\nA test caught the pass that mattered being dead: it counted a temp's declaration\nas a read, so it never fired, which had looked like evidence that every temp was\nload-bearing. Seven tests cover the candidate generator, including that it never\nfolds a name a human chose and never drops a statement from inside a block.\n\nFirst-party 3498 MATCH / 1330 ASM, 0 mismatch, lint 0/320, 436 tests, image and\nSLUS sha1s unchanged over 157 linked objects.","measures":{"fuzzy_match_percent":13.78675,"total_code":4366412,"matched_code":597672,"matched_code_percent":13.6879425,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4102,"matched_functions_percent":31.346476,"complete_code":601988,"complete_code_percent":13.786788,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4116}},{"timestamp":"2026-08-05T00:36:13Z","commit_sha":"fb76500cd656fe08494fed8c56d77e7fa6d546c3","commit_message":"Fix the lint waiver scan; onboard the 190 it had been blocking\n\nMarkers 5,349 -> 5,539. Unscanned 7,737 -> 7,547; scanned coverage 40.9% ->\n42.3%. Matches unchanged at 3,498 first-party -- these are INCLUDE_ASM\nonboardings.\n\nLast commit skipped 190 candidates because onboarding into a file with scoped\noptimization pragmas tripped H003 on pragmas nobody had touched. That was a lint\ndefect, not a real constraint. A banned pragma's waiver is found by scanning up\nfrom its ENCLOSING MARKER, and a run of freshly onboarded INCLUDE_ASM lines\nbetween an existing annotation and the marker it was written for pushed that\nannotation out of the six-line window. Those lines are other functions' whole\nbodies, not intervening code, so `_scan_waiver` now skips them without counting\ndepth -- exactly as it already skipped marker lines.\n\nThe skip is deliberately narrow, and there are two tests for that: a run of eight\nonboarded INCLUDE_ASM stubs between an annotation and its marker must NOT hide\nthe annotation, while a run of eight ordinary declarations still must. Without\nthe second test the fix would be indistinguishable from simply widening the\nwindow, which would weaken every H003 waiver in the tree.\n\nAlso fixed in the onboarding script: it was reading a stale verify report, so a\nre-run re-inserted markers for functions already onboarded and produced 277 M001\nduplicate-marker errors. It now reads a report generated in the same run.\n\nWith the restriction gone, every attributable window in the 64-128 byte band is\nunder test: 467 in total across the two commits, from a state where they had no\nmarker at all and were handed to the link as raw retail bytes.\n\nGate: 0 MISMATCH, lint 0/320, 429 tests (two new), link 157 TUs,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 4116 complete,\n1,239 C-linked, endpoints validate.","measures":{"fuzzy_match_percent":13.78675,"total_code":4366412,"matched_code":597672,"matched_code_percent":13.6879425,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4102,"matched_functions_percent":31.346476,"complete_code":601988,"complete_code_percent":13.786788,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4116}},{"timestamp":"2026-08-04T23:54:12Z","commit_sha":"e7fe80df33dceed66eee5999d661ad6200a8eb50","commit_message":"Put 277 unscanned windows under test; unscanned drops below 60%\n\nMarkers 5,072 -> 5,349. Unscanned windows 8,014 -> 7,737, so scanned coverage\ncrosses 40% (40.9%) and unscanned falls under 60% for the first time. Matches\nunchanged at 3,498 first-party / 4,116 tree-wide, deliberately: these are\nINCLUDE_ASM onboardings, not matches.\n\nWhat they are: canonical windows in the 64-128 byte band that had no marker at\nall -- invisible to verify.py and handed to the link as raw retail bytes from\nimage.bin. They now score as ASM, which is what makes them reachable by fndiff,\nprobe_variants, permute.py and permute_ast.py. Nothing in that band is a\nmechanical one-liner (the largest opcode-signature family is five, all\nmulti-call), so this is the prerequisite step rather than a matching step.\n\nThree rules the batch had to learn, each caught by the gate rather than assumed:\n\n  * A file receiving its first INCLUDE_ASM needs `#include \"include_asm.h\"`.\n    31 of them did not have it, which produced 613-714 COMPILE_ERRORs.\n  * Files using scoped optimization pragmas must be SKIPPED. lint pairs a\n    `schedule on`/`off` bracket with a justification that in these files sits\n    BELOW the closing pragma, so there is no insertion position in such a region\n    that does not separate one from the other -- above the pragma preamble\n    orphans the previous function's closing pragma, at the pragma splits it from\n    the function it scopes, and after it breaks the pairing. 190 candidates are\n    skipped for this reason and stay unscanned.\n  * The marker tripwire counts what verify.py scans, not every `// FUN_` in\n    src/**: a naive count including src/generated/ reads 16,845 against the\n    tripwire's 5,349.\n\nGate: 0 MISMATCH, lint 0/320, 427 tests, link 157 TUs,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 4116 complete,\n1,239 C-linked, endpoints validate.","measures":{"fuzzy_match_percent":13.78675,"total_code":4366412,"matched_code":597672,"matched_code_percent":13.6879425,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4102,"matched_functions_percent":31.346476,"complete_code":601988,"complete_code_percent":13.786788,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4116}},{"timestamp":"2026-08-04T22:52:54Z","commit_sha":"20875653a35b0649abb1e7951a0ae8dda2c52673","commit_message":"Onboard four call-then-return wrappers; document the lq/sq type gap\n\nFirst-party matched 3,494 -> 3,498. Tree-wide 4,112 -> 4,116. Markers\n5,068 -> 5,072, unscanned 8,018 -> 8,014.\n\nFour more from the unscanned set: `addiu / sd / jal / nop / addiu $v0,$zero,K /\nld / addiu / jr` is `g(); return K;`, with the callee declared old-style so no\nargument setup is emitted.\n\nA fifth family is documented as unreachable rather than onboarded. Three windows\nin code1_004a are exactly `lq $v0,($a1) / sq $v0,($a0) / jr $ra`, a single\n16-byte load-store pair. There is no genuine quadword type in this repo --\ninclude/type.h has none, and the `u128` in the m2c drafts is a placeholder\n`typedef u64 u128` -- and no matched source anywhere in src/ emits lq or sq. A\n`struct { u32 w[4]; }` assignment compiles to FOUR lwc1/swc1 pairs, 40 bytes\nagainst a 16-byte window. Reverted and recorded so the struct spelling is not\nretried; these need a real 128-bit type first.\n\nAlso recorded, from two exhaustive sweeps: the AST permuter's yield on the\npreserved-body pool is spent. It cracked 5 of the first 35 targets; a second\nsweep over the remaining 29 at the same 150-second budget cracked none.\n\nThe batch inserter is now block-comment-aware and pragma-aware when it walks up\nto find an insertion point, after the two editing bugs the last commit recorded.\n\nGate: 0 MISMATCH, lint 0/320, 427 tests, link 157 TUs,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 4116 complete,\n1,239 C-linked, endpoints validate.","measures":{"fuzzy_match_percent":13.78675,"total_code":4366412,"matched_code":597672,"matched_code_percent":13.6879425,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4102,"matched_functions_percent":31.346476,"complete_code":601988,"complete_code_percent":13.786788,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4116}},{"timestamp":"2026-08-04T21:54:27Z","commit_sha":"297326e3a26d5f3df0ae603857d922e5fb993b2e","commit_message":"Break the sdkLbox colouring floor with one hoisted local; sweep by AST\n\nFirst-party matched 3,493 -> 3,494, ASM 864 -> 863. Tree-wide 4,112.\npermute_sweep gains --engine {text,ast}.\n\nsdkLbox func_00470970 is the result that matters. It carried an nd-18\n\"saved-register colouring floor\" verdict backed by seven hand spellings, and\ntools/permute.py re-confirmed 18 after 1,687 compiles. The AST sweep cracked it,\nand the essential change reduces to ONE honest line: materialize the node\npointer as an s32 BEFORE the list walk and store that local afterwards, instead\nof casting inline at the store. That single hoist fixes the entire $s0/$s1\nmirror. Nothing else about the body changed.\n\nAn AST sweep over the 35 targets the text permuter could not move cracked five.\nOnly that one reduced to committable C. The other four -- scrScriptProcess\nfunc_0029d1c0, k_vpad func_004b5800, effBattleOnly func_004b50f0, cutinDraw\nfunc_00120e20 -- win only through source carrying uninitialized reads,\nself-assignments, comma operators and up to 21 dead temps. Each now records the\nreproduction and points at its saved region under build/permute/, and each says\nexplicitly that this is unfinished reduction work rather than a floor, because\nthe one that DID reduce had the firmest floor verdict of the five.\n\n--engine ast therefore does NOT splice its hits into the tree; it restores the\nfile and reports CRACKED_AST. Only text-engine hits are commit-ready.\n\nTwo self-inflicted bugs caught by the gate, both worth recording:\n\n  * The comment-block walker I used to replace stale notes only recognised lines\n    starting with `//`, `/*` or `*`, so on a multi-line `/* ... */` whose middle\n    lines are bare prose it ate ONLY the closing `*/` line and left the block\n    unterminated, swallowing the next 200 lines of scrScriptProcess.c into a\n    comment. 22 COMPILE_ERRORs. The walker now finds the `/*` opener.\n  * Consuming a run of `//` lines to replace a note ate the `// FUN_` markers\n    that followed it, dropping the marker count 5,068 -> 5,066. The tripwire\n    caught it. Notes are now INSERTED above the marker without consuming\n    anything.\n\nGate: 0 MISMATCH, lint 0/320, 427 tests, marker count 5,068 unchanged,\nlink 157 TUs, image 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 4112\ncomplete, 1,239 C-linked, endpoints validate.","measures":{"fuzzy_match_percent":13.783301,"total_code":4366460,"matched_code":597528,"matched_code_percent":13.684495,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4098,"matched_functions_percent":31.31591,"complete_code":601844,"complete_code_percent":13.783339,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4112}},{"timestamp":"2026-08-04T20:58:25Z","commit_sha":"99878ca1005c2415c2b1f52c9076868d4b9176b5","commit_message":"Port permute_ast: AST search reaches a function text search cannot\n\ntools/permute_ast.py, from the sibling P3 tree -- decomp-permuter's ~30 AST\npasses (temporary-for-expression, type randomization, statement reordering,\nreassociation) driven against this repo's mwccps2 compile and verify.py's\nreloc-masked scoring. Same two adaptations as permute.py: the boundary-map\nfilename, and RetailElf taking a target dict for config/target.json validation.\ndecomp-permuter is cloned on first use into tools/decomp-permuter, now\ngitignored; pycparser, attrs, toml and WSL `cpp` were already present.\n\nIt is categorically stronger than the text permuter, and the evidence is\ncutinDraw func_00120e20 -- nd 4, whose note recorded \"order, s16/s32 temp types,\nunion, indexing forms - all nd=4\" from hand attempts, and which tools/permute.py\ncould not move at a 420-second budget. permute_ast reached byte-exact in 28\ncompiles, about 15 seconds, verified MATCH at 180B.\n\nIt is NOT committed as a match, because the winning form is not honest source. It\nneeds an empty `if (arg1) { }`, `hi` typed `unsigned int`, and the lo load taken\nthrough a named `s16 *` temp. I measured four reductions toward clean C and every\none falls back to MISMATCH: dropping the s16* temp, dropping the u8* store temp,\ndropping the empty if, and a hand-written clean version carrying the u32 type\nplus both pointer temps. Only the s16* temp is defensible; the empty if is dead\ncode. decomp_lint does not currently catch `if (x) { }`, so this was a judgement\ncall against the source-honesty policy rather than a tool rejection.\n\nWhat is recorded instead is the exact reproduction -- tool, seed, budget -- above\nthe function, so the reduction can be resumed from the permuter output rather\nthan from scratch. That is more useful than storing heavily mutated source.\n\nThe honest reading of this result: some remaining functions are byte-reachable\nbut not with source anyone should commit, and that distinction is now measurable\ninstead of assumed.\n\nGate: 0 MISMATCH, lint 0/320, 427 tests, link 157 TUs / 1,746 functions\nunchanged, image 3d1d3d2b / SLUS 4eeec036.","measures":{"fuzzy_match_percent":13.776705,"total_code":4366460,"matched_code":597240,"matched_code_percent":13.677899,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4097,"matched_functions_percent":31.30827,"complete_code":601556,"complete_code_percent":13.776743,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4111}},{"timestamp":"2026-08-04T20:25:50Z","commit_sha":"40a434259ad635c0668430b0148b0b30bf6612c8","commit_message":"Characterise the 19-function getter floor and the permuter's budget ceiling\n\nDocs only; no source or count change (first-party 3,493 / ASM 864, 0 MISMATCH).\n\nTwo measured negative results recorded in docs/matching.md so neither gets\nre-ground.\n\nThe code1_004c-0052 getter family was already listed as a floor, but vaguely.\nIt is now pinned: retail is exactly three words -- `lui $v1,%hi / jr $ra /\nlw $v0,%lo($v1)`, or `lw $v1,off($a0) / jr $ra / lw $v0,off2($v1)` -- so the\nADDRESS goes to $v1 and the value to $v0, with the second load in the delay slot.\nb210 always reuses $v0 for the intermediate. That one word is the entire\nresidual, and only AFTER `#pragma schedule on`, which these files need because\nscheduling is off at file scope; without it the object is four words against a\nthree-word window. Invariant across five source forms I measured: a magic\n`0x00710000 + off` literal, a `u32 *` pointer local, separate locals for base and\nvalue, a scalar `extern u32 D_xxxxxxxx;` (which goes gp-relative and is two words,\ntoo short), and `extern u32 D_xxxxxxxx[]; return D_xxxxxxxx[0];`. The array-extern\nform is the one worth keeping -- it is the only spelling that reproduces retail's\nrelocated %hi/%lo pair without inventing a magic address. 19 functions sit here,\nevery one at exactly one differing word.\n\nAnd the permuter's ceiling: the 60-second sweep cracked three. A second sweep at\n420 seconds over the 35 targets that had scored 3-60 cracked NONE, with every\nscore identical to the 60-second run. tools/permute.py converges inside a minute;\nmore time buys nothing. What remains needs a search that RESTRUCTURES code rather\nthan reordering lines and swapping operands, which is permute_ast.py and\ndecomp-permuter's AST passes, not a longer budget.\n\nBoth sweeps left the tree byte-identical apart from the three commits' winners,\nchecked with a whole-tree sha1 snapshot before and after.\n\nGate: 0 MISMATCH, lint 0/320, 427 tests.","measures":{"fuzzy_match_percent":13.776705,"total_code":4366460,"matched_code":597240,"matched_code_percent":13.677899,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4097,"matched_functions_percent":31.30827,"complete_code":601556,"complete_code_percent":13.776743,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4111}},{"timestamp":"2026-08-04T19:45:20Z","commit_sha":"8e2db33d425f895d9fe8a42a21dea10521838a90","commit_message":"Port permute_sweep; the permuter cracks three documented floors\n\nFirst-party matched 3,490 -> 3,493, ASM 867 -> 864. Tree-wide 4,108 -> 4,111.\n\ntools/permute_sweep.py, adapted rather than copied. The P3 version discovers\ntargets from a verify scan looking for MISMATCH rows, which finds nothing here:\nthis repo holds 0 MISMATCH by policy and its unmatched functions are INCLUDE_ASM\nwith no live C. What it does have is 86 functions whose best-known body was\npreserved under `#ifdef NON_MATCHING` when it was written off. Those bodies are\nexactly what a permuter needs, so this version discovers them, activates each\none, permutes under a budget, and either keeps the winner or restores the file\nbyte-for-byte. Files are the unit of mutual exclusion because permute.py edits\nthe source in place.\n\nA 1,598-second sweep over all 86 at a 60-second budget cracked three functions\nthat had each been documented as a floor:\n\n  y_fclModel       func_0034a4f0   documented at nd 5 earlier today after five\n                                   hand attempts\n  code1_0017       func_00176220   carried a `slt $at` floor note\n  btlResultHeroLvUp func_00221cf0  carried an nd-4 \"$v0-vs-$at compare-temp\n                                   floor\" note\n\nAll three notes are replaced; none of those verdicts survived contact with an\nautomated search.\n\nThe sweep's first run reported those three as CRACKED and verify.py then called\nall three MISMATCH. permute.py restores the source it was handed and writes the\nwinning region to --out, so leaving the activated file in place kept the LOSING\nbody. Fixed by splicing the --out region over the marker-to-brace span. The\ntool's own warning -- re-confirm every hit with verify.py -- is what caught it,\nand 0 MISMATCH is now re-proved.\n\nPermuter output needs pruning before it is committed. For func_0034a4f0 it\nproposed s32 copies of both parameters, which turned out to be noise (the\nfunction still matches without them), while `optimization_level 1` IS\nload-bearing: removing it goes straight back to MISMATCH. That distinction was\nmeasured one pragma at a time, and the banned-pragma justification now says so\nwith \"measured\" inside the three-line window H003 requires.\n\nGate: 0 MISMATCH, lint 0/320, 427 tests, link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 4111 complete,\n1,239 C-linked, endpoints validate.","measures":{"fuzzy_match_percent":13.776705,"total_code":4366460,"matched_code":597240,"matched_code_percent":13.677899,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4097,"matched_functions_percent":31.30827,"complete_code":601556,"complete_code_percent":13.776743,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4111}},{"timestamp":"2026-08-04T18:38:35Z","commit_sha":"87d851badc6a707948a9b7ad933b5c50ee26a919","commit_message":"Port the P3 permuter: automated source search this repo had no equivalent of\n\ntools/permute.py, from the sibling Persona 3 FES tree. This repo could only\nscore candidates a human wrote (tools/probe_variants.py); the permuter GENERATES\nthem and hill-climbs on the same reloc-masked score verify.py uses. Measured\nhere: ~1,600 candidate compiles per minute.\n\nIt mutates exactly the levers this campaign has been applying by hand --\nlocal-declaration order, statement order, commutative operand swaps, additive\nreassociation, optimization_level and schedule pragma cycling.\n\nEvidence it works, on three functions with documented residuals:\n  code1_003a func_003a15e0   14 -> 1 in 12 iterations, finding by itself the\n                             return-value-first + delay-slot shape I had derived\n                             by hand, and stopping on the same commutative addu\n  sdkLbox   func_00470970    18 -> 18 after 1,687 compiles; independent\n                             confirmation that the $s0/$s1 mirror is a real\n                             allocator floor rather than something I missed\n  cmmMisc   func_00249670    6 -> 6 after 1,613 compiles, likewise\nIt also self-classifies the residual by kind, which is the triage I was doing by\neye.\n\nThe port needed only the boundary-map filename changed: this repo's verify.py\nalready exports the same REPO/TOOLS/ObjectFile/RetailElf/compare/load_config/\ncompile_object surface, apart from RetailElf taking a target dict here, which is\nnow passed with the same target.json validation fndiff.py does.\n\nThree defects found and fixed while validating it, all present in the original:\n\n  * mut_operands rewrote DECLARATIONS. `u8 *second;` matches the commutative\n    pattern with `*` read as a multiply, so it produced `second * u8;`. Harmless\n    only because it cannot compile; it burned iterations. Now skipped via\n    is_declaration().\n  * COMMUTE_RE required identifiers on BOTH sides, so `x + 4` could never be\n    transposed -- and half the operand-order residuals in this repo have a\n    literal on one side, which left that whole class unreachable. Widened to\n    accept decimal and hex literals.\n  * On success it wrote `<source>.match.c` NEXT TO the source. build.py and\n    verify.py both glob src/**/*.c, so that sidecar would be compiled as a\n    translation unit and its duplicate symbols would break the link. It now\n    writes under build/permute/, which is gitignored and not globbed.\n\ntests/test_permute.py (6 tests) covers the region contract -- every mutator must\npreserve the marker and exactly one closing brace, since losing either splices\nthe next function into this one, the failure that once deleted six functions\nhere through probe_variants -- plus declaration-reorder completeness and both\noperand-swap fixes.\n\nGate: 0 MISMATCH, lint 0/320, 427 tests, link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036.","measures":{"fuzzy_match_percent":13.754094,"total_code":4366484,"matched_code":596256,"matched_code_percent":13.655289,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4094,"matched_functions_percent":31.285343,"complete_code":600572,"complete_code_percent":13.754132,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4108}},{"timestamp":"2026-08-04T18:16:38Z","commit_sha":"8948e7e92c9acae72afa35910c88aca834c5526f","commit_message":"Onboard 11 zero-stores and call-then-flag wrappers\n\nFirst-party matched 3,479 -> 3,490. Tree-wide 4,097 -> 4,108 (31.4% of\nwindows). Markers 5,057 -> 5,068, unscanned 8,029 -> 8,018.\n\n`*(T *)(arg0 + off) = 0` zero stores, and wrappers that call a function then OR\na flag into a field of the returned pointer.\n\nA third family is deliberately NOT here. `lw $v1,-K($gp); move $v0,$a0;\naddu $v1,$a0,$v1; jr; sw $zero,($v1)` is `*(s32 *)(arg0 + gpbase) = 0;\nreturn arg0;` and b210 canonicalizes the commutative `addu` to gpbase+arg0 where\nretail has arg0+gpbase, so it will not match from either spelling. Worse, the\nattempt taught a real lesson about batch insertion: two of those blocks landed\nbetween an existing `#pragma schedule on` / `optimization_level 3` and the\nfunction that pragma was written for, which silently broke functions that were\nalready matching and tripped H003 on a pragma whose justification was no longer\nwithin three lines. Both files were reverted. A batch inserter must not place a\nblock inside an existing pragma scope.\n\nThe five gp symbols curated for that family stay registered -- the retail\ninstructions genuinely reference those slots and the evidence notes are correct,\nso they are useful to the next attempt even though no C consumes them yet.\n\nGate: 0 MISMATCH, lint 0/320, 421 tests, cache-free link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 4108 complete,\n1,235 C-linked, endpoints validate.","measures":{"fuzzy_match_percent":13.754094,"total_code":4366484,"matched_code":596256,"matched_code_percent":13.655289,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4094,"matched_functions_percent":31.285343,"complete_code":600572,"complete_code_percent":13.754132,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4108}},{"timestamp":"2026-08-04T17:40:28Z","commit_sha":"6e83667f567cf4260eeff6579a6bf66487beaa31","commit_message":"Onboard 18 more small shapes; two pragma-placement lessons\n\nFirst-party matched 3,461 -> 3,479. Tree-wide 4,079 -> 4,097 (31.3% of\nwindows). Markers 5,039 -> 5,057, unscanned 8,047 -> 8,029.\n\nFamilies: $a1 field setters, setters through a pointer field, `return K` leaves\nwhose constant sits in the jr DELAY SLOT, gp-getter-plus-offset, and calls\nthrough a gp function pointer (six more curated gp symbols, each evidenced by\nthe retail instruction naming its displacement).\n\nTwo placement lessons, both found by the verifier rather than assumed:\n\nA `return K` leaf is `jr $ra; addiu $v0,$zero,K` -- 8 bytes with the constant in\nthe delay slot. In files where scheduling is off at file scope (code1_0041.c)\nb210 emits addiu; jr; nop instead, 12 bytes against an 8-byte window, so the\nfunction needs its own `#pragma schedule on`.\n\nThree of these landed inside an existing `#pragma optimization_level 3` scope in\ncode1_0039.c. Moving them out to keep the scope minimal broke all three, which\nis evidence the level is load-bearing for them too, so they stay inside and the\nscope's note now says so. The closing `optimization_level 2` must keep the word\n\"measured\" within three lines of the pragma or H003W fires -- my first\njustification was correct prose but five lines long and lint rejected it.\n\nAlso repaired: an earlier `jj restore` of three files, done to undo a bad batch,\nsilently discarded one good accessor (func_00202e60) that was in the same\nuncommitted change. It is re-added here. Revert by file is too coarse when a\nfile holds both good and bad new work.\n\nGate: 0 MISMATCH, lint 0/320, 421 tests, cache-free link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 4097 complete,\n1,235 C-linked, endpoints validate.","measures":{"fuzzy_match_percent":13.746535,"total_code":4366528,"matched_code":595932,"matched_code_percent":13.647731,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4083,"matched_functions_percent":31.201284,"complete_code":600248,"complete_code_percent":13.746574,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4097}},{"timestamp":"2026-08-04T17:00:18Z","commit_sha":"eb2074623b1a5c2635ecbeb4313d1b99a90befab","commit_message":"Onboard 14 gp-relative accessors; register 12 curated gp symbols\n\nFirst-party matched 3,447 -> 3,461. Tree-wide 4,065 -> 4,079. Markers\n5,025 -> 5,039, unscanned 8,061 -> 8,047.\n\nTen `lw $v0,-K($gp); jr` getters, three `sw $a0,-K($gp); jr` setters, and one\n`lw $v1,-K($gp); sw $a0,off($v1); jr`. Fourteen distinct gp slots are involved\nand only two already had a recovered symbol, so twelve are newly curated in\nconfig/symbol_data_addrs.txt. Each carries the retail instruction that names its\ndisplacement as evidence, and each address is 0x007690F0 minus that\ndisplacement -- the constraint the symbol tests enforce.\n\n0x00762EA0 already had names from three sources (D_00762EA0, PTR_DAT_00762ea0,\ngMtScene, iGpffff9db0); the iGpffff form is used so the displacement stays\ncheckable against gp.\n\nBecause new symbols are registered, the link was re-proved cache-free: 321\neligibility misses, 156 link misses, 156 C objects, image 3d1d3d2b and SLUS\n4eeec036 both intact. A wrong or unresolvable symbol would have dropped a linked\nTU, and the object count is unchanged.\n\nGate: 0 MISMATCH, lint 0/320, 421 tests, cache-free link 156 C objects,\nobjdiff 13086 units 4079 complete, 1,235 C-linked, endpoints validate.","measures":{"fuzzy_match_percent":13.738197,"total_code":4366616,"matched_code":595580,"matched_code_percent":13.639395,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4065,"matched_functions_percent":31.063732,"complete_code":599896,"complete_code_percent":13.738235,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4079}},{"timestamp":"2026-08-04T16:32:25Z","commit_sha":"04c1866bdce8db85b7de411581486f236313d71d","commit_message":"Onboard 45 wrappers and constant returns; 31% of windows now match\n\nFirst-party matched 3,402 -> 3,447. Tree-wide 4,020 -> 4,065 (31.1% of\nwindows). Markers 4,980 -> 5,025, unscanned 8,106 -> 8,061.\n\nThree more families read out of image.bin, all in non-linked code1_XXXX.c\nplaceholders, all matching:\n\n   25  addiu / sd / jal / nop / ld / addiu / jr    single-call wrapper\n   11  addiu / sd / lw / lui / lw / jalr / ...     vtable-call wrapper\n    9  daddu $v0,$zero,$zero / jr                 return 0\n\nThe single-call wrapper is `void f(void) { g(); }` and the callee MUST be\ndeclared old-style (`extern void g();`). Retail's wrapper contains no argument\nsetup at all -- whatever the caller left in $a0..$a3 flows through -- so a typed\nprototype would either refuse the zero-argument call or make mwcc materialize\narguments retail does not have. The vtable wrapper is the same shape already\nmatched by hand at func_0017cc90: `jtbl_008873EC[0](*(u8 **)(arg0 + 0x38))`.\n\nStill on the table in this seam: 411 attributable unscanned windows are 56 bytes\nor less. The next shapes are gp-relative accessors -- `lw $v0, -K($gp)` getters,\n`sw $a0, -K($gp)` setters, and `lw $v1, -K($gp); sw $a0, off($v1)` -- which are\none line each but need their gp symbols registered in\nconfig/symbol_data_addrs.txt with evidence first, so they are a separate step\nwith a link proof rather than a mechanical batch.\n\nGate: 0 MISMATCH, lint 0/320, 421 tests, link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 4065 complete,\n1,235 C-linked, endpoints validate.","measures":{"fuzzy_match_percent":13.734095,"total_code":4366668,"matched_code":595408,"matched_code_percent":13.635294,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4051,"matched_functions_percent":30.956749,"complete_code":599724,"complete_code_percent":13.734134,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4065}},{"timestamp":"2026-08-04T16:06:24Z","commit_sha":"ee9284df464cf43d7803650fa2a8b9866d80c284","commit_message":"Onboard 66 more one-line functions read out of image.bin; all match\n\nFirst-party matched 3,336 -> 3,402. Tree-wide 3,954 -> 4,020 (30.7% of\nwindows, first time past 30%). Markers 4,914 -> 4,980, unscanned 8,172 ->\n8,106.\n\nSame method as the stub batch, widened. Disassemble every unscanned window that\nfalls in a non-linked code1_XXXX.c placeholder span, group them by opcode\nsignature, and write the families that are one line of C:\n\n   36  lw / lhu / addiu|ori|andi / sh / jr   read-modify-write of a halfword\n                                             through a pointer field\n   17  direct getters and setters, and getters through a pointer field\n    9  daddu $v0,$a0 / jr                    `return arg0`\n    4  lw / sw / jr                          field copy\n\nThe signature histogram is worth keeping: 266 attributable unscanned windows are\n40 bytes or less, and the top signatures are all small shapes like these, so this\nseam is not exhausted. `addiu / sd / jal / nop / ld / addiu / jr` (25 of them) is\na single-call wrapper and is the obvious next family.\n\nOne instructive bug: the first attempt at the read-modify-write family typed the\nlvalue from the STORE opcode, but `sh` cannot distinguish s16 from u16, so the C\nemitted `lh` where retail has `lhu` and all 47 mismatched at exactly one word.\nThe load opcode is the only thing that carries signedness. Caught by the\nverifier, reverted, redone from the load type, and recorded in the tripwire\ndocstring so the next batch does not repeat it.\n\nGate: 0 MISMATCH, lint 0/320, 421 tests, link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 4020 complete,\n1,235 C-linked, endpoints validate.","measures":{"fuzzy_match_percent":13.701966,"total_code":4366748,"matched_code":594016,"matched_code_percent":13.603166,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":4006,"matched_functions_percent":30.612867,"complete_code":598332,"complete_code_percent":13.7020035,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":4020}},{"timestamp":"2026-08-04T15:37:57Z","commit_sha":"4dc83cbbd7a895a4e061c0587ca664c2a51b0610","commit_message":"Onboard 38 trivial stubs found by scanning retail bytes; all 38 match\n\nFirst-party matched 3,298 -> 3,336. Tree-wide 3,916 -> 3,954 (30.2% of\nwindows). Markers 4,876 -> 4,914, unscanned windows 8,210 -> 8,172.\n\nAttribution, which was the blocker, turns out to be mechanical for half the\nunscanned set. The src/promoted/code1_XXXX.c placeholders are address-range\nfiles and only ONE of the 55 is linked, so 2,532 of the 4,763 unscanned\nfirst-party windows already fall inside the marked span of a NON-LINKED\nplaceholder. Putting a marker there cannot move any linked object's carve\nlayout -- the image and SLUS hashes are unchanged, 156 C objects as before.\n\nFinding the work: read image.bin at every unscanned window and look for a body\nthat is entirely `jr $ra; nop` (72 of them) or `addiu $v0,$zero,K; jr $ra`\n(8). 39 of those 80 land in a non-linked placeholder span; 38 are onboarded\nhere (the 39th, func_004b5f70, landed last commit). Each is one line of C and\neach matches.\n\nOne real bug caught by the verifier: `addiu` SIGN-EXTENDS its immediate, so the\n0xFFFF at 0x001F9740 is `return -1`, not `return 65535`. Written unsigned it is\na MISMATCH. That is now recorded in the tripwire docstring.\n\nTwo of the 38 were already declared by linked callers -- func_0034b8c0 as\n`void (void)` in sequenceList.c and func_003544f0 as `s32 (void)` in\ncmpSystem.c -- and both prototypes agree with the recovered bodies, which is\nindependent confirmation of the nullsub and return-constant readings.\n\nGate: 0 MISMATCH, lint 0/320, 421 tests, link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 3954 complete,\n1,235 C-linked, endpoints validate.","measures":{"fuzzy_match_percent":13.668082,"total_code":4367184,"matched_code":592596,"matched_code_percent":13.569292,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3940,"matched_functions_percent":30.108511,"complete_code":596912,"complete_code_percent":13.668121,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3954}},{"timestamp":"2026-08-04T15:09:31Z","commit_sha":"995c1d224428f9bf2fc2ceeb612e4b1a35c4ff6a","commit_message":"Onboard the k_shadow TU span; onboarding yields matches immediately\n\nTen unscanned windows in 0x0017B510..0x0017CCC0 now carry markers, and two of\nthem matched as soon as they were visible. Markers 4,866 -> 4,876, unscanned\nwindows 8,220 -> 8,210, first-party matched 3,296 -> 3,298.\n\ntu_audit groups that whole span as ONE translation unit at HIGH tier (score 5)\nfrom a `__FILE__` string naming k_shadow.c, and two of its twelve members were\nalready marked in code1_0017.c. The ten join their siblings there rather than\ngoing into src/Kosaka/Field/k_shadow.c, which despite the name is a different,\nalready-linked TU at 0x001026B0 -- moving anything into a linked object would\nchange the carve layout, and the name alone is not evidence for that. A comment\nrecords the grouping so the real split can be done later on purpose.\n\nMatched from the newly visible set:\n  func_0017b990  *(s32 *)(*(u8 **)(arg0 + 0x38) + 4) = arg1;\n  func_0017cc90  jtbl_008873EC[0](*(u8 **)(arg0 + 0x38));\n\nThat is the argument for onboarding over grinding: these two were one line each\nand had been sitting outside the verifier the whole campaign. The other eight\nare 432B-1152B and now have m2c drafts, fndiff, and probe_variants available.\n\nWhere the __FILE__ evidence runs out: of tu_audit's 146 named groups, only three\ncontain unscanned functions at all, covering twelve. So filename strings will not\nattribute the remaining ~4,750 unscanned first-party windows; that needs a\ndifferent signal (call graph, data-reference clustering, or the scheduler\nstretches tu_audit already computes but does not propose on).\n\nGate: 0 MISMATCH, lint 0/320, 421 tests, link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 3916 complete,\n1,235 C-linked, endpoints validate. Tripwire bumped 4,866 -> 4,876 with the\ngrouping evidence recorded.","measures":{"fuzzy_match_percent":13.659617,"total_code":4367460,"matched_code":592264,"matched_code_percent":13.560835,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3902,"matched_functions_percent":29.818127,"complete_code":596580,"complete_code_percent":13.659657,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3916}},{"timestamp":"2026-08-04T14:48:32Z","commit_sha":"4418157ea7998dbac6fc5979365a8596a7ccfcab","commit_message":"Bring two unscanned nullsubs into the pipeline; onboarding is link-safe\n\nfunc_001c7770 (btlCamera.c) and func_004b5f70 (k_vpad.c) -- both `jr $ra`\nnullsubs, both MATCH as empty functions. Markers 4,864 -> 4,866, first-party\nmatched 3,294 -> 3,296, unscanned windows 8,222 -> 8,220.\n\nThe point of this commit is the recipe, not the two functions. Both are\ncanonical windows that sat BETWEEN two already-marked functions OF THE SAME\nFILE, so their owning TU was never in doubt -- they simply had no marker, which\nkept them out of the verifier entirely and supplied their bytes to the link\nstraight from image.bin. Adding the marker and the C body leaves the loadable\nimage SHA-1 and the SLUS hash untouched (156 C objects, cache-free link path\nexercised for both files), so onboarding an unscanned window costs nothing and\ncan be done in batches.\n\nScale of the seam, measured against the retail bytes in image.bin: of the 4,763\nunscanned windows in first-party address regions, 72 are pure `jr $ra; nop`\nnullsubs and 8 are `addiu $v0,$zero,K; jr $ra` constant stubs -- 80 functions\nthat are one line of C each. The blocker is ownership, not difficulty: only 2 of\nthe 80 are bracketed by marked functions of a single file, 13 sit immediately\nafter a marked function, and 65 have no adjacent marked file at all. Those 65\nneed a translation unit before they can carry a marker.\n\nThat is the shape of the remaining work generally. The 4,763 unscanned\nfirst-party windows form 68 contiguous runs with 93% inside 38 runs of twenty or\nmore -- whole TUs never created. tools/tu_audit.py proposes boundaries for 935 of\nthem and reports 7,199 functions unassigned to any group, so TU attribution, not\nper-function matching, is what gates the bulk.\n\nMarker tripwire bumped 4,864 -> 4,866 with the reason recorded, per its own\n\"bump deliberately\" contract.\n\nGate: 0 MISMATCH, lint 0/320, 421 tests, link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 3914 complete,\n1,235 C-linked, endpoints validate.","measures":{"fuzzy_match_percent":13.658231,"total_code":4367464,"matched_code":592204,"matched_code_percent":13.559447,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3900,"matched_functions_percent":29.802843,"complete_code":596520,"complete_code_percent":13.658269,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3914}},{"timestamp":"2026-08-04T14:23:15Z","commit_sha":"3a9b255021e16eadc5afeb3ff0bd69d4bede7439","commit_message":"Report the 8,222 windows nobody has put under test\n\nI have been describing first-party progress as \"79.3%\". That figure is\n3,294 / 4,153 -- matched over the functions that HAVE a `// FUN_` marker. It\nsilently excludes every window with no marker at all, and those are the\nmajority of the binary.\n\nMeasured from tools/slus21782_functions.json against the verifier report:\n\n  canonical windows                     13,086\n  scanned (a marker scores them)         4,864   37.2%\n  NOT scanned, handed to the link as\n    raw retail bytes from image.bin      8,222   62.8%\n  byte-identical                         3,912   29.9%\n\nOf the 8,222 unscanned, 3,459 fall inside the third-party address blocks\n(RenderWare / CRI / Sony, derived from where the scanned third-party functions\nlive) and 4,763 do not. So first-party work remaining is roughly 859 marked\nINCLUDE_ASM functions PLUS ~4,763 with no marker at all -- about 5,622\nfunctions, not 859, and first-party completion is nearer 37% than 79%. The\nunmarked set is ~1.9 MiB of code in 68 contiguous runs, 93% of it in 38 runs of\ntwenty or more functions, i.e. whole translation units never brought into the\npipeline. 4,762 of them have no extracted .s either. tools/tu_audit.py already\nproposes boundaries for only 935 of them.\n\nprogress.py now emits a `coverage` block and two README rows for this, so the\ndenominator can no longer drift out of sight. render_status requires the field\nrather than defaulting it, because a silently absent coverage number is exactly\nthe failure this is meant to prevent -- the same drift its own docstring records\nfrom when the table claimed 1,314 matches against a true 3,419.\n\nTests: 421 (one new, asserting a window with no marker is counted as unscanned\nand that the honest denominator stays every window); the three render_status\nfixtures now carry coverage and assert the unscanned row reaches the table.\nLint 0/320, link 156 C objects, image 3d1d3d2b / SLUS 4eeec036, endpoints\nvalidate.","measures":{"fuzzy_match_percent":13.657815,"total_code":4367480,"matched_code":592188,"matched_code_percent":13.5590315,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3898,"matched_functions_percent":29.787558,"complete_code":596504,"complete_code_percent":13.657853,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3912}},{"timestamp":"2026-08-04T14:01:45Z","commit_sha":"8ef8ff24c1ef669d5bbf846365819d04d5f6ff93","commit_message":"Reconstruct two more from their m2c drafts; recover three declaration facts\n\nNo count change (first-party 3294 / ASM 859) -- both functions land as\ndocumented near-matches with their bodies kept under NON_MATCHING.\n\nThe useful discovery this round is that 111 of the 112 untouched first-party\nASM functions already have an m2c draft under src/generated/. Reading the\ndraft first is far faster and more accurate than decoding the window by hand,\nand m2c's own temp_NN / var_NN numbering encodes retail's saved-register\nassignment -- temp_16 is $s0, var_17 is $s1.\n\ncmmMisc func_00249670: nd 4 from 14 (three real words). Declaring `v` before\n`n` fixed a whole-function $s0/$s1 mirror, which m2c's var_17 naming predicted;\nthen opt_propagation off stops b210 forwarding `v = arg0` so the zero test\nreads the saved copy retail tests instead of $a0. Remaining: the two parameter\nsaves come out in register order rather than parameter order.\n\nmt_sceneIcon func_0026d890: nd 20 from 55. The win was the exit shape -- the\nshared `return 0` belongs at the very END with case 0 reaching it via `break`,\nnot as a `default: return 0;` between case 0 and case 1 the way m2c prints the\nirregular switch. Remaining is a $s0/$s1 mirror made wide by retail reusing\nw's register for the icon pointer once w is dead. Collapsing the two zero cases\ninto an `||` chain to chase a `sltiu $at` destination measured 61 -- much\nworse; the nested else-if is right.\n\nThree declaration facts recovered, all verified not to disturb the already\nmatched neighbours in these files:\n- func_00145270 takes an id in $a0 from func_0026d890 but is called bare from\n  func_0026da30, so it must be declared old-style.\n- func_0026d890 really returns 0 / -1 in $v0 even though the task dispatcher\n  discards it; its prototype is s32 and the callback site casts.\n- func_00452560 must stay intentionally undeclared (a typed prototype adds\n  zero-extension codegen retail lacks), so callers cast the result instead.\n\nGate: 0 MISMATCH, lint 0/320, 420 tests, link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036. func_0026da30 re-verified MATCH after the\nprototype changes.","measures":{"fuzzy_match_percent":13.657815,"total_code":4367480,"matched_code":592188,"matched_code_percent":13.5590315,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3898,"matched_functions_percent":29.787558,"complete_code":596504,"complete_code_percent":13.657853,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3912}},{"timestamp":"2026-08-04T13:31:50Z","commit_sha":"f2b5d1bac7ee0ddcdf078c356aba0a1a37bf98d6","commit_message":"Match btlUnit func_0019acd0; nest an && chain to fix operand loading\n\nFirst-party 3293 -> 3294 (79.3%), ASM 859. Two more floors documented with\ntheir bodies.\n\nbtlUnit func_0019acd0 came down to nd 4 quickly and then stuck on ONE halfword\nload order: retail loads arg0+6 into $a1 and obj+0xD6 into $v1, b210 the\nreverse. Splitting the `&&` chain into NESTED ifs -- so the second comparison\nassigns its coordinate on its own line exactly as the first does -- fixed it.\nWhen one comparison in a short-circuit chain matches and the next has its\noperands transposed, un-chain it rather than reaching for a pragma.\n\nIts m2c draft (src/generated/code1_0019.c:5491) was worth reading first: it\nrevealed that retail's `jal func_004787e0` passes a HIDDEN second argument in\n$a1, the coordinate still live from the comparison. Declaring it old-style\n(`extern void func_004787e0();`) and calling it with one argument reproduces\nthat. Registered iGpffffa0b0 = 0x007631A0 (gp -0x5F50) for its func_00440b68\ncall; cache-free link re-verified at 156 C objects with both hashes intact.\n\ndatCalc func_00241de0 documented at nd 7 from 65 (six real words). Two levers:\nthe first discrete test must be a switch with ASCENDING case labels (65 -> 47,\nreproducing retail's descending 10-then-9 test order branching to a shared\ntarget) while the SECOND test stays an `||` chain because retail tests it\nascending; and DISTINCT CSE KEYS for the index -- `(arg2 & 0xFFFF)` in the\nassert, `(u16)arg2` in the table index (47 -> 7). With one spelling in both\nplaces b210 caches the masked value in a sixth saved register and the frame\ngrows to 0x70 against retail's 0x60.\n\nsdkPak2 func_00468bf0 documented at nd 8 from 49. The entire win was making the\nrange test a POSITIVE guard around the whole body with a single trailing\n`return 0`; as an early return b210 materializes the zero inline and uses\n`slt $v0`/`bnez` instead of retail's `slt $at`/`beqz` forward branch. That also\nexplains the $at destination -- it appears because the comparison feeds a\nforward branch to a shared block.\n\nGate: 0 MISMATCH, lint 0/320, 420 tests, cache-free link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 3912 complete,\n1235 C-linked.","measures":{"fuzzy_match_percent":13.657815,"total_code":4367480,"matched_code":592188,"matched_code_percent":13.5590315,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3898,"matched_functions_percent":29.787558,"complete_code":596504,"complete_code_percent":13.657853,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3912}},{"timestamp":"2026-08-04T12:49:17Z","commit_sha":"817feecdd12136df460923190e2999a67e113b9a","commit_message":"Sweep the btlShuffleCalc camera family; two more first-try matches\n\nbtlShuffleCalc func_003716d0 and func_003717e0 -- first-party 3291 -> 3293\n(79.3%), ASM 860. Both matched on the first attempt.\n\nOnce func_003713b0 and func_00371260 were byte-exact last commit, the rest of\nthat file's viewport family fell out of the same four conventions: `s32\nspNN[8]` for the func_003e8970 output, a `u8 *` base hoist of\n`func_00457120() + 0x68`, value-first FP multiplies, and `sp[0] / 2` where\nretail rounds versus `sp[n] >> 1` where it does not. func_003717e0 also\nconfirms the shape for a bounds test whose failure paths share a trailing\n`return 0`: write it as `if (a && b && c && d) return 1; return 0;` so the\nfour comparisons branch out to the shared exit.\n\nTwo floors documented with bodies kept:\n\nbtlShuffleCalc func_00371a60 (nd 41 from 45 via opt_common_subs off). Retail\nre-reads the counter with a second `lhu` after incrementing it, and converts\n`(f32)(u32)counter` into $f1 before moving it to $f12 rather than converting\nstraight into the argument register. `(f32)(u32)*(u16 *)arg0` IS the correct\nspelling for the bltz/srl/andi/or/add.s unsigned-to-float sequence.\n\neff_after func_004bc1e0 (nd 34 from 49). The wins were hoisting\n`arg0 + arg2 * 4` and loading all three floats into temps before storing any\nof them -- retail batches 3x lwc1 then 3x swc1, whereas three load-store pairs\nget interleaved. Its two ring-index expressions genuinely differ in shape:\n`-2 - arg1 + field0xC` for the first, `(field0xC - 1) - arg1` for the second.\n\nAlso checked and ruled out as a source of easy wins: clustering all remaining\nfirst-party ASM by exact opcode sequence finds 11 groups covering 28\nfunctions, but every one of them is already documented -- the 112 untouched\nfunctions are all singletons.\n\nGate: 0 MISMATCH, lint 0/320, 420 tests, link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 3911 complete,\n1235 C-linked.","measures":{"fuzzy_match_percent":13.650279,"total_code":4367488,"matched_code":591860,"matched_code_percent":13.551497,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3897,"matched_functions_percent":29.779917,"complete_code":596176,"complete_code_percent":13.650317,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3911}},{"timestamp":"2026-08-04T12:17:43Z","commit_sha":"9173553cc6b0a29027176178b8f10120d3a02ae4","commit_message":"Break the btlShuffleCalc FP-mul floor with a named constant local\n\npscModel func_0036a900, btlShuffleCalc func_00371260 and func_003713b0 --\nfirst-party 3288 -> 3291 (79.2%), ASM 862.\n\nThe btlShuffleCalc pair was documented here as a \"Commutative FP-mul\nscheduling floor\" and re-confirmed as a floor in wave 14, with the note\nrecording that its nd-2 spelling had been reached once and lost. Both are now\nbyte-exact. Assigning the multiplier to a named f32 local BEFORE the base\nhoist is the whole fix:\n\n    k = 100.0f;\n    temp_16 = func_00457120() + 0x68;\n    if (*(f32 *)temp_16 * k <= 0.0f) { ... }\n\nRetail materializes the constant into the LOWER FP register and loads the\nvalue into the higher one; written as an inline literal b210 does the reverse\nand emits `mul.s $f1,$f1,$f0` where retail has `mul.s $f1,$f0,$f1`. A named\nlocal pins the materialization order. The identical one-line change carried\nboth twins (100.0f and 84.0f). Their stale floor notes are replaced with the\nrecipe, including that retail genuinely uses BOTH halving forms -- `sp30[0]/2`\nrounded in the scale numerator, `sp30[n] >> 1` in the perspective terms.\n\npscModel func_0036a900 is a four-entry light-table init. Retail writes it\nFIELD-BY-FIELD across the four entries (all four .f1c, then the .f20s), not\nentry-by-entry; the natural per-entry order left the last eight stores\npermuted (nd 8 -> MATCH). Its four 12-byte vectors each need their own local\nstruct, which is what produces retail's build-on-stack-then-copy shape.\n\nFloors documented with bodies kept: sdkLbox func_00470970 (nd 18, a pure\n$s0/$s1 swap that -- unlike func_00470280 in the same file -- is NOT\ndeclaration-order drivable; also do not #include sdktask.h here, it breaks the\nTU), nLine func_0034e0b0 (nd 87 from 101 via opt_common_subs off, which stops\nb210 caching a shared corner offset in an eighth float saved register and\nmis-sizing the prologue).\n\nTargeting note: functions were selected by scoring the virgin census on\nsaved-register reuse, label count and call count. The zero-reuse zero-label\nhead of that list is where the matches came from.\n\nGate: 0 MISMATCH, lint 0/320, 420 tests, link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 3909 complete,\n1233 C-linked.","measures":{"fuzzy_match_percent":13.636358,"total_code":4367488,"matched_code":591252,"matched_code_percent":13.537576,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3895,"matched_functions_percent":29.764635,"complete_code":595568,"complete_code_percent":13.636396,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3909}},{"timestamp":"2026-08-04T10:54:15Z","commit_sha":"ebf7ea527629d10ccaedac5cb59b51237128da6e","commit_message":"Complete k_draw.c; mixed-arg parameter order is per-callee, not per-file\n\nk_draw func_0014da30 and func_0014d830 -- k_draw.c reaches 100%. First-party\n3286 -> 3288 (79.2%), ASM 865.\n\nBoth callees take mixed float/integer arguments, and they need OPPOSITE\ndeclaration orders in the same file: func_004601c0 is (f32, u8*, u8*, s32)\nper its already-matched callsite in func_0014d620, while func_004604d0 is\n(u8*, f32, f32, u8*, s32). Derive the order from retail's materialization\nsequence -- func_004604d0 emits `addiu $a0, $a1, 4` BEFORE the two lwc1s, so\nthe pointer is declared first; writing it float-first left exactly those\nthree words swapped. func_004604d0 also had a bare `extern void\nfunc_004604d0();` with no prototype, which would have promoted both floats to\nsoftware double had it been called that way.\n\nfunc_0014da30 matched first try by reusing tnEffect's idiom for the same\nD_00887300 vtable: a function-pointer local assigned from the `_abs` alias\nand dereferenced per call, with a `#pragma alias` at file scope.\n\ndatPersona func_0010a840 documented at nd 26 (body kept under NON_MATCHING).\nDistinct CSE keys for the index -- `(arg1 & 0xFFFF)` in the range test and\n`(u16)arg1` in the address -- stop b210 caching the masked value in the saved\nregister retail gives arg1, worth nd 32 -> 26; the remaining cascade is b210\nfolding a redundant s16 narrowing of a `lbu` result that retail emits.\n\nAlso: two functions I probed here (cmmMisc func_00246e90, func_00248d80)\nalready carried floor notes above their markers and were NOT in the virgin\ncensus -- I reached them by querying per-file instead of through the filter,\nand one --keep overwrote a documented body before I restored it. Query the\ncensus, not the file.\n\nGate: 0 MISMATCH, lint 0/320, 420 tests, link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 3906 complete,\n1231 C-linked.","measures":{"fuzzy_match_percent":13.614615,"total_code":4367500,"matched_code":590304,"matched_code_percent":13.515833,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3892,"matched_functions_percent":29.741707,"complete_code":594620,"complete_code_percent":13.614653,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3906}},{"timestamp":"2026-08-04T10:15:25Z","commit_sha":"61baeea5af251f1d2985573948fc3c87b2fad797","commit_message":"Match two more; an unsigned cast is worth 48 bytes of FPU conversion\n\nscrCommonCommand func_00298e90 and tnEffect func_004815b0 -- first-party\n3284 -> 3286 (79.1%), ASM 867. Three floors documented with their bodies.\n\nfunc_00298e90's object was 48 bytes SHORTER than its window because\nfunc_003b7060 is declared returning s32: writing (f32)(u32)func_003b7060()\ninstead of (f32)func_003b7060() restores retail's whole unsigned-to-float\nsequence (bltz / srl+andi+or / cvt.s.w / add.s). When an object is far short\nof its window and the retail bytes hold an FPU conversion, check the\nsignedness of the value being converted before anything else.\n\nfunc_004815b0 matched by reusing the idiom its already-matched sibling\nfunc_00481740 uses in the same file -- a TNFunc *tbl local assigned from\nD_00887300_abs inside EACH branch, not a single hoisted table pointer. Read\nthe matched neighbours before inventing an access shape.\n\nNew lever: `!!(x & mask) != 0` is what reproduces retail's\n`sltu $v1,$zero,$v1` booleanization of a flag test. A plain `!= 0`, a 0/1\nboolean local, `&&`, and a bitwise `&` of two comparisons all fail to\nbooleanize -- b210 folds the comparison into the branch unless the double\nnegation forces it. Took shdPersona func_0011caf0 from nd 25 to 19.\n\nFloors documented (bodies kept under NON_MATCHING): shdPersona func_0011caf0\n(retail places the inner body out-of-line via a positive bne plus a shared b\ntrampoline; 14 spellings), scrScriptProcess func_0029d1c0 (retail\nmaterializes the third call argument before the two moves; 5 spellings),\nbtlShuffleCard func_0036d990 (one extra `move` because b210 clobbers the\nbase register early in case 1; 5 spellings, ascending case order confirmed\ncorrect).\n\nGate: 0 MISMATCH, lint 0/320, 420 tests, link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 3904 complete,\n1231 C-linked.","measures":{"fuzzy_match_percent":13.608337,"total_code":4367516,"matched_code":590032,"matched_code_percent":13.509555,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3890,"matched_functions_percent":29.726425,"complete_code":594348,"complete_code_percent":13.6083765,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3904}},{"timestamp":"2026-08-04T09:26:10Z","commit_sha":"3d9a4c10f9cd5e398fa2e44ba518f9c510a11c9b","commit_message":"Match four allocate-then-register functions; two-local order is the lever\n\nevtEffect func_00290fa0, cldDungeonIn func_00268870, sdkUttmx func_00463d60\nand sequence func_001028c0 -- first-party 3280 -> 3284 (79.1%), ASM 869.\n\nThree of the four had a residual that was ENTIRELY the declaration order of\ntwo locals, continuing the run from sdkWrap func_004672c0 and sdkLbox\nfunc_00470280. sdkUttmx was a pure $s1/$s2 mirror on (buf, ret): declaring\nret first took it 9 -> 1. cldDungeonIn needed its switch cases in ASCENDING\nvalue order even though retail tests 3,2,1,0 descending -- ascending scored\n1, descending 11.\n\nsequence func_001028c0 needed the gp-relative store SUNK below the two -1\nfield stores, which a temp for the call result achieves; assigning the gp\nvariable directly emits the store four words early. Registered\niGpffffb1a8 = 0x00764298 (gp -0x4E58) for it.\n\nTwo of these read nd 2 and nd 1 under probe_variants but verify calls them\nMATCH: the residual was trailing inter-function alignment padding that the\nobject legitimately omits. Diff the rows before chasing such a residual --\nzero differing instruction rows with obj < window means padding, not a bug.\n\ny_fclModel func_0034a4f0 stays NONMATCHING at nd 5 (3 real words, the second\n12-byte vector copy's ld/lwc1 order) with the body kept under NON_MATCHING;\ncopying each vector as an explicit s64 + f32 pair and loading both halves\nbefore storing either fixed the first copy and the frame.\n\nGate: 0 MISMATCH, lint 0/320, 420 tests, cache-free link 156 C objects,\nimage 3d1d3d2b / SLUS 4eeec036, objdiff 13086 units 3902 complete,\n1231 C-linked.","measures":{"fuzzy_match_percent":13.600357,"total_code":4367520,"matched_code":589684,"matched_code_percent":13.501575,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3888,"matched_functions_percent":29.711142,"complete_code":594000,"complete_code_percent":13.600395,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3902}},{"timestamp":"2026-08-04T08:39:12Z","commit_sha":"ff692fb0d8aee5aab048fcfb021582ef104d6fe7","commit_message":"Match sdkLbox and mt_sceneIcon; an else-clause is not an early return\n\nsdkLbox func_00470280 -- reconstructs to nd 20, and every one of the 20\nwords is the same $s0/$s1 swap that sdkWrap had: declaring `handle` before\n`mem` fixes it. Two files in a row where the entire residual was the order\nof two locals, so this is now the first thing to try on a\nregister-mirror residual, ahead of any pragma.\n\nmt_sceneIcon func_0026da30 -- nd 23 -> MATCH on a control-flow shape worth\nnaming. Its NULL check must be an `else` clause, NOT an early return:\n\n    if (icon != NULL) {\n        ...two kind blocks, each with its own inline `return 0`...\n    } else {\n        return 0;\n    }\n\nWritten as `if (icon == NULL) return 0;` the zero is materialized inline at\nthe test, 20 words early. As an `else`, its code lands AFTER the two kind\nblocks -- which is exactly where retail puts it (L0026DAD0, between the kind\nblocks and the allocation path). This is a different lever from the \"single\nshared trailing return\" used earlier: here the shared zero is deliberately\nin the MIDDLE, and the `else` is what places it there.\n\nRegistered iGpffffa700 = 0x007637F0 (gp -0x5900, evidenced from retail\nfunc_0026da30's `addiu $4,$28,-0x5900`). It is the slot 8 bytes after the\nalready-declared iGpffffa6f8. mt_sceneIcon.c was ALREADY link-eligible, so\nan unresolvable symbol here would have dropped a linked TU; the cache-free\nlink confirms 156 objects and both hashes.\n\nAlso re-confirmed a trap from earlier in the session: a freshly curated\nsymbol fails `test_curated_entries_reach_the_generated_output` until\nrecover_symbols.py is re-run AFTER the referencing function becomes C. The\ntest is right and the generated file was simply stale.\n\nFirst-party 3,278 -> 3,280 (79.0%); ASM 875 -> 873. Byte-exact link\nunchanged: image sha1 3d1d3d2b, SLUS_217.82 4eeec036, 156 C objects,\n1,229 C-linked. 420 tests, lint clean, tripwire 4864.","measures":{"fuzzy_match_percent":13.582228,"total_code":4367548,"matched_code":588896,"matched_code_percent":13.483447,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3884,"matched_functions_percent":29.680574,"complete_code":593212,"complete_code_percent":13.582267,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3898}},{"timestamp":"2026-08-04T08:15:16Z","commit_sha":"7f1c6d9595bb96d5135fca846d1fdf7d81515bda","commit_message":"Match sdkWrap func_004672c0 on declaration order alone\n\nContinuing the allocate-then-register family. sdkWrap func_004672c0\nreconstructs to nd 9, and all nine differing words are one register swap:\nretail keeps the allocated block in $s0 and the registration handle in $s1,\nb210 does the mirror. Declaring `handle` before `mem` flips it and the\nfunction matches (9 -> 1, the last word being window padding). No pragma, no\nhelper, no restructuring -- just the order of two locals.\n\nAlso in this family, shdScript func_0025ccb0: the body is fully recovered\n(the func_0025cbc0 shape wrapped in a func_0029d020 state test, with a\nsecond path through func_00452380/func_00452490 and func_0029cf50) and\nreaches nd 16. Restructuring it into an `else if` chain so every zero exit\nshares one trailing `return 0` -- which is what retail does, branching to a\nshared L0025CDAC -- measured WORSE at nd 18. So the shared-return lever that\ncarried btlShuffleResult and btlShuffleCalc does NOT generalise to this\nshape, and the note now says so with both numbers. Its residual is confined\nto the second path.\n\nThat function is left as INCLUDE_ASM rather than kept as a body, because at\nnd 16 it MISMATCHES; the note carries the recipe instead, which reproduces\nit in one pass.\n\nTwo mechanical notes from this pass, both self-inflicted: declarations\ninserted by index landed inside a function body and broke the parse, and an\nearlier `probe_variants --keep` left a non-matching body in shdScript.c that\nverify then reported as a MISMATCH. Always re-run verify on the file after a\n`--keep` that did not reach zero.\n\nFirst-party 3,277 -> 3,278 (78.9%); ASM 876 -> 875. Byte-exact link\nunchanged: image sha1 3d1d3d2b, SLUS_217.82 4eeec036, 156 C objects,\n1,228 C-linked. 420 tests, lint clean, tripwire 4864.","measures":{"fuzzy_match_percent":13.5683365,"total_code":4367568,"matched_code":588292,"matched_code_percent":13.469556,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3882,"matched_functions_percent":29.66529,"complete_code":592608,"complete_code_percent":13.568375,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3896}},{"timestamp":"2026-08-04T07:54:13Z","commit_sha":"691f6d484319e666b38d4d6d433bf33670f8f150","commit_message":"Match two more of the allocate-then-register family; rule out a struct ABI\n\nA jal-target scan of the retail image found ten remaining first-party ASM\nfunctions with the assert + D_008873F4 allocator + func_00451de0/fc0\nregistration shape. Two more of them now match:\n\n  nEntry func_002a2650 -- adds a func_0043f9c8 zero-fill of the block\n  between the null check and the registration.\n\n  shdScript func_0025cbc0 -- has NO null check at all; retail stores three\n  fields (arg1, arg2, -1) straight into the fresh block. Its callback\n  func_0025cb80 is defined old-style `void(void)` in the same file, so the\n  registration slot needs a cast at the callsite rather than a conflicting\n  extern.\n\nNegative result worth recording, on cutinDraw func_00120e20: its documented\nnd-4 floor is the two packed `lh` loads coming out in reverse store order,\nand the existing note lists unions, spilled address-taken locals, and every\ntemp type and declaration order as already probed. The one shape NOT in that\nlist was passing the packed argument as a 4-byte struct BY VALUE, which is\nwhat retail's `sw $5,0x1c($sp)` + `lh 0x1c` / `lh 0x1e` looks like. It is\nwrong: a by-value struct changes the argument ABI and the residual explodes\nfrom 4 to 43. The existing s32 body is the right shape and the floor stands.\n\nTooling note that cost a detour: verify reported COMPILE_ERROR for a\ncandidate that compiles cleanly on its own, because the candidate put a\n`typedef` between the `// FUN_` marker and the function definition, which\ndefeats the marker's name parse. Declarations belong at file scope, not in\nthe region.\n\nFirst-party 3,275 -> 3,277 (78.9%); ASM 878 -> 876. Byte-exact link\nunchanged: image sha1 3d1d3d2b, SLUS_217.82 4eeec036, 156 C objects,\n1,227 C-linked (was 1,225). 420 tests, lint clean, tripwire 4864.","measures":{"fuzzy_match_percent":13.562554,"total_code":4367572,"matched_code":588040,"matched_code_percent":13.463773,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3881,"matched_functions_percent":29.65765,"complete_code":592356,"complete_code_percent":13.5625925,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3895}},{"timestamp":"2026-08-04T07:34:19Z","commit_sha":"3b15037bf5845b141474f597e5551716ca3b7661","commit_message":"Match an allocate-then-register-window family across three placeholder TUs\n\nThe k_fldFoodCourt function matched in the previous commit turned out to be\none instance of a recurring shape, so I went looking for the rest of it:\n\n    func_0044ea90(<file string>, <line>);\n    mem = D_008873F4[0](1, <size>, 0x40000);\n    if (mem == NULL) return 0;\n    return func_00451de0(<data>, 0xF, 0, 0, <init cb>, <close cb>, mem);\n\nMatched: k_readtex func_00190600, k_fldMipmap func_0018c580, k_fldData\nfunc_0015e7d0. All three sit in bare placeholder TUs that had no externs\nbeyond a single jump-table declaration and no notes at all.\n\nTwo variations mattered:\n\n  k_readtex's version is `void`. Retail never materializes a zero on the\n  failure path -- it falls through to the epilogue with the allocator's own\n  0 still in $v0 -- so an explicit `return 0;` would add an instruction\n  retail does not have.\n\n  k_fldData's version stores `*(s32 *)(mem + 4) = 0;` AFTER the registration\n  call, which is why retail spends a saved register and a 0x20 frame on\n  `mem`. Deriving only up to the call gave a 140B object against a 160B\n  window and a 38-word residual; reading the last two instructions of the\n  window fixed it. Worth remembering: when the object comes out short, read\n  the tail of the retail window before touching register or scheduling\n  levers.\n\nTarget-selection note, since this is now four matches from the same seam:\nplaceholder TUs with no prior notes have neither a lost body nor a prior\nverdict to contradict, and small functions in them decode in a single pass.\nThat is where the remaining cheap wins are.\n\nFirst-party 3,272 -> 3,275 (78.9%); ASM 881 -> 878. Byte-exact link\nunchanged: image sha1 3d1d3d2b, SLUS_217.82 4eeec036, 156 C objects,\n1,225 C-linked (was 1,222). 420 tests, lint clean, tripwire 4864.","measures":{"fuzzy_match_percent":13.554208,"total_code":4367576,"matched_code":587676,"matched_code_percent":13.455427,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3879,"matched_functions_percent":29.642368,"complete_code":591992,"complete_code_percent":13.554247,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3893}},{"timestamp":"2026-08-04T07:14:58Z","commit_sha":"253d138d043819099a885f19a790e1a423ce0109","commit_message":"Recover the first two k_fldFoodCourt functions from a bare placeholder TU\n\nk_fldFoodCourt.c was one of the marker-less placeholder translation units:\nthree INCLUDE_ASM markers, no includes beyond include_asm.h, no externs, no\nnotes. Nothing had been attempted in it.\n\nBoth smaller functions decode cleanly straight from the retail asm and match\nfirst try once the declaration environment exists:\n\n  func_0018dcd0 (112B) -- reads the work pointer at arg0+0x38, calls\n  func_00454bd0 and func_003e0f40 with its +8 / +4 fields, then dispatches\n  through jtbl_008873EC[0].\n\n  func_0018dd40 (160B) -- asserts via func_0044ea90, allocates through the\n  D_008873F4[0] allocator (1, 0x10, 0x40000), returns 0 on failure, else\n  hands the block to func_00451fc0 together with the two callbacks\n  func_0018d950 and func_0018dcd0.\n\nThat second one is a nice confirmation that the two matched functions in this\nfile are each other's callbacks, which is why the file wants a real\ndeclaration block rather than per-function guesses.\n\nThe remaining func_0018d950 is 896B behind a 6-case jump table\n(jtbl_00746E20) and is left for a pass with room to decode it.\n\nThis is worth noting as a target class: placeholder TUs with no prior notes\nhave no lost-body problem and no prior verdict to contradict, and small\nfunctions in them decode in one pass. Every match I have landed by hand this\nsession came from either that shape or a note whose residual named a\nmechanism with a known lever.\n\nFirst-party 3,270 -> 3,272 (78.8%); ASM 883 -> 881. Byte-exact link\nunchanged: image sha1 3d1d3d2b, SLUS_217.82 4eeec036, 156 C objects,\n1,222 C-linked (was 1,220). 420 tests, lint clean, tripwire 4864.","measures":{"fuzzy_match_percent":13.544475,"total_code":4367584,"matched_code":587252,"matched_code_percent":13.445695,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3876,"matched_functions_percent":29.61944,"complete_code":591568,"complete_code_percent":13.544514,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3890}},{"timestamp":"2026-08-04T06:55:39Z","commit_sha":"4633540697231a77257d1fc071b229bc39a4caf1","commit_message":"Overturn the \"slt $at is a dead end\" verdict with an image-wide census\n\nWave 14 recorded the `slt $at` vs `slt $v0` comparison-destination difference\nas a cross-file CONFIRMED DEAD END after hitting it in frFont, y_fclCombine\nand cmpConfig. That verdict is wrong, and it matters because the shape is\neverywhere.\n\nCensus of the retail image against the current verify report:\n\n  first-party ASM functions containing a comparison written into $at:\n      359 of 883 (41%)\n  first-party functions that ALREADY MATCH containing one:\n      276 of 3270\n\n276 matching functions prove the $at form is reachable from C. What makes it\nappear is the CONTEXT, not the comparison: it shows up when the comparison\nfeeds a short-circuit && / || chain, or when its source register is still\nlive afterwards. The matched datCalc func_00231ef0 is the clean example --\n`if (arg1 > 99 && !(*(u16 *)arg0 & 4))` compiles to\n`andi $v1; slti $at,$v1,0x64; bnez $at`.\n\nWhat is genuinely not reachable is the narrow case: a single bare comparison\nwhose source is a dead call result, where b210 always recycles that register\nas the comparison destination. code1_0017 func_00176220 (previously untried)\nis exactly that shape and is now documented as such -- ONE real defect, obj\n92B vs window 96B, unchanged by `#pragma schedule off` and by hoisting the\ncall result into a local.\n\nSo the rule to carry forward is a boundary, not a floor: check whether the\ncomparison sits in a short-circuit chain before writing an $at residual off.\nWith 359 remaining functions containing one, mis-filing this as a blanket\nfloor is expensive.\n\nThe nd-3 body is kept in the file's `#ifdef NON_MATCHING` block so the next\nattempt starts from it.\n\nDocumentation only -- no function changed state. First-party 3,270 (78.7%),\nASM 883, 0 MISMATCH, 420 tests, lint clean.","measures":{"fuzzy_match_percent":13.538564,"total_code":4367600,"matched_code":586996,"matched_code_percent":13.439783,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3874,"matched_functions_percent":29.604158,"complete_code":591312,"complete_code_percent":13.538602,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3888}},{"timestamp":"2026-08-04T06:44:19Z","commit_sha":"cac41cf29cf691aaf743f8de35593ad10243e381","commit_message":"Correct a pragma claim I got wrong, and document the branch-likely floor\n\nCORRECTION FIRST. The previous commit claimed `#pragma opt_branch_folding`\nis \"silently ignored\" by b210 because the compiled object was\nbyte-identical with and without it. That evidence was bad: the hash came\nfrom a stale object path, so it would have matched no matter what. The\nreliable signal is the differing-word count, and by that measure the\npragma has no effect on shdSkill func_00115670 -- which is all that was\never established. The note there now says exactly that.\n\nThe counter-example that exposed it: `#pragma schedule off` demonstrably\nDOES change codegen, moving code1_003e func_003e3070 from nd 15 to nd 9.\nSo scoped pragmas are worth measuring per function, not dismissing\nwholesale, and object hashes are worth nothing unless the path is verified.\n\ncode1_003e func_003e3070 / func_003e30c0 (previously untried, no notes) are\na linked-list search: walk arg0->f10 via f30 for f8 == arg1, store arg2 at\nf18, return f0 else -1. At -O2 b210 fills the loop and exit delay slots\nwith BRANCH-LIKELY forms (bnel/beql) retail never uses, collapsing the body\nto 60B against an 80B window. `#pragma schedule off` removes them and\nreaches 72B, but it also disables the delay-slot fill retail DOES have\n(retail puts `lw $v0,($v1)` in the `b` delay slot), so scheduling cannot be\nboth off and on. The 2-word residual is that fill plus a redundant `nop`\nretail emits between the loop exit and the join.\n\nProbed and confirmed to change nothing on these two: opt_peephole,\nopt_branch_likely, opt_branch_folding, opt_common_subs, opt_unroll_loops,\noptimize_for_size, opt_propagation.\n\nThe nd-9 body is kept inside the file's existing `#ifdef NON_MATCHING`\nconvention rather than discarded. That convention is the answer to a\nproblem hit twice this session: datCalc func_00232b40 and effPolygonTrack\nfunc_004936d0 both record good residuals whose bodies are gone, and\nrebuilding them from asm lands far worse (nd 68 and nd 25 against recorded\n9 and 2), so neither recorded recipe can actually be retried. Where a body\nbeats the fallback, it belongs in the file.\n\nDocumentation only -- no function changed state. First-party 3,270 (78.7%),\nASM 883, 0 MISMATCH, 420 tests, lint clean.","measures":{"fuzzy_match_percent":13.538564,"total_code":4367600,"matched_code":586996,"matched_code_percent":13.439783,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3874,"matched_functions_percent":29.604158,"complete_code":591312,"complete_code_percent":13.538602,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3888}},{"timestamp":"2026-08-04T06:23:21Z","commit_sha":"52ecc78125215397f0d83c27d5e0becb0c8ce61e","commit_message":"Match g_data func_00106c30: the word local needs the pragma beside it\n\nRecorded as a load-sinking floor after four spellings (one-liner, word\nlocal, mask-first operand order, GDataEntry* + bit locals), all stalling at\nnd 11 because the field-0x30 load kept sinking to its use at the `and`.\n\nThe note's own \"word local\" is half the answer. Measured here: the local\nalone is still nd 11, and `#pragma opt_propagation off` alone is still\nnd 11 -- together they are nd 3, which is the window's trailing padding,\nand verify reports MATCH. The pragma keeps that single-use load right after\nthe base addu; the local is what holds it there.\n\nSame shape as the k_encount trio in the previous commit: a note listing\nseveral failed spellings for one apparent residual, where the fix is two\nlevers applied at once. Worth treating as the default hypothesis now rather\nthan a coincidence -- that is three files in two commits.\n\nAlso probed and left floored, with measurements recorded earlier:\ny_smap func_002add10 (argument-scheduling, 3 more spellings incl. the\npragma and a typed function-pointer local, all nd 4) and g_data\nfunc_00109190, whose object is 188B against a 144B window because b210\nduplicates the loop tail for the else path -- that one is structural, not a\nspelling problem, so it is not worth further passes.\n\nFirst-party 3,269 -> 3,270 (78.7%); ASM 884 -> 883. Byte-exact link\nunchanged: image sha1 3d1d3d2b, SLUS_217.82 4eeec036, 156 C objects,\n1,220 C-linked. 420 tests, lint clean, tripwire 4864.","measures":{"fuzzy_match_percent":13.538564,"total_code":4367600,"matched_code":586996,"matched_code_percent":13.439783,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3874,"matched_functions_percent":29.604158,"complete_code":591312,"complete_code_percent":13.538602,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3888}},{"timestamp":"2026-08-04T06:03:51Z","commit_sha":"0168fadc6dc4aa7fc857f82a7cf428fffabc6ee4","commit_message":"Record measurements on two floors that did not fall\n\nevtMisc func_0028f4f0 -- retail moves the handle to $a0 then branches on\n$v0; b210 coalesces and branches on $a0. Exactly ONE real word differs;\ntwo of the reported three are the window's trailing padding, which the\nnote now states so the gap is not overestimated. Four further spellings\nmeasured, all unchanged: `(u32)h != 0`, `((u32)h & 0xFFFFFFFF) != 0`, and\npassing `(void *)h` while testing `h` as s32 -- i.e. trying to give the\ntest and the argument different CSE keys so the value would need two\nregisters. b210 coalesces regardless. Register-coalescing floor.\n\ndatCalc func_00232b40 -- the note already identifies its residual as the\nsame load-sinking defect func_0023e3e0 has, and that one was matched with\n`#pragma opt_propagation off` plus offset-first helper calls. The combo\nstill has not been tested against this function, because the recorded\nnd-9 body is not reconstructable from the note: rebuilding the guards and\ntail from the retail asm lands at nd 68 (74 with the pragma). The note now\nsays so explicitly and points at the recipe, so the next pass tries the\ncombo on a good body instead of re-deriving one.\n\nThat second case is the useful general lesson: a note that records a\nresidual WITHOUT the body that achieved it cannot be resumed. Where a\nrecipe is known, the body is the artifact worth keeping.\n\nDocumentation only -- no function changed state. First-party 3,269\n(78.7%), ASM 884, 0 MISMATCH, 420 tests, lint clean.","measures":{"fuzzy_match_percent":13.53697,"total_code":4367612,"matched_code":586928,"matched_code_percent":13.43819,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3873,"matched_functions_percent":29.596516,"complete_code":591244,"complete_code_percent":13.537009,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3887}},{"timestamp":"2026-08-04T05:51:12Z","commit_sha":"52d45076feec17ff5e514250bd31cf9460609bdb","commit_message":"Match four more addu-order floors; k_encount needed both levers at once\n\nevtScript func_00298700 -- recorded as an \"addu-operand-order allocator\nfloor\" after trying a named s32 local and every p+scaled / scaled+p\ncallsite spelling. Fixed by the `evtSlot` helper expanded at the use: only\ntravelling through a helper's parameters holds the operand order, and\nexpanding it per use leaves nothing live across a call.\n\nk_encount func_00161a70, func_00161b10, func_001619b0 -- all three were\nrecorded as a \"load-sinking + addu-flip floor\" at nd 8, with four spellings\nalready ruled out. The reason none worked is that there are TWO independent\ndefects and each lever only fixes one: `#pragma opt_propagation off` brings\nthe single-use gp base load ahead of the index chain, and the helper holds\nthe offset-first addu. Applied together all three match, taking the file\nfrom 0/6 to 3/6.\n\nThat is the second time this pattern has appeared (mdlManager and datCalc\nhit it during wave 14), so it is worth stating plainly: when a note lists\nseveral failed spellings for what reads as one residual, check whether it\nis actually two defects that have to be fixed simultaneously.\n\nRegistered iGpffffb41c = 0x0076450C (gp -0x4BE4, evidenced from retail\nfunc_00161a70). The three functions reference it only now that they are C,\nand an unregistered symbol silently disqualified the whole translation unit\n-- k_encount dropped out of the link and took 6 C-linked functions with it\nwhile every per-function check still passed and both image hashes still\nmatched. Fourth time that class of defect has been caught only by the\nlink-coverage count, so it stays the mandatory post-change check.\n\nFirst-party 3,265 -> 3,269 (78.7%); ASM 888 -> 884. Byte-exact link\nunchanged: image sha1 3d1d3d2b, SLUS_217.82 4eeec036, 156 C objects,\n1,220 C-linked. 420 tests, lint clean, tripwire 4864.","measures":{"fuzzy_match_percent":13.53697,"total_code":4367612,"matched_code":586928,"matched_code_percent":13.43819,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3873,"matched_functions_percent":29.596516,"complete_code":591244,"complete_code_percent":13.537009,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3887}},{"timestamp":"2026-08-04T05:21:11Z","commit_sha":"297b8fa045bda1323291d8db71c6f627c9ba9a9d","commit_message":"Record that opt_branch_folding is silently ignored by b210\n\nshdSkill func_00115670 is one branch word from matching: retail's trap-skip\n`bnez $v1,0x1156b0` targets the loop pre-jump `b 0x1156f0`, and b210 folds\nthe chain to branch directly. Everything else in the function is\nbyte-identical once it is reconstructed as the indexed twin of the matched\nfunc_00115760 beside it.\n\n`#pragma opt_branch_folding off` is the obvious lever and it does nothing:\ncompiling the function with and without it produces a BYTE-IDENTICAL\nobject. That is the same failure mode already known for unrecognised pragma\nnames -- b210 accepts them silently, so \"it compiled\" proves nothing and\nonly a changed object hash does. The note now records the measurement so\nnobody spends another pass on it.\n\nSame check on `#pragma schedule` around itfMesManager func_00279690 (whose\nresidual is a load hoisted above a shift): also inert, matching the twelve\nscheduling variants measured against effPolygonFlash earlier.\n\nDocumentation only -- no function changed state. First-party 3,265 (78.6%),\nASM 888, 0 MISMATCH, 420 tests, lint clean.","measures":{"fuzzy_match_percent":13.521276,"total_code":4367652,"matched_code":586248,"matched_code_percent":13.422498,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3869,"matched_functions_percent":29.565948,"complete_code":590564,"complete_code_percent":13.521316,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3883}},{"timestamp":"2026-08-04T05:08:34Z","commit_sha":"aff1ce0aafe502358b9248593ead43621c666b01","commit_message":"Match btlShuffleSeq func_00378c80: expand the operand-order helper per use\n\nThe note here recorded a one-word floor after 7 attempts: retail's\n`addu $v1,$v0,$s2` (scaled offset first) against a base-first candidate,\nwith everything else byte-identical at frame 0x70. It also recorded why\nthe obvious fix fails -- naming the base in a local corrects the operand\norder but costs a fourth saved register and grows the frame to 0x80.\n\nThat is true of a static inline helper assigned to a local as well, which\nis the refinement worth keeping: EXPAND THE HELPER AT EACH USE. Its\nparameters still carry the operand order, but nothing stays live across\nthe call, so the frame stays 0x70. Measured path 90 -> 60 -> 1 -> 0.\n\nTwo other details this needed:\n\n  Casting the integer-domain base to `u8 *` before adding each field\n  offset keeps retail's per-group `lui/ori $at` expansion. Adding the\n  field constant inside the integer expression instead lets b210 hoist a\n  single `lui` and reuse it across all three groups (60 words).\n\n  The guard tests positively and branches out to one trailing `return 0`,\n  the same shared-zero-return shape the earlier commits needed; an inline\n  return per path duplicates the block.\n\nRetail also recomputes the whole sll/subu/sll/addu/sll offset chain after\nthe call rather than reusing the pre-call value, which is exactly why\nhoisting anything into a saved register diverges.\n\nFirst-party 3,264 -> 3,265 (78.6%); ASM 889 -> 888. Byte-exact link\nunchanged: image sha1 3d1d3d2b, SLUS_217.82 4eeec036, 156 C objects,\n1,216 C-linked. 420 tests, lint clean, tripwire 4864.","measures":{"fuzzy_match_percent":13.521276,"total_code":4367652,"matched_code":586248,"matched_code_percent":13.422498,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3869,"matched_functions_percent":29.565948,"complete_code":590564,"complete_code_percent":13.521316,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3883}},{"timestamp":"2026-08-04T04:46:10Z","commit_sha":"3a1b7b79913ce87120bb3f1279a873ddab85a9ee","commit_message":"Declare the two jal-reachable entries the scan mis-locates; restore the link\n\nThe previous commit regenerated the boundary map and CI failed to link:\n`Undefined: func_00272b00` and `func_00272ba0`, referenced by name from\nsix translation units.\n\nThose two addresses had been allow-listed as GHIDRA_FALSE_SPLITS on the\npremise that neither is ever called. That premise is false. The retail\nimage contains 17 `jal` instructions targeting 0x00272B00 and 18\ntargeting 0x00272BA0. They are real, heavily called functions whose first\ninstruction is an unconditional `b` into their own condition check, so\nspimdisasm records the branch LANDING point (0x00272B34 / 0x00272BD4,\nwhich it does find) and misses the true entry. Dropping them removed the\nonly definition of those symbols.\n\nThey are now declared as JAL_REACHABLE_ENTRIES with their caller counts,\nre-checked against the retail ELF by tests/test_reconcile.py, and\nGHIDRA_FALSE_SPLITS is deleted rather than left carrying a false claim.\nRegeneration now reproduces the committed map plus exactly the two\nintended additions (0x00244100, 0x0038DD60) and their two intended\nresizes; nothing is dropped.\n\nThe boundary-count guard is rebuilt from the declared sets instead of a\nmagic number. Its old figure (13,080 + 4) had silently absorbed three\nboundaries that sat in the map with no declaration at all -- which is\nprecisely what made the map unregenerable in the first place. The true\nscan base is 13,077.\n\nAlso worth recording: the local link proof that passed before the failed\npush was masked by the C object cache (142 cached links). CI ran with a\ncold cache and failed. This commit's proof is cache-free -- build/cache/c\nremoved, 321 eligibility and 156 link compiles from scratch, 156 objects\nlinked, both hashes OK.\n\nFirst-party 3,264 (78.6%), ASM 889, 0 MISMATCH. 420 tests, lint clean,\ntripwire 4864, 1,215 C-linked functions.","measures":{"fuzzy_match_percent":13.512852,"total_code":4367652,"matched_code":585880,"matched_code_percent":13.414073,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13086,"matched_functions":3868,"matched_functions_percent":29.558308,"complete_code":590196,"complete_code_percent":13.51289,"complete_data":0,"complete_data_percent":100,"total_units":13086,"complete_units":3882}},{"timestamp":"2026-08-04T03:27:46Z","commit_sha":"54fabe021968a6fda8d38e16aac8d9c0d1679015","commit_message":"Reopen documented floors with newer levers; +25 and first-party reaches 78.5%\n\nWave 13 disproved three floors this repo had recorded as corroborated, which\nmeant the notes were evidence of what had been tried, not of what is\npossible. 399 of the 737 floor notes named a mechanism for which a newer\nlever existed, so 16 agents re-attacked the 205 densest of them.\n\nMatched: y_draw 37 -> 43, btlShuffleCalc 12 -> 15, cmmMisc 32 -> 35,\nbtlResultSimple 4 -> 7, mdlManager 94 -> 96, y_fclCombine 16 -> 18,\nitfMesManager 72 -> 74, y_CmbCardEff +2, datCalc 56 -> 57,\ny_fclCombineDraw 24 -> 25.\n\nThe levers that carried it, all measured:\n- A WRONG SIGNATURE MASQUERADES AS REGISTER COLOURING. A discarded return\n  value, a missing parameter, or an untyped old-style extern on a CALLEE\n  changes argument evaluation order and colouring everywhere. Deriving the\n  signature from the callee's own prologue (which registers it saves, and\n  in what order) fixed floors across six files; func_0034f0d0 is\n  floats-first and that alone took two functions 17 -> 6 and 161 -> 41.\n- opt_propagation off PLUS an index-first `static inline` helper cracks\n  single-use-base load sinking; each alone fails. Confirmed on four files.\n  Strictly single-use: on multi-use bases it CSEs what retail re-derives.\n  The helper must live outside the pragma scope or it emits a stray symbol.\n- Declaration and statement order steer saved-register allocation\n  (`ret` first, counter before base, var_17 before var_16).\n- Individual stores beat an array initializer: `t[0]=a; t[1]=b;` reproduces\n  retail's addiu/sh pairs where `s16 t[4] = {...}` folds to a pool load.\n- Distinct integer-domain casts give distinct CSE keys, forcing the\n  per-dispatch reloads retail makes (70 -> 6 on one jump-table walker).\n- Ascending switch case order, explicit empty cases, and a shared\n  `goto`/default-last return block reproduce retail's body layout.\n\nRecorded as genuinely settled, with the measurements: frFont's nine\nfunctions where retail saves args in first-use order and b210 always\ncolours a later arg into $s0 first; the slt $at-versus-$v0 comparison\ndestination; mc.c's frame and FPU-accumulator floors. Also: a fresh m2c\nbody is NOT a substitute for an existing hand-adapted one (nd 235 vs 12),\nand m2c's s64 parameter guesses are wrong more often than right, so they\nmust be checked against the caller's setup and the callee's prologue.\n\nRegistered iGpffffb574 = 0x00764664 (gp -0x4A8C, evidenced from retail\nfunc_002b6a70). Five newly matched y_draw functions referenced it, and an\nunregistered symbol silently disqualified the whole translation unit --\ny_draw stopped linking and 58 C-linked functions vanished while every\nper-function check still passed and both image hashes still matched. That\nis the third time this class of defect has been caught only by the\nlink-coverage count.\n\nByte-exact link unchanged: image sha1 3d1d3d2b, SLUS_217.82 4eeec036,\n156 C objects, 1211 C-linked functions (was 1193). 418 tests, lint clean,\nmarker tripwire 4864.","measures":{"fuzzy_match_percent":13.486268,"total_code":4367660,"matched_code":584720,"matched_code_percent":13.387489,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13085,"matched_functions":3864,"matched_functions_percent":29.529995,"complete_code":589036,"complete_code_percent":13.486306,"complete_data":0,"complete_data_percent":100,"total_units":13085,"complete_units":3878}},{"timestamp":"2026-08-04T00:05:28Z","commit_sha":"952edf3504eb6a1071a4dd311f2beb17056f7d35","commit_message":"Port byte-exact C from the Persona 3 FES tree; +57 and first-party reaches 77.9%\n\nPersona 3 FES and Persona 4 share source and were built with the same\ncompiler, so where P4 still had an INCLUDE_ASM fallback and the FES tree\nhad a byte-exact match for the same function, the answer already existed.\nNothing had ever swept for that.\n\ntools/twin_census.py joins the two trees on a structural fingerprint:\nidentical window size, identical opcodes and identical register\nallocation, with 16-bit immediates, branch displacements and jump targets\nmasked out because those legitimately differ between the games. Of 99\nstructural twins, 61 are portable; the rest are donor hand-written asm\nfunctions or inline asm that decomp_lint bans here, and are reported as\nsuch rather than offered up.\n\nWave 13 ran 16 agents over the portable set:\n  btlAICommand   218 -> 248 (30/30, clone families of one dispatch body)\n  eff_after      3 -> 7      sdkSpr        9 -> 12\n  datPersona     41 -> 44    datCalc       54 -> 56\n  effPolygonRing 9 -> 11     mdlManager    92 -> 94\n  evtMessage     5 -> 8      code1_0047    6 -> 8 (100%)\n  sdkTask        21 -> 22 (100%)   frFont, effBlurFilter,\n  scrScriptProcess, g_data, code1_003d    +1 each\n\nThree \"corroborated floors\" turned out to be wrong, and the donor said\nwhy: the seven btlAICommand branch-to-branch clones needed\nopt_rebuildconditionals off; a datPersona load-sinking floor needed the\ndonor's two-s16-locals shape; an frFont colouring floor was a discarded\nreturn value the donor declares. The donor is the STRUCTURE -- every\noffset, assert line number and constant still comes from P4's own asm.\n\nAlso measured and recorded as a genuine floor: #pragma schedule does not\nmove the effPolygonFlash memset chain split (12 variants, all >= 8 words).\n\nTwo tool defects fixed, both of which had corrupted results:\n  - probe_variants scored an INCLUDE_ASM baseline as 0 differing words,\n    crowning the fallback and burying real candidates. A datPersona port\n    sat at 2 words while the tool reported baseline as the winner.\n  - probe_variants spliced a candidate with no trailing newline onto the\n    following // FUN_ marker, merging them so the next function lost its\n    marker and vanished. Six functions were deleted that way this wave\n    (five of them matched); all six are restored here and the marker\n    tripwire is back to 4864.\n\nThree volatile steering casts replaced with sanctioned integer-domain\naddress spellings (btlAICommand, sdkFiler), each measured to tie the\nvolatile exactly; two in mt_sceneFunc were probed and ARE load-bearing,\nso they stay.\n\nByte-exact link unchanged: image sha1 3d1d3d2b, SLUS_217.82 4eeec036,\n156 C objects, 1193 C-linked functions. 418 tests, lint clean.","measures":{"fuzzy_match_percent":13.30405,"total_code":4367800,"matched_code":576780,"matched_code_percent":13.205275,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13085,"matched_functions":3839,"matched_functions_percent":29.338938,"complete_code":581096,"complete_code_percent":13.304089,"complete_data":0,"complete_data_percent":100,"total_units":13085,"complete_units":3853}},{"timestamp":"2026-08-03T22:01:33Z","commit_sha":"e556c136756075957d5b4a48dcac9dd3c5e1c23c","commit_message":"Match 21 more; first-party reaches 76.5% and the ASM residual drops to 975\n\nWave 12 ran 16 agents over the untried long tail, one file each.\n\nMatched: sdkOt 6->10 (100%), sdkClump +3, effCrossfade +3, evtPMFileReader\n+3, sdkFiler +3, cldDungeonIn +2, y_fclCmbBall +2, cmmScript +1.\n\nNew measured results:\n- P3FES cross-workspace ports beat raw m2c badly on the scene-transform\n  functions (nd 3-4 vs 89/100), even where they do not close.\n- The four D_008C0256 button-mask reads keep their separate loads by\n  spelling each address in a different integer domain, replacing a\n  volatile-cast steering hack with a sanctioned CSE break.\n- FPU MAC (adda.s/madd.s) and VU0 madd.s/adda.s both come out of plain C;\n  no inline asm needed.\n- Confirmed floors: the xori/sltiu booleanization pair, the mula/madd\n  accumulator seed, aggregate-copy width, and case-4 switch-tail\n  placement (4 btlPanelCursor functions).\n\nRepairs: three floor notes had been wedged between a marker and its\nINCLUDE_ASM, hiding one function from the verifier; two mt_sceneFunc\nvolatile waivers were probed and are genuinely load-bearing (3->6, 0->5).\n\nByte-exact link unchanged: image sha1 3d1d3d2b, SLUS_217.82 4eeec036,\n156 C objects, 1186 C-linked functions. 390 tests, lint clean.","measures":{"fuzzy_match_percent":12.922834,"total_code":4368100,"matched_code":560168,"matched_code_percent":12.824066,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13085,"matched_functions":3782,"matched_functions_percent":28.903324,"complete_code":564484,"complete_code_percent":12.922873,"complete_data":0,"complete_data_percent":100,"total_units":13085,"complete_units":3796}},{"timestamp":"2026-08-03T20:48:37Z","commit_sha":"778de55d872343daef528d6135814f0709809dce","commit_message":"Match 26 more; first-party crosses 76% and the ASM residual drops below 1,000\n\n  first-party MATCH   3,131 -> 3,157  (76.0% of 4,153 tracked)\n  first-party ASM     1,022 -> 996\n  tree-wide MATCH     3,749 -> 3,775\n  C-linked functions  1,143 -> 1,165\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nTenth 16-agent wave, on untried functions. Zero MISMATCHes and zero compile\nerrors for the first time across a whole wave, which I attribute to the brief now\nbeing specific enough that agents spend their budget on the function rather than\non rediscovering the tooling.\n\n  y_fclCombineEvent 2 -> 7 of 7 (100%)   mainDraw 5 -> 10 of 11\n  evtEvent 4 -> 8 of 9                   calendar 3 -> 7 of 8\n  sdkCdvd 4 -> 7                         y_fclModel 0 -> 3\n  evtMain 35 -> 36                       mdlSE 1 -> 2      btlShuffle 20 -> 21\n\nThe vtable-base hoist -- the largest floor group in the tree -- now has a third\nspelling, and it is the one that took mainDraw's five assigned functions in a\nsingle pass:\n\n    #pragma opt_propagation off\n    void (**base)(u32, u32) = D_00887300;\n    base[0](a, b);\n\nWithout the pragma mwcc copy-propagates the base away and emits a per-call\nlui/lw; with it you get retail's single hoist into a saved register. So the family\nis now: typed pointer local for a DATA array, integer cast for a FUNCTION-POINTER\ntable, and this for either when the local gets propagated away -- plus the\ncomma-operator form when the hoist is right but a register still rotates. Any note\nmentioning D_00887300, D_008873F4, jtbl_008873EC or \"rematerializes lui\" predates\nat least one of the four and deserves a retry; mainDraw's own func_001014b0 is a\nknown example.\n\nAlso measured: hoisting a call's arguments into locals in retail's exact statement\norder defeats load-sinking (evtMain func_00288f20, nd 23 -> 1 -> match), and a\n`union { f32 f[2]; s64 x; }` forces the 8-byte stack alignment retail uses for an\ns64-read float pair (calendar, frame 0x70 -> 0x80, nd 117 -> 62).\n\nHonest note on what is left. 996 first-party functions remain: 313 were untried\nbefore this wave, and roughly 700 carry measured floors. A growing share of those\nare not register-allocation guesses any more but toolchain-level walls confirmed\nby independent probes -- the 19 accessor getters where b210 always colours the\nglobal-address base $v0, the seven btlAICommand branch-to-branch clones that\nsurvive a full pragma sweep, the 32-bit-into-128-bit store widening that two\nagents probe-verified separately, and dense VU0 vector functions like\neffPolygonThunder's three (63, 107 and 189 VU0 instructions each) where every\noperation would need its own inline-asm block. Reaching 100% will require either\nthose walls to fall to a spelling nobody has tried or a different toolchain\nhypothesis; it will not come from more register permutations.\n\n390 tests pass; decomp_lint 0 findings on 320 files; both hashes reproduce.","measures":{"fuzzy_match_percent":12.77946,"total_code":4368184,"matched_code":553916,"matched_code_percent":12.680693,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13085,"matched_functions":3761,"matched_functions_percent":28.742834,"complete_code":558232,"complete_code_percent":12.779498,"complete_data":0,"complete_data_percent":100,"total_units":13085,"complete_units":3775}},{"timestamp":"2026-08-03T19:37:29Z","commit_sha":"a6059376cb23c36623410745ff74cd3813d00313","commit_message":"Match 29 more; fix seven latent bad symbols and another hidden marker\n\n  first-party MATCH   3,102 -> 3,131  (75.4% of 4,153 tracked)\n  tree-wide MATCH     3,720 -> 3,749\n  C-linked functions  1,118 -> 1,143\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nNinth 16-agent wave, on untried functions. Two files reached 100%:\n\n  ed_sr    7 of 7      nmlist   6 of 6      mdlEffect had already hit 37 of 38\n  btlCutin 3 -> 7      k_fldEnvironment 5 -> 8   shdWindow 2 -> 5\n  sdkDbprt 1 -> 4      effGeometry 11 -> 13      cmpPersona 9 -> 10\n\nThe best new lever breaks the argument-evaluation-order floor, which is recorded\non dozens of functions: retail materializes the register arguments first and loads\nthe memory operand last, mwcc loads first. Neither an inline load nor a hoisted\nlocal moves it. Reaching the value through a STRUCT FIELD does:\n\n    func_x(a, b, mgr->size);          /* load last, as retail: nd 3 -> 0 */\n    s32 sz = mgr->size; func_x(...);  /* load first, nd 6                */\n\nnmlist reached 6 of 6 on that, reusing NmlistNode/NmlistList from the sibling\ncomuData.c rather than inventing types - so it also scores TYPED for recovery.\n\nAlso measured: a function-pointer table base sometimes needs defining inside the\ncall (`node = (base = (u32)jtbl, call(base));`) to fix a saved-register rotation\nthe plain hoisted base gets wrong; and the CSE-defeating type mismatch must be in\nthe INTEGER domain, since (u32 *)p + 4 and (s32 *)p + 4 canonicalize to one key\nwhile (u32)p + 0x10 and (s32)p + 0x10 do not. A `u`-suffixed literal is enough.\n\nSeven latent bad data symbols found and fixed. Each contradicted its OWN evidence\nnote - iGpffffba48 was recorded as 0x007C4B38 where the note says gp-0x45B8, which\nis 0x00764B38 - off by 0x60000, and two others by 0x40000. They had not broken\nanything only because every function referencing them was still INCLUDE_ASM, so\nthe relocations came from spliced assembly and never consulted these values. The\nfirst one to match would have moved a load and changed the image silently. A test\nnow recomputes every gp-relative entry against the displacement its own note\nstates; the negative control confirms it fires.\n\nbtlPanelAnalyze.c carried `}// FUN_00218C60` - a marker sharing a line with the\nprevious function's closing brace. That is the exact bug that hid func_00166600\nfor the whole campaign, and the scratch/marker test added last commit is what\ncaught it. Splitting it exposed a function that was always there, and it turned\nout to be matchable, so the count went up twice over.\n\nRepairs: seven agents hit their turn limit. Only one left a MISMATCH (shdMisc,\nreverted with what it had established: the s64 first parameter that gives retail's\nsingle `sd` spill, and D_0064E2F8 needing an array declaration). datCalc's agent\ncaught and repaired its own edit corruption, and cmpConfig fixed a marker\nmisalignment - both verified here as genuine rather than lost functions.\n\nLinked functions rose 1,118 -> 1,143. One TU dropped out of whole-object placement\n(sdkDbprt, one function) against 26 gained, with both hashes byte-exact.\n\n390 tests pass; decomp_lint 0 findings on 320 files; both hashes reproduce.\nResidual: 1,022 first-party, of which 407 were untried before this wave.","measures":{"fuzzy_match_percent":12.593736,"total_code":4368384,"matched_code":547288,"matched_code_percent":12.528385,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13085,"matched_functions":3740,"matched_functions_percent":28.582346,"complete_code":550144,"complete_code_percent":12.593764,"complete_data":0,"complete_data_percent":100,"total_units":13085,"complete_units":3749}},{"timestamp":"2026-08-03T18:25:15Z","commit_sha":"e4504a62461fb39ab4c35f3c5ff8dfc6cb49aac8","commit_message":"Match 33 more on untried ground; catch a jump-table bug the verifier cannot see\n\n  first-party MATCH   3,069 -> 3,102  (74.7% of 4,153 tracked)\n  tree-wide MATCH     3,687 -> 3,720\n  C objects linked    157\n  C-linked functions  1,096 -> 1,118\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nEighth 16-agent wave, back onto untried functions now that the near-miss pool is\nmostly exhausted floors. The accumulated recipe list did most of the work:\n\n  mdlEffect  32 -> 37 of 38   pscRes  23 -> 29 of 30   cmpMain  2 -> 7 of 8\n  effAfpack   3 ->  6         effPolygonWind 10 -> 13  y_fclTalk  4 -> 8\n  cmpEquip    3 ->  5         k_fldAI  4 -> 6          mt_sceneFunc 39 -> 40\n  mc         19 -> 20\n\nTwo recipe refinements, both from agents that then matched with them:\n\nThe CSE-defeating type mismatch must be in the INTEGER domain. Re-typing the\npointer does nothing -- (u32 *)p + 4, (u16 *)p + 8 and (s32 *)p + 4 all\ncanonicalize to one CSE key. Only (u32)p + 0x10 versus (s32)p + 0x10 produce\ndistinct keys. pscRes used that on all six of its matches. The same distinction\nrestates the addu lever exactly: an integer-domain add emits index-first, a\npointer-domain add emits base-first.\n\nA function-pointer table base sometimes needs defining INSIDE the call:\n`node = (base = (u32)jtbl_008873E8, call(base));` fixes a saved-register rotation\nthe plain hoisted-base spelling gets wrong. nd 10 -> 0, and mdlEffect went to\n37 of 38.\n\nThe important find is a bug class the per-function verifier structurally cannot\nsee. cmpMain func_0012cc50 was reported MATCH, decomp_lint was clean, 389 tests\npassed - and the linked image SHA-1 changed. Exactly one word differed, at\n0x007468c4: retail's switch jump-table entry 13 targets the post-switch tail\n(0x0012cd5c) because case 13 is EMPTY, and the candidate had folded 13 into the\nassert group so the entry pointed at 0x0012cd48 instead. Every instruction was\nidentical; only the table DATA differed, and verify masks relocations. Splitting\ncase 13 back out as its own empty `break` restored both hashes. That is the whole\nreason the link gate exists, and it is the second time this session that a fall\nin the link numbers was the only symptom of a real defect.\n\nRepairs were heavy: nine of sixteen agents hit their turn limit, leaving 15\nMISMATCHes. Ten reverted per function with their measurements. sdkChkmem reverted\nwholesale - its agent moved func_0044e920 into that TU to get a same-TU clobber\nset, which is a translation-unit boundary claim with no __FILE__ evidence behind\nit, and the file had five MISMATCHes. Two of my own reverts then needed fixing: a\nlost forward declaration for a function whose address is taken as a callback, and\nan orphaned `#pragma pop` whose push was inside the region I removed.\n\nResidual is now 1,051 first-party: 407 untried and 644 carrying measured floors.\nThe near-miss pool (nd <= 12) has shrunk to 140 and is now mostly hard walls - the\nseven btlAICommand branch-to-branch clones and the 19 accessor getters between\nthem account for a quarter of it, each probed to exhaustion.\n\n389 tests pass; decomp_lint 0 findings on 320 files; both hashes reproduce.","measures":{"fuzzy_match_percent":12.401873,"total_code":4368588,"matched_code":538932,"matched_code_percent":12.336526,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13085,"matched_functions":3711,"matched_functions_percent":28.360718,"complete_code":541788,"complete_code_percent":12.401902,"complete_data":0,"complete_data_percent":100,"total_units":13085,"complete_units":3720}},{"timestamp":"2026-08-03T17:11:06Z","commit_sha":"18f2e0abbce024220c46b0b50c008ca6000fd366","commit_message":"Match 17 more by attacking the near-misses; split the 0x00244100 nullsub\n\n  first-party MATCH   3,052 -> 3,069  (73.9% of 4,153 tracked)\n  tree-wide MATCH     3,670 -> 3,687\n  C objects linked    157\n  C-linked functions  1,092 -> 1,096\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nSeventh 16-agent wave, and the first aimed purely at arithmetic: every target was\na function whose floor note recorded a diff of 12 words or fewer. 168 such\nfunctions existed, 98 were assigned, and the hit rate was far better than any\nuntried-function wave - the structure was already right, so what remained was one\noperand order, one register, or one load.\n\nThe best find is a hidden return value. Tiny \"void\" setters whose retail shape is\n`lui $v0 / sw arg,0xNNNN($v0) / jr $ra` are not void: the base IS the return\nvalue, which is why the store folds into an offset off it.\n\n    s32 *func_004d18d8(s32 arg0)\n    {\n        s32 *segment = (s32 *)0x00720000;\n        segment[0xFC4] = arg0;\n        return segment;\n    }\n\nFour code1_004d setters went nd 2 -> 0 on that, and code1_004e's already-matched\nsiblings turn out to use the same shape. I broadcast it mid-wave and code1_0050\nlanded two more within the hour. The getter next door is the opposite: retail\n`lui $v1` + load into `$v0` is unreachable, corroborated across 19 accessors in\nseven files with 16+ spellings each.\n\nSecond find, now used three times: to defeat an unwanted CSE, change the TYPE of\none of the two expressions. mwcc will not common up expressions whose types\ndiffer, so a deliberate mismatch buys retail's separate store/test:\n\n    *(u16 *)(obj + 0x11E) = (u16)v4;   /* store via u16 */\n    if ((s16)v4 == ...)                /* test via s16 -> sh emitted first */\n\nThat, plus `v = (s32)(*(u32 *)obj & ~7u)` for a reload after a call, matched\nfunctions in y_fclCombineDraw and itfMesManager that were both recorded as CSE\nfloors.\n\nfunc_00243fa0 is finally matched after being blocked all campaign. Its 368-byte\nwindow contained an unmarked `jr $ra; nop` nullsub at 0x00244100 - 0x00635950\nholds that address and the next two slots of the same table hold 0x00244110 and\n0x00244540, both already canonical. Marking it shrinks the window to 352 and BOTH\nfunctions match. Marker tripwire bumped 4863 -> 4864; this is the one time in the\ncampaign the count grew because a function was genuinely added rather than\nuncovered.\n\nThat also exposed why the canonical map cannot be regenerated: reconcile exits 1\nbefore writing, on the two frFont false splits. Those are now allowlisted with the\nevidence wave 6 gathered, but regenerating still drops 0x0027A340, which the\ncurrent control-flow scan cannot see and whose loss widens func_0027a2d0's window\nfrom 112 to 128 and breaks a matching function. So the committed map stays, the\noverride is validated by its pointer evidence instead, and 0x0027A340 is the named\nblocker for anyone who wants the map regenerable.\n\nOne regression found and fixed rather than shipped. y_fclCombineDraw gained four\nmatches, and linked functions fell 1,092 -> 1,072 - all 21 losses in that one\nfile. Cause: func_0032c0c0's 6-case switch makes mwcc emit a SECOND anonymous\n.rodata jump table, and build.py's recover_concatenated_layout cannot anchor two\nof those, so plan_data_sections refuses the whole TU. Both hashes still\nreproduced, which is exactly why this is the failure mode worth fearing. Keeping\nthat one function as INCLUDE_ASM - with its working C recorded in the note - keeps\nthe other three matches AND the 21 linked functions, so the wave ends at 1,096.\n\nTooling: fndiff now warns when a function still has an INCLUDE_ASM fallback,\nbecause the object then IS the retail assembly and the diff always reads 0. Waves\nhad been writing that 0 into floor notes as \"almost matches\"; three files carried\nsuch notes and their real bodies measure nd 2. Two new tests: nothing may sit\nbetween a marker and its INCLUDE_ASM, and no scratch functions or code-before-\nmarker in first-party sources (a wave left `func_003724f0_tmp` under a fake\n`// TMP_` marker, which compiled into a bare .text section no marker owned and\nbroke object layout after a six-minute build).\n\n389 tests pass; decomp_lint 0 findings on 320 files; both hashes reproduce.","measures":{"fuzzy_match_percent":12.086643,"total_code":4368812,"matched_code":525188,"matched_code_percent":12.0213,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13085,"matched_functions":3678,"matched_functions_percent":28.108522,"complete_code":528044,"complete_code_percent":12.086673,"complete_data":0,"complete_data_percent":100,"total_units":13085,"complete_units":3687}},{"timestamp":"2026-08-03T15:13:23Z","commit_sha":"6b03e694360632c4826dd06ce6046ba7bef53c76","commit_message":"Match 8 more; crack the vtable base hoist and the sign-test floor\n\n  first-party MATCH   3,044 -> 3,052  (73.5% of 4,152 tracked)\n  tree-wide MATCH     3,662 -> 3,670\n  C objects linked    157\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nSixth 16-agent wave, pointed at four measured recipes rather than at untried\nfunctions. The match count understates it: the point was to test whether the\nrecipes hold, and two of them cracked floor families that had been recorded as\nsettled.\n\nThe D_00887300 / D_008873F4 render-vtable base hoist is not a floor. It is the\nlargest floor group in the tree and had a note saying \"confirmed by sibling\nwave\". A typed function-pointer local folds back to a per-call lui/lw; an\ninteger cast does not:\n\n    u32 base = (u32)D_00887300;\n    ((void (*)(s32, s32))*(u32 *)base)(n, m);\n\ny_CmbCardEff func_00347b30 matched on it and func_0033f690 went nd 73 -> 22.\nI broadcast it mid-wave and four more agents confirmed it on their own files.\nData arrays still want the typed pointer local (y_fclShopDraw func_002caef0:\nnd 414 -> 36, and func_002d7300's frame and every stack slot now byte-identical).\n\nThe duplicated-bltz sign test is also source-drivable, after being recorded as\ntotal in mdlManager following 14 spellings. mwcc duplicates the arm because\nconverting an unsigned value to float lets it prove the sign test always true.\nRetail's single bare bltz needs four things together - an s32 local, a u32 copy\nfor the shift, an (s32) cast on the or-result, and doubling as x + x - plus the\nif (v >= 0) { plain } else { doubled } orientation on the raw load. Measured:\ncmmMisc nd 23 -> 6, 56 -> 12, 37 -> 5; y_CmbCardEff 312 -> 263; y_draw 111 -> 59.\nNone matched, but the conversion blocks themselves are byte-exact now.\n\nRecipe D produced two clean matches in y_smap (func_002b13e0, func_002b1480,\nnd 4 and nd 2 -> 0). Naming the product operands in locals is what flips the\nmsub.s orientation; an inline product does not.\n\nAlso measured: keeping a struct-array element address in a pointer rather than\nan integer index stops mwcc folding the field offset into the index multiply\n(cmmMisc func_00249a60, nd 29 -> 5).\n\nEight of sixteen agents hit their turn limit - the recipes made them dig deeper -\nso the repair pass was the largest yet: two files left uncompilable mid-edit\n(mdlManager, y_fclShopDraw), three MISMATCHes reverted with their measurements,\nand a scratch function `func_003724f0_tmp` under a fake `// TMP_003724F0` marker\nleft inside btlShuffleCalc.c. That last one is worth a test: it compiled into a\nbare .text section no marker owned, so build.py refused to lay the object out -\nbut only after a six-minute build, with every per-function verify passing.\n\nI made three repair mistakes worth recording, all now covered by tests or the\nhelper: splitting an agent-written region on '\\r\\n' when it had bare LF inside a\nCRLF file (left the whole body in place), joining with '\\n' over lines that still\ncarried '\\r' (wrote '\\r\\r\\n'), and sweeping up the NEXT function's floor note\nbecause it trails the region - twice, once truncating a block comment into a\ndangling `*/`.\n\nNew tests: nothing may sit between a marker and its INCLUDE_ASM (which is how\nstripping four `#ifdef NON_MATCHING` blocks in y_smap silently cost three\nfunctions until floor_census caught it), and no scratch functions or\ncode-before-marker in first-party sources. I did not touch the 94 pre-existing\n`#ifdef NON_MATCHING` blocks across 32 files - that is an established convention\nholding real reverse-engineering work, and mass-deleting it is not my call.\n\n383 tests pass; decomp_lint 0 findings on 320 files; both hashes reproduce.\nResidual: 462 untried, 638 carrying measured floors.","measures":{"fuzzy_match_percent":12.001172,"total_code":4368896,"matched_code":521464,"matched_code_percent":11.93583,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3661,"matched_functions_percent":27.98074,"complete_code":524320,"complete_code_percent":12.001202,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3670}},{"timestamp":"2026-08-03T13:43:25Z","commit_sha":"8737e8d2e447a8be8b4e24aa8e9cc799925546e6","commit_message":"Match 11 more; settle ldl/ldr in both directions and crack the duplicated-bltz floor\n\n  first-party MATCH   3,033 -> 3,044  (73.3% of 4,152 tracked)\n  tree-wide MATCH     3,651 -> 3,662\n  C objects linked    157\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nFifth 16-agent wave, aimed squarely at the three rules the last commit measured.\nEvery agent was required to report what each rule did to each candidate, even\n\"no change\", and that reporting is worth more than the 11 matches.\n\nRules 2 and 3 are confirmed and productive. shdPersona matched two functions\ndirectly through them: func_001190f0 nd 20 -> 0 from transposing an FMA\nmultiplication, func_001162f0 nd 33 -> 0 from a typed-alias quadword read. The\nFMA rule was independently verified byte-for-byte at its own site in eight more\nfunctions across effBlurFilter, btlShuffleCalc, shdSkill and effPolygonRing --\neach still floored, but on a different, named residual.\n\nRule 1 I got wrong twice, and the record now says so plainly.\n\n  Written first as \"ldl/ldr is not a floor, those five skips were wrong\". That\n  over-generalised: it ignored displacement.\n  Corrected to \"8-aligned ldl/ldr is a genuine floor\", after probing packed,\n  aligned(1), aligned(4) and 20+ spellings. Also wrong -- that probe only ever\n  tried the s64 spelling.\n  What is actually true is two independent mechanisms:\n    an 8-byte struct passed BY VALUE emits the pair at ANY displacement;\n    a plain s64/u64 read emits it only at a 4-mod-8 displacement.\n  Both measured against b210 and both now confirmed in the tree -- y_fclShopDraw\n  reaches its pair through the second at 0x2C, y_CmbCardEff through the first at\n  an 8-aligned 0x134. A 12-byte struct does not use the pair, so the mechanism\n  is specific to 8 bytes.\n\nBoth errors came from probing one spelling and generalising. The brief says so,\nwith the history, because the failure mode matters more than the rule.\n\nbtlShuffleCalc cracked the duplicated-bltz floor that mdlManager had recorded as\ntotal after 14 spellings. mwcc duplicates the arm because converting an unsigned\nvalue to float lets it prove the sign test always true. Retail's single bare bltz\nneeds four things at once: an s32 local (not u16/u32), a u32 copy for the shift,\nan (s32) cast on the or-result, and doubling as x + x. ~31 probe variants to find\nit. mdlManager reached the same recipe independently. Those functions reopen.\n\nAlso overturned: the global-address base-hoist floor yields to a typed pointer\nlocal (`Vec2f *base = (Vec2f *)D_0063F658;`), which made y_fclShopDraw\nfunc_002d7300's frame and every stack slot byte-identical. Worth retrying on the\nD_00887300 render-vtable family, the largest floor group in the tree.\n\nRecorded as genuinely unreachable, with evidence: tail-branch sharing, where\nretail routes one path's jump through another's (eight btlAICommand clones, one\nword each). No pragma touches it -- and note that b210 silently ignores unknown\npragma names, so \"the compiler accepted it\" means nothing. Only a changed object\nhash does.\n\nRepairs: two agents died on turn limits. mdlManager was clean. shdPersona had a\nduplicated parameter name (102 COMPILE_ERROR) plus five unjustified pragmas and a\nduplicated `off`, one pair wrapped around an INCLUDE_ASM where it can do nothing.\nbtlShuffleCalc had a MISMATCH its agent never reported -- restored to\nINCLUDE_ASM with the measurement. I also corrupted that file's line endings while\nreverting it and had to repair CRLF and restore a floor note I had swept up.\n\ntests/test_recovered_symbols.py had one test too strict: it required every\ncurated address to be word-aligned, which rejected six correctly-evidenced byte\nsymbols (iGpffff9c10..13 are four consecutive bytes copied one lbu at a time).\nAlignment is now required only where the evidence shows a word-or-wider access.\n\n381 tests pass; decomp_lint 0 findings on 320 files; both hashes reproduce.\nResidual: 481 untried, 627 carrying measured floors.","measures":{"fuzzy_match_percent":11.943338,"total_code":4368952,"matched_code":518944,"matched_code_percent":11.877997,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3653,"matched_functions_percent":27.919596,"complete_code":521800,"complete_code_percent":11.943368,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3662}},{"timestamp":"2026-08-03T11:52:06Z","commit_sha":"41664633d57dfe6553c593d6099ea9a3187e20dc","commit_message":"Match 17 more; disprove two more floors and delete a banned volatile family\n\n  first-party MATCH   3,016 -> 3,033  (73.0% of 4,152 tracked)\n  tree-wide MATCH     3,634 -> 3,651\n  C objects linked    157\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nFourth 16-agent wave. The match count is the least interesting number in it: the\nfiles left are the ones three earlier waves already picked over, so 9 of 16\nagents matched nothing and instead measured floors properly. That is the\nexpected shape this far in and it is still progress - untried 669 -> 580, with\n539 functions now carrying measured notes.\n\n  effBlurFilter 35 -> 42   datCalc 45 -> 50   k_fldLmap 14 -> 16\n  btlAICommand 217 -> 218  y_fclCombine 14 -> 15\n  cmmRankUp 11 -> 12       btlShuffleCalc 11 -> 12\n\ncmmRankUp's match is func_00257820, one of the daddiu floors the last commit\nreopened - so that disproof has now paid for itself.\n\nTwo agents died on turn limits. btlAICommand was clean; y_fclShopDraw was left\nwith 38 COMPILE_ERROR from a second declaration block that redeclared four\nhelpers with s64 params where the file already had them as s16. Repaired rather\nthan reverted, so the file's 18 matches survived.\n\nThree things worth more than the 17 matches:\n\n`ldl`/`ldr` is not a floor and never was. Five y_fclCombine functions had been\nskipped under the \"m2c error means VU0\" rule. Measured against b210 directly: a\n64-bit read whose displacement is not divisible by 8 compiles to the ldr/ldl\npair, and one that is divisible compiles to ld. That is the whole rule. m2c\ncannot express it, which is why its drafts carry an error marker - an m2c\nlimitation, not a compiler wall. 28 first-party functions contain these opcodes.\n\nFMA operand order is not canonicalized either. Six functions across y_smap and\nbtlShuffleCalc were floored at nd 2-4 on \"b210 canonicalizes msub.s fs/ft\".\nIt does not: `acc + a*b` emits madd.s $f0,$f13,$f14 and `acc + b*a` emits\nmadd.s $f0,$f14,$f13. The source multiplication order picks the operand order,\neven through a named product local.\n\neffPolygonFlash carried eight copies of `*((volatile u8 *)&sp4C + 3) = 0xFF;` -\nvolatile used to stop mwcc eliminating a store, which is exactly what H001 bans.\nFive had measured waivers, three did not, which is how it surfaced. Measured all\nthree possibilities: dropping the store gives nd 32, so it is load-bearing;\nwriting it byte-wise gives nd 53; and a plain `sp4C.b[3] = 0xFF;` gives nd 0.\nThe volatile was never necessary. All eight are now plain stores, the five stale\nwaivers say what was actually measured, and all 34 matches in the file held.\n\nAlso removed D_80000046 and D_8000001E from config/symbol_data_addrs.txt. They\nare not addresses - they are a saturation constant materialized by lui/ori that\nan agent read as a symbol. ABSOLUTE_RANGES admits the KSEG0 mirror for the\nrelocation scan, so nothing rejected them, and since verify masks relocations\nthe only symptom would have been a quiet fall in linked objects. Curated entries\nare now required to lie inside the load image, derived from the target config.\n\nNew tooling: tools/floor_census.py splits the residual into untried and\nmeasured-floor, and finds notes that are misplaced (between a marker and its\nINCLUDE_ASM, which hides the function from the verifier) or orphaned. Attribution\nis the whole difficulty - measuring this tree with a 12-line window, a 4-line\nwindow and a contiguous-comment walk gave 500, 49 and 20 floored functions. Only\none rule is stable: a note belongs to the next marker below it, with no other\nmarker in between. 14 tests pin it.\n\n381 tests pass; decomp_lint 0 findings on 320 files; both hashes reproduce.","measures":{"fuzzy_match_percent":11.8590145,"total_code":4369020,"matched_code":515268,"matched_code_percent":11.793674,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3642,"matched_functions_percent":27.835524,"complete_code":518124,"complete_code_percent":11.859044,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3651}},{"timestamp":"2026-08-03T09:47:45Z","commit_sha":"77aec87c517d320e6f8902db987776ca6b1c55d0","commit_message":"Cut the README back down\n\nMy last commit added fifteen lines of prose explaining four badges. A badge\nthat needs a paragraph is a bad badge; these ones render their own label and\ndenominator and need nothing. Deleted outright.\n\nThe measure rationale that prose carried is worth keeping, but its readers are\ncontributors, not visitors, and it was already written down in CONTRIBUTING.md\nnext to the tests that enforce it. Nothing was lost.\n\nAlso trimmed what was already redundant before I touched the file:\n\n  - \"the matching build reproduces the retail load image and ELF byte-for-byte\"\n    appeared in the intro and again below the status table, which itself lists\n    both SHA-1s. Once now.\n  - the generated-candidates paragraph spent five lines saying src/generated/\n    is not authoritative source. Two.\n  - the disc/legal note and the shared-p3 note lost a line each.\n  - the status trailer, which progress.py generates, said in four clauses that\n    matching is not recovery. One sentence and the command that ranks the\n    files. tests/test_recovery_quality.py no longer pins the exact wording,\n    only that the note draws the distinction and names the tool.\n\n  README.md  151 -> 131 lines, and 133 before any of this, so it is now\n  shorter than what I started with.\n\nRegenerated the status block through progress.py rather than hand-editing\ninside the generated markers. 363 tests pass, validate-dir clean, all four\nbadges still render.","measures":{"fuzzy_match_percent":11.603018,"total_code":4369128,"matched_code":504096,"matched_code_percent":11.53768,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3625,"matched_functions_percent":27.705595,"complete_code":506952,"complete_code_percent":11.603047,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3634}},{"timestamp":"2026-08-03T08:44:01Z","commit_sha":"329217960bfef5b1139ddbdb3b15e73139ecec8d","commit_message":"Serve the progress badges from decomp.dev\n\nThe project was already registered and ingesting commits at\ndecomp.dev/Raikaru/Persona4-Decompilation - it had picked up 9a86a8df before I\nlooked - but the README was still rendering two badges out of our own GitHub\nPages JSON. Three of the four now come from decomp.dev in the same form the\nother PS2 projects use (god-hand, recvx, sly1, Himuro):\n\n  decomp.dev/<owner>/<repo>.svg?mode=shield&label=...&measure=...\n\n  first-party functions   3,016 / 4,152     category=main\n  all functions           3,634 / 13,084\n  code                    11.60%\n\nThey report the complete_* measures rather than the matched_* ones, and that\ndistinction is not cosmetic: matched_* is fuzzy-weighted and credits near\nmisses, so matched_functions reads 3,625 where complete_units reads 3,634.\nOnly the second agrees with what this project means by MATCH. Picking the\nfuzzy measure would have published a byte-identical claim nine functions\nlarger than the one the verifier can defend, so a test now rejects the whole\nmatched_* family outright.\n\nThe first-party badge selects category=main, which is one of the ids\ntools/gen_objdiff.py assigns to units - so a rename there would silently change\nwhat the badge reports. decomp.dev answers 200 for an unknown category, and 200\nfor a missing mode=shield too, in which case the identical URL serves the\n4.6 MB unit treemap instead of a badge. None of those failures are visible in a\nbrowser, so tests/test_recovery_quality.py pins the slug, the shield mode, the\ncategory against PROGRESS_CATEGORIES, the measure allowlist, and that each\nbadge is wrapped in a link to the report. Each guard was confirmed by breaking\nit: eight new tests, 355 -> 363.\n\nI kept the fourth badge on our own Pages endpoint because decomp.dev has no\nmeasure for it. \"Byte-exact linked C\" is the share of windows inside C objects\nthat link byte-for-byte, 1,072 against 3,634 matched, and the gap is the point:\nan object qualifies only once every function in it is C, so one assembly\nfallback withholds all of its neighbours. That is the stricter gate this repo\nactually cares about and it belongs next to the others.\n\nVerified by fetching all four URLs exactly as the README spells them and\nreading the rendered SVG text; all return image/svg+xml with the values above\nand all four links resolve.","measures":{"fuzzy_match_percent":11.603018,"total_code":4369128,"matched_code":504096,"matched_code_percent":11.53768,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3625,"matched_functions_percent":27.705595,"complete_code":506952,"complete_code_percent":11.603047,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3634}},{"timestamp":"2026-08-03T07:57:30Z","commit_sha":"9a86a8dfe20dad88bad78fa5dc1e80240c10614f","commit_message":"Match 42 more; overturn two floors that were never real\n\n  first-party MATCH   2,974 -> 3,016  (72.6% of 4,151 tracked)\n  tree-wide MATCH     3,592 -> 3,634\n  C objects linked    157\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nThird 16-agent wave, aimed at files two earlier waves had assigned but never\nreached before dying on a rate limit. Zero mismatches and zero compile errors\nagain - the four-attempt budget has now held across three consecutive waves.\n\n  shdSprite     1 -> 9      k_fldHBN      1 -> 7     sdkSndcom  1 -> 6\n  evtScript     2 -> 6      titleVisual   0 -> 4     cmpPartyPanel 0 -> 4\n  effPolygonThunder 7 -> 10 k_fldEvent   18 -> 21    mdlMatAnim 8 -> 10\n  y_smap       19 -> 20     y_list       24 -> 25    sdkSnd    20 -> 21\n\nshdSprite finally gave up func_0025f3f0 and func_0025f500 - the EABI\nargument-forwarding wrappers that pass floats first and let $a0-$a3 and\n$f12-$f14 fall through from the caller. I had deferred those twice.\n\nThe more valuable result is two recorded floors being disproved:\n\nThe \"64-bit constant load\" floor in k_fldUnit.c and cmmRankUp.c said retail's\n`daddiu $x,$zero,imm` was unreachable because mwcc always emits `addiu`. It is\nreachable: declare the pattern variable `u8` and you get the daddiu. s32 and s64\nnever do. The floor was a missing type, not a compiler limit, and the functions\nbehind it are open again.\n\n\"mwcc rejects `f` asm constraints and `ppacb %0`\" was also wrong - the real error\nwas a dangling `%1` left behind when an operand was removed. Fixing that matched\nthree VU0 colour-conversion clones in effPolygonThunder.\n\nBoth are now in the wave brief under a section saying plainly that a floor note is\na hypothesis, not a verdict, and listing how each was overturned.\n\nOne claim I am NOT acting on: an agent read `MW MIPS C Compiler (2.4.1.01)` in the\nretail ELF's comment section and proposed that b210 is the wrong compiler and a\n2.4 binary should replace it. That string lives inside mwldps2.exe - the LINKER\nstamps it - and b210 reproduces 3,634 functions byte-for-byte. Where retail's FPU\nfusion differs from b210's, the difference is in the source shape. The brief now\nsays so, because this inference has now been made twice.\n\ncmmCommunity is fully characterised: all 18 remaining functions carry measured\nfloor notes after twelve were tested to exhaustion against one shared\nbranch-shape floor. The effect* graphics files are likewise done for plain C -\nwhat remains there is VU0 or recorded.\n\n355 tests pass; decomp_lint 0 findings on 320 files; build reproduces both hashes.\n\nRecovery quality: 3,016 matched first-party functions are 5.1% NAMED, 39.9%\nTYPED, 58.8% DOCUMENTED. Matching keeps outrunning recovery.","measures":{"fuzzy_match_percent":11.603018,"total_code":4369128,"matched_code":504096,"matched_code_percent":11.53768,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3625,"matched_functions_percent":27.705595,"complete_code":506952,"complete_code_percent":11.603047,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3634}},{"timestamp":"2026-08-03T06:02:20Z","commit_sha":"4cd4d040dbdd40fa7071b816e34bb0b4ef11f7f9","commit_message":"Match 52 more in a second 16-agent wave; sdkTask reaches 95%\n\n  first-party MATCH   2,922 -> 2,974  (71.6% of 4,151 tracked)\n  tree-wide MATCH     3,540 -> 3,592\n  C objects linked    157\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\n  sdkTask     11 -> 21 (95.5%)   btlShuffleDraw 30 -> 38   cmmScript 34 -> 42\n  cmmRankUp    7 -> 11           itfMesManager  67 -> 71   mdlManager 85 -> 89\n  kernelMc    16 -> 19           kFldUnit       24 -> 27   kFldResource 10 -> 13\n  y_fclShopDraw 17 -> 18         y_fclCombineDraw 20 -> 21  shdPersona 67 -> 68\n\nsdkTask is the notable one: it now owns func_00451de0, the function whose stores\ndefine the SdkTask layout that include/sdktask.h documents, so the header and its\nown source finally agree.\n\nThree agents hit their turn limit mid-experiment and left one MISMATCH each\n(btlAICommand, datCalc, nLine); all three reverted cleanly. The datCalc revert\norphaned a `#pragma opt_loop_invariants on` whose function had just gone back to\nINCLUDE_ASM - the unbalanced-pragma lint caught it, which is exactly what that\nrule is for.\n\nTwo hygiene findings worth recording:\n\nk_fldUnit.c carried `}// FUN_00166600` - a marker sharing a line with the\nprevious function's closing brace. The scanner never saw it, so func_00166600 was\ninvisible to the verifier and to every census this campaign has run. Splitting it\nonto its own line exposes a function that was always there; the marker tripwire\ngoes 4862 -> 4863 for that reason and nothing was added.\n\nTwo agents independently destroyed their own source file with\n`verify.py --json src/<file>.c` and recovered from the parent revision. The\nfootgun is real and the brief already warns about it in capitals.\n\nconfig/symbol_data_addrs.txt got its first real use: agents added 22 evidence-\nbacked gp-relative and absolute data addresses instead of appending to the\ngenerated file, and one agent found and fixed two arithmetic errors in earlier\nentries (iGpffff9e10 and iGpffffb4b0 both had the wrong gp arithmetic) because\nthe new test refused to let a curated entry disagree with the relocation scan.\n\n355 tests pass; decomp_lint 0 findings on 320 files; build reproduces both hashes.\n\nRecovery quality, still tracked separately and still the bottleneck: of 2,974\nmatched first-party functions, 5.2% are NAMED, 40.0% TYPED, 58.9% DOCUMENTED.","measures":{"fuzzy_match_percent":11.255807,"total_code":4369360,"matched_code":488952,"matched_code_percent":11.190472,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3583,"matched_functions_percent":27.38459,"complete_code":491808,"complete_code_percent":11.255836,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3592}},{"timestamp":"2026-08-03T03:07:01Z","commit_sha":"e532a99ad79db0f375b8f82a65cd2b57a5da56b5","commit_message":"Match 118 functions in a 16-agent wave; make curated data symbols durable\n\n  first-party MATCH   2,804 -> 2,922  (70.4% of 4,151 tracked)\n  tree-wide MATCH     3,422 -> 3,540\n  C objects linked    157\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nSixteen agents, one file each. The previous 64-agent wave left 98 compile errors\nand 73 mismatches to clean up because every agent ran to its turn limit mid-\nexperiment. This one landed with ZERO mismatches and ZERO compile errors, and the\ndifference was a single instruction in the brief: at most four attempts per\nfunction, then restore INCLUDE_ASM and move on. Sixteen agents that finish beat\nsixty-four that are interrupted.\n\n  cmmMisc        10 -> 29     shdPersona   49 -> 67     g_data      113 -> 128\n  datCalc        37 -> 44     evtMain      26 -> 35     datPersona   32 -> 41\n  effPolygonFlash 26 -> 34    frFont       34 -> 37     mdlManager   78 -> 85\n  y_fclShopDraw  11 -> 17     btlAICommand 212 -> 217   y_fclCombine  9 -> 14\n  k_fldLmap       9 -> 14     y_fclCombineDraw 17 -> 20\n\ncmmMisc had been written off as a wall; it gave up 19. effPolygonFlash gave up 8\nby converting the VU0 colour-conversion family the brief told it to skip - it\nchecked the in-repo precedent, found VU0 asm already matching elsewhere, and was\nright to override me.\n\ncmmCommunity and effBlurFilter matched nothing and are still good results: 6 and\n7 functions respectively went from \"untried\" to a measured floor with the\nspellings that failed recorded, which is what stops the next wave re-grinding\nthem. Across the wave that is over a hundred newly documented floors.\n\nThe one regression was mine, not theirs. Several agents appended data addresses\nto config/symbols_recovered.txt to make their functions link. That file is\nregenerated from relocation evidence on every run and says so, so my regeneration\ndropped 26 entries and took four translation units out of the link - silently,\nbecause the verifier masks relocations and both hashes still matched.\n\nconfig/symbol_data_addrs.txt is the durable home for the addresses the scan\ngenuinely cannot derive: symbols referenced only from INCLUDE_ASM functions, and\nsymbols whose placeholder NAME disagrees with their true address and are dropped\nas conflicts. recover_symbols.py merges it and hard-fails if a curated entry\ncontradicts the scan. Unresolved units went 10 -> 6, eligible 313 -> 315.\n\nEvery entry needs an `evidence:` note and the checkable ones are re-checked\nagainst the retail image: 0x007613EC holds 0x40490FDB, which is pi in single\nprecision, so it is gPI - and shdPersona referenced the same address under the\nname D_007613EC, which is why both had been failing to resolve. Ten tests cover\nthis; with the merge removed, three fail.\n\n345 tests pass; decomp_lint 0 findings on 320 files; build reproduces both hashes.\n\nRecovery quality, tracked separately: 2,922 matched first-party functions are\n5.3% NAMED, 40.4% TYPED, 58.7% DOCUMENTED. Matching is outrunning recovery.","measures":{"fuzzy_match_percent":10.575733,"total_code":4369660,"matched_code":460956,"matched_code_percent":10.549013,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3535,"matched_functions_percent":27.01773,"complete_code":462124,"complete_code_percent":10.575743,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3540}},{"timestamp":"2026-08-02T23:52:25Z","commit_sha":"3e9386ffb92a9406893a1f1fe99a24d181e12a9e","commit_message":"Match 3 more: an ed_sr state read and the cmmMisc table accessors\n\n  first-party MATCH   2,801 -> 2,804  (67.5% of 4,151 tracked)\n  tree-wide MATCH     3,419 -> 3,422\n  C objects linked    158\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nfunc_0038f160 (ed_sr), func_00246c90 and func_00246d50 (cmmMisc).\n\nThe cmmMisc pair is a good illustration of the m2c pointer-type trap the wave\nbrief warns about, one level deeper than usual. m2c renders the global as\n`M2C_FIELD(D_008814D4, u32 *, 4)`, which reads as \"the global plus 4\". The file\nalready declares it `extern u8 *D_008814D4[]` - an ARRAY OF POINTERS - so\n`D_008814D4 + 4` is byte offset 0x10 and the compiler folds it into the load.\nRetail instead loads the pointer out of the global and then reads +4 through it:\n\n    lui $v0, %hi(D_008814D4)\n    lw  $v1, %lo(D_008814D4)($v0)     <- fetch the pointer\n    lw  $v0, 4($v1)                   <- read its count field\n\nSo the correct spelling is `D_008814D4[0] + 4`, not `D_008814D4 + 4`. Getting\nthis wrong is silent: it compiles, it looks like the m2c text, and it is 14 words\noff. Any m2c offset has to be re-read against the type the FILE declares, not the\ntype m2c printed.\n\n345 tests pass; decomp_lint 0 findings; 158 C objects link; build reproduces both\nretail hashes.","measures":{"fuzzy_match_percent":9.483922,"total_code":4370424,"matched_code":413320,"matched_code_percent":9.457206,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3417,"matched_functions_percent":26.115868,"complete_code":414488,"complete_code_percent":9.483932,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3422}},{"timestamp":"2026-08-02T23:35:13Z","commit_sha":"94eb6013111a52683d6697883b54f0173bb30d14","commit_message":"Name the task object's work pointer; type 38 of 40 uses in shdPersona\n\n  first-party MATCH   2,801  (unchanged - this is a readability change)\n  TYPED               1,163 -> 1,167\n  C objects linked    158\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\n`*(u8 **)(x + 0x38)` is the single most repeated raw dereference in the tree:\nroughly 267 sites across 47 first-party files, all of them the same field of the\nsame object. Reading func_00451de0's stores gives the layout directly - name at\n0x18, two callback slots at 0x30/0x34, and the handler's own work allocation at\n0x38 - so include/sdktask.h names exactly those and leaves everything else in\nreserved spans. An unnamed span is an honest admission; a named field is a claim,\nand I only made the claims the assembly supports. The names are descriptive, not\nrecovered Atlus identifiers.\n\nshdPersona.c is the proof: 38 of its 40 sites now read\n`((SdkTask *)arg0)->work` instead of `*(u8 **)(arg0 + 0x38)`, and all 49 of its\nmatched functions still match byte-for-byte.\n\nTwo things worth knowing before this is applied to the other 46 files.\n\nThe field has to be `u8 *`, not `void *`. Retail does byte arithmetic on it\n(`work + 0x4F8`), and `void *` arithmetic is not legal C - mwcc rejects it\noutright, which is how the first attempt failed with 102 compile errors.\n\nThe typed form is NOT always codegen-neutral. func_0011d170 reads the field twice\nand hands each result to a different callee; through the struct, mwcc hoists\n`arg0 + 0x38` into a saved register and reuses it, where retail re-issues\n`lw 0x38` for each read. That one function keeps the raw deref with a comment\nsaying why. So this conversion is per-function verifiable work, not a\ntree-wide sed - which is exactly what the recovery score is for.\n\nThe measured gain is small (+4 TYPED) because most of the remaining raw access in\nthese files is on the inner work struct, not on the task object. Typing that\nneeds a per-subsystem struct for each work layout, which is the real bulk of the\nreadability debt.\n\n345 tests pass; decomp_lint 0 findings on 320 files; 158 C objects link; build\nreproduces both retail hashes.","measures":{"fuzzy_match_percent":9.479128,"total_code":4370440,"matched_code":413112,"matched_code_percent":9.452413,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3414,"matched_functions_percent":26.092937,"complete_code":414280,"complete_code_percent":9.479136,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3419}},{"timestamp":"2026-08-02T23:16:15Z","commit_sha":"7c397cedbe4b700cf7257bf91c5668b09dc278c2","commit_message":"Separate \"matching\" from \"recovered\"; generate the status table\n\nA reviewer pointed out that this tree reports MATCH versus ASM and nothing else,\nso 3,419 matches reads as 3,419 finished functions. It is not. A byte-identical\nfunction here can still carry func_00123456 for a name, D_007973A0 for a global,\nu8 * for an object pointer, numeric field offsets, temp_3/uVar1 locals and\nunexplained masks. The same review found the README claiming 1,314 matching\nfunctions and \"99.6% of first-party tracked\" while the metrics said 3,419 and\n67.5%, and scratch directories sitting in the repo root.\n\ntools/recovery_quality.py scores every matched first-party function on three axes\nthat have nothing to do with byte equality, and the answer is uncomfortable:\n\n  matched first-party           2,801\n  NAMED                           155   (5.5%)   not a func_<address> placeholder\n  TYPED                         1,163  (41.5%)   no raw-offset or M2C_ access\n  DOCUMENTED                    1,651  (58.9%)   prose, or trivially self-evident\n  decompiler local names          600  (21.4%)   temp_/var_/uVar/param_/spNN\n\nSo 94.5% of what this project calls matched is still addressed by number, and\nmore than half still reaches its data through cast-and-offset arithmetic. That is\nthe real bottleneck now, and it was invisible.\n\nThe README Status block is generated from progress/metrics.json plus that report\nvia `tools/progress.py --update-readme`, between STATUS:BEGIN/STATUS:END markers,\nso it cannot drift again. tests/test_recovery_quality.py asserts the committed\nREADME agrees with the committed metrics, which is exactly the check that would\nhave caught the 1,314 claim. `make progress` regenerates it; `make recovery`\nlists the files with the most matched-but-untyped functions.\n\nScoring rules are deliberately strict, because a scorer that flatters the tree is\nworse than none. Comments are stripped before scoring so documenting a raw offset\ndoes not disqualify the function that no longer uses one; a trivial body counts as\ndocumented because a comment restating one line is noise; `variance` and `sprite`\nare not mistaken for `var_1` and `spNN`. Twenty-four tests pin those boundaries,\nand with the TYPED check disabled four of them fail.\n\nTwo gates the review asked for are now written down in CONTRIBUTING.md rather\nthan living in my head:\n\nLink eligibility is part of the promotion gate. verify.py masks relocations, so a\nper-function MATCH can pass every check and still drop its whole object from the\nlink - visible only as C objects linked falling while both hashes still verify.\nThat happened twice this session.\n\nBoundary confidence for tiny functions. An `.s` beginning with a raw .word is a\nGhidra split, not a function. A bare `jr $ra; nop` is a real nullsub only if\nsomething references it - a jal, or a pointer word holding its address; otherwise\nit is padding inside the preceding window. Genuine data-reachable entries go in\nDATA_REACHABLE_ENTRIES with the pointer site recorded, never by hand-editing the\ncanonical map.\n\nAlso documented that src/promoted/ is transitional: moving a function from a\ngeneric code1_00NN.c bucket into its evidence-backed unit is an improvement,\nsplitting a real translation unit for tidiness is not.\n\nRoot hygiene: .probe/ moved under the already-ignored build/ and guarded in\n.gitignore; mult_test_tmp.c/.o and tools/_myasm.py were removed earlier today.\n\nNo src/ changes, so both retail hashes are untouched by construction.\n345 tests pass; decomp_lint 0 findings; progress endpoints validate.","measures":{"fuzzy_match_percent":9.479128,"total_code":4370440,"matched_code":413112,"matched_code_percent":9.452413,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3414,"matched_functions_percent":26.092937,"complete_code":414280,"complete_code_percent":9.479136,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3419}},{"timestamp":"2026-08-02T22:55:12Z","commit_sha":"f93e6eb689bee7ffa097b9ce49137f540624949c","commit_message":"Run a 64-agent matching wave; repair it; fix a link-eligibility bug\n\n  first-party MATCH   2,577 -> 2,801  (67.5% of 4,151 tracked)\n  tree-wide MATCH     3,195 -> 3,419\n  C objects linked    151 -> 158\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nSixty-four agents, one destination file each, partitioned over the 1,436\nuntried residual functions. Every one of them ran to its turn limit, so most\nstopped mid-experiment; the wave is the +224 that survived triage, not what\nthey claimed.\n\nRepair, in the order it mattered:\n\n98 COMPILE_ERRORs sat in four files and each one gated a whole file of good\nwork. y_draw alone was 58 functions held hostage by a single missing forward\ndeclaration. The others were an undefined callback extern, a half-written body,\nand a duplicated INCLUDE_ASM line my own first revert introduced. Recovering\nthose four cost four edits and returned about a hundred functions that a blind\nrevert would have thrown away.\n\n73 MISMATCHes reverted to INCLUDE_ASM across 37 files. Reverting is not free:\nit stranded five callbacks whose C definitions had just disappeared, which\nturned two more files into COMPILE_ERROR until their externs were restored.\n\nThree markers had been deleted outright from k_fldEvent (func_00172ba0,\nfunc_00172cb0, func_00172d80) - the functions were simply gone from the file\nwhile their assembly still existed. Restored. Two duplicate markers removed.\nOne NONMATCHING body re-guarded so it keeps an INCLUDE_ASM fallback.\n\nThe last defect was in the build, not the source. C objects linked had dropped\nto 144 even though both retail hashes still matched exactly - a placement loss,\nnot a correctness one. A function with an INCLUDE_ASM fallback that the same\nunit's C also references by name (a callback stored into a dispatch table)\nappears TWICE in the symbol table: defined by the spliced assembly, and\nundefined by the C extern. eligible_c_objects built its lookup with a dict\ncomprehension, so the undefined entry won and the whole object was dropped.\nPreferring any defined section index over a later 0 recovers those eight units\nand seven more that were already losing this way before the wave - 158 objects,\nabove the 151 this started from. tests/test_symbol_sections.py covers it; with\nthe fix reverted the defined-first case fails, which is the shape the real\nobjects have.\n\nNot taken: retail has an unmarked nullsub at 0x00244100, reachable only through\nthe callback word at 0x00635950 with no jal anywhere in the image. Splitting it\nout is what func_00243fa0 needs to stop being 16 bytes short of its window, but\nit requires a new boundary in tools/slus21782_functions.json and that file has\nno working generator in-tree (reconcile_function_boundaries.py exits 1 on two\npre-existing source-only markers in frFont before it writes). Recorded in place\nin datCalc.c rather than hand-edited into the canonical map.\n\nAlso removed agent scratch that escaped the repo: mult_test_tmp.c/.o and\ntools/_myasm.py, plus a stray src/ tree created outside both projects by a\ntool-path resolution bug.\n\n321 tests pass; decomp_lint 0 findings; 158 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":9.479128,"total_code":4370440,"matched_code":413112,"matched_code_percent":9.452413,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3414,"matched_functions_percent":26.092937,"complete_code":414280,"complete_code_percent":9.479136,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3419}},{"timestamp":"2026-08-02T20:01:01Z","commit_sha":"d90c4bdbe8c0d9c00c7b079d1be81e862599549e","commit_message":"Match 7 more; cross 62% of tracked first-party functions\n\n  first-party MATCH   2,565 -> 2,572  (62.0% of 4,151 tracked)\n  tree-wide MATCH     3,183 -> 3,190\n  C objects linked    151\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nfunc_0010f4f0 (g_data), func_00279300 (itfMesManager), func_0017e840 and\nfunc_001821d0 (k_fldAI), func_00483490 (effGeometry), func_00285b30\n(evtEvent), func_00251e60 (cmmRankUp).\n\nTwo more m2c adaptation traps, both of which produce a wrong byte offset from\ncode that reads correctly:\n\nfunc_00285b30 dereferences the result of func_00452560, which that file\ndeclares as s32 * - so + 0x14 in the m2c text is byte offset 0x50. The same\ntrap as the s32 * list pointer in the previous commit; any m2c offset has to\nbe re-read against the pointer type it was printed with.\n\nfunc_0010f4f0 takes the address of a data symbol. Declared extern u8 X, mwcc\nemits a GPREL load; declared extern u8 X[] and used without &, it emits\nretail's absolute lui/addiu. That is now three commits in a row where this\none distinction was the whole defect.\n\nFour reverted with their measurements recorded in place, all four scheduling\nor CSE differences rather than wrong logic:\n\nfunc_002b6af0 and func_002b6b40 (y_draw) are argument-forwarding wrappers -\nretail sets $a0, sign-extends $a3 in place, and lets $a1/$a2 and four float\nregisters pass straight through, so they need the callee's full parameter list\nrepeated on the wrapper. That part now reproduces; what does not is that retail\nissues both indirections before touching arg0 while mwcc sinks the second load\nto its use, which also flips the addu operand order. Hoisting the base into a\nlocal does not move it.\n\nfunc_00376880 (btlShuffleDraw): retail re-loads *arg0 at the top of every\niteration, mwcc CSEs it with the bottom loop test.\n\nfunc_002add10 (y_smap): retail materialises the constant argument before the\narithmetic one; mwcc does the reverse.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.8880653,"total_code":4371916,"matched_code":343692,"matched_code_percent":7.8613586,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3185,"matched_functions_percent":24.342709,"complete_code":344860,"complete_code_percent":7.888075,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3190}},{"timestamp":"2026-08-02T19:31:46Z","commit_sha":"7bd221c546c6b3775d95498e56e2197eb30baf2f","commit_message":"Match 6 more from the m2c candidate list\n\n  first-party MATCH   2,559 -> 2,565  (61.8% of 4,151 tracked)\n  tree-wide MATCH     3,177 -> 3,183\n  C objects linked    151\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nfunc_00218e50 (btlPanelAnalyze), func_00377e10 and func_00377e60\n(btlShuffleDraw), func_00287310 (evtMain), func_0033de40\n(y_fclCombineEvent), func_00298c10 (evtScript).\n\nThree adaptation traps in the m2c text, all of which compile happily and are\nwrong:\n\nm2c prints a call through the free-vtable as jtbl_008873EC(p). The symbol is\nan array; the call is jtbl_008873EC[0](p). Written m2c's way it either fails\nto compile or takes the array's address as the function.\n\nm2c gave func_00377e10's list pointer type s32 *, so its p + 8 means byte\noffset 0x20. Retail wants byte offset 8. Any m2c pointer offset has to be\nre-read against the element type it was actually printed with.\n\nfunc_00218e50 calls the memset helper with two arguments where retail passes\nthree - the same dropped-leading-argument pattern as the previous commit.\n\nTwo declaration conflicts were also load-bearing. evtMain declared\nfunc_002871a0 as (int, int) but retail passes three arguments including\npointers; widening it to an old-style () declaration is the form that both\ncompiles across the file's call sites and reproduces retail. evtScript calls\nfunc_00452560 with no declaration on purpose - the result needs an explicit\ncast at the callsite rather than a new prototype, because a prototype changes\nthe other calls in that file.\n\nLeft as a floor: func_003146f0 in y_fclCombineDraw. Retail copies arg2 into\n$v1 up front and sign-extends into $a3 immediately before the call; mwcc\nsign-extends first and then reuses $a2 for the load. A named s8 local and an\nexplicit (s8) cast both give the identical nd 17, so the ordering is not\nsource-reachable. Recorded in place.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.875649,"total_code":4371952,"matched_code":343152,"matched_code_percent":7.8489423,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3178,"matched_functions_percent":24.28921,"complete_code":344320,"complete_code_percent":7.8756585,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3183}},{"timestamp":"2026-08-02T19:12:17Z","commit_sha":"b0104d48085e78ec8a475f78b01f65af6a1304d8","commit_message":"Match 7 more; a matched function can cost a linked object\n\n  first-party MATCH   2,552 -> 2,559  (61.6% of 4,151 tracked)\n  tree-wide MATCH     3,170 -> 3,177\n  C objects linked    151 (unchanged - see below)\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nMatched from the m2c candidate list: func_00470490 (sdkLbox), func_00153b20\n(k_fldEnvironment), func_0025cc70 (shdScript), func_0025e8b0 (shdWindow),\nfunc_0047a0e0 (mdlManager), func_001fa320 and func_001fa370 (btlCutin).\n\nfunc_0047a0e0 is another instance of the addu-orientation rule already in\ndocs/matching.md: naming the scaled offset in an s32 local and adding the cast\nbase TO it turns addu base,index into retail's addu index,base.\n\nThe interesting one is btlCutin. Converting func_001fa320 alone dropped C\nobjects linked from 151 to 150 while both retail hashes stayed exact - so the\nloss was placement eligibility, not correctness. build.py links a translation\nunit only when every marked function in it resolves; func_001fa370 was sitting\nin the object as an undefined symbol, and the second C function was enough to\nexpose it. Matching func_001fa370 as well - it is a four-iteration cleanup loop\nover a gp-relative table, and its retail addu is base-first, so the natural C\norder is correct here - restored the object AND added a function. Verified by\nbuilding three times: C only for func_001fa320 gives 150, INCLUDE_ASM gives\n151, both functions in C gives 151.\n\nWorth remembering: converting one more function in a translation unit can take\nthat whole unit out of the linked image. The tell is C objects linked falling\nwhile the image hashes stay correct. The fix is to convert the function that is\nstill unresolved, not to revert the one that exposed it.\n\nTwo things left alone. func_0014d830 in k_draw is an argument-evaluation-order\nfloor: retail computes $a0 = arg1 + 4, reads both floats from arg1, then\noverwrites $a1; mwcc sets the integer arguments first and has to spill arg1\ninto $v0. Naming the floats or the pointer in locals first changes nothing\n(nd 12 either way). It also needed a real float prototype first - through the\nfile's old-style declaration the arguments were being promoted to double, which\nis the phantom-double-promotion pattern and had inflated the object to 100\nbytes against a 64-byte window.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.8653445,"total_code":4371984,"matched_code":342704,"matched_code_percent":7.8386383,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3172,"matched_functions_percent":24.243351,"complete_code":343872,"complete_code_percent":7.8653536,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3177}},{"timestamp":"2026-08-02T18:28:27Z","commit_sha":"3a11f037be4d103caa227c208d56cb21dac6e202","commit_message":"Match 7 more, driven off the checked-in m2c output\n\n  first-party MATCH   2,545 -> 2,552  (61.5% of 4,151 tracked)\n  tree-wide MATCH     3,163 -> 3,170\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nsrc/generated/ holds m2c output for 11,652 functions and is excluded from the\nverifier, so it has been sitting unused. Filtering it to bodies with no\nM2C_ERROR/M2C_UNK marker, on untried residual functions of 6-34 instructions,\ngives 88 candidates that need adaptation rather than reverse engineering.\nThis commit works the first twelve of those.\n\nMatched: func_0014d5f0 and func_0014d800 (k_draw), func_001fa450 (btlCutin),\nfunc_00312b60 (fclCombineMisc), func_00135cb0 (cmpPersona), func_00293270\n(evtModel), func_004afa60 (effDistortParticle).\n\nFour defect classes showed up, all recurring:\n\nThe two k_draw routines copy four bytes field by field. Written that way mwcc\ninterleaves load and store per byte; retail loads all four then stores all\nfour. Writing it as one struct assignment through a 4-byte type reproduces\nretail exactly - which is the same batching lever already recorded for\nlwc1/swc1, applied to bytes.\n\nfunc_00312b60 masks $a1 and $a2 and passes $a0 through untouched, but m2c\nnames its parameters arg1 and arg2 - it dropped the leading one. Restoring\nthe third parameter fixed it.\n\nfunc_00293270 is the array-versus-scalar addressing distinction again: an\nextern scalar makes mwcc emit a GPREL load, the array spelling restores\nretail's absolute lui/addiu.\n\nfunc_00135cb0 is a single-case if whose body retail places out of line behind\na positive branch; as an if it compiles inline with a negated skip, as a\none-case switch it matches.\n\nTwo things deliberately not done. func_00272b34 and func_00272bd4 in frFont\nare not functions: each begins with a raw .word that decodes to a backward\nbranch, so they are the tail of the preceding function's loop and Ghidra split\nthem at the loop's landing point. Writing plausible C for them would have been\ninventing a function that does not exist. And func_0028f4f0 in evtMisc is one\nword from matching - retail branches on $v0 after copying the handle to $a0,\nmwcc branches on the copy - reverted with the measurement recorded.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.852421,"total_code":4372048,"matched_code":342144,"matched_code_percent":7.825714,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3165,"matched_functions_percent":24.18985,"complete_code":343312,"complete_code_percent":7.85243,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3170}},{"timestamp":"2026-08-02T18:07:02Z","commit_sha":"d1157a565015c7e47394504646decd78f8002504","commit_message":"Match the sdkOt list-allocator family; map the residual by shape\n\n  first-party MATCH   2,540 -> 2,545  (61.3% of 4,151 tracked)\n  tree-wide MATCH     3,158 -> 3,163\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nClustering the whole residual by normalised shape - not just against already\nmatched code, as in the previous commit, but against itself - puts 92 of the\n1,606 remaining first-party functions into 13 families where matching one\nmember would template the rest. This commit works that list top to bottom.\n\nMatched: the five sdkOt allocator/inserters (func_00460d80, e80, f80,\nfunc_00461080, func_00461290). They allocate a 0x30 node, stamp a kind tag,\nand then run the already-matched func_00460ac0 list-insert inline. Only two\nconstants vary across the five. The one real defect was the allocator handle:\ndeclared as a scalar function pointer, mwcc emits a GPREL load, where retail\naddresses it absolutely - the array-plus-index spelling (D_008873F8[0](...))\nrestores the lui/lw pair and the whole function falls into place.\n\nAlso annotated the eleven-member btlAICommand 0x1E15xx family with the\nmeasurement from the previous commit, so a later pass does not re-probe it.\nThat annotation has to sit ABOVE the // FUN_ marker: putting it between the\nmarker and the INCLUDE_ASM silently unhooks the function from verify's marker\nscan, and sixteen functions dropped out of the census before I noticed.\n\nFloors confirmed and left alone, with the evidence:\n\n  17 four-instruction getters (return D_x[0]) - retail keeps the %hi base in\n  $v1 and lands the load in $v0; mwcc coalesces both into $v0. Four spellings,\n  all nd 3. Already documented by an earlier pass.\n\n  9 btlAICommand dispatchers - same shared-branch layout floor as the 11.\n\n  4+5 render-state sequences in k_fldLmap/y_draw/mainDraw - retail hoists the\n  vtable base into $s0 across seven calls; mwcc rematerialises lui/lw at each\n  callsite. Array, pointer-to-scalar and byte-cast spellings all nd 50/51.\n\n  7 effPolygonFlash clear-and-fill routines - the body is recoverable (the\n  first 96 bytes and everything from the second call onward already match),\n  but retail hoists the loop's -1 into the preheader and separates slt from\n  bnez with a nop. Hoisting it in the source does not reproduce either.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.844115,"total_code":4372088,"matched_code":341784,"matched_code_percent":7.817409,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3158,"matched_functions_percent":24.136349,"complete_code":342952,"complete_code_percent":7.844124,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3163}},{"timestamp":"2026-08-02T17:36:46Z","commit_sha":"e4d5471144bc80ca3fe7b338b64ffcff87f09265","commit_message":"Match 19 functions that already had a byte-identical twin\n\n  first-party MATCH   2,521 -> 2,540  (61.2% of 4,151 tracked)\n  tree-wide MATCH     3,139 -> 3,158\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nThe btlAICommand family found in the previous commit turned out to be an\ninstance of something general, so this commit looks for it everywhere: strip\nliterals, symbol names and local labels out of every retail body, then ask\nwhich unmatched functions are structurally identical to one already written\nin C. 25 of the 1,611 residual functions had such a twin, in 11 groups.\n\n19 of the 25 are now C. They are mostly small shared idioms duplicated across\nsubsystems - a free-wrapper through jtbl_008873EC (8 copies in 7 files), a\ntwo-case refcount step, a null-checked destroy, two assert-guarded resource\nlookups. Nothing here needed new reverse engineering; the constants come out\nof each target's own asm.\n\nThe remaining 6 are a real floor and are left as INCLUDE_ASM. They are\nD_xxx[0] = arg setters where retail colours the address register $v0 and mwcc\npicks $v1. The one C file that does match this shape only manages it because\nit also returns the segment base, which is what pins the register; these six\nreturn void, and adding a return costs more than it saves (nd 3 -> 4). One\nwas already marked NONMATCHING by an earlier pass, which was the correct call.\n\nTwo lessons worth recording, both of which cost a cycle here:\n\nNormalising away hex literals hides real differences. The eff_after copy of\nthe free-wrapper reads offset 0x10 where the other seven read 0x38, and the\nclustering could not see it. Structural identity narrows the search; it does\nnot certify the answer, so each target still has to be diffed on its own.\n\nGuarding \"is this identifier already declared?\" with a plain substring test\nis wrong once the new body is already in the buffer - the body mentions every\nname it needs, so the check always passes and nothing gets declared. Three\nfiles compiled clean in isolation and then failed in the full run. The check\nnow requires an actual declaration, not a mention.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.81526,"total_code":4372108,"matched_code":340524,"matched_code_percent":7.7885537,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3153,"matched_functions_percent":24.098135,"complete_code":341692,"complete_code_percent":7.8152685,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3158}},{"timestamp":"2026-08-02T17:06:16Z","commit_sha":"18ab51af8d76aa2640903756ff83dc012ff050f4","commit_message":"Match the btlAICommand 0x1DF3xx dispatch family (18 functions)\n\n  first-party MATCH   2,503 -> 2,521  (60.7% of 4,151 tracked)\n  tree-wide MATCH     3,121 -> 3,139\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nfunc_001df310 through func_001dfec0 are eighteen copies of one dispatch shape\nthat differ only in a single command-id constant (0x01000000 .. 0x12000000).\nNormalising each retail body (blanking literals, symbol names and local labels)\nshowed all seventeen siblings byte-identical in structure to the one matched by\nhand, so the rest were generated from that template rather than transcribed\none at a time.\n\nGetting the first one right needed care with the early exit: the cmd == 0 path\nbranches into the SHARED func_0029cf50 call and still returns 1, it does not\nreturn 0. Reading it as an early return gave a plausible-looking function with\none wrong branch target.\n\nProbed and left as a floor: the 11-member 0x1E15xx/0x1E42xx sub-family, which\nwraps the same dispatch in a func_001d9280 lookup. Every member sits at exactly\none differing word - retail routes the inner cmd == 0 path through the outer\npath's branch, and mwcc collapses that branch-to-branch. Two renestings made it\nworse (nd 14 and nd 28), so the natural shape is already optimal and the\nresidual is layout, not source.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.781421,"total_code":4372204,"matched_code":339052,"matched_code_percent":7.7547164,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3134,"matched_functions_percent":23.952919,"complete_code":340220,"complete_code_percent":7.7814302,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3139}},{"timestamp":"2026-08-02T16:44:59Z","commit_sha":"91365d24aed7bbf0c86708021047de53e898d338","commit_message":"Match 2 more first-party functions\n\n  first-party MATCH   2,501 -> 2,503  (60.3% of 4,151 tracked)\n  tree-wide MATCH     3,119 -> 3,121\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\ng_data func_0010fd40 and sdkOt func_00460ac0.\n\nfunc_0010fd40's retail has a bltz on a value loaded with lhu, which can never\nbe negative and looks like dead code. It is not: it is the first half of a\nshort-circuited range assert written as (index >= 0 && index < 0x100), where\nmwcc lowers the two halves to bltz and slti. Using the file's own K_ASSERT\nmacro with that condition reproduces both branches.\n\nsdkOt func_00460ac0 matched first try (0 differing words). Its gp global\niGpffffaf70 was then recovered by tools/recover_symbols.py at 0x00764060,\nexactly the address the C assumes.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.7135224,"total_code":4372420,"matched_code":336100,"matched_code_percent":7.6868186,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3116,"matched_functions_percent":23.815348,"complete_code":337268,"complete_code_percent":7.7135315,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3121}},{"timestamp":"2026-08-02T16:29:49Z","commit_sha":"7dfc3b4c908d1d1c740dee75ce2aef3f8db667ed","commit_message":"Match 2 more first-party functions\n\n  first-party MATCH   2,499 -> 2,501  (60.3% of 4,151 tracked)\n  tree-wide MATCH     3,117 -> 3,119\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nscrScriptProcess func_0029df30 and evtEffect func_00290f00.\n\nfunc_0029df30 is a call-free search loop and needed both orderings the tree has\nalready documented, in one function: the loop counter zeroed before the count\nload (a for-init lands in the preheader, after it), and the post-loop index\ncomputed into its own local so the second addu comes out offset-first while the\nin-loop one stays base-first. nd 5 -> 2 (the remainder being the padding tail).\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.7062883,"total_code":4372424,"matched_code":335784,"matched_code_percent":7.6795845,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3114,"matched_functions_percent":23.800062,"complete_code":336952,"complete_code_percent":7.7062974,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3119}},{"timestamp":"2026-08-02T16:14:00Z","commit_sha":"484d8e7523bd702d877384d77b723d1fae3fae1c","commit_message":"Match 2 more first-party functions\n\n  first-party MATCH   2,497 -> 2,499  (60.2% of 4,151 tracked)\n  tree-wide MATCH     3,115 -> 3,117\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nitfMesManager func_00279d40 and y_fclModel func_003493b0, both reusing\nconventions already established in their neighbourhood (the D_00881808 entry\ntable, and the allocate-then-func_00451fc0 task-creation idiom).\n\nProbed and left as a floor: cmmMisc func_002467b0. Retail keeps the raw\nargument in a saved register and re-masks it at each of the two uses; mwcc\nmasks once into the saved register instead. Neither inline masks nor a u32\nparameter changes it (nd 26 across three shapes), consistent with the rest of\nthis file's history.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.6988573,"total_code":4372436,"matched_code":335460,"matched_code_percent":7.6721535,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3112,"matched_functions_percent":23.784777,"complete_code":336628,"complete_code_percent":7.698866,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3117}},{"timestamp":"2026-08-02T15:58:15Z","commit_sha":"ce7e63cb634c570bd536594f728d0aa3a6b54161","commit_message":"Match cmmCommunity func_00109100\n\n  first-party MATCH   2,496 -> 2,497  (60.2% of 4,151 tracked)\n  tree-wide MATCH     3,114 -> 3,115\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nProbed and left as a floor: cmpEquip func_001344d0. Retail materializes the\nreloaded count into a1 before computing the slot address into a0; mwcc emits\nthe addiu first and neither a loop-local temp nor an early-return restructure\nmoves it (nd 6 in all three shapes). Call-argument setup order, the same\nfamily already documented elsewhere in the tree.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.692524,"total_code":4372448,"matched_code":335184,"matched_code_percent":7.6658206,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3110,"matched_functions_percent":23.76949,"complete_code":336352,"complete_code_percent":7.692533,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3115}},{"timestamp":"2026-08-02T15:41:09Z","commit_sha":"81dc320b29940e2f8c519581843a2c081df4e690","commit_message":"Match 3 more first-party functions\n\n  first-party MATCH   2,493 -> 2,496  (60.1% of 4,151 tracked)\n  tree-wide MATCH     3,111 -> 3,114\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nmdlMatAnim func_00480840, itfMesManager func_0027a2d0, cmpSkill func_0013abb0.\n\nfunc_0013abb0 needed two things a natural transcription gets wrong. The\ncomparison threshold has to be held in an s32 local even though it is loaded\nwith lh: as an s16 local mwcc re-sign-extends it on every iteration\n(dsll32/dsra32 in the loop body) where retail extends once at the load. And\nthe loop counter must be zeroed before the threshold load, which a for-init\ndoes not do because the init lands in the loop preheader after it. With both,\nnd 24 -> 0.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.6894836,"total_code":4372460,"matched_code":335052,"matched_code_percent":7.662781,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3109,"matched_functions_percent":23.761847,"complete_code":336220,"complete_code_percent":7.689493,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3114}},{"timestamp":"2026-08-02T15:25:00Z","commit_sha":"c169174c6ab5137a985a1b7bf09440b62815242b","commit_message":"Match 2 more first-party functions\n\n  first-party MATCH   2,491 -> 2,493  (60.1% of 4,151 tracked)\n  tree-wide MATCH     3,109 -> 3,111\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nk_fldResource func_0014ef80 (sibling of func_0014ef40 on the neighbouring gp\nslot) and cmpSkill func_0013ab30 (a 0x3C-iteration release loop; retail keeps\nboth a cached slot address and an offset load, which the natural pointer-local\nform reproduces).\n\nProbed and left as a floor: itfMesManager func_00278e20. Retail loads the\ntable pointer before computing the index shift; mwcc emits the shift first and\nwill not reorder (nd 4 natural, nd 3 with the load hoisted into its own\nstatement, 2 real words either way). Same load-ordering family as cmmMisc\nfunc_00246910/940 and g_data func_00106c30.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.681687,"total_code":4372472,"matched_code":334712,"matched_code_percent":7.6549835,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3106,"matched_functions_percent":23.738918,"complete_code":335880,"complete_code_percent":7.681696,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3111}},{"timestamp":"2026-08-02T15:08:37Z","commit_sha":"b84c0a1be8def74fd38866e0ceffbe2106217226","commit_message":"Match 2 more first-party functions\n\n  first-party MATCH   2,489 -> 2,491  (60.0% of 4,151 tracked)\n  tree-wide MATCH     3,107 -> 3,109\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nk_fldResource func_0014ef40 and pscModel func_0036a880, both straightforward\nonce the surrounding file's assert and gp-global conventions were reused.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.677549,"total_code":4372484,"matched_code":334532,"matched_code_percent":7.6508455,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3104,"matched_functions_percent":23.723633,"complete_code":335700,"complete_code_percent":7.677558,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3109}},{"timestamp":"2026-08-02T14:53:10Z","commit_sha":"ac0fdb771045aad2203606a11a0b2e28212ccb6d","commit_message":"Match 2 more first-party functions; first-party crosses 60 percent\n\n  first-party MATCH   2,487 -> 2,489  (60.0% of 4,151 tracked)\n  tree-wide MATCH     3,105 -> 3,107\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nmdlMatAnim func_0047f9f0 and k_fldResource func_0014eed0.\n\nfunc_0014eed0 wanted its two id parameters declared wide and masked at the\ncall, not declared u16. With u16 parameters mwcc assumes the ABI already\nmasked them and emits a plain move; retail emits andi inside the guarded\nblock, which only happens when the narrowing is written as a cast at the call\nsite.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.673777,"total_code":4372496,"matched_code":334368,"matched_code_percent":7.647074,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3102,"matched_functions_percent":23.708347,"complete_code":335536,"complete_code_percent":7.6737866,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3107}},{"timestamp":"2026-08-02T14:38:00Z","commit_sha":"f0ac4b7d294cca102f99744c55e4c8207293c087","commit_message":"Match 2 more first-party functions; refine the addu-orientation lever\n\n  first-party MATCH   2,485 -> 2,487  (59.9% of 4,151 tracked)\n  tree-wide MATCH     3,103 -> 3,105\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\ndatPersona func_0010cf40 and evtMessage func_00290e50.\n\nfunc_0010cf40 sharpens the offset-before-base lever documented earlier: the\nscaled offset has to be its own statement AFTER the assert, not the local's\ninitializer. As an initializer mwcc still emits addu base,index (nd 1); as a\nplain assignment after the branch join it emits retail's addu index,base\n(nd 0). Both spellings look equivalent in C, so the placement is the part that\nmatters.\n\nfunc_00290e50 reuses the (u8)(x != 0) idiom this file already relies on to\nmaterialize retail's sltu instead of folding the test into a branch.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.6688232,"total_code":4372504,"matched_code":334152,"matched_code_percent":7.6421204,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3100,"matched_functions_percent":23.693062,"complete_code":335320,"complete_code_percent":7.668833,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3105}},{"timestamp":"2026-08-02T14:21:26Z","commit_sha":"fd72ff80e96380e503d189eee16de40cad91c44a","commit_message":"Match 3 more first-party functions\n\n  first-party MATCH   2,482 -> 2,485  (59.9% of 4,151 tracked)\n  tree-wide MATCH     3,100 -> 3,103\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nmt_sceneIcon func_0026d840, pscModel func_0036a820, evtEvent func_00285480.\n\nevtEvent needed func_00452560 relaxed from a (void) prototype to an old-style\n() declaration: this translation unit calls it both with no argument and with\none, which is exactly what retail does, and the strict prototype makes the\none-argument call unrepresentable.\n\nAlso probed and left as floors:\n  itfMesManager func_00278d50 - retail keeps arg0 in the caller-saved t3\n    across the call and frames at 0x10; mwcc picks a callee-saved s0 and\n    frames at 0x20. That is the interprocedural-clobber family: retail's\n    build knew the callee's clobber set.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.6643195,"total_code":4372516,"matched_code":333956,"matched_code_percent":7.637616,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3098,"matched_functions_percent":23.677774,"complete_code":335124,"complete_code_percent":7.6643286,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3103}},{"timestamp":"2026-08-02T14:03:55Z","commit_sha":"49c253225a8aceb391dc117d7870293ddff22282","commit_message":"Match 2 more first-party functions\n\n  first-party MATCH   2,480 -> 2,482  (59.8% of 4,151 tracked)\n  tree-wide MATCH     3,098 -> 3,100\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nk_fldEnvironment func_00153bd0 and btlShuffleResult func_00383aa0.\n\nfunc_00383aa0 is a reminder to read delay slots carefully: the jal to\nfunc_002bb4e0 has a nop in its slot and the \"move a0, s0\" lands after the\ncall, so the first call takes the original argument and only the free takes\nthe loaded work pointer. Reading the move as the slot gave the wrong argument\nand a 12-word diff; the correct reading matches exactly.\n\nAlso probed and left as floors, each re-checked here rather than taken on\ntrust:\n  cmpPersona func_00135cb0 - retail duplicates the return-1 in both arms,\n    mwcc shares it; three shapes, all nd 14+.\n  g_data func_00106c30 - retail loads the flags word before computing the\n    shift; hoisting it into a local does not stop mwcc sinking the load\n    (nd 11 unchanged across two shapes). Same load-ordering wall as\n    cmmMisc func_00246910/940.\n  y_fclCombineDraw func_003146f0 - retail copies the byte argument to v1 up\n    front; three shapes all nd 17.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.6583524,"total_code":4372528,"matched_code":333696,"matched_code_percent":7.631649,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3095,"matched_functions_percent":23.654846,"complete_code":334864,"complete_code_percent":7.6583614,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3100}},{"timestamp":"2026-08-02T13:43:54Z","commit_sha":"8adf5ce2ff0ce154fa611d672cecae5fe36e23a9","commit_message":"Match 3 more first-party functions; census the residual by tried/untried\n\n  first-party MATCH   2,477 -> 2,480  (59.7% of 4,151 tracked)\n  tree-wide MATCH     3,095 -> 3,098\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nmdlManager func_0047a4a0, k_fldEnvironment func_00153b90, eff_afpack\nfunc_004b6e40.\n\nfunc_0047a4a0 also drops a stale extern that contradicted the real signature;\nthe definition now precedes its only use as a callback, and func_003bff30 is\nunprototyped, so no cast is needed. Retail reuses the a1 argument register for\nthe node pointer, which needs the parameter reassigned rather than a fresh\nlocal.\n\nfunc_004b6e40 needed the absolute-array idiom on D_00922DB0/DB4: as scalar\nexterns they compile to GPREL, where retail uses lui/sw.\n\nWhere the remaining 1,671 first-party fallbacks actually stand, measured by\nscanning each marker and the twelve lines above it:\n\n  floor / measured note already recorded   1175   70.2%\n  no note - not yet investigated            410   24.5%\n  guarded near-miss C body                   89    5.3%\n\nSo roughly seven in ten of the residual has already been probed and documented\nas a compiler floor. A future wave should start from the untried 410 rather\nthan re-grinding those. The untried figure is a slight overcount: some agents\nabandoned a function without leaving a note, e.g. evtMisc func_0028f4f0\n(1 word, beqz a0 vs v0).\n\nRe-checked rather than trusted, and left as floors: code1_003b's three\nidentical two-test chains (a whole-ELF scan shows retail never hoists a shared\nreturn-move into a branch-likely slot), code1_0039 func_003963b0 (~30 shapes\nalready probed), cmmMisc func_00246910/940 - there the wall is the\nbase-load-first ordering, not the addu orientation, since three offset-first\nspellings all stay at nd 9.\n\ntools/probe_variants.py now warns when the region it will restore is not an\nINCLUDE_ASM fallback. Restore means put back what was here when I started, so\nprobing from a half-finished body and failing leaves a MISMATCH behind; that\nbit this session twice. Verified the warning fires on a dirty region and stays\nquiet on a pristine one.\n\n315 tests pass; decomp_lint 0 findings; 151 C objects link; build reproduces\nboth retail hashes.","measures":{"fuzzy_match_percent":7.655875,"total_code":4372532,"matched_code":333588,"matched_code_percent":7.6291723,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3093,"matched_functions_percent":23.63956,"complete_code":334756,"complete_code_percent":7.6558843,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3098}},{"timestamp":"2026-08-02T13:16:15Z","commit_sha":"5979a88ef08c0536f58b38142598a13b9d40737e","commit_message":"Match 6 more first-party functions; document the addu-orientation lever\n\n  first-party MATCH   2,471 -> 2,477  (59.7% of 4,151 tracked)\n  tree-wide MATCH     3,089 -> 3,095\n  C objects linked      150 ->   151\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\ncode1_0017 func_00178c00, shdMisc func_00364c50/func_00364c70, cmpMain\nfunc_0012d140, y_fclCmbBall func_0034ae50, code1_0047 func_0047adf0.\n\nfunc_00178c00 had a correct-looking body already sitting behind an\n#ifdef NON_MATCHING; the only residual was the stored constant landing in $a0\ninstead of retail's $v0. Returning the constant colors it $v0 and the function\nmatches - the same idiom that unlocked the code1_0052 setters.\n\ndocs/matching.md gains the mirror of the existing addu-orientation lever.\nRetail sometimes wants  where mwcc canonicalizes the pointer\noperand to the left; naming the scaled offset in an s32 local and adding the\ncast base to *it* produces retail's order. Verified nd 1 -> 0 on both\ncmpEquip func_001344b0 and code1_0047 func_0047adf0. The floors list now says\nwhich commutative-addu case is reachable and which is not.\n\ncode1_003d func_003df870 was re-checked rather than trusted: unguarded, its\nonly residual is retail scheduling the result addu into the jr $ra delay slot\n(schedule on makes it worse, nd 4 -> 6). Genuine floor, guard restored. Its\n3-operand mult reproduced correctly, both operands being runtime values.\n\nTwo new gp globals (iGpffffabe8 = 0x00763cd8, iGpffffb1ec = 0x007642dc) were\nrecovered by tools/recover_symbols.py from the new relocation evidence, at\nexactly the addresses the C assumes.\n\n315 tests pass; decomp_lint 0 findings; build reproduces both retail hashes.","measures":{"fuzzy_match_percent":7.652357,"total_code":4372556,"matched_code":333436,"matched_code_percent":7.625654,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3090,"matched_functions_percent":23.61663,"complete_code":334604,"complete_code_percent":7.652366,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3095}},{"timestamp":"2026-08-02T12:49:31Z","commit_sha":"22acde02022f0bb9045e62dfdab0ece17f96a281","commit_message":"Match 9 more first-party functions by hand\n\nSubagent quota is exhausted for the week, so these were done directly.\n\n  first-party MATCH   2,462 -> 2,471  (59.5% of 4,151 tracked)\n  tree-wide MATCH     3,080 -> 3,089\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nsdkCdvd func_00455510 (nullsub), mdlSE func_0047e440 (s64 return 0), k_fldAI\nfunc_0017e980/func_0017e990, sdkLbox func_004703c0, shdSkill func_00115750,\ncmpEquip func_001344b0, effModel func_004ac600/func_004ac610.\n\nTwo worth noting:\n\neffModel's pair are the 16-byte quadword copies a previous agent had written\noff as needing inline asm. Spelling them as a returning u_long128 assignment -\nthe shape mdlEffect.c already uses - reproduces retail's lq/sq exactly, 0\ndiffering words, no asm. That is the same construct whose asm version was\nremoved from effPolygonFlash.c earlier in this campaign, so the honest form\ndemonstrably exists.\n\ncmpEquip func_001344b0 needed the index computed into a named local before the\nbase is added; writing arg0 + arg1 * 2 makes mwcc emit addu $v1,$a0,$v0 where\nretail has addu $v1,$v0,$a0. The comment records it.\n\n315 tests pass; decomp_lint 0 findings; build reproduces both retail hashes.","measures":{"fuzzy_match_percent":7.648642,"total_code":4372588,"matched_code":333276,"matched_code_percent":7.6219397,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3084,"matched_functions_percent":23.570772,"complete_code":334444,"complete_code_percent":7.648651,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3089}},{"timestamp":"2026-08-02T12:27:56Z","commit_sha":"f3c89a9ef623d3d50c185b91deafc275a8b6dbff","commit_message":"Wave 3 partial: +7 first-party matches, tests for the wave tooling\n\nThe third wave was cut short a few minutes in when the subagent weekly quota\nwas exhausted; most agents died while still reading. Five files had been\ntouched, and the two left with MISMATCH rows (cmmMisc.c, code1_0047.c) were\nreverted to their exact INCLUDE_ASM lines.\n\n  first-party MATCH   2,455 -> 2,462  (59.3% of 4,151 tracked)\n  tree-wide MATCH     3,073 -> 3,080\n  C objects linked      151 ->   150\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\ntests/test_revert_mismatches.py covers the revert path that the repair pass\nleaned on: it must restore the exact fallback, name the right asm unit, leave\nneighbouring functions and every // FUN_ marker untouched, and refuse to\nmass-revert a file whose only problem is one compile error. Negative control:\nmaking the unit lookup return a wrong name fails three of the eleven tests.\n\n315 tests pass; decomp_lint 0 findings; the build still reproduces both retail\nhashes.","measures":{"fuzzy_match_percent":7.6452084,"total_code":4372616,"matched_code":333128,"matched_code_percent":7.6185055,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3075,"matched_functions_percent":23.501987,"complete_code":334296,"complete_code_percent":7.6452174,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3080}},{"timestamp":"2026-08-02T12:09:24Z","commit_sha":"599dc4f87a0c3684fdf116e32006d5a933afbc2f","commit_message":"Match 1,230 more first-party functions (29.5% -> 59.1%)\n\nRan two large parallel decompilation waves (64 file-scoped agents, then 18\nguided by Persona 3 FES donor modules) followed by a repair pass.\n\n  first-party MATCH   1,225 -> 2,455  (29.5% -> 59.1% of 4,151 tracked)\n  tree-wide MATCH     1,843 -> 3,073\n  C objects linked      103 ->   151\n  loadable image sha1 3d1d3d2b9d6ccb60836db239ab49674223025a78  unchanged\n  SLUS_217.82 sha1    4eeec0360cf2715535d9f7e52eb69d786fb0158c  unchanged\n\nThe single highest-yield lever was cross-referencing Persona 3 FES: 737 P4\nresidual functions live in modules P3 has already matched, and whole files fell\nto porting (scrTraceCode.c +29 including the 912-line script-VM dispatcher,\ned_scroll.c +11, sequenceList.c 36/36, k_sequence.c 24/24, sdkListState.c\n15/15). Function and struct names were carried across where they applied.\n\nRepair pass. Many agents hit their turn limit mid-edit, leaving 241\nCOMPILE_ERROR, 77 MISMATCH, 4 NO_SYMBOL and one unguarded NONMATCHING body.\nEvery compile break was one bad line gating a whole file of good matches\n(use-before-definition, int/pointer conversion, a stale prototype, a callback\ncast), so each was fixed rather than reverted - datCalc 0->37, effBlurFilter\n0->31, mdlEffect 0->32, scrScriptProcess 0->17, k_fldEvent 0->18, ed_res 0->6.\nFunctions that could not match were restored to their exact INCLUDE_ASM line.\nResult: 0 MISMATCH, 0 COMPILE_ERROR, 0 NO_SYMBOL, lint clean.\n\nHonesty audit. effPolygonFlash.c had gained inline asm claiming a 16-byte lq/sq\nquadword copy 'honest C cannot produce'. mdlEffect.c disproves that with a\nu_long128 copy, so the claim was false and the asm was substituting for a\ncodegen problem - which H009 bans. The honest spelling does not match, so the\nfunction was reverted to INCLUDE_ASM and the file now carries no inline asm.\nThe sqc2/lqc2 VU0 blocks elsewhere are genuine COP2 and stay.\n\nLink coverage. Converting functions initially DROPPED coverage 103 -> 97,\nbecause matched C names globals that exist in no symbol config; verify.py masks\nrelocations so this is invisible until the link. Deriving those addresses from\nthe symbol names corrupted the image - tools/recover_symbols.py reports 64\nsymbols whose name disagrees with their true address (D_007242A0 really lives\nat 0x7642a0). Re-running that evidence-based recovery instead lifted\nsymbols_recovered.txt from 1,166 to 3,315 entries and coverage to 151 objects,\nbyte-exactness intact.\n\nAlso removed: an agent's stray scratch TU (zz_t77120_test.c) that the build\ncompiled but the verifier never saw, three orphaned tmp*.c files under src/,\nand three duplicated // FUN_ marker lines in g_data.c.\n\nNew tooling\n  tools/probe_variants.py     compile several source spellings of one function\n                              and report each one's differing-word count\n  tools/revert_mismatches.py  restore the INCLUDE_ASM fallback for every\n                              MISMATCH in a file, learning the unit name from\n                              the file or the asm tree\n  tools/explain_ineligible.py say why each translation unit is or is not\n                              link-eligible\n\ntools/fndiff.py no longer aborts when a file vanishes from src/ mid-scan, which\nwas costing parallel agents repeated retries.\n\nVerified: 304 tests pass; decomp_lint 0 findings across 319 first-party files;\nfull build reproduces both retail hashes.","measures":{"fuzzy_match_percent":7.6388474,"total_code":4372644,"matched_code":332852,"matched_code_percent":7.612145,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":3068,"matched_functions_percent":23.448486,"complete_code":334020,"complete_code_percent":7.638857,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":3073}},{"timestamp":"2026-08-02T08:53:23Z","commit_sha":"26aad486afbbe0756a137e997584cc42927e52be","commit_message":"CI: take ownership of container-written build output before objdiff\n\nobjdiff-cli failed with\n\n    Failed to open ./build/objdiff/target/nonmatchings/003dd290.o\n    Caused by: Permission denied (os error 13)\n\nThe build runs as root inside the container while objdiff-cli runs on the host\nas the runner user, and several outputs are produced by atomic write\n(mkstemp + rename) so they land as mode 0600 owned by root - not merely\nforeign-owned but unreadable.\n\nFixed by chowning build/ after the container exits, rather than by running the\ncontainer with --user: the build is byte-exact in its current configuration\nand changing the build UID risks perturbing that. The step then asserts no\nunreadable files remain, so a future output written some other way fails here\nwith a clear message instead of inside objdiff-cli.","measures":{"fuzzy_match_percent":3.796183,"total_code":4380284,"matched_code":165116,"matched_code_percent":3.7695274,"total_data":0,"matched_data":0,"matched_data_percent":100,"total_functions":13084,"matched_functions":1838,"matched_functions_percent":14.047691,"complete_code":166284,"complete_code_percent":3.7961922,"complete_data":0,"complete_data_percent":100,"total_units":13084,"complete_units":1843}}]