統合課題解決ドクトリン(Explore-Deliver Doctrine) | 判断ロジックと契約 #ROI-2 判断モデル

主:この判断モデルは思想を元に判断モデルを作成した一例であり、絶対の正ではない。

フレームワーク連携前提の“判断ロジック+契約”。具体の数値・儀式・ボード構成はFrameworkが担う。

役割(この文書の目的)

  • 思想に沿って“どう判断するか”の抽象ロジックと不変条件、Framework が実装すべき契約(Policy/Artifacts フック)を定義する正典。
  • 具体の数値・儀式・ボード構成は持たない(Framework の責務)。

0. スコープ

  • 問題モデル(PM)の型と状態遷移(抽象)
  • 意思決定単位(DU)スキーマ
  • 目的関数(制約優越)の原則と ROI 序数の定義
  • 粒度規則(候補生成ガード/Blocking Frontier/並列化)
  • タイブレーク順序(正典)
  • 不変条件(Invariant)
  • 契約インターフェイス(Policy/Artifacts)
  • 抽象アルゴリズム(擬似コード)
  • 計測の概念枠

1. 問題モデル(Problem Model)

  • 定義: PM = { T: 定義済みタスク群, H: 未定義変数=仮説(=マイクロ課題)群, X: 未特定要因 }
  • 目的: 行動リストではなく“意思決定のコンテキスト”。ここからDUを切り出す。

状態遷移(抽象)

  • X → H(発見)→ 実験中 → 解像 → T(実装タスクへ分解)
  • 逆遷移: TのDoR未達/前提崩壊 → Hに昇格(再検証)

2. 意思決定単位(Decision Unit, DU)

スキーマ(最小)

  • id, title, type: Task(実装タスク)/ Hypothesis(仮説=マイクロ課題)/ Sub‑Problem(構造化の器)
  • deps_in / deps_out
  • readiness: DoR(score or Ready/Not)
  • reversibility: Two‑way / One‑way
  • blast_radius: Small / Medium / Large
  • cod: Cost of Delay(High / Med / Low)
  • cost_switch: Context Switch Cost(Low / Med / High)
  • roi_explore: 1–5(根拠一行)
  • roi_deliver: 1–5(根拠一行)
  • action: Explore / Deliver(決定後のPlan/PackageはFW側で生成)
  • owner(任意)

定義補足

  • Sub‑Problem: 出力は分割案/依存図/優先案。実験/実装は子のHypothesis/Taskが担う。

3タイプの違い(要点)

  • Task(実装タスク)
  • 目的: 解像済みの価値を実装して出荷する(Deliver)
  • いつ使う: DoRを満たし、手順・依存・品質基準が明確なとき
  • 必須: DoR/DoD、Rollback(必要に応じて)
  • 出力: 動く成果物(コード、設定、資産)
  • 完了条件: DoD達成・レビュー/テスト/リリース完了
  • 例: 「通知APIを実装」「LP文案を公開」
  • Hypothesis(仮説=マイクロ課題)
  • 目的: 不確実性を小さな実験で燃やし、意思決定の確度を上げる(Explore)
  • いつ使う: 前提や効果が未検証/タスクのDoR未達のとき
  • 必須: Experiment Plan(方法・TB・Exit・倫理リスク)
  • 出力: 学習結果(Yes/No/条件付き)と更新された問題モデル、必要なら新たなTask
  • 完了条件: Exit基準を満たす学習が得られた
  • 例: 「SNS広告のCPAが目標以内に収まるかを検証」
  • Sub‑Problem(構造化の器)
  • 目的: 大きな課題を“良い切り口”で分割し、依存と優先順位を決める
  • いつ使う: 選択肢が多い/複数の仮説やタスクがぶら下がる論点があるとき
  • 必須: 分割案・依存図・優先案(アウトプットは“構造化”)
  • 出力: 子のHypothesis/Taskの一覧、順序、探索エピックの束ね
  • 完了条件: 分解図と優先案が合意され、子アイテムがReady
  • 例: 「ユーザー獲得チャネルの設計」「課金方式の選択肢の絞り込み」

即判定フローチャート

  • もうやり方が見えているか?
  • Yes → Task(Deliverへ)
  • No → その“分からなさ”は検証できる仮説か?
    • Yes → Hypothesis(Experiment Plan必須)
    • No(切り口や範囲の設計が先)→ Sub‑Problem(構造化して子を出す)

