YONAPO RESEARCH
研究記録
MedDSL(仮称)

RESEARCH / RECORD

P2-e:有効期間つきの主張の意味設計

原文 docs/research/31-p2-e-design.md

22 KB

GitHubで見る

版 be280c0

この文書の目次 9項目

作成日:2026-10-20。状態:作成者側の設計草案。runtime・登録宣言・実行用fixtureは未実装。選定と作業順 の最初の段階として、意味・保存範囲・反例・実装の受入条件を定めます。手指定の正例・反例 と合わせて読みます。外部標準への適合仕様ではなく、架空の主張を用いた本プロジェクトの作業定義です。独立確認と評価の凍結は未実施です。

1. 問いと今回の判断

研究上の問いは、いつ利用できた情報かといつについての主張かを区別して追加する際、既存の採用・訂正の意味を隠れて変えずに済むかです。期間の付与だけで、過去の記録を現在の意味へ読み替えたことにはしません。

判断 初回に採る設計 理由・見直す条件
TE-D1 参照時点 as_of と対象時点 target_at を別に指定 後から得た知識で過去を問うことと、過去に知り得たことを分ける
TE-D2 明示された有限半開区間 [start, end)。UTC・秒精度 接する区間を重複させず、初回の境界を有限に検査する。日付のみ・現地時刻・精度の異なる時刻は別設計
TE-D3 期間内だけを訂正する新方針。旧P0の全体訂正と分離 「先に全体を採用し、後で期間を絞る」方法では部分訂正の外側が消える(T07)
TE-D4 初回は R5の方針診断 として試作 核の採用結果だけを読むR2/R6では、新しい部分訂正を表現できない。保存認定や基底の状態への変換は行わない
TE-D5 新しい時間台帳・要求・回答型。旧P0台帳の自動取込なし 既存の supersedes や context.effective_at の意味を変えない
TE-D6 単一文脈・単一個体・単一の単項原子。規則・分割との併用なし 初回の差を時間と採用の関係に限定する。一般の時間論理の成立を主張しない

有限区間は、入力者がその区間全体について主張した、という明示的な前提です。観察一点から区間を推定する処理ではありません。この区間が医学的に正しいかは、本設計の構造検査からは分かりません。

2. 旧契約との境界

現在の 採用選択 は、参照時点までに記録・確認された主張から、適格な訂正の対象を主張全体として除きます。訂正元が後に訂正されても、除いた古い記録を自動復活させません。検証 は、訂正先が同じ文脈・原子で、記録が厳密に後であること、人の確認が主張の記録以後であること等を要求します。

時間の区別が全くなかったわけではありません。旧 recorded_at は記録時刻、view.as_of は参照時点、context.effective_at は文脈の単一対象時点です。新しい対象期間で、これらを上書きしません。

保存する範囲 Q_old は、従来から妥当な旧schema・旧方針の要求です。要求の翻訳 E と回答の対応 ρ は恒等、観測 O は従来の意味結果・根拠・採用情報・停止情報(実装識別 certifier を除く)です。専用handlerの追加による旧経路の非干渉を別途検査します。実装の追加で certifier が変わることは許します。

新しい期間つき要求と旧要求の答えが一致する、という保存は主張しません。 部分訂正は方針変更です。新要求の結果を旧 supported / opposed へ変換する規則、旧データへの期間の補完、旧 supersedes から部分訂正への自動翻訳は作りません。

context.effective_at は元の文脈の時点として保持します。新しい target_at は、その同じ文脈に明示的に付された期間への別の問いです。元の文脈の時点を変更したり、別文脈へ事実を移したりはしません。この追加の解釈を許すこと自体も、新方針の前提に含めます。

3. 初回の入力断片

以下の名前は実装に向けた予約案です。現在のCLIが受け付けるschemaではありません。登録時に所有の衝突を検査し、仕様の生バイトhash・実装・依存・防護例を固定します。

項目 設計
profile・要求schema p2-temporal-assertion-draft-1 / p2-temporal-request-draft-1
操作・回答型 probe_temporal_literal / temporal_literal_probe
方針 fiction:confirmed-scoped-revision@1。旧方針を受け付けて代用しない
要求の外枠 schema_version, operation, consumer, source, views, queries, budget。consumer はprofile・仕様hash・操作を照合
source package, contexts, ledger。初回はP0形式の単一package・単一文脈。packageは単一の単項述語を宣言し、定義・包含・依存packageなし
時間台帳 schema_version: p2-temporal-ledger-draft-1、ref, assertions, reviews。P0台帳として扱わない
主張 P0と同じ意味の id, context_ref, atom, polarity, certainty, recorded_at, origin, required_capabilities に validity, revises を加える。supersedes は持たない。訂正には非空の change_reason が必須
原子 全主張・全queryが同じ P(u)。u は文脈の subject_ref。変数・複数原子・他個体なし
確認 P0と同じ確認項目。human / confirmed の確認だけを受け付け、時刻は対象主張以後。AI由来でも確認前は採用しない
views id, as_of, policy_ref。参照時点は記録・確認の可視性を決める。1〜64件
queries id, context_ref, atom, target_at。1〜64件。旧queryの「支持が必須」という required の意味は持ち込まない
必須能力 各時間主張は上記profileを required_capabilities に含める。消費側が理解する集合はP0の能力とこのprofileだけ
上限 1 MiB・深さ64、主張/確認各1,000件、views/queries各64件、予算0〜100,000。boolを整数として受け付けない。P0の構造上限に準じる

