[{"timestamp":"2026-11-08T22:27:08Z","commit_sha":"6ded184a7b1fcf91dd9ecf2173eb4b304c789c39","commit_message":"fix: recomp progress link points at bytematch.dev (#36)\n\n> **AI-assisted change.** Written with Claude Code.\n\nThe Pages site was removed in a82e9edc (pages.yml and site/ deleted), so both the old and the renamed Pages URL return 404. The Progress link in .recomp.json now points at https://bytematch.dev/OpenThievius/sly2-decomp.","measures":{"fuzzy_match_percent":78.63813,"total_code":1402480,"matched_code":1102884,"matched_code_percent":78.63813,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6825,"matched_functions":6106,"matched_functions_percent":89.4652,"complete_code":234020,"complete_code_percent":16.686155,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":256}},{"timestamp":"2026-11-08T22:22:42Z","commit_sha":"5e119f51e349043bc5b3712738a45e086f68a946","commit_message":"chore: rename to sly2-decomp, branding as in sly1-decomp (#34)\n\n> **AI-assisted change.** Written with Claude Code; make readme, make lint and the tests were re-run by the lead.\n\nThe project moved to OpenThievius as sly2-decomp. The README takes sly1-decomp's layout (the OpenThievius icon, a Sly 2 title, badges for the project, the progress workflow and the bytematch.dev code and function figures). The Rogue Byte logo, icon and cap artwork are removed. Text, SECURITY, CONTRIBUTING, AGENTS, the Makefile and .recomp.json say sly2-decomp; bytematch.dev, the progress badge and the Pages URL point at OpenThievius/sly2-decomp. The scripts read SLY2_DECOMP_DIR and still accept ROGUE_BYTE_DIR.","measures":{"fuzzy_match_percent":78.63813,"total_code":1402480,"matched_code":1102884,"matched_code_percent":78.63813,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6825,"matched_functions":6106,"matched_functions_percent":89.4652,"complete_code":234020,"complete_code_percent":16.686155,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":256}},{"timestamp":"2026-11-08T22:09:57Z","commit_sha":"760036489387a39c6f88112c3f98600af4c6bed8","commit_message":"feat(build): a whole file is the only record of its functions (#33)\n\n> **AI-assisted change.** Written with Claude Code (an Opus engineer and the lead session); every claim was re-run by the lead (make elf, make objdiff, make pal, make check, make lint, tests).\n\nEach of the 78 whole files is the only record of its functions: make src publishes only the whole file (276 per-function sources, 223321 bytes, leave src/), src/MANIFEST.tsv gains whole_file and symbol columns, and make land puts a matched function into its whole file in place of its INCLUDE_ASM line, re-proving the whole range against retail first. objdiff and PAL read these functions from the whole object; the reports are unchanged and NTSC-U stays at 80.10%.","measures":{"fuzzy_match_percent":78.63813,"total_code":1402480,"matched_code":1102884,"matched_code_percent":78.63813,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6825,"matched_functions":6106,"matched_functions_percent":89.4652,"complete_code":234020,"complete_code_percent":16.686155,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":256}},{"timestamp":"2026-11-08T21:09:47Z","commit_sha":"092b3a1cd041392643b68ca855a1cedd022e50d3","commit_message":"feat(build): whole-file sources from retail's constructor list, 78 files proved (#32)\n\n> **AI-assisted change.** Written with Claude Code (Opus engineers and the lead session); every claim was re-run by the lead (make elf, make check, make lint, tests).\n\nRetail's constructor list gives 209 file ends; 78 files build as one translation unit and link whole (INCLUDE_ASM for the unmatched functions, a per-range fallback in link_image.py). compile_unit.py emits sqrt.s and vadda words from Splat's encoding. Rulings written: file-scope INCLUDE_ASM, data defined in C where it reproduces retail's bytes, names and notes from open licences. ROADMAP refreshed. NTSC-U stays at 80.10%.","measures":{"fuzzy_match_percent":78.63813,"total_code":1402480,"matched_code":1102884,"matched_code_percent":78.63813,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6825,"matched_functions":6106,"matched_functions_percent":89.4652,"complete_code":234020,"complete_code_percent":16.686155,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":256}},{"timestamp":"2026-11-08T19:43:10Z","commit_sha":"1c1f88d7955f7ac963185e671ee27cb0708454b3","commit_message":"feat(us,tools): near-miss passes 8 to 10, 80.10% matched, per-function movables flag (#31)\n\n> **AI-assisted change.** Written with Claude Code (Opus and Sonnet workers); every match was re-run by the lead and gated by make elf.\n\nEight more functions matched (6192 in total): NTSC-U code 79.76% to 80.10%, PAL 78.64%. Register-allocation findings in docs/contributing/matching.md; steering helpers allowed as an exception and marked steer-ok; per-function -fmove-all-movables list (func_001BEB28, UpdateJumper); classify_diffs skips blockers; version_check passes per-function flags.","measures":{"fuzzy_match_percent":78.63813,"total_code":1402480,"matched_code":1102884,"matched_code_percent":78.63813,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6825,"matched_functions":6106,"matched_functions_percent":89.4652,"complete_code":234020,"complete_code_percent":16.686155,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":256}},{"timestamp":"2026-11-08T15:31:38Z","commit_sha":"ffcb9a24e8227543613dbfa98997a5b234c1e632","commit_message":"feat(us,tools): 14 more functions matched, searches skip blockers, 6184 functions (#30)\n\n> **AI-assisted change.** Matched and written with Claude (Opus workers\nand the lead session). Every match was re-judged by the lead with\n`scripts/matching/try.py` and `check_source.py --review` and landed\nthrough `make land` and the byte gate; a person should review it.\n\n## What\n\nTwo commits.\n\n- **Searches skip blockers and banned sources (`3a052b27`).** The first\novernight `make search MIN=16 MAX=40 BUDGET=300` (213 functions at score\n16 to 40) improved 82 sources and matched none. 53 of the 82 were\npermanent blockers (VU0 and MMI inline asm) and 57 held a banned\nconstruct; `record.py` ignores a score reached with one. Of the 203\nfunctions in the pool, 102 are permanent blockers, so about half the\nbudget went there. `AGENTS.md` leaves blockers out of the work queues;\nthe search tools never read `config/us/blockers.tsv`.\n`search_guard.skipped()` now returns a reason for a function listed\nthere and for one whose current source holds a banned construct. Two new\ntests (213 pass).\n- **14 more functions matched (`9b4909c0`).** An Opus pass over the\nclean improvements of that search plus four sources that matched only\nthrough steering asm (22 functions, 14 matched).\n- `UpdateTnCallback`, `SjisFromAsciiChar` and\n`CQueueOutputIop_SendToIop`: the banned barrier is gone and the source\nis plain C. Each barrier hid a real cause: a `-1` that CSE kept in a\nfourth saved register; an uninitialised local plus the symbol-index\nform; and the two `nop`s that are the assembler's short-loop padding.\n- `SortRenderRecords`, `UpdateZapPost`, `PactNew`, `LoadingLogoThread`,\n`AllocRenderTreeNode`: rebuilt from retail's control flow.\n- `SetHubState`, `UpdateFallCheck`, `DrawMpegFrame`, `LoadTaskFromBrx`,\n`func_00227728`: see the commit body.\n- `func_002352B0` is Sony gcc (libkernl) and goes on `sony_gcc29.txt`;\n`RO_002C3DF0` is added to `symbol_addrs.txt` for `UpdateFallCheck`.\n\n## Judgement calls to review\n\n- `LoadTaskFromBrx` uses an inline `Aligned(ALLOCREQ *)` helper that\nstores the alignment and returns the request. It does a real store, so I\nread it as ordinary code; without it the function stays in one register\n(score 110).\n- `func_00227728`'s `Color4` has an empty constructor, which makes g++\nreturn it through memory as retail does.\n- `DrawMpegFrame` uses an inline `CTextBox` constructor; gcc 2.95 then\nrebuilds the object's address from `$sp` before every setter call, as\nretail does.\n\n## Result\n\n6184 functions matched (6170 on `main`), 79.76% of the code (79.36% on\n`main`). 80% is about 3,400 bytes away.\n\n## Left open on purpose\n\n- `CGc_Collect` (20): 0 only with an unused `ALLOCREQ` local that\nreproduces a 16-byte hole in the frame; nothing shows the original\ndeclared one, so it stays a near miss, consistent with `UpdateAmb` and\n`RefreshSpriteInstance`.\n- `AllocZpr` (21) and `UpdateJtLootSave` (18): the search's recorded 10\nand 12 came from dropped arguments (`FlushZprPage(zpr)`, a variadic\nterminator) and a self-linking chunk; with the real ones they score 21\nand 18. `AllocZpr` is added to `config/matching/walls.tsv`.\n- `PrepareBlotMovie` 24, `StoreAudioModeInSave` 13, `GAccuracyRhythmCue`\n11 (its barrier is removed), `CploFindSwObjects` 8 and\n`bevy_classes_k30_cam_update` 4 stay near.\n- The 53 blocker sources the search improved are not matchable under the\ncurrent rule; whether some should become \"C with inline assembly\" is the\nopen question in `docs/build/inline-asm-helpers.md`.\n\n## Verified\n\n- `make land ONLY=...` passed the byte gate (whole-file sha1\n`de2af92a54de71e33edc8a160c31c0337a95e6f5`, the retail hash), with PAL\nand readme.\n- `make check` exits 0 on the branch, commit-message lint included;\n`tests/test_tools.py` passes (213 tests).\n- No `Co-authored-by` trailers; commits follow\ndocs/contributing/commit-messages.md.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nhttps://claude.ai/code/session_01BBqpmDekQPtZaPH4fyKLpQ\n\n---------\n\nCo-authored-by: Blightwidow <14098167+Blightwidow@users.noreply.github.com>","measures":{"fuzzy_match_percent":78.22086,"total_code":1402480,"matched_code":1097032,"matched_code_percent":78.22086,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6825,"matched_functions":6097,"matched_functions_percent":89.333336,"complete_code":228308,"complete_code_percent":16.278877,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":255}},{"timestamp":"2026-11-08T13:32:46Z","commit_sha":"0eb902bf72bf16eec40b25b5dd830c7100a52245","commit_message":"feat(tools,us): search guard and walls list, 12 more matches, 6170 functions (#29)\n\n> **AI-assisted change.** Matched and written with Claude (Opus workers\nand the lead session). Every match was re-judged by the lead with\n`scripts/matching/try.py` and `check_source.py` and landed through `make\nland` and the byte gate; a person should review it.\n\n## What\n\nTwo commits: search-tool fixes found while matching, and 12 more\nmatches.\n\n- **Search tooling (`3c7e0a04`).**\n- `scripts/matching/search_guard.py` is shared by `neighborhood`,\n`mutate`, `callee_sigs sweep` and `adopt`: a rewrite is compared with\nthe source it came from through `check_source`, and one that adds a\nbanned construct, a cleanup problem or a review warning is not written.\nOnly `adopt` checked before; the others wrote a lower score into\n`data/matching/src/fn` unchecked.\n- `check_source.py --review` adds two warnings that never fail a check:\na local set from a literal and never changed (ClineWrap's `int newline =\n10;`), and a constant-true condition. The first fires on 0.6% of matched\nsources and 3.7% of unmatched ones.\n- `config/matching/walls.tsv` lists 26 near misses whose remaining\ndifference was traced to the toolchain (a store in a delay slot with its\naddress in a register, a `$gp` save) or to a scheduling tie found in the\nRTL dumps. The search tools skip them (`SEARCH_INCLUDE_WALLS=1` searches\nthem). `boundary_suspects.py` finds split artifacts: a `jr $ra` whose\ndelay slot is in the next piece, or a piece that is only an epilogue (18\nnow, 4 of them real functions).\n- `permute_stores.py` tries gcc 2.95's first-scheduler order before the\nrandom search: among stores that share a constant, the last one written\nis emitted first (found on `InitMurray`, which 2,500 random orders\nmissed).\n- `make boundary-suspects` and `make sigs` join `make search`. 18 new\ntests (211 pass); `docs/contributing/search-tools.md` explains it.\n- **Pass 7, score 6 to 15 (12 of 15 matched, `8e791d4d`).**\n- `ObstacleGroup_Dissolve`, `CGc_Shutdown`, `StopJsg`, `UpdateJsg`: the\n`PushDli`/`PvStep` iterator of the matched `UpdateRipg`, so the first\nlist member is read through the iterator after the store to `g_2dd2fc`.\n- `CombineEyeLookAtProj`: `InvertMatrix4Affine` returns its `MATRIX4`\nthrough a hidden pointer, as in `Carry_Attach`.\n- `PcnodeFindOrAddClonePath`, `RenderDprizeAll`: invented arguments\nremoved.\n- `HookupPzgraph`, `BuildSavePath`: inline helpers (`MinInt`,\n`SymtabOfSave`) that keep retail's operand order.\n- `func_001C4BD8`, `RemoveSoGeomFromOxa`, `CheckCardStatus`: loop shape\nand per-case stores.\n- Every source has a comment above the function saying what retail shows\nand why the source has that form, and passes `check_source.py --review`.\n\n## Judgement calls to review\n\n- `RenderDprizeAll` keeps an aligned `char buf[0x90]` frame buffer, used\nfor a matrix copy; the matched `RenderLoot` has the same one. A\nprecedent, not an explicit ruling.\n- A lint for a callee declared with more integer parameters than its own\ncode reads was tried and dropped: it fired on 19% of matched sources,\nbecause a callee may ignore an argument its callers still pass. The\nsearch is not protected against an invented argument beyond the score\nitself; that check needs retail's call sites.\n\n## Result\n\n6170 functions matched (6158 on `main`), 79.36% of the code (79.12% on\n`main`).\n\n## Left open on purpose\n\n- Near misses: `AddGuardSensedObject` 5, `ZapFInvulnerable` 6 (jmps test\nas a `switch`), `AllocZpr` 21 (its recorded 9 came from `FlushZprPage`\ndeclared `void`; with its real `ZPR` argument the same source scores\n20).\n- The four real delay-slot cuts that `make boundary-suspects` finds:\n`ClsgMergeAlsg`, `snd_BankLoadByLoc`, `snd_SendCurrentBatch__Fv` and\n`sceMcInit` (scores 55 to 107, no source yet).\n\n## Verified\n\n- `make land ONLY=...` passed the byte gate (whole-file sha1\n`de2af92a54de71e33edc8a160c31c0337a95e6f5`, the retail hash), with PAL\nand readme; the branch was then rebased onto `main` and its tree is\nidentical to the validated one (`git diff` empty).\n- `make check` exits 0 on the branch, commit-message lint included;\n`tests/test_tools.py` passes (211 tests).\n- No `Co-authored-by` trailers; commits follow\ndocs/contributing/commit-messages.md.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nhttps://claude.ai/code/session_01BBqpmDekQPtZaPH4fyKLpQ\n\n---------\n\nCo-authored-by: Blightwidow <14098167+Blightwidow@users.noreply.github.com>","measures":{"fuzzy_match_percent":77.87491,"total_code":1402480,"matched_code":1092180,"matched_code_percent":77.87491,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6825,"matched_functions":6084,"matched_functions_percent":89.14286,"complete_code":211120,"complete_code_percent":15.053334,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":252}},{"timestamp":"2026-11-08T13:06:51Z","commit_sha":"726749d49b6d4ca33198fb6c36fb3c04f3c09b5c","commit_message":"feat(us): 33 near misses matched in three Opus passes, 6158 functions (#28)\n\n> **AI-assisted change.** Matched and written with Claude (Opus workers\nand the lead session). Every match was re-judged by the lead with\n`scripts/matching/try.py` and `check_source.py` and landed through `make\nland` and the byte gate; a person should review it.\n\n## What\n\nThree commits, 33 functions matched by three Opus passes over the near\nmisses, and one boundary fix.\n\n- **Pass 4, score 1 to 5 (11 of 15 matched, `7a6ffaa6`).**\n`AddSwTimedCall` (one plain `for` loop), `ChooseJtRushTarget__FP2JT`\n(`ChooseJtAttackTarget`'s real argument list is five integers or\npointers and three floats; the float-first order reproduces all three\ncallers), `Chaser_FTakeHit` (the vtable slot also takes the message\npointer), `QueueSwCallbackOnce` (the 8-byte key is a `SwKey` struct\npassed by value; it has to be C), `RotateXfmToMat`,\n`PloLeaseCloneObject`, `func_001C8280`, `SeekSpriteInstanceFraction`,\n`ShutdownIdHashTables_1ed448`, `bevy_classes_k30_cam_activate_2` and\n`fabsf`.\n- **Boundary fix (2 functions).** The 16-byte \"fragment\" at `0x1C7B08`\nwas `SelectCoinLootDef`'s delay slot (its size is `0xB4`, and it now\nmatches), a padding `nop`, and a separate 8-byte getter at `0x1C7B10`,\nnow `func_001C7B10`.\n- **Pass 5, score 6 to 15 (12 of 15, `940361e0`).**\n`DrawMovieTextCharacter` (1168 bytes: `func_00215BA8` is `CMovieText`'s\nconstructor and returns `this`), `UseSlyGadget`, `SnapAsega`,\n`Carry_Attach`, `Mount_SetState`, `SetupDefaultPathzone`,\n`func_001C8918`, `DecomposeRotateMatrixPanTilt__FP7MATRIX3PfT1` and\n`RecalcCmFrustrum__FP2CM` (the `=&f` `Sqrt` helper from #27),\n`func_0012BF30`, `SetJoyJoys__FP3JOY4JOYS4JOYK`, `GoalGoto_SetState`.\n- **Pass 6, score 6 to 15 (10 of 15, `b0c0771d`).**\n`HandleAsegaEventsFF`, `StartSwAmbSfx`, `SwarmGroup_UpdateTargets`,\n`func_001C2A78`, `UpdateCodes`, `FGuardScriptWaiting`,\n`ShopMenu_Select`, `CbWrite__5OSTRMPvi`, `InitMurray` (the store that is\nthe last use of a constant goes first), `GrowPathzoneSlots` (see below).\n- **Comments.** Every function matched in this branch has a comment\nabove it saying what retail shows and why the source has that form.\n\n## Judgement calls to review\n\n- `GrowPathzoneSlots` keeps a no-op `case 0x80: break;`. Retail's switch\ndecision tree (root at `0x10`) only comes out of gcc 2.95 with three\ncase nodes; the comment records the evidence.\n- `QueueSwCallbackOnce` types the key as a struct while\n`src/button-cd/QueueSwCallback.cpp` still declares it `long` (both score\n0).\n- `bevy_classes_k30_cam_activate_2` borrows the field names `pambZoom`\nand `pambBinoc` from its matched sibling\n`bevy_classes_k30_cam_deactivate_2`; the `p` prefix is the kind\nAGENTS.md says to check the provenance of.\n- `ChooseJtRushTarget` declares `ChooseJtAttackTarget` float first;\n`ChooseJtSweepTarget` still declares it float last (both score 0, only\nthe first order reproduces Rush).\n\n## Result\n\n6158 functions matched (6107 on `main`), 79.12% of the code (77.85% on\n`main`).\n\n## Left open on purpose\n\n- Near misses, all register allocation or scheduling: `RunBtnAsegs` 3,\n`SweepPairs` 6, `SetCmPolicy__FP2CM3CPPP5CPLCYP2SOPv` 9,\n`GoalKnockDown_Activate` 10, `FMurrayCanUseGadget` 10,\n`FStartSpriteDepthInstance` 4, `func_00200F58` 4 (a score-0 form needs\nan `int pad[3]`, which the padding rule forbids), `WriteIconSys` 6,\n`func_00206820` 2, `BuildXfAngularRateMatrix` 2, `func_001C41B8` 5.\n- 11 of the 26 SDK-range candidates at score 1 to 5 were cut tails (`jr\n$ra; addiu $sp`) of functions that are still \"library\" with no source:\n`__moddi3`, `__umoddi3`, `__ieee754_powf`, `__throw`, `__rethrow`,\n`snd_SendIOPCommandNoWait` and others. Merging them is the prerequisite\nfor matching those functions.\n\n## Verified\n\n- `make land ONLY=...` passed the byte gate for each batch (whole-file\nsha1 `de2af92a54de71e33edc8a160c31c0337a95e6f5`, the retail hash), with\nPAL and readme.\n- `make check` exits 0 on the branch, commit-message lint included.\n- No `Co-authored-by` trailers; commits follow\ndocs/contributing/commit-messages.md.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nhttps://claude.ai/code/session_01BBqpmDekQPtZaPH4fyKLpQ\n\n---------\n\nCo-authored-by: Blightwidow <14098167+Blightwidow@users.noreply.github.com>","measures":{"fuzzy_match_percent":77.6379,"total_code":1402480,"matched_code":1088856,"matched_code_percent":77.6379,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6825,"matched_functions":6072,"matched_functions_percent":88.96703,"complete_code":210844,"complete_code_percent":15.033655,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":251}},{"timestamp":"2026-11-08T11:39:07Z","commit_sha":"c7d7ce6f9f2f65a32459f8aa27697e328ca75215","commit_message":"feat(us): split, sceCdBreak, Opus passes, typed-local and Sqrt rulings, 6125 functions (#27)\n\n> **AI-assisted change.** Matched and written with Claude (Opus and\nSonnet workers and the lead session). Every match was re-judged by the\nlead with `scripts/matching/try.py` and `check_source.py` and landed\nthrough `make land` and the byte gate; a person should review it.\n\n## What\n\nFive commits, 18 functions matched, two rulings and one boundary fix.\n\n- **Boundary split (2 functions).** The 128-byte `func_00239518` was\nthree pieces: 8 stray bytes (`lw`, `nop`) that belong to the function\nabove, a word-copy loop from `0x239520` and a word-search from\n`0x239558` (an address label, so it is called). `split_boundary.py\n--apply` plus a second cut at `0x239558` in the three symbol files and\nthe split assembly. Both new functions match; the search returns through\none shared `start < end ? start : 0` (an early `return 0` scored 13 to\n16).\n- **`sceCdBreak`.** Matches with `D_002C67A0` (the CD busy flag, written\nby the interrupt callback `func_002418C8`, which calls `iSignalSema`)\nand `D_002C676C` (the CD semaphore id) volatile, each with a\n`volatile-ok` reason. The old buffer name `B_002D82C0` was a typo for\n`B_002C82C0`.\n- **Third Opus pass over the near misses (20 workers, 11 matched).**\n- First 10: `GoalAnimLeap_FHandleMessage` (`StartAnimref` takes the\nfloat last), `CPathZone_LoadFromBrx` (plain `for` loops with their own\ncounters), `QueueStream` (an `AMBREF` smart-pointer class replaces a\npadding local; its copy constructor and assignment call real functions).\n- Next 10: `func_001F1900`, `CcluesFound` (`CopyAb` returns nothing),\n`InitJt`, `func_001FCD38` (`const` rodata tables), `GetSuck`,\n`UpdateVjoy` (`MATRIX3` returned by value, 16-byte aligned),\n`IcvFindCrvS`, `RefEval`.\n- Seven near misses stay near: the diffs are register allocation or\nscheduling inside `loop.c` or `sched2`.\n- **Ruling: typed locals** (`AGENTS.md`, `exceptions.md`). A local bound\nto a value the code reads and then uses (a field loaded before the\nstores) is ordinary code: sly1-decomp does not ban it and rac1-decomp\nlists it among its levers. A local that only holds a literal to give a\nstore its own register is still steering. Releases `func_002371F8` and\n`func_00236E70`.\n- **Ruling: `=&f` on `Sqrt`.** Measured on all 16 sources holding a\n`sqrt.s`: none gets worse, six get closer, two reach 0\n(`CalculateSinCos`, `FReadJoy`); a third (`GMaxAxisScale`) holds VU0 asm\nand stays out. `CalculateSinCos` now calls the helper instead of holding\nan inline `asm` statement; six matched sources switch to `=&f` and stay\nat 0.\n- **Comments.** Every matched function in the branch has a comment above\nit saying what retail shows and why the source has that form.\n\n## Result\n\n6125 functions matched (6107 on `main`), 78.30% of the code (77.85% on\n`main`). PAL: 6038 of 6825 functions, 76.80%. Game code outside the SDK\nrange and the blockers is 75.9% matched from C.\n\n## Left open on purpose\n\n- `func_00241B18` (a `do { } while (0)` around one call),\n`func_0023D468` (a dead loop that only gives an alignment `nop`),\n`UpdateAmb`, `RefreshSpriteInstance` (a member that only sizes the\nframe): banned under sly1-decomp's text.\n- `ClineWrap__9CRichTextf` (4): 0 only with a local holding the literal\n10.\n- Store in a delay slot with its address in a register, no non-volatile\nform: `sceMpegInit`, `func_00235780`, `sceDmaReset`, `func_0024C4B0`,\n`func_0024C670`, `func_002539D0`.\n- `atanf` needs `-fno-builtin` for its unit, which needs a per-unit flag\ntable first. The 14 held `CRef` functions are unread.\n\n## Verified\n\n- `make land ONLY=...` passed the byte gate for each batch (whole-file\nsha1 `de2af92a54de71e33edc8a160c31c0337a95e6f5`, the retail hash), with\nPAL and readme.\n- `make check` exits 0 on the branch, commit-message lint included;\n`tests/test_tools.py` passes.\n- No `Co-authored-by` trailers; commits follow\ndocs/contributing/commit-messages.md.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nhttps://claude.ai/code/session_01BBqpmDekQPtZaPH4fyKLpQ\n\n---------\n\nCo-authored-by: Blightwidow <14098167+Blightwidow@users.noreply.github.com>","measures":{"fuzzy_match_percent":76.8048,"total_code":1402480,"matched_code":1077172,"matched_code_percent":76.8048,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6825,"matched_functions":6038,"matched_functions_percent":88.468864,"complete_code":179736,"complete_code_percent":12.815584,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":243}},{"timestamp":"2026-11-07T09:38:14Z","commit_sha":"a1bee1511ac9231bb0e3d01753c0fcc5e2323ceb","commit_message":"feat(us): near misses and 30 SDK functions matched, 6078 functions (#25)\n\n> **AI-assisted change.** Matched and written with Claude (Opus and\nSonnet workers and the lead session). Every match was re-judged by the\nlead with `scripts/matching/try.py` and `check_source.py` and landed\nthrough `make land` and the byte gate; a person should review it.\n\n## What\n\nThree commits, 38 functions.\n\n- **Frame near misses (8 functions).** Three game functions differed\nfrom retail only by a frame 0x10 larger than ours: a 16-byte `VECTOR`\ndead local (the type `PsmaFindSm` and `PcmdFindScriptLabel` already use)\ngives retail's slot. A scan of the 201 draft near misses found nine with\nthat signature. `StartupAll` looked the same but is a seventh\ncallee-saved register: written as `else if (... == StartupGs__Fv)\nfAfterGs = 1;` gcc keeps the 1 in `$s4`. `ALO_SetCloneId` (a plain `for`\nloop, and the third argument it forwards to `LO_SetCloneId`, which reads\n`$a2`), `PhitfxChooseForGuard` (the tail as one nested `if`, callee\nprototypes corrected against their disassembly), `AddSoLoHierarchy` (a\nreal C++ virtual call, the virtuals in a base class so the vtable\npointer lands at +0xC) and `func_00236D20` (its limit test was inverted\nin the draft; typed `EntryTable`).\n- **SDK range, 30 functions.** A scan of the SDK drafts (136 scored, 45\nwithin 15 words) handed to Sonnet workers, each judged with\n`TRY_ASSEMBLER=sony29` and re-judged by the lead. About half were fixed\nby reading the callee's own disassembly for its real argument list (the\nold m2c drafts dropped or invented arguments); about ten end in a tail\ncall and only compile from C; `tanf` and the `finite`/`isnan` helpers\ntake the real fdlibm shape (the float word through a union). Reads of\nthe hardware registers at 0x10001010, 0x10002010 and 0x10002020 stay\n`volatile`, as AGENTS.md allows.\n- **Registry.** `func_00256270` was an 8-byte delay-slot tail plus a\n28-byte function: `split_boundary.py --apply` left the fragment at\n0x256270 and put `func_00256278` (`SetCmMat()`) at 0x256278.\n\n## Result\n\n6078 functions matched (6040 on `main`), 77.41% of the code (77.13% on\n`main`).\n\n## Left open on purpose\n\n- `UpdateAmb` and `RefreshSpriteInstance`: match only with a struct or\nunion whose extra member exists to keep a value on the stack.\n- `MpegDisplayThread`, `Update__5CMpeg`, `sceCdBreak`, `sceDmaReset`:\nmatch only with `volatile` on data that is not hardware.\n- `DecomposeRotateMatrixPanTilt`, `CalculateSinCos`: match only with an\nearlyclobber `Sqrt` (`=&f`), which docs/contributing/exceptions.md\nforbids.\n- `atanf`: retail calls `fabsf`, Sony gcc inlines it unless the unit is\nbuilt with `-fno-builtin`.\n- `func_0024C670` (score 13): retail puts two volatile hardware stores\nin delay slots that Sony gcc 2.9 never schedules there; the sibling\n`func_0024C4B0` shows the same, which hints libmpeg was built with\nanother Sony gcc (2.96 is a candidate, untested).\n- The four `Unlink*Node` (16, a bitfield extraction), `func_00256AF0`\n(12, a 128-bit save) and the two functions that read `$gp`.\n\n## Verified\n\n- `make land ONLY=...` exited 0 for each batch (registry, `make src`,\n`make elf` byte gate, objdiff, PAL, readme).\n- `make check` exited 0 on every commit.\n- No `Co-authored-by` trailers; commits follow\ndocs/contributing/commit-messages.md.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Blightwidow <14098167+Blightwidow@users.noreply.github.com>","measures":{"fuzzy_match_percent":75.93805,"total_code":1402480,"matched_code":1065016,"matched_code_percent":75.93805,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6824,"matched_functions":5992,"matched_functions_percent":87.80774,"complete_code":179736,"complete_code_percent":12.815584,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":243}},{"timestamp":"2026-11-07T08:10:09Z","commit_sha":"03be5457971c43121d386bf31b45c6dbef63a7e5","commit_message":"feat(us): SDK stubs and near misses on Sony gcc 2.9, splat constants fix, 6040 functions matched (#24)\n\nFour SDK functions (sceSifRebootIop, scePadInfoAct, scePadInfoMode, fmodf), scePadInit and FAllowBinocSly after their registry sizes were corrected, and 11 game functions from the near-miss pass. New scripts/build/numeric_constants.py writes constants Splat took for addresses back as numbers, so objdiff no longer sees a relocation no source can reproduce. 6040 functions matched, 77.13% of the code. Verified with make land (byte gate) and make check.","measures":{"fuzzy_match_percent":75.70149,"total_code":1402440,"matched_code":1061668,"matched_code_percent":75.70149,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":5958,"matched_functions_percent":87.33509,"complete_code":179736,"complete_code_percent":12.815949,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":243}},{"timestamp":"2026-11-06T18:01:41Z","commit_sha":"236a8bc8c0b37abd0ef6c779a13d4614272f7ee5","commit_message":"feat(us): SDK range on Sony gcc 2.9, 41 functions matched, large near misses (#23)\n\nSDK range builds with Sony's gcc 2.9 for 49 more functions (0x24C360, 16 wrappers, 32 cleaned sources); 38 game functions and AdvanceSpriteInstance, ExecuteGuardScriptCmd and PauseMenu_Update matched. 6026 functions matched, 76.89% of the code. Docs: how to pick work and run a local model. Verified with make land (byte gate) and make check.","measures":{"fuzzy_match_percent":75.47874,"total_code":1402440,"matched_code":1058544,"matched_code_percent":75.47874,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":5943,"matched_functions_percent":87.11521,"complete_code":179736,"complete_code_percent":12.815949,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":243}},{"timestamp":"2026-11-05T23:40:02Z","commit_sha":"87f738f4a881669f944fe5ba263ad9c54edd96a5","commit_message":"feat(us): 77 parked sources matched in plain C, padding locals cleaned, claim.py verify (#22)\n\nWaves N6 and N7 of the parked sources (raw M2C offsets, padding locals, inline asm or register pins), matched again in plain C: 5,064 to 5,127 of 6,757, NTSC-U code 75.42% to 76.37%. check_source.py flags every unused scalar or array local; claim.py verify and land check each wave before it lands; record.py --only; commit checks use origin/main as their base. 19 functions wait for a ruling (unused struct locals, two virtual-call prototypes, three volatile polling fields) and stay parked.","measures":{"fuzzy_match_percent":74.92057,"total_code":1402440,"matched_code":1050716,"matched_code_percent":74.92057,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":5903,"matched_functions_percent":86.52888,"complete_code":160916,"complete_code_percent":11.474002,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":237}},{"timestamp":"2026-11-05T21:34:47Z","commit_sha":"c8a9ce88656d245768e799f4f28bfac5b68568c6","commit_message":"feat(us): LoadShdFromBrx matched, three far near misses cut to 4 to 48 (#21)\n\n> **AI-assisted change.** Written with Claude Code (two Opus workers for\nthe pilot, the lead session for the landing). The numbers come from the\ncommands under \"Verified\"; the worker's EXACT claim was re-run by the\nlead before landing.\n\n## What\n\nWave N5 was a pilot of the far near misses: drafts at score 17 or more,\n300 bytes and up, outside the SDK range. Two Opus workers took four\nfunctions each, with about twenty compiles per function.\n\n- **Matched:** 0x1EB2F0 `LoadShdFromBrx` (5,063 to 5,064 of 6,757;\nNTSC-U code 75.36% to 75.42%). The fix: the texture loop as `for (index\n...)`, each switch case calling the allocator itself instead of jumping\nto a shared tail, and case 3 as `if/else`.\n- **Improved, still in `nonmatching/`:** 0x16E438 from score 42 to 4,\n0x219FE0 from 21 to 4, 0x1C9B08 from 50 to 48.\n- **Not moved:** 0x143678, 0x1D8FF8, 0x1B0290 and 0x1D7480. Their\nreports name the causes (delay-slot or `lui` placement, scheduling\npriority, a register copy). 0x1C9B08's draft calls\n`CBinaryInputStream_Read_thunk` without the three arguments retail\npasses, and adding them pushes its loop past `loop.c`'s hoisting limit.\n\nCost: about 290k and 270k tokens for the two workers (roughly 70k per\nfunction), so this is expensive per match compared with the Sonnet\nwaves.\n\n## Verified\n\n- Lead re-ran 0x1EB2F0: `check_source.py` ok, `try.py` score 0 and MATCH\n(226 instructions).\n- `make land`: 1 new match (904 bytes), 4 sources adopted, 0 parked.\n- `make elf`: `PASS: reconstructed image matches retail`.\n- `make check` on the original branch: 176 tests, repository, PAL and\ncleanup checks ok. PAL: 5,008 matched functions exact. This branch is\nthat commit cherry-picked onto the merged #20; the tree is identical to\nthe tested one (`git diff` against it is empty). The commit-message\ncheck passes here.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Blightwidow <14098167+Blightwidow@users.noreply.github.com>","measures":{"fuzzy_match_percent":74.0304,"total_code":1402440,"matched_code":1038232,"matched_code_percent":74.0304,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":5843,"matched_functions_percent":85.64937,"complete_code":152684,"complete_code_percent":10.887025,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":228}},{"timestamp":"2026-11-05T14:54:00Z","commit_sha":"5b229a91d15f607ba58b06fc7b2bf62d941ba38e","commit_message":"feat(us): 23 near misses matched from wave N4, workers end on claim.py done (#20)\n\n> **AI-assisted change.** Written with Claude Code (Sonnet workers for\nthe matching wave, the lead session for the landing and the tooling).\nThe numbers come from the commands under \"Verified\"; each worker's EXACT\nclaim was re-run by the lead before landing.\n\n## What\n\n- **Wave N4:** 23 near misses matched (5,040 to 5,063 of 6,757; NTSC-U\ncode 75.25% to 75.36%). 22 are in the SDK range (0x2319E8 to 0x256CE8).\nThe fixes are plain: real argument counts, a missing stack store,\nelement types of extern tables, `void` for callees that never write\n`$v0`, and a `.c` source where retail ends in a sibling-call `j`.\n0x23E308 only scores 0 under Sony's gcc 2.9, so its address is added to\n`config/us/sony_gcc29.txt`.\n- **Tooling from the wave retrospective:**\n- `claim.py take --of N` and `claim.py done WAVE ID N`: a worker ends on\n`DONE`. Five workers in N2 and N3 had stopped after 2 to 4 of 12\nfunctions.\n- The scorer fingerprint hashes file contents, not modification times.\nEditing `config/us/sony_gcc29.txt` used to make every logged run of a\nwave stop counting, and `claim.py land` gave no reason. `status` and\n`land` now warn how many logged runs are ignored.\n- `docs/contributing/queue-worker.md` makes `DONE` the criterion for the\nfinal message and says never to edit `config/`. `matching.md` gets a\npilot step (two workers first) and a list of the fixes found in N2 to\nN4.\n\n## Verified\n\n- Every EXACT source re-run by the lead: `check_source.py` ok, `try.py`\nscore 0 (23 of 23).\n- `make land`: 22 new matches in the first pass and 1 in the second\n(0x23E308: the registry held the old m2c draft, which also scores 0, so\nthe clean source was copied in); 0 parked.\n- `make elf`: `PASS: reconstructed image matches retail`.\n- `make check`: 176 tests, repository, PAL and cleanup checks ok. The\ncommit-message step passes against `origin/main` (it failed locally only\nbecause local `main` was behind the squash commit of #19). PAL: 5,007\nmatched functions exact.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Blightwidow <14098167+Blightwidow@users.noreply.github.com>","measures":{"fuzzy_match_percent":73.96594,"total_code":1402440,"matched_code":1037328,"matched_code_percent":73.96594,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":5842,"matched_functions_percent":85.63471,"complete_code":152684,"complete_code_percent":10.887025,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":228}},{"timestamp":"2026-11-05T13:30:02Z","commit_sha":"4a6f2aa613d62f88b68b3ff8f58b0a33c245a073","commit_message":"build: ps2eeas with one byte changed for all game code; 103 new matches (#19)\n\n> **AI-assisted change.** Written with Claude Code (Sonnet workers for\nthe matching waves, the lead session for the assembler analysis and\ndocs). The numbers below come from the commands listed under \"Verified\";\nplease review the assembler decision in particular, because it changes\nwhat AGENTS.md says (\"unpatched\").\n\n## What\n\n- **Assembler:** the build's assembler is `ps2eeas` 1.9.25.758 with one\nbyte changed (offset 0x4DEB, 6 to 5), for all game code and with no\nper-function list. `tools/ps2eeas/Ps2EeAs-loop5.exe` is made by\n`setup.sh` (and on first use by `compile_unit.py`) from the pinned\ndownload, after checking that the byte is the pinned 6; it is never\ncommitted. The SDK range keeps Sony's toolchain.\n- **Matches:** 10 near misses from waves N2 and N3 (workers' sources\nre-run by the lead), then 103 more that stopped at the short-loop\npadding.\n- **Docs:** `docs/build/assembler.md` has a new \"Short loops\" section\nwith every trial; AGENTS.md, `docs/TOOLCHAIN.md`,\n`docs/contributing/matching.md`, `docs/ROADMAP.md` and `setup.sh`\nfollow.\n- A short-lived `loop_pad.py` (a filter for the padding) is added in the\nfirst commit and removed in the last.\n\n## Why\n\nRetail pads every short backward-branch loop to five instructions. In\nthe game code (outside the SDK range) 240 loops sit at exactly five and\nnone are shorter, with or without calls or inner branches. The pinned\n`ps2eeas` pads to six, which left 96 of 366 drafts at score 1 to 16 one\n`nop` too long; no C changes that.\n\nFourteen assembler builds were run on synthetic loops (the Linux ones\nunder Docker): `ps2eeas` 1.9.25, 1.9.6 and 1.8.19, Sony's `as.exe`,\n`ee-as`, GNU as 2.9 to 2.12, and the gcc 3.2 assembler. They pad to\nnone, to six (five words before the branch), to eight, or refuse the\nloop; none pads to five. `ps2eeas` has no option for it. rac1-decomp and\nrac3-uya-decomp (linked in the docs) both use the pad-to-six rule. The\none-byte change is the only configuration that reproduces retail, and it\nis a constant, so no loop shape decides it.\n\nThis follows the \"one assembler for all, never per function\" rule: no\nlist, no choice per function. The old `gnu_as.txt` and\n`ps2eeas_loop5.txt` stay removed. **Please rule on the wording change in\nAGENTS.md**: it said \"unpatched\". If a `ps2eeas` release that pads to\nfive turns up, the docs say to switch back and delete the patch.\n\n## Verified\n\n- `assembler_probe.py` with the patched copy: 91 of 169 near misses at\nscore 0, 0 of 300 matched functions lost.\n- `rejudge.py`: all 4,937 matched functions still score 0.\n- `make land`: 103 new matches (22,008 bytes); 16 more score 0 but are\nparked for the cleanup rules (14 raw `M2C_UNK` offsets, 2 padding\nlocals).\n- `make elf`: `PASS: reconstructed image matches retail`.\n- `make check`: 174 tests, repository, PAL and cleanup checks ok. PAL:\n4,985 matched functions exact.\n- Matched 4,927 to 5,040 of 6,757; NTSC-U code 73.64% to 75.25% with\nblockers counted.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Blightwidow <14098167+Blightwidow@users.noreply.github.com>","measures":{"fuzzy_match_percent":73.85471,"total_code":1402440,"matched_code":1035768,"matched_code_percent":73.85471,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":5820,"matched_functions_percent":85.312225,"complete_code":152684,"complete_code_percent":10.887025,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":228}},{"timestamp":"2026-11-05T09:30:36Z","commit_sha":"a4b6f3c0c368f16181f5e18ec4542be0b4ab02dd","commit_message":"feat(tools): check sources before they match, probe assemblers, fresh queues\n\nFour changes from the retrospective of the 2026-11-04/05 session:\ncheck_source.py checks a source before it matches (banned constructs,\ncleanup rules, padding local) and record.py parks a rule-breaking\nsource instead of registering it; park.py and rejudge.py handle\nreviews and toolchain changes. assembler_probe.py measures a candidate\nassembler through EE_AS_EXE/EE_AS_ARGS. runs.log carries the toolchain\nfingerprint and claim.py ignores other toolchains' runs and shows a\nlive diff. claim.py init --near reads the registry.\n\n170 unit tests; record.py parked an asm draft end to end.","measures":{"fuzzy_match_percent":72.14512,"total_code":1402440,"matched_code":1011792,"matched_code_percent":72.14512,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6821,"matched_functions":5709,"matched_functions_percent":83.6974,"complete_code":120276,"complete_code_percent":8.576196,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":207}},{"timestamp":"2026-11-05T00:19:55Z","commit_sha":"b16b9dd1133a4dc3b24782e4ba838efc859afcdb","commit_message":"build: back to SN's ps2eeas, unpatched, no lists; 78 new matches\n\nThe one assembler is SN's ps2eeas again, unpatched, with no\nper-function list. bin/ee-as.exe put a nop after every mtc1 and\nblocked most near misses: unpatched ps2eeas matched 35 of 70 near\nmisses, 27 of 33 earlier losses and 75 of 77 sampled matches, against\n0, 0 and 76. docs/build/assembler.md records the four assemblers\ntried and why; sly1-decomp's Sly 1 retail differs.\n\nAll 4,912 matched functions re-judged: 63 demoted, 91 new matches\n(13 parked: asm or raw M2C offsets). Matched 4,911 to 4,927.\nNTSC-U code 73.49% with blockers counted, exact C 43.36%.","measures":{"fuzzy_match_percent":72.14512,"total_code":1402440,"matched_code":1011792,"matched_code_percent":72.14512,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6821,"matched_functions":5709,"matched_functions_percent":83.6974,"complete_code":120276,"complete_code_percent":8.576196,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":207}},{"timestamp":"2026-11-04T23:34:10Z","commit_sha":"59aaa1a87f67d154280282625be5e425cd6b70ec","commit_message":"feat(us): 26 parked functions cleaned of raw offsets and matched\n\nSeven Sonnet workers rewrote the 27 sources that the assembler switch\nbrought back with raw M2C_UNK/M2C_FIELD offsets. The offsets are named\nstruct fields now and every source still scores 0; 26 land, 0x1DB820\nstays parked at score 18.\n\nRe-scored and scanned by hand. PostLoLoad's return type is not proven\n(void and f32 both score 0).\n\nMatched: 4,885 to 4,911 of 6,757. NTSC-U code 72.02% with blockers\ncounted, exact C 41.89%.","measures":{"fuzzy_match_percent":71.119514,"total_code":1402428,"matched_code":997400,"matched_code_percent":71.119514,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6820,"matched_functions":5702,"matched_functions_percent":83.60704,"complete_code":129372,"complete_code_percent":9.224859,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":211}},{"timestamp":"2026-11-04T22:44:02Z","commit_sha":"e5f23f80875e3d20004c0dc54320bf4f5bbdcf8a","commit_message":"build: bin/ee-as.exe for the hazard nop, permanent blockers for VU0/MMI\n\nAssembler: Sly 2's retail code has a hazard nop between mtc1 and the\ninstruction that reads the register; ee/bin/as.exe (Sly 1's) emits\nnone. Switch to Sony's bin/ee-as.exe, pinned in setup.sh; the decision\nrecord is in docs/build/assembler.md. 33 matches regress, 106\nfunctions come back, 7 (asm drafts) and 27 (raw M2C offsets, parked\nfor cleanup) are not matched.\n\nPermanent blockers, as in sly1: 853 VU0, MMI, COP0 and hand-written\nfunctions (config/us/blockers.tsv) stay assembly, leave the work\nqueues and count as finished apart from the exact C.\n\nNTSC-U code 71.82% (exact C 41.69%), 5,756 of 6,820 functions.\nMatched C: 4,846 to 4,885.","measures":{"fuzzy_match_percent":70.862816,"total_code":1402428,"matched_code":993800,"matched_code_percent":70.862816,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6820,"matched_functions":5677,"matched_functions_percent":83.24047,"complete_code":114932,"complete_code_percent":8.195216,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":203}},{"timestamp":"2026-11-04T22:41:49Z","commit_sha":"e83ca1cd7880b64464ef8cb310015ca4f56f4c9a","commit_message":"feat(us): wave H1, 10 small functions matched, 65 drafts published\n\nEight Haiku workers took 83 small plain functions that never had a\nscored draft. Ten functions match and link from C (DxMaxLine,\nCQueueOutputIop_Update, TeleportGuardScript, AddSoGeomToOxa and six\nnumbered ones); PasegaFindAseg is rejected because it only reached\nscore 0 with a padding local. 65 drafts are published in nonmatching/.\n\nMatched: 4,836 to 4,846 of 6,757. The queue-worker protocol no longer\ntells workers to write VU0 asm.\n\nAbout 40 of the 83 stop at the hazard nop after mtc1, which the\nassembler switch in the next change addresses.","measures":{"fuzzy_match_percent":39.204292,"total_code":1402428,"matched_code":549812,"matched_code_percent":39.204292,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6820,"matched_functions":4782,"matched_functions_percent":70.1173,"complete_code":34116,"complete_code_percent":2.432638,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":147}},{"timestamp":"2026-11-04T20:07:34Z","commit_sha":"a82e9edc92514ac93f60b690aa36bfcbaa414328","commit_message":"feat(us): sly1 assembler, no inline asm, sly1-style CI and docs\n\nNo inline asm: 236 matched functions with inline asm and 11 with\nvolatile on plain data go back to assembly. One assembler, Sony's\nee/bin/as.exe: 221 more functions stop matching; the patched\nPs2EeAs-loop5 and the per-function assembler lists are gone.\n\nMatched: 5,304 to 4,836 of 6,757 (39.95% of code bytes).\n\nCI is sly1's two workflows (checks, progress); commit and cleanup\nchecks run locally (make commits, make cleanup). Site and Naming\nDesk dropped; matching.md trimmed to 21 KB; new AGENT_WORKFLOW,\nTOOLCHAIN and ROADMAP docs.","measures":{"fuzzy_match_percent":39.0517,"total_code":1402428,"matched_code":547672,"matched_code_percent":39.0517,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6820,"matched_functions":4772,"matched_functions_percent":69.97067,"complete_code":34116,"complete_code_percent":2.432638,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":147}},{"timestamp":"2026-11-04T20:05:38Z","commit_sha":"7e2141e7b56b042e92496916fcf272682bd0bdb3","commit_message":"docs(policy): adopt sly1-decomp rules, agent instructions and commit format\n\nAdopts sly1-decomp's AGENTS.md, CONTRIBUTING.md, PR template and commit format (license and branch stay). Fixes the checks workflow by installing pyelftools.","measures":{"fuzzy_match_percent":47.082092,"total_code":1402444,"matched_code":660300,"matched_code_percent":47.082092,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6826,"matched_functions":5194,"matched_functions_percent":76.091415,"complete_code":58524,"complete_code_percent":4.173001,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":185}},{"timestamp":"2026-11-03T13:39:40Z","commit_sha":"1140fc4ce2153e001f5b98175800b554cc50f992","commit_message":"decomp: VU0 j operands, frame wave, 32 matches (5,304 of 6,757 matched)\n\n-mvu0-use-vf0-15 per function (config/us/vu0_regs.txt, 43 functions) lets asm take j operands: the compiler emits the lqc2/sqc2/qmtc2/qmfc2 moves and fills delay slots with them as retail does. 22 matches from the VU wave, 11 from the frame wave (frame_diff.py), 2 earlier pilots. docs/contributing/exceptions.md lists every allowed exception and why. Byte gate PASS, make check ok, PAL 5,194 functions.","measures":{"fuzzy_match_percent":47.082092,"total_code":1402444,"matched_code":660300,"matched_code_percent":47.082092,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6826,"matched_functions":5194,"matched_functions_percent":76.091415,"complete_code":58524,"complete_code_percent":4.173001,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":185}},{"timestamp":"2026-11-03T12:03:10Z","commit_sha":"51d860ec0e6f2ff8aa07337d0f7738047588f848","commit_message":"docs: why GCC fills delay slots with VU moves, reorg experiment","measures":{"fuzzy_match_percent":46.94091,"total_code":1402444,"matched_code":658320,"matched_code_percent":46.94091,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6826,"matched_functions":5188,"matched_functions_percent":76.00352,"complete_code":58524,"complete_code_percent":4.173001,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":185}},{"timestamp":"2026-11-03T11:57:25Z","commit_sha":"615aae3d2f04357229cc0e52c3a34e9c9042fb72","commit_message":"build: function-start symbols for 5 boundary functions, 4 matches (5,270 of 6,757 matched)\n\nsplit_boundary.py cuts the leading epilogue word pair off 210ED0, 14F3C0, 259B18, 259D58 and 100220; the real functions start 8 bytes later. 210ED8, 259B20, 259D60 and 100228 match. Byte gate PASS, make check ok, PAL 5,188 functions.","measures":{"fuzzy_match_percent":46.94091,"total_code":1402444,"matched_code":658320,"matched_code_percent":46.94091,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6826,"matched_functions":5188,"matched_functions_percent":76.00352,"complete_code":58524,"complete_code_percent":4.173001,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":185}},{"timestamp":"2026-11-03T10:13:15Z","commit_sha":"52b5b7ca9b8f2adcc59a6a0ea044a7dc1c9eb132","commit_message":"decomp: Sonnet wave sf2 on mid-size drafts, 12 matches (5,266 of 6,752 matched), sources lowered\n\nByte gate PASS, make check ok, PAL 5,185 functions. 228538 to the default assembler, 1DBD10 and 1FD830 to ps2eeas_loop5.","measures":{"fuzzy_match_percent":46.92922,"total_code":1402444,"matched_code":658156,"matched_code_percent":46.92922,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6823,"matched_functions":5185,"matched_functions_percent":75.992966,"complete_code":58524,"complete_code_percent":4.173001,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":185}},{"timestamp":"2026-11-03T09:38:39Z","commit_sha":"5db80625fe098d54b609d33e12ac46a40b0572d4","commit_message":"decomp: second big-function wave, 5 matches (5,254 of 6,752 matched), sources lowered\n\nByte gate PASS, make check ok, PAL 5,173 functions.","measures":{"fuzzy_match_percent":46.557297,"total_code":1402444,"matched_code":652940,"matched_code_percent":46.557297,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6823,"matched_functions":5173,"matched_functions_percent":75.817085,"complete_code":55980,"complete_code_percent":3.991603,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":184}},{"timestamp":"2026-11-03T00:43:48Z","commit_sha":"168fd06abaade5d294f28ca7525979dc1e1072f4","commit_message":"decomp: big-function wave bg1, 5 matches (5,249 of 6,752 matched), sources lowered\n\nByte gate PASS, make check ok, PAL 5,168 functions. 216BC8 and 1FD0E8 move to ps2eeas_loop5, 19E1E0 to the default assembler.","measures":{"fuzzy_match_percent":46.122627,"total_code":1402444,"matched_code":646844,"matched_code_percent":46.122627,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6823,"matched_functions":5168,"matched_functions_percent":75.743805,"complete_code":55980,"complete_code_percent":3.991603,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":184}},{"timestamp":"2026-11-02T22:55:16Z","commit_sha":"fad8c95aad16868b56b6db67c196f52ecdbb5b05","commit_message":"decomp: make search with the new rules, 3 matches (5,244 of 6,752 matched), 12 sources lowered\n\nByte gate PASS, make check ok, PAL 5,163 functions.","measures":{"fuzzy_match_percent":45.66229,"total_code":1402444,"matched_code":640388,"matched_code_percent":45.66229,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6823,"matched_functions":5163,"matched_functions_percent":75.670525,"complete_code":55980,"complete_code_percent":3.991603,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":184}},{"timestamp":"2026-11-02T19:32:10Z","commit_sha":"324170f2802ed1d41c090f68be0d6cf357bc121a","commit_message":"decomp: nonmatching drafts lowered by search and the resumed nf1 workers (5,237 of 6,752 matched)\n\nByte gate PASS, make check ok.","measures":{"fuzzy_match_percent":45.46406,"total_code":1402444,"matched_code":637608,"matched_code_percent":45.46406,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6823,"matched_functions":5156,"matched_functions_percent":75.56793,"complete_code":55076,"complete_code_percent":3.927144,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":183}},{"timestamp":"2026-11-02T15:24:29Z","commit_sha":"26de80fa2b751abb5962ab059b97c2a5a01668a9","commit_message":"decomp: Opus near-miss and todo rounds, 29 matches (5,205 of 6,752 matched), 63 sources lowered\n\nConfig: 0x213300, 0x174490 move from gnu_as to ps2eeas_loop5. Byte gate PASS, make check ok, PAL pair table 5,144 exact of 5,205 matched.","measures":{"fuzzy_match_percent":44.983185,"total_code":1402444,"matched_code":630864,"matched_code_percent":44.983185,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6823,"matched_functions":5127,"matched_functions_percent":75.1429,"complete_code":55076,"complete_code_percent":3.927144,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":183}},{"timestamp":"2026-11-02T11:24:19Z","commit_sha":"d2528ae310023fea2308f1a01f49a9e4aacb5166","commit_message":"decomp: Opus round 19 on the big nonmatching functions, 7 matches (5,162 of 6,752 matched)\n\nMatched (score 0, make elf byte gate PASS, make check ok; 4 same, 1 gap and\n1 none on PAL): UpdateMeter (1D9DF8), 202768, OnDifficultyBreak (154E10),\n211528, CEmitter_PostLoad (159500), UpdateEpsel (15CF30), 161A58.\n7 of 25 functions over 1,000 bytes at score 150 or less; each was a rewrite\nfrom retail's block structure (typed structs, real prototypes, inline helpers\nwith their own parameters, case layout in retail's order), not a patch of\nthe m2c draft.\n\ndocs/contributing/matching.md gets the round's levers (loop.c budget via\n-dL, inline helpers, rewrite above about 90) and the assembler wall that\nneeds both GNU as delay-slot fills and ps2eeas hazard nops.","measures":{"fuzzy_match_percent":42.710705,"total_code":1402440,"matched_code":598992,"matched_code_percent":42.710705,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6823,"matched_functions":5087,"matched_functions_percent":74.55665,"complete_code":50224,"complete_code_percent":3.581187,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":180}},{"timestamp":"2026-11-02T09:44:11Z","commit_sha":"08a623588181e66207ae3c6e39368b83439648a3","commit_message":"decomp: Sly 1 reference pilot and Sonnet near-miss batch, 22 matches (5,133 of 6,752 matched)\n\nMatched (all print score 0, make elf byte gate PASS, 22 of 22 reproduce on PAL):\n- 16 from a pilot that gave Sonnet workers the paired Sly 1 body from\n  OpenThievius/sly1-decomp as a hint (reference only, nothing copied; 16 of 22\n  tried matched): U8Read, S8Read, PrefFindBinding, PsoHitTestLineObjects,\n  CedgeFindAtPos, McErrorFromResult, CopyAb, BuildClutTex2, SetEyesEyess,\n  SaveSprBuf, Flush__5OSTRM, CchParsePchzTft, WriteTftUl, WriteTftDouble,\n  WriteTft, AddVifUnpack.\n- 6 from Sonnet on 171 near misses at score 10 or less, no reference: TickReadCount,\n  NBentleyActionCategory (136CC0), SetStgSwitchHitter, PleaseFromPlo, InitEyes,\n  func_002046F0.\n\nconfig/us: 226F28, 1AABC0, 136CC0 move from gnu_as.txt to ps2eeas_loop5.txt\n(they match only with that assembler).\n\nFor review: SetEyesEyess and PrefFindBinding use goto (plain C, same\nbehaviour); PrefFindBinding's items[4] size is a guess; TickReadCount uses\nasm volatile mfc0 (COP0, same as StaticInitClock). Held back in\nnonmatching/ for a decision: 1C8090 (address kept in a local), 14F478 (=&r\nearly clobber), 15B0C8 (asm operand rewrite with a memory clobber).","measures":{"fuzzy_match_percent":41.588898,"total_code":1402432,"matched_code":583256,"matched_code_percent":41.588898,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":5062,"matched_functions_percent":74.20111,"complete_code":47832,"complete_code_percent":3.410647,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":178}},{"timestamp":"2026-11-01T19:35:46Z","commit_sha":"2b8b18dc49645d6a8530d54bb7bd37cb11fa156d","commit_message":"docs: Opus round 18 lessons and yield","measures":{"fuzzy_match_percent":40.995926,"total_code":1402432,"matched_code":574940,"matched_code_percent":40.995926,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":5036,"matched_functions_percent":73.81999,"complete_code":44900,"complete_code_percent":3.201581,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":173}},{"timestamp":"2026-11-01T18:25:23Z","commit_sha":"7c027ad3152cbe2c123dccf11673fda31d194e2e","commit_message":"docs: Sonnet round 17 lessons and yield","measures":{"fuzzy_match_percent":40.633698,"total_code":1402432,"matched_code":569860,"matched_code_percent":40.633698,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":5004,"matched_functions_percent":73.35092,"complete_code":44824,"complete_code_percent":3.196162,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":172}},{"timestamp":"2026-11-01T16:54:00Z","commit_sha":"4f864600a53f9b6fdb67ed1fe76146b5a7bc7fe2","commit_message":"decomp: Opus round 15 on near misses, 8 matches (5,031 of 6,752 matched)\n\n16 near misses (score 1 to 20), Opus, ~30 compiles each: 8 matches (117C80, 11E1A0, 122BE0, 160B70, 18F560, 1B5820, 1CB658, 1D7DA0), 1 skip (259BF8 fragment). make elf PASS, make check OK. 11E1A0 uses the lane-move Vec3 helper. 170548 stays at 21 (behaviour now correct).","measures":{"fuzzy_match_percent":40.16908,"total_code":1402432,"matched_code":563344,"matched_code_percent":40.16908,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":4963,"matched_functions_percent":72.74992,"complete_code":42744,"complete_code_percent":3.047848,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":169}},{"timestamp":"2026-11-01T16:24:53Z","commit_sha":"36e11a79974431cd4bd2d3506ea3e8436d0e98a6","commit_message":"decomp: search + land, 12 matches (5,023 of 6,752 matched)\n\nmake elf PASS, make check OK. rules search near misses landed; nonmatching/ rescored.","measures":{"fuzzy_match_percent":40.043865,"total_code":1402432,"matched_code":561588,"matched_code_percent":40.043865,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":4955,"matched_functions_percent":72.63266,"complete_code":42744,"complete_code_percent":3.047848,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":169}},{"timestamp":"2026-11-01T13:39:39Z","commit_sha":"b6ceca65773bd3f70cad0a0ec3aae03fb6a60481","commit_message":"docs: Sonnet round 14 lessons and yield","measures":{"fuzzy_match_percent":39.93434,"total_code":1402432,"matched_code":560052,"matched_code_percent":39.93434,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":4943,"matched_functions_percent":72.45676,"complete_code":42744,"complete_code_percent":3.047848,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":169}},{"timestamp":"2026-11-01T12:59:20Z","commit_sha":"6e5c7b8c95f96632d9e831aa75df12c1487b2dac","commit_message":"docs: Sonnet round 13 lessons and yield","measures":{"fuzzy_match_percent":39.892414,"total_code":1402432,"matched_code":559464,"matched_code_percent":39.892414,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":4940,"matched_functions_percent":72.41278,"complete_code":42744,"complete_code_percent":3.047848,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":169}},{"timestamp":"2026-11-01T12:30:03Z","commit_sha":"0130ce8e645f59f419bf5f055ce82ecfeabe81d3","commit_message":"tools: six rewrite rules for make rules; docs: rounds 11 and 12, rules control\n\ninline_local, vcall_raw, hoist_field, result_local, condition_split, for_to_while. Control (97 sources of the r9 and r10 matches before the workers, depth 3, 400 compiles): the old search solved 2, with the new rules 3 solved and 13 improved, none lost; depth 5 with 1,500 compiles finds nothing more. hoist_field, result_local and for_to_while have not yet contributed to a solve.","measures":{"fuzzy_match_percent":39.823677,"total_code":1402432,"matched_code":558500,"matched_code_percent":39.823677,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":4938,"matched_functions_percent":72.38347,"complete_code":42744,"complete_code_percent":3.047848,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":169}},{"timestamp":"2026-11-01T11:25:37Z","commit_sha":"dd266aab2944ebd0b5094ec9e80e1b27fee9ede2","commit_message":"decomp: Sonnet round 11, 31 matches (5,004 of 6,752 matched)\n\n155 small functions (48 to 400 bytes) at score 21 to 100 or untried, eight workers: 31 new matches (6,840 bytes, 20%); make elf byte gate passes, PAL reproduces 4,953 of 5,004 matched functions (22 near, 5 different, 24 unpaired). 54 drafts that carried a banned construct were stripped first, so their scores rose to the honest value.","measures":{"fuzzy_match_percent":39.645702,"total_code":1402432,"matched_code":556004,"matched_code_percent":39.645702,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":4936,"matched_functions_percent":72.35415,"complete_code":42744,"complete_code_percent":3.047848,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":169}},{"timestamp":"2026-11-01T10:49:22Z","commit_sha":"e12efa581e6b1b372a0a87cbd9082800c21be027","commit_message":"tools: list hand-written functions; VU0 and MMI near misses stop at ten compiles\n\nconfig/us/handwritten_asm.txt: 130 functions marked by spimdisasm (121 in the SDK range, 9 in the queue), tags from syscall, trap, $at, MMI, COP2. Nothing counts from it. matching.md Walls: the ten-compile rule and a Behaviour note for the port.","measures":{"fuzzy_match_percent":39.157978,"total_code":1402432,"matched_code":549164,"matched_code_percent":39.157978,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6822,"matched_functions":4905,"matched_functions_percent":71.899734,"complete_code":42744,"complete_code_percent":3.047848,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":169}},{"timestamp":"2026-10-31T08:57:00Z","commit_sha":"ea66c698e5be544e82b0204c60a7e90125e9f9d9","commit_message":"decomp: Sonnet round 9, 20 matches (4,894 of 6,752 matched)\n\n60 near misses at 7 to 14 words from a pool without fragments or banned constructs, three workers: 20 new matches (2,508 bytes); make elf byte gate passes, PAL reproduces 4,845 of 4,894 matched functions.","measures":{"fuzzy_match_percent":38.35594,"total_code":1402432,"matched_code":537916,"matched_code_percent":38.35594,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6821,"matched_functions":4828,"matched_functions_percent":70.78141,"complete_code":38952,"complete_code_percent":2.777461,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":163}},{"timestamp":"2026-10-31T08:25:24Z","commit_sha":"0445278e562126d1f014776ff9f6f6c1e632b7b1","commit_message":"decomp: Sonnet round 8, 50 matches (4,874 of 6,752 matched)\n\n183 near misses at 1 to 10 words, six workers: 50 new matches (7,968 bytes), 19 more functions improved; make elf byte gate passes, PAL reproduces 4,827 of 4,874 matched functions. Lessons in docs/contributing/matching.md.","measures":{"fuzzy_match_percent":38.193935,"total_code":1402432,"matched_code":535644,"matched_code_percent":38.193935,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6821,"matched_functions":4810,"matched_functions_percent":70.51752,"complete_code":38952,"complete_code_percent":2.777461,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":163}},{"timestamp":"2026-10-31T07:32:05Z","commit_sha":"f6283f3b219857ee6e29a6a596cba0016908845c","commit_message":"decomp: add nonmatching sources regenerated by make land\n\nCompanion to bc75258: the .c/.cpp counterparts of nonmatching entries it removed or renamed.","measures":{"fuzzy_match_percent":37.658295,"total_code":1402432,"matched_code":528132,"matched_code_percent":37.658295,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6821,"matched_functions":4761,"matched_functions_percent":69.79915,"complete_code":36348,"complete_code_percent":2.591783,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":162}},{"timestamp":"2026-10-30T20:52:35Z","commit_sha":"05101400e557e91d8c032d0b6aeadb3cfd201b9a","commit_message":"PAL: pal-check in make check and CI (every matched function has a PAL row, the report is current)","measures":{"fuzzy_match_percent":37.22448,"total_code":1402432,"matched_code":522048,"matched_code_percent":37.22448,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6821,"matched_functions":4713,"matched_functions_percent":69.09544,"complete_code":36348,"complete_code_percent":2.591783,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":162}},{"timestamp":"2026-10-30T20:08:16Z","commit_sha":"cfceb2c3577118562e7abf95a88fdcb98ae1b6fb","commit_message":"PAL: objdiff report (SCES_525.29_report), make pal, CI artifact","measures":{"fuzzy_match_percent":37.22448,"total_code":1402432,"matched_code":522048,"matched_code_percent":37.22448,"total_data":1038916,"matched_data":0,"matched_data_percent":0,"total_functions":6821,"matched_functions":4713,"matched_functions_percent":69.09544,"complete_code":36348,"complete_code_percent":2.591783,"complete_data":0,"complete_data_percent":0,"total_units":434,"complete_units":162}}]