This commit is contained in:
33333-33333 2026-09-29 23:45:12 +09:00
commit f5fc9b76ce
73 changed files with 32628 additions and 376 deletions

View file

@ -1,88 +1,109 @@
# v41 最終監査記録
# v45 検証記録
検証日: 2026-09-29
## 結論
API/詳細診断出力の削除後に再監査した。監査中に、(1) 陸上 producer の shade 二重適用、(2) animal body mass が energy budget と独立して年齢だけで増える不整合を発見し、修正後に全テストを再実行した。
v45 は、報告された「スポーン地点付近から離れない」「停止個体が多い」「境界付近で往復振動する」を、home-range の撤去と移動経路の原因修正で対応した。
このファイルに PASS と書くのは実際に再実行した項目だけとする。
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 に回復する。
## 自動テスト
`node test/ecology.test.mjs` — PASS
`npm test` — **PASS**
対象:
- `dt = 1/24 day`
- Bissinger 10/20/30°C golden values
- aquatic producer = `muMax * min(N,P) * light`
- terrestrial light limitation の一重適用
- assimilation 0.45 / 0.85
- continuous hazard の timestep invariance
- handling time の Holling denominator 接続
- World predation path の local multi-resource saturation
- Rall mass / temperature scaling
- Hirt running / flying / swimming coefficients
- producer field / zooplankton cohort
- parent-surviving reproduction
- energy-limited structural growth
- daily movement budget
- spontaneous immigration/speciation absence
- deterministic repeatability
- 初期水域の概ね2倍化
- user-edited water geometry preservation
- water depth / human disturbance absence
- exact water-area optimizer absence
- experiment API / detailed diagnostic output absence
回帰テストは 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 に再混入しない
production code は半径へ `sqrt(2)` を一度掛けるだけで、面積測定・二分探索は行わない。テスト時のみ v38 と wet-cell union を比較した。
数式係数・長期較正・複数seedテレメトリは回帰テストから外し、この文書の検証記録として保持する。
| seed | v41 / v38 wet-cell area |
### 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。
## 365日 headless
seed 481516、修正後コード:
- elapsed: 7.56 s
- final population: 134
- max agents observed: 416
- surviving species: 6
- producer biomass: 2,364,186.82 kg
- zooplankton biomass: 0 kg
- NaN/Infinity: none
- negative resource biomass: none
- 18,000-agent limit: not reached
## 730日 headless
seed 481516、修正後コード:
- elapsed: 17.40 s
- final population: 264
- surviving species: 5
- producer biomass: 2,493,088.04 kg
- zooplankton biomass: 0 kg
- NaN/Infinity: none
- negative resource biomass: none
- 18,000-agent limit: not reached
ユーザーが編集した水域 geometry はそのまま保持するテストを PASS。
## 工学検査
- 全 `.js/.mjs`: `node --check` PASS
- local relative import reference: PASS
- JSON parse: PASS
- removed experiment API strings: production executable code になし
- removed detailed diagnostic fields: production executable code になし
- 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
## 未解決の較正事項
## 未認証範囲
標準パラメータでは zooplankton cohort が長期的に 0 へ到達する。これは NaN/負値等の実装破綻ではないが、淡水/海洋の長期較正としては未解決。cohort ingestion/mortality と consumer pressure の較正が必要。
また、life-history、resource K、routine movement/home range、energy reserve/growth cost 等には model-calibration 値が残る。文献から直接採用した係数と較正値は `PARAMETER-PROVENANCE.json` で区別する。
この検証ではブラウザCanvasを用いた完全E2E操作を認証対象にしていない。Worker/World計算、モジュール構文・依存、移動テレメトリ、長期headless runを検証対象とする。