awp-python 0.1.0a1__tar.gz → 0.1.0a2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/CHANGELOG.md +8 -0
  2. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/PKG-INFO +7 -5
  3. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/README.md +6 -4
  4. awp_python-0.1.0a2/conformance/README.md +63 -0
  5. awp_python-0.1.0a2/conformance/core-world-lockstep.json +1655 -0
  6. awp_python-0.1.0a2/conformance/core-world-streaming.json +1657 -0
  7. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/pyproject.toml +1 -1
  8. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/__init__.py +1 -1
  9. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/arm.py +17 -3
  10. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/server.py +3 -0
  11. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/world.py +26 -0
  12. awp_python-0.1.0a2/tests/test_evidence.py +181 -0
  13. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/uv.lock +1 -1
  14. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/.gitignore +0 -0
  15. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/.gitmodules +0 -0
  16. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/.python-version +0 -0
  17. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/LICENSE +0 -0
  18. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/scripts/check_traces.py +0 -0
  19. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/scripts/sync_spec.py +0 -0
  20. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/lifecycle.json +0 -0
  21. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/action-cancel-result.schema.json +0 -0
  22. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/action-ref.schema.json +0 -0
  23. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/action-schema.schema.json +0 -0
  24. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/action-status.schema.json +0 -0
  25. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/action-submit-result.schema.json +0 -0
  26. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/action-submit.schema.json +0 -0
  27. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/agent-manifest.schema.json +0 -0
  28. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/approval-requested.schema.json +0 -0
  29. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/approval-respond.schema.json +0 -0
  30. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/common.schema.json +0 -0
  31. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/embodiment.schema.json +0 -0
  32. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/empty-result.schema.json +0 -0
  33. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/error.schema.json +0 -0
  34. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/frame-inline.schema.json +0 -0
  35. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/frame-tree.schema.json +0 -0
  36. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/obs-report.schema.json +0 -0
  37. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/observation-channel.schema.json +0 -0
  38. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/ping-result.schema.json +0 -0
  39. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/ping.schema.json +0 -0
  40. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/profiles/gui-actions.schema.json +0 -0
  41. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/reset-result.schema.json +0 -0
  42. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/reset.schema.json +0 -0
  43. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/restore.schema.json +0 -0
  44. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/safety-policy.schema.json +0 -0
  45. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/session-open.schema.json +0 -0
  46. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/session-ready.schema.json +0 -0
  47. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/session-resume.schema.json +0 -0
  48. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/session-state.schema.json +0 -0
  49. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/session-telemetry.schema.json +0 -0
  50. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/session-transfer-result.schema.json +0 -0
  51. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/session-transfer.schema.json +0 -0
  52. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/snapshot-result.schema.json +0 -0
  53. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/subscribe-result.schema.json +0 -0
  54. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/subscribe.schema.json +0 -0
  55. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/task-update.schema.json +0 -0
  56. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/tick-result.schema.json +0 -0
  57. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/tick.schema.json +0 -0
  58. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/unsubscribe.schema.json +0 -0
  59. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/world-event.schema.json +0 -0
  60. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/_spec/schemas/world-manifest.schema.json +0 -0
  61. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/aio.py +0 -0
  62. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/client.py +0 -0
  63. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/clock.py +0 -0
  64. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/errors.py +0 -0
  65. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/frames.py +0 -0
  66. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/jsonrpc.py +0 -0
  67. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/lifecycle.py +0 -0
  68. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/py.typed +0 -0
  69. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp/schema.py +0 -0
  70. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/__init__.py +0 -0
  71. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/__main__.py +0 -0
  72. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/audit.py +0 -0
  73. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/cli.py +0 -0
  74. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/config.py +0 -0
  75. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/demo.py +0 -0
  76. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/loopback.py +0 -0
  77. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/py.typed +0 -0
  78. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/recorder.py +0 -0
  79. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/replay.py +0 -0
  80. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/scenarios.py +0 -0
  81. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/src/awp_sim/session.py +0 -0
  82. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/tests/__init__.py +0 -0
  83. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/tests/conftest.py +0 -0
  84. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/tests/helpers.py +0 -0
  85. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/tests/test_audit.py +0 -0
  86. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/tests/test_cli.py +0 -0
  87. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/tests/test_client_traces.py +0 -0
  88. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/tests/test_e2e.py +0 -0
  89. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/tests/test_features.py +0 -0
  90. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/tests/test_frames.py +0 -0
  91. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/tests/test_regressions.py +0 -0
  92. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/tests/test_scenarios.py +0 -0
  93. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/tests/test_schema.py +0 -0
  94. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/tests/test_streams.py +0 -0
  95. {awp_python-0.1.0a1 → awp_python-0.1.0a2}/tests/test_world.py +0 -0
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.0a2
4
+
5
+ Targets specification revision `0.1-draft.8`.
6
+
7
+ - `awp_sim`: the world checks the arm against its envelope after every step; leaving it emits `envelope_violation` and fails the executing action with reason `envelope` (AWP-ENV-003). `World.disturb` and `Server.disturb` inject an external disturbance.
8
+ - `awp_sim`: a stop during servo motion ends at the envelope's boundary instead of past it.
9
+ - `conformance/`: reports for Core World in both time models and the evidence for their manual rows, with tests in `tests/test_evidence.py`.
10
+
3
11
  ## 0.1.0a1
