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

672 lines
55 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 完全生成を維持する冗長・無効・重複・未使用処理 監査報告
- 監査日: 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 比較で完全一致する。
どれかを満たせない変更は、短縮ではなく簡易生成または仕様変更として却下する。