origin、確認者、文脈、記録の参照を保持します。新台帳の確認は validity・revisesを含む主張全体に対する確認です。主張の内容や期間を変更して同じID・確認を使い回す操作は設けません。取込・更新・外部保存のAPIは初回の範囲外です。複数要求間での同一IDの不変性を保証する永続ストアも、まだありません。

3.1 期間の型

validity 意味 初回の処理
{kind: bounded, start, end} start <= t < end の全時点についての主張 厳密なUTC秒精度。start < end が必須
{kind: unknown} 期間が分からないと明示した記録 保存するが、適格なら当該文脈の期間判定を保留する
{kind: unspecified} 入力側が期間を提供していないと明示した記録 同じく保留。ただし理由はunknownと区別する
{kind: open_end, start} 終点を持たない期間の明示 初回は unsupported_profile。unknown・全期間へ読み替えない
欄なし、null、boundedの片端欠落、空・逆転区間 上記のいずれとも解釈できない invalid_input

unknown / unspecified に境界欄を混在させません。期間不明の主張から・への訂正は、初回の区間包含を検査できないため unsupported_profile。区間が既知なら、各訂正は同じ文脈・原子、厳密に後の記録で、訂正元の区間が訂正対象の区間に包含されることを要求します。区間を広げる記録は別の主張として作り、訂正としては受け付けません。

この制限により、確認済みの期間不明記録を、後から期間既知の記録で精密化して阻害を解消する経路は初回にはありません。情報要求が出ても、記録の書換えや確認の使い回しで解消したことにしません。期間不明の解消・精密化は、初回診断の限界として残す別の採用契約の課題です。

対象時点が参照時点より後でも、明示区間内かどうかの点検は可能です。それを予測・将来の臨床的成立の保証とは扱いません。期間の自動延長、持続の推論、将来の主張の生成は行いません。

4. 採用と部分訂正の作業定義

以下で a は主張、r は確認、k は参照時点、t は対象時点です。入力の構造検査を全体について済ませてから評価します。未来の不正な記録を無視して妥当な要求とするわけではありません。

V(k) = {a | a.recorded_at <= k}
R(a,k) = {r | r.assertion_ref = a.id かつ r.recorded_at <= k}
E(k) = {a ∈ V(k) | a.certainty = confirmed かつ R(a,k) ≠ ∅}

C(k,t) = {a ∈ E(k) | a.validity = bounded かつ start(a) <= t < end(a)}
S(k,t) = {b.id | a ∈ C(k,t) かつ b.id ∈ a.revises}
A(k,t) = {a ∈ C(k,t) | a.id ∉ S(k,t)}

Pos(k,t) = {a.id | a ∈ A(k,t) かつ a.polarity = positive}
Neg(k,t) = {a.id | a ∈ A(k,t) かつ a.polarity = negative}

訂正の対象も E(k) に属することは要求しません。訂正元の確認が見えれば、その訂正元が対象を覆う時点に限って対象を除きます。未確認の対象が後に確認されても、既に適格な訂正を飛び越えて復活しません(T16)。

重要なのは、S を AではなくCの全訂正から計算することです。A→B→Cの鎖でBが除かれても、Bが覆う時点でAを再採用しません(T09)。区間包含と記録の厳密な順序により、循環した訂正は作れません。

4.1 判定前の停止と情報不足

順序は固定します。

  1. V(k) のいずれかに未知の必須能力があれば、その文脈の結果は unassessed / unknown_capability。保留・訂正済み・期間外でも無視しない。まだ見えない主張は根拠にも阻害要因にも使わない。
  2. 未知能力がなければ、E(k) に unknown / unspecified 期間がある場合は unassessed / validity_unknown または validity_unspecified。どの時点にも関係しないと証明できないため、既知の肯定が別にあっても判定しない。両方あれば両理由を示す。
  3. それ以外でのみ C, S, A, Pos, Neg を計算し、以下の型の値を確定する。

