YONAPO RESEARCH
研究記録
MedDSL(仮称)

RESEARCH / RECORD

P2-r:記録に観察者を足す(中核モデルの変更の伝播)の設計

原文 docs/research/73-p2-r-design.md

15 KB

GitHubで見る

版 be280c0

この文書の目次 9項目

作成日:2026-10-21。状態:作成者側の設計草案。実装・版の記録は未作成。P2-q の結果72 の発見 F23(記録に観察者がいない)を、モデルの穴として直します。同時に、P2-l の版の更新の手順を、これまでで最も大きな依存の木(期間つき数量 P2-i と、それに依存する5拡張)に当てて、中核のモデルの変更がどこまで及ぶかを測ります。利用者の承認(2026-10-21「進んでいいよ」。推奨案:観察者は任意の項目)に従います。手指定の期待は 74。独立確認・評価用正解の凍結は未実施で、independent_review / evaluation_frozen は false のままです。数値・識別子はすべて架空です。外部資料は新たに参照しません。

1. 問い

ID 問い
Q1 記録に任意の項目を足す変更で、旧入力を黙って再解釈せず、旧版を履歴から再現でき、再検証の範囲を宣言から列挙できるか(P2-l の手順は、数量の単位表より大きい木でも通用するか)
Q2 変更が及ぶ範囲を実測すると、affected() の列挙・予測した書き換えの数とどれだけ食い違うか(F5 の続き。734ファイルが P2-i の仕様の hash を埋め込んでいる)
Q3 観察者が分かる記録は、P2-q の生成の Provenance を出せるようになり、観察者が分からない記録は引き続き出さない(推測で補わない)か
Q4 確認が拘束する内容の hash は、任意の項目の追加で、既存の記録の確認を黙って無効にしないか(無効になるなら、それは仕様の hash の変更によるもので、項目の追加自体ではないと切り分けられるか)

2. 設計判断

判断 初回に採る設計 理由・見直す条件
RD1 記録に任意の項目 observer を足す:`{kind: human device, ref}`。省略は「観察者不明」で、旧入力と同じ意味。必須にしない
RD2 観察者は記録の内容の一部:確認が拘束する内容の hash に含まれる。観察者を後から書き換えた記録の確認は無効 誰が観察したかは、確認した内容の一部。出自(origin)と同じ扱い
RD3 選択された記録の根拠(P2-i の binding_evidence.selected[])に、観察者があるときだけ record_observer を出す。省略のとき、キー自体を出さない 観察者のない既存の入力の結果が変わらない。値が null のキーを全結果に足すと、全ての結果が変わる
RD4 P2-o の操作 record・correct が任意の observer を受け取り、そのまま台帳へ渡す。選択の根拠に record_observer を、あるときだけ出す。確認の操作は観察者を持たない。検査は P2-i の検査に任せる 台帳の妥当性は P2-i の再実行で検査する(CL-2)。P2-o は再実装しない
RD5 P2-p は変更しない(選択の根拠をそのまま通すだけ)。P2-j・P2-m も変更しない(仕様の hash の再固定だけ) 影響は再固定だけの拡張を、再固定として測る
RD6 P2-q は、記録に観察者があり、Provenance を宣言したとき、生成の Provenanceを出す。agent は、観察者が device なら Device、human なら宣言された型(provenance.observer_type。確認者の型と同じ集合)。人の観察者で型の宣言がなければ、推測せず依頼 declare_observer_type を返す。AI 由来の記録では、生成の Provenance の agent に、AI(Device)と観察者の両方を入れる P2-q の「ライブラリは判断せず、宣言を使い、足りなければ依頼」と同じ。観察者がない記録は、これまでどおり(AI 由来のときだけ生成を出す)
RD7 版:P2-i(p2-temporal-measurement)を draft-3 に上げる。仕様の hash を埋め込むために再固定が要る拡張も、版を一つ上げ、依存の版を更新する:P2-j(draft-3)、P2-m・P2-o・P2-p・P2-q(draft-2) 「版が変わらないまま hash だけ変わる」状態を作らない(P2-l の VD3)
RD8 再固定は、再固定の道具(依存の順に hash を再計算)と、実行例の生成器で行う。手編集をしない P2-l の VD4。派生した hash(確認が拘束する内容の hash)は、置換では再固定できない
RD9 版の記録は p2-version-record-draft-2。旧入力の扱いを三つに分ける(P2-l の VD7)。旧版のコミットは dc0aabe(P2-q の直後) 手順を変えずに、規模だけを変える

