pkdummy-harness PK template schema (v0.1–v0.2)
pkdummy-harness PK template schema (v0.1–v0.2)
このフォルダは 「薬剤ごとの PopPK サマリ(ラベル/論文)」→「1-compartment mrgsolve テンプレ」 を最短で回すための、軽量スキーマです。
実行手順を先に見たい場合は QUICKSTART.md を参照してください。この文書は、pk.yml, targets.yml, spec_pk1_*.yml の構造とツール対応を確認するためのリファレンスです。
drugs/<slug>/pk.yml
id/nameroute_inferred:poorivsources: 参照元 URLpk_raw: 元の文字列(レンジ・単位込み)pk_parsed: パース済みhalf_life_h(+ optional range)clearance:{value, unit}(基本L/h)volume:{value, unit}(L/kgorL)bioavailability_frac: 0–1
derived:ke_1_per_h = ln(2)/t1/2CL_abs_L_per_h_at_70kgV_abs_L_at_70kgCL_systemic_L_per_h_at_70kg/V_systemic_L_at_70kg
value_provenance: warning薬剤の主要fixture値について、値の由来、正規化、変換、review状態を機械可読に記録します
oral の場合、ラベルにある CL/V は CL/F, V/F のことが多いので、
*_absは「見かけ値」として扱い、*_systemic = *_abs * Fを別途持っています。
value_provenance
value_provenance はPK真値を主張するものではなく、fixture generator が使う値を監査しやすくするためのメタデータです。Phase 1 scope は、1-compartment attainability warningが出る13薬剤です。まずは次の3フィールドを必須にしています。
CL_abs_L_per_h_at_70kgV_abs_L_at_70kgt_half_h
value_provenance:
CL_abs_L_per_h_at_70kg:
source_id: null
source_field: pk_parsed.clearance
value_basis: derived_from_reported
raw_value: 19.62
raw_unit: L/h
normalized_value: 19.62
normalized_unit: L/h
conversion:
method: direct
formula: pk_parsed.clearance.value
assumptions: {}
role: simulation_parameter
source_review_status: needs_source_review
fixture_limitation_status: not_applicable
reviewer_status: needs_source_review
reviewer_note: >
Clearance is used as a deterministic fixture model parameter.
Enumは tools/check_value_provenance.py で検証します。
value_basis:label_reported,literature_reported,derived_from_reported,fixture_policy,unknown_needs_reviewconversion.method:direct,unit_conversion,body_weight_scaled,derived_formula,not_applicable,unknown_needs_reviewrole:simulation_parameter,check_only,consistency_check,derived_output,metadata_onlysource_review_status:checked,needs_source_review,needs_unit_review,not_applicablefixture_limitation_status:acknowledged,not_applicablereviewer_status:checked,acknowledged_fixture_limitation,needs_source_review,needs_unit_review,not_applicable
source_id が null でない場合は sources[].id に解決できる必要があります。既存source URLから値ごとの直接出典を特定できない場合は、出典を推測せず source_id: null として fields_needing_review に残します。
公開sourceを確認しても exact value match が取れない場合は、任意の source_verification を付けられます。これは source_id を解決済みにするための代替ではなく、どのsource/queryを確認し、なぜ未解決として残したかを machine-readable にするための監査メモです。
source_verification を付ける場合は、status、blocker、next_action、reviewed_source_ids、fixture_value_decision、decision_reason も validator で確認されます。status: no_exact_public_source_match の entry は、source を推測接続しないため source_id: null のままにする必要があります。
reviewer_status は後方互換の legacy summary です。新規レビューでは、値ごとのsource確認は source_review_status、1-compartment fixture limitation の確認は fixture_limitation_status に分けて記録します。validator や --report の集計も、この2つの分離フィールドを優先します。
CLI report の resolved_entries は drug.field -> source_id、resolved_source_refs は drug.source_id の一覧です。unresolved_entries、unresolved_entry_details、unresolved_reason_counts、source_verification_status_counts、source_review_blocker_counts、fixture_value_decision_counts、fixture_value_decision_entries、unresolved_entries_missing_source_verification、source_verification_coverage、source_verification_coverage_by_priority、source_mapping_coverage、source_mapping_coverage_by_field、source_mapping_coverage_by_drug、next_review_entries、next_review_details、source_review_queue、source_review_action_counts、suggested_source_kind_counts、fully_mapped_warning_drugs / partially_mapped_warning_drugs / unmapped_warning_drugs も併せて出力し、local source id だけでは区別しにくい cross-drug の source mapping と残レビューを監査しやすくします。source_verification がある未解決entryでは、source_verification_status、source_review_blocker、next_source_review_action、fixture_value_decision も unresolved_entry_details / next_review_details に出力します。source_review_queue は、薬剤ごとの未解決field、available/used/unused source id、source URL refs、coverage、highest priority、review action をまとめたレビュー作業用のqueueです。source refs には source_kind / source_rank を付け、suggested_source_refs は label, PubMed, journal, DrugBank, PubChem, Wikipedia, secondary の順で確認候補を並べます。
drugs/<slug>/spec_pk1_oral.yml / spec_pk1_iv.yml
mrg-dummy スキル(pk1_oral_ode, pk1_iv_ode)に渡すための実行 spec。
population: 体重分布などsubject_source(任意):subjects.csvのような外部被験者テーブルを使うための参照情報
regimen: 投与経路と用量arms.<arm>.infusion_h(任意): IV infusion duration in hours。route: ivまたはiv_infusionかつinfusion_h > 0の場合、demo generatorは注入式を使い、PopPK fixtureの投与行RATE = dose_mg / infusion_hを出力します
sampling: 観測スケジュールmodel.theta: 主にCL/V/(oral はKA/F1/ALAG1)model.notes: demo generatorで独立に採用するパラメータ対や、1-compartment attainability警告の扱いを記録しますassay.lloq(任意): BLQ/M3-ready fixture用のLower Limit of Quantification。valueとunitを持てます。top-levellloqも後方互換の簡略指定として読めます。誤配置しやすいmodel.assay.lloq/model.lloqも互換フォールバックとして読みますが、新規specではassay.lloqを推奨します
assay:
lloq:
value: 10
unit: ng/mL
iiv と residual はmrgsolve等のPopPK runner向けのspec情報です。同梱の tools/mrgsolve_runner.R もこの契約を読み込みます。組み込みdemo generator単体では model.theta を主に消費し、薬剤固有のIIV/residual modelとしては消費しません。demo-only variabilityはCLI/config側の軽量オプションで別管理します。
demo generatorの対応経路は oral, po, sc, im, iv, iv_bolus, iv_infusion, intravenous です。SC/IMは一次吸収式の軽量fixtureとして扱います。その他の未対応経路は吸収相の黙示的bolus化を避けるためエラーにします。
sample_clinical_timepoints.py の method は linear, log-linear, exact, nearest を受け付けます。log-linear は陽性濃度列のみlog-linear補間し、濃度以外の数値列は線形補間します。sampling.predose_mdv1: true またはCLI --predose-mdv1 を使うと、名目0時間の観測をPopPK側で MDV=1 として扱えます。
BLQ行は PCSTAT=BLQ, PCBLFL=Y, PCLLOQ としてSDTM-like PCへ出力され、analysis inputでは BLQ=1, CENS=1, LIMIT=LLOQ としてPopPK fixtureへ伝搬します。これは外部NONMEM/nlmixr2 control streamでM3 likelihoodへ接続するための列契約です。PCSTAT=BLQ と PCBLFL は提出用標準SDTMへの完全準拠ではなく、workflow fixture向けの簡略表現です。Pinnacle 21等のconformance checkへ直接かける場合は、施設仕様に合わせて PCORRES="<LLOQ"、PCSTRESN blank、SUPPPC/ADaM側BLQフラグなどへ変換してください。
PopPK fixtureのBLQ観測は既定で DV=0, MDV=1, CENS=1, LIMIT=LLOQ として出力します。M3 likelihoodのcontrol streamによっては DV=LLOQ など別規約を期待するため、実解析側adapterで調整してください。
population.subject_source(任意)
simPop などで作った被験者属性テーブルを、テンプレートから参照するための任意ブロックです。既存の population.covariates はフォールバックとして残します。
population:
n: 100
covariates:
wt_kg:
dist: lognormal
median: 70.0
cv: 0.25
min: 40
max: 120
subject_source:
type: external_csv
path: subjects/aciclovir_subjects.csv
generator: simPop
required_columns: [ID, ARM, DOSE_MG, WT, AGE, SEX]
optional_columns: [USUBJID, STUDYID, HEIGHT_CM]
このブロックは 人口属性の入力 だけを表します。simPop は CL、V、KA、F、ETA などのPK個人差を生成しません。PK個人差は model / iiv 側で定義してください。
HEIGHT_CM は任意列です。存在する場合はSDTM-like VS の HEIGHT, BMI, BSA 作成に使い、存在しない場合は後処理ツール側でworkflow fixture用の身長を生成します。
drugs/<slug>/targets.yml
pk-targets(想定)に渡すためのターゲット定義。
targets.auc.valueは v0.1 では Dose/CL から自動計算(暫定)targets.auc.basis:dose_over_clなど、AUC targetの由来を機械可読に示しますtargets.auc.independent_literature_target:falseの場合、AUC targetは独立文献AUCではなくfixture整合性チェックですtargets.auc.source_value:CL_abs_L_per_h_at_70kgなど、Dose/CL計算に使う入力値の識別子ですtargets.auc.role:consistency_checkなど、targetの用途を示しますtargets.t_half.role:check_onlyなど、t_half targetの用途を示しますtargets.t_half.used_to_calibrate_cl_v:falseの場合、t_halfはCL/Vを自動再較正しませんtargets.t_half.structural_mismatch.acknowledged:trueの場合、CL/Vとt_halfの不一致をfixture limitationとして確認済みですprovenance_review: warning薬剤では、CL/V/t_halfをjoint calibrationしない理由を短く記録しますnotesには、人間向けの補足として、AUCがDose/CL由来で独立文献AUCではないこと、spec側で採用する独立パラメータ対、1-compartment attainability labelを残します
AUCがpassしても臨床妥当性の証拠にはなりません。文献AUCで検証したい場合は、targets.auc.value/unit/summary を文献値に差し替え、source/raw/parsed/derived の対応と単位変換式を notes に残してください。
workflow MANIFEST.yml
run_workflow.py が出す run-level MANIFEST.yml は、入力・出力・件数に加えて、
ターゲットの由来と1-compartment上の制約を機械可読に残します。
target_metadata:
parameter_pair_policy: spec_theta_uses_pk_yml_derived_cl_v_abs
clearance_basis: systemic
volume_basis: systemic
auc:
basis: dose_over_cl
target_basis: dose_over_cl_not_literature_auc
independent_literature_target: false
value: 5096.83995922528
unit: ng*h/mL
summary: geometric_mean
t_half:
basis: literature_target_retained_as_check
value: 2.5
unit: h
summary: arithmetic_mean
pk_parsed_half_life_h: 2.5
target_half_life_h: 2.5
cl_v_implied_half_life_h: 1.4838
relative_error: 0.406
warning_threshold: 0.25
attainability_status: WARN
detected_structural_mismatch: true
acknowledged_structural_mismatch: true
structural_mismatch_reason: one_compartment_fixture_approximation
target_metadata.auc.basis: dose_over_clは、AUC target が積分整合性チェックであり、独立した文献AUC検証ではないことを示します。target_metadata.t_half.detected_structural_mismatch: trueは、採用したCL/Vペアとt_halfを1-compartmentで同時達成できないことを計算上検出した状態です。target_metadata.t_half.acknowledged_structural_mismatch: trueは、その不一致をfixture limitationとして人間が確認済みであることを示します。- これらは実行artifactの監査情報であり、
pk.yml、targets.yml、spec_pk1_*.ymlを自動更新しません。
生成物の監査用に、run-level manifest は出力CSV/レポートartifactごとの SHA-256 も持ちます。 manifest自身、trace log、下位tool manifestは自己参照やtimestamp差分を避けるため対象外です。
output_checksums:
clinical_samples_csv: 75b0...
simulation_validation_md: f319...
dm_csv: 9c2e...
pc_csv: 5d44...
adpc_csv: 8805...
nca_input_csv: 03aa...
poppk_input_csv: c75c...
run_workflow.py --reproducible を使うと、created_at と trace.log のtimestampは
SOURCE_DATE_EPOCH 由来の固定UTC時刻になります。SOURCE_DATE_EPOCH が未設定の場合はUnix epochを使います。
run-level manifestには full provenance ではなく summary だけを出します。
value_provenance_summary:
scope: value_provenance_present
provenance_required: true
required_fields:
- CL_abs_L_per_h_at_70kg
- V_abs_L_at_70kg
- t_half_h
metadata_present_fields:
- CL_abs_L_per_h_at_70kg
- V_abs_L_at_70kg
- t_half_h
source_checked_fields:
- t_half_h
checked_fields: # legacy alias for metadata_present_fields; validator requires it to match
- CL_abs_L_per_h_at_70kg
- V_abs_L_at_70kg
- t_half_h
fields_needing_review:
- CL_abs_L_per_h_at_70kg
source_ids: []
mismatch_acknowledged_fields:
- t_half_h
非warning薬剤など、現段階で value-level provenance を必須対象にしていない薬剤では、summary は次のように空の対象範囲を明示します。
value_provenance_summary:
scope: warning_drugs_only
provenance_required: false
required_fields: []
metadata_present_fields: []
source_checked_fields: []
checked_fields: []
fields_needing_review: []
source_ids: []
mismatch_acknowledged_fields: []
ツール
python tools/validate_library.py <root>: 整合性チェック。CL/Vから暗黙に決まる半減期とpk_parsed.half_life_hが大きく矛盾する場合は1-compartment attainability warningsを表示する。これはpk.ymlの自動修正ではなく、1-compartment fixtureとして同時達成できないtargetを見える化する警告python tools/rebuild_index.py <root>: INDEX.csv 再生成python tools/validate_subjects_csv.py subjects.csv: 外部被験者CSVの列・行数・基本値を検証python -m tools.pk_fixture_cli --help: standalone CLI入口。doctor,run,workflowなどから既存ツールへdispatchするpython tools/run_harness.py harness_examples/demo_set.yml: YAML configから複数薬剤デモまたはpost-simulation workflowを起動する共通入口。Shiny Cloud/Tauri/CLIから同じconfigを使うための薄いdispatcherpython tools/run_workflow.py --sim-full outputs/<run>/raw/sim_full.csv --drug <slug> --times 0,0.5,1,2,4,8,12,24 --out-dir outputs/<run>/workflow: 生成済みsim_full.csvから検証、採血時点抽出、SDTM-like CSV生成、ADPC-like/NCA/PopPK入力生成、run-level manifest/trace作成を一括実行する。必要に応じて--pc-conc-unit,--dose-cmt,--observation-cmtで濃度単位とPopPK CMT conventionを明示できる。監査用に timestamp を固定したい場合は--reproducibleとSOURCE_DATE_EPOCHを使うpython tools/run_demo_set.py --drugs albuterol,alprazolam,aciclovir,abciximab,felodipine --out-dir outputs/demo_set_milestone7: 複数薬剤のデモ用sim_full.csvを既存spec thetaから解析式で作成し、各薬剤にrun_workflow.pyを適用する。これはworkflow smoke demo用で、mrgsolve runnerの代替ではないpython tools/validate_simulation.py outputs/<run>/raw/sim_full.csv --pk drugs/<slug>/pk.yml --targets drugs/<slug>/targets.yml: 生成済み濃度データから AUC/Cmax/Tmax/t1/2 を単回で再計算して比較する。入力CSVに単位列があればレポートとCL由来AUC換算に使う。検証は決定論的な1回の計算であり、最適化やcalibrationは行わないpython tools/sample_clinical_timepoints.py outputs/<run>/raw/sim_full.csv --times 0,0.5,1,2,4,8,12,24 --out outputs/<run>/raw/clinical_samples.csv: 密なシミュレーション出力を臨床試験の名目採血時点に合わせて疎化するpython tools/make_sdtm_like_domains.py --clinical-samples outputs/<run>/raw/clinical_samples.csv --spec drugs/<slug>/spec_pk1_oral.yml --out-dir outputs/<run>/sdtm_like: 限定版のDM.csv,VS.csv,LB.csv,EX.csv,PC.csv,MANIFEST.ymlを生成する。濃度単位は入力単位列から引き継ぎ、必要なら--pc-conc-unitで明示する。--strict-subject-matchを付けるとsubjects.csvとPC側の被験者ID不一致で停止する- 既存ドメインを使う場合は
--dm-csv,--vs-csv,--lb-csv,--ex-csv,--pc-csvを指定できる。--pc-csvは濃度なしPC skeletonとして扱い、USUBJID + PCTPTNUM/PCTPT/PCELTMでclinical_samples.csvと照合してPCORRES/PCSTRESNを埋める python tools/make_analysis_inputs.py --sdtm-like-dir outputs/<run>/workflow/sdtm_like --out-dir outputs/<run>/workflow/analysis_inputs: 限定版SDTM-likeDM/VS/LB/EX/PCからADPC.csv,NCA_INPUT.csv,POPPK_INPUT.csv,MANIFEST.ymlを生成する。--dose-cmt,--observation-cmtでPopPK fixtureのCMT conventionを明示できる。これらは下流workflow smoke test用で、submission-ready ADaMやモデル固有NONMEM datasetではないpython tools/make_downstream_adapters.py --analysis-dir outputs/<run>/workflow/analysis_inputs --out-dir outputs/<run>/workflow/adapters:ADPC.csvとPOPPK_INPUT.csvからnca_r.csv,nca_phoenix.csv,poppk_nonmem.csv,poppk_nlmixr2.csvを生成する。これはparser/control-stream smoke test用adapterで、各ツールの正式dataset仕様を保証しないpython tools/make_site_adapters.py --analysis-dir outputs/<run>/workflow/analysis_inputs --spec-yml external_validation/site_adapter_template.yml --out-dir outputs/<run>/workflow/site_adapters: 施設ごとの列名、固定値、必須非空欄をYAMLで定義し、site-specific CSV adapterとSITE_ADAPTER_MANIFEST.ymlを生成するpython tools/validate_downstream_adapters.py outputs/<run>/workflow/adapters: adapter CSVのrepository-owned contractを検証する。外部ツール公式仕様の認証ではないpython tools/run_downstream_smoke.py --analysis-dir outputs/<run>/workflow/analysis_inputs --out-dir outputs/<run>/workflow/downstream_smoke: adapter生成、簡易NCA、PopPK parser template作成をまとめて行うfixture-level E2E smoke checkpython tools/run_external_tool_validation.py --downstream-dir outputs/<run>/workflow/downstream_smoke --out-dir outputs/<run>/workflow/external_tool_validation --tools nonmem,nlmixr2 --execute: 同じrepo内のprofileから外部Phoenix/NONMEM/nlmixr2環境を任意実行する。外部ツール本体やライセンスは同梱しないpython tools/validate_harness_config.py harness_examples/demo_set.yml:run_harness.py用configの必須項目、mode、sampling、validation、demo variability設定を検証するpython tools/check_examples.py examples: Git管理されたexamples/minimal_*を一時ディレクトリで再生成し、CSVとmanifestの安定項目が期待出力からずれていないか確認するpython tools/doctor.py: Python/R/Quarto/simPopなどのローカル環境をpreflight確認する。必須依存不足はFAILED、任意依存不足はWARNpython tools/validate_manifest.py outputs/<run>/workflow/MANIFEST.yml: run-levelまたはtool-levelMANIFEST.ymlの必須field、status、mapping/list型を確認するpython tools/render_manifest_viewer.py outputs/<run>/workflow/MANIFEST.yml --out-html outputs/<run>/workflow/manifest_viewer.html:MANIFEST.ymlを薄い静的HTML viewerに変換する。UI/cloud runnerの代替ではなく、manifest閲覧用Rscript tools/report_pk_fixture.R --analysis-dir outputs/<run>/workflow/analysis_inputs --out-dir outputs/<run>/workflow/reports/pk_fixture_report --title "<slug> PK fixture report":ADPC.csvから被験者背景の要約統計、時点別濃度統計、ggplot2のlinear/log濃度プロット、Markdownレポートを生成する。これはfixture確認用の記述統計で、臨床薬理モデル妥当化ではないRscript tools/make_adnca.R --analysis-dir outputs/<run>/workflow/analysis_inputs --out-dir outputs/<run>/workflow/adnca --mode auto --title "<slug> ADNCA fixture": 単回はADPC.csvからNCA-likeパラメータを再計算し、反復はNCA_SS_SUMMARY.csv/TROUGH_SUMMARY.csvを取り込む。ADNCA.csv/ADNCA_WIDE.csv、linear/log濃度プロット、反復時の定常状態区間プロット、report/manifestを生成する。submission-ready ADaMや実NCAエンジンの代替ではないRscript tools/render_pk_fixture_quarto.R --analysis-dir outputs/<run>/workflow/analysis_inputs --out-dir outputs/<run>/workflow/reports/pk_fixture_quarto --title "<slug> PK fixture report":templates/pk_fixture_report.qmdを使って、軽量レポートの内容をQuarto docxへ変換する任意ステップ。Word style referenceを使う場合は--reference-doc reference.docxを指定するRscript tools/make_simpop_subjects.R --out subjects.csv --n 100 --dose-mg 100: 任意のsimPopベース被験者CSV生成