作成日:2026-10-21。状態:旧版の参照ごとに、継続の有無と名称・関係・属性の差を、宣言した属性の方針のもとで報告する専用 R5 を実装し、架空の例で契約を固定したうえで、取得済みの RxNorm CPC の2版(81,468概念)に適用。両 Python 版の全体回帰を通過。設計82・手指定期待83 に従いました(利用者の指示:2026-10-21「CPC の版の監査に進みます」。範囲の確認:契約+架空の例+実データの実行、属性は宣言した方針で分類し未宣言は依頼)。82・83 の「未実装」という記載は設計時点の記録として保持します(83 には実装中に1例を足した)。独立確認・評価用正解の凍結は未実施で、independent_review / evaluation_frozen は false のままです。committed な例はすべて架空です。実データの結果(概念の ID・名称・属性値を含む行)は Git 管理外の data/research/r4/ にあり、この文書には集計だけを書きます。外部資料は、設計の段階では新たに取得せず、実装の後(同日)に、利用者の方針に従って NLM の RxNorm 文書3ページ(技術文書・CPC の説明・付録1)を台帳つきで取得し、事実を道具とテストに結びました(§9)。
RxNorm の資料提供:Courtesy of the U.S. National Library of Medicine。NLM による本プロジェクトの推薦を意味しません。
1. 行ったこと
| 項目 | 内容 |
|---|---|
| 新しい拡張 | terminology_audit.py と 仕様(p2-terminology-audit、draft-1)。他の拡張に依存しない単独の R5。旧版・新版の snapshot(概念=出典と id、原子、関係、原子に付く属性)、比較する出典、属性の方針、参照の列を受け、参照ごとの行(presence・audit_state・facets・requests・policy_assumptions・successor)と集計を返す |
| 判定 | 継続=新版に同じ (出典, id) がある(名称などの一致は使わない)。新版にないときは not_found、successor: not_determined、候補なし、公式の履歴を求める依頼。継続した参照は三つの面(名称・関係・属性)を別に比べ、優先順で changed→needs_information→changed_administrative_only→unchanged_in_scope |
| 属性の方針 | 呼び出し側の宣言(definitional/administrative)。差のあった属性が未宣言なら分類せず依頼。使われなかった宣言は痕跡を残さない |
| 実行例 | 88 JSON・1,679必須パス(U 系列27条件、N 系列12条件、B 系列2条件)。87例を実装前に固定し、U27 を実装中に足した(§4) |
| 宣言 | 義務16(共通4+R5の3+AU-1〜9)。宣言の数は25になった |
| 検査 | test_audit.py 14テスト、独立な別計算 audit_oracle.py(集合の演算)、変異23件、検査器の変異 B22 を追加 |
| 実データの道具 | audit-cpc-versions.py。台帳の SHA-256 と取得状態を確かめた ZIP を読み、同梱の SQL の列の並びから名前で列を引いて正規化し、契約の核の関数を直接呼ぶ。test_audit_cpc.py 9テスト(正規化の写像は架空の RRF 形式の ZIP で確認、実データがあれば既知の値・不変条件・別計算との照合) |
他の拡張・実装・仕様・宣言・旧実行例は一つも変えていません。実装の変更は host.py の import と登録の各1行だけです。
2. 予測の結果(設計82の AP1〜AP10)
| ID | 予測 | 結果 |
|---|---|---|
| AP1 | 他を変えずに実装できる。変更は host.py の2行、手で持つ一覧(P2-q・P2-t と同じ11か所)、道具の追加だけ | 成立。既存の仕様・宣言・旧実行例・旧モジュールに差分なし。手で持つ一覧は同じ11ファイル。台帳の追加はなし(新しい資料を取得していないため) |
| AP2 | 25宣言・351義務・533防護例、独立な組 232/276 | 成立。統合評価の値と一致(証拠は checked_native_template 219・finite_check 124・hand_derivation 8) |
| AP3 | 各参照がちょうど一つの状態に入る。実データでも成り立つ | 成立。192通りの全数・乱数300要求・実データの両方針で、状態別の数の和=参照の数 |
| AP4 | 継続は (出典, id) だけ。同じ名称・属性・関係の別の ID があっても候補を出さない | 成立。別の ID の複製を0〜3件加えても not_found で、結果に複製の ID が現れない |
| AP5 | 面は独立。三つの面に差がなければ unchanged_in_scope |
成立。192通りの全数が別計算と一致 |
| AP6 | 未宣言の差は全て依頼。使われなかった宣言は痕跡を残さない | 成立 |
| AP7 | 入れ替えると、継続した参照の各面の差が入れ替わり、not_found と新のみが入れ替わる。逆向きの推定を含まない |
成立。乱数120要求で比較した継続の参照 100 件超、実データでも継続 81,298 は同じで、旧のみ170と新のみ322が入れ替わる |
| AP8 | 料金の式が全要求で成り立つ。手で導いた値(M=30 など)と一致 | 成立。30・29・14・13・45・ほか全例が、手で導いた値と初回に一致 |
| AP9 | 義務は R5 と必須欄で足りる。主題の外の義務は0 | 成立。16義務はすべて A〜I に収まった。これまでの拡張で必ず出ていた「外部の資料に結んだ事実」の義務は、native が外部の事実を持たないので出なかった(§5 F48) |
| AP10 | affected():この拡張は他に影響されず、他に影響しない |
成立。この拡張の変更が列挙するのは自分だけで、他の列挙は変わらない |
3. 実データの結果(設計82の RP1〜RP7)
実データの集計は、設計の前に見た値(既知)、設計で固定した予測、予測の外の測定を分けます。実行は台帳の SHA-256 と取得状態を確かめてから行い、決定的です(二度の実行で集計が同一)。全体で約36秒(2版の正規化と2方針の監査)。
3.1 正規化(出典 RXNORM のみ)
| 項目 | 9 月版 | 10 月版 |
|---|---|---|
原子(RXNCONSO) |
140,841 | 141,074 |
属性(RXNSAT、全行が原子に付く) |
469,951 | 469,953 |
概念間の関係(RXNREL、CUI‐CUI) |
552,956 | 553,500 |
| 比較しなかった行:原子対原子の関係 | 59,391 | 59,472 |
比較しなかった行:他の出典(MTHSPL など) |
原子 105,400/属性 2,900,511/関係 1,966,106 | 原子 105,954/属性 2,912,337/関係 1,976,750 |
重複する行・原子に結べない属性・所有者のない関係・原子に付かない属性は、どちらの版にも0件でした。列の位置は、ZIP に同梱された Table_scripts_mysql_rxn.sql の列の並びから名前で引きました。
3.2 予測と測定
| ID | 予測 | 結果 |
|---|---|---|
| RP1 | 全81,468参照が一つの状態に入る。not_found=170、新のみ=322、名称の差のある概念=2、原子の変更=0(既知の再現) |
成立(既知の値の再現。原子の追加1・削除2も一致) |
| RP2 | 続く参照のうち、属性の差が一つ以上ある概念は 1,500〜3,300 | 外れ(下に外れ)。1,317。予測は属性の行の数(追加1,723・削除1,887)から立てたが、多値の NDC は原子と名前ごとの値の集合として一つの差になり、概念の数はずっと小さい(F44) |
| RP3 | そのうち NDC 以外の属性の差がある概念は 100〜600 |
外れ(下に外れ)。77(RP2 と同じ単位の取り違え) |
| RP4 | 関係の差がある続く参照は 100〜1,300。除かれた関係の対象は全て新版に存在しない | 成立。326。除かれた関係422の対象で新版に残るものは0。追加326の対象で旧版にもあったものは0 |
| RP5 | 新版で未解決かつ旧版に存在した対象は0 | 成立(0。旧版でも未解決の対象も0) |
| RP6 | P-full の changed は 300〜1,500、unchanged_in_scope は続く参照の95%以上 |
成立。changed 370、unchanged_in_scope 79,699(続く参照の98.0%) |
| RP7 | P-partial では needs_information が0より大きく、changed の数は P-full と等しい |
一部外れ。needs_information は 27(成立)。changed は 343 で P-full の370と等しくない(差は27)。P-full はこの3つの属性名(RXN_AI・RXN_AM・RXN_BOSS_FROM)を定義にあたるとするので、P-partial で未宣言になった参照は changed から needs_information に移る。予測の推論の誤り(F45) |
3.3 方針ごとの状態(81,468参照)
| 状態 | P-full | P-partial |
|---|---|---|
unchanged_in_scope |
79,699 | 79,699 |
changed_administrative_only |
1,229 | 1,229 |
changed |
370 | 343 |
needs_information |
0 | 27 |
not_found |
170 | 170 |
not_compared |
0 | 0 |
P-full は NDC を管理上、データに現れる他の全ての属性名(20種)を定義にあたるとした宣言。P-partial は NDC を管理上、強度に関わる名前だけを定義にあたるとし、他を未宣言にした宣言。どちらも作り手の研究上の仮定で、医学的判断ではありません。
3.4 面ごとの変化(P-full)
| 面 | 測定 |
|---|---|
| 収載 | 続く 81,298、旧のみ 170、新のみ 322 |
| 名称 | 続く参照のうち名称の面に差があるのは2件(原子の追加1・削除2)。続く 140,535 原子の種類・名称の変更は0 |
| 関係 | 差のある続く参照 326(除去のみ229・追加のみ85・両方12)。除去422、追加326。いずれも、除かれた対象または新しい対象に結ばれている |
| 属性 | 差が一つ以上ある続く参照 1,317。うち1,229は NDC の差だけで他の面に差がない(管理上の差のみ)。NDC 以外の差が77(RXN_AVAILABLE_STRENGTH のみ50、RXN_BOSS_FROM のみ12、RXN_AI と RXN_AM が12、RXN_AI のみ3) |
changed の370の内訳 |
関係のみ291、定義にあたる属性のみ43、関係と定義にあたる属性34、名称のみ1、名称と関係1 |
3.5 契約の経路での確認
実データから、契約の限界内の参照を状態ごとに12件ずつ(計48件)抜き出し、host の経路で小さな要求として実行した(対象の存在の旗のため、標本の外の対象346件は空の概念として加えた)。結果は、核の関数の結果と、独立な別計算の両方と全項目で一致し、料金も別計算と一致した。ただし、旧版の 2,042 概念(2.5%)は、host の経路の一つの概念あたりの上限(原子32・関係64・属性32)を超えるため、実データの全体の実行は核の関数を直接呼んでおり、JSON の大きさと予算の上限は架空の例と標本でだけ確かめた。
4. 反例の結果(設計82の Z1〜Z12)
| ID | 内容 | 結果 |
|---|---|---|
| Z1 | 同じ ID で強度が変わる | U03:継続だが changed。ID の継続を意味の同一としない |
| Z2 | 管理上の属性だけが変わる | U02・U15:changed_administrative_only |
| Z3 | 未宣言の属性が変わる | U04・U18・U20:needs_information、依頼。分類しない |
| Z4 | 旧版の概念が消え、同じ名称・属性・関係の別の ID の概念が現れる | U10:not_found、候補なし |
| Z5 | 名称の一部だけが変わる | U05・U06:changed(名称の面)。含量などの変更と推定しない |
| Z6 | 関係の対象が消える/関係だけが落ちる | U07・U08・U13:対象の存在の旗が区別する |
| Z7 | 出典が比較範囲の外 | U11:not_compared。範囲に入れれば比較(U22) |
| Z8 | 入れ替え | U14・U24と乱数、実データ |
| Z9 | 原子が減ると属性も減る | U16:属性の差でなく、名称の差に伴う件数 |
| Z10 | 出典が変わった同じ ID | U23・U27:not_found(別の概念) |
| Z11 | 並びの違い | U21と乱数60要求:差にならない |
| Z12 | 同じ版の組/別の用語の組 | N06・N05:静的に拒否 |
5. 分かったこと
- この月の更新で、概念の定義にあたる部分はほぼ動いていない。 続く 81,298 概念のうち 98.0% は、名称・関係・属性のどれにも差がない(P-full)。差の大半は、販売・包装の識別子
NDCの入れ替わりだけ(1,229概念)で、定義にあたる属性の差は77概念(0.09%)、名称の差は2概念に留まる。 - 関係の面の差は、収載の出入りだけで説明される。 続く概念どうしの間の関係の変化は0で、除かれた関係はすべて除かれた概念に、追加された関係はすべて新しい概念に結ばれていた。1か月の組での測定で、他の月への一般化はしていない。
- 後継を決めない・属性を分類しない・比べた範囲を明示する、という規則を実データに当てても、全参照がちょうど一つの状態に入り、核・host の経路・独立な別計算が一致した。 ただし、これは契約が実データの上で一貫していることで、意味が保たれたこと、廃止や置換が起きたこと、
NDCの入れ替わりが定義の変化でないことを示すものではない。
新しい発見
| ID | 発見 | 根拠 | 限界 |
|---|---|---|---|
| F41 | 関係の面の差が、収載の出入りの帰結にすぎなかった(この月の組では)。関係の面は、収載の面と独立な情報を足さなかった | 除去422・追加326の全てが、除かれた/新しい概念に結ばれる。続く概念どうしの変化0 | 1組の測定。関係を持つ概念の定義の再編が起きる月には変わりうる |
| F42 | 原子が不変(続く 140,535 原子で種類・名称の変更0)なので、名称の面はほぼ空になった。名称の変更を扱う経路は、架空の例(U06・U22)でだけ動いた | 実データの atoms_modified=0 |
原子の識別子の運用(付け替えがない)に依る。別の月・別の体系では異なる |
| F43 | 属性の差は NDC に支配される(差のある1,317概念のうち1,229が NDC の差だけで他の面に差がない)。一つの属性名の分類が、状態の分布の大半を決める。一方、分類を宣言しない影響は小さい(P-partial で27概念が changed から needs_information に移るだけ) |
§3.3・§3.4 | 方針は作り手の仮定。NDC を管理上とする判断は、専門的な確認を受けていない |
| F44 | 予測の単位の取り違え。 属性の行の数(追加1,723・削除1,887)から概念の数の範囲を立てたが、多値の属性は原子と名前ごとの値の集合として一つの差になる。実測は1,317概念で、範囲(1,500〜3,300)の外 | RP2・RP3 の外れ | 予測は単位(行・概念・差の項目)を明記する必要がある |
| F45 | 予測の推論の誤り:P-partial で未宣言になる属性名は P-full で定義にあたるとしたので、changed は減る(370→343)。「優先順の帰結で changed は変わらない」とした予測は誤り |
RP7 | 方針の違いが優先順を通して状態の分布に与える効果は、手で導くと間違えやすい |
| F46 | 共通の予算の検査器の欄の一覧は、一般的な名前の行の欄と衝突する。 行の欄 state・source・assumptions を一覧に足したところ、p2-temporal・p2-refinement の未完了行で1,073件の偽の違反が出た。行の欄を audit_state・concept_source・policy_assumptions に改めた(設計82・83の名前は設計時点の記録として保持) |
統合評価の予算の掃引(違反1,073→0) | 一覧が全拡張で共通で、衝突は統合評価でしか見つからない |
| F47 | 変異が1件見逃された。 「集計の継続が出典を見ない」変異は、U23(範囲が [S])では、出典が変わった概念が範囲の外になるため、継続の集計に届かず検出されなかった。範囲を [S, X] にした U27 を実装中に足した |
continuing_ignores_source |
変異は実装の後に見つけた。U27 は期待を実行結果から作っていない(83 に手で導いた値を足した) |
| F48 | 外部の資料に結んだ事実の義務が出なかった。 これまでの拡張で必ず出ていた「主題の外の義務」は、この拡張の native が外部の事実を持たず(snapshot の文字列は不透明)、事実は道具の側(同梱の SQL の列の並び、NLM の文書の記述)にあるので出なかった。道具の写像は、架空の RRF 形式の ZIP のテストと、局所データの集計、取得した NLM の文書で確かめた(§9) | 義務16が全て A〜I | 事実の結びつきは道具のテストにあり、契約の義務としては宣言していない |
| F49 | 公式の履歴は、CPC ではなく通常のリリースにある。 NLM の技術文書は、退役した RxCUI から現在の RxCUI を引く表(RXNCUI)と RXNCUICHANGES.RRF を通常のリリースのファイルとして記述し、CPC のデータファイルは3つ(RXNCONSO・RXNSAT・RXNREL)だけだと明記する。新版にない170参照の後継を決める公式の根拠は存在するが、取得していない通常のリリースにある |
F-N7・F-N9・F-N10(§9) | 通常のリリースの取得には無償の UMLS ライセンスが要る(個人にだけ発行、年次報告あり)。RXNCUI は用語種別 SCD・SBD・GPCK・BPCK の退役だけを追跡し、170参照のうち50件が該当、120件は載らない。RxNorm API はライセンス不要で履歴の状態を返すが、照会時点の状態(条件の詳細は 03-data-access.md)。取得は利用者の判断で、取得するまで not_found は不明のまま |
| F50 | CPC に不在であることは、廃止の証拠でない。 CPC は「米国で市販されている処方薬の近似」で、抑制・廃止のデータを除く。市販でなくなっただけでも CPC から外れうる。ローカルの実データでは、出典 RXNORM の全行で CVF が 4096、抑制の印がなく、記述と一致した。API の照会(85)で実測した:新版にない170参照のうち70(41%)は RxNorm で有効のまま、100は廃止(同等な有効概念の指定なし)で、置換先の指定は0 |
F-N5・F-N6・F-N8、85 の F51・F52 | 説明のページは「最終確認 2019年4月17日」「草案」と記す。記述は取得日のもので、2026年の更新の保証ではない。照会は170参照・1か月の組 |
実装の最中に直した誤り
- 実装の誤り:0件。手指定の期待87件と手で導いた料金は、初回にすべて満たされた。
- 検査側の調整:(1)U27 の追加(F47)。(2)行の欄の改名(F46)。(3)継承の検査の数(独立な組+23、疑いの数)を測定値に更新(予測できたのは独立な組の増加23)。独立な組を数えるテストは、新しい拡張との組が他の拡張の集合にも入る数え方の誤りで1回失敗し、新しい拡張との組を除いて数えるよう直した。疑いの数は仮の値を置いて失敗し、測定値(182)に直した。(4)単独の仕様を再固定の連鎖(数量の仕様が根)に足したところ、連鎖の検査(連鎖の仕様は別の仕様の hash を含む)が拒否した。単独の仕様は連鎖に載せない。(5)予測の外れ(RP2・RP3・RP7)は、予測を直さず、上の表に残した。
6. 検査の強さ
- 全数:名称の差×関係の差×属性の差の部分集合(8)×方針(3)×継続/不在=192要求を、別計算と照合した。
- 乱数:概念6〜15、原子・関係・属性・出典・概念の追加と除去の乱数の変更、方針と範囲の乱数の300要求を別計算と比べた。全ての状態が現れた。
- 入れ替え・並び:乱数120要求の入れ替え、60要求の並びの入れ替え(概念・原子・関係・属性・参照・方針)。
- 変異:23件を検出(実装の後に U27 を足して全件)。検査器の変異:B22 を追加し、B17〜B21 とともに実行して検出を確かめた(§7)。
- 実データ:既知の値の再現、全参照の分割、方針ごとの測定の再現、入れ替え、48参照の host 経路・別計算との照合。
7. 検証
Python 3.14.4 と 3.11.17 で、全テスト系列と統合評価を実行しました(実装・検査・文書を加えた作業ツリーで実行。コミット前)。全検証の実行は3回目で、1回目は検査側の数え方の誤り2件、2回目は再固定の連鎖の登録の誤り1件で P2 系列が失敗した(§5。直して最初から回し直した)。以下は最終の木の結果です。
| 系列 | 件数 | Python 3.14.4 | Python 3.11.17 |
|---|---|---|---|
| 開発 | 231 | 通過 | 通過 |
| 追加レビュー系列 | 52 | 通過 | 通過 |
| 保存監査 | 8 | 通過 | 通過 |
| P2 | 498(P2-t の475に、P2-u の監査14テストと道具9テストを追加)。スキップなし。実データの照合を含む | 通過 | 通過 |
| 統合評価 | P1/P0・拡張・全P2・予算・版比較(3記録) | 通過 | 通過 |
| P1-d の CLI 照合・保存監査・登録検査 | P1 20条件・80 JSON・417必須パス、別枠 P0 の37 JSON・221必須パス、監査600+256+32+1、登録25/拒否0 | 通過 | 通過 |
| 検査器の変異(B17〜B22、対照 Z0) | 対照の失敗0、B17〜B22 は各1件の失敗で検出 | 3.14 で実行 | — |
| 統合評価の対象 | P2-u 追加後の分母 |
|---|---|
| 登録・義務・防護例 | 25宣言・351義務・533防護例参照(P2-t の24・335・517から、1宣言・16義務・防護例16を追加)。防護例のない義務は3(変更なし) |
| 証拠の強さ | checked_native_template 219、finite_check 124、hand_derivation 8 |
| 独立な拡張の組 | 232/276(P2-t の209/253から、23組が独立に増えた) |
| 実行例の系列 | P2-u 88 JSON・1,679必須パス。他は変更なし |
| 予算 | 1,612要求・掃引35,102回、違反0(P2-t は1,525要求・33,555回)。掃引の回数は実測で、予測ではない。両 Python 版で一致 |
予測した分母(義務・防護例・独立な組・例と必須パスの数〔U27 の1例を足した後〕・要求の数・各要求の料金)は、実行の前に手で導いた値が一致しました(掃引の回数と、共有の語彙を数える探索の疑いの数182だけは実測)。旧い挙動の digest(22,052件)の回帰と、生成器による全例・宣言のバイト一致の検査は P2 系列に含まれ、通過しました。実データの照合(既知の値、全参照の分割、方針ごとの測定値、入れ替え、48参照の host 経路・別計算との照合)は、台帳どおりの CPC 二版が手元にある環境で、両 Python 版とも通過しました。固定対象に、設計82・期待83・新しい実装・仕様・宣言・検査・道具・実行例を加えました。作成者 snapshot で、independent_review / evaluation_frozen は false です。
- 新 native 仕様 hash(先頭8桁):P2-u
8291f2df…。他の仕様は変更なし。単独の仕様なので、再固定の連鎖には載せない - 追加前(
8c6d600、P2-t の追加後):1,827ファイル、manifest94d5eabe…、束e2cd5929… - 追加後(この作業のコミット):1,926ファイル、manifest
69bcbd45…、束df218a3b…(完全な値はexamples/p1-evaluation/manifest.jsonとその hash)。この文書と概要文書の更新で固定対象は変わらない(再スナップしても同じ束)
8. 限界と次
- 1か月の組(2026-09-08 → 10-05)の測定です。他の月に変化の量が一般化することは示していません。設計の固定後に未見の月次版を加えて測ることは、新しい月次版が公表されてから別に行います。
- 属性の方針は作り手の研究上の仮定で、医学的判断ではありません。
NDCを管理上とすることを含め、専門的な確認を受けていません。 - 意味の同一・廃止・置換は、監査の契約としては決めていません。 新版にない170概念の公式の状態は、追補の API の照会(85)で別に調べた:70は RxNorm で有効のまま(CPC の範囲から外れただけ)、100は廃止(同等な有効概念の指定なし)、置換先の指定は0。この状態は監査の結果には取り込んでいない(契約は履歴を入力として受けない)。
- 比較していないもの:原子対原子の関係(59,472行)、
SUPPRESS・CVF、RXNORM以外の出典、週次更新、全体版。(出典, id) の同一性なので、出典が変わった同じ ID は別の概念として報告される(F47 の U27)。 - host の経路の限界:旧版の 2.5% の概念は上限を超え、実データの全体の実行は核の関数を直接呼ぶ。
- 設計者・実装者・検査の作成者が同一で、独立確認はありません。薬剤用語の専門確認者は未割当です。
- 次の候補は、未見の月次版への適用(公表後)、公式の履歴(API で照会した状態)を、監査の入力として受ける契約の拡張(
not_foundを「有効のまま・廃止・置換」に分ける。85 の結果が材料)、通常のリリース(無償の UMLS ライセンス。利用者は保留)の取得、複数の出力先への射影の拡張です。着手前に利用者の確認を取ります。独立確認は将来の英語の別リポジトリで行います。
9. 追補:NLM の文書3ページを台帳つきで取得し、事実を結んだ(同日)
設計82の U1(NLM の文書のページを台帳つきで取得するか)に対する利用者の方針(「NLM の技術文書の該当ページを、台帳つきで取得する」)に従い、D03 が公式資料として挙げていた3ページを取得した。HTTP 200、リダイレクトなし、data/research/r3/(Git 管理外)に保存し、台帳(03-materials.json)に nlm-rxnorm-technical-documentation(131,478バイト、SHA-256 1f05a1f6…)、nlm-rxnorm-cpc-description(20,916バイト、da895512…)、nlm-rxnorm-appendix-1(44,177バイト、7dd0fe70…)を記録した。取得の手順と制限は 03-acquisition.md。
道具 audit-cpc-versions.py に、事実の表 NLM_FACTS(F-N1〜F-N10。台帳の項目・ハッシュ・目印の語)を持たせ、テスト で、台帳の取得状態とハッシュ、ページのハッシュ、目印の語の存在を確かめた(手元にページがあるとき10件全て一致。事実・ハッシュ・出典の変更は検出される)。
| 事実 | 内容 | 局所データとの照合 |
|---|---|---|
| F-N1・F-N4 | RXNREL の関係は、RXCUI2 が RXCUI1 に対して持つ関係。付録1の表も RXCUI2 の用語種別、RELA、RXCUI1 の用語種別の順 |
設計の前の用語種別の組の集計と一致。has_ingredient で、対象が成分(IN)で所有者が成分でない関係が 28,026、逆が 0 |
| F-N2・F-N3 | 非対称の関係は向きごとに1行。RELA は任意の追加ラベル |
道具は RELA が空なら REL を使う |
| F-N5・F-N6・F-N8 | CPC は抑制・廃止を除き、市販の処方薬の近似。完全版では CVF=4096 の印 | 出典 RXNORM の全行(概念・関係・属性、両版)で、抑制の印の行 0、CVF が 4096 でない行 0 |
| F-N7・F-N9・F-N10 | CPC のデータファイルは3つ。退役した RxCUI の表と RXNCUICHANGES.RRF は通常のリリース |
取得済みの CPC に履歴のファイルはない(ZIP の構成と一致) |
設計82の「向きは局所データの集計で裏付けた、NLM の文書は未取得」という記載は、設計時点の記録として保持する。取得により、向きは文書の記述と局所データの両方で裏付けられた。ページの記述は取得日のもので、CPC の説明ページは最終確認が2019年4月17日と記すため、2026年の更新を保証しない。
追補の検証
追補(台帳・検査器・道具・テスト・文書の更新)の後、影響する範囲を Python 3.14.4 と 3.11.17 で実行した。P2-u の道具と監査、事実の表を台帳から引く Provenance・Observation・接地・ライブラリのテスト(90テスト)、道具・契約・継承のテスト(97テスト)、保存監査(8テスト)、版比較つき統合評価、P1-d の CLI 照合(P1 20条件・80 JSON・417必須パス、P0 37 JSON・221必須パス)、保存監査(600+256+32+1)、登録検査(25/拒否0)は、両 Python 版とも全て通過した。固定対象は 1,926ファイル、manifest 758e6e83…、束 35ea6ecb…(テストの test_audit_cpc.py の更新による。全系列の再実行は行っていない:変更は道具とそのテスト、台帳、文書に限り、契約・実装・他の拡張は変えていない)。