YONAPO RESEARCH
研究記録
MedDSL(仮称)

RESEARCH / RECORD

P2-q:Observation の status・code の写像と Provenance への出力の実装と内部評価

原文 docs/research/72-p2-q-results.md

17 KB

GitHubで見る

版 be280c0

この文書の目次 7項目

作成日:2026-10-21。状態:P2-p の表せる行に、呼び出し側の宣言で Observation の status・code と Provenance を適用し、足りない宣言を依頼にする合成の専用 R5 を実装し、両 Python 版の全体回帰を通過。設計70、手指定期待71、接地の監査66 に従いました(利用者の指示:2026-10-21「status・code の写像と Provenance への出力を進めて」。U1〜U3 は設計70の推奨どおり)。70・71 の「未実装」という記載は設計時点の記録として保持します。独立確認・評価用正解の凍結は未実施で、independent_review / evaluation_frozen は false のままです。数値・識別子・写像の表はすべて架空です。構造の事実だけ、取得した FHIR R5 v5.0.0 のページ(台帳に記録、Git 管理外)の読み取りです。FHIR への適合は主張しません。

1. 行ったこと

項目 内容
実装 observation_projection.py と native 仕様 observation_projection_spec.json。P2-p の run_grounding を子として一度だけ呼び(子の予算は P2-p の全体の料金 M_g を先払いし、使い切りを照合)、representable の行に、宣言された status・code・確認者の型を適用する。宣言が足りない行は needs_information で依頼を返し、それ以外の行は P2-p の行のまま通す
実行例 examples/p2-observation/:75 JSON・1,249必須パス(Q19・N13・B3条件)。生成器は native を import せず、射影・流れ・依頼・料金を手指定する
宣言 p2-observation-projection.json:R5、18義務(共通4+R5の3+QR-1〜11)、防護例18。証拠は checked_native_template 10・finite_check 8。依存:P2-p。継承は宣言しない。構造の事実の出典を6つの仕様の pin(P2-p・P2-o・P2-i・P2-f の仕様を含む)に結ぶ
別計算 observation_oracle.py:基の行は P2-p の別計算を再利用し、どの記録が訂正か・どの確認が見えるか・確認者・時刻・出自は、台帳の結果でなく要求の操作の列から自前で読む。流れの表は手書き
検査 test_observation.py 14テスト(手指定・宣言の全数・確認と出自・通す行・宣言は使うが決めない・出典の結び付き・料金・予算の掃引・子の失敗の原子性・静的検査・型破損・順序と不変性・検査器・変異)
検査器 共通部品 p2_checks.py の未完了行の値の検査に、新しい欄 observation を足した。変異の表に B20 を足し、B17〜B19 の対象文字列を更新した(検査器の変異は74件と対照)
登録の入口 既存の実装・仕様・宣言・旧実行例は変更していない。変更したのは登録の入口と、手で保つ期待の一覧(X1)

2. 予測の結果(設計70の X1〜X10)

ID 予測 結果
X1 既存の実装・仕様・宣言・旧実行例を一つも変えずに実装できる 成立。既存の src/med_dsl で変更したのは host.py の2行。既存の examples/p2-* と宣言は0件変更(索引に1行追加)。P2-p・P2-o の実装・仕様・宣言・例は無変更
X2 宣言が足りない行は全て needs_information で、推測で補った status・code を持たない。足りれば projected 成立。status.correction の有無(3)×code_map(空・該当・別の性質)×選ばれる記録(原本・訂正)×確認者(なし・4種)の90通りの全数が、別計算と一致。不足は0件・1件・2件の三通りで、依頼の数が足りない宣言の数に等しい
X3 使った写像は added に仮定として残る。Provenance なしでは human_confirmed・origin_kind は失うものに残る 成立。全数で、Provenance を出す行だけ human_confirmed が保持に移り、AI 由来のときだけ origin_kind が保持に移る
X4 訂正が選ばれた行だけが correction を使う 成立。同じ台帳で、訂正の前の対象時点(原本の final)と後の対象時点(訂正)を比べた
X5 確認ごとに Provenance が一つ。複数の確認は時刻順。AI 由来だけが生成を先頭に持つ 成立。確認の数(1〜3)×出自(observed・judgment・ai_candidate)の9通り。参照時点より後の確認は出ない
X6 料金 M=2+M_g+3N。P2-p の実費は M_g 成立。固定例5件の呼び出しの追跡(M=42・43・47・73・73)と、乱数50要求で別計算と一致
X7 許容外の写像は静的に拒否される 成立。original→amended・preliminary、correction→final・registered、確認者の型 Device・Organization・未知の型
X8 義務は R5 と必須欄で足りる。クラスも書式も増えない。QR-11 は既存の主題に収まらない 成立。四つ目の「主題の外の義務」(P2-p の F18 の続き。P2-m の LC-12、P2-o の CL-9、P2-p の GR-9、P2-q の QR-11。F25)
X9 affected():P2-p の変更が、この拡張を列挙する 成立。P2-p・P2-o・P2-i・P2-f・P2-j・P2-m の変更が及ぶ全ての場合に、この拡張も列挙される(measurement.py の変更が及ぶ拡張は7件から8件)。この拡張の変更は他に及ばない
X10 宣言の文字列は判定に影響せず、そのまま出力に載る 成立。system・code を変えても、状態・理由・依頼・流れは同じ