型の遷移ルール(昇格/降格)

  • TaskがDoR未達/前提崩壊 → Hypothesisへ昇格(Exploreに戻す)
  • Hypothesisが解像 → 必要なTaskへ分解してDeliverへ
  • 大課題で子が散らばる → Sub‑Problemを立てて束ね、分割と優先を確定

アンチパターン(避けるべき)

  • Hypothesisに実装タスクを直接ぶら下げる(実験と実装の混在)
  • Sub‑Problemに「実装の完了」を完了条件として持たせる(器が作業を食う)
  • 大きな未定義をTaskのまま進める(DoR未達の放置)
  • 直線中にJDIを逸脱させる(JDIの禁止領域に触れる変更)

要するに

  • Sub‑Problem=分け方と順番を決める“設計の箱”
  • Hypothesis=分からないことを燃やす“学習の単位”
  • Task=決まったことをやる“実装の単位”

3. 目的関数と ROI(序数)

  • 制約優越: 倫理・規制・安全・ブランド等の下限はROI比較に優越(Constraint NGは即却下 or Explore‑Legalへ)。
  • 目的関数(概念): 価値獲得 + 情報価値 − リスク影響 − CoD を最大化。
  • 近似スコア(1–5、数値+短いナラティブ併用)
  • ROI_Explore ≈ 失敗確率低減幅 × 失敗時損失 ÷ 探査コスト
  • ROI_Deliver ≈ 期待価値 ÷ 実行コスト − 機会費用
  • 序数化ガイド(ばらつき低減)
  • 各ロールが Low/Med/High(三値)で入力 → 加重平均 → 1–5に写像
  • 0未満は1にクリップ、突出は5にクリップ
  • 評点は短い根拠文(1行)を必須とし、再評価で上書き可

4. 粒度規則(Blocking Frontier)

  • IsBlocking の定義: 当該アイテム未解決により他DUの開始/完了が阻まれる状態(依存/承認/共通資源)。
  • 候補生成ガード
  • DoR未達のTask→Hypothesisへ昇格(候補化)
  • Readyかつ非JDIのTask → 候補化(Deliver側のDUとしてスケジューリングに載せる)
  • 依存でブロックするH/サブ課題を候補化
  • risk: One‑way×Large または 依存クリティカルは常時候補化(前倒し燃焼)
  • JDI適合Taskは候補化せず直行(判定はFrameworkのPolicy.JDI)
  • Blocking Frontier フィルタ
  • “今の前進を止める最小のDU”=必須DU、他=任意DU
  • 並列化基準
  • 依存グラフで独立な成分は並列可
  • ExploreはWIP絞り目、Deliverは共通ボトルネック能力に従う(数値はFramework)
  • 飢餓(starvation)回避
  • CoD=Highかつ非ブロッキングが連続2バッチ未着手なら、次バッチで割当優先(SLA)
  • Prioritizeにaging(滞留週数)を加点要素として反映

スケジューリングヒューリスティック(cost_switchの扱い)

  • cost_switch=High のDUは同一ドメインでバッチ化、または実効WIPを−1扱い(FitCapacityで調整)。Decide(選択)には用いない。

5. タイブレーク(正典)

  • 規則: ROI差が2以上 → 高い方で即断。差が1以内 → 次の順に判定
    1) 可逆性(Two‑way→Deliver寄り/One‑way→Explore寄り)
    2) 被害半径(Large→Explore寄り)
    3) Cost of Delay(High→Deliver寄り)
    4) 依存クリティカリティ(強→Explore寄り)
    5) 最短学習時間(time‑to‑knowledge)が短い方
    6) 後戻りコスト(rework cost)が小さい方

6. 不変条件(Invariant)

  • I1. Hypothesisは必ず“実験計画(ExperimentPlan)”を持ち、実装タスクと混在しない
  • I2. TaskのDoR未達はHypothesisへ昇格し、Exploreで扱う
  • I3. ADR(意思決定ログ)を1行以上残す(選択/理由/前提/見直し条件)。JDIはADR不要(JDIログで代替)
  • I4. JDI は“可逆・小半径・短時間”の領域に限定(禁止領域と閾値はFrameworkが定義)
  • I5. One‑way×Largeの決定は、段階コミット/可逆化/逸脱検知の設計を伴う
  • I6. Constraint GateはDecideの前段で必ず評価される(制約NGは即却下 or Explore‑Legalへ)

