map/AUDIT_REDUNDANCY_UNUSED.md
2026-08-11 21:51:07 +09:00

55 KiB
Raw Permalink Blame History

完全生成を維持する冗長・無効・重複・未使用処理 監査報告

  • 監査日: 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.jsadminRegions.jsmapGenerator.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 の外部互換確認が必要なため削除していない。
  • prepareProductionTerraingenerateMapAsyncgenerateAdminLayout 等の未参照 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-2160reusedWinningDraft: falsefullProductionFromTerrainOnly: true を記録する。
  • tests/r10-exact-production-worker.mjs:62-72 は optimized search と exhaustive full-production search の variant と score の一致、および簡略 output の非公開を検証する。
  • src/mapPostAdminTransport.js:4008-4015tests/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-1327src/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.jsfastTerrain は pan / zoom 中の描画省略であり、保存される map generation の簡略化ではない。
  • src/mapAdminStage.js:212-264simple administrative hierarchy / simpleHierarchyPrototype は現行 production stage の方式名であり、別の軽量 generator への分岐ではない。名称だけを根拠に未使用・簡易生成とは判定しない。
  • src/mapPatchWorker.js:2161parallelDraftGeneration は互換目的で残る旧 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-1077features.minorRoadsnationalRoadsexternalRoadsexpresswaysexternalExpresswaysconst のローカル別名へ保持する。
  • src/mapPostAdminTransport.js:3838-3842dedupePaths(..., { mutate: false }) の戻り値を features.* へ再代入する。
  • src/mapTransportUtils.js:193-228dedupePathsmutate: false の場合、新しい配列と座標列を返す。この時点で冒頭の別名は古い配列を指す。
  • その後の src/mapPostAdminTransport.js:3886pruneShortFinalTrunkSegments() を呼ぶが、同関数の 3778-3813 は古い expresswaysnationalRoadsminorRoads を変更する。
  • 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-65barrierCostcorridorCostFloat32Array を確保する。
  • 同ファイル 72-74162-163 で全セルを走査し、hash を含む値を格納する。
  • src/mapFeatures.js:94-95 は両者を分割代入するが、その後一度も読む箇所がない。repo 内にも別の利用者はない。

hidden generation の 354 × 279 = 98,766 セルでは、配列本体だけで約 790 KB を一時保持し、さらに全域の演算を行う。結果が使われないため、計算・メモリとも削除候補である。

短縮案

  • 2配列の確保、代入、返却、受け取りをまとめて除去する。
  • その結果 mapFeatureContext.jsINF 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 の空 latticeBySeedexactDirectNoise に利用者がない 互換契約がなければ返却値を簡素化
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.jsmapTerrain.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-9901buildRawPatchDraftRequest は定義のみ。
  • src/mapPatchWorker.js:150-159precomputeRawDraftBatch は 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:2generateMapDraft import は既に完全未使用である。

判定: current app から辿る production path では未到達。ただし worker message protocol、外部 import、テストの source assertion に互換目的がある可能性がある。message type と公開 export の廃止を一つの変更として宣言し、呼び出し元がないことを確認してからクラスタ単位で削除する。

完全生成上の境界: 削除対象は旧 generate-raw-patch-draft 互換クラスタだけである。generatePatchCandidategenerateMap、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,13481src/mapPipeline.js:121 stableWorldTerrain を渡すだけで、repo 内に読み取りがない option を削除
src/mapPipeline.js:30src/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 finalizeAdminAwareTransportgeography は signature だけ。pipeline の generationContext は callee で bind もされない call contract を縮小
src/mapAdminStage.js:117-135 villageInfluenceindustrialZoneslogisticsParksgeographicBarrierCost は 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-40064395-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回

dedupePathsmutate: 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-97enforceMunicipalityConnectivityStrict は、全所有者の component を一度の全域走査で集める。一方 repairAdminTopology (:117-143) は所有者ごとに Uint8Array(SIZE) を確保し、全セルを走査する。同処理は :1132:1262 から呼ばれる。

短縮案: 共通の collectComponentsByOwner を一度実行し、中心 component の保護・再割当規則だけを各処理へ残す。owner 順、component 探索順、同点時の再割当先を変えない。

A-09b. 人口再推定と合併反映の全域走査

  • src/mapAdminStage.js:386 で人口を推定する。
  • 合併があると :478 で再推定し、その直後 :500 でも無条件に再推定する。
  • 合併先ごとに :459-461adminId 全域を再走査する。
  • 実体の src/mapMunicipalDemography.js:13-42 もラスタ全域を走査する。

無合併でも推定2回、合併時は3回になり得る。合併先 remap を蓄積して最後に一度だけ全域へ適用し、変更なしなら初回推定を再利用、変更ありなら最後に一度だけ再推定できる。ただし、中間推定値を読む処理がないことを call graph と regression test の両方で確認し、人口モデル自体は変更しない。

A-13. 小さな local connector ごとの全寸法 workspace

src/initialGenerationCrop.js:749-890localConnector は、小さな bbox と展開上限360で探索する一方、呼び出しごとに全マップ寸法の Float32ArrayInt32ArrayUint8Array を確保・初期化する (: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 各セルで全 modernCitiessome + 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-2692src/mapPatchWorker.js:1091-1148 が同じ field / feature 集合を別実装で比較する。worker 側の comparator (:477-515) は DateMapSetpatchGenerated を扱うが 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-344src/mapOutput.js:47-53
  • quantile: src/mapTerrain.js:43-50src/rectContext.js:79-86rect 系を残す場合)
  • nowMs: src/mapUtils.js:14-16src/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:710other = 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.mjsr11-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.mjsr11-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 にし、二重読込と自己読込を除去する。

とくに fullProductionFromTerrainOnlyreusedWinningDraft === 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 に一元化し、canonicalextended/performancebrowser の 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-49process.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.shREADME.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:97materializeCommittedWorldDeltasrc/mapPatchWorker.js:1150 の同期 runPatchCandidateSearch は production caller がなくてもテストから利用される。後者を削る場合は、テストを非同期版へ移して同じ cancellation / progress / ordering 契約を維持する必要がある。

export / facade

repo 内参照ゼロでも、mapGenerator.jsadminRegions.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:191archive/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 === falsefullProductionFromTerrainOnly === 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 を静的に照合した。
  • nodenpmeslint は監査時の shell から解決できず、test 実行、benchmark、heap profile は行っていない。
  • そのため、反復 pass の削減率や時間短縮値は断定していない。A-08 は特に計測後判断とする。
  • 外部 repository、外部 CI、利用者の手動 command、公開 API consumer は監査対象外である。
  • 監査開始前から削除状態だった archive/generated-historyarchive/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 比較で完全一致する。

どれかを満たせない変更は、短縮ではなく簡易生成または仕様変更として却下する。