3. 反例の結果(設計70の Z1〜Z9)

ID 内容 結果
Z1 訂正が選ばれ、status.correction の宣言がない amended を入れず、依頼 declare_correction_status(Q08・Q10)
Z2 code_map に性質がない 補わず、依頼 declare_code_mapping(Q09・Q10)
Z3 status.original に amended 静的に拒否(N08)
Z4 確認者の型に Device 静的に拒否(N11)
Z5 同じ記録に2件の確認 Provenance が2件、時刻順(Q04)。参照時点より後の確認は出ない(Q19)
Z6 AI 由来の記録 生成の Provenance(Device)が先頭、人の確認は別に出る(Q05)
Z7 P2-p が表せない行(2/3) 判定せず not_evaluated。宣言が足りなくても依頼は出ない(Q12)
Z8 宣言のない出力先 not_declared(P2-p の行のまま。Q13)
Z9 観察者が不明な記録 生成の Provenance は出さない(Q01)。出自の種類は失うものに残る

4. 分かったこと

  1. 意味の判断を宣言に委ねると、ライブラリは判断をせずに使える。 status・code・確認者の型はライブラリが決めず、足りなければ依頼になる。使った判断は、仮定として行ごとに残る。宣言を作る人が負う判断(人の確認を「完了で追加の行為が要らない」と読む、など)の重さは、ライブラリには見えない。
  2. 許容集合を、ページの定義から導くと、原本の status の選択は事実上一つになる。 original は final だけなので、その宣言は選択でなく、仮定を記録する儀式になる。本当の選択は訂正の amended/corrected だけ。許容集合が保守的すぎる可能性がある(preliminary など)。この読みは作成者のもので、別の読みを拒否する根拠は薄い。
  3. Provenance は、行為者が分かるものしか出せない。 agent は 1..* で必須。ライブラリの記録は、出自の種類と参照(AI なら Device)は持つが、観察した人は持たない。観察者が不明な記録の生成の Provenance は出せず、確認だけが出る(F23)。
  4. 依頼の宛先が二種類になった。 P2-o の依頼は医療者への追加の観察・確認。P2-q の依頼は、出力先の宣言を作る人への宣言の追加。形も別(4欄)。同じ needs_information で宛先が違うので、利用側は依頼の種類で見分ける必要がある。

新しい発見

ID 発見 根拠 限界
F22 required_paths の例は、配列の長さを検査できない。 配列を全体で書けるのは値が手で書けるときだけで、Provenance は対象のハッシュを含むので書けない。余分な項目を足す変異が、最初に選んだ例(Q19)では検出されなかった。余分な項目が先頭を押し出す例(Q06)へ向け直して検出された 変異 invisible_review_emitted の初回の未検出 別計算との比較(テスト)は項目の数を比べる。例の形式の限界
F23 記録に観察者がいない。 Provenance の agent が必須のため、観察者が不明な記録は生成の Provenance を出せない。変化に耐える体系(最終目標)にとって、誰が観察したかを持たない記録モデルは、出力先によっては出せない情報の穴になる 設計70のQD7・反例 Z9 観察者を記録モデルに足すかは、P2-i の記録の定義の変更になり、別の判断
F24 宣言の項目がまた増えた。 入れ子が3層(P2-q→P2-p→P2-o)になり、例が6つの仕様の hash を埋め込むので、宣言の pin が6つになった。pin の追加は手で書く(F19) 宣言の pins 入れ子が深くなるほど増える
F25 主題の外の義務が四つ目。 QR-11(外部の資料に結んだ事実)は、P2-p の GR-9 と同じ形。P2-m の LC-12、P2-o の CL-9 と合わせて、n=4 各設計の予測と実装後の割り当て 主題の分類は作成者による。新しい主題を立てるかは未決
F26 新しい拡張を足す手で保つ一覧は約11ファイルで、四度目も同じ。 継承を宣言しなくても、列挙の期待・独立な組・変異の表の大きさが変わる 変更したファイルの一覧(F15・F21 と同程度) 一覧は検査が漏れを教える

実装の最中に直した誤り

  • 実装の誤り:0件。75例の手指定の期待は、初回の実行ですべて満たされた。14テストのうち13件は初回に通過し、1件(変異の向け先、F22)だけが失敗した。
  • 検査側の調整:(1)変異の向け先(F22)。(2)静的検査のテストで予算欄そのものの不正を範囲外とした。(3)宣言の pins(F24)。いずれも、期待を実行結果に合わせて変えたのではない。

