55 KiB
完全生成を維持する冗長・無効・重複・未使用処理 監査報告
- 監査日: 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 最優先の結論
最優先で扱うべきなのは、単なる整理ではなく、実行した完全生成処理が公開結果へ反映されていない箇所と、検証していないテストが成功扱いになる箇所である。
src/mapPostAdminTransport.jsの最終道路監査の一部は、古い配列別名を変更しており、公開されるfeatures.*には反映されない。tests/test.jsは未知の suite 名でも実質的に検証をせず成功し得る。- 地物生成では、どこからも使われない2枚の全画面コストラスタを毎回構築している。
- 鉄道の parallel prune は、一度目が一時配列だけを変更して結果を破棄し、その直後に実配列へ同種処理を繰り返す。
- repo 内から到達しないモジュール・関数群、到達不能な temp テスト、同一 seed / fixture の重複生成が複数ある。
- 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.* に反映されない。
finalShortTrunkCleanupAfterServicefinalExpresswaySharedAlignmentfinalNationalSharedAlignmentfinalExpresswayParallelPruneExactOutputfinalNationalParallelPruneExactOutput
なお、直後の 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のINFimport 等が未使用になる場合は同時に整理する。
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-draftmessage 分岐 (:112) も内部到達不能になる。 src/patchCandidateWorker.js:38-43の draft message 分岐、旧 full-draft 側だけが使うcontinueMapDraftFromTerrain(src/mapPipeline.js:222) とgenerateMapDraft(:268) も同じ互換クラスタに属する。src/mapPatch.js:2のgenerateMapDraftimport は既に完全未使用である。
判定: 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-1535dedupeSegmentssrc/mapPatch.js:6726-6757buildBoundarySegmentsFromFieldsrc/mapPatch.js:6759-6784buildMaskBoundarySegmentsFromFieldsrc/mapPatch.js:8836-8838rectKeysrc/renderer.js:402-408mixRgbsrc/renderer.js:865drawLandRailwaysrc/mapTerrain.js:24-29normalizeCoordsrc/mapTerrain.js:37-41rotate
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回、逆順用の配列も生成する。
短縮案
- network ごとの revision / dirty flag を持ち、変更されていない配列の再正規化だけを省く。正規化の semantic boundary は移動しない。
- repair 群を上限付き収束ループへまとめる場合、従来の pass 順、上限、tie-break を維持し、state revision が不変のときだけ終了する。
- 各 stage の add / remove / replace 件数を seed corpus で記録する。ただし、観測した seed で0だったことだけを根拠に pass を削除しない。静的 precondition または shadow 実行との完全一致を削除条件にする。
- 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 が生成物を変更しない場合に限る。
-
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 は同じ完全生成を行う。
- core (
-
seed 54321 の弱い variation check
tests/test.js:710のother = generateTestMap(54321)は:1285-1287の「3種の件数のどれかが seed 12345 と違う」という1 assertion にしか使わない。- terrain suite が同一 option の seed 54321 完全生成物を保持できる構成へ変更し、その生成物へ assertion を移せる。別設定なら共有しない。
-
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回になる。
-
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 だけを再利用できる。
-
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.mjspatch-worker-cancel.mjspatch-worker-mirror-sync.mjsrun-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.microcopystyles/styles.css:196.express-linestyles/styles.css:120button transition のtransform .16s(対象の通常 / hover / active / disabled に transform 指定なし)
未使用 custom property
次の custom property は CSS 全体で var(...) 参照がない。
styles/styles.css:3--bgstyles/styles.css:4--bg-2styles/styles.css:8--surface-softstyles/styles.css:9--panelstyles/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 の固定
- seed、variant、rect、全 option、candidate plan を固定した baseline を作る。
- field typed array、feature 座標と順序、admin / transport debug、accepted world hash、quality score を保存する。
- optimized search と exhaustive search が同一 winner / score を返すことを確認する。
- published candidate が
reusedWinningDraft === false、fullProductionFromTerrainOnly === trueを満たすことを確認する。
Node 実行環境が利用可能になるまでは、この baseline を必要とする production refactor に着手しない。
Phase 1: 検証基盤の修復
- suite registry を一元化し、未知 suite を reject する。
- runner が参照する未追跡テストの採否を決める。
- determinism seed 指定の不具合を直す。
- source-string だけの完全生成契約を実 Worker behavior test へ置換する。
Phase 2: 公開結果へ反映されない処理の修復
- stale alias の identity 回帰テストを追加する。
- A-01 の pass を削らず、公開
features.*へ適用する。 - 修正後の trunk service、density、parallel alignment、terrain validity を full generation で確認する。
- これは意図した correctness change なので、差分を「等価最適化」として隠さない。
Phase 3: 静的に確定した無駄を除去
barrierCost/corridorCostの生成を除去する。- 一時結合鉄道配列の破棄される prune を除去する。
- local dead helper、unused import / binding、no-op UI / CSS を整理する。
- temp / unreachable test は、固有 assertion を retained full-production test へ移植してから削除する。
- 各変更で full-production baseline が同一であることを確認する。
Phase 4: 重複する高コスト test と実装を等価統合
- 全 option が一致する read-only fixture に限り、一度の完全生成へ複数 contract を適用する。
- test manifests と fixture helper を整理するが、candidate、seed、assertion、quality gate は減らさない。
- preview delta、diagnostic rows、mirror helper を共通化する。
- worker / pipeline の同期・非同期 core を段階的に共有し、stage list と output を一致させる。
Phase 5: shadow 比較後に反復処理を等価短縮
- post-admin transport の各 pass に add / remove / replace / elapsed time を付ける。
- representative seed corpus と最大矩形で、連続 zero-delta pass と直後に打ち消される変更を記録する。
- 計測は候補発見にだけ使い、sample 上の zero-delta だけでは pass を削らない。
- 旧実装を shadow 実行し、dirty flag、workspace 再利用、全域走査一括化、上限付き収束ループを一つずつ比較する。
- 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 比較で完全一致する。
どれかを満たせない変更は、短縮ではなく簡易生成または仕様変更として却下する。