Virtual-SCADA Bundle
Every SCADA simulate job that passes the Validation Gate is sealed and delivered as a multi-artifact bundle. Every artifact below comes out of a real run against the running platform — none of these rows are mock or template output.
Bundle artifacts
| Artifact | Format | Content |
|---|---|---|
| scada_telemetry | JSON array | Per-tick sensor readings with true_value, measured_value, reported_value, labels (regime + anomaly), asset_type, asset_id, signal_name. |
| commands | JSON array | Control surface writes — see the commands stream reference for the write_source schema and baseline cadences. |
| alarms | JSON array | Alarm events with signal, severity, threshold, and clear-condition metadata. |
| protocol_modbus / protocol_opcua / protocol_bacnet / protocol_mqtt / protocol_dnp3 / protocol_iec61850 | NDJSON | Per-protocol frame traces with address, payload, sensor, and timestamp. Only the protocols the customer requested (or the plant default) are emitted. See Protocol Reference. |
| traffic_pcapng | IEEE pcapng | Wire-level capture with real TCP / IP / Ethernet framing. Loads directly in Wireshark, tshark, or any PCAP-aware IDS training pipeline. |
| contract_k | JSON | Sealed sealed contract — the binding structural definition of this run (assets, signals, protocols, scenario pack, seed, engine version). |
Download patterns
All artifacts are addressable through the SDK once the job reaches status="succeeded":
from radmah_sdk import RadMah
sdk = RadMah(api_key="...", base_url="https://api.radmah.ai")
artifacts = sdk.list_artifacts(job_id)
for art in artifacts:
body = sdk.download_artifact(job_id, art.id)
# body is the raw bytes; decode as UTF-8 JSON / NDJSON
# except for protocol_* which are UTF-8 NDJSON and traffic_pcapng
# which is binary pcapng.
save_to_disk(art.name, body)UI rendering
The client-area job detail page renders the bundle inline: artifact list with row counts, download links, a telemetry sample preview, and the sealed evidence signature. Customers see the same bundle through the UI that the SDK retrieves programmatically — there is no "lite" UI view.