map/archive/generated-history/STEP6_NOTES.md
2026-08-08 17:41:30 +09:00

207 lines
7 KiB
Markdown

# Step 6 実装・検証記録
## 目的
通常の領域拡張で、初期生成とできるだけ同等の地形・集落・行政・交通品質を得る。特に、次の失敗を候補確定前に排除する。
- 追加範囲のほぼ全域が意図せず海になる
- 陸地はあるが、連結性や開発可能地が乏しい
- 地名・町村・行政中心・交通網の密度が初期生成に比べて著しく低い
- 海岸シーム補正によって、良好な候補地形が結合時に水没する
## 実装概要
### 1. 通常Expansionを初期生成と同じ本番パイプラインへ統合
通常のExpansionは、Step 3の簡易な絶対座標矩形地形を最終候補として使わず、初期生成と同じ本番地形生成器を使用する。
選定済み地形は `terrainOverride` として以下の既存本番工程へ渡される。
1. 地理・水系
2. 集落・都市・土地利用
3. 市町村・都道府県
4. 道路・鉄道
5. 出力・後処理
診断上の生成モードは次の値になる。
```text
expansion-production-quality-selected
```
`productionPipelineParity: true` は、選定された候補が初期生成と同じ人文・行政・交通パイプラインを通過したことを示す。
### 2. 二段階の品質選択
Expansionごとに、指定variantから連続する6候補の本番地形を生成し、まず地形だけを高速評価する。
地形評価項目:
- 陸地率
- 開発可能地率
- 最大連結陸地率
- 既存陸地とのフロンティア接続率
- 海岸線複雑度
- 地形テンプレートごとの許容陸地率
地形上位2候補について本番フルパイプラインを実行し、次を追加評価する。
- 町村・市場・都市・港・行政中心の数
- 初期生成に対する地名密度・集落密度
- 道路・鉄道路線の存在
- 地形品質と人文品質の総合点
上位2候補がどちらも人文品質基準を満たさない場合だけ、第3候補のフル生成を実行する。
### 3. 地形テンプレート別の品質基準
地形タイプに応じて陸地率等の基準を変える。
- `mixed_archipelago`
- `setouchi_inland_sea`
- `kanto_alluvial`
- `chubu_mountain`
- `tohoku_spine`
- `oceanic_archipelago`
明示的な `oceanic_archipelago` だけは、大部分が海である候補を仕様として許可する。通常の `auto` では、海洋専用テンプレートを自動選択対象にしない既存仕様を維持する。
### 4. 結合後の再検査
候補単体で合格しても、シーム結合後に品質が崩れる可能性があるため、最終ワールド上でも再検査する。
- 高所有率の新規内部セルにおける陸地率
- 最終的に残った地名数
- 最終的に残った集落数
- 人文密度の最低値
候補単体と結合後の双方が合格した場合だけ、`candidateQuality.hardPass` が真になる。
### 5. 海岸シーム補正の局所化
従来の標高アフィン補正は、既存側に地形を合わせるためのオフセットと傾きを追加範囲全体へ適用していた。このため、候補段階で十分な陸地があっても、結合時に広域が海面下へ落ちる場合があった。
Step 6では次のように変更した。
- 世界海面高への基準オフセットは全域へ適用
- 既存地形へ合わせる追加オフセット・傾きは、生成済み領域とのフロンティア近傍だけへ適用
- 新規領域の内部へ進むほど補正を減衰
- Expansionの補正上限をRegenerationより小さく制限
これにより、シームの連続性を保ちながら、新規内部では本番地形の陸地統計を維持する。
## UI・診断
Seam diagnosticsに以下を追加した。
- Step 6品質ゲートの合否
- 総合品質スコア
- 選定された内部variant
- 候補陸地率
- 開発可能地率
- 最大連結陸地率
- 候補地名・集落密度
- 結合後の高所有率内部陸地率
- 結合後の地名・集落数
品質基準を完全には満たさない候補しか得られなかった場合は、最良候補を使用しつつ警告を記録する。
## 専用回帰テスト
実行:
```bash
node STEP6_VALIDATION.mjs
```
### 瀬戸内型Expansion
```text
terrain type: setouchi_inland_sea
terrain attempts: 6
full production attempts: 2
selected variant: 4
candidate land ratio: 0.5121
candidate developable ratio: 0.8038
candidate largest component ratio: 0.5153
candidate labels: 82
candidate settlements: 38
final owned-interior land ratio: 0.4626
final labels: 77
final settlements: 40
quality score: 0.9513
quality gate: PASS
```
### Auto Expansion
```text
selected terrain type: mixed_archipelago
terrain attempts: 6
full production attempts: 2
selected variant: 0
candidate land ratio: 0.7398
candidate developable ratio: 0.7126
candidate largest component ratio: 0.7084
candidate labels: 67
candidate settlements: 27
final owned-interior land ratio: 0.6907
final labels: 68
final settlements: 27
quality score: 0.9667
quality gate: PASS
```
両ケースで以下も確認した。
- 道路ポータル切断: 0
- 鉄道ポータル切断: 0
- 二重行政境界候補: 0
## Step 4 / Step 5回帰
既存の交通ポータル・最終ID境界テストを再実行した。
```text
Expansion
mandatory road portals: 1
broken road portals: 0
broken rail portals: 0
duplicate boundary pairs: 0
Regeneration
mandatory road portals: 5
mandatory rail portals: 1
broken road portals: 0
broken rail portals: 0
duplicate boundary pairs: 0
```
全JavaScript/MJSファイルは `node --check` を通過した。
## 制約と設計上の変更
Step 3で導入した絶対座標矩形地形は、同じ絶対座標に対する窓サイズ非依存性を持っていた。Step 6の通常Expansionは品質を優先し、初期生成と同じ本番地形候補を選ぶ方式へ変更したため、候補の地形そのものについて厳密な窓サイズ不変性は保証しない。
代わりに、次で既存世界との整合性を維持する。
- 世界共通海面高
- 双方向オーバーラップ
- 海陸・標高の境界契約
- 交通ポータル
- 最終IDからの行政境界再構築
- 結合後品質検査
また、品質選択のため通常Expansionの処理時間は増える。標準ケースでは地形候補6回とフル生成2回を行い、候補不良時だけフル生成3回目を実行する。
## 既存総合テストとの比較
`node test.js` をStep 4 / Step 5基準版とStep 6版の双方で実行した。
```text
Step 4 / Step 5基準版: 47 failures
Step 6版: 47 failures
差分: 0
```
Step 6導入時に、旧モード名 `expansion-full-pipeline-stable-terrain` を直接検索していたソース検査1件だけを、新しい `expansion-production-quality-selected``prepareProductionTerrain` を確認する検査へ更新した。それ以外の失敗項目は基準版と完全に一致しており、Step 6による総合テスト上の追加失敗はない。