Skip to main content

Wire contract

The wire between the SDK and the Roboticks platform is JUnit XML extended with roboticks.* properties. Nothing else is required — no custom upload protocol, no proprietary metadata. If your test runner emits JUnit, it can speak Roboticks.
This page is a tutorial. For the authoritative schema (XSD + JSON Schema), see the SDK wire contract reference.

What the SDK emits

For a single Python test (schema version 2):
Four observations:
  1. Schema version sits on the <testsuite>. Per-testcase properties carry the semantic payload; suite-level properties carry the metadata about the emitter.
  2. roboticks.confirms is comma-separated. Standard JUnit properties are stringly-typed; a single comma-list is more portable than nested elements.
  3. roboticks.nodeid (added in v2) is what the platform uses to lay out per-test-case S3 folders. The hash slug it derives — sha256(nodeid)[:16] — becomes the sub-directory under test-runs/{run_id}/test-cases/.
  4. roboticks.attach.{kind} (added in v2) is repeatable — one property per file registered with attach_artifact(). The runner uploader walks every roboticks.attach.* property and posts each file to the per-test-case S3 prefix.

The properties

The full XSD is shipped at schemas/junit_with_confirms.xsd in the SDK repo.

Per-test-case S3 layout (v2)

When the runner uploads artifacts, schema-2 metadata lets the platform fan files out into per-test-case sub-folders inside the run’s S3 prefix:
The 16-hex slug is computed deterministically on both the SDK and the platform from roboticks.nodeid; no round-trip is required. The workspace UI groups files under whichever test produced them, and rbtk test files --nodeid / rbtk test cases let you scope a download to a single test.

The test-result JSON

For systems that prefer JSON to XML (the platform’s internal store, the LLM triage prompt context, the matrix API), the platform converts JUnit-with-confirms into a JSON shape defined at schemas/test_result.schema.json:
The conversion is lossless. JSON is the canonical shape for everything after ingestion.

Schema versioning

Schema versions are integers. Every increment is a breaking change to either the XML or the JSON shape. The platform supports the current version and one back.

The handshake

When the platform parses an uploaded JUnit XML, the first thing it does is read roboticks_schema_version from the suite properties: The forward-compat behaviour matters: a newer SDK MAY upload a newer schema; the platform tolerates unknown roboticks.* properties rather than failing. You can upgrade the SDK ahead of a platform release without breaking your pipeline. Conversely, the platform never downgrades. A schema-1 platform will not produce schema-0 JSON.

What if I’m using a non-Roboticks test framework

If you emit stock JUnit (without roboticks_schema_version), the platform still ingests the file. You get:
  • Test pass/fail in the Check Run.
  • No requirement linking (the matrix shows the test under “Unlinked”).
  • No deadline, no tags, no MCAP correlation.
To get the full traceability story, you need some mechanism to attach @confirms to each test. Even a <property name="roboticks.confirms" value="REQ-001"/> written by hand into the JUnit XML works. The SDK is the convenient path, not the only path.

Next

SDK wire contract reference

Authoritative schema with XSD and JSON Schema files.

Pytest plugin internals

How the SDK actually writes those properties.

CI recipes

How to get the XML to the platform.

Matrix UI

Where the parsed confirms show up.