One instrument, three engines, an auditable file spine.
You describe an idea (optionally with data). A simulated population responds, then is calibrated against reality. The platform returns a direction, a ranking, and hypotheses to test — never invented percentages. Every number carries an evidence rung: SIM-RANK · REAL · CALIBRATED.
Scenario design, live narrator, advisor, and the second oracle in the ensemble.
Simulates a population's propensity to respond — a distribution, not an average.
sklearn / lightgbm: F1 / AUC and the sim→real calibration.
The whole system, top to bottom
Eight stages, from raw file to evidence
Reference data anchors S4 (frame) and S6 (calibration). Artifacts are the contract — modules read them defensively, so a shape change is an honest "—", never a crash.
The rung is always explicit
Every returned run ships this label. The flywheel — real A/B outcomes fed back by users, and in time by agents — is what climbs the ladder for the next run.
A typed epistemic output — a bare number can't exist
{
"rank": 1, "variant": "…", "tier": "strong", "value": null,
"evidence": {
"rung": "SIM-RANK", "calibration": "NONE", "scope": "directional",
"ranking_stability": { "n": 277, "N": 300, "confidence": "HIGH" },
"scenario_robustness": "N/A", "backtest_rho": 1.0
},
"claim_allowed": ["ranking", "direction", "hypotheses"],
"claim_forbidden": ["absolute_percentage", "guarantee"]
}
Untrusted caller, safe by construction: once live, output is signed on manifest.hash; input text is data, not instructions; identity + budget per agent; only aggregate rankings leave the building, never individual personas. The external model receives aggregates only.
The rules the platform cannot break
A new case is a new JSON config — zero case-specific logic. The config is the platform abstraction: dataset, decision, conditions, personas, methodology.