test(M00): add checkpoint perceptual comparison

Work-Package: M00-QAR-VISUAL-DIFF-001
Agent: sindo-main-codex
Tests: synthetic visual diff, M00 dry-run, coordination and documentation gates
Fidelity: automates paired metrics; approved 3.3.5a captures and human approval remain required
This commit is contained in:
2026-07-11 09:38:40 +04:00
parent fbe22f6a94
commit a4f60dcb06
8 changed files with 356 additions and 5 deletions
+39 -1
View File
@@ -24,6 +24,44 @@
- `<checkpoint>__cold_process.png` — первый визит в текущем процессе;
- `<checkpoint>__warm_revisit.png` — повторный визит в том же процессе после обхода контрольных точек.
## Парное визуальное сравнение
Одобренные снимки оригинального клиента хранятся вне Git. Если каталог с ними доступен локально, единый запуск может сразу сравнить PNG с одинаковыми именами:
```powershell
.\tools\run_render_baseline.ps1 `
-ReferenceCheckpointDirectory 'D:\private-fixtures\wow-3.3.5a-checkpoints'
```
Результат записывается в `user://render_baseline/visual_comparison.json`. Другой путь задаётся через `-VisualComparisonReport`. `-DryRun` несовместим с визуальным сравнением, потому что не создаёт PNG.
Отдельный запуск сравнения:
```powershell
godot --headless --path . `
--script res://src/tools/compare_render_checkpoints.gd -- `
--reference 'D:\private-fixtures\wow-3.3.5a-checkpoints' `
--candidate "$env:APPDATA\Godot\app_userdata\OpenWC\render_baseline" `
--output user://render_baseline/visual_comparison.json
```
Сравнение переводит sRGB в linear color space, вычисляет взвешенную ошибку яркости/цвета для каждого пикселя, среднюю ошибку кадра и долю пикселей выше локального порога. Нормативные defaults находятся в `comparison_budgets` manifest: mean error `0.015`, changed-pixel ratio `0.01`, pixel error threshold `0.04`. Любое превышение, несовпадение размеров, отсутствие пары или пустой reference-каталог возвращает ненулевой exit code.
Автоматический pass не является доказательством parity: animation phase, weather, camera alignment и intentional gaps требуют human approval. Для проверки алгоритма без proprietary данных используется:
```powershell
godot --headless --path . --script res://src/tools/compare_render_checkpoints.gd -- --self-test
```
```mermaid
flowchart LR
R[Private approved reference PNGs] --> C[Checkpoint comparator]
N[New baseline PNGs] --> C
M[Manifest tolerance defaults] --> C
C --> J[JSON metrics and pass/fail]
J --> H[Human fidelity approval]
```
`cold_process` не означает очищенный Windows filesystem cache. Поле `cache_state` и полный inventory обязаны интерпретироваться вместе с результатом. Удаление или принудительная пересборка cache не входит в baseline-команду. Для отдельного запуска после контролируемой очистки безопасного локального cache следует передать осмысленную метку, например `-CacheState rebuilt-clean`; proprietary source assets команда не изменяет.
## Контрольные точки и детерминизм
@@ -38,7 +76,7 @@
- синтетический native-animation probe `GryphonRoost01.m2`;
- тот же Elwynn overview в 19:00 для sky transition.
Зафиксированы camera/target/player position, viewport, FOV, quality preset и время мира. Для temporal shader/animation кадров SHA-256 служит идентификатором артефакта, но не pass-критерием: будущая автоматическая визуальная проверка должна использовать perceptual diff и согласованный tolerance. Синтетический animation probe существует только внутри capture tool и не меняет runtime streaming scene.
Зафиксированы camera/target/player position, viewport, FOV, quality preset и время мира. Для temporal shader/animation кадров SHA-256 служит идентификатором артефакта, но не самостоятельным pass-критерием: автоматическая визуальная проверка использует perceptual diff и согласованный tolerance. Синтетический animation probe существует только внутри capture tool и не меняет runtime streaming scene.
## Метрики и budget
+4 -3
View File
@@ -7,7 +7,7 @@
| Status | Partial |
| Target/work package | M00 active; декомпозиция M01–M03 |
| Owners | Renderer workstream / milestone integrator |
| Last verified | `93bfe11` + M00 worktree baseline, 2026-07-10 |
| Last verified | M00 visual-diff worktree, 2026-07-11 |
| Profiles/capabilities | `Performance`, `Balanced`, `High`, `Custom`; Blizzlike fidelity incomplete |
## Purpose
@@ -192,9 +192,9 @@ Exact exported settings and cache versions remain documented in [`../../RENDER.m
## Verification
- Unit/contract tests: material mapping, unique-ID dedupe, placement probes, baseline manifest.
- Unit/contract tests: material mapping, unique-ID dedupe, placement probes, baseline manifest, synthetic perceptual checkpoint diff.
- Integration/E2E: Eastern Kingdoms/Kalimdor streaming scenes and seven cold/warm checkpoints.
- Fidelity evidence: current fixed-position captures exist; approved original-client paired screenshots are still missing.
- Fidelity evidence: current fixed-position captures and automated paired-PNG metrics exist; approved original-client paired screenshots and human approval are still missing.
- Performance budgets: M00 report records cold/warm p95 and max hitch; no final acceptance threshold yet.
- Manual diagnostics: [`../RENDER_BASELINE.md`](../RENDER_BASELINE.md) and [`../../RENDER.md`](../../RENDER.md).
@@ -239,6 +239,7 @@ Exact exported settings and cache versions remain documented in [`../../RENDER.m
| `src/native/src/*_loader.cpp` | Native binary parsing |
| `src/tools/build_*cache.gd`, `src/tools/bake_*cache.gd` | Offline cache generation |
| `tools/run_render_baseline.ps1` | Unified M00 baseline runner |
| `src/tools/compare_render_checkpoints.gd` | Offline paired-PNG perceptual metrics and JSON pass/fail report |
## Related decisions and references