{
  "acceptance_version": "0.1",
  "object_path": "examples/bodo-endosymbionts",
  "manifest": "agent/tools.json",
  "published_results_path": "results.json",
  "notes": "Every parameterised tool carries one call that reproduces a published value (cross-linked to its recipe_id) and one call off the published reference, so the parameters are shown to be real rather than decorative.",
  "calls": [
    {
      "call_id": "shared-modules-published",
      "tool": "shared_modules",
      "args": {},
      "select": "/n_shared_modules",
      "expect": {"kind": "published_pointer", "result_path": "/n_shared_modules"},
      "recipe_id": "bodo-shared-modules",
      "rel_tolerance": 1e-6,
      "abs_tolerance": 1e-9,
      "enabled": true,
      "notes": "Takes no parameters, so the published call is the whole contract."
    },
    {
      "call_id": "classify-67-published",
      "tool": "classify_modules",
      "args": {"threshold": 67},
      "select": "/counts",
      "expect": {"kind": "published_pointer", "result_path": "/T2_categories_by_threshold/67"},
      "recipe_id": "bodo-t2-threshold-67",
      "rel_tolerance": 1e-6,
      "abs_tolerance": 1e-9,
      "enabled": true
    },
    {
      "call_id": "classify-50-published",
      "tool": "classify_modules",
      "args": {"threshold": 50},
      "select": "/counts",
      "expect": {"kind": "published_pointer", "result_path": "/T2_categories_by_threshold/50"},
      "recipe_id": "bodo-t2-threshold-50",
      "rel_tolerance": 1e-6,
      "abs_tolerance": 1e-9,
      "enabled": true
    },
    {
      "call_id": "classify-80-published",
      "tool": "classify_modules",
      "args": {"threshold": 80},
      "select": "/counts",
      "expect": {"kind": "published_pointer", "result_path": "/T2_categories_by_threshold/80"},
      "recipe_id": "bodo-t2-threshold-80",
      "rel_tolerance": 1e-6,
      "abs_tolerance": 1e-9,
      "enabled": true
    },
    {
      "call_id": "classify-90-off-reference",
      "tool": "classify_modules",
      "args": {"threshold": 90},
      "select": "/counts",
      "expect": {
        "kind": "literal",
        "value": {"both": 3, "host_only": 9, "symbiont_only": 6, "neither": 88}
      },
      "rel_tolerance": 1e-6,
      "abs_tolerance": 1e-9,
      "enabled": true,
      "notes": "A threshold the published run never reports. The host-only excess survives at 90 percent."
    },
    {
      "call_id": "wilcoxon-published",
      "tool": "paired_completeness_test",
      "args": {},
      "expect": {"kind": "published_pointer", "result_path": "/T1_wilcoxon"},
      "recipe_id": "bodo-t1-wilcoxon",
      "rel_tolerance": 1e-6,
      "abs_tolerance": 1e-9,
      "enabled": true
    },
    {
      "call_id": "wilcoxon-greater-off-reference",
      "tool": "paired_completeness_test",
      "args": {"alternative": "greater"},
      "expect": {
        "kind": "literal",
        "value": {
          "statistic": 1854.0,
          "p_value": 0.05911216680997061,
          "median_host_minus_symbiont": 0.0,
          "host_gt_symbiont": 44,
          "symbiont_gt_host": 34,
          "ties": 28
        }
      },
      "rel_tolerance": 1e-6,
      "abs_tolerance": 1e-9,
      "enabled": true,
      "notes": "The one-sided form does not clear 0.05 either, which is the sensitivity check claim 1 rests on."
    },
    {
      "call_id": "equivalence-10pp-published",
      "tool": "equivalence_test",
      "args": {"margin_pp": 10.0},
      "expect": {"kind": "published_pointer", "result_path": "/T1_equivalence"},
      "recipe_id": "bodo-t1-equivalence",
      "rel_tolerance": 1e-6,
      "abs_tolerance": 1e-9,
      "enabled": true
    },
    {
      "call_id": "equivalence-5pp-off-reference",
      "tool": "equivalence_test",
      "args": {"margin_pp": 5.0},
      "expect": {
        "kind": "literal",
        "value": {
          "margin_pp": 5.0,
          "mean_diff_pp": 6.14,
          "diff_ci95_pp": [-0.82, 13.09],
          "p_tost": 0.6252,
          "equivalent_within_margin": false
        }
      },
      "rel_tolerance": 1e-6,
      "abs_tolerance": 1e-9,
      "enabled": true,
      "notes": "Tightening the margin to 5 points fails equivalence decisively; the 10-point bound in claim 4 is not arbitrary slack."
    },
    {
      "call_id": "mcnemar-67-published",
      "tool": "mcnemar_asymmetry",
      "args": {"threshold": 67},
      "expect": {"kind": "published_pointer", "result_path": "/T2_mcnemar_at_67"},
      "recipe_id": "bodo-t2-mcnemar",
      "rel_tolerance": 1e-6,
      "abs_tolerance": 1e-9,
      "enabled": true
    },
    {
      "call_id": "mcnemar-80-off-reference",
      "tool": "mcnemar_asymmetry",
      "args": {"threshold": 80},
      "expect": {
        "kind": "literal",
        "value": {
          "host_only": 11,
          "symbiont_only": 9,
          "host_only_to_symbiont_only_ratio": 1.22,
          "p_value": 0.8238029479980469
        }
      },
      "rel_tolerance": 1e-6,
      "abs_tolerance": 1e-9,
      "enabled": true,
      "notes": "The asymmetry weakens at 80 percent, consistent with the directional-but-not-significant reading in claim 2."
    },
    {
      "call_id": "per-cell-published",
      "tool": "per_cell_consistency",
      "args": {"threshold": 67},
      "expect": {"kind": "published_pointer", "result_path": "/T3_consistency"},
      "recipe_id": "bodo-t3-consistency",
      "rel_tolerance": 1e-6,
      "abs_tolerance": 1e-9,
      "enabled": true
    },
    {
      "call_id": "per-cell-leave-one-out-off-reference",
      "tool": "per_cell_consistency",
      "args": {"threshold": 67, "cells": ["F10", "B7", "A8", "A10", "B2", "G10"]},
      "select": "/host_only_frac_mean",
      "expect": {"kind": "literal", "value": 0.1541},
      "rel_tolerance": 1e-6,
      "abs_tolerance": 1e-9,
      "enabled": true,
      "notes": "Dropping H10 moves the host-only mean by 0.2 points, so claim 3 does not hang on one cell."
    }
  ]
}