期間不明でも、未確認・suspectedならそれだけで段階2の阻害要因にはしません。確認前の候補から採用や訂正を行わないためです。未知の能力に対する段階1とは区別します。

literal_state 条件 意味
positive_only Posあり・Negなし 新方針下の当該時点で肯定の明示主張だけが採用される
negative_only Posなし・Negあり 同じく明示否定だけが採用される
both Posあり・Negあり 当該時点で競合。肯定を優先しない
neither Posなし・Negなし 当該時点の採用根拠なし。否定・不存在・治癒を意味しない

停止した行は literal_state: null。both は処理が完了した競合の点検結果で、推論に使える臨床状態ではありません。期間が接するだけなら競合せず、重なった時点でのみ競合します。

5. 回答と根拠

正常に完了した行も方針診断です。回答全体は meaning_mode: temporal_literal_probe、certificate.status: not_certified、clinical_assertions_added: []、converted_to_base: false を持ちます。旧基底との保存、医学的正しさ、期間内での実世界の成立の認定は出しません。

各行に (view, query, as_of, target_at, policy_ref)、処理状態、literal_state、理由を持たせます。完了した行には以下をIDの辞書順で返します。

  • positive_assertion_refs / negative_assertion_refs:Pos / Neg。
  • masked_assertion_refs:S。原記録を消した一覧ではなく、この時点での訂正対象。
  • revision_evidence:効いた (訂正元, 訂正対象) の各辺と、訂正元の可視の人の確認参照。訂正元自体が後段で除かれた辺も含める。
  • assertion_evidence:採用された各主張・その期間・可視の人の確認参照。使った前提として explicit_interval_uniformity と scoped_revision を記す。

停止した行には完成した採用集合や部分的な literal_state を返しません。阻害した主張・能力と理由だけを返します。validity_unknown / validity_unspecified の情報要求は、原記録を書き換える命令ではなく、期間情報とその根拠・確認が追加で必要という診断です。期間が判明すれば競合が解ける、とは保証しません。

全主張・確認の原データは要求に残し、応答の保持一覧も全IDを含めます。この保持一覧には未来の入力も含まれ得るので、アクセス制御の保証ではありません。一方、判定根拠・可視一覧・阻害理由には参照時点より後の情報を使いません。

6. 資源と決定性

構造・参照・時刻・区間包含・consumer/hashの検査は、予算0でも同じ結果にします。意味計算だけを共通の Budget に課金します。入力全体が有限の上限に収まることは、課金外の検証にも要求します。

初回の課金案は、要求開始1、各viewで主張1件・確認1件につき各1、各行の開始1、可視主張1件につき1、適格な主張の訂正辺1本につき1、行の確定1です。阻害要因のある行も同じ走査分を払い、判定が途中までできたことを完成値にしません。viewとqueryはIDで整列し、同じ参照時点のキャッシュによる割引は設けません。

完了に必要なsteps
 = 1 + Σview [ N_assertions + N_reviews
              + Σquery (2 + |V(k)| + Σa∈E(k) |a.revises|) ]

各走査分を計算前に払い、行の確定分を払った後にだけ結果を公開します。足りなければ resource_limit / step_limit、未完了行は unassessed かつ値なし。先に完了した行は保持し、以後の未完了行は値なしとします。steps_used <= max_steps、完了行を得る前の予算に対して完成値を出さないことを受入条件にします。これは将来の実装で照合する課金仕様で、現在のP0の実測値ではありません。

7. 保存条件・義務・反例の対応

7.1 手作業の導出

TE-L1:未来の記録・確認は時点kの根拠にならない。 入力が妥当で、構造・consumer等の条件が同じであるとき、完成した意味結果はV(k)と可視の確認だけから定まる。両方の時刻がkより後の主張・確認の追加はこれらを変えない。ただし、既に見える主張への確認がkまでに追加される場合はE(k)が変わるので範囲外。保持一覧、入力hash、資源量の一致は含意しない。

TE-L2:部分訂正の外側では元の主張を除かない。 追加された訂正aについて t ∉ validity(a) ならaはCに入らず、その辺はSに入らない。a以外の可視の意味条件が同じなら、aによる部分訂正はそのtの採用を変えない。未知能力等による停止は別条件であり、これを無視して非干渉とは言わない。

TE-L3:訂正の鎖で元の主張が復活しない。 aが適格でtを覆いbを訂正するなら、aがAに残るかに依らずbはSに入る。よって、後の主張がaを除いても、その事実だけではbはAに戻らない。対象区間の外側はTE-L2の別の場合。

TE-L4:半開境界と有限性。 [x,y) と [y,z) の共通時点はない。有限個の既知境界で時軸を区切ると、各境界間では全区間の所属が一定で、同じkについてC/S/Aも一定。境界そのものと各隣接領域の代表点を調べれば、この有限の記録集合・時点kについて全対象時点の判定を被覆できる。任意の期間・記録・一般時間論理の証明ではない。

