YONAPO RESEARCH
研究記録
MedDSL(仮称)

RESEARCH / RECORD

P2-n:拡張の宣言に「継承」の欄を足す(契約の変更)の設計

原文 docs/research/59-p2-n-design.md

15 KB

GitHubで見る

版 be280c0

この文書の目次 8項目

作成日:2026-10-21。状態:作成者側の設計草案。契約の書式・registry・宣言・検査は未変更。原理の草案49 の仮説 H8(意味を継承する関係を宣言する枠がない)に対し、利用者の指示(2026-10-21「継承を宣言する欄(H8)を契約に足す」)で、拡張の宣言の書式を変更します。手指定の期待は 60。独立確認・評価用正解の凍結は未実施で、運用方針29 に従います。外部資料・患者情報・実データは使いません。以下は内部契約の作業定義で、医学的な意味や外部標準への適合を主張しません。

1. 問いと、これまでの根拠

「継承」とは、拡張 X が拡張 Y の意味の一部(断片)を、実装を共有せずに再び述べ、その断片では Y と観測が一致することを指します。実装の import で共有する場合は「依存」で、等しさは構成により成り立つので、継承ではありません。

段階 H8 の根拠
P2-k P2-e の意味を継承するが、実装は共有しない。継承は P2-e の実装との行ごとの差分(21,920行)で確認したが、宣言には書かれない
P2-l 継承の差分 VR-1 を既存の書式の義務として宣言できたが、registry は「旧版との差分」を理解せず、検査の名前を引くだけ
P2-m 文脈の判定は P2-g の matched_context を再び述べたもの。P2-g を変更しても affected() は P2-m を列挙しない。P2-g の比較の理由を一つ壊した木で、P2-m の19テストのうち失敗したのは P2-g との差分の検査だけだった

研究上の問いは三つです。

  1. 継承を、宣言の書式への小さな追加(欄・解決・登録時に実行できる証人)で、registry から見え、一部を機械的に確かめられるようにできるか。
  2. 追加は、affected()(再検証の範囲)と independent_pairs()(独立の判定)をどう変えるか。契約そのものの版を上げる変更に、版の手順(P2-d/P2-l)は耐えるか。
  3. 欄を必須にして既存の20宣言に明示を迫ると、これまで書かれなかった継承がどれだけ見つかるか。登録時の証人にできる範囲は。未宣言の継承を機械的に疑えるか。

2. 設計判断

判断 初回に採る設計 理由・見直す条件
ID1 宣言の書式を p2-extension-manifest-draft-2 に上げ、inherits を必須の項目にする(空配列は「継承なし」の明示)。draft-1 の宣言は unsupported_manifest_schema で拒否する。既存の20宣言を再宣言する 任意の項目では、書き忘れと「継承なし」が区別できない。必須にして、全宣言に明示を迫る。拒否は旧入力を黙って再解釈しない原則(P2-l の Z2)に合わせる
ID2 継承の項目は {from, fragment, obligation, witnesses, witness_gap}。同じ from に断片が複数あれば項目を分ける(from と fragment の組で一意) §3
ID3 関係は一種類:「断片 fragment で、継承する側の観測が元の観測と一致する」(agrees_on)。意図した差は断片の外に置き、fragment の文で述べる 差(精密化の追加など)を表す関係は初回に設けない。範囲外
ID4 元の拡張は先に登録済みでなければならない。自己の継承、from と fragment の重複、結び付ける義務がない・検査(checks)がない場合は拒否する 継承の主張に、証拠の強さ(義務の evidence)と検査の名前を結ぶ
ID5 証人(witnesses)は、元の拡張の既存の例と自分の既存の例の組と、結果の中の同じ意味の位置の組。登録時に両方を評価し、値が一致することを確かめる。証人がなければ理由(witness_gap)を書く(防護例の guard_gap と同じ形) 登録時に実行できる有限の証人。完全な差分の検査は、義務の checks が引くテストが担う
ID6 affected() は、元の拡張が影響を受けたら、継承する側も影響を受けた(理由 inherits:…)として列挙する。依存と同様に推移する P2-m で見えた欠落を塞ぐ
ID7 independent_pairs() は、継承で結ばれた組を独立としない 継承は、意味の変更が他方に及ぶ結合
ID8 版の比較の道具は、木の宣言と registry をその木の実装で扱う(作業ツリーの registry に旧い木の宣言を渡さない) 契約の版が変わると、作業ツリーの registry は旧い宣言を拒否する。P2-d の V2(旧版は旧版の契約で再現)の原則
ID9 宣言の書式の変更を、版の手順で検証する:旧い宣言と新しい宣言の差が、宣言した変更(schema_version と inherits)だけであること 契約の変更も、宣言した差だけを許す

