This commit is contained in:
33333-33333 2026-08-22 20:55:27 +09:00
commit caa90775f9
89 changed files with 7126 additions and 0 deletions

89
IMPLEMENTATION_REPORT.md Normal file
View file

@ -0,0 +1,89 @@
# Mandelbrot Deep Zoom v23 実装報告
## 結論
`IMPROVEMENT_PROPOSAL.md`で定義したv23の実装、ローカル数値検証、WASM再現build、Hosted/Standalone成果物の生成まで完了した。実ブラウザでのみ測定できる性能・表示・操作・download検証は、今回の環境にin-app browser bindingがないため未実行である。したがって、実装と非ブラウザgateは合格、browser acceptance gateは保留として扱う。
## 実装済み
- 常時RAFを廃止し、invalidate時だけ動くevent-driven schedulerへ変更した。
- wheel/pinch/pan中は再投影だけを行い、settle後に計算を1回開始する。
- Preview時間予算を110msへ下げ、cold deep Previewは幅48px以下から開始する。以後は実測MPPでPreview寸法を決める。
- 標準deepのCoveredは実測MPPから約1.4秒のpixel budgetを算出する。未計測・再投影のみの場合は保守的MPPを使い、DPR下限は固定比率ではなく長辺64pxとするため4Kでも予算が効く。精細・精度優先ではこの時間適応を行わない。
- 処理モードの自動到達点を固定し、省電力はPreview、標準はCovered、精細はRefined、精度優先はValidatedで停止する。標準では境界AAと未確定追加反復を既定で実行しない。
- 精細の未確定追加反復は全未確定pixelではなくescape境界候補に限定し、1 viewあたりdeep 384点/shallow 4,096点を上限にする。
- `Reprojected → Preview → Covered → Refined → Validated/検証未完了`を分離した。
- Coveredはeffective DPRの表示Canvas全域をpixel中心`(x + 0.5, y + 0.5)`で計算する。
- escape field、分類、confidenceと彩色を分離し、palette変更時の反復再計算を廃止した。
- fieldへ各sampleの実escape iterationを保持し、再着色・未確定継続・Export監査で近似値ではなく同じ数値結果を使う。
- adaptive 2×/4× AA、linear-light resolve、byte-budget detail cacheを実装した。
- 深部Worker、deep/BLA/color WASM、reference資産を遅延生成し、Worker数を実測とmemory budgetで増減する。
- deep/BLA/colorはmainで各1回だけcompileし、compile済み`WebAssembly.Module`をWorkerへstructured cloneする。Worker sourceから埋込payload、palette LUT、RGBA生成の重複を除き、Workerは数値fieldだけを返す。
- 通常jobから学習したstrip時間とWorker数をkernel version・端末特性keyで永続化し、次回起動で再利用する。
- fixed-point direct、perturbation、rebase、BLA、局所guarded directを共通tile schedulerへ接続した。
- deep切替を固定zoom閾値ではなくpixel stepとULPの比、hysteresisで決める。
- deep切替とguard bitsへ直近orbitのglitch/未確定/補修率を加え、精度昇格時は低精度で作った基準軌道を破棄して再構築する。
- 高精度directを約6msでyieldする非同期処理へ変更し、取消可能にした。
- f64解析・収縮判定は`INTERIOR_LIKELY`のまま保持し、ValidatedではP/P+64双方の固定小数点整数不等式で主カージオイド/周期2球を証明できたsampleだけを`INTERIOR_PROVEN`へ昇格する。
- 精度優先のdeep描画では、基準軌道もP/P+64で独立再計算して疎なcheckpointとescape位置を照合し、不一致時はglobal reference全体を32 bit昇格して作り直す。
- 1×/2×/4×/custom、1×/2×2 AA、Balanced/Validated、進捗、取消に対応する独立tile exportを実装した。
- Export sidecarへViewSpec、precision/iteration policy、未確定sample数、backend、全kernel SHA-256、色空間、encoder、paletteを記録する。
- version付きURL、戻る/進む、座標・spanの正確値入力/copy、Undo/Redoを実装した。
- 初回UI、一般statusと診断status、mobile compact status、keyboard操作、live region、visible focus、44px target、reduced motion/transparencyを実装した。
- Hosted版はcontent-hashed外部WASMとstreaming compile、Standalone版は3ファイル直開きを維持した。
- cacheは件数ではなくmobile 96 MiB/desktop 192 MiBのlogical byte ledgerで管理する。
## 再現buildと配布
- `src/shallow_kernel.c`、`src/deep_kernel.c`、`src/bla_kernel_v18.c`、`src/color_kernel.c`、`src/abi.json`を配置した。
- `toolchain.lock.json`でclang 17.0.6、target、SIMD/scalar flagsを固定した。
- 公式SHA-256を照合したclang 17.0.6とNode.js v22.18.0で8 WASMを再buildした。
- shallow、deep、BLA、colorのgoldenとSIMD/scalar同値gateに合格後、payloadと`kernels.js`を昇格した。
- `scripts/build-kernels.ps1`は同一payloadだけを自動deduplicateし、異なるCOLOR variantsも正しく保持する。
- `scripts/build-hosted.ps1`は現manifest以外の古いcontent-hashed WASMを削除する。
生成先:
- Hosted: `dist/hosted/`と`dist/wasm/`
- Standalone: `dist/standalone/`
- 再現build: `build/wasm-v23/`
現在の非圧縮基準値は、Hosted first view 142,046 bytes、Standalone 170,593 bytesである。詳細なfile hashは`audit/v23-source-baseline.json`に記録した。
## 合格済みgate
- source contract: pass
- kernel source/ABI contract: pass
- fixed-point precision 256/320 bit: pass
- 基準軌道P/P+64 checkpoint一致と故意の不一致検出: pass
- analytic interior integer proof 256/320 bit: pass
- pixel mapping 851 samples、shallow/deep/BLA、2×/4× tile seam: pass
- 配布shallow WASM pixel contract 1,440 samples、mismatch 0: pass
- generated-WASM shallow/color/deep/BLA golden: pass
- SIMD/scalar結果比較: pass
- 本体、shallow Worker、deep WorkerのJavaScript構文: pass
- mock DOM初期化とv23 diagnostics: pass
- compile済みdeep/BLA/color Moduleのstructured clone・instantiate: pass
- Node固定scene性能基準と処理量契約: pass(`audit/v23-node-performance.json`)
- Hosted/Standalone buildと全payload SHA-256: pass
toolchainを利用できる環境では次で省略なしに再実行できる。
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/test-all.ps1 -RequireToolchain
```
## Browser acceptance gate
`tests/browser-benchmark.html`は`tests/scenes.json`のmobile/desktop/4K profileと6 sceneを走査し、Preview、Covered、Refined、idle scheduler/write、long task、logical memory、canvas SHA-256をJSON化する。desktop/z0ではwheel連打、省電力がPreviewで停止すること、標準がCovered後にAA・追加反復を開始しないこと、即時再着色、64px Export、Validated Export取消、機械判定できるaccessibilityも実行し、結果へacceptance判定を付ける。今回の環境ではbrowser bindingがなかったため、`audit/v23-browser-baseline.json`は意図的に`not-run`のままである。
残る実機確認:
- mobile/desktop/4Kの表示画像とnative coverage
- 操作反映p95、Preview/Covered/Refined所要時間
- idle時の予約RAF/timer/background job/Canvas・DOM write 0
- browser/GPUを含むobserved peak memory
- Export寸法、完了前downloadなし、取消、PNG/JSON内容
- keyboard-only、focus、44px target、live status、page zoomとcanvas pinchの操作確認
このgateが合格するまで、v23の実装完了と数値gate合格は主張できるが、固定実機に対する性能目標の達成は主張しない。