food_chain/VALIDATION.md

109 lines
4.9 KiB
Markdown
Raw Permalink Normal View History

2026-09-29 23:45:12 +09:00
# v45 検証記録
2026-09-29 19:10:03 +09:00
検証日: 2026-09-29
## 結論
2026-09-29 23:45:12 +09:00
v45 は、報告された「スポーン地点付近から離れない」「停止個体が多い」「境界付近で往復振動する」を、home-range の撤去と移動経路の原因修正で対応した。
2026-09-29 19:10:03 +09:00
2026-09-29 23:45:12 +09:00
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 に回復する。
2026-09-29 19:10:03 +09:00
## 自動テスト
2026-09-29 23:45:12 +09:00
`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 | 面積比 |
2026-09-29 19:10:03 +09:00
|---:|---:|
| 481516 | 1.9972 |
| 1 | 1.9730 |
| 123456789 | 1.9617 |
| 4294967295 | 1.8248 |
2026-09-29 23:45:12 +09:00
ユーザーが編集した水域 geometry はそのまま保持するテストを PASS。
2026-09-29 19:10:03 +09:00
## 工学検査
- 全 `.js/.mjs`: `node --check` PASS
2026-09-29 23:45:12 +09:00
- 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を検証対象とする。