food_chain/VALIDATION.md
2026-09-29 23:45:12 +09:00

4.9 KiB

v45 検証記録

検証日: 2026-09-29

結論

v45 は、報告された「スポーン地点付近から離れない」「停止個体が多い」「境界付近で往復振動する」を、home-range の撤去と移動経路の原因修正で対応した。

production code にはスポーン地点への復帰点・復帰半径・home-range 補正は存在しない。回転検出、角運動量検出、逆トルクのような症状検出型の補正も使用していない。

原因と修正

  1. 岸際スポーン

    • 旧配置では陸棲/水棲個体が最寄りの合法地点へ押し出され、岸線から数 m の位置に置かれる場合があった。
    • v45 は非両棲個体の初期配置に岸線 clearance を要求する。
  2. 境界での移動量切り捨て

    • 禁止 habitat 側を向いた個体は移動量がほぼゼロになり、同じ方向を保持して停止/微振動し得た。
    • v45 は signed-distance の勾配から岸線法線を求め、禁止側へ向かう成分だけを除いて接線方向へ連続的に投影する。
  3. 短い徘徊とスポーン復帰

    • home-range を完全に削除した。
    • 徘徊は現在位置から persistent free-roaming waypoint を生成し、到達後に次 waypoint を選ぶ。
  4. continuous resource target の往復

    • producer / zooplankton の仮想目標点へ到達後は target を破棄し、その場で摂食可能なまま roaming へ戻る。
    • 仮想目標点と roaming waypoint の交互追跡を行わない。
  5. stamina による長時間停止

    • routine travel は sprint stamina を消費しない。
    • 逃走・追跡だけを capacity-relative に消費し、休息時は capacity-relative に回復する。

自動テスト

npm test — PASS

回帰テストは v45 で意図的に簡略化した。確認対象は次の5点のみ。

  1. engine.js?v=45 と feeding.js?v=45 の named export/import が成立する
  2. ユーザー編集水域が変形されない
  3. 3日間の自由移動でスポーン拘束・広範な停止・ping-pong反転が再発しない
  4. 14日以内に出生と純増日が発生し、主要状態が有限値を保つ
  5. home-range、回転対症療法、削除済み experiment API が production code に再混入しない

数式係数・長期較正・複数seedテレメトリは回帰テストから外し、この文書の検証記録として保持する。

v45 module graph 検査

  • production の相対 .js 参照はすべて ?v=45 に統一
  • fieldResourceIntakeKgPerDay export: 存在確認
  • engine.js から同名 import: 存在確認
  • 全 .js/.mjs: node --check PASS
  • Node ESM で engine.js?v=45 読込: PASS

7日移動テレメトリ — 複数seed

seed 生存初期個体 距離 q10 (m) 距離中央値 (m) 停止率 q90 即時反転率 q90
481516 360 203.9 771.0 0.226 0.135
1 327 132.7 585.7 0.238 0.101
123456789 348 127.5 404.1 0.250 0.137
4294967295 343 164.4 520.4 0.214 0.119

ここで距離は「最終位置と、その個体自身の実際の初期位置」の直線距離。固定された home point への復帰処理はない。

365日 run — seed 481516

  • initial population: 404
  • final population: 309
  • minimum population: 244
  • maximum population: 404
  • population-increase days: 68
  • surviving species: 6
  • elapsed: 21.98 s
  • throughput: 16.60 simulated day/s
  • NaN / Infinity: none
  • negative producer / zooplankton biomass: none

個体数は初期値より低下するが単調減少ではなく、純増日が実際に存在する。このテストは「常に増加させる」ためのものではなく、出生が死亡を上回る局面をモデルが取り得ることの回帰検査である。

初期水域

厳密な面積最適化は使用しない。初期 procedural water の半径を sqrt(2) 倍するだけで、v38 wet-cell union に対する比は以下。

seed 面積比
481516 1.9972
1 1.9730
123456789 1.9617
4294967295 1.8248

ユーザーが編集した水域 geometry はそのまま保持するテストを PASS。

工学検査

  • 全 .js/.mjs: node --check PASS
  • local relative import resolution: PASS
  • PARAMETER-PROVENANCE.json: JSON parse PASS
  • no water-depth runtime: PASS
  • no human-disturbance runtime: PASS
  • no experiment/batch API: PASS
  • no detailed diagnostic output: PASS
  • no exact water-area optimizer: PASS
  • no home-range runtime: PASS
  • no rotation/counter-torque workaround in production: PASS

未認証範囲

この検証ではブラウザCanvasを用いた完全E2E操作を認証対象にしていない。Worker/World計算、モジュール構文・依存、移動テレメトリ、長期headless runを検証対象とする。