Skip to content

Study-owned programs

The toy study is an executable example. To connect a different computational study, supply brief.json, protocol.json and the programs declared by that protocol. Use examples/toy-study/ as a small reference, keeping your scientific logic outside the Allagma bundle.

protocol.json contains a revision, hypothesis, uncertainty method, finite runs list, max_failures_per_run, program paths and code list. Each run has a unique safe ID, a split (pilot, confirmation, discovery) and JSON input with an explicit integer seed. The declared code list includes every local program, import, source document and configuration file needed by the study. At campaign creation those files are copied under materials/ and hashed.

Set explicit ceilings before executing a campaign. For example, an override file can contain {"budget":{"max_attempts":28,"max_seconds":60, "money_usd":0,"per_attempt_seconds":5}}. Adopt the settings through the update commands before starting the campaign. An unset attempt, time or monetary ceiling blocks execution; an existing campaign keeps its original budget.

Program Command arguments after the Python script Output
Runner INPUT_JSON RAW_JSON Exact raw observations in the supplied new file
Evaluator INPUT_JSON RAW_JSON EVALUATION_JSON JSON with valid: true only when the declared scientific checks pass
Analyzer STUDY_ROOT RAW_MANIFEST_JSON OUTPUT_DIRECTORY Deterministic, recomputable JSON/CSV analysis files
Writer STUDY_ROOT ANALYSIS_RECORD_JSON OUTPUT_DIRECTORY claims.json containing ClaimRecords, and manuscript.md

The helper invokes argument arrays without a shell. Runner/evaluator stdout and stderr are retained, as are commands and worker receipts. The evaluator is separate from the runner. The toy evaluator checks seeded data, arithmetic and known-answer controls; another study must supply its own appropriate checks.

The toy runner recognizes deliberate fault inputs for the conformance walkthrough. failure raises before producing observations. interrupt writes an interrupt-ready checkpoint and waits; the adapter then terminates it. These are execution fault fixtures, not scientific measurements. Normal retries use the original frozen inputs with a new attempt ID.

Analysis defaults to a complete run plan. --allow-partial permits an explicitly limited package when at least two eligible confirmation observations exist. The analysis and manuscript must identify this limitation. A budget stop with too little evidence still writes a partial execution report. Never invent a statistical result to fill an incomplete package.

A changed protocol in an existing study needs a new revision and an amendment object. For example:

{
"from_campaign": "pilot-1",
"reason": "Add the sensitivity analysis motivated by pilot variance",
"affected_runs": ["pilot-zero"]
}

The named parent campaign must exist; affected IDs identify its declared runs (an explicit empty list means no earlier run is affected). Campaign creation retains an amendment.json receipt linking the exact earlier protocol. An unchanged protocol can be repeated without an amendment. Earlier campaigns and their results are preserved. Study-owned analysis and writing must still match the amended scientific question and protocol.

Use a new --analysis-id for a changed analysis. The same identifier cannot overwrite an earlier record. Review histories similarly retain each verdict and its exact material revision. External reviewer adapters can implement the same handoff later; a same-model-family fresh-context review is provisional.


Canonical source · Generated from the maintained repository document at this build’s commit.