5. 検査の強さ

  • 別計算との比較:宣言の全数90通り、確認×出自の9通り、乱数250要求、固定例。別計算は、台帳の結果でなく要求の操作の列から、訂正・見える確認・確認者・時刻・出自を読む。P2-p・P2-o の別計算は再利用しており、それらと同じ読み違いは共有する。
  • 差分:P2-p 単独の実行との差分(乱数250要求)。通す行は全欄が同じ、投影した行は P2-p の欄を保つ。
  • 変異:19件。関数の差し替え18件(code の補完、status の補完、訂正を原本として扱う、依頼の順序、仮定の欠落、確認者の仮定の欠落、全ての出自で生成を出す、生成を出さない、確認の並べ替え、見えない確認の出力、human_confirmed ・context:property が失うものに残る、宣言のない行の投影、表せない行の判定、先払い・完成料金の削除、推測で補った情報、認定)と、定数1件(自前の料金)。全件検出。
  • 検査器の変異:B09・B15・B17・B18・B19・B20 を実行(結果は§6)。
  • 子の呼び出しの注入:P2-p の資源停止(全行を原子的に止める)、実費の不一致、2行目の資源停止(先に完成した行は保持)。いずれも期待どおり。
  • 型破損:要求の全ノード×6種の値で、状態は ok/invalid_input/unsupported_profile/resource_limit のいずれかで例外なし。入力不正は予算に依らず同じ結果。
  • 出典:構造の事実9件が台帳のハッシュと一致。手元のページがあれば、ハッシュと目印の語を照合する。

6. 検証

Python 3.14.4 と 3.11.17 で、全テスト系列と統合評価を実行しました。

系列 件数 Python 3.14.4 Python 3.11.17
開発 231 通過 通過
追加レビュー系列 52 通過 通過
保存監査 8 通過 通過
P2 432(P2-pの418に、Observation の写像14を追加) 通過 通過
統合評価 P1/P0・拡張・全P2・予算・版比較(2記録) 通過 通過
P1-d の CLI 照合・保存監査・登録検査 P1 20条件・80 JSON・417必須パス、別枠 P0 の37 JSON・221必須パス、監査600+256+32+1 通過 通過
統合評価の対象 P2-q 追加後の分母
登録・義務・防護例 23宣言・313義務・495防護例参照(P2-pの22宣言・295義務・477から、18義務と防護例18を追加)
証拠の強さ checked_native_template 200、finite_check 105、hand_derivation 8
防護例のない義務 既存の3件のまま
独立な拡張の組 192/231(P2-pは175/210)。この拡張は基底を除く他の21件と21組をつくり、依存(推移)で結ばれる4件(P2-p・P2-o・数量・期間つき数量)を除く17組が独立(手で数えた値と一致)
継承 12項目・証人46・理由つきの欠落2(変更なし)
Observation の写像の系列 75 JSON・1,249必須パス。他の系列の分母は変更なし
予算 1,421要求・掃引30,579回、違反0(P2-pは1,347要求・28,345回)。掃引の回数は実測で、予測ではない

予測した分母(宣言・義務・防護例・独立な組・要求の数)は、実行の前に手で導いた値が全て一致しました(掃引の回数だけは実測)。旧い22,052件の挙動 digest と、生成器による全例・宣言のバイト一致(追加した生成器を含む)も通過しました。検査器の変異 Z0(対照、失敗0)・B09・B15・B17・B18・B19・B20 は、いずれも検出されました。固定対象に、設計70・期待71・Observation の写像の例・検査・別計算・生成器を加えました。作成者 snapshot で、independent_review / evaluation_frozen は false です。

  • 新 native 仕様 hash:Observation の写像 847037e6…(先頭8桁)。既存の仕様(P2-p cec41a2d…、P2-o 9f9c6363…、数量 f52ea526… ほか)は変更なし
  • 追加前(1c4ac98、P2-pの追加後):1,617ファイル、manifest 28e6495c…、束 47191fe4…
  • 追加後:1,702ファイル、manifest 89cb715d…、束 7b13731a…(この文書の追加で固定対象は変わらない)

7. 限界と次

  • 構造は一つだけ(fhir-r5-observation)です。Provenance の entity(revision)、activity の符号、agent.type・role、署名、status の他の値、code の符号の系の検証、FHIR の資源(JSON)としての生成と適合の検査は範囲外です。
  • status の許容集合と確認者の型の選択は、ページの定義の保守的な読みで、作成者のものです。人の確認を final とする判断は、宣言の判断であり、このライブラリの主張ではありません。
  • 観察者を持たない記録は、生成の Provenance を出せません(F23)。記録モデルの変更は別の判断です(その後 P2-r で任意の観察者を足しました:75。観察者のない記録は引き続き存在し、生成の Provenance は出ません)。
  • ページを読んだのは作成者一人です。別計算も P2-p・P2-o の別計算を再利用しています。独立確認はありません。
  • 医療者の負担が減ることの証明ではありません。
  • 次の候補は、観察者を記録モデルに足す判断、revision の entity と activity の符号(その後 P2-t で実施:81)、CPC の版の監査、複数の出力先への射影の拡張です。着手前に利用者の確認を取ります。独立確認は将来の英語の別リポジトリで行います。

P2-q

同じ区分の文書