Commit Graph
3 Commits
Author SHA1 Message Date
Joseph MattielloandClaude Opus 5 2b180cb6d4 fix(ocgrid): stop on INT/TERM, refuse a saturated stock cell as baseline
Two review findings, both in the measurement guards the script exists to
enforce.

The trap cleaned up but never stopped. On Ctrl-C the handler ran rm and the
sweep carried on: the signal killed only the current cells frame_hash_ab, that
cell was recorded FAILED, and six more multi-minute cells followed. TERM from
timeout was ignored the same way. Split into an EXIT trap that cleans up and an
INT/TERM trap that exits 130.

A saturated stock cell still became the baseline. The doc is emphatic that
SATURATED means unmeasured and arms must not be compared -- but any
non-saturated cell would still print an authoritative-looking percentage
against a ceiling-pinned number. Only a measured stock cell can set the
baseline now; otherwise every row reports NO USABLE STOCK BASELINE.

Super Burnout hit exactly this case in the same run that prompted the fix:
1799/1800 in all seven cells, stock included.

Also records gate 1 complete across all eight candidates. One passes.

  Cybermorph          -48.7% / +44.7% / +72.8%   PASSES
  I-War               -18.2% / +6.3%  / +1.1%    noise, capped at stock
  Missile Command 3D   -0.2% / -14.3% / -11.2%   overclock actively harmful
  Doom, Club Drive, Iron Soldier                 flat locks
  Super Burnout                                  saturated at stock
  Val D Isere                                    still needs a gameplay save

The structural-null hypothesis holds as the general rule but not as a law:
Cybermorph disproves the strong form. Doom reads 593/1800 = 19.8 fps in
gameplay against real hardwares ~20 renders/s, which is a lead for #401 --
the 2x-too-fast figure came from the attract demo, a different code path.

Refs #378

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-08-25 23:38:37 -04:00
Joseph MattielloandClaude Opus 5 ac7a8e0e3f fix(ocgrid): honour the output argument, always run the 0.5x control, drop bare rm
Four review findings, all real.

The documented invocation passed an output filename that the script consumed
and threw away -- results only ever reached stdout. It now writes the file and
echoes, and CORE= overrides the hardcoded macOS library name.

The checklist table spliced a 900-frame 0.5x control into a table labelled as a
2400-frame window, and quoted it against a 1x baseline of 513 that appeared
nowhere in the document. Re-measured: all seven cells now come from one
2400-frame window, and the control reads -48.7% against 1.5x gaining +44.7%.
Near-linear in both directions, which is what makes the rest of the table
trustworthy.

Cleanup used a bare rm, against the house rule, and leaked the mktemp dir on
any early exit. Now trap + command rm -rf.

Beyond the findings: the 0.5x control is no longer something the operator has
to remember. It is a fixed cell in the grid, because a flat 1x/1.5x/2x row
cannot distinguish a real frame cap from a measurement that never responded --
the direct cause of both retracted tables on #378. Reporting is two-phase so
the stock cell is known before anything is quoted against it.

Kimi asked whether intl option arrays reference the deleted "timing" category
key: libretro_core_options_intl.h is a 91-line stub with no option_cats_/
option_defs_ arrays and no reference to any category, so no locale regresses.

Refs #378

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-08-25 23:06:01 -04:00
Joseph MattielloandClaude Opus 5 ed06c6998d feat(options): split Timing into Speed and Hardware Timing; add overclock gate-1 tooling
The Timing category held three different intents at once: two overclocks that
change what the game computes, two fast-forwards that change only how much work
the host does, and three accuracy models that deliberately make things slower.
One flat list gave a user no way to tell "this makes it faster" from "this makes
it slower on purpose".

Split into Speed and Hardware Timing (Experimental), and order Speed by what to
try first: the two free bit-exact fast-forwards, then the two overclocks that can
break a game. blit_memo moves here from Video -- it is the same free-speedup
class, and it silently disables idle-skip, which was undiscoverable from a
different category. Option keys are unchanged, so no user config breaks.

Also corrects the M68K text, which cited AvP and Checkered Flag as games
overclocking can smooth. Both were measured under #378 and both failed: AvP is
locked to one frame per 5 fields, Checkered Flag caps itself in software.

Adds scripts/ocgrid.sh (gate-1 grid), scripts/rzip_extract.py (RetroArch
compressed states are otherwise unreadable by the harness) and the #378
checklist, which records the first title to clear gate 1: Cybermorph, +44.7% at
RISC 1.5x and +72.8% at 2x, with an underclock control proving the metric live.

Refs #378

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-08-25 22:29:38 -04:00