Solve robust policy across causal models

Choose an aggregate policy across competing interventional causal models and a bounded posterior credal set: derive model-by-action expected utility from outcome probabilities, compute exact lower/upper utility and adversarial model weights, minimize worst-case regret, expose model disagreement and value of perfect model information, and fail closed when any causal evidence gate fails.

What it's for

Creates a decision-science layer beyond one confident causal graph: Gitrevio can show which policy survives plausible competing mechanisms, exactly which model weighting defeats it, and whether resolving model ambiguity is worth buying.

What you give it

Inputs split into evidence read from your connected systems, calibration your team owns, and numerical controls that affect precision but never the result's meaning.

Field Type Role Required
actions array of objects (1 field) ≥ 2 items Evidence Yes
causal_models array of objects (6 fields) ≥ 2 items Evidence Yes
critical_minimum_utility number Your calibration Yes
max_detail_rows integer ≥ 1, ≤ 500 Numerical control Optional
maximum_acceptable_regret number ≥ 0 Your calibration Yes
outcome_utilities object Evidence Yes

Each causal_models record

Field Type Required
action_outcomes array of objects (2 fields) Yes
id string (non-empty) Yes
interventional_evidence_passed any Yes
posterior_weight number (≥ 0, ≤ 1) Yes
weight_lower number (≥ 0, ≤ 1) Yes
weight_upper number (≥ 0, ≤ 1) Yes
Example input
{
  "actions": [
    {
      "id": "accelerate"
    },
    {
      "id": "hold"
    }
  ],
  "causal_models": [
    {
      "action_outcomes": [
        {
          "action_id": "accelerate",
          "probabilities": {
            "loss": 0.1,
            "success": 0.9
          }
        },
        {
          "action_id": "hold",
          "probabilities": {
            "loss": 0.4,
            "success": 0.6
          }
        }
      ],
      "id": "optimistic-mechanism",
      "interventional_evidence_passed": true,
      "posterior_weight": 0.7,
      "weight_lower": 0.2,
      "weight_upper": 0.8
    },
    {
      "action_outcomes": [
        {
          "action_id": "accelerate",
          "probabilities": {
            "loss": 0.8,
            "success": 0.2
          }
        },
        {
          "action_id": "hold",

Truncated for display — the full payload is 64 lines.

What you get back

This is the actual output of running the example above — computed by the same function the platform calls, not an illustration.

Example output
{
  "action_robustness": [
    {
      "action_id": "hold",
      "nominal_expected_utility": 44.5,
      "robust_lower_expected_utility": 43,
      "robust_upper_expected_utility": 52,
      "worst_case_competitor": "accelerate",
      "worst_case_regret": 21
    },
    {
      "action_id": "accelerate",
      "nominal_expected_utility": 53.5,
      "robust_lower_expected_utility": 1,
      "robust_upper_expected_utility": 64,
      "worst_case_competitor": "hold",
      "worst_case_regret": 51
    }
  ],
  "assumptions": [
    "Each supplied model defines comparable interventional outcome probabilities for every action and has an auditable identification/evidence gate.",
    "The lower/upper model weights form a defensible credal set containing the nominal posterior rather than being tuned to force a preferred action.",
    "Outcome utilities are complete, commensurable, and owned by accountable decision makers; omitted harms are not silently assigned zero utility."
  ],
  "causal_model_diagnostics": [
    {
      "action_expected_utilities": {
        "accelerate": 85,
        "hold": 40
      },
      "model_id": "optimistic-mechanism",
      "model_optimal_action": "accelerate",
      "posterior_weight": 0.7,
      "selected_action_worst_regret_weight": 0.8,
      "weight_interval": [
        0.2,
        0.8
      ]
    },
    {
      "action_expected_utilities": {
        "accelerate": -20,
        "hold": 55
      },

Truncated for display — the full payload is 76 lines.

How it works

Causal inference & experiment design — Separate what a change caused from what merely moved alongside it.

  1. 1 Require two or more prespecified causal models with every candidate action, identical outcome states, valid interventional probabilities, a model-specific identification/evidence gate, a nominal posterior weight, and feasible lower/upper model-weight bounds.
  2. 2 Translate each model's interventional outcome distribution into action expected utility using one complete owner-governed utility table; never substitute observational prediction probabilities for do-intervention semantics.
  3. 3 Solve bounded-simplex linear extrema exactly by allocating remaining model mass adversarially: obtain robust lower/upper utility for each action and maximum regret against every competing action across the entire credal set.
  4. 4 Select on full-precision minimax regret with robust-lower and nominal tie breaks, then apply evidence, critical-utility, and acceptable-regret gates; report adversarial weights, model-optimal actions, disagreement, and nominal value of perfect model information.

Before you trust it

Every tool in the catalog ships with the conditions under which its answer is meaningful — and the conditions under which it should abstain instead of guessing.

Assumptions & guardrails

  • Assignment or adoption timing, interference policy, overlap, attrition, and outcome availability match the estimand encoded by the method.
  • Each supplied model has a defensible causal graph/estimand and identified interventional probabilities for every candidate action in the target population; shared omissions remain possible.
  • Nominal and bounded model weights are frozen from model evidence and sensitivity analysis, form a feasible simplex, and were not chosen to force the preferred action.
  • Actions, mutually exclusive/exhaustive outcomes, utilities, constraints, and critical thresholds represent the accountable aggregate decision with material harms included.
  • A causal label is warranted only when design and diagnostic requirements pass; otherwise treat the result as descriptive or abstain.
  • Robustness spans only the supplied causal models and credal bounds; agreement among models sharing the same omitted mechanism can create false confidence.
  • The solver consumes identified interventional distributions but does not discover a DAG, identify effects, or transform observational association into causality.
  • A robust aggregate policy remains subject to accountable approval and cannot authorize automated person-level employment, fraud, compensation, or security action.

Minimum evidence

  • actions: at least 2 rows/items
  • outcome_utilities: required and organization-defined
  • causal_models: at least 2 rows/items
  • maximum_acceptable_regret: required and organization-defined
  • critical_minimum_utility: required and organization-defined

How to validate it

Preserve the assignment/adoption design and validate overlap, pre-period or placebo diagnostics, attrition, interference policy, and cluster-level uncertainty; never tune on the estimated effect.

Calibrating it to your org

Same for everyone

The mathematical kernel, validation rules, method version, and JSON output semantics are organization-independent; no tenant-trained coefficients or company benchmark is embedded in the function.

Specific to you

  • one comparable do-intervention outcome distribution for every model-action pair
  • model-specific identification/evidence gates plus nominal posterior and sensitivity-derived lower/upper model weights
  • causal model set and DAG versions, target population, intervention semantics, actions, exhaustive outcomes, utilities, model-weight credal set, critical utility, regret tolerance, and approval boundary

Calibration workflow

  1. 1 Define the management decision, target outcome, aggregate unit, privacy boundary, cadence, and prediction/intervention horizon for this organization.
  2. 2 Build a tenant-scoped historical cohort using only information available before each prediction or decision; preserve zero periods, censoring, assignment probabilities, and unresolved outcomes when the method requires them.
  3. 3 Estimate statistical parameters on training history, but obtain costs, utilities, risk tolerance, practical-effect thresholds, capacity, and policy constraints from accountable decision owners.
  4. 4 Validate on later time windows or held-out aggregate units at the deployment grain, against a simple baseline and the function-specific validation strategy.
  5. 5 Deploy only if the returned decision clears evidence, overlap, calibration, robustness, and guardrail checks; warning, unsupported, schema-gap, and fallback decisions are abstentions.
  6. 6 Monitor realized outcomes, data drift, coverage, and decision regret; recalibrate at a governed cadence or after a detected regime/definition change, never merely because a stakeholder dislikes the result.

Call it from your AI

You don't wire up 388 tools in your MCP client. The GitRevio MCP server exposes 18 tools, three of which let an agent search the catalog, read a tool's schema, and run it — so the assistant finds this one on its own.

gitrevio_capabilities_search
  { "q": "choose an aggregate policy across competing" }
  → finds "solve_robust_policy_across_causal_models"

gitrevio_capability_describe
  { "capability_id": "solve_robust_policy_across_causal_models" }
  → returns the input schema and agent guidance shown on this page

gitrevio_capability_run
  { "capability_id": "solve_robust_policy_across_causal_models", "arguments": { ... } }
  → returns the result shown above

Works in Claude Desktop, Claude Code, Cursor, Cline, Continue.dev, Goose and Aider. See the MCP server.

Related tools

Audit KPI threshold bunching

Detect a post-target excess concentration immediately above a governed KPI threshold: compare within-unit pre/post local mass and above-versus-below mirror asymmetry, bootstrap whole units, report density bins and a smoothed log-density jump, and explicitly refuse to equate bunching with individual gaming or intent.

Statistical audit & measurement

Forecast correlated milestone slippage

Forecast joint portfolio milestone slippage from complete historical episode-by-category planned/actual duration ratios: fit log-error marginals and a positive-definite shrinkage Gaussian copula, mix shared and idiosyncratic shocks, propagate durations through the current dependency DAG, and report joint confidence, finish distributions, and tail value at risk.

Forecasting & survival

Audit commercial technical commitment integrity

Audit signed commercial promises against explicitly allocated technical scope, dependency order, funded capacity, acceptance criteria and evidence; expose orphan scope, double allocation, cycles, late plans and maximum contractual penalty without interpreting legal rights from engineering activity.

Constrained optimization

Audit decision execution fidelity

Audit whether approved decisions actually became verified implementation at the promised aggregate-unit and component grain, with whole-unit bootstrap uncertainty and simultaneous gates for fidelity, overdue scope, unverifiable evidence, exceptions and critical gaps.

Statistical audit & measurement

Audit release risk prediction integrity

Audit a complete eligible-change release-risk cohort for point-in-time prediction lineage, exact change-to-deployment linkage, mature mutually exclusive outcomes, selective labels, score-triggered intervention contamination, calibration and false alarms before the score influences a release decision.

Forecasting & survival

Audit sunk cost escalation

Audit whether cumulative sunk cost predicts aggregate project continuation after project fixed effects, checkpoint time, forward value, success probability, remaining cost, and future irreversibility, with project-cluster bootstrap uncertainty.

Statistical audit & measurement

See every tool in Delivery forecasting & commitments →

Ready to See Your Engineering work clearly?

Request a free demo