作成日: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 との差分の検査だけだった |
研究上の問いは三つです。
- 継承を、宣言の書式への小さな追加(欄・解決・登録時に実行できる証人)で、registry から見え、一部を機械的に確かめられるようにできるか。
- 追加は、
affected()(再検証の範囲)とindependent_pairs()(独立の判定)をどう変えるか。契約そのものの版を上げる変更に、版の手順(P2-d/P2-l)は耐えるか。 - 欄を必須にして既存の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. 受入条件
- 60 の予測・期待・手で挙げた継承の一覧を、実装より先に保持し、結果から更新しない。
- registry の変更は
extensions.pyに限る。拡張の実装・仕様・旧実行例は変更しない(N1)。 - 20宣言を再宣言し、旧い宣言との差が
schema_versionとinheritsだけであることを履歴で確かめる(N9)。 - 継承の解決・証人・列挙・独立・順序のそれぞれについて、拒否と受理の検査と、registry の変異の検出を行う。
- 版の比較の道具を、木ごとの registry で動かすように直し、P2-l の記録の検証が通ることを確認する(N7、ID8)。
- 元の拡張の断片を壊す実験(N6)と、疑いの探索の測定(N8)を行い、証人・差分の検査・疑いの探索の検出範囲を分けて記録する。
- Python 3.11/3.14 で、全テスト系列と統合評価、旧い22,052件の挙動 digest を回帰する。分母の変更は旧い値を履歴として残して明示的に更新する。
- 追加前は
3c16f68、固定対象1,355ファイル、manifestcbf877d00adacbb4205635e83add9928e33ba4ba4e9fb2a54182d78114444b06、束fcd907700691fa151ebac880c2083ea3eeba19f78b8618497ca63d408590c61c。件数・hash・予測の結果・残る穴を結果の文書に残す。independent_review/evaluation_frozenは false。
8. 範囲外
継承の真偽の機械的な判定(証人の一致は有限の証拠で、継承の証明ではなく、偽りの宣言を排除しない)、同じ拡張の版の継承、差の関係、継承を使った自動の移行、疑いの探索の登録条件化。最終目標は変化に耐える医療コード体系そのものの確立であり、この有限の契約の変更はその一つの検査です。