Research 06 / Verification

「看起來能玩」不是完成條件。

長關卡、隨機掉落、cache 與一次性音樂很難只靠肉眼覆蓋。ROM 在 mGBA 中跑真實流程,再用 SRAM 回傳可機器判讀的契約。

SRAM telemetry contract

每個 focused AUTOTEST ROM 在完成後,把 magic、schema、pass flag 與 counters 寫到 SRAM,再以測試 SWI 結束。PowerShell host 讀回 little-endian 欄位,任何 golden、budget 或 accounting 不符就讓建置失敗。

這比解析 emulator 畫面或 log 更穩定:ROM 本身知道目前 level position、 event cursor、敵人數、cache miss、music state 與 pending frame。

不是一支超長測試

A

完整第一關

來源事件、Boss、獎賞、聲音、破關飛行、一次性歌曲、統計與回 Game Menu。

B

Episode routes

Episode 1 campaign、Episode 2/3/4 routes 與存檔續關案例,驗證 script 轉場、Boss exit 與不同資產 bank。

C

ROMFS matrix

四個 Episode 共 62 個 playable sections,讀事件、enemy pool、背景與 Sprite2 catalog。

D

Focused flows

Death、Demo、JukeBox、Arcade equipment、frontend、Next Level camera 與 960 次靜態轉場。

用 accounting 找出「少了什麼」

只檢查 final state 會放過中間偷漏。專案額外要求:

  • source events = applied + deferred + skipped;
  • spawn attempts = successes + pool full + missing;
  • VRAM uploads = cache misses,upload bytes 符合 tile size;
  • L2 raw builds = L2 misses,RLE fallback = 0;
  • music cue start = 1,natural stop = 1;
  • reward/effect/projectile drops = 0。

效能也要有狀態來源

Missed VBlank 分為 gameplay、stats、game over、transition 與 frontend other。v89 LOW 正式版的發佈驗證另固定檢查:

62 / 62ROMFS playable sections
44JukeBox modules
0LOW stress audio frame loss

這些數字不是宣稱任何情境永不 drop frame;它們是固定輸入下的 regression baseline。若程式改動讓同一路徑多出 deterministic miss,建置立即失敗。

自動測試仍不能取代視覺 QA

CRC 可證明資產沒變,不能判斷 priority 是否符合人眼預期;event count 也不能判斷字體好不好看。專案同時保留 deterministic screenshot ROM、 pixel comparison 與人工試玩。AI 建議亦必須經這三層證據交叉確認。

Mature port 的意思不是「不再出 bug」,而是每次修復都盡量留下能阻止 同類問題回來的測試契約。