範囲外:同じ拡張の版の間の継承(P2-l の VR-1。別の関係)、継承の自動検出(疑いの機械的な探索は §8 の測定だけで、登録の条件にしない)、BASE からの継承、差を表す関係(refines)、証人の自動生成。

3. 書式

"inherits": [
  {
    "from": "p2-measurement-binding",
    "fragment": "matched_context:property・specimen・method の一致と、不一致の理由 different_property/different_specimen/different_method",
    "obligation": "LC-10",
    "witnesses": [
      {"from": {"example": "examples/p2-measurement/m30-version.json", "path": ["results", 0, "reason_codes"]},
       "to":   {"example": "examples/p2-longitudinal/l20.json",        "path": ["results", 0, "reason_codes"]}}
    ]
  }
]
項目 内容 検査
from 元の拡張の id 空でない文字列。自己でない。登録済み(unresolved_inheritance)
fragment 再び述べた断片の説明(何が一致するか) 空でない文字列。from との組で一意
obligation 継承の主張を担う、この宣言の義務の id 宣言内に実在し、checks が空でない(inheritance_obligation_missing・inheritance_obligation_without_checks)
witnesses 証人の配列。各要素は {from: {example, path}, to: {example, path}}。example はリポジトリ相対のパス、path は結果の中の位置(空でない配列) from.example は元の拡張の evaluation.examples に、to.example は自分の evaluation.examples に含まれる(witness_example_not_owned)。評価した値が一致(inheritance_witness_mismatch)。位置が結果にある(inheritance_witness_unresolved)
witness_gap 証人がない理由(witnesses が空のときだけ、必須) unexplained_witness_gap、witness_gap_with_witnesses

証人は、結果の中の観測の位置の一致だけを見ます。入力が構造的に等しい例の組(断片に関して同じ問い)から選びます。例の組の選び方は、入力の構造から決め、出力を見てから選ばない(60 の§1)。一致した証人は、断片の一致の有限の証拠で、継承の証明ではありません。

4. 登録・列挙・独立への影響

  • 登録:書式の検査、実体の検査、防護例の検査に続く registry の規則として、継承の解決と証人の評価を行う。拒否は全か無か。load_manifests の並びは、依存に加えて継承の元を先にする。相互の継承は解決できず拒否される。
  • affected(changed):元の拡張が影響を受けたとき、継承する側を列挙に加える(reasons[id] = ["inherits:" + 元の id の列])。依存の伝播と同じ反復で推移させる。
  • independent_pairs:related の条件に、継承の辺(どちらの向きでも)を加える。
  • 報告:統合評価は、継承の項目の数・証人の数・理由つきの欠落(witness_gap)の数を、分母として固定する。

5. 七欄と義務の主題(H1・H2 の実験)

契約の変更も、七欄に当てはめて実装の前に書きます。

欄 P2-n の決定
前提 継承は、実装を共有しない再述と断片の一致。依存・読み取りとは別の関係。意味の正しさは検査しない
版 宣言の書式を draft-2 に上げる(ID1)。拡張の版・profile・仕様の hash は変えない
確認対象 継承の主張に、証拠の強さ(義務の evidence)と検査の名前(checks)を結ぶ。人の確認の対象ではない
情報の選択 証人は元と自分の既存の例。登録時に評価する
問い 「X は Y の断片 F を継承するか」「Y が変わったら再検証すべき拡張は」「独立な拡張の組は」
保持・喪失・追加 保持:旧い宣言の他の欄。追加:inherits。喪失:なし(draft-1 の宣言は拒否され、再宣言される)
資源・停止 登録は有限。証人は例を評価するだけで、予算の掃引には加えない

新しい義務の主題は、既存の主題(A〜H)のうち A(識別・版・依存の固定) と G(再現・旧経路の非干渉) に当たり、意味固有の義務は0件と予測します。

6. 実装前に固定する予測と反例

6.1 予測