3. 変更の内容

3.1 P2-i(期間つき数量)

  • 記録の項目に任意の observer を足す。形:{kind, ref} の完全一致(欠落は missing_field、余分な欄は unknown_field)。kind は human・device のどちらか(それ以外は invalid_observer)。ref は空でない文字列。
  • 内容の hash は、記録の JSON 全体を含むので、observer を持つ記録は持たない記録と別の hash になる。observer を持たない記録の記録自身の内容は変わらないが、hash の入力に仕様の hash が含まれるため、全ての記録の hash が変わる(仕様の hash の変更によるもの。Q4)。
  • 選択された記録の根拠に、observer があるときだけ record_observer を出す。
  • 課金・停止・選択の規則・回答の形は変えない。

3.2 P2-o(臨床ライブラリ)

操作 record・correct の任意の observer を台帳の記録へ渡し、選択の根拠(selection)に、あるときだけ record_observer を出す。他は変えない。

3.3 P2-q(Observation の写像)

  • observations[].provenance に任意の observer_type を足す(許容は確認者の型と同じ4種。それ以外は unsupported_observer_type)。
  • 生成の Provenance を、(a) 出自が ai_candidate、または (b) 観察者がある、のとき出す(Provenance の宣言があるときだけ)。agent は、AI(Device、出自の参照)、観察者(device→Device、human→宣言した型)の順に、あるものを入れる。recorded は記録の時刻。
  • 人の観察者で observer_type がない行は needs_information。依頼 {element: provenance, action: declare_observer_type, record_ref, property_ref: null}。
  • 流れ:観察者のある記録で、Provenance を出すとき observer を保持に、出さないとき observer を失うものに。人の観察者の型を使ったとき、仮定 assumption:observer_type_declared を足す。観察者のない記録の流れは変えない。

4. 版の計画

拡張 現在 変更後 変更の種類
p2-temporal-measurement(P2-i) draft-2 draft-3 意味の変更(任意の observer)
p2-temporal-display(P2-j) draft-2 draft-3 再固定のみ
p2-longitudinal-comparison(P2-m) draft-1 draft-2 再固定のみ
p2-clinical-library(P2-o) draft-1 draft-2 意味の変更(操作の observer、選択の根拠)
p2-structure-grounding(P2-p) draft-1 draft-2 再固定のみ
p2-observation-projection(P2-q) draft-1 draft-2 意味の変更(生成の Provenance、観察者の型)

他の拡張(数量、測定、表示、期間、精密化など)は、P2-i の仕様の hash を埋め込まないので変更しない。

5. 版の手順(V1〜V8)

P2-l の手順をそのまま使う:V1 旧版の保持、V2 旧版の契約での再現、V3 版の記録で変更を宣言、V4 旧入力は新版で黙って再解釈されない(旧い pin は profile_spec_mismatch で拒否)、V5 再固定した入力は旧入力と同一(hash の値を除く)、V6 旧版の結果と新版の結果(再生成した入力どうし)の差は宣言した変更だけ、V7 再検証の範囲(affected() と実測)、V8 前方の互換(新版で追加した項目を使う入力を旧版の木へ渡すと、旧版は黙って無視せず拒否する)。

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

6.1 予測

ID 予測 外れた場合に分かること
Y1 旧版は旧コミットの木で旧版の契約のまま再現できる(dc0aabe:23宣言・313義務・495防護例、manifest 89cb715d…、束 7b13731a…) V1・V2
Y2 旧入力を新版へそのまま渡すと、P2-i の仕様を pin する系列(P2-i・P2-j・P2-m・P2-o・P2-p・P2-q)の入力は全て profile_spec_mismatch で拒否され、それ以外の系列は同一。黙った再解釈は 0 V4
Y3 再生成した入力は、hash の値を除いて旧入力と同一。期待も、hash の値と宣言した追加を除いて同一。観察者のない旧入力の結果は、hash の値を除いて同一(record_observer を出さないので) V5・V6、RD3
Y4 新版で追加した項目(observer)を使う入力を旧版の木へ渡すと、旧版は unknown_field(記録の項目)で拒否し、黙って無視しない V8
Y5 affected() は、P2-i の仕様の変更で、6拡張(P2-i・P2-j・P2-m・P2-o・P2-p・P2-q)を過不足なく列挙する。regenerate は、仕様の hash を持つ末端のモジュールと実行例を列挙するが、生成器・宣言・索引・台帳を列挙しない(過小。P2-l の Z5 と同じ) V7、F5
Y6 実際に書き換わるファイルは、P2-i の仕様の hash を埋め込む実行例728件と、それを含む manifest(6)、仕様・モジュール(4)、宣言(6)と索引、台帳の manifest を中心に、旧版との差分で750〜800件(新しい実行例・文書・検査を含む)。意味の変更の入力は新しい実行例だけ Q2
Y7 記録に観察者があるかどうかで、確認が拘束する内容の hash は変わる。観察者のない記録の hash は、仕様の hash の変更だけで変わり、項目の追加では変わらない(仕様の hash を含まない hash の部分は不変) Q4
Y8 観察者が分かる記録は生成の Provenance を出せる。観察者が分からない記録は、これまでどおり出さない。人の観察者で型の宣言がないとき、推測せず依頼になる Q3
Y9 版の記録の書式 p2-version-record-draft-2 は、この更新(意味の変更が新しい項目の追加)を、書式を変えずに宣言できる(宣言の種類 added_field が使える) 書式の十分性
Y10 登録時の防護例の評価は、仕様の hash を期待値に持つ防護例を壊す(P2-l の発見3の再現)。壊れる数は予測しない 第二の依存

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