TE-L5:旧要求の非干渉は新方針の保存と別。 新handlerが旧経路を変更せず可変共有状態を持たなければ、旧要求は同じ関数へ渡る。新方針のC/S/Aが旧全体訂正と異なっても、旧経路に適用しなければ旧要求の意味は変わらない。実装時には共有validatorの変更とimportによる影響も確認する。

これらは作成者側の手作業の導出で、機械検証・独立確認ではありません。

7.2 契約への割当

R5-1〜3に「部分訂正の前提・差の明示」「認定しない」「臨床主張を追加しない」を対応させます。共通のK-ID/K-STOP/K-INV/K-RESも必須です。ただし、既存R5の必須欄を埋めるだけでは、時間の採用規則の正しさは検査できません。以下の追加義務を、このパイロットの契約文書・検査・防護例へ割り当てます。まだ登録宣言はありません。

追加義務 内容・関連する導出 先に壊す例
TE-1 二つの時点と確認の可視性(L1) T01〜T03、T15〜T17
TE-2 半開境界・不明・未指定の非補完(L4) T04〜T06、T13〜T14、T18
TE-3 区間内だけの訂正と包含(L2) T07〜T08、N05〜N06
TE-4 適格な全訂正辺を使い、復活させない(L3) T09、T16
TE-5 明示否定・競合・根拠なしを区別 T06、T10〜T12
TE-6 旧経路・原記録・型・能力の境界(L5) T18〜T20、N01〜N04、N10
TE-7 決定性・予算・行の原子的な確定 N08〜N09、B01〜B04
TE-8 仕様・方針・依存・実装の識別と再検証 N07、固定した旧版からの回帰

R5は関係の分類として足りますが、時間特有の義務を既存の必須項目から自動導出する仕組みはありません。この不足を、ただちに新しい汎用クラスを追加して解消したとは扱いません。初回の評価で追加義務の検出力を確かめ、他の方針変更にも共通するかを判断します。将来、時間の結果を基底の事実として利用する場合は、別の橋渡し・採用契約の研究が必要です。

8. 実装と内部評価の受入条件

  1. 本文と ケース表 を先に期待として固定し、実行結果から期待を生成しない。名前・型・課金案の変更は理由と旧版を残す。
  2. 新しい専用モジュール・native仕様・handler登録・R5宣言・実行例を追加する。旧 ledger.select_view と旧 supersedes の意味は変更しない。
  3. T01〜T20の意味条件、N01〜N10の不正・境界条件、B01〜B04の資源条件を別の分母で照合する。未対応と不正、完了した競合と未完了を混ぜない。
  4. 実装の点選択と別に、区間を差し引く参照計算を用意する。既知境界とその間の代表点、参照時点の記録/確認境界で照合する。小さな包含可能な訂正DAGを有限列挙し、極性・未確認・遅延確認を含める。
  5. 半開の終端を含める、確認を無視する、最終採用元からだけ訂正辺を計算する、未知能力を期間外なら捨てる、neitherを否定にする、という変異をそれぞれ検出する。参照計算がruntimeと同じ関数を呼ばないことも確認する。
  6. Python 3.11/3.14で新経路・予算掃引を実行し、旧P0/P1/P2と追加系列・監査を回帰する。原入力と期待の不変性も検査する。
  7. 新経路を固定する前に旧P2-dの実体を履歴から再現できることを確認する。新しいnative仕様・宣言・fixture・評価器は固定対象へ明示的に加え、旧スナップショットの分母を黙って差し替えない。
  8. 件数・必須パス・hash・予算・実行環境・残る穴を結果文書へ記録する。independent_review / evaluation_frozen はfalse。結果に応じて数量・併用へ進む範囲を更新する。

初回の作業量は「専用の意味モジュール1件、単一原子の診断1操作、T20/N10/B4条件と参照計算・変異・回帰」に限定します。日時の見積りは置きません。意味を変える不足が見つかれば、内部判断TE-D1〜6に戻ります。

9. 今回確立していないこと

臨床的な有効期間の決定、時刻精度や地域差の一般処理、永続履歴の認証、既存履歴の無損失移入、複数文脈・事象・数量・概念分割との併用、Horn閉包に期間を伝える方法、一般の時間論理、実会計・分類への対応は未解決です。

新方針が「より正しい臨床の訂正」であるとも、R5の分類だけで拡張の正しさが証明されたとも言いません。今回確かめるのは、意味変更を別の方針として識別し、旧経路を保ちながら、有限の時間断片の採用・停止・根拠を検査できるかです。これは最終目標である変化に耐える体系の、限定した一つの実験です。

P2-e

同じ区分の文書