作成日: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. 分かったこと
- 意味の判断を宣言に委ねると、ライブラリは判断をせずに使える。
status・code・確認者の型はライブラリが決めず、足りなければ依頼になる。使った判断は、仮定として行ごとに残る。宣言を作る人が負う判断(人の確認を「完了で追加の行為が要らない」と読む、など)の重さは、ライブラリには見えない。
- 許容集合を、ページの定義から導くと、原本の
status の選択は事実上一つになる。 original は final だけなので、その宣言は選択でなく、仮定を記録する儀式になる。本当の選択は訂正の amended/corrected だけ。許容集合が保守的すぎる可能性がある(preliminary など)。この読みは作成者のもので、別の読みを拒否する根拠は薄い。
- Provenance は、行為者が分かるものしか出せない。
agent は 1..* で必須。ライブラリの記録は、出自の種類と参照(AI なら Device)は持つが、観察した人は持たない。観察者が不明な記録の生成の Provenance は出せず、確認だけが出る(F23)。
- 依頼の宛先が二種類になった。 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 の版の監査、複数の出力先への射影の拡張です。着手前に利用者の確認を取ります。独立確認は将来の英語の別リポジトリで行います。