ID 予測 外れた場合に分かること
N1 実装の変更は、registry(extensions.py)・宣言(と生成器)・検査・道具に限り、拡張の実装モジュール・native 仕様・旧実行例は一つも変えない 継承の欄が、拡張の実体の変更を要求する
N2 20宣言に明示を迫ると、設計文書の「と同じ」「継承」の記述から手で挙げた8件(60 の§1)が見つかり、予測外の継承が1件以上見つかる 書かれた継承は文書に書かれたものがすべて。または、強制の効果がない
N3 8件のうち、既存の例の組で証人を付けられるのは6件。残る2件は、理由つきの欠落になる 証人にできる範囲の見積もりが外れた
N4 affected() の列挙が変わる(P2-g の measurement.py の変更は P2-m を含み、P2-e の temporal.py の変更は1件から7件に広がる) 伝播が過小または過大
N5 独立な組は150から144に減る(継承で結ばれて、かつ依存・読み取りで結ばれていなかった6組) 独立の判定が、継承を見ない
N6 元の拡張の断片の変更が、元の拡張自身の防護例に捕まらない場合に、継承する側の証人が捕まえる。証人が覆う変更は捕まえ、覆わない変更は捕まえない(差分の検査の全数の方が広く捕まえる) 証人は、有限の差分の検査の代わりにならない(その場合も期待どおり)
N7 書式を draft-2 にすると、版の比較の道具が旧い木の宣言を作業ツリーの registry で読んで失敗する(ID8 の前の状態)。ID8 の修正で、P2-l の記録の検証が再び通る 道具が契約の版に依存していない
N8 疑い(共通の文字列定数)の機械的な探索は、宣言した継承の半数以上を見つけるが、疑いの半数以上は継承ではない(適合率が半数未満) 探索が実用的な検出器になる、または使えない
N9 既存の宣言・実行例・実装の意味は変わらない。draft-1 → draft-2 の宣言の差は、schema_version と inherits だけ 契約の変更が、宣言の他の欄の変更を要求した

6.2 反例の候補(60 に具体値を固定)

ID 内容 期待
X1 inherits を欠く/draft-1 の宣言 missing_field/unsupported_manifest_schema
X2 自己、未登録、重複、相互の継承 self_inheritance、unresolved_inheritance、duplicate_inheritance、解決できず拒否
X3 義務がない・検査がない義務 inheritance_obligation_missing・inheritance_obligation_without_checks
X4 証人の値が違う/位置がない/例が自分のものでない inheritance_witness_mismatch・inheritance_witness_unresolved・witness_example_not_owned
X5 証人も理由もない/両方ある unexplained_witness_gap・witness_gap_with_witnesses
X6 元の拡張の断片を、元の防護例に捕まらない形で壊す 元は登録され、継承する側の証人が拒否する(N6)
X7 継承がないのに継承を宣言する(偽りの主張) 証人が一致するだけで、継承の真偽は検査できない(限界として記録)

7. 受入条件

  1. 60 の予測・期待・手で挙げた継承の一覧を、実装より先に保持し、結果から更新しない。
  2. registry の変更は extensions.py に限る。拡張の実装・仕様・旧実行例は変更しない(N1)。
  3. 20宣言を再宣言し、旧い宣言との差が schema_version と inherits だけであることを履歴で確かめる(N9)。
  4. 継承の解決・証人・列挙・独立・順序のそれぞれについて、拒否と受理の検査と、registry の変異の検出を行う。
  5. 版の比較の道具を、木ごとの registry で動かすように直し、P2-l の記録の検証が通ることを確認する(N7、ID8)。
  6. 元の拡張の断片を壊す実験(N6)と、疑いの探索の測定(N8)を行い、証人・差分の検査・疑いの探索の検出範囲を分けて記録する。
  7. Python 3.11/3.14 で、全テスト系列と統合評価、旧い22,052件の挙動 digest を回帰する。分母の変更は旧い値を履歴として残して明示的に更新する。
  8. 追加前は 3c16f68、固定対象1,355ファイル、manifest cbf877d00adacbb4205635e83add9928e33ba4ba4e9fb2a54182d78114444b06、束 fcd907700691fa151ebac880c2083ea3eeba19f78b8618497ca63d408590c61c。件数・hash・予測の結果・残る穴を結果の文書に残す。independent_review / evaluation_frozen は false。

8. 範囲外

継承の真偽の機械的な判定(証人の一致は有限の証拠で、継承の証明ではなく、偽りの宣言を排除しない)、同じ拡張の版の継承、差の関係、継承を使った自動の移行、疑いの探索の登録条件化。最終目標は変化に耐える医療コード体系そのものの確立であり、この有限の契約の変更はその一つの検査です。

P2-n

同じ区分の文書