(Frameworkは上記を弱めてはならない。強化は可)

7. 契約インターフェイス(Frameworkが実装すべきフック)

  • Policy.DoR(item) -> {score: 0–9, ready: bool}
  • Policy.JDI(task, context) -> bool
  • Policy.CoD(item, context) -> High/Med/Low
  • Policy.WIP(team, context) -> {explore_wip: int, deliver_wip: int}
  • Policy.BottleneckCapacity(context) -> W
  • Policy.ReevaluationTriggers(context, metrics, events) -> bool
  • Policy.Consent(signers, objections) -> proceed: bool
  • Policy.RollbackRequired(action, context) -> bool
  • Policy.MetricsConfig() -> 指標セット定義
  • Policy.ConstraintCheck(item, context) -> {ok: bool, route: Reject|Explore‑Legal|Proceed}
  • Policy.IsAgingRescue(item, context) -> bool # 例: CoD=High かつ AgeWeeks≥2
  • Artifacts.MakeExperimentPlan(DU) -> ExperimentPlan(min_fields)
  • Artifacts.MakeDeliverPackage(DU) -> DeliverPackage(min_fields)
  • Artifacts.MakeStructurePlan(DU) -> StructurePlan
  • Artifacts.MakeADR(DU, decision, meta) -> ADR(min_fields)

8. 抽象アルゴリズム(擬似コード:改訂版)

loop:
  PM = UpdateProblemModel()
  candidates = set()

  for item in PM:
    // 1) JDI(直行)。Policy.JDI は禁止領域/軽量Constraintを内包して判定
    if item.type == Task and Policy.JDI(item, ctx):
      ExecuteDeliver(item)              // 直行(JDIログのみ)
      continue

    // 2) Task の扱い(Ready判定→候補化 or 昇格)
    if item.type == Task:
      dor = Policy.DoR(item)
      if !dor.ready:
        candidates.add(UpgradeToHypothesis(item))  // DoR未達は昇格(Exploreへ)
      else:
        candidates.add(item)                       // Ready非JDI Taskは候補化(Deliver側)
      continue

    // 3) Hypothesis / Sub-Problem の候補生成
    //    - ブロッカー/大リスク/依存クリティカルは常時候補化
    //    - 非ブロッキングでも CoD 高 or aging 救済対象は候補化(飢餓回避)
    if IsBlocking(item) or IsRiskOneWayLarge(item) or IsDepsCritical(item)
       or Policy.CoD(item, ctx) == High
       or Policy.IsAgingRescue(item, ctx):
      candidates.add(item)

  // 4) Blocking Frontier(必須 vs 任意)
  must = FilterBlockingFrontier(candidates)        // 最小阻害単位
  maybe = candidates - must

  // 5) スケジューリング(WIP/ボトルネック/切替コスト/aging/CoD)
  queue = Prioritize(must, cod_boost=true, consider_aging=true)
        + FitCapacity(
            Prioritize(maybe, cod_boost=true, consider_aging=true),
            Policy.WIP(team, ctx),
            consider_cost_switch=true
          )

  // 6) 意思決定と実行
  for DU in queue:
    // Sub-Problem は先に“構造化Explore”として処理し、子へ分解して戻す
    if DU.type == Sub-Problem:
      plan = Artifacts.MakeStructurePlan(DU)       // 分割案/依存図/優先案
      ExecuteExplore(plan)                         // 短時間ワークショップ等
      PM = UpdateProblemModelFrom(DU)              // 子Hypothesis/Task生成
      continue

    // 制約ゲートは意思決定前段で必ず評価
    gate = Policy.ConstraintCheck(DU, ctx)
    if !gate.ok:
      if gate.route == Reject:
        Log(Artifacts.MakeADR(DU, "Reject", {reasons:"Constraint NG"}))
        continue
      if gate.route == Explore‑Legal:
        DU = EnsureHypothesis(DU)                  // リーガル/セキュ検証へ

    scores = ScoreROI(DU)                          // ROI_E, ROI_D in 1–5(序数)
    choice = Decide(scores, tie_breakers=[
      reversibility, blast_radius, Policy.CoD(DU, ctx),
      deps_criticality, time_to_knowledge, rework_cost
    ])

    if choice == Explore:
      plan = Artifacts.MakeExperimentPlan(DU)      // TB+Exit必須
      ExecuteExplore(plan)
    else:
      pack = Artifacts.MakeDeliverPackage(DU)      // DoR/DoD/Rollback等
      if Policy.RollbackRequired(pack.action, ctx): AttachRollback(pack)
      ExecuteDeliver(pack)

    Log(Artifacts.MakeADR(DU, choice, {reasons, assumptions, revisit, signers:Policy.Consent(...)}))
    PM = UpdateProblemModelFrom(DU)                // 実行結果でモデル即時更新(必要なら)

  // 7) 再評価トリガー(緊急は即リループ)
  if Policy.ReevaluationTriggers(ctx, metrics, events): continue
  EndOfCycle()

