作成日:2026-10-21。状態:医療者の三つの操作から時間と測定の台帳を組み立て、出力先の要求(宣言)の充足を診断する専用R5を実装し、両 Python 版の全体回帰を通過。範囲選定62(利用者が承認)、設計63、手指定期待64 に従いました。63・64 の「未実装」という記載は設計時点の記録として保持します。独立確認・評価用正解の凍結は未実施で、independent_review / evaluation_frozen は false のままです。数値・単位・property・識別子・出力先の要求の版はすべて架空です。外部資料は今回参照していません。
1. 行ったこと
| 項目 |
内容 |
| 実装 |
clinical_library.py↗ と native 仕様 clinical_library_spec.json↗。操作(record・correct・confirm)から P2-i の台帳(量のラッパー、記録、内容 hash を持つ人の確認)を組み立て、P2-i の計画を一度だけ再実行して問い合わせごとの選択の診断を読み、P2-f へ換算・比較を委譲する。出力先の要求は宣言(line・exchange・trend の三種類の要素の組)で、出力先の id では分岐しない |
| 実行例 |
examples/p2-library/↗:141 JSON・2,417必須パス(O41条件・N8条件・B4条件)。生成器↗は native を import せず、状態・理由・依頼・出力・料金を手指定する |
| 宣言 |
p2-clinical-library.json↗:R5、19義務(共通4+R5の3+CL-1〜12)、防護例19。証拠は checked_native_template 9・finite_check 10。継承3項目(証人16)を inherits に宣言(P2-j の丸め、P2-m の関係と文脈、P2-i の料金) |
| 別計算 |
library_oracle.py↗:P2-i の別計算(区間差引き)と P2-f・P2-j の別計算を再利用し、要素の判定・集約・依頼・流れの表・料金は自前で持つ |
| 検査 |
test_library.py↗ 17テスト(手指定・別計算との比較・要求の版の差・AI候補・出力の出所・出力先の追加・順序と未来の操作・料金・予算の掃引・原子性・静的検査・型破損・P2-i への受理・再述した規則の一致・接続面の閉包・検査器・変異) |
| 検査器 |
共通部品 p2_checks.py↗ の未完了行の値の検査に、新しい欄5つ(selection・elements・requests・output・flows)を足した。変異の表に B18 を足し、B17 の対象文字列を更新した(検査器の変異は72件と対照) |
| 登録の入口 |
既存の実装・仕様・宣言・旧実行例は変更していない。変更したのは登録の入口(host の振り分け、評価・検査の一覧、固定対象、再固定の連鎖、宣言の生成表、変異の表)と、手で保つ期待の一覧(V1) |
2. 予測の結果(設計63の V1〜V10)
| ID |
予測 |
結果 |
| V1 |
既存の実装・仕様・宣言・旧実行例を変えずに実装できる。新しいクラスも宣言の書式の変更も要らない |
成立。既存の src/med_dsl で変更したのは host.py の2行(import と登録)。既存の examples/p2-* と宣言は0件変更(索引に1行追加)。新しいクラスも書式の変更も不要。ただし、手で保つ一覧への追加が約11ファイルに要った(F15) |
| V2 |
要求プロファイルを足すだけで新しい出力先が動く。未知の種類は拒否される |
成立。fixture にない出力先(dest:invented)を、ライブラリの変更なしに通した。出力先の id・版を別の名前に替えても結果の意味は同じ(line・exchange・trend)。実装の文字列に出力先の名前が1つもないことを検査。未知の要素・出力の種類・欄・条件・形は unsupported_profile(O51〜O53) |
| V3 |
要求の版を v1→v2→v3 と上げたとき、依頼の数の差は「選択された記録で新しく要求される欄が known でない数」に等しい。情報が揃えば0 |
成立。文脈の状態(method:known/unknown/unspecified × specimen:同)× 保留中の訂正(なし/AI 由来/人由来)の27台帳で、依頼の数は [0, 未知のmethod, 未知のmethod+未知のspecimen]。答え(訂正と確認)を足すと満たされ、元の記録は変わらない |
| V4 |
ai_candidate の保留中の記録は、要求を満たすことに使われず、依頼の候補としてだけ現れる。人の確認の後は満たされ、出自の種類が出力に残る |
成立。27台帳で、保留中の候補は選択に使われず(選択は元の記録 A)、依頼の candidates にだけ現れた(出自の種類 ai_candidate/observed)。確認後は満たされ、出力の origin が ai_candidate を保つ(O14)。候補がなければ observe_and_record、あれば confirm_candidate |
| V5 |
出力があるすべての行に selection があり、exchange の出力は出自の種類と人の確認を持つ。flows の表が出力の種類と一致する |
成立。乱数300要求で、出力のある行(100行超)の全てが満たす。表せない行の flows は retained が空で lost が非空 |
| V6 |
R5 と必須欄で宣言・登録は足りる。クラスは増えない。12の個別義務のうち8が A〜H、4が意味固有。CL-9 が既存の主題に収まらない |
一部成立・一部未決。R5 と必須欄で足りた。12義務は予測どおりに割り当てられた(CL-1〜8 が A〜H、CL-9〜12 が意味固有)。CL-9(要求を宣言として持つ)は意味固有に置いたが、登録は主題を検査しないので、置き場が正しいかは作成者の判断のまま。「宣言を解釈する側の義務」という主題を立てるかは、次の宣言を解釈する拡張を見てから決める(未決) |
| V7 |
継承3項目に、既存の例だけで証人が付き、登録時に全て一致する |
成立(数は外れ)。3項目・全て一致。証人は予測の11でなく16(丸め8、関係と文脈5、料金3)。入力の構造が等しい例の組を、出力を見ずに増やしたため(64 の§8 に差を追記)。登録時に16件全て一致 |
| V8 |
P2-m で見つかった接続面の閉包は再発しない(比較は元のリテラルで行う)。丸めの文字列の上限は残る |
成立。分子 2^63−1 の u_ten 二点を比べても、exchange の換算領域は63bitを超えるが、trend の比較は元のリテラルで止まらず、別計算と一致する(大小3通り)。丸めの文字列の上限(64文字)は、入力の上限の内側にあるので、関数への直接の注入でだけ確かめられた(P2-j と同じ。請求から自然には届かない) |
| V9 |
料金 M = 2 + C + Σfee が全要求で成り立つ。P2-i の実費は C、P2-f の実費は予約と一致 |
成立。9固定例(M=32〜97)の呼び出しの追跡で、P2-i の呼び出しは1回・予算=実費=C、P2-f は換算8・比較12で予算=実費。乱数60要求の料金が別計算と一致。実費の不一致は拒否、子の資源停止は行を原子的に止める |
| V10 |
affected():P2-j の変更が、継承によってこの拡張を列挙する |
成立。display.py の変更は p2-quantity-display・p2-temporal-display・この拡張を列挙する。この拡張の変更は他に及ばない(clinical_library → この拡張のみ) |
3. 反例の結果(設計63の Y1〜Y8)
| ID |
内容 |
結果 |
| Y1 |
方法が未知の記録を v1/v2 へ |
v1 は満たされ(unknown を保つ)、v2 は不足を一つ依頼する。推測で補った情報は常に空(O11・O12) |
| Y2 |
保留中の AI 候補が方法を持つ |
候補として依頼に出るだけで満たされない(O13・27台帳) |
| Y3 |
幅のある値を一行の出力先へ |
not_representable(value_not_a_single_point、lost [interval_bounds])。不足ではない(O03) |
| Y4 |
部分訂正で文脈が変わる二時点の要約 |
not_representable(contexts_differ)。差の欄と値を返し、最新の記録で代用しない(O42・O49) |
| Y5 |
未知の要求の要素・出力の種類 |
unsupported_profile(O51〜O53)。出力先の名前では分岐しない |
| Y6 |
順序を替える |
結果の意味は同じ(O61。台帳の順は操作の順) |
| Y7 |
参照時点より後の操作を足す |
完成した行は変わらない(O62、乱数60要求)。台帳と料金だけが変わる |
| Y8 |
確認前・競合・期間不明 |
理由ごとに別の依頼(confirm_pending・resolve_conflict・refine_validity・record_and_confirm。O20〜O27) |
4. 分かったこと
- 要求を宣言にすると、出力先の追加はデータの追加になる。 版 v1→v2→v3 の差は、足りない欄の数に等しい依頼の数としてそのまま出た。この性質は、27台帳の全数と、fixture にない出力先で確かめた有限の結果で、任意の出力先についての保証ではない。
- 「表せない」と「足りない」と「評価できない」を分けると、行ごとの状態の優先が要る。 優先(unassessed > not_representable > needs_information)は設計63で先に決めたが、事前の手指定の表に、この優先を試す例がなかった(F13)。
- AI 由来の候補を要求の充足から切り離すのは、構造で守れる。 選択は人の確認を持つ記録だけで行い、候補は依頼の
candidates にだけ出る。これは本ライブラリの設計の性質で、AI の生成の正しさとは無関係である。
- 継承の宣言(P2-n)は新しい拡張に自然に使えたが、探索は外れる。 3項目16証人を宣言できた。機械的な探索は、宣言した2組(temporal-display、longitudinal)のうち1組しか見つけなかった(F12)。
- 接続面の閉包は、前段の出力を後段の入力にしない構成で避けられた。 比較に渡すのは P2-i の換算領域でなく元のリテラル。これは P2-m の F7 に対する、設計上の別解の一つ。ただし、元のリテラルの検証を P2-i に頼る構成なので、本ライブラリは P2-i の検査を経たリテラルしか比べられない。
- 操作の不正は P2-i の検査に頼って報告される。 無効な訂正(有界でない期間、元の期間の外)や時刻の順序の誤りは、P2-i の理由(
unsupported_revision_scope、invalid_revision_interval、review_precedes_record)と P2-i の欄の位置(record.revises など)で返る。ライブラリの欄名(operation.corrects)では返らない(F16)。理由は安定しているが、操作者向けの文言ではない。
新しい発見
| ID |
発見 |
根拠 |
限界 |
| F12 |
継承の探索の標本の外での性能。 新しい拡張に対し、宣言した継承のうち依存で結ばれない2組を探索で調べると、見つかったのは1組(longitudinal)。見逃した組(temporal-display)は丸めを自分の言葉で述べ直しており、二つだけが持つ識別子が2つに届かない |
inheritance_suspects の測定。偽の疑いは新しい拡張側に増えなかった。独立な17組のうち疑いに挙がったのは1組(排他の識別子の条件) |
標本は1拡張・2組。探索の調整は P2-n の既知の継承で行った |
| F13 |
事前に手指定した表にも穴があった。 集約の優先の入れ替えという変異(設計63の§12、64の§9に事前に列挙)を、どの例も検出しなかった。表せない要素と足りない要素を一行に並べる例がなかった。O08・O09 を足した |
変異の実行(priority_swapped が未検出)。足した例は LD6 の優先から手で導いた(64 の§4.7) |
穴の発見は、事前に変異を列挙したことに依る。列挙しなかった種類の穴は、この方法では見つからない(H6) |
| F14 |
型破損の全ノード検査が、検証の前の誤りを見つけた。 操作の origin.kind が配列のとき、辞書の鍵として使って TypeError(例外)。文字列の検査を足した |
test_all_nodes_type_fuzz_is_total_before_budget の初回の失敗 |
全ノード×6種の値で見つかる範囲。他の型の破損で別の入口があるかは、この方法の範囲外 |
| F15 |
新しい拡張を1つ足すには、手で保つ一覧への追加が約11ファイル要る。 例の系列の一覧(support.SUITES・p2_checks.SUITES・DISABLABLE)、未完了行の欄名の一覧、固定対象の文書と例の一覧、統合評価の分母、再固定の連鎖、宣言の生成表(登録・例の対応・継承)、契約の検査の一覧(IDS・FORECAST_FAMILY)、継承の期待表・独立の組の数、生成器の再現検査の一覧、変異の表の大きさ |
変更したファイルの一覧。P2-m(11ファイル)と同程度 |
一覧は F4・F6・F11 で内容から求める検査を足してある。追加のたびに漏れを検査が教えるが、手で足す作業は残る |
| F16 |
子の拒否は子の理由と子の位置で返る。 操作の不正は P2-i の error_path(例:record.revises)で報告される |
N03 系の負例(無効な訂正、時刻の順序、期間の形、ハッシュの受付) |
理由は安定している。操作者向けの文言への変換はこの断片の範囲外 |
実装の最中に直した誤り
- 実装の誤り1件:F14(
origin.kind の型)。
- 事前の表の穴1件:F13(O08・O09 を追加。64 に追記)。
- 検査側の誤り:乱数の要求の生成が、無効な訂正(unknown の期間への訂正)を作っていた。P2-i の制約に合わせて、期間不明は単独の記録に限った。ledger の改ざんの検査は、確認のない記録を改ざんして拒否を期待していた。確認のある記録を対象にした。関係の組の件数の期待値(15×15)を、大きさ18個の実際(18×18)に直した。いずれも期待を実行結果に合わせて黙って変えたのではなく、検査自身の前提(P2-i の制約、確認の有無、大きさの個数)を確かめて直した。
- 同値な変異の記録:選択の探りに使う単位
PROBE_UNIT を替えても、全 fixture で子の計画の入力 hash 以外の結果は同じだった。検出の対象でなく、同値な変更として検査に残した。
5. 検査の強さ
- 別計算との比較:27台帳×3対象時点×5問い合わせの全数(405行)、乱数400要求、固定例。実装と別計算は、状態・理由・依頼・出力・流れ・要素の状態・選択の記録・料金で比べた。別計算は P2-i・P2-f・P2-j の別計算を再利用するので、それらの読み違いは共有する。
- 差分:丸めは41値×7分母×7桁数の2,009点を P2-j の実装と直接比較、関係は18×18の324対を P2-m の実装と比較、文脈の規則は method の版の違いを P2-m と比較、料金 C は P2-i の例を直接実行した実費と比較。
- 変異:26件。関数の一時的な差し替え23件(文脈の判定の省略、推測の補完、候補の数え込み、single_point の検査の削除、次元・語彙の無視、後勝ち、保留中の訂正を依頼しない、suspected の確認、能力の無視、優先の入れ替え2種、half-up、表せない行の流れ、文脈の比較の削除、
ends の取りこぼし、選択の検査の削除、不足以外の行の依頼、出自の消失、先払いの削除、完成料金の削除、推測で補った情報、認定の誤り)と、定数3件(fee、換算の予約、比較の予約)。全件検出(各変異は、狙った例の手指定の期待で失敗することを確かめた)。
- 検査器の変異:B09・B15・B17・B18 を実行(結果は§6)。
- 子の呼び出しの注入:P2-i の資源停止(部分結果は拾わない)、P2-f の資源停止(2行目で原子的)、P2-i・P2-f の実費の不一致を注入し、いずれも期待どおり。
- 型破損:要求の全120ノード×6種の値(null・false・0・空文字・空配列・空object)で、状態は ok/invalid_input/unsupported_profile/resource_limit のいずれかで例外なし。入力不正は予算に依らず同じ結果。
- 接続面:分子
2^63−1 の二点の比較、丸め文字列の上限の注入。
6. 検証
Python 3.14.4 と 3.11.17 で、全テスト系列と統合評価を実行しました。
| 系列 |
件数 |
Python 3.14.4 |
Python 3.11.17 |
| 開発 |
231 |
通過 |
通過 |
| 追加レビュー系列 |
52 |
通過 |
通過 |
| 保存監査 |
8 |
通過 |
通過 |
| P2 |
404(P2-nの387に、薄い臨床ライブラリ17を追加) |
通過 |
通過 |
| 統合評価 |
P1/P0・拡張・全P2・予算・版比較(2記録) |
通過 |
通過 |
| P1-d の CLI 照合・保存監査・登録検査 |
P1 20条件・80 JSON・417必須パス、別枠 P0 の37 JSON・221必須パス、監査600+256+32+1 |
通過 |
通過 |
| 統合評価の対象 |
P2-o 追加後の分母 |
| 登録・義務・防護例 |
21宣言・278義務・460防護例参照(P2-nの20宣言・259義務・441から、19義務と防護例19を追加) |
| 証拠の強さ |
checked_native_template 181、finite_check 89、hand_derivation 8 |
| 防護例のない義務 |
既存の3件のまま |
| 独立な拡張の組 |
158/190(P2-nは143/171)。この拡張は基底を除く他の19件と19組をつくり、依存か継承で結ばれる4件を除く15組が独立(手で数えた値と一致) |
| 継承 |
12項目・証人46・理由つきの欠落2(P2-nは9項目・証人30。この拡張が3項目・証人16を足した) |
| 薄い臨床ライブラリの系列 |
141 JSON・2,417必須パス。他の系列の分母は変更なし |
| 予算 |
1,251要求・掃引24,895回、違反0(P2-nは1,111要求・20,909回)。掃引の回数は実測で、予測ではない |
旧い22,052件の挙動 digest(d0a2233574ab350e65217ef6da8ed037fe34020e8ee79eee2506bd9ce4320236)と、生成器による全例・宣言のバイト一致(追加した生成器を含む)も通過しました。検査器の変異 Z0(対照、失敗0)・B09・B15・B17・B18 は、いずれも検出されました。固定対象に、設計63・期待64・薄い臨床ライブラリの例・検査・別計算・生成器を加えました。作成者 snapshot で、independent_review / evaluation_frozen は false です。
- 新 native 仕様 hash:薄い臨床ライブラリ
9f9c6363…(先頭8桁)。既存の仕様(数量 f52ea526…、期間つき数量 5f5c1388… ほか)は変更なし
- 追加前(
39ec6e9、P2-nの追加後):1,359ファイル、manifest 4b4d4f81…、束 527725eb…
- 追加後:1,510ファイル、manifest
d8376bfc…、束 defeef15…(この文書の追加で固定対象は変わらない)
7. 限界と次
- 範囲:三つの操作と三つの出力の種類に限ります。操作の取り消し・撤回、確度の変更、
line 以外の丸め方針、複数患者の集計、請求の確定、診断や治療上の判断は範囲外です。画面・UI、LLM、DSL の文字列構文、実マスターの変換器、永続化も範囲外です。
- 依頼の内容は、この作業定義の上での行動(
confirm_candidate など)で、臨床の手順でも実際の画面の質問でもありません。要求の版 v1→v2→v3 は架空の出力先の要求で、実在する出力先の要求ではありません。医療者の負担が実際に減ることの証明ではありません。
- 別計算の独立性は限定的です。P2-i・P2-f・P2-j の別計算を再利用しており、それらと同じ読み違いを共有する可能性が残ります。設計者・実装者・検査の作成者が同一で、独立確認はありません。
- 第二段(U2):実資料への接地は、この結果の後に、FHIR R5 の Observation・Specimen のページを取得し、対応の監査として始めました(66。コードは変更せず、取得していないページに依る点は未確認)。適合の主張はしません。
- U3:CPC の版の監査は、このライブラリの後に進めます。
- 継承の探索(F12)は標本が小さく、探索の再現率の見積りにはなりません。
- 次の候補は、実資料への接地(U2)、複数の出力先への射影の拡張(C7)、継承の関係の拡張です。いずれも着手前に利用者の確認を取ります。独立確認は将来の英語の別リポジトリで行います。