作成日:2026-10-21。状態:作成者側の設計草案。実装・版の記録は未作成。原理の草案49 の§8 で次の候補に挙げた C6 を、P2-l として設計します。手指定の期待は 54。独立確認・評価用正解の凍結は未実施で、運用方針29 に従います。単位・量種・数値はすべて架空で、外部資料・患者情報・実データは使いません。
1. 問いと今回の判断
P2-d の X11 は、P0 の draft-1 → draft-2 の更新を、履歴から再現する手順(V1〜V6)として実演しました。ただし対象は P0 の基底と P1 の例で、旧入力は pin の文字列置換で再固定できる範囲でした。P2 の拡張は、(a) 仕様の hash を、依存する拡張の仕様・モジュール・実行例の多くが固定し、(b) 内容を指定した確認が、hash を含む内容の hash(派生した hash)を拘束するので、置換では再固定できません。
研究上の問いは、依存される拡張(P2-f の数量)の仕様を改訂したとき、旧版を消さず、旧入力を黙って再解釈せず、再検証の範囲を宣言から列挙でき、旧版との継承を差分で検査できるかです。49 の H8(意味の継承を宣言する枠がない)、H1(七欄)、H5(クラス表)を、実装の前に予測を固定して試します。
| 判断 | 初回に採る設計 | 理由・見直す条件 |
|---|---|---|
| VD1 | 改訂の対象は P2-f の単位表(quantity_spec.json)。既存の単位 u_third の換算係数を 1/3 から 2/3 に改訂し、新しい単位 u_hundred(基底の100倍)を足す |
同じ ID の意味が版で変わる、最も危険な場合を使う。ID は不透明な識別子で、名前は意味を保証しない(QT-D6)。依存先 P2-g・P2-h・P2-i・P2-j の4拡張へ波及する |
| VD2 | 版の識別は、profile の名前ではなく(profile、仕様の hash、コミット)の組。profile の名前は維持し、宣言の version を draft-2 に上げる |
旧記録の required_capabilities に書かれた profile 名を、新版も同じ能力として読めるようにする(P0 の draft-2 の先例)。互換の判断は、消費側が固定する hash が担う |
| VD3 | 依存先は、仕様が数量の hash を含むので、自分の仕様の hash も変わる。依存先も draft-2 に上げ、depends_on の版を更新する |
「版が変わらないまま hash だけ変わる」状態を作らない |
| VD4 | 再固定は、手編集ではなく、再固定の道具(依存の順に hash を再計算する)と、実行例の生成器で行う | 派生した hash(確認が拘束する内容の hash)は置換できない。生成器を旧版と同時に保持する必要がある |
| VD5 | 旧版は消さない。旧版は、git の履歴の旧コミットとして残し、旧版の木で旧版の契約を再現する | P2-d の V1・V2 の先例 |
| VD6 | 版の記録に、宣言した変更(追加した単位、改訂した換算係数、影響を受ける入力)と、再固定する pin を書く。宣言にない差は失敗にする | P2-d の V3 の先例。記録の形は p2-version-record-draft-2 |
| VD7 | 旧入力の扱いを三つに分ける:(i) 新版にそのまま渡す(旧い pin の拒否、または同一)、(ii) 再生成した入力と比べる(要求は hash の値を除いて同一、期待も同一)、(iii) 旧版の木での結果と、再生成した入力の新版での結果を比べる(宣言した変更を除いて同一) | (iii) が H8 の差分の検査。(ii) は入力が黙って変わっていないことを見る |
| VD8 | 継承の差分の検査を、事前に義務(VR-1)として宣言する。契約の宣言の書式は変えず、既存の書式の義務として書く | 現在の書式が継承を機械的に表せるかを、書式を変えずに試す(H8)。書式の不足が見つかれば結果に記録する |
| VD9 | 再検証の範囲は affected() で列挙し、実際に再固定が要った範囲と比べる(X13 の先例) |
列挙の不足は、前もって予測を固定して測る(§6) |
2. 改訂する内容
| 項目 | 版 draft-1 | 版 draft-2 |
|---|---|---|
u_third |
次元 [1,0]、倍率 1/3 | 次元 [1,0]、倍率 2/3(同じ ID で意味が変わる) |
u_hundred |
なし | 次元 [1,0]、倍率 100/1(追加) |
| その他の単位・量種 | u_base・u_ten・u_half・v_base・w_base・w_hundredth、5量種 |
変更なし |
改訂は単位表だけで、数量の計算規則、入力の形、停止、課金、回答の形は変えません。したがって、u_third を使わない入力は、再固定すれば旧版と同じ結果になるはずです(VR-1)。u_third を使う旧入力は、旧版の木では旧い結果、新版では新しい結果になり、この差が宣言した変更です。
3. 波及する範囲
数量の仕様の hash は、依存先の仕様・モジュールの定数・実行例に固定されています。
| 層 | 固定している実体 | 再固定で変わるもの |
|---|---|---|
| P2-f 数量 | quantity_spec.json |
仕様 → quantity.py の SPEC_SHA256 → 宣言 |
| P2-g 測定 | measurement_spec.json が数量の hash を含む |
仕様の hash → measurement.py の定数、確認が拘束する内容の hash(派生)、実行例、宣言 |
| P2-h 表示 | display_spec.json が数量・測定の hash を含む |
仕様 → display.py の定数、実行例、宣言 |
| P2-i 期間つき数量 | temporal_measurement_spec.json が数量の hash を含む |
仕様 → temporal_measurement.py の定数、派生した hash、実行例、宣言 |
| P2-j 期間つき表示 | temporal_display_spec.json が数量・P2-i の hash を含む |
仕様 → temporal_display.py の定数、実行例、宣言 |
実行例は5系列の約680ファイルです。そのうち、意味が変わるのは u_third を使う6件(P2-f の3件、P2-h・P2-i・P2-j の各1件)だけです。
4. 版の手順(P2 の拡張へ一般化した V1〜V8)
| 番号 | 手順 | 検査 |
|---|---|---|
| V1 | 旧版を保持する:旧版のコミットと、その版の統合評価の結果を版の記録に書く | コミットが履歴にあり、新版のコミットの祖先で、現在の履歴の祖先 |
| V2 | 旧版は旧版の契約で再現できる:旧コミットの木で統合評価を実行する | 合格し、分母・manifest・束の hash が記録と一致 |
| V3 | 版の記録に変更を宣言する:追加した単位、改訂した換算係数と影響を受ける入力、再固定する pin | 記録の構造、宣言した入力の実在 |
| V4 | 旧入力は新版で黙って再解釈されない:旧入力を新版の木へそのまま渡す | 結果は、旧版と同一、または宣言した理由(profile_spec_mismatch)での拒否。それ以外 0 |
| V5 | 再固定した入力は旧入力と同一:同じ ID の入力を、hash の値を除いて比べる | 要求も期待も、宣言した変更を除いて同一。追加・欠落は宣言どおり |
| V6 | 旧版との継承の差分(VR-1):旧版の木での旧入力の結果と、新版の木での再生成した入力の結果を比べる | 宣言した変更の入力だけが違い、違う経路も宣言と一致 |
| V7 | 再検証の範囲:affected() が列挙した範囲と、実際に再固定が要った範囲を比べる |
一致、または不足の一覧を記録 |
| V8 | 前方の互換:新版で追加した単位を使う入力を、旧版の木へ渡す | 旧版は未知の単位として停止し、黙って別の単位に読み替えない |
5. 版の記録(p2-version-record-draft-2)
P2-d の記録(p2-version-record-draft-1)との違い:(1) 再固定を文字列置換ではなく再生成した入力の比較で行う、(2) pin の読み取り元をモジュールの定数として記録に書く、(3) 旧入力の拒否の状態と理由を記録に書く(P2 の拡張は unsupported_profile / profile_spec_mismatch)、(4) 評価の再現を P1-d ではなく統合評価(evaluate-p2.py)で行う。
| 項目 | 内容 |
|---|---|
from・to |
コミットと、その木での統合評価の要約(合格、分母、manifest・束の hash) |
suites |
比べる実行例の系列 |
pins |
再固定する pin:{file, name} の列(5件:quantity.py ほか4つのモジュールの SPEC_SHA256) |
pin_refusals |
旧入力を新版へ渡したときの宣言した拒否:{status, code} |
declared_changes |
added_unit・changed_value(単位と換算係数の旧新、影響を受ける入力)・added_input・repinned(意味の変更がない再固定) |
measured |
比較器の測定値を固定したもの(分類の件数、変更ファイルの数ほか) |
新版のコミットは、新版の実装を含むコミットの後に、記録を追加するコミットで固定します(記録はそれ自身を含む木のコミットを指せないため)。
6. 七欄と義務の主題(H1・H2・H8 の実験)
七欄を実装の前に埋めます。
| 欄 | 版の更新での決定 |
|---|---|
| 前提 | 単位表の改訂は意味の改訂(同じ ID で意味が変わる)。数量の計算規則は変えない |
| 版 | 宣言の version を draft-2。profile の名前は維持し、仕様の hash とコミットで識別する |
| 確認対象 | 変更なし。確認が拘束する内容の hash は、仕様の hash を含むので派生して変わり、旧い確認は新版で使えない(再生成が要る) |
| 情報の選択 | 変更なし |
| 問い | 変更なし。u_third を使う換算の結果だけが変わる |
| 保持・喪失・追加 | 保持:旧版の木と旧入力・旧い結果。追加:u_hundred。変更:u_third の係数。旧い結果を新版へ書き換えない |
| 資源・停止 | 変更なし。旧い pin の入力は unsupported_profile(予算に依らず) |
義務は、数量の宣言に VR-1(継承の差分) を一つ足します(finite_check)。依存先4件は版と依存の版を更新するだけで、義務は増やしません。主題 A(識別・版・依存の固定)、G(再現・旧経路の非干渉)に当たり、意味固有の義務は0件と予測します(Y2)。
7. 実装前に固定する予測と反例
| ID | 予測 | 外れた場合に分かること |
|---|---|---|
| Z1 | 旧版は旧コミットの木で、旧版の契約のまま再現できる | 旧版の保持が破綻している |
| Z2 | 旧入力を新版へそのまま渡すと、全て「同一」または「profile_spec_mismatch での拒否」。それ以外 0(黙った再解釈 0) |
版の安全の根拠(hash の固定)が足りない |
| Z3 | 再生成した入力は、hash の値を除いて旧入力と同一。期待も、宣言した6件を除いて同一。追加は Q25 の1件だけ | 再生成が入力を黙って変えた |
| Z4 | 旧版の結果と新版の結果(再生成した入力どうし)の差は、宣言した6件だけ。他は同一 | H8 の継承が崩れている、または宣言が不完全 |
| Z5 | affected() は、5つの拡張の全てを列挙する。一方 regenerate は、自分の仕様の hash を持つ末端のモジュール(display.py・temporal_display.py)と、宣言と索引を列挙せず、実際の再固定の範囲を過小に見積もる |
列挙が過大または過不足なし(その場合は予測が外れた) |
| Z6 | 影響が小さい意味の改訂(6入力)でも、実行例の約680ファイルが書き換わる | hash の固定が局所的なら、書き換わる範囲が小さい |
| Z7 | 新版で追加した単位を使う入力を旧版の木へ渡すと、旧版は未知の単位で行を止める(V8) | 前方で黙った読み替えが起きる |
反例の候補:(R1) 派生した hash を持つ入力を、旧い pin から新しい pin へ文字列置換して新版へ渡す → 確認の hash が合わず拒否される(置換では再固定できない)。(R2) u_third を使わないが同じ入力形の入力は、継承の差分で同一になる。(R3) u_third を使う旧入力を、旧い pin のまま新版へ渡す → 結果が変わらず拒否される(旧版の意味で答えない)。
8. 受入条件
- 54 の変更される期待・追加例・版の記録の期待・
affected()の予測を実装より先に固定し、実行結果から更新しない。 - 単位表を改訂し、再固定の道具で hash を依存の順に再計算し、生成器で実行例を再生成する。数量の計算規則・停止・課金・入力の形は変更しない。
- 5拡張の宣言の版を
draft-2に上げ、数量の宣言に VR-1 を足す。クラス・書式・registry の規則は変更しない。 - 版の記録と比較器(一般化した
p2_checks)で、V1〜V8 を検査する。比較器自身の検出力を、壊した記録・壊した入力で確かめる。 - Python 3.11/3.14 で、全テスト系列・版比較つき統合評価・旧い22,052件の出力の挙動 digest を回帰する。分母の変更(数量系列の例 79→80 など)は、旧い値を履歴として残して明示的に更新する。
- 追加前は
906766d。固定対象へ、新しい設計・期待・版の記録・道具・検査を明示的に加える。 - 件数・必須パス・hash・予測の結果・残る穴を結果55へ記録する。
independent_review/evaluation_frozenは false。
9. 範囲外
仕様の改訂の医学的な妥当性、単位表の外部標準への適合、複数の版を同時に載せる機構(二つの版の同居)、旧版の記録の自動移行、拡張の依存の循環、profile の名前に版を含める方式、宣言の書式の変更(継承を表す欄の追加は、結果を見て別に判断する)。
この断片は、仕様の改訂に対する版の手順の一つの実演で、任意の将来の改訂に同じ手順が使える保証ではありません。