672 lines
55 KiB
Markdown
672 lines
55 KiB
Markdown
|
|
# 完全生成を維持する冗長・無効・重複・未使用処理 監査報告
|
|||
|
|
|
|||
|
|
- 監査日: 2026-08-11
|
|||
|
|
- 対象: 現在の作業ツリー(追跡済みの変更および未追跡ファイルを含む)
|
|||
|
|
- 改訂条件: **簡易生成は禁止**。生成工程・品質基準・候補比較・最終補修を省略する案は採用しない
|
|||
|
|
- 方法: import・参照・呼び出し・配列同一性・全域走査・公開経路・テスト到達性を対象にした静的監査
|
|||
|
|
- 実施状態: 監査後の安全な修正を適用済み。条件付き削除と shadow 比較が必要な項目は未実施として明記
|
|||
|
|
|
|||
|
|
> 行番号とファイル状態は監査時点の作業ツリーに基づく。作業ツリーには監査開始前から多数の変更、削除、未追跡ファイルがあるため、コミット済みの基準版だけを対象にした結果ではない。
|
|||
|
|
|
|||
|
|
## 0. 実施結果(2026-08-11)
|
|||
|
|
|
|||
|
|
完全生成の candidate plan、quality retry、overscan、full finalist、post-admin transport、visible-crop / seam finalizer は削減していない。実施したのは、公開結果へ反映されない不具合の修復、静的に無効と確定した処理の削除、同一 fixture の共有、テスト実行基盤の修復、完全等価なコピー/比較処理への置換である。
|
|||
|
|
|
|||
|
|
### 実施済み
|
|||
|
|
|
|||
|
|
- A-01: transport 配列の stale alias を解消し、late cleanup が公開 `features.*` と同じ配列を処理するよう修正。配列同一性 invariant も追加した。
|
|||
|
|
- A-02 / A-07c / A-12 / A-14g: suite registry を一元化し、未知 suite / group を即失敗、generic determinism seed を修正、出力収集を共有 byte counter と chunk 連結へ変更し、test failure と infrastructure failure を分離した。
|
|||
|
|
- A-04 / A-05: 未使用の全域 `barrierCost` / `corridorCost` 構築と、結果を破棄していた結合 railway prune を削除した。
|
|||
|
|
- A-07: default の重複 seed 999 determinism を削除し、seed 54321 の variation assertion を既存 terrain map へ移した。coverage-hole best-of は既存 coverage suite に統合し、同一初期 map を共有する。
|
|||
|
|
- A-07: temp/debug 3本、置換済み best-of 単独テスト、旧 determinism helper を削除した。raw-worker browser harness 2本も、上位の実アプリ browser suite に統合済みのため削除した。
|
|||
|
|
- A-11: source text は core suite でのみ遅延読込し、`mapPipeline.js` の二重読込と `test.js` 自己読込を除去した。typed-array determinism 比較は配列化/JSON化せず直接比較する。
|
|||
|
|
- A-14a: viewport raster はセル単位 lookup から、clipping を保つ typed-array row copy へ置換した。負座標・fallback cell の回帰検査を追加した。
|
|||
|
|
- A-14f: production fixture の seed hash と最大 lasso 構築を `tests/production-fixtures.mjs` に共通化した。
|
|||
|
|
- A-15: local dead function / closure、未使用 import・束縛・引数、`stableWorldTerrain`、無効な radial fallback、no-op UI、未使用 CSS selector / custom property / transition、同一 CSS block を整理した。
|
|||
|
|
- repo 内参照ゼロかつ package 公開定義もない `mapAdminSeedLifecycle.js`、`adminRegions.js`、`mapGenerator.js` を削除した。
|
|||
|
|
- default / release / browser manifest を README に記載し、Windows の Edge を direct-CDP fallback として検出できるようにした。
|
|||
|
|
|
|||
|
|
### 検証結果
|
|||
|
|
|
|||
|
|
- 変更前 canonical baseline: terrain 3件、patch 3件の計6件が既存失敗。runner が通常の assertion failure まで infrastructure failure に誤分類していた。
|
|||
|
|
- 変更後: unit、coverage、core、terrain-name、admin、patch-large、determinism 4 seed、r10 exact-production、r11 selection-native-production、r11.8 を実行。新規の機能失敗はなく、terrain 3件と patch 3件は変更前と同一である。
|
|||
|
|
- r10 は optimized / exhaustive の variant と最終 score が一致し、簡易 human / transport draft を公開していない。r11 は selection-native full production と transport hard gate を通過した。
|
|||
|
|
- 実アプリ browser smoke は preview 公開、canvas 変更、完全 stats、Apply、mirror ACK、bounded progress を通過した。一方、この環境では 60秒の性能予算に対して74.55秒であり、性能 gate は緩和していない。
|
|||
|
|
- r11.6 の3候補 full-production 比較は、この環境で旧130秒およびrunner 300秒を超えた。候補数を減らさず timeout の不整合だけを540秒/600秒へ修正したが、延長後の完走は未確認である。
|
|||
|
|
|
|||
|
|
### 未実施・保留
|
|||
|
|
|
|||
|
|
- runner が参照する r10 / r11 系テスト、Node wrapper、今回追加した fixture helper と本監査文書は作業ツリーでは未追跡である。Git index / commit の操作は行っていないため、採用時は runner・README・依存ファイルを同一 commit に含める必要がある。
|
|||
|
|
- A-06b / A-06d: rect-native terrain と旧 raw-draft worker protocol は repo 内未到達だが、export / message protocol の外部互換確認が必要なため削除していない。
|
|||
|
|
- `prepareProductionTerrain`、`generateMapAsync`、`generateAdminLayout` 等の未参照 export は、外部 direct import 契約を確定できないため残した。
|
|||
|
|
- A-08〜A-10、A-13、A-14b〜A-14e の高コスト反復・同期非同期統合は、全 seed / mode / shape の shadow 比較と座標・metadata の完全一致が必要である。観測 seed だけを根拠に pass を削除する変更は行っていない。
|
|||
|
|
- r11.5 / r11.7 / r11.8 の seed 共有統合、maximum-worker と selection-native の同一候補共有は、各契約を一つの worker lifecycle に移植する追加作業が必要である。
|
|||
|
|
|
|||
|
|
## 1. 監査の絶対条件
|
|||
|
|
|
|||
|
|
本監査の目的は、完全生成の内容を軽くすることではない。同じ完全生成を、不要な計算・複製・再走査・重複実装なしで実行できる状態にすることである。
|
|||
|
|
|
|||
|
|
### 1.1 禁止事項
|
|||
|
|
|
|||
|
|
次の変更は、処理時間やコード量が減っても採用対象外とする。
|
|||
|
|
|
|||
|
|
- terrain-scout、draft、proxy、private tile の内容を公開結果として再利用する。
|
|||
|
|
- geography、settlement、admin、transport、visible-crop finalizer、seam / quality audit のいずれかを省略する。
|
|||
|
|
- candidate 数、quality retry、overscan、探索範囲、経路制約、密度基準を性能目的で引き下げる。
|
|||
|
|
- admissible でない近似 score や経験的閾値により、勝ち得る候補を full production 比較前に捨てる。
|
|||
|
|
- terrain-routed path を直線、snapped line、簡易 connector へ置換する。
|
|||
|
|
- test の assertion、seed、異なる option の fixture、browser / worker / cancel / mirror 契約を、実行時間短縮だけを理由に削る。
|
|||
|
|
- quality gate を緩和し、処理が速くなったことを最適化の成功とみなす。
|
|||
|
|
|
|||
|
|
### 1.2 現行の完全生成契約
|
|||
|
|
|
|||
|
|
現行コードには、候補選別用の terrain-scout がある。これは公開可能な簡易生成ではなく、次の条件でのみ許容されている非公開の前段評価である。
|
|||
|
|
|
|||
|
|
- `src/mapPatchWorker.js:1969-1981` は full candidate 実行時に `_precomputedDraftCandidate: null` を明示し、再利用を exact terrain field に限定する。
|
|||
|
|
- `src/mapPatch.js:12945-12955` は公開候補で full patch candidate を生成し、簡略 geography / human / transport draft を再利用しない。
|
|||
|
|
- `src/mapPatchWorker.js:2158-2160` は `reusedWinningDraft: false`、`fullProductionFromTerrainOnly: true` を記録する。
|
|||
|
|
- `tests/r10-exact-production-worker.mjs:62-72` は optimized search と exhaustive full-production search の variant と score の一致、および簡略 output の非公開を検証する。
|
|||
|
|
- `src/mapPostAdminTransport.js:4008-4015` と `tests/r11.5-visible-quality-finalizer.mjs:115-120` は visible crop に full production finalizer を要求する。
|
|||
|
|
|
|||
|
|
この契約を弱める変更は、本監査の「短縮」には含めない。scout 自体の範囲を広げる案も出さない。
|
|||
|
|
|
|||
|
|
### 1.3 private tile の扱い
|
|||
|
|
|
|||
|
|
大矩形生成では、一部の global repair を private tile 内で遅延し、組立後の selection 全体で実行する経路がある (`src/mapTransport.js:56-59,1318-1327`、`src/mapFeatures.js:2644-2659`)。これは、次の全条件を満たす場合に限り簡易生成とは扱わない。
|
|||
|
|
|
|||
|
|
- tile は単独で公開されない。
|
|||
|
|
- `src/mapPatch.js:12831-12837` の品質 soft path は `_internalTile === true` の場合だけである。
|
|||
|
|
- 組立後に authoritative trunk generation、terrain repair、seam audit、Initial Quality Oracle を完走する。
|
|||
|
|
- top-level candidate は同じ soft path を利用できない。
|
|||
|
|
|
|||
|
|
この境界は将来の refactor で崩れやすいため、明示的な invariant test を残す。
|
|||
|
|
|
|||
|
|
### 1.4 用語上の非対象
|
|||
|
|
|
|||
|
|
- `src/app.js` / `src/renderer.js` の `fastTerrain` は pan / zoom 中の描画省略であり、保存される map generation の簡略化ではない。
|
|||
|
|
- `src/mapAdminStage.js:212-264` の `simple administrative hierarchy` / `simpleHierarchyPrototype` は現行 production stage の方式名であり、別の軽量 generator への分岐ではない。名称だけを根拠に未使用・簡易生成とは判定しない。
|
|||
|
|
- `src/mapPatchWorker.js:2161` の `parallelDraftGeneration` は互換目的で残る旧 metadata 名で、現在の実体は terrain-scout である。改名する場合も protocol 互換を先に確認する。
|
|||
|
|
|
|||
|
|
### 1.5 最優先の結論
|
|||
|
|
|
|||
|
|
最優先で扱うべきなのは、単なる整理ではなく、実行した完全生成処理が公開結果へ反映されていない箇所と、検証していないテストが成功扱いになる箇所である。
|
|||
|
|
|
|||
|
|
1. `src/mapPostAdminTransport.js` の最終道路監査の一部は、古い配列別名を変更しており、公開される `features.*` には反映されない。
|
|||
|
|
2. `tests/test.js` は未知の suite 名でも実質的に検証をせず成功し得る。
|
|||
|
|
3. 地物生成では、どこからも使われない2枚の全画面コストラスタを毎回構築している。
|
|||
|
|
4. 鉄道の parallel prune は、一度目が一時配列だけを変更して結果を破棄し、その直後に実配列へ同種処理を繰り返す。
|
|||
|
|
5. repo 内から到達しないモジュール・関数群、到達不能な temp テスト、同一 seed / fixture の重複生成が複数ある。
|
|||
|
|
6. post-admin transport などの反復修復は削減余地が大きいが、順序依存が強い。出力等価性を証明せず、pass を省略・簡略化してはならない。
|
|||
|
|
|
|||
|
|
監査で分類した確信度は次の通り。
|
|||
|
|
|
|||
|
|
- **確定**: 現在の repo 内参照、値の使用、または配列同一性から、未使用・無反映・重複を静的に証明できる。
|
|||
|
|
- **条件付き**: repo 内からは未使用だが、外部 import、外部 CI、手動実行の契約が見えない。
|
|||
|
|
- **要計測**: 処理の反復や走査は多いが、代表 seed で差分ゼロというだけでは削除できない。全対象条件で不要と証明するか、同じ変換を一度で行う等価実装へ置換するもの。
|
|||
|
|
|
|||
|
|
## 2. 優先順位一覧
|
|||
|
|
|
|||
|
|
| ID | 優先度 | 分類 | 要点 | 判定 | 修正リスク |
|
|||
|
|
|---|---:|---|---|---|---:|
|
|||
|
|
| A-01 | P0 | 無反映 | final transport cleanup が stale alias を変更 | 確定 | 中 |
|
|||
|
|
| A-02 | P0 | 無意味な検証 | 未知 suite が検証なしで成功し得る | 確定 | 低 |
|
|||
|
|
| A-03 | P0 | 再現性 | canonical runner / README が未追跡テストを必須参照 | 確定・作業ツリー依存 | 中 |
|
|||
|
|
| A-04 | P1 | 無使用計算 | `barrierCost` / `corridorCost` の全域構築結果が不使用 | 確定 | 低 |
|
|||
|
|
| A-05 | P1 | 無反映 | 一時的な結合鉄道配列への prune 結果を破棄 | 確定 | 低 |
|
|||
|
|
| A-06 | P1 | 不使用 | rect-native terrain 系と seed lifecycle が repo 内未到達 | 条件付き | 低〜中 |
|
|||
|
|
| A-07 | P1 | 重複 | 同じ seed / fixture の full-map・worker 生成を重複実行 | 確定 | 低〜中 |
|
|||
|
|
| A-08 | P1 | 迂遠 | transport dedupe・repair・prune の多段反復 | 要計測 | 中〜高 |
|
|||
|
|
| A-09 | P1 | 迂遠 | 自治体ごとの全域走査、人口再推定、合併反映の反復 | 確定 | 中 |
|
|||
|
|
| A-10 | P1 | 重複 | worker / pipeline の同期・非同期実装が大規模重複 | 確定 | 中〜高 |
|
|||
|
|
| A-11 | P1 | 低効果テスト | 大量のソース文字列 `includes` 検査 | 確定 | 中 |
|
|||
|
|
| A-12 | P1 | 迂遠 | test runner の出力連結が出力量に対して二次的 | 確定 | 低 |
|
|||
|
|
| A-13 | P1 | 迂遠 | crop の小範囲探索ごとに全寸法 workspace を確保 | 確定 | 中 |
|
|||
|
|
| A-14 | P2 | 重複 | UI診断、preview差分、mirror protocol、A* 等の重複 | 確定 | 低〜高 |
|
|||
|
|
| A-15 | P2 | 不使用 | local helper、import、分割代入、CSS、DOM経路 | 確定 | 極低〜低 |
|
|||
|
|
|
|||
|
|
P0 は正しさ・検証信頼性の問題、P1 は大きな計算量または保守コスト、P2 は安全に整理しやすい局所項目、P3 は小規模なコード整理を表す。
|
|||
|
|
|
|||
|
|
実施区分は優先度とは別に扱う。
|
|||
|
|
|
|||
|
|
- **正しさの修復:** A-01〜A-03。現状の無反映や偽成功を直すため、出力差分が発生し得る。
|
|||
|
|
- **意味を変えない除去:** A-04、A-05、A-15の確定項目。未使用結果または破棄済み結果だけを取り除く。
|
|||
|
|
- **外部契約確認後の除去:** A-06。repo 内参照ゼロだけで公開 API を消さない。
|
|||
|
|
- **完全生成の等価最適化:** A-07〜A-14。生成段階や品質基準は減らさず、同一計算の共有、workspace 再利用、全域走査の一括化、実装共通化だけを行う。
|
|||
|
|
|
|||
|
|
## 3. 公開結果へ反映されない、またはほぼ無意味な処理
|
|||
|
|
|
|||
|
|
### A-01. stale alias により final transport cleanup が公開結果へ反映されない
|
|||
|
|
|
|||
|
|
**根拠**
|
|||
|
|
|
|||
|
|
- `src/mapPostAdminTransport.js:1073-1077` で `features.minorRoads`、`nationalRoads`、`externalRoads`、`expressways`、`externalExpressways` を `const` のローカル別名へ保持する。
|
|||
|
|
- `src/mapPostAdminTransport.js:3838-3842` は `dedupePaths(..., { mutate: false })` の戻り値を `features.*` へ再代入する。
|
|||
|
|
- `src/mapTransportUtils.js:193-228` の `dedupePaths` は `mutate: false` の場合、新しい配列と座標列を返す。この時点で冒頭の別名は古い配列を指す。
|
|||
|
|
- その後の `src/mapPostAdminTransport.js:3886` は `pruneShortFinalTrunkSegments()` を呼ぶが、同関数の `3778-3813` は古い `expressways`、`nationalRoads`、`minorRoads` を変更する。
|
|||
|
|
- `src/mapPostAdminTransport.js:3891-3894` の shared-alignment / parallel-prune も古い配列を変更する。
|
|||
|
|
|
|||
|
|
このため、次の診断名で数えた変更は、公開される `features.*` に反映されない。
|
|||
|
|
|
|||
|
|
- `finalShortTrunkCleanupAfterService`
|
|||
|
|
- `finalExpresswaySharedAlignment`
|
|||
|
|
- `finalNationalSharedAlignment`
|
|||
|
|
- `finalExpresswayParallelPruneExactOutput`
|
|||
|
|
- `finalNationalParallelPruneExactOutput`
|
|||
|
|
|
|||
|
|
なお、直後の major-city link 補完など、明示的に `features.*` を渡す処理まで無効という意味ではない。
|
|||
|
|
|
|||
|
|
**短縮・是正案**
|
|||
|
|
|
|||
|
|
- 配列の identity を維持する in-place 正規化へ統一する、または再代入後はローカル別名を廃止し `features.*` だけを参照する。
|
|||
|
|
- 修正すると、今まで死んでいた prune が実際に出力を変える可能性がある。出力差分を仕様として確認し、`features.*` と処理対象の identity を検証する回帰テストを先に置く。
|
|||
|
|
- **禁止:** 無反映だった pass 自体を削除して「無駄を除いた」とはしない。本来要求された full final cleanup を実配列へ適用するのが先である。
|
|||
|
|
|
|||
|
|
### A-04. 不使用の全域コストラスタを毎回構築
|
|||
|
|
|
|||
|
|
**根拠**
|
|||
|
|
|
|||
|
|
- `src/mapFeatureContext.js:64-65` は `barrierCost` と `corridorCost` の `Float32Array` を確保する。
|
|||
|
|
- 同ファイル `72-74`、`162-163` で全セルを走査し、hash を含む値を格納する。
|
|||
|
|
- `src/mapFeatures.js:94-95` は両者を分割代入するが、その後一度も読む箇所がない。repo 内にも別の利用者はない。
|
|||
|
|
|
|||
|
|
hidden generation の 354 × 279 = 98,766 セルでは、配列本体だけで約 790 KB を一時保持し、さらに全域の演算を行う。結果が使われないため、計算・メモリとも削除候補である。
|
|||
|
|
|
|||
|
|
**短縮案**
|
|||
|
|
|
|||
|
|
- 2配列の確保、代入、返却、受け取りをまとめて除去する。
|
|||
|
|
- その結果 `mapFeatureContext.js` の `INF` import 等が未使用になる場合は同時に整理する。
|
|||
|
|
|
|||
|
|
### A-05. 一時的な結合鉄道配列への高コスト prune を破棄
|
|||
|
|
|
|||
|
|
**根拠**
|
|||
|
|
|
|||
|
|
- `src/mapTransportOD.js:387-392` は `[...railways, ...branchRailways]` という一時配列へ `pruneParallelSameMode` を実行する。
|
|||
|
|
- `src/mapFeatures.js:1777-1836` の処理は、サンプリングと平行判定を行い、渡された配列そのものを変更する。
|
|||
|
|
- 一時配列はその後使われず、直後の `src/mapTransportOD.js:395-406` で実際の各レイヤーへ同種の prune を再実行する。
|
|||
|
|
|
|||
|
|
一度目は出力を変えず、得られる debug 値も公開配列への効果を表していない。
|
|||
|
|
|
|||
|
|
**短縮案**
|
|||
|
|
|
|||
|
|
- 一度目を削除する。
|
|||
|
|
- 結合ネットワークの監査値が必要なら、変更しない専用 audit 関数へ分離する。
|
|||
|
|
- rail / branch の実配列に対する2回目以降の production prune は残す。変更前後の公開経路配列が一致することを確認する。
|
|||
|
|
|
|||
|
|
### A-15a. 常時 no-op の UI / production 小項目
|
|||
|
|
|
|||
|
|
| 場所 | 状態 | 推奨 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| `src/app.js:90,2031,2048` | `floatingLegendGrid` に対応する DOM id が `index.html` にない。null guard で毎回終了し、`rows.slice(0, 5)` だけ発生 | 廃止済みなら query と描画呼び出しを削除。必要機能なら DOM を復元 |
|
|||
|
|
| `src/mapPatch.js:12851` | `seamHardFailed` を計算するが参照しない | 式ごと削除 |
|
|||
|
|
| `src/mapPostAdminTransport.js:2858` | `urbanStreetDebug` を構築するが参照しない。直後に同等の debug flag を個別設定 | オブジェクト構築を削除 |
|
|||
|
|
| `src/mapPostAdminTransport.js:4118` | `desiredGap = 15.75` は不使用。実処理は別の動的間隔を使う | 宣言と、それを存在確認する source-string テストを削除・置換 |
|
|||
|
|
| `src/mapPatchWorker.js:2192-2208` | `materializeAndPublish` closure は定義のみ | 削除 |
|
|||
|
|
| `src/mapTerrain.js:13-20` | `createExactNoiseMemo` の空 `latticeBySeed` と `exactDirectNoise` に利用者がない | 互換契約がなければ返却値を簡素化 |
|
|||
|
|
| `src/mapTransportUtils.js:110-125` | 有限かつ非負の通常 radius では radial-kernel fallback に到達しない | 無効値を明示 reject し fallback を削除 |
|
|||
|
|
|
|||
|
|
## 4. repo 内未使用・未到達の処理
|
|||
|
|
|
|||
|
|
### A-06a. `mapAdminSeedLifecycle.js` 全体
|
|||
|
|
|
|||
|
|
`src/mapAdminSeedLifecycle.js` は約198行で、以下を export するが、現 repo 内に import / 呼び出しがない。
|
|||
|
|
|
|||
|
|
- `absorbSeedCompartments` (`:4`)
|
|||
|
|
- `splitOversizedLowlandsWithPendingSeeds` (`:26`)
|
|||
|
|
- `promotePendingSeedsForMunicipalityCount` (`:95`)
|
|||
|
|
- `restoreSurvivedSeedsByCompartment` (`:156`)
|
|||
|
|
|
|||
|
|
**判定:** repo 内では未到達。外部 import がないことを確認できればファイル単位で削除できる。
|
|||
|
|
|
|||
|
|
### A-06b. rect-native terrain 系
|
|||
|
|
|
|||
|
|
`src/mapTerrain.js:1323-1999` の rect 専用 helper 群と、次の export は repo 内から参照されない。
|
|||
|
|
|
|||
|
|
- `generateTerrainRect` (`src/mapTerrain.js:1842`)
|
|||
|
|
- `finalizeRectTerrainForFixedMap` (`src/mapTerrain.js:1967`)
|
|||
|
|
|
|||
|
|
`src/rectContext.js` は `mapTerrain.js` から静的 import されるものの、その export はこの未呼び出し経路でしか使われない。rect 経路を除去すれば import と同モジュール全体も不要になり、合わせて約760行規模になる。
|
|||
|
|
|
|||
|
|
**判定:** 削減効果は大きいが export を含む。外部 API / 手動スクリプトの利用確認後に、経路と `rectContext.js` を一括で扱う。
|
|||
|
|
|
|||
|
|
### A-06c. repo 内未参照の facade / export 候補
|
|||
|
|
|
|||
|
|
| 場所 | 状態 |
|
|||
|
|
|---|---|
|
|||
|
|
| `src/adminRegions.js` | 1行の re-export facade。repo 内参照なし |
|
|||
|
|
| `src/mapGenerator.js` | 1行の re-export facade。repo 内参照なし |
|
|||
|
|
| `src/mapPipeline.js:118-130` | `prepareProductionTerrain` は定義 / export のみ |
|
|||
|
|
| `src/mapAdminStage.js:509` | `generateAdminLayout` は呼び出しなし(名称を含むエラー文字列はある) |
|
|||
|
|
| `src/mapPipeline.js:388` | `generateMapAsync` は未参照 facade からの re-export だけ |
|
|||
|
|
|
|||
|
|
いずれも repo 内では削除候補だが、公開 entrypoint として外から import されていないかを確認する。
|
|||
|
|
|
|||
|
|
### A-06d. terrain-scout 移行後に残った旧 draft protocol
|
|||
|
|
|
|||
|
|
現行 production の candidate search は `src/mapPatchWorker.js:1745-1753` から `evaluatePatchDraftCandidate` を呼ぶ際、常に `_terrainScoutOnly: true` を渡す。そのため `src/mapPatch.js:9757-9758` で terrain-scout へ即委譲し、`:9759-9879` の旧 draft 本体へ到達しない。ここでいう未到達部分は公開候補の full production 本体ではない。
|
|||
|
|
|
|||
|
|
この変更に追随せず残っている経路は次の通り。
|
|||
|
|
|
|||
|
|
- `src/mapPatch.js:9881-9901` の `buildRawPatchDraftRequest` は定義のみ。
|
|||
|
|
- `src/mapPatchWorker.js:150-159` の `precomputeRawDraftBatch` は dependency object (`:2674`) に載せるだけで、dependency を読む箇所がない。
|
|||
|
|
- その配下の `runRawDraftTask` (`:129-131`) と `generate-raw-patch-draft` message 分岐 (`:112`) も内部到達不能になる。
|
|||
|
|
- `src/patchCandidateWorker.js:38-43` の draft message 分岐、旧 full-draft 側だけが使う `continueMapDraftFromTerrain` (`src/mapPipeline.js:222`) と `generateMapDraft` (`:268`) も同じ互換クラスタに属する。
|
|||
|
|
- `src/mapPatch.js:2` の `generateMapDraft` import は既に完全未使用である。
|
|||
|
|
|
|||
|
|
**判定:** current app から辿る production path では未到達。ただし worker message protocol、外部 import、テストの source assertion に互換目的がある可能性がある。message type と公開 export の廃止を一つの変更として宣言し、呼び出し元がないことを確認してからクラスタ単位で削除する。
|
|||
|
|
|
|||
|
|
**完全生成上の境界:** 削除対象は旧 `generate-raw-patch-draft` 互換クラスタだけである。`generatePatchCandidate`、`generateMap`、full finalist 実行、terrain 以外の全 production stage、組立後 finalizer は削除・迂回しない。旧 draft 経路を消すことを、scout output の公開許可と組み合わせてはならない。
|
|||
|
|
|
|||
|
|
### A-15b. local dead code
|
|||
|
|
|
|||
|
|
以下は export されず、識別子の repo 内出現が定義だけである。外部 API よりも安全に削除しやすい。
|
|||
|
|
|
|||
|
|
- `src/mapPatch.js:1525-1535` `dedupeSegments`
|
|||
|
|
- `src/mapPatch.js:6726-6757` `buildBoundarySegmentsFromField`
|
|||
|
|
- `src/mapPatch.js:6759-6784` `buildMaskBoundarySegmentsFromField`
|
|||
|
|
- `src/mapPatch.js:8836-8838` `rectKey`
|
|||
|
|
- `src/renderer.js:402-408` `mixRgb`
|
|||
|
|
- `src/renderer.js:865` `drawLandRailway`
|
|||
|
|
- `src/mapTerrain.js:24-29` `normalizeCoord`
|
|||
|
|
- `src/mapTerrain.js:37-41` `rotate`
|
|||
|
|
|
|||
|
|
### A-15c. 未使用 import・引数・分割代入・戻り値束縛
|
|||
|
|
|
|||
|
|
| 場所 | 未使用項目 | 注意 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| `src/mapMunicipalDemography.js:1` | `MAP_W`, `SIZE`, `clamp` | import から除去 |
|
|||
|
|
| `src/mapPatch.js:2` | `generateMapDraft` | import から除去 |
|
|||
|
|
| `src/mapFeatures.js:94-95` | `barrierCost`, `corridorCost` | A-04 と同時に producer も除去 |
|
|||
|
|
| `src/mapOutput.js:350` | `stationInfluence` | contract を確認して除去 |
|
|||
|
|
| `src/mapTransport.js:43,45-46` | `externalRailways`, `regionStats`, `inFocusedPrefecture`, `importantNodesForRegion` | builder の受取項目を整理 |
|
|||
|
|
| `src/mapTransportOD.js:23` | `agriculture` | 受取項目を整理 |
|
|||
|
|
| `src/mapPatch.js:11897` | `aggregateAdministrativeMetadataAfterCapitals` の戻り値束縛 | 呼び出しには副作用があり得るため、束縛だけ除去 |
|
|||
|
|
| `src/mapPrefectureStage.js:977-979` | 3つの `changedFor...` counter | 呼び出しは状態を変更するため残し、未使用の束縛だけ除去 |
|
|||
|
|
|
|||
|
|
### A-15d. 無用な option / 引数の受け渡し
|
|||
|
|
|
|||
|
|
| 場所 | 状態 | 推奨 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| `src/mapPatch.js:9396,9524,9692,9779,13281,13359,13408,13481`、`src/mapPipeline.js:121` | `stableWorldTerrain` を渡すだけで、repo 内に読み取りがない | option を削除 |
|
|||
|
|
| `src/mapPipeline.js:30` と `src/mapPatch.js` 各所 | `legacyTerrain` は metadata へコピーまたは `true` を渡すだけで、制御・計算には使わない | 出力 schema の互換性を確認後に除去 |
|
|||
|
|
| `src/initialGenerationCrop.js:811` | `repair(..., outputPaths, ...)` は `outputPaths` を読まない | 引数と全 call-site の渡し値を除去 |
|
|||
|
|
| `src/mapPostAdminTransport.js:4201` | `snapNearMissEndpoints(..., outPaths, ...)` は `outPaths` を読まないが、多数の call-site が渡す | 引数と渡し値を除去 |
|
|||
|
|
| `src/mapPostAdminTransport.js:1065` | `finalizeAdminAwareTransport` の `geography` は signature だけ。pipeline の `generationContext` は callee で bind もされない | call contract を縮小 |
|
|||
|
|
| `src/mapAdminStage.js:117-135` | `villageInfluence`、`industrialZones`、`logisticsParks`、`geographicBarrierCost` は signature のみ。`stations` は未使用引数として次段へ渡すだけ | producer / consumer 間で段階的に除去 |
|
|||
|
|
|
|||
|
|
`stableWorldTerrain` は挙動への効果がないことを repo 内で確認できる。`legacyTerrain` は計算には不要でも serialized metadata を外部が読む可能性があるため、同じ確信度で即削除とはしない。
|
|||
|
|
|
|||
|
|
## 5. 短縮できる高コスト・迂遠処理
|
|||
|
|
|
|||
|
|
### A-08. post-admin transport の dedupe / repair / prune 反復
|
|||
|
|
|
|||
|
|
`src/mapPostAdminTransport.js` では、修復で経路を追加し、dedupe / prune を行い、service repair で再追加する流れが `3838-4006` と `4395-4701` に集中している。
|
|||
|
|
|
|||
|
|
主な呼び出し回数(関数定義を除く)は次の通り。
|
|||
|
|
|
|||
|
|
- `dedupePaths`: 69回
|
|||
|
|
- major-city national link 補完: 14回
|
|||
|
|
- major-city rail link 補完: 16回
|
|||
|
|
- major-city expressway link 補完: 12回
|
|||
|
|
- parallel corridor collapse: 15回
|
|||
|
|
- final parallel prune: 13回
|
|||
|
|
- rail / national ratio の densify: 9回
|
|||
|
|
- rail / national ratio の cap: 9回
|
|||
|
|
|
|||
|
|
`dedupePaths` は `mutate: false` の場合、重複がゼロでも全 path と全 `[x, y]` を複製する。さらに `src/mapTransportUtils.js:213-219` は各 path 内で署名関数を作り、`map` / `filter` / `join` を往復2回、逆順用の配列も生成する。
|
|||
|
|
|
|||
|
|
**短縮案**
|
|||
|
|
|
|||
|
|
1. network ごとの revision / dirty flag を持ち、変更されていない配列の再正規化だけを省く。正規化の semantic boundary は移動しない。
|
|||
|
|
2. repair 群を上限付き収束ループへまとめる場合、従来の pass 順、上限、tie-break を維持し、state revision が不変のときだけ終了する。
|
|||
|
|
3. 各 stage の add / remove / replace 件数を seed corpus で記録する。ただし、観測した seed で0だったことだけを根拠に pass を削除しない。静的 precondition または shadow 実行との完全一致を削除条件にする。
|
|||
|
|
4. path signature は helper を外へ出し、一時配列を作らない添字走査にする。
|
|||
|
|
|
|||
|
|
順序を変えると地図出力が変わるため、一括統合はしない。これは完全生成 pass の削減案ではなく、同じ pass の重複実行・全量複製を対象にした等価最適化候補である。各変更で path 順序、座標列、debug counter、最終 hash の一致を要求する。
|
|||
|
|
|
|||
|
|
### A-09a. 自治体 topology repair の O(所有者数 × 全セル) 走査
|
|||
|
|
|
|||
|
|
`src/adminRegionsCore.js:5-97` の `enforceMunicipalityConnectivityStrict` は、全所有者の component を一度の全域走査で集める。一方 `repairAdminTopology` (`:117-143`) は所有者ごとに `Uint8Array(SIZE)` を確保し、全セルを走査する。同処理は `:1132`、`:1262` から呼ばれる。
|
|||
|
|
|
|||
|
|
**短縮案:** 共通の `collectComponentsByOwner` を一度実行し、中心 component の保護・再割当規則だけを各処理へ残す。owner 順、component 探索順、同点時の再割当先を変えない。
|
|||
|
|
|
|||
|
|
### A-09b. 人口再推定と合併反映の全域走査
|
|||
|
|
|
|||
|
|
- `src/mapAdminStage.js:386` で人口を推定する。
|
|||
|
|
- 合併があると `:478` で再推定し、その直後 `:500` でも無条件に再推定する。
|
|||
|
|
- 合併先ごとに `:459-461` が `adminId` 全域を再走査する。
|
|||
|
|
- 実体の `src/mapMunicipalDemography.js:13-42` もラスタ全域を走査する。
|
|||
|
|
|
|||
|
|
無合併でも推定2回、合併時は3回になり得る。合併先 remap を蓄積して最後に一度だけ全域へ適用し、変更なしなら初回推定を再利用、変更ありなら最後に一度だけ再推定できる。ただし、中間推定値を読む処理がないことを call graph と regression test の両方で確認し、人口モデル自体は変更しない。
|
|||
|
|
|
|||
|
|
### A-13. 小さな local connector ごとの全寸法 workspace
|
|||
|
|
|
|||
|
|
`src/initialGenerationCrop.js:749-890` の `localConnector` は、小さな bbox と展開上限360で探索する一方、呼び出しごとに全マップ寸法の `Float32Array`、`Int32Array`、`Uint8Array` を確保・初期化する (`:768-774`)。open set も線形最小値探索と `splice` を使う (`:776-782`)。
|
|||
|
|
|
|||
|
|
**短縮案:** bbox 分だけの配列、世代番号付きの再利用 workspace、binary heap のいずれかへ置換する。類似する `src/mapPostAdminTransport.js:4201-4260` の near-miss endpoint repair と共通化できるが、hidden crop の寸法差は明示的に注入する。heap 化では同 cost の取り出し順が変わるため、既存の tie-break を key に含め、経路座標の完全一致を合格条件にする。
|
|||
|
|
|
|||
|
|
### A-14a. viewport raster をフィールドごと・セルごとにコピー
|
|||
|
|
|
|||
|
|
`src/worldViewport.js:66-80` は各フィールドについて全 x / y を走査し、各セルで `worldIndexOf` を呼ぶ。この処理が `:205-208` から多数の raster に繰り返される。`src/initialGenerationCrop.js:110-118` には既に `subarray` + `set` による行単位コピーがある。
|
|||
|
|
|
|||
|
|
**短縮案:** 行ごとの source / destination 範囲を一度求め、範囲内を bulk copy、画面外だけ既存値で fill する。負の camera 座標、部分領域外、各 typed-array constructor について cell-by-cell 実装との完全一致を検証する。
|
|||
|
|
|
|||
|
|
### A-14b. admin target / compartment / output の反復走査
|
|||
|
|
|
|||
|
|
| 場所 | 現状 | 短縮案 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| `src/mapAdminCompartmentRepair.js:208-315,608-615` | owner 一覧を typed array の spread / filter / Set で毎回作り、owner ごとに全 compartment を filter | 1巡で `Map<owner, compartments[]>` を構築 |
|
|||
|
|
| `src/mapAdminTargets.js:31-55` | 一度全域走査した直後に `basinField` を spread / filter して再集計 | 初回走査で basin 数も加算 |
|
|||
|
|
| `src/mapAdminTargets.js:160-168` | 各セルで全 `modernCities` に `some` + `Math.hypot` | dense-core mask の事前 raster 化または spatial index |
|
|||
|
|
| `src/mapOutput.js:495-517` | 各中心について same-admin / fallback の2段階で全 feature を走査 | feature の admin id を一度付け、1巡で bestSame / bestAny を更新 |
|
|||
|
|
| `src/mapAdminUrbanCatchments.js:64-92` | satellite ごとに全都市を複製・距離 sort して先頭だけ使用 | 二乗距離の線形 min scan。satellite index も一度だけ取得 |
|
|||
|
|
|
|||
|
|
これらは生成規則の近似化ではない。同じ候補集合と同じ tie-break から同じ結果を得る、走査回数と一時配列だけの削減である。
|
|||
|
|
|
|||
|
|
## 6. 重複実装と仕様ずれの温床
|
|||
|
|
|
|||
|
|
### A-10a. `mapPatchWorker` の同期・非同期探索
|
|||
|
|
|
|||
|
|
`src/mapPatchWorker.js:1150-1518` と `:1522-2608` は、初期化、候補 prepare / evaluate / finalize、snapshot 構築を数百行規模で重複する。通常候補探索だけでも `:1241-1517` と `:2328-2607` がほぼ同じである。
|
|||
|
|
|
|||
|
|
**統合案:** search environment と候補処理を共通化し、同期 executor と yield / cancel 対応 executor の違いだけを wrapper に残す。候補数や full-finalization 数は減らさず、進捗イベント順、cancel 境界、transaction rollback、candidate ranking を契約テストで固定してから行う。
|
|||
|
|
|
|||
|
|
### A-10b. `mapPipeline` の同期・非同期版
|
|||
|
|
|
|||
|
|
`src/mapPipeline.js:273-386` と `:388-494` は terrain、geography、features、admin context、transport、出力組立を重複する。既に以下の仕様差がある。
|
|||
|
|
|
|||
|
|
- 同期版 `:285-294` は `_precomputedTerrainDraftCandidate` を扱う。
|
|||
|
|
- 非同期版 `:397-403` は `_precomputedDraftCandidate` だけを扱う。
|
|||
|
|
- matcher も `:169-180` と `:182-193` に近似重複する。
|
|||
|
|
|
|||
|
|
**統合案:** 共通 stage plan / core を作り、同期版は直列 drain、非同期版は yield / await を注入する。stage の省略ではなく同一 stage list の共有とし、同じ seed / option で生成 field、feature、debug、hash が一致することを必須にする。
|
|||
|
|
|
|||
|
|
### A-14c. preview 差分判定
|
|||
|
|
|
|||
|
|
`src/app.js:2625-2692` と `src/mapPatchWorker.js:1091-1148` が同じ field / feature 集合を別実装で比較する。worker 側の comparator (`:477-515`) は `Date`、`Map`、`Set`、`patchGenerated` を扱うが app 側は扱わず、fallback 時の意味が一致しない。
|
|||
|
|
|
|||
|
|
**統合案:** field 定数、structured comparator、delta builder を pure module に切り出す。
|
|||
|
|
|
|||
|
|
### A-14d. A* 系と influence cache
|
|||
|
|
|
|||
|
|
- `src/mapPostAdminTransport.js:232-373` と `:375-474` は bounds、stamped workspace、8近傍、terrain cost、relaxation、traceback を重複する。`routeTerrainSearch(..., profile)` の共通 core にできるが、tie-break と探索順を完全に維持する必要がある。
|
|||
|
|
- `src/mapTransportUtils.js:46-56` の influence cache signature は path 数、総点数、端点座標の総和だけで、内部頂点だけが変わると衝突し得る。一方 `src/mapFeatures.js` は phase ごとに異なる label を多用して hit しにくい。path-set identity + revision + radius を key にし、変更時に invalidate する方が単純で安全である。
|
|||
|
|
- `src/mapFeatures.js:2161-2163` は同じ道路配列の結合を3回作るため、一度だけ hoist できる。
|
|||
|
|
|
|||
|
|
### A-14e. UI診断と worker mirror protocol
|
|||
|
|
|
|||
|
|
- viewport 診断行: `src/app.js:1182-1203` と `:1683-1695`
|
|||
|
|
- feature count 行: `src/app.js:1205-1216` と `:1697-1709`
|
|||
|
|
- worker 行: `src/app.js:1270-1280` と `:1712-1722`
|
|||
|
|
- world 行: `src/app.js:1282-1291` と `:1724-1735`
|
|||
|
|
|
|||
|
|
UI表示と clipboard report に同じ row builder を使える。
|
|||
|
|
|
|||
|
|
また、production の mirror protocol (`src/app.js:2722-2768`) を `tests/patch-worker-mirror-sync.mjs:11-48` が独自に再実装している。テストが production helper ではなく自分のコピーを検証し得るため、pure helper を export して直接テストする。
|
|||
|
|
|
|||
|
|
### A-14f. 小規模な共通化候補
|
|||
|
|
|
|||
|
|
- `centerMunicipalityId`: `src/mapAdminStage.js:338-344` と `src/mapOutput.js:47-53`
|
|||
|
|
- quantile: `src/mapTerrain.js:43-50` と `src/rectContext.js:79-86`(rect 系を残す場合)
|
|||
|
|
- `nowMs`: `src/mapUtils.js:14-16` と `src/mapPatchWorker.js:786-788`
|
|||
|
|
- patch result metadata: `src/mapPatch.js:13376-13425` と `:13453-13501`
|
|||
|
|
- `src/mapPatchWorker.js:653-689` の field category 判定は変更セルごとでなく field loop 外へ移せる
|
|||
|
|
|
|||
|
|
## 7. テストの重複・低効果・不使用
|
|||
|
|
|
|||
|
|
### A-02. 未知 suite が何も検証せず成功し得る
|
|||
|
|
|
|||
|
|
`tests/test-all.mjs:22-23,54-64` は環境変数の任意文字列を `test.js --suite=...` へ渡す。`tests/test.js:20-34` は既知名との比較だけで、未知名を reject しない。その場合、主要 test block を一つも通らず、最後の所要時間 assertion (`:1583-1592`) だけで exit 0 になり得る。
|
|||
|
|
|
|||
|
|
**是正案:** suite を単一 registry にし、未知名は実行前に即失敗させる。これは整理より先に直すべき test trust の問題である。
|
|||
|
|
|
|||
|
|
### A-03. runner / README が未追跡ファイルを必須参照
|
|||
|
|
|
|||
|
|
監査時点では次が未追跡である。
|
|||
|
|
|
|||
|
|
- `tests/test-all.mjs:8-9,46-47,58-61` が参照する `tests/r10-exact-production-worker.mjs`
|
|||
|
|
- 同じく参照する `tests/r11-selection-native-production.mjs`
|
|||
|
|
- `README.md:34` が案内する `tests/r11.8-terrain-topology-tooltip.mjs`
|
|||
|
|
- 上記 r11.8 が import する `tests/helpers-generation-worker-node-wrapper.mjs`
|
|||
|
|
|
|||
|
|
作業ツリー全体では動いても、一部だけ commit すると canonical command が壊れる。正式テストなら依存を一括追跡し、実験物なら runner / README から外す。単純削除はしない。
|
|||
|
|
|
|||
|
|
### A-07a. 到達不能・temp・旧 helper
|
|||
|
|
|
|||
|
|
| ファイル | 根拠 | 推奨 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| `tests/r11-selection-debug-temp.mjs:76-120` | 結果出力直後の `process.exit(0)` により後続 assert / finally が到達不能 | 削除 |
|
|||
|
|
| `tests/r11-selection-v1-temp.mjs` | `r11-selection-native-production.mjs` と実質7行程度の差 | variant をパラメータ化して統合後、temp を削除 |
|
|||
|
|
| `tests/r11-large-bestof-temp.mjs` | 3行の診断スクリプト。正式な `r11.6-large-bestof-quality.mjs` が同 fixture を詳細検証 | 削除 |
|
|||
|
|
| `tests/test-determinism-worker.mjs` | repo 内参照なし。現 determinism shard は `test.js` 内で直接生成 | 外部 CI 直呼びを確認後に削除 |
|
|||
|
|
|
|||
|
|
### A-07b. full-map / worker generation の重複
|
|||
|
|
|
|||
|
|
ここで削減するのは、**テスト間で同じ完全生成を無条件にやり直す回数**だけである。production の candidate plan、quality retry、full-finalization 数を減らす提案ではない。fixture を共有できるのは seed、variant、rect、全 option、worker 経路が一致し、各 assertion が生成物を変更しない場合に限る。
|
|||
|
|
|
|||
|
|
1. **seed 999 determinism**
|
|||
|
|
- core (`tests/test.js:1291-1308`) が seed 999 を2回生成し、広い決定性を検査する。
|
|||
|
|
- default の `determinism-999` (`tests/test-all.mjs:20`, `tests/test.js:1373-1380`) も2回生成し、前者の真部分集合だけを検査する。
|
|||
|
|
- broad core assertion が subset を完全に包含することを対応表で残した上で、重複する invocation だけを外せる。 retained core は同じ完全生成を行う。
|
|||
|
|
|
|||
|
|
2. **seed 54321 の弱い variation check**
|
|||
|
|
- `tests/test.js:710` の `other = generateTestMap(54321)` は `:1285-1287` の「3種の件数のどれかが seed 12345 と違う」という1 assertion にしか使わない。
|
|||
|
|
- terrain suite が同一 option の seed 54321 完全生成物を保持できる構成へ変更し、その生成物へ assertion を移せる。別設定なら共有しない。
|
|||
|
|
|
|||
|
|
3. **r11.5 / r11.7 / r11.8**
|
|||
|
|
- seed 1 を3回、seed 2を2回、同じ worker 経路で full generation する。
|
|||
|
|
- 各ファイルの生成 option と worker 経路が一致し、検査が read-only であることを確認してから、seed ごとに一度完全生成し複数 contract を当てる table-driven `initial-generation-quality` へ統合する。この範囲では5回から3回になる。
|
|||
|
|
|
|||
|
|
4. **coverage-hole fixture**
|
|||
|
|
- `additional-generation-coverage-worker.mjs` と `r11-bestof-coverage-context.mjs` は world seed 8、rect `{20,120,180,230}`、base seed 123 を共有する。
|
|||
|
|
- best-of 固有 assertion と候補数は維持したまま既存 coverage worker の別 case へ統合し、同一の初期 full map だけを再利用できる。
|
|||
|
|
|
|||
|
|
5. **maximum expansion fixture**
|
|||
|
|
- `additional-generation-max-worker.mjs` と `r11-selection-native-production.mjs` は world seed 114514、variant 0、470 × 333 lasso、同じ seed hash / option / 1 candidate を使う。
|
|||
|
|
- 安定した1本へ assertion を統合する。canonical 実行と extended performance 実行の違いは timeout / memory 計測の有無に限定し、生成 option、候補数、quality gate は切り替えない。
|
|||
|
|
|
|||
|
|
fixture helper と seed derivation も `additional-generation-e2e.js`、max-worker、cancel、r11 selection、r11.6 などにコピーされている。正式に残すテストだけを対象に helper 化する。
|
|||
|
|
|
|||
|
|
`tests/r10-exact-production-worker.mjs` の optimized 対 exhaustive 比較は、「簡易生成を公開しない」ことの中核契約なので削減対象外とする。また、r11.4 の同一 seed は `initialGenerationOverscan` 等の option が異なるため、同じ fixture とみなさない。
|
|||
|
|
|
|||
|
|
### A-07c. determinism suite の seed 指定が実質無効
|
|||
|
|
|
|||
|
|
`tests/test.js:1373-1375` では suite 名が単に `determinism` の場合も `"determinism-".length` で slice し、空文字を `Number("") === 0` と解釈する。そのため `--suite=determinism --seed=...` は指定 seed でなく常に0を選ぶ。
|
|||
|
|
|
|||
|
|
suffix が空のときだけ `DETERMINISM_SEED` を使う分岐にする。
|
|||
|
|
|
|||
|
|
### A-11. 大量の source-string assertion
|
|||
|
|
|
|||
|
|
`tests/test.js:46-61` は test.js shard の起動ごとに約1.43 MBの source を文字列として無条件に読む。default では同ファイルを多数の process で起動し、`mapPipeline.js` は二重読込、`test.js` 自身も自己ソース検査のため読む。
|
|||
|
|
|
|||
|
|
`tests/test.js` には `*Source.includes(...)` が238箇所あり、主に `:830-1086` に集中する。同種検査は r11.4、r11.5、r11.7、r11.8 にも重複する。この方式はコメントや死んだコードでも通り、rename だけで壊れるため、機能契約としての信頼性が低い。実際 `tests/r11.8-terrain-topology-tooltip.mjs:178` は不使用の `desiredGap` 宣言の存在を要求し、dead code を温存している。
|
|||
|
|
|
|||
|
|
**短縮案**
|
|||
|
|
|
|||
|
|
- 構造制約が必要なものだけ AST / lint ベースの少数 static suite へ分離する。
|
|||
|
|
- 機能契約は behavior test へ移し、置換テストが先に通るまで source assertion を外さない。
|
|||
|
|
- 少なくとも source 読込は該当 suite 内で lazy にし、二重読込と自己読込を除去する。
|
|||
|
|
|
|||
|
|
とくに `fullProductionFromTerrainOnly`、`reusedWinningDraft === false`、optimized / exhaustive の同一 variant・score、`simplifiedOutputForbidden` は文字列存在検査だけにせず、実 Worker の結果で維持する。
|
|||
|
|
|
|||
|
|
### A-12. `test-all` の出力収集
|
|||
|
|
|
|||
|
|
`tests/test-all.mjs:70-85` は chunk ごとに `current + chunk` で既存文字列全体をコピーし、`Buffer.byteLength(next)` で全体を再走査するため、出力増加に対して二次的になり得る。stdout / stderr がそれぞれ32 MBまで許されるので、`maxOutputBytes` は合算32 MBではなく最大約64 MBであり、最後に `:120` で再度連結する。
|
|||
|
|
|
|||
|
|
**短縮案:** stdout / stderr 共通の byte counter と chunk 配列を使い、必要時に一度だけ連結する。
|
|||
|
|
|
|||
|
|
また、standalone の Node assert failure は通常 `NG:` を出さないため、`:121,165-170` では test failure でなく `infrastructureFailure` に分類される。非zero exit と spawn / timeout / signal / overflow を分ける。
|
|||
|
|
|
|||
|
|
決定性検査にも不要な大型一時値がある。`tests/test.js:1296-1307,1378` は typed array を `[...array]` で通常配列へ展開し、さらに `JSON.stringify` で巨大文字列へ変換する。同ファイルには既に `arraysEqual` (`:76-82`) があるため、直接比較または byte compare に統一できる。
|
|||
|
|
|
|||
|
|
### A-14g. test suite registry と到達経路
|
|||
|
|
|
|||
|
|
`tests/test-all.mjs` は suite 名を次の4箇所で重複管理する。
|
|||
|
|
|
|||
|
|
- default list (`:5-21`)
|
|||
|
|
- timeout map (`:28-39`)
|
|||
|
|
- standalone file 定数 (`:43-47`)
|
|||
|
|
- 実行先を選ぶ nested ternary (`:54-62`)
|
|||
|
|
|
|||
|
|
`{ name, file, timeout, group }` の descriptor registry に一元化し、`canonical`、`extended/performance`、`browser` の manifest を明示する。「fast」は簡易生成 mode と誤解されるため test group 名には使わない。
|
|||
|
|
|
|||
|
|
`README.md` も canonical command と release / perf / browser / manual gate の境界を説明していない。manifest 整理後に各入口と採用基準を短く記載する。
|
|||
|
|
|
|||
|
|
現在、追跡済みでも canonical `test-all` から到達しない独立 gate がある。
|
|||
|
|
|
|||
|
|
- `additional-generation-max-worker.mjs`
|
|||
|
|
- `patch-worker-cancel.mjs`
|
|||
|
|
- `patch-worker-mirror-sync.mjs`
|
|||
|
|
- `run-additional-generation-browser.mjs`
|
|||
|
|
|
|||
|
|
r11.4〜r11.7にも固有 assertion があるため、到達しないという理由だけで削除してはいけない。manifest へ正式採用するか、既存 suite へ contract を移植してから削除する。
|
|||
|
|
|
|||
|
|
### raw worker E2E と実アプリ browser E2E
|
|||
|
|
|
|||
|
|
`additional-generation-e2e.html/js` は raw worker の generation / preview / apply / progress / heap を検査し、`run-additional-generation-browser.mjs` は実際の `index.html` を開いて同じ契約と UI / cancel を検査する。後者の server にある `/` から raw HTML への route は、その runner 自身から使われない。
|
|||
|
|
|
|||
|
|
raw harness 固有 assertion を実アプリ runner へ先に移植し、同じ full worker candidate、preview / apply、progress、cancel 契約を検証できた場合に限り、手動利用のない HTML / JS / unused route を削除できる。
|
|||
|
|
|
|||
|
|
### performance / memory gate の意味
|
|||
|
|
|
|||
|
|
`tests/additional-generation-max-worker.mjs:42-49` の `process.memoryUsage().heapUsed` は親 isolate 側の値で、重い Worker heap の直接ピークを表さない。RSS は process 全体だが、機能検査は他の470 × 333 fixture と重複する。性能 gate を残すなら Worker 内計測または browser `performance.memory` に一本化する。
|
|||
|
|
|
|||
|
|
## 8. CSS・静的資産
|
|||
|
|
|
|||
|
|
### 未使用 selector / property
|
|||
|
|
|
|||
|
|
- `styles/styles.css:135` `.microcopy`
|
|||
|
|
- `styles/styles.css:196` `.express-line`
|
|||
|
|
- `styles/styles.css:120` button transition の `transform .16s`(対象の通常 / hover / active / disabled に transform 指定なし)
|
|||
|
|
|
|||
|
|
### 未使用 custom property
|
|||
|
|
|
|||
|
|
次の custom property は CSS 全体で `var(...)` 参照がない。
|
|||
|
|
|
|||
|
|
- `styles/styles.css:3` `--bg`
|
|||
|
|
- `styles/styles.css:4` `--bg-2`
|
|||
|
|
- `styles/styles.css:8` `--surface-soft`
|
|||
|
|
- `styles/styles.css:9` `--panel`
|
|||
|
|
- `styles/styles.css:17` `--accent-soft`
|
|||
|
|
|
|||
|
|
将来の token 化予定がなければ削除できる。
|
|||
|
|
|
|||
|
|
### 同一 block / 分散 media query
|
|||
|
|
|
|||
|
|
- `.diagnostic-table` (`styles/styles.css:480-487`) と `.diagnostic-log` (`:504-511`) の宣言は完全一致するため selector を結合できる。
|
|||
|
|
- 1280px と720pxの media query が複数箇所に分散している。breakpoint 単位の集約は行数と可読性の改善に留まり、優先度は低い。
|
|||
|
|
|
|||
|
|
## 9. 削除しないもの・先に契約確認が必要なもの
|
|||
|
|
|
|||
|
|
### server helper
|
|||
|
|
|
|||
|
|
`scripts/start_server.bat` / `scripts/start_server.sh` は `README.md:16-28` から使われるクロスプラットフォーム入口であり、保持が妥当である。`scripts/router.php:7-15` の dot-segment 配信防止も実効性がある。`scripts/router.php:4-5` の legacy directory / `.htaccess` 説明だけは現作業ツリーとずれており、コメント更新候補である。
|
|||
|
|
|
|||
|
|
### standalone test の固有 coverage
|
|||
|
|
|
|||
|
|
mirror sync、cancel、coverage、browser UI などは canonical runner から到達しなくても固有 assertion がある。別 suite へ移植する前の単純削除は coverage を失う。
|
|||
|
|
|
|||
|
|
同様に、`src/committedWorldDelta.js:97` の `materializeCommittedWorldDelta` と `src/mapPatchWorker.js:1150` の同期 `runPatchCandidateSearch` は production caller がなくてもテストから利用される。後者を削る場合は、テストを非同期版へ移して同じ cancellation / progress / ordering 契約を維持する必要がある。
|
|||
|
|
|
|||
|
|
### export / facade
|
|||
|
|
|
|||
|
|
repo 内参照ゼロでも、`mapGenerator.js`、`adminRegions.js`、rect terrain export などは外部 consumer が使う可能性がある。package 公開面、HTML の動的 import、外部 CI / script を確認してから削除する。
|
|||
|
|
|
|||
|
|
`src/app.js:2826` の private `runPatchInWorker` は、唯一の caller (`:3217-3222`) が常に `operation` を渡すため、`:3127-3131` の full-world dispatch 互換分岐は current production では到達不能である。private 関数なので削除しやすいが、worker mirror protocol の整理と同時に扱うと意図が明確になる。local preview fallback や旧 fixed-batch API はコメント上も互換経路であり、関連テストを移す前には削除しない。
|
|||
|
|
|
|||
|
|
### r11.4 fixture
|
|||
|
|
|
|||
|
|
同じ seed を使っていても `initialGenerationOverscan: false` など option が異なる fixture は等価ではない。seed だけを見て統合しない。
|
|||
|
|
|
|||
|
|
### 完全生成の契約テストと finalizer
|
|||
|
|
|
|||
|
|
次は重い、反復している、名称が draft / fast を含むという理由では削除しない。
|
|||
|
|
|
|||
|
|
- `tests/r10-exact-production-worker.mjs` の optimized 対 exhaustive full-production 比較
|
|||
|
|
- `tests/r11.5-visible-quality-finalizer.mjs` の visible crop full-production 検査
|
|||
|
|
- `tests/r11.7-terrain-routed-transport-density.mjs` の terrain-routed transport / density 契約
|
|||
|
|
- `src/mapPatchWorker.js:1934-2005` の full finalist 実行
|
|||
|
|
- `src/mapPatch.js:12945-12960` の full patch candidate 生成
|
|||
|
|
- `src/mapPostAdminTransport.js:3985-4015` の visible-core service / density / alignment finalizer
|
|||
|
|
|
|||
|
|
これらの内部で重複走査を減らす場合も、stage の存在と最終契約は維持する。
|
|||
|
|
|
|||
|
|
### repository layout assertion
|
|||
|
|
|
|||
|
|
`tests/r11.8-terrain-topology-tooltip.mjs:191` は `archive/` と `docs/` が存在しないこと自体を assert する。製品挙動ではなく repository policy であり、文書追加だけでも失敗要因になる。この監査文書を repo root に置いた理由でもある。必要なら runtime regression から lint / policy check へ移す。
|
|||
|
|
|
|||
|
|
## 10. 完全生成を維持する実施順序
|
|||
|
|
|
|||
|
|
今回は未実施。実作業へ進む場合は、次の順なら原因切り分けと回帰確認がしやすい。
|
|||
|
|
|
|||
|
|
### Phase 0: full-production baseline の固定
|
|||
|
|
|
|||
|
|
1. seed、variant、rect、全 option、candidate plan を固定した baseline を作る。
|
|||
|
|
2. field typed array、feature 座標と順序、admin / transport debug、accepted world hash、quality score を保存する。
|
|||
|
|
3. optimized search と exhaustive search が同一 winner / score を返すことを確認する。
|
|||
|
|
4. published candidate が `reusedWinningDraft === false`、`fullProductionFromTerrainOnly === true` を満たすことを確認する。
|
|||
|
|
|
|||
|
|
Node 実行環境が利用可能になるまでは、この baseline を必要とする production refactor に着手しない。
|
|||
|
|
|
|||
|
|
### Phase 1: 検証基盤の修復
|
|||
|
|
|
|||
|
|
1. suite registry を一元化し、未知 suite を reject する。
|
|||
|
|
2. runner が参照する未追跡テストの採否を決める。
|
|||
|
|
3. determinism seed 指定の不具合を直す。
|
|||
|
|
4. source-string だけの完全生成契約を実 Worker behavior test へ置換する。
|
|||
|
|
|
|||
|
|
### Phase 2: 公開結果へ反映されない処理の修復
|
|||
|
|
|
|||
|
|
1. stale alias の identity 回帰テストを追加する。
|
|||
|
|
2. A-01 の pass を削らず、公開 `features.*` へ適用する。
|
|||
|
|
3. 修正後の trunk service、density、parallel alignment、terrain validity を full generation で確認する。
|
|||
|
|
4. これは意図した correctness change なので、差分を「等価最適化」として隠さない。
|
|||
|
|
|
|||
|
|
### Phase 3: 静的に確定した無駄を除去
|
|||
|
|
|
|||
|
|
1. `barrierCost` / `corridorCost` の生成を除去する。
|
|||
|
|
2. 一時結合鉄道配列の破棄される prune を除去する。
|
|||
|
|
3. local dead helper、unused import / binding、no-op UI / CSS を整理する。
|
|||
|
|
4. temp / unreachable test は、固有 assertion を retained full-production test へ移植してから削除する。
|
|||
|
|
5. 各変更で full-production baseline が同一であることを確認する。
|
|||
|
|
|
|||
|
|
### Phase 4: 重複する高コスト test と実装を等価統合
|
|||
|
|
|
|||
|
|
1. 全 option が一致する read-only fixture に限り、一度の完全生成へ複数 contract を適用する。
|
|||
|
|
2. test manifests と fixture helper を整理するが、candidate、seed、assertion、quality gate は減らさない。
|
|||
|
|
3. preview delta、diagnostic rows、mirror helper を共通化する。
|
|||
|
|
4. worker / pipeline の同期・非同期 core を段階的に共有し、stage list と output を一致させる。
|
|||
|
|
|
|||
|
|
### Phase 5: shadow 比較後に反復処理を等価短縮
|
|||
|
|
|
|||
|
|
1. post-admin transport の各 pass に add / remove / replace / elapsed time を付ける。
|
|||
|
|
2. representative seed corpus と最大矩形で、連続 zero-delta pass と直後に打ち消される変更を記録する。
|
|||
|
|
3. 計測は候補発見にだけ使い、sample 上の zero-delta だけでは pass を削らない。
|
|||
|
|
4. 旧実装を shadow 実行し、dirty flag、workspace 再利用、全域走査一括化、上限付き収束ループを一つずつ比較する。
|
|||
|
|
5. path / field / feature / debug / hash が一致した等価置換だけを採用する。違いが出た場合は簡易化せず旧実装を維持する。
|
|||
|
|
|
|||
|
|
## 11. 検証条件と限界
|
|||
|
|
|
|||
|
|
- repo 全体の識別子検索、import / export 参照、呼び出し位置、値の読み取り、配列再代入後の identity を静的に照合した。
|
|||
|
|
- `node`、`npm`、`eslint` は監査時の shell から解決できず、test 実行、benchmark、heap profile は行っていない。
|
|||
|
|
- そのため、反復 pass の削減率や時間短縮値は断定していない。A-08 は特に計測後判断とする。
|
|||
|
|
- 外部 repository、外部 CI、利用者の手動 command、公開 API consumer は監査対象外である。
|
|||
|
|
- 監査開始前から削除状態だった `archive/generated-history`、`archive/legacy-project` 等には触れず、削除済み内容も評価対象外とした。
|
|||
|
|
|
|||
|
|
## 12. 完了条件の目安
|
|||
|
|
|
|||
|
|
整理作業を完了とみなすには、行数削減や速度向上だけでなく次を満たす必要がある。
|
|||
|
|
|
|||
|
|
- 全 suite 名が registry に存在し、未知名は失敗する。
|
|||
|
|
- runner / README の全必須ファイルが追跡され、fresh checkout から到達できる。
|
|||
|
|
- final transport の監査対象と公開 `features.*` が同じ配列 identity、または明示的に同じ戻り値を使う。
|
|||
|
|
- repo 内参照ゼロの export は外部契約の採否が記録される。
|
|||
|
|
- full-map / worker fixture の重複回数が manifest 上で説明できる。
|
|||
|
|
- 等価最適化では同じ seed / option の field、feature、順序、quality score、accepted world hash が一致する。
|
|||
|
|
- correctness 修正で意図的に出力が変わる場合は、差分と改善された production contract が記録される。
|
|||
|
|
- scout / draft / private tile は単独で公開されず、公開候補は terrain 以外の全 production stage を再実行する。
|
|||
|
|
- optimized search は exhaustive full-production search と同一 winner / score を返す。
|
|||
|
|
- candidate 数、quality retry、overscan、transport parity、地形制約、quality threshold を性能目的で下げていない。
|
|||
|
|
- source assertion を削る場合は、同じ契約を検証する behavior test が先に存在する。
|
|||
|
|
- 反復 pass は変更件数と所要時間を観測でき、旧実装との shadow 比較で完全一致する。
|
|||
|
|
|
|||
|
|
どれかを満たせない変更は、短縮ではなく簡易生成または仕様変更として却下する。
|