作成日:2026-10-21。状態:作成者側の設計草案。実装・版の記録は未作成。P2-r の結果75 が試したのは「任意の項目を足す」更新(旧入力はそのまま有効)でした。P2-s は逆向きの、旧入力を拒否する更新を試します。P2-r で足した observer を必須にし、不明は「不明」と明示する値(kind: unknown)で書かせます。旧入力は新版で受理されず、移行(旧入力に明示の不明を足す)を経て初めて有効になります。利用者の指示(2026-10-21「項目を必須にする版の更新(旧入力を拒否する)」)に従います。手指定の期待は 77。独立確認・評価用正解の凍結は未実施で、independent_review / evaluation_frozen は false のままです。数値・識別子はすべて架空です。外部資料は新たに参照しません。
1. 問い
| ID | 問い |
|---|---|
| Q1 | 任意だった項目を必須にしたとき、旧入力は黙って受理されず、欠落した必須項目という理由で拒否されるか(pin の置換だけで通る入力は 0 か) |
| Q2 | 旧入力を新版の入力へ移すこと(移行)が、意味を変えずにできるか。移行は「不明を明示する」だけで、推測で値を補わないか |
| Q3 | 版の記録の書式と比較器は、要求の側の変更(全ての入力に項目が加わる)を宣言できるか。P2-r の宣言(追加した新しい入力)は結果の側の追加だけだった |
| Q4 | 影響の範囲(書き換わるファイル、再検証の列挙)は、任意の項目を足したとき(P2-r)と比べて、どう違うか |
| Q5 | 新版の入力を旧版の木へ渡すとどうなるか。互換の部分集合(旧版が受理する新入力)はあるか |
2. 設計判断
| 判断 | 初回に採る設計 | 理由・見直す条件 |
|---|---|---|
| SD1 | 記録の observer を必須にする。形は {kind, ref} の完全一致(kind が human・device)か、{kind: unknown}(ref を持たない)。unknown は「観察者が分からない」を明示する値で、観察者を推測しない |
不明を欠落(黙った不明)でなく、記述(明示の不明)にする。必須にする目的は、答えを強制することでなく、「聞いたが分からない」と「聞いていない」を分けること |
| SD2 | 選ばれた記録の根拠の record_observer は、常に出す(不明のとき {kind: unknown}) |
必須の項目の値は、根拠から常に読める。P2-r の「あるときだけ」はやめる |
| SD3 | P2-o の操作 record・correct にも observer を必須にする。ライブラリは、省略を unknown で補わない。補う層を作るなら、操作の入口(画面など)の外に置く |
補完は「不明を確定する」判断。必須にする更新の意味を保つ。見直す条件:入力の負担が大きいと分かったとき(補完の層を別に設計する) |
| SD4 | P2-q:観察者が unknown のとき、観察者の agent も declare_observer_type の依頼も出さず、流れの observer も変えない(P2-r で観察者のない記録を扱ったのと同じ結果)。record_observer: {kind: unknown} は選択の根拠に現れるだけ |
旧入力の移行後の結果を、観察者の追加の前後で変えない |
| SD5 | P2-p・P2-j・P2-m は論理を変えず、再固定だけ(P2-j・P2-m は根拠をそのまま写すので、結果の中の根拠に record_observer が現れる) |
影響が再固定と根拠の写しだけの拡張を、そのまま測る |
| SD6 | 版:P2-i を draft-4 にし、依存する5拡張も一つ上げる:P2-j(draft-4)、P2-m・P2-o・P2-p・P2-q(draft-3) | P2-l・P2-r と同じ(版が変わらないまま hash が変わる状態を作らない) |
| SD7 | 移行は生成器の既定の変更で行う:全ての例の記録・操作に observer: {kind: unknown} を既定で足す。移行の規則は「欠落の記録に、明示の不明を足す」だけで、期待の値は変えない(結果の根拠に record_observer が増えることは宣言する) |
移行を手編集にしない。旧入力と移行後の入力の差を比較器で検査できる形にする |
| SD8 | 版の記録は p2-version-record-draft-2 のまま、宣言の種類 required_field を足す。宣言は、(a) 要求の側で全ての入力に加わる項目の経路の接頭辞(request_paths)、(b) 結果の側で現れる根拠の経路の接頭辞(result_paths)、(c) 旧入力を pin の置換だけで渡したときの拒否の理由(substitution_refusal)を持つ。比較器はこれを読めるよう拡張する(書式でなく道具の変更) |
Q3。拡張が要ることは予測(Z6)で、拡張の大きさを測る |
| SD9 | 前方の互換:新版の入力を旧版(draft-3)の木へ渡す。unknown を使う入力は旧版が invalid_observer で拒否する(未知の値を黙って受理しない)。人・機器の観察者だけの入力は、旧い pin に替えれば旧版が受理する(互換の部分集合) |
Q5 |
3. 変更の内容
3.1 P2-i(期間つき数量)
- 記録の項目に
observerを必須で足す(fieldsの必須欄)。欠落はmissing_field。 - 形:
kindはhuman・device・unknown。unknownのときrefがあればunknown_field。human・deviceのときrefがなければmissing_field(空文字はexpected_nonempty_string、余分な欄はunknown_field、object でなければexpected_object、kindが別ならinvalid_observer)。 - 根拠の
record_observerは常に出す。内容の hash に観察者を含めるのは変えない。他は変えない。
3.2 P2-o(臨床ライブラリ)
操作 record・correct の observer を必須にして、台帳へそのまま渡す。選択の根拠の record_observer は常に出す。確認の操作は観察者を持たない(変更なし)。
3.3 P2-q
selection.record_observer の kind が unknown のとき、観察者を持たない記録と同じに扱う(SD4)。他は変えない。
4. 版の計画
| 拡張 | 現在 | 変更後 | 変更の種類 |
|---|---|---|---|
p2-temporal-measurement(P2-i) |
draft-3 | draft-4 | 意味の変更(必須化、unknown) |
p2-temporal-display(P2-j) |
draft-3 | draft-4 | 再固定(根拠の写しが増える) |
p2-longitudinal-comparison(P2-m) |
draft-2 | draft-3 | 再固定(同上) |
p2-clinical-library(P2-o) |
draft-2 | draft-3 | 意味の変更(操作の必須化) |
p2-structure-grounding(P2-p) |
draft-2 | draft-3 | 再固定 |
p2-observation-projection(P2-q) |
draft-2 | draft-3 | 意味の変更(unknown の扱い) |
5. 版の手順(V1〜V8)
P2-l・P2-r の手順を使い、V4・V5・V6・V8 を次のように読み替える。V4 旧入力を新版へそのまま渡す:pin で拒否される。V4′(置換):旧い pin を新しい値へ文字列で置換した入力は、欠落した必須項目(missing_field)で拒否される。V5 移行した入力と旧入力の比較:要求の違いは、宣言した observer の追加だけ(hash の値を除く)。V6 旧版の結果と新版の結果(移行した入力どうし):違いは、宣言した根拠の record_observer の追加だけ。V8 前方の互換:SD9。
6. 実装前に固定する予測と反例
6.1 予測
| ID | 予測 | 外れた場合に分かること |
|---|---|---|
| S1 | 旧版 ab4c358 は旧コミットの木で再現できる(23宣言・316義務・498防護例) |
V1・V2 |
| S2 | 旧入力を新版へそのまま渡すと、pin を持つ入力は profile_spec_mismatch で拒否され、pin に届く前に結果が決まる入力は同一。黙った再解釈は 0 |
V4 |
| S3 | 旧い pin を新しい値へ置換した入力は、全て missing_field(欠落した必須項目)で拒否され、受理は 0(P2-r で置換だけで再固定できた3系列も、今回は拒否される) |
Q1 |
| S4 | 移行した入力(生成器の既定で observer: unknown を足したもの)は、旧入力と、hash の値と宣言した observer の追加を除いて同一。期待は、record_observer を確かめる少数の例を除いて同一。料金は変わらない |
Q2 |
| S5 | 旧入力の結果と移行した入力の結果の違いは、根拠の record_observer の追加だけ(P2-i の binding_evidence.selected[]、P2-o・P2-p・P2-q の selection、P2-j・P2-m が写した根拠)。違う入力は、記録が選ばれた行を持つ入力に限る |
Q2・SD2 |
| S6 | 要求の側の変更(全ての入力に項目が加わる)は、P2-r の比較器では宣言できず、全入力が「宣言にない要求の変更」として失敗する。宣言の種類 required_field と比較器の拡張が要る(拡張は小さい:経路の接頭辞の許容と置換の拒否の理由の照合) |
Q3・H5 |
| S7 | 書き換わるファイルは、P2-r と同程度(800〜860)。実行例の生成器・期待・宣言・仕様・モジュールの定数が再び動く | Q4 |
| S8 | affected() は6拡張を過不足なく列挙する。過小(宣言とモジュール9件)は P2-r と同じ。過大は P2-r と同程度(100〜130件) |
F28 |
| S9 | 新版の入力のうち、unknown を含む入力は旧版(draft-3)の木で invalid_observer により拒否される。人・機器の観察者だけの入力(P2-r で足した25件のうち観察者を使うもの)は、旧い pin に替えれば旧版が受理する。受理の数は新しい入力の数の一部 |
Q5・SD9 |
| S10 | P2-q の unknown の観察者は、依頼・agent・流れを変えない:移行後の P2-q の結果は、selection.record_observer を除いて P2-r のときと同じ |
SD4 |
6.2 反例の候補(77 に具体値を固定)
| ID | 内容 | 試すこと |
|---|---|---|
| W1 | 記録に observer がない(台帳) |
missing_field で拒否。補完しない |
| W2 | 操作に observer がない(ライブラリ) |
missing_field で拒否。補完しない |
| W3 | unknown に ref |
unknown_field。human に ref がない:missing_field |
| W4 | P2-r の時点で有効だった入力を、pin だけ新しくして渡す | missing_field で拒否(黙って受理しない) |
| W5 | 観察者が unknown の記録の確認 |
確認は有効(unknown も内容の一部として hash に含まれる)。観察者を書き換えると確認は合わない |
| W6 | 訂正が unknown、元の記録は human |
選ばれた記録(訂正)の record_observer は unknown。元の観察者を継がない |
| W7 | P2-q:unknown の観察者で Provenance を宣言 |
生成の agent・依頼・流れの変化なし |
| W8 | 新版の入力を旧版へ(unknown を含む/含まない) |
前者は拒否、後者は旧い pin に替えれば受理 |
7. 受入条件
- 77 の期待・予測・反例を、runtime より先に保持し、実行結果から期待を更新しない。
- 論理の変更は P2-i・P2-o・P2-q に限り、P2-j・P2-m・P2-p は再固定だけ。移行は生成器の既定の変更で行い、手編集をしない。
- 版の記録を作り、V1〜V8 を比較器と履歴の検査で確かめる。比較器の拡張は最小限にし、その大きさを結果に記録する。宣言にない差は失敗にする。
- 必須化の新しい実行例、別計算・テストの更新、変異(必須の検査の削除、
unknownの検査、補完、record_observerの欠落)を検査する。 - Python 3.11/3.14 で、全テスト系列、版比較つき統合評価、旧い22,052件の挙動 digest を回帰する。分母の変更は旧い値を履歴として残す。
- 追加前は
ab4c358、固定対象1,732ファイル、manifest4aa13b97…、束4861a082…(先頭8桁。完全な値は結果の文書に写す)。independent_review/evaluation_frozenは false。
8. 範囲外
観察者の履歴・資格・同一性、unknown の細分(聞いていない/聞いたが分からない)、補完の層(画面など)、項目の削除・意味の変更、他の拡張の記録モデル。
この設計は、必須化の更新の影響を測る一つの実演で、unknown の値が実際の運用で足りることの証明ではありません。最終目標は変化に耐える医療コード体系そのものの確立であり、この有限の設計はその一つの検査です。
9. 利用者に確認すること
| ID | 確認 | 推奨 |
|---|---|---|
| U1 | 必須化の対象を observer にする(P2-r で足した項目。新しい項目を探さない) |
observer |
| U2 | 不明を明示する値 kind: unknown を足す(必須にしても不明を強制的な推測にしない) |
足す |
| U3 | ライブラリの操作でも必須にし、補完をしない(補完の層は範囲外) | 必須(補完しない) |
利用者の指示は「項目を必須にする版の更新(旧入力を拒否する)」だったため、推奨どおりに実装へ進みます。異なる判断があれば、実装後の結果に反映します。