Documentation Index
Fetch the complete documentation index at: https://docs.roboticks.io/llms.txt
Use this file to discover all available pages before exploring further.
Wire contract reference
The wire between the Roboticks SDK and the Roboticks platform is JUnit XML extended withroboticks.* properties, converted server-side to a canonical JSON document. This page is the authoritative reference. For the tutorial introduction, see Testing → Wire contract.
Schema version
The wire contract is versioned as a single integer. Currently2.
Version policy
| Increment | Cause |
|---|---|
Major (1 → 2) | Any change that a schema-1 reader cannot parse. New required properties; renamed properties; changed value types. |
| Add property (no bump) | New optional roboticks.* property. Older readers ignore unknown keys. |
| Remove property (no bump for one release) | Property is deprecated but still emitted; readers tolerant. Next major removes the emission. |
v2 changes vs v1
- Added (required when emitted):
roboticks.nodeidon every<testcase>— the pytest nodeid, used by the platform to deterministically route per-test-case artifacts into the S3 prefixtest-runs/{run_id}/test-cases/{sha256(nodeid)[:16]}/. - Added (optional, repeatable):
roboticks.attach.{kind}— one property per file registered viaroboticks.attach_artifact(). The property name carries the kind (mcap,logs,attachments, or any custom single-segment label) and the value is the local file path; the runner uploader walks these and posts each file to the per-test-case prefix. - Behavior: schema-1 uploads still parse — the platform falls back to a run-level prefix when
roboticks.nodeidis absent. Schema-2 readers tolerate the absence ofroboticks.attach.*(it just means the test did not callattach_artifact).
Suite-level properties
| Property | Value | Required | Since |
|---|---|---|---|
roboticks_schema_version | integer | yes | 1 |
roboticks.sdk.version | semver string | yes | 1 |
roboticks.sdk.language | "python" or "cpp" | yes | 1 |
roboticks.python.version | semver string | conditional (Python only) | 1 |
roboticks.cpp.version | semver string | conditional (C++ only) | 1 |
Test-case properties
| Property | Value format | Required | Since | Decorator / source |
|---|---|---|---|---|
roboticks.nodeid | pytest nodeid string (pkg/test_x.py::TestCls::test_y[param]) | yes (schema ≥ 2) | 2 | plugin (stamped on every <testcase>) |
roboticks.confirms | comma list of requirement IDs | conditional | 1 | @confirms |
roboticks.tags | comma list of strings | optional | 1 | @tags |
roboticks.deadline_ms | integer | optional | 1 | @deadline |
roboticks.requires_sim | engine or engine:gpu | optional | 1 | @requires_sim |
roboticks.fault_injection | JSON array | optional | 1 | (inferred from fault_injection usage) |
roboticks.mcap.path | string (relative path) | optional | 1 | (set by mcap_capture) |
roboticks.mcap.uploaded | "true" or "false" | optional | 1 | (set by runner after upload) |
roboticks.coverage.lines.covered | integer | optional | 1 | (set by coverage post-processor) |
roboticks.coverage.lines.total | integer | optional | 1 | (set by coverage post-processor) |
roboticks.attach.{kind} | string (local file path) | optional, repeatable | 2 | attach_artifact(path, kind=...) |
roboticks.attach.{kind} — per-test artifact attachments
Schema 2 adds a property family for files a test registers via attach_artifact(). The property name carries the kind, the value carries the local path:
| Kind | Conventional use |
|---|---|
mcap | MCAP bag files |
logs | Plain-text or JSONL log dumps |
attachments | Screenshots, generated reports, anything else |
| (custom) | Any single URL-safe path segment, e.g. traces, coredumps |
<testcase> for every property whose name starts with roboticks.attach. and posts the file to the platform’s /test-runs/{run_id}/mcap-upload-urls endpoint with {nodeid, kind} in the body. The backend lands it at:
JUnit XSD excerpt
schemas/junit_with_confirms.xsd in the SDK repo. Validate locally:
Canonical test-result JSON
The platform converts JUnit-with-confirms into this JSON shape:nodeid_slug is sha256(nodeid).hexdigest()[:16] — derived deterministically on both the SDK and the platform so the per-test-case S3 prefix is stable across re-runs without round-tripping the slug through the wire.
JSON Schema (excerpt):
schemas/test_result.schema.json.
Forward / backward compatibility
| Scenario | Platform behaviour |
|---|---|
Upload has no roboticks_schema_version | Treat as stock JUnit. No requirement linking. Tests still show pass/fail. |
Upload has roboticks_schema_version = 1, platform supports 2 | Parse via the v1 legacy adapter. Per-test-case artifacts land under the run-level test-runs/{run_id}/mcaps/ prefix (no nodeid → no per-case sub-folder). |
Upload has roboticks_schema_version = 2, platform supports 2 | Parse normally. Per-test-case artifacts land under test-runs/{run_id}/test-cases/{slug}/. |
Upload has roboticks_schema_version = 3, platform supports 2 | Warn on the Check Run; drop unknown properties; parse the v2 subset. |
Upload has roboticks_schema_version = 0 | Reject with a clear error pointing at the SDK upgrade path. |
Disagreement handshake
When the SDK and the platform disagree on schema version, the platform writes aroboticks.platform.warnings element into the run’s metadata:
What the SDK guarantees
- A given SDK release pins to exactly one schema version.
- Within a major SDK series (e.g. all
0.x.y), the schema version doesn’t decrease. - The XSD and JSON Schema files in the SDK repo at a tag are the authoritative artefacts for that release.
What the platform guarantees
- Backwards-compat for at least the current and one-back schema versions.
- Forward-tolerance: unknown
roboticks.*properties are dropped, not rejected. - The conversion from XML to canonical JSON is documented and stable per schema version.
Tools
Next
Wire contract tutorial
The version-handshake story in narrative form.
Pytest plugin
Reference for the writer.
C++ reference
Reference for the C++ writer.
Schemas in the SDK repo
Source of truth.