補足:

  • IsAgingRescue は Framework の SLA/aging ルールを参照(例: CoD=High 且つ Age≥2バッチ)
  • Artifacts.MakeStructurePlan は Framework が提供(短時間の構造化/分割セッション)

9. 計測(概念)

  • フロー: リードタイム、手戻り率、意思決定遅延、Deliver完了率
  • 学習: Explore比率、仮説的中率、情報価値の獲得件数(EVSI+)
  • 健全性: 重大事故率、ロールバック成功率
  • ポートフォリオ: CoD高案件の滞留(aging)とSLA逸脱件数

補足: Metrics の定義・ダッシュボード実装は Framework の責務。

対応マッピング(簡潔)

  • 問題モデル更新(T/H/X棚卸し)
  • Model §8 loop先頭、Framework ミニバッチ手順(2)
  • 候補DUの限定生成(生成ガード)
  • DoR未満のTask→Hypothesisへ: Model §4 候補生成ガード、I2
  • Readyかつ非JDIのTask→候補化: Model §4、Framework ミニバッチ手順(2)
  • 依存でブロック中H/サブ課題→候補化: Model §4
  • JDI(≤2h・可逆・被害小)→DU化せず即Deliver: Model §4/§6、Algorithmの直行、Framework 1-3
  • One-way×Large/依存クリティカルの常時候補化: Model §4
  • 非ブロッキングでもCoD=High/aging救済→候補化(SLA): Model §4、Framework 1-10/ラベル運用
  • Blocking Frontierフィルタ(必須と任意)
  • Model §4、Framework チェックリスト
  • ROI比較(ROI_Explore vs ROI_Deliver)
  • Model §3(序数1–5+タイブレーク)、§5(タイブレーク順)
  • 制約: 倫理/規制/安全/ブランド等はConstraint Gateで前段判定(Model §6 I6、§7 Policy.ConstraintCheck、Algorithm内)
  • 被害半径はタイブレーク要素として反映(Model §5)
  • リスク予算はConstraintCheckに含めて運用可能(Framework側Policyに載せる想定)
  • スケジューリング(WIP+並列条件)
  • Model §4 並列化、cost_switchの扱い(FitCapacityで調整)
  • Framework 1-5(WIP/ボトルネック)、cost_switch=Highはバッチ化
  • CoD高×agingの救済(SLA)を割当に反映(Model §4 飢餓回避、Framework ラベル/ビュー)
  • 実行
  • Explore: TB+Exit(ExperimentPlan必須): Framework アーティファクト
  • Deliver: DoR/DoD/Rollback(必要時): Framework アーティファクト、Rollback必須条件 1-8
  • Sub‑Problem: StructurePlanで構造化→子Hypothesis/Task生成→再評価
  • JDIはADR不要(JDIログで代替): Model §6 I3、Framework 1-3
  • 結果でPM更新→再評価トリガー→次ループ
  • Model §8 終端とPolicy.ReevaluationTriggers、Framework 1-6(緊急時は即再評価)
  • Constraint Gate(ROI比較の前段に): 制約NGは Reject か Explore-Legal にルーティング
  • 飢餓回避(候補生成とスケジューリングの双方で): CoD=High が2バッチ滞留したら次バッチで必ず割当(sla:rescue)

コメント

タイトルとURLをコピーしました