# 実装意味論ポリシー

実装意味論に関する独立した判定を一つの正本で行う。

## 原則

| 原則 | 基準 |
|------|------|
| 適用条件を確認 | 元要件、変更契約、実在する影響経路に基づいて適用する |
| 事実を根拠にする | コード、契約、証跡で確認できる条件だけを判定する |
| 責務境界を守る | 判定対象の所有者と観測可能な影響を分けて確認する |
| 最小範囲に限定する | 今回の要求と因果関係のある範囲だけを判定する |
| 判定根拠を統一する | 元要件、変更契約、実在する影響経路から導けない例示を判断基準に追加しない |

## 実装意味論 判定基準

### テスト期待値は元要件に従う

| 基準 | 判定 |
|------|------|
| テスト期待値を現行実装だけから導いている | REJECT |
| 元要件または仕様と矛盾する振る舞いを、通過するテストが固定している | REJECT |
| 失敗時の振る舞いも含め、期待値を元要件または仕様に結び付けている | OK |

### データ構造の意味選択

| 基準 | 判定 |
|------|------|
| 外部入力（ID、ユーザー入力）をキーとする辞書が `Record` / プレーンオブジェクトで実装され、`in` 演算子や `obj[key]` で存在判定している | REJECT |
| `__proto__`、`constructor`、`toString` のようなキーで挙動が変わる余地がある | REJECT |
| 動的キーの辞書に `Map` を使う、または `Object.create(null)` / `Object.hasOwn` で継承経路を遮断している | OK |
| キーが固定の有限集合（設定オブジェクト等）でプレーンオブジェクトを使う | OK |

### 導出値の単一情報源

| 基準 | 判定 |
|------|------|
| 導出できる値（合計、件数、バージョン）を別変数でも加算・減算して管理している | REJECT |
| 明細と集計値を並行更新しており、不正な入力で乖離し得る | REJECT |
| 導出値は使う場所で計算する、または導出元だけを更新して集計は関数で得る | OK |
| 性能上の理由でキャッシュする場合、更新経路が1本に集約され、乖離時の検出がある | OK |

### 命名と意味の整合

| 基準 | 判定 |
|------|------|
| 変数名・引数名が示す意味と、実際に格納される値の意味が異なる（例: `qty` という名前に ID が入る） | REJECT |
| 型は合っているが、単位・座標系・正規化状態が名前から読み取れず、混用されている | REJECT |
| 名前から中身の意味・単位・状態が一意に読み取れる | OK |

### 境界での fail-fast

| 基準 | 判定 |
|------|------|
| 前提が壊れた入力（存在しない対象へのイベント、順序違反）を無言でスキップしている | REJECT |
| 例外を握りつぶして正常値を返し、呼び出し側が失敗を検知できない | REJECT |
| 契約違反は明示的なエラー・例外・Result 型で即座に表面化させている | OK |
| 仕様として無視する場合、その判断がコメントまたは仕様書で明文化されている | OK |

### 内部状態の参照漏れ

| 基準 | 判定 |
|------|------|
| コレクションのコピーは返すが、格納されたオブジェクト自体は共有されている（浅いコピー止まり） | REJECT |
| 取得した参照を変更すると、保存済みの状態が書き換わる | REJECT |
| 防衛的コピー、凍結、読み取り専用ビューのいずれかで内部状態が保護されている | OK |

### 識別子名前空間の衝突

| 基準 | 判定 |
|------|------|
| 生成値が既存入力、予約語、区切り構文、保存・表示・検索の下流解釈と衝突し得る | REJECT |
| 採番元が一意でも、下流が別の値として解釈できない | REJECT |
| 既存入力と下流構文の両方で区別できる名前空間を証明している | OK |
