This release is a pre-release and may not be stable for production use.
awp-conformance
The conformance suite for the Agent World Protocol. It tests a world at a WebSocket URL, or an agent launched against the suite's own harness world, against the requirement matrix of one specification revision, and reports a verdict per requirement ID.
It targets specification revision 0.1-draft.8, pinned as the spec/ submodule. The suite shares no code with any implementation: it speaks the protocol from the bundled canonical schemas, lifecycle table, and matrix.
pip install --pre awp-conformance
awp-conformance world ws://127.0.0.1:8710 --fixture my-world.json --out report/
awp-conformance agent --manifest manifest.json --frames frames.json -- python my_agent.py --url {url}
Testing a world
The suite connects as one or more agents and checks everything the world sends: schemas in receiver and sender form, status_seq sequencing and replay, every action transition against the lifecycle table, frame sequencing per channel, closing, and integer bounds. Then it runs active tests named after the requirements they cover — idempotency, preemption, deadlines, the watchdog, resumption from a partial acknowledgement, half-open connections, resets, isolation between sessions, and more. awp-conformance tests lists them.
A manifest declares action types but not which parameter values make an action run long enough to interrupt, so a world supplies a fixture:
{
"embodiment": "arm_01",
"subscribe": ["proprio", "arm_state"],
"moves": [
{ "type": "move_to_pose", "params": { "pose": { "frame": "base", "p_m": [0.4, 0.4, 0.6], "q": [0, 0, 0, 1] } } },
{ "type": "move_to_pose", "params": { "pose": { "frame": "base", "p_m": [-0.4, 0.3, 0.2], "q": [0, 0, 0, 1] } } },
{ "type": "move_to_pose", "params": { "pose": { "frame": "base", "p_m": [0.0, -0.45, 0.5], "q": [0, 0, 0, 1] } } }
],
"extended_min_ms": 1500,
"invalid": { "type": "move_to_pose", "params": { "pose": { "frame": "base" } } },
"outside_envelope": { "type": "move_to_pose", "params": { "pose": { "frame": "base", "p_m": [0.9, 0, 0.4], "q": [0, 0, 0, 1] } } },
"operator": { "estop_engage": "kill -USR1 $WORLD_PID", "estop_release": "kill -USR2 $WORLD_PID" },
"audit_dir": "./awp-audit"
}
| Key | Meaning |
|---|---|
moves |
Three or more extended actions in one concurrency group, at targets not on one line, each lasting at least extended_min_ms (streaming) or extended_min_ticks advances (lockstep). The suite always picks a target the embodiment is not near |
long_params |
Params merged into a move so that it outlasts its type's max_duration_ms, for AWP-ACT-008 when the moves end sooner |
invalid |
Params that fail the type's schema (generated from the schema when absent) |
outside_envelope |
Params outside a declared envelope |
operator |
Shell commands that engage and release the e-stop |
audit_dir |
Where the world writes its audit log, if the suite can read it |
max_wait_s |
The longest single wait the suite does (default 45); --slow lifts it |
approver_token |
Bearer token of an approver connection, for worlds with requires_approval types |
approval_action |
The action to submit for approval (default: the first such type, with empty params) |
servo |
For command channels: { "action": {type, params}, "setpoint": {...}, "violation": {...} } |
Beyond Core, the suite tests what the world offers: the ws stream binding, task, approval, blend, transfer, seeding, snapshots and replay, and command channels. --profile sim adds the sim profile to the claim.
fixtures/awp-sim.json is the fixture for the reference world.
Testing an agent
awp-conformance agent serves the manifest you give it from a scripted harness world, launches the agent once per episode ({url} and {token} in the command, or $AWP_URL and $AWP_TOKEN), and checks what the agent sends. The episodes add the stimuli that make agent requirements observable: unknown fields on every message, reserved frame flag bits, a redelivered terminal status, an unknown world request, a dropped connection, a world that falls silent, an invalid manifest, a session with no action grants, and a refused submission.
--frames gives a sample payload per channel, so the agent sees observations it can parse.
The report
Every requirement gets one outcome: pass, fail, warn (a SHOULD not met), untested (in scope but not exercised), n/a (outside the tested time models, gates, or declared features), manual, or untestable. The report states the claim the outcomes support (AWP-CNF-005):
- AWP-conformant — no failed and no untested requirement in scope, for the claimed classes and the named draft revision; manual evidence is attached separately.
- self-assessed against 0.1-draft.N — nothing failed, but some requirement in scope was not exercised.
- not conformant — something failed.
--out DIR writes report.json and a wire trace per connection in the specification's trace format.
Development
git clone --recurse-submodules https://github.com/Hyperduality/awp-conformance
uv sync
uv run pytest # runs the suite against awp-sim, including deliberately broken worlds
uv run python scripts/sync_spec.py --check
To move to a new draft revision: check out its tag in spec/, run scripts/sync_spec.py, update SPEC_REVISION in src/awp_conformance/__init__.py, and fix what the tests report.
License
Apache-2.0. See LICENSE.
Release files for awp-conformance 0.1.0a2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| awp_conformance-0.1.0a2.tar.gz | 162.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| awp_conformance-0.1.0a2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 296.1 kB
Release files / awp_conformance-0.1.0a2.tar.gz
| Download URL | awp_conformance-0.1.0a2.tar.gz |
|---|---|
| Size | 162.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
70d46d1cfb1fdeafd6884279500d9c968797dd3ab43c8ecb8838d5336e4cce52
|
|
BLAKE2b-256 checksum How to use checksums |
002525ea5ba9dfc7c97f14baaa990a511ab98ef6617d55565d260b973868dd33
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / awp_conformance-0.1.0a2-py3-none-any.whl
| Download URL | awp_conformance-0.1.0a2-py3-none-any.whl |
|---|---|
| Size | 133.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
11c31a73c01549c49467c71d74024513c31483894a83f53f6ed7b502b472c5d3
|
|
BLAKE2b-256 checksum How to use checksums |
21832de59c3a4437a834b2ceeb221bb04738ebcc285f5ca50b6f0d0b62e1c2b6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency log