Use .auclimrisk.json for teaching, editing, submission and archiving. It is UTF-8, indented JSON: the whole model can be read in a text editor, versioned in Git and uploaded with Open Model. Save Model writes the same format. No account, server-side file or binary component is needed to reopen it.
App version 0.3.0 retains schema 1.1.0. App and schema versions are separate: the import improvements require no new native model semantics. Files using schema 1.0.0 migrate to 1.1.0, adding the default chance role. Other schema versions are rejected. model_schema.json defines the structure; the app also checks graph, probability, expression and evidence semantics. The upload limit is 10 MiB.
| Field | Meaning |
|---|---|
| `application` | Must be `"AUClimRisk"` |
| `schema_version` | `"1.1.0"` for new files |
| `model` | Model ID, name, metadata, nodes and directed edges |
| `scenarios` | Named cases, each with evidence and interventions |
| `inference` | Engine, sample count, random seed, exact-state limit |
| `ui` | Active scenario, selection and target |
| `extensions` | Additional provenance and teaching notes |
Model IDs and node IDs use letters, digits and underscores, and cannot start with a digit. State values are typed: true is a Boolean, "True" is text, and 1 is a number. Preserve types when editing. Node labels are for display; expressions use IDs. Every expression reference must also have a corresponding parent edge.
Each CPT row names the states of all its parents. The probability array follows the node's states array. Thus a parent reordering cannot silently reinterpret a native table. Probabilities are fractions from zero to one, and each row must sum to one.
{
"type": "cpt",
"rows": [
{"when": {"flood": true, "emergency": "Low"},
"probabilities": [0.8, 0.15, 0.05]}
]
}This fragment is one row for states None, 1 to 5, Greater than 5; a complete table must include every parent combination. Distributions use named parameters, for example {"type":"distribution","name":"normal","params":{"mean":0.4,"sd":0.2}}. AUClimRisk uses standard deviation, not variance, for Normal distributions. Deterministic definitions use {"type":"deterministic","expression":"rainfall * runoff"}. Expressions are parsed through an allowlist, never executed as arbitrary R code.
A scenario can contain "evidence":{"flood":{"kind":"hard","value":true}} or "interventions":{"wsud":true}. Evidence updates beliefs; an intervention replaces a causal mechanism. They are deliberately different fields. A node cannot have both in the same scenario. Soft categorical evidence supplies one nonnegative likelihood for every state. Numeric evidence may be a point, interval or Normal measurement. Unobserved nodes are omitted.
The file stores model inputs, scenarios, notes, layout and inference settings. Calculated samples, plots and open analysis panels are not saved as model state; rerun Calculate after opening. Results and reports have separate export buttons. For a structural counterfactual, save the factual and action scenarios and record which pair to select; ordinary scenario calculation is not counterfactual replay.
Open Model detects Agena's JSON structure (model.networks) by content, including files with .cmpx extension. This is a one-way conversion to the native format. AUClimRisk does not write Agena .cmpx, and renaming native JSON does not make it an Agena file.
Supported: one network, manual categorical tables, manual ranked categories, discrete real states, simulated numeric nodes, hard observations, categorical likelihood observations, and the following source functions: Arithmetic, Comparative, Normal, TNormal, LogNormal, ExtremeValue with order zero, Uniform, Beta, Triangular, Poisson and Binomial. Partitioned expressions must all be deterministic or use the same supported distribution family. Expressions may use the app's allowed arithmetic functions and node IDs.
Normal/TNormal variance is converted to its square root; LogNormal log-variance is similarly converted to log-scale SD. ExtremeValue order zero is Gumbel maxima. Unsupported parameter conventions are refused. Agena Boolean labels remain labelled categorical values so labels such as Poor/Good and No/Yes survive intact. Imported tables use source state order and last-parent-fastest column order, then become explicit named-condition rows. Float rounding of at most 1e-6 in row sums is normalised; larger errors stop import.
Unsupported features stop the whole import with a node-specific error: multiple linked networks, static interval nodes, ranked distribution expressions, mixed stochastic/deterministic partitions, unsupported functions, and ambiguous evidence. Compiled dynamic-discretisation tables and cached results are never mistaken for source CPTs. Agena canvas/risk-table presentation and solver settings are not transferred; layout is regenerated and inference is recomputed. Conversion notes are retained in extensions.agena_import and shown when the file opens. Results can differ from Agena's dynamic-discretisation results.
Legacy binary .ast and .cmp, extracted XML, and HTML viewers are not upload formats. A readable summary that omits CPTs is also not a runnable model and is rejected. The supplied 01_flood_base.auclimrisk.json is a complete reconstruction of the particular original AST, with source provenance, not a general AST importer.
1. Give students the base `.auclimrisk.json`, rainfall data and handout.
2. Open Model, select the base file, calculate, and inspect its CPTs.
3. Modify and save regularly. Use named scenarios to separate questions.
4. Submit the saved native JSON together with the report and calculation settings.
5. Reopen the saved file to verify it reproduces the model before submission.
The original .ast tables were recovered by reading its gzip-compressed serialised data without executing Java. Recovery details, original table ordering and source hash are included in the assignment provenance record. The app needs only the resulting native JSON, not the archive or the recovery parser.