YONAPO RESEARCH
研究記録
MedDSL(仮称)

RESEARCH / RECORD

P2-l:拡張の版を上げる(依存される仕様の改訂と再固定)の設計

原文 docs/research/53-p2-l-design.md

15 KB

GitHubで見る

版 be280c0

この文書の目次 9項目

作成日: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. 受入条件

  1. 54 の変更される期待・追加例・版の記録の期待・affected() の予測を実装より先に固定し、実行結果から更新しない。
  2. 単位表を改訂し、再固定の道具で hash を依存の順に再計算し、生成器で実行例を再生成する。数量の計算規則・停止・課金・入力の形は変更しない。
  3. 5拡張の宣言の版を draft-2 に上げ、数量の宣言に VR-1 を足す。クラス・書式・registry の規則は変更しない。
  4. 版の記録と比較器(一般化した p2_checks)で、V1〜V8 を検査する。比較器自身の検出力を、壊した記録・壊した入力で確かめる。
  5. Python 3.11/3.14 で、全テスト系列・版比較つき統合評価・旧い22,052件の出力の挙動 digest を回帰する。分母の変更(数量系列の例 79→80 など)は、旧い値を履歴として残して明示的に更新する。
  6. 追加前は 906766d。固定対象へ、新しい設計・期待・版の記録・道具・検査を明示的に加える。
  7. 件数・必須パス・hash・予測の結果・残る穴を結果55へ記録する。independent_review / evaluation_frozen は false。

9. 範囲外

仕様の改訂の医学的な妥当性、単位表の外部標準への適合、複数の版を同時に載せる機構(二つの版の同居)、旧版の記録の自動移行、拡張の依存の循環、profile の名前に版を含める方式、宣言の書式の変更(継承を表す欄の追加は、結果を見て別に判断する)。

この断片は、仕様の改訂に対する版の手順の一つの実演で、任意の将来の改訂に同じ手順が使える保証ではありません。

P2-l

同じ区分の文書