4
12
 
5
13
  First release, targeting specification revision `0.1-draft.7`.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: awp-python
3
- Version: 0.1.0a1
3
+ Version: 0.1.0a2
4
4
  Summary: Agent World Protocol client protocol layer and reference world for Python.
5
5
  Project-URL: Specification, https://www.agentworldprotocol.com
6
6
  Project-URL: Source, https://github.com/Hyperduality/awp-python
@@ -26,11 +26,13 @@ Python implementation of the [Agent World Protocol](https://www.agentworldprotoc
26
26
  - **`awp`** — the client protocol layer. `ClientConnection` is the agent side of AWP as a sans-IO state machine; `awp.aio.AsyncClient` drives it over a WebSocket.
27
27
  - **`awp_sim`** — the reference world. A sans-IO world engine with a simulated arm, a WebSocket server, an audit log, and a scenario suite that records wire traces.
28
28
 
29
- It targets specification revision **`0.1-draft.7`**, pinned as the `spec/` submodule. This is an alpha: the API will change with the draft.
29
+ It targets specification revision **`0.1-draft.8`**, pinned as the `spec/` submodule. This is an alpha: the API will change with the draft.
30
30
 
31
31
  ## Status
32
32
 
33
- The world and client target **Core World** and **Core Agent** for both time models, and the world the **sim** profile in lockstep, *self-assessed against 0.1-draft.7*: [awp-conformance](https://github.com/Hyperduality/awp-conformance) reports no failure against any configuration and leaves a few requirements untested. Every recorded trace also passes the spec's own checker, which verifies schemas, the action lifecycle table, idempotency, replay, and frame sequencing.
33
+ ![AWP: Core World, AWP-conformant against 0.1-draft.8](https://img.shields.io/badge/AWP-Core_World%2C_conformant_0.1--draft.8-555)
34
+
35
+ The world is **Core World: AWP-conformant against 0.1-draft.8** in both time models: [awp-conformance](https://github.com/Hyperduality/awp-conformance) reports no failure and nothing untested, and [`conformance/`](conformance/README.md) holds the reports and the evidence for their manual rows. The **sim** profile in lockstep and the client as **Core Agent** in both time models are *self-assessed against 0.1-draft.8*: the suite reports no failure and leaves a few requirements untested. Every recorded trace also passes the spec's own checker, which verifies schemas, the action lifecycle table, idempotency, replay, and frame sequencing.
34
36
 
35
37
  | Implemented | Not implemented |
36
38
  |---|---|
@@ -38,7 +40,7 @@ The world and client target **Core World** and **Core Agent** for both time mode
38
40
  | Inline and `ws` stream bindings; binary frame codec (all spec vectors) | Other stream bindings (`webrtc`, `webtransport`, `shm`, `grpc`) |
39
41
  | Full action lifecycle; preemption (`replace`, `queue`, `reject`, `blend`); idempotency | Standing approvals, grant expiry |
40
42
  | Watchdog and safe state, heartbeats, resumption with replay and acknowledgement | Multi-bind and shared control (one embodiment) |
41
- | Spatial, velocity, and rate envelopes (`command_check`) | Robotics profile (a simulated arm proves nothing physical) |
43
+ | Spatial, velocity, and rate envelopes (`command_check`), monitored during execution | Robotics profile (a simulated arm proves nothing physical) |
42
44
  | Audit log with redaction and hash chain; e-stop; `world.reset` | |
43
45
  | Beyond Core (`--features`): task, approval, transfer, seeding, snapshots, replay bundles, a servo command channel | |
44
46
 
@@ -107,7 +109,7 @@ The connection tracks the action lifecycle against the spec's transition table,
107
109
  src/awp/ client protocol layer (sans-IO), asyncio adapter, frame codec, schemas
108
110
  src/awp/_spec/ schemas and lifecycle table bundled from spec/ (scripts/sync_spec.py)
109
111
  src/awp_sim/ world engine, arm, server, audit log, loopback, scenarios, CLI
110
- spec/ agent-world-protocol, pinned at spec-v0.1-draft.7
112
+ spec/ agent-world-protocol, pinned at spec-v0.1-draft.8
111
113
  scripts/ spec sync and trace checking
112
114
  ```
113
115
 
@@ -5,11 +5,13 @@ Python implementation of the [Agent World Protocol](https://www.agentworldprotoc
5
5
  - **`awp`** — the client protocol layer. `ClientConnection` is the agent side of AWP as a sans-IO state machine; `awp.aio.AsyncClient` drives it over a WebSocket.
6
6
  - **`awp_sim`** — the reference world. A sans-IO world engine with a simulated arm, a WebSocket server, an audit log, and a scenario suite that records wire traces.
7
7
 
8
- It targets specification revision **`0.1-draft.7`**, pinned as the `spec/` submodule. This is an alpha: the API will change with the draft.
8
+ It targets specification revision **`0.1-draft.8`**, pinned as the `spec/` submodule. This is an alpha: the API will change with the draft.
9
9
 
10
10
  ## Status
11
11
 
12
- The world and client target **Core World** and **Core Agent** for both time models, and the world the **sim** profile in lockstep, *self-assessed against 0.1-draft.7*: [awp-conformance](https://github.com/Hyperduality/awp-conformance) reports no failure against any configuration and leaves a few requirements untested. Every recorded trace also passes the spec's own checker, which verifies schemas, the action lifecycle table, idempotency, replay, and frame sequencing.
12
+ ![AWP: Core World, AWP-conformant against 0.1-draft.8](https://img.shields.io/badge/AWP-Core_World%2C_conformant_0.1--draft.8-555)
13
+
14
+ The world is **Core World: AWP-conformant against 0.1-draft.8** in both time models: [awp-conformance](https://github.com/Hyperduality/awp-conformance) reports no failure and nothing untested, and [`conformance/`](conformance/README.md) holds the reports and the evidence for their manual rows. The **sim** profile in lockstep and the client as **Core Agent** in both time models are *self-assessed against 0.1-draft.8*: the suite reports no failure and leaves a few requirements untested. Every recorded trace also passes the spec's own checker, which verifies schemas, the action lifecycle table, idempotency, replay, and frame sequencing.
13
15
 
14
16
  | Implemented | Not implemented |
15
17
  |---|---|
@@ -17,7 +19,7 @@ The world and client target **Core World** and **Core Agent** for both time mode
17
19
  | Inline and `ws` stream bindings; binary frame codec (all spec vectors) | Other stream bindings (`webrtc`, `webtransport`, `shm`, `grpc`) |
18
20
  | Full action lifecycle; preemption (`replace`, `queue`, `reject`, `blend`); idempotency | Standing approvals, grant expiry |
19
21
  | Watchdog and safe state, heartbeats, resumption with replay and acknowledgement | Multi-bind and shared control (one embodiment) |
20
- | Spatial, velocity, and rate envelopes (`command_check`) | Robotics profile (a simulated arm proves nothing physical) |
22
+ | Spatial, velocity, and rate envelopes (`command_check`), monitored during execution | Robotics profile (a simulated arm proves nothing physical) |
21
23
  | Audit log with redaction and hash chain; e-stop; `world.reset` | |
22
24
  | Beyond Core (`--features`): task, approval, transfer, seeding, snapshots, replay bundles, a servo command channel | |
23
25
 
@@ -86,7 +88,7 @@ The connection tracks the action lifecycle against the spec's transition table,
86
88
  src/awp/ client protocol layer (sans-IO), asyncio adapter, frame codec, schemas
87
89
  src/awp/_spec/ schemas and lifecycle table bundled from spec/ (scripts/sync_spec.py)
88
90
  src/awp_sim/ world engine, arm, server, audit log, loopback, scenarios, CLI
89
- spec/ agent-world-protocol, pinned at spec-v0.1-draft.7
91
+ spec/ agent-world-protocol, pinned at spec-v0.1-draft.8
90
92
  scripts/ spec sync and trace checking
91
93
  ```
92
94
 
@@ -0,0 +1,63 @@
1
+ # Conformance
2
+
3
+ ![AWP: Core World, AWP-conformant against 0.1-draft.8](https://img.shields.io/badge/AWP-Core_World%2C_conformant_0.1--draft.8-555)
4
+
5
+ | Class | Configuration | Claim | Report |
6
+ |---|---|---|---|
7
+ | Core World | `awp-sim serve --mode lockstep` | Core World (lockstep): AWP-conformant against 0.1-draft.8 (awp-conformance 0.1.0a2) | [`core-world-lockstep.json`](core-world-lockstep.json) |
8
+ | Core World | `awp-sim serve` | Core World (streaming): AWP-conformant against 0.1-draft.8 (awp-conformance 0.1.0a2) | [`core-world-streaming.json`](core-world-streaming.json) |
9
+
10
+ Each report, from awp-conformance 0.1.0a2 against awp-python 0.1.0a2, has no failure and nothing untested; the evidence for its `manual` rows follows (AWP-CNF-005). Every other configuration remains self-assessed against 0.1-draft.8.
11
+
12
+ ## Reproduce
13
+
14
+ ```bash
15
+ pip install --pre awp-python awp-conformance
16
+ curl -LO https://raw.githubusercontent.com/Hyperduality/awp-conformance/v0.1.0a2/fixtures/awp-sim.json
17
+ awp-sim serve --mode lockstep & # or `awp-sim serve` for streaming
18
+ export AWP_SIM_PID=$!
19
+ awp-conformance world ws://127.0.0.1:8710 --fixture awp-sim.json --out report/
20
+ ```
21
+
22
+ The fixture's e-stop hooks signal `$AWP_SIM_PID`; without it the e-stop test is skipped and AWP-EVT-002 is reported untested. The tests cited below run in this repository's CI:
23
+
24
+ ```bash
25
+ uv run pytest tests/test_frames.py tests/test_evidence.py
26
+ ```
27
+
28
+ ## Manual evidence
29
+
30
+ ### AWP-DAT-002, AWP-TRN-009 — latest-wins delivery (streaming)
31
+
32
+ - **Drop policy.** Each connection's send queue (`_Outbox`, [`src/awp_sim/server.py`](../src/awp_sim/server.py)) holds at most one unsent frame per latest-wins channel and replaces it when a newer one is produced; control messages and reliable frames queue in order, so a stalled latest-wins channel delays them by at most its one pending frame. A peer that stops reading is disconnected at 10,000 pending items rather than buffered without limit.
33
+ - **Stalled-receiver test.** `test_a_stalled_receiver_holds_one_frame_per_latest_wins_channel`: 1,000 `proprio` frames and 10 `arm_state` frames are produced while nothing drains the queue; one `proprio` frame, the newest, and all 10 `arm_state` frames remain, in order.
34
+
35
+ ### AWP-DAT-008 — frame test vectors
36
+
37
+ `test_vectors` (`tests/test_frames.py`) decodes every vector in `schemas/test-vectors/frames.json` of the `spec/` submodule, pinned at `spec-v0.1-draft.8`: the 10 valid vectors to the listed fields, and the 7 marked `expect_error` rejected with the listed error. `test_roundtrip_without_vendor` re-encodes the 8 valid vectors without an unknown extension or reserved bits byte for byte.
38
+
39
+ ### AWP-ENV-003 — envelope violations during execution
40
+
41
+ After every simulation step the world checks the arm against its envelope: position within `aabb_m`, speed within `max_velocity_mps`. On leaving it, the world stops the arm, emits `world.event: envelope_violation` to every session, and fails the executing action with reason `envelope` once its safe abort completes. An external disturbance is injected with `World.disturb(offset_m)` (or `Server.disturb`).
42
+
43
+ - `test_a_disturbance_during_execution_fails_the_action`: in each time model, a move is executing when the arm is pushed out of the envelope; the world emits `envelope_violation` and the move ends `failed` with reason `envelope`.
44
+ - `test_commanded_motion_never_leaves_the_envelope`: 400 seeded random submissions, replacements, queued moves, stops, and cancels in each time model, checked after every advance; no violation is reported.
45
+ - `test_servo_motion_never_leaves_the_envelope`: servo setpoints toward the walls, and stops during them.
46
+
47
+ ### AWP-UNI-001 — SI units and unit suffixes
48
+
49
+ The fields awp-sim defines, reviewed:
50
+
51
+ | Field | Where | Unit |
52
+ |---|---|---|
53
+ | `p_m` | `proprio` payload | m |
54
+ | `v_mps` | `proprio` payload; `servo_arm` setpoints | m/s |
55
+ | `target_m` | `arm_state` payload | m |
56
+ | `max_velocity_mps` | `move_to_pose` params | m/s |
57
+ | `phase`, `action_id` | `arm_state` payload | not physical |
58
+
59
+ Every other field is defined by the specification's schemas. `test_world_defined_fields_carry_si_suffixes` collects every action parameter, channel schema field, and payload field across every feature, and fails on any field not reviewed as non-physical that lacks a unit suffix.
60
+
61
+ ### AWP-VER-009 — the draft revision is named
62
+
63
+ The [README](../README.md) and the [awp-sim page](https://www.agentworldprotocol.com/adapters/awp-sim) name `0.1-draft.8`; `awp.SPEC_REVISION` is `"0.1-draft.8"`; the `spec/` submodule is pinned at the tag `spec-v0.1-draft.8`; each report records `"specification": "0.1-draft.8"` and its claim names the revision.