ID 内容 試すこと
Z1 確認の後に観察者を書き換えた記録 確認の内容の hash が合わず拒否(review_record_hash_mismatch)。観察者は内容の一部
Z2 不正な observer(種類・参照・余分な欄・形) P2-i の符号で拒否。P2-o は P2-i の符号をそのまま返す
Z3 確認の操作に observer 拒否(確認は観察者を持たない)
Z4 観察者が分かる記録の訂正で、訂正が観察者を持たない 選ばれた記録の観察者だけが出る(訂正は元の観察者を継がない)
Z5 人の観察者で observer_type の宣言がない 推測せず依頼
Z6 AI 由来の記録に観察者 生成の Provenance の agent は AI と観察者の2件
Z7 Provenance を宣言せずに観察者がある記録 Provenance は出ず、observer は失うものに残る
Z8 旧い pin(draft-2 の P2-i の仕様の hash)の入力 新版は profile_spec_mismatch で拒否

7. 受入条件

  1. 74 の期待・予測・反例を、runtime より先に保持し、実行結果から期待を更新しない。
  2. 変更は P2-i・P2-o・P2-q に限り、P2-j・P2-m・P2-p は仕様の hash の再固定だけ(実装の論理を変えない)。再固定は道具と生成器で行い、手編集をしない。
  3. 版の記録を作り(p2-version-record-draft-2)、V1〜V8 を比較器と履歴の検査で確かめる。宣言にない差は失敗にする。
  4. P2-i・P2-o・P2-q の新しい実行例、別計算の更新、変異(観察者の hash への不算入、record_observer の欠落・誤出力、型の推測、生成の Provenance の誤出力)を検査する。
  5. Python 3.11/3.14 で、全テスト系列、版比較つき統合評価、旧い22,052件の挙動 digest を回帰する。分母の変更は旧い値を履歴として残す。
  6. 追加前は dc0aabe(P2-q の追加後)、固定対象1702ファイル、manifest 89cb715d68bf84f41e78fd9701c58dc51f5e906af46cd2d0926414ae8f0dcd5a、束 7b13731aed3779ab8f238713e0ae6747fd7832055014ad62611857ed64594c1d。件数・hash・予測の結果・残る穴を結果の文書に残す。independent_review / evaluation_frozen は false。

8. 範囲外

観察者の同一性の管理(同じ人かの照合、権限、資格)、観察者の履歴(変更の記録)、観察者を必須にする版、観察の道具(機器の校正など)、P2-g・P2-k など P2-i 以外の拡張の記録モデル、実在の識別子体系。

この設計は、記録モデルの変更が下流へ及ぶ様子を測る一つの実演で、観察者の記録が実際の運用に足りることの証明ではありません。最終目標は変化に耐える医療コード体系そのものの確立であり、この有限の設計はその一つの検査です。

9. 利用者に確認すること

ID 確認 推奨
U1 観察者を任意の項目にする(省略は観察者不明。必須にしない) 任意(承認済み)
U2 観察者の kind は human・device の2種だけにする 2種(細分は次の段階)
U3 訂正は元の観察者を継がない(訂正した人・機器が別なので、選ばれた記録の観察者だけを出す) 継がない

U1 は承認済みです。U2・U3 は推奨どおりに進み、異なる判断があれば結果に反映します。

P2-r

同じ区分の文書