作成日:2026-10-21。状態:数量の単位表を改訂し、依存する4拡張を再固定して、両 Python 版の全体回帰を通過。設計53・手指定期待54 に従いました。両文書の「未実装」という記載は設計時点の記録として保持します。独立確認・評価用正解の凍結は未実施で、運用方針29 に従います。単位・数値はすべて架空です。
1. 行ったこと
| 項目 | 内容 |
|---|---|
| 単位表の改訂 | quantity_spec.json:u_third の倍率 1/3 → 2/3(同じ ID で意味が変わる)、u_hundred(100/1)を追加。数量の計算規則・停止・課金・入力の形は変更なし |
| 再固定の道具 | repin_specs.py:依存の順に仕様の hash を再計算し、モジュールの定数と依存先の仕様へ反映する。何度実行しても同じ結果。5つの仕様と5つのモジュールの定数が変わった |
| 実行例の再生成 | 既存の生成器で5系列(P2-f/g/h/i/j)を再生成。意味が変わる6件の期待と、追加の Q25 だけを、生成器の手指定の値として書き換えた |
| 宣言の更新 | 5宣言(数量と依存先4件)の版を draft-2 に上げ、依存の版を更新。数量の宣言に継承の差分の義務 VR-1 を追加(finite_check、防護例2件) |
| 比較器 | 共通部品に、再生成した入力の比較(regenerated_report・regenerated_mismatches)を追加。統合評価と compare-versions.py が新しい形の記録(p2-version-record-draft-2)を扱う |
| 検査 | test_quantity_version.py(比較器の判定11テストと、記録に沿った履歴の検査)、test_quantity.py に単位表の検査、検査器の変異に比較器の14件と正規化の1件を追加 |
旧版は、改訂前のコミット 906766d として履歴に残ります。
2. 予測の結果(設計53の Z1〜Z7)
下の測定は、旧版の木と、新版の実装を含む木を比べたものです。版の記録 p2-quantity-draft-1-to-draft-2.json は、新版のコミット a7328b9 を指すので、そのコミットの後の別のコミットで追加しました(記録は、自身を含む木のコミットを指せないため)。生成は make_version_record.py。
| ID | 予測 | 結果 |
|---|---|---|
| Z1 | 旧版は旧コミットの木で旧版の契約のまま再現できる | 成立。旧版の木で統合評価が合格し、記録した分母(19宣言・239義務・420防護例)と、manifest 183c3303…・束 ace08ccf… を再現 |
| Z2 | 旧入力を新版へそのまま渡すと、全て同一または profile_spec_mismatch での拒否。黙った再解釈 0 |
成立。旧入力682件は、同一 40・pin による拒否 642・それ以外 0 |
| Z3 | 再生成した入力は、hash の値を除いて旧入力と同一。期待は宣言した6件を除いて同一。追加は Q25 のみ | 成立。要求が変わった入力 0、期待が変わった入力は宣言した6件のみ、追加 1・欠落 0(旧682件、新683件) |
| Z4 | 旧版の結果と新版の結果(再生成した入力どうし)の差は宣言した6件だけ | 成立(比較器の修正の後。§3 の発見1)。差は6件のみで、全て /results[] の内側。steps_used の差は 0 |
| Z5 | affected() は5拡張を列挙するが、regenerate は自分の仕様の hash を持つ末端のモジュールと宣言・索引を列挙せず過小になる |
成立(一部予測外あり)。5拡張を過不足なく列挙し、regenerate は695件で予測と一致。実際の再固定は697件で、列挙にない実体が8件:display.py・temporal_display.py・宣言5件・生成器 gen_temporal_measurement_fixtures.py(予測外)。索引(extensions/index.json)は仕様の hash を持たず、宣言の hash を持つので、直接の埋め込みではなかった(予測は誤り) |
| Z6 | 意味の変更が6入力でも、約680ファイルが書き換わる | 成立。旧版のコミットとの差分は 739ファイル(実行例は5系列の全件、うち意味が変わるのは6件。文書・検査・道具の追加を含む) |
| Z7 | 新版で追加した単位を使う入力を旧版の木へ渡すと、旧版は未知の単位で行を止める | 成立。旧い pin を付けて渡すと、行は unassessed・unknown_unit、新しい pin のままなら unsupported_profile/profile_spec_mismatch |
反例の候補(設計53の§7):(R1) 旧い pin を文字列で新しい値に置換した入力は、確認が拘束する内容の hash を持つ系列(P2-g/h/i/j)では全て受理されない(invalid_input)。pin だけの系列(P2-f)では置換で足りる。(R2) u_third を使わない入力は継承の差分で同一。(R3) u_third を使う旧入力を旧い pin のまま新版へ渡すと拒否され、旧版の意味で答えない。
3. 分かったこと
- 比較の正規化が、符号化の中の hash を見ていなかった。 初回の比較では、期待が変わった入力が161件と出ました。表示の artifact は、canonical JSON の base64 符号化を結果に持ち、その中に仕様の hash が含まれます。64桁の16進の置換では、符号化された文字列の違いが hash の違いに見えません。符号化を復号して中身を正規化するように比較器を直すと、期待の差は宣言した6件だけになりました。hash を含む符号化の値は、hash の文字列としては見えないことを、版の比較器の前提として明記します。
- 派生した hash があるので、置換では再固定できない。 確認が拘束する内容の hash(記録・数量・確認の内容の hash)は、仕様の hash を含みます。再固定には、各系列の生成器(派生した hash を計算する)が必要で、生成器を旧版と同じ時点で保持することが版の手順の前提になります。
- 宣言の防護例の期待値も、改訂の影響を受けた。 期間つき数量の宣言の防護例(TM-7)が、
u_thirdの旧い値 1/3 を期待していて、改訂の後に登録が拒否されました(guard_outcome_mismatch)。登録時の防護例の評価が、改訂の取りこぼしを検出しました。これはaffected()の列挙にない、第二の依存です(宣言の防護例 → 例の内容)。 - 生成器が仕様の hash の複製を持っていた。 期間つき数量の生成器が、測定の仕様の hash を文字列で埋め込んでいました(他の拡張の確認を流用する対照の入力のため)。旧い hash の文字列を探す点検で見つかり、仕様から読む形に直しました。
affected()は生成器の内容を宣言から知らないので、列挙できません。 - 継承の差分の義務(VR-1)は、現在の宣言の書式で書けたが、機械的な継承の検査にはならない。 義務として宣言し、防護例(改訂した値、追加した値)と検査(単位表の差分、版をまたぐ差分)を結べました。ただし、義務が「旧版との差分」を指すことを、registry は理解しません(検査の名前を引くだけ)。49 の H8(継承を宣言する枠がない)に、版の更新の側からの一つの根拠が加わります。
- 意味の変更が小さくても、固定の連鎖は大きい。 意味を変えたのは単位表の2行ですが、仕様5・モジュール5・実行例687ファイル(manifest 5件を含む)・宣言5と索引・台帳が書き換わりました。hash の固定が、変更の見落としを防ぐ一方、変更の局所性を保証しないことを示す測定です。
4. 検査の強さ
- 比較器の変異:再生成した入力の比較の判定14件(G01〜G14)と、符号化の正規化1件(C11)を、検査器の変異の表に追加しました。最終版で、G01〜G14(14件)・C01〜C11(11件)・V01〜V07(7件)・E01〜E14(14件)の計46件を実行し、46件すべて検出しました(変更した部分と新しい部分の再実行。予算の検査器 B01〜B16 と記録の照合 R01〜R08 は、コードを変えていないので再実行していません)。最初の実行で G13(入力件数と記録の照合)が見逃され、その検査を足して検出されました。
- 単位表の検査(VR-1 の単一の木の部分):現在の単位表が、draft-1 の表に宣言した変更だけを加えたものであることを、native 仕様を読まない独立した表と照合します。
- 実行例:手で導いた期待(6件の変更、Q25)を含む5系列(683件)は、再生成の最初の評価で全て期待と一致しました。別計算(数量・測定・期間つき数量の別計算)の単位表も、宣言した改訂に合わせて更新しました。
5. 検証
Python 3.14.4 と 3.11.17 で、全テスト系列と統合評価を実行しました。
| 系列 | 件数 | Python 3.14.4 | Python 3.11.17 |
|---|---|---|---|
| 開発 | 231 | 通過 | 通過 |
| 追加レビュー系列 | 52 | 通過 | 通過 |
| 保存監査 | 8 | 通過 | 通過 |
| P2 | 330(P2-kの306に24を追加)。うち10件は版の記録を要する履歴の検査で、記録の追加まで実行されない | 通過 | 通過 |
| 統合評価 | P1/P0・拡張・全 P2・予算・版比較 | 通過 | 通過 |
| 統合評価の対象 | P2-l 追加後の分母 |
|---|---|
| 登録・義務・防護例 | 19宣言・240義務・422防護例参照(数量に VR-1 を追加) |
| 証拠の強さ | checked_native_template 163、finite_check 69、hand_derivation 8 |
| 防護例のない義務 | 既存の3件 |
| 数量系列 | 80 JSON・622必須パス(Q25 を追加)。他の4系列の分母は変更なし |
| 予算 | 1,009要求・掃引17,177回、違反0 |
| 旧基底 | P1 全20条件・80 JSON・417必須パス、別枠 P0 の37 JSON・221必須パス |
旧い22,052件の挙動 digest(d0a2233574ab350e65217ef6da8ed037fe34020e8ee79eee2506bd9ce4320236)と、生成器による全例・宣言のバイト一致も通過しました。固定対象に、設計53・期待54・版の更新の検査・道具(再固定、記録の生成)を加えました。作成者 snapshot で、independent_review / evaluation_frozen は false です。
- 新 native 仕様 hash:数量
f52ea526…、測定af1c3a09…、表示36156316…、期間つき数量5f5c1388…、期間つき表示547aeb12…(先頭8桁) - 旧版(改訂前):
906766d。manifest183c3303…、束ace08ccf…(P2-k の最終) - 新版(
a7328b9)の manifestdfb897ab…、束e5c9058a…。版の記録を追加した後(記録の追加で固定対象が変わる)は、manifestd3b414bd…、束1091c677…
6. 限界と次
- 改訂の対象は、架空の単位表の2行です。計算規則の改訂、依存の追加・削除、拡張の削除、profile 名を変える方式、複数の版の同居は未実施です。
- 継承の差分は、旧入力が存在する範囲の比較です。旧入力に現れない振る舞いは比べられません。
- 宣言の書式は変えていません。継承を表す欄の追加が要るかは、H8 の根拠として残しました。
- 次の候補は、C2(縦断比較)です。着手前に利用者の確認を取ります。独立確認は将来の英語の別リポジトリで行います。