---
title: "Model Test Battery"
method: POST
path: "/v1/tools/run_model_test_battery"
tags: ["TODO_TAGS_REVIEW", "TODO_AP2_EXPORT_REVIEW"]
---

# Model Test Battery

`POST /v1/tools/run_model_test_battery`

## Request

- Base URL: `https://ainumbers.co`
- URL: `https://ainumbers.co/v1/tools/run_model_test_battery`
- Auth: none declared

Runs the deterministic-given-data quantitative model validation battery: discriminatory power (Gini coefficient, Kolmogorov-Smirnov statistic) from scored outcomes, population and characteristic stability (PSI, CSI) between two declared snapshots using the caller's own bins, back-test outcome-vs-predicted per declared bin, and a calibration comparison (predicted vs actual rate, max absolute diff). Every test is graded against a POLICY-SUPPLIED threshold object -- this node never chooses or hardcodes a threshold. If a threshold is missing for a requested test, that test is reported skipped_no_threshold, never silently defaulted; if the underlying data is missing or insufficient (e.g. a single-class scored set for Gini/KS), the test is reported skipped_insufficient_data. Each result carries the test's standard name, its metric value, its threshold, and pass/breach so the artifact reads as a workpaper section, not an opinion. Model inputs and specifications are expected to arrive as a workbook export via the shipped WB-BRIDGE-1 workbook-to-OCG artifact bridge (tool 554); this node itself accepts plain JSON so any upstream source can feed it. Pairs with art-488 model-replication-diff (recompute-and-diff) as the two deterministic legs of a model validation cycle -- neither node emits a soundness or fitness-for-use opinion. Inline deterministic transcendental math (no engine Math.exp/log) so the same input always produces the same execution_hash on every surface. NaN-safe. Zero network, zero PII.

**Tool URL:** https://ainumbers.co/chaingraph/art-489-model-test-battery.html

## Request body

- object
  - `as_of_date` unknown, required
  - `backtest` unknown, required
  - `discrimination` unknown, required
  - `stability` unknown, required
  - `threshold_version` unknown, required
  - `thresholds` unknown, required

## Response `200`

Successful tool execution result

- object
  - `as_of_date` string
  - `back_test` object
    - `per_bin` object[]
      - `abs_diff` number
      - `actual_rate` number
      - `bin` string
      - `n` integer
      - `predicted_rate` number
  - `tests` object[]
    - `comparison` string
    - `detail` object
      - `auc` integer
      - `n_negative` integer
      - `n_positive` integer
      - `n_scored` integer
    - `metric_value` integer
    - `name` string
    - `result` string
    - `standard_name` string
    - `threshold` number
    - `threshold_field` string
  - `tests_breached` integer
  - `tests_passed` integer
  - `tests_run` integer
  - `tests_skipped_insufficient_data` integer
  - `tests_skipped_no_threshold` integer
  - `threshold_version` string
  - `thresholds_applied` object
    - `calibration_max_diff` number
    - `csi_max` number
    - `gini_min` number
    - `ks_min` number
    - `psi_max` number

---

[API](https://skmtc.dev/ainumbers/apis/ainumbers-co-fintech-intelligence-suite.md) · [All operations](https://skmtc.dev/ainumbers/apis/ainumbers-co-fintech-intelligence-suite/llms.txt) · [OpenAPI document](https://skmtc.dev/ainumbers/apis/ainumbers-co-fintech-intelligence-suite/revisions/b462e4f5bb28?raw)
