awp-python 0.1.0a5__tar.gz → 0.1.0a6__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 (79) hide show
  1. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/CHANGELOG.md +6 -0
  2. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/PKG-INFO +5 -5
  3. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/README.md +4 -4
  4. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/conformance/README.md +9 -9
  5. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/conformance/core-agent-lockstep.json +36 -12
  6. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/conformance/core-agent-streaming.json +29 -5
  7. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/pyproject.toml +1 -1
  8. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/__init__.py +1 -1
  9. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/client.py +3 -0
  10. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/test_client.py +13 -0
  11. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/uv.lock +1 -1
  12. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/.gitignore +0 -0
  13. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/.gitmodules +0 -0
  14. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/.python-version +0 -0
  15. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/AGENTS.md +0 -0
  16. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/CLAUDE.md +0 -0
  17. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/LICENSE +0 -0
  18. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/conformance/frames.json +0 -0
  19. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/conformance/manifest-lockstep.json +0 -0
  20. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/conformance/manifest-streaming.json +0 -0
  21. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/scripts/sync_spec.py +0 -0
  22. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/lifecycle.json +0 -0
  23. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/action-cancel-result.schema.json +0 -0
  24. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/action-ref.schema.json +0 -0
  25. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/action-schema.schema.json +0 -0
  26. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/action-status.schema.json +0 -0
  27. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/action-submit-result.schema.json +0 -0
  28. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/action-submit.schema.json +0 -0
  29. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/agent-manifest.schema.json +0 -0
  30. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/approval-requested.schema.json +0 -0
  31. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/approval-respond.schema.json +0 -0
  32. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/common.schema.json +0 -0
  33. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/embodiment.schema.json +0 -0
  34. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/empty-result.schema.json +0 -0
  35. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/error.schema.json +0 -0
  36. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/frame-inline.schema.json +0 -0
  37. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/frame-tree.schema.json +0 -0
  38. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/obs-report.schema.json +0 -0
  39. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/observation-channel.schema.json +0 -0
  40. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/ping-result.schema.json +0 -0
  41. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/ping.schema.json +0 -0
  42. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/profiles/gui-actions.schema.json +0 -0
  43. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/reset-result.schema.json +0 -0
  44. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/reset.schema.json +0 -0
  45. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/restore.schema.json +0 -0
  46. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/safety-policy.schema.json +0 -0
  47. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-open.schema.json +0 -0
  48. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-ready.schema.json +0 -0
  49. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-resume.schema.json +0 -0
  50. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-state.schema.json +0 -0
  51. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-telemetry.schema.json +0 -0
  52. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-transfer-result.schema.json +0 -0
  53. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-transfer.schema.json +0 -0
  54. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/snapshot-result.schema.json +0 -0
  55. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/subscribe-result.schema.json +0 -0
  56. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/subscribe.schema.json +0 -0
  57. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/task-update.schema.json +0 -0
  58. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/tick-result.schema.json +0 -0
  59. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/tick.schema.json +0 -0
  60. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/unsubscribe.schema.json +0 -0
  61. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/world-event.schema.json +0 -0
  62. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/world-manifest.schema.json +0 -0
  63. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/aio.py +0 -0
  64. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/clock.py +0 -0
  65. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/demo.py +0 -0
  66. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/errors.py +0 -0
  67. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/frames.py +0 -0
  68. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/jsonrpc.py +0 -0
  69. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/lifecycle.py +0 -0
  70. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/py.typed +0 -0
  71. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/schema.py +0 -0
  72. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/__init__.py +0 -0
  73. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/conftest.py +0 -0
  74. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/test_aio.py +0 -0
  75. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/test_client_traces.py +0 -0
  76. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/test_evidence.py +0 -0
  77. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/test_frames.py +0 -0
  78. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/test_schema.py +0 -0
  79. {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/world.py +0 -0
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.0a6
4
+
5
+ Targets specification revision `0.1-draft.10`.
6
+
7
+ - When one of a multi-bind session's embodiments is transferred away, the client stops counting it as bound (AWP-EMB-003).
8
+
3
9
  ## 0.1.0a5
4
10
 
5
11
  Targets specification revision `0.1-draft.9`.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: awp-python
3
- Version: 0.1.0a5
3
+ Version: 0.1.0a6
4
4
  Summary: Agent World Protocol agent SDK for Python.
5
5
  Project-URL: Specification, https://www.agentworldprotocol.com
6
6
  Project-URL: Source, https://github.com/Hyperduality/awp-python
@@ -23,13 +23,13 @@ Description-Content-Type: text/markdown
23
23
 
24
24
  The Python agent SDK for the [Agent World Protocol](https://www.agentworldprotocol.com). `ClientConnection` is the agent side of AWP as a sans-IO state machine, and `awp.aio.AsyncClient` drives it over a WebSocket.
25
25
 
26
- It targets specification revision **`0.1-draft.9`**, pinned as the `spec/` submodule. This is an alpha, so the API will change along with the draft. The reference world, [awp-sim](https://github.com/Hyperduality/awp-sim), is a separate package built on this one.
26
+ It targets specification revision **`0.1-draft.10`**, pinned as the `spec/` submodule. This is an alpha, so the API will change along with the draft. The reference world, [awp-sim](https://github.com/Hyperduality/awp-sim), is a separate package built on this one.
27
27
 
28
28
  ## Status
29
29
 
30
- ![AWP: Core Agent, AWP-conformant against 0.1-draft.9](https://img.shields.io/badge/AWP-Core_Agent%2C_conformant_0.1--draft.9-555)
30
+ ![AWP: Core Agent, AWP-conformant against 0.1-draft.10](https://img.shields.io/badge/AWP-Core_Agent%2C_conformant_0.1--draft.10-555)
31
31
 
32
- In both time models, the demo agent built on the client is **Core Agent: AWP-conformant against 0.1-draft.9**. [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.
32
+ In both time models, the demo agent built on the client is **Core Agent: AWP-conformant against 0.1-draft.10**. [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.
33
33
 
34
34
  Implemented:
35
35
 
@@ -108,7 +108,7 @@ src/awp/ client protocol layer (sans-IO), asyncio adapter, frame code
108
108
  src/awp/_spec/ schemas and lifecycle table bundled from spec/ (scripts/sync_spec.py)
109
109
  tests/ unit tests, and a scripted world that serves over WebSockets
110
110
  conformance/ conformance reports, the manifests they were run against, and evidence
111
- spec/ agent-world-protocol, pinned at spec-v0.1-draft.9
111
+ spec/ agent-world-protocol, pinned at spec-v0.1-draft.10
112
112
  ```
113
113
 
114
114
  ## Development
@@ -2,13 +2,13 @@
2
2
 
3
3
  The Python agent SDK for the [Agent World Protocol](https://www.agentworldprotocol.com). `ClientConnection` is the agent side of AWP as a sans-IO state machine, and `awp.aio.AsyncClient` drives it over a WebSocket.
4
4
 
5
- It targets specification revision **`0.1-draft.9`**, pinned as the `spec/` submodule. This is an alpha, so the API will change along with the draft. The reference world, [awp-sim](https://github.com/Hyperduality/awp-sim), is a separate package built on this one.
5
+ It targets specification revision **`0.1-draft.10`**, pinned as the `spec/` submodule. This is an alpha, so the API will change along with the draft. The reference world, [awp-sim](https://github.com/Hyperduality/awp-sim), is a separate package built on this one.
6
6
 
7
7
  ## Status
8
8
 
9
- ![AWP: Core Agent, AWP-conformant against 0.1-draft.9](https://img.shields.io/badge/AWP-Core_Agent%2C_conformant_0.1--draft.9-555)
9
+ ![AWP: Core Agent, AWP-conformant against 0.1-draft.10](https://img.shields.io/badge/AWP-Core_Agent%2C_conformant_0.1--draft.10-555)
10
10
 
11
- In both time models, the demo agent built on the client is **Core Agent: AWP-conformant against 0.1-draft.9**. [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.
11
+ In both time models, the demo agent built on the client is **Core Agent: AWP-conformant against 0.1-draft.10**. [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.
12
12
 
13
13
  Implemented:
14
14
 
@@ -87,7 +87,7 @@ src/awp/ client protocol layer (sans-IO), asyncio adapter, frame code
87
87
  src/awp/_spec/ schemas and lifecycle table bundled from spec/ (scripts/sync_spec.py)
88
88
  tests/ unit tests, and a scripted world that serves over WebSockets
89
89
  conformance/ conformance reports, the manifests they were run against, and evidence
90
- spec/ agent-world-protocol, pinned at spec-v0.1-draft.9
90
+ spec/ agent-world-protocol, pinned at spec-v0.1-draft.10
91
91
  ```
92
92
 
93
93
  ## Development
@@ -1,13 +1,13 @@
1
1
  # Conformance
2
2
 
3
- ![AWP: Core Agent, AWP-conformant against 0.1-draft.9](https://img.shields.io/badge/AWP-Core_Agent%2C_conformant_0.1--draft.9-555)
3
+ ![AWP: Core Agent, AWP-conformant against 0.1-draft.10](https://img.shields.io/badge/AWP-Core_Agent%2C_conformant_0.1--draft.10-555)
4
4
 
5
5
  | Class | Configuration | Claim | Report |
6
6
  |---|---|---|---|
7
- | Core Agent | `awp-demo`, [`manifest-lockstep.json`](manifest-lockstep.json) | Core Agent (lockstep): AWP-conformant against 0.1-draft.9 (awp-conformance 0.1.0a6) | [`core-agent-lockstep.json`](core-agent-lockstep.json) |
8
- | Core Agent | `awp-demo`, [`manifest-streaming.json`](manifest-streaming.json) | Core Agent (streaming): AWP-conformant against 0.1-draft.9 (awp-conformance 0.1.0a6) | [`core-agent-streaming.json`](core-agent-streaming.json) |
7
+ | Core Agent | `awp-demo`, [`manifest-lockstep.json`](manifest-lockstep.json) | Core Agent (lockstep): AWP-conformant against 0.1-draft.10 (awp-conformance 0.1.0a7) | [`core-agent-lockstep.json`](core-agent-lockstep.json) |
8
+ | Core Agent | `awp-demo`, [`manifest-streaming.json`](manifest-streaming.json) | Core Agent (streaming): AWP-conformant against 0.1-draft.10 (awp-conformance 0.1.0a7) | [`core-agent-streaming.json`](core-agent-streaming.json) |
9
9
 
10
- The reports come from awp-conformance 0.1.0a6 run against awp-python 0.1.0a5. Neither has a failure or anything untested. The evidence for their `manual` rows is below (AWP-CNF-005).
10
+ The reports come from awp-conformance 0.1.0a7 run against awp-python 0.1.0a6. Neither has a failure or anything untested. The evidence for their `manual` rows is below (AWP-CNF-005).
11
11
 
12
12
  ## Reproduce
13
13
 
@@ -38,7 +38,7 @@ In streaming, the suite reads the agent's loss accounting from its `obs.report`.
38
38
 
39
39
  ### AWP-DAT-008: frame test vectors
40
40
 
41
- `test_vectors` (`tests/test_frames.py`) runs `awp.frames` over every vector in `schemas/test-vectors/frames.json` of the `spec/` submodule, which is pinned at `spec-v0.1-draft.9`:
41
+ `test_vectors` (`tests/test_frames.py`) runs `awp.frames` over every vector in `schemas/test-vectors/frames.json` of the `spec/` submodule, which is pinned at `spec-v0.1-draft.10`:
42
42
 
43
43
  - the 10 valid vectors decode to their listed fields;
44
44
  - the 10 marked `expect_error` are rejected with their listed error.
@@ -47,7 +47,7 @@ In streaming, the suite reads the agent's loss accounting from its `obs.report`.
47
47
 
48
48
  ### AWP-VER-009: the draft revision is named
49
49
 
50
- - The [README](../README.md) and the [Python SDK page](https://www.agentworldprotocol.com/sdks/python) name `0.1-draft.9`.
51
- - `awp.SPEC_REVISION` is `"0.1-draft.9"`.
52
- - The `spec/` submodule is pinned at the tag `spec-v0.1-draft.9`.
53
- - Each report records `"specification": "0.1-draft.9"`, and its claim names the revision.
50
+ - The [README](../README.md) and the [Python SDK page](https://www.agentworldprotocol.com/sdks/python) name `0.1-draft.10`.
51
+ - `awp.SPEC_REVISION` is `"0.1-draft.10"`.
52
+ - The `spec/` submodule is pinned at the tag `spec-v0.1-draft.10`.
53
+ - Each report records `"specification": "0.1-draft.10"`, and its claim names the revision.
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "suite": {
3
3
  "name": "awp-conformance",
4
- "version": "0.1.0a6"
4
+ "version": "0.1.0a7"
5
5
  },
6
- "specification": "0.1-draft.9",
6
+ "specification": "0.1-draft.10",
7
7
  "target": "awp-demo --url {url} --token {token}",
8
8
  "side": "agent",
9
- "generated": "2026-09-26T18:45:07Z",
9
+ "generated": "2026-09-26T22:32:00Z",
10
10
  "claim": {
11
11
  "status": "conformant",
12
- "wording": "Core Agent (lockstep): AWP-conformant against 0.1-draft.9 (awp-conformance 0.1.0a6)",
12
+ "wording": "Core Agent (lockstep): AWP-conformant against 0.1-draft.10 (awp-conformance 0.1.0a7)",
13
13
  "classes": [
14
14
  "Core Agent"
15
15
  ],
@@ -26,7 +26,7 @@
26
26
  ],
27
27
  "counts": {
28
28
  "manual": 4,
29
- "n/a": 193,
29
+ "n/a": 197,
30
30
  "pass": 37,
31
31
  "untestable": 3
32
32
  }
@@ -108,7 +108,7 @@
108
108
  "id": "AWP-AGT-001",
109
109
  "level": "MUST",
110
110
  "outcome": "pass",
111
- "detail": "124 check(s): lockstep/baseline, lockstep/integer-range, lockstep/invalid-manifest, lockstep/malformed-frame, lockstep/no-action-grants, lockstep/reconnect, lockstep/refused-submission, lockstep/restarted-world, lockstep/silent-world"
111
+ "detail": "123 check(s): lockstep/baseline, lockstep/integer-range, lockstep/invalid-manifest, lockstep/malformed-frame, lockstep/no-action-grants, lockstep/reconnect, lockstep/refused-submission, lockstep/restarted-world, lockstep/silent-world"
112
112
  },
113
113
  {
114
114
  "id": "AWP-AGT-002",
@@ -138,7 +138,7 @@
138
138
  "id": "AWP-AGT-006",
139
139
  "level": "MUST",
140
140
  "outcome": "pass",
141
- "detail": "24 check(s): lockstep/baseline, lockstep/integer-range, lockstep/malformed-frame, lockstep/reconnect, lockstep/restarted-world, lockstep/silent-world"
141
+ "detail": "23 check(s): lockstep/baseline, lockstep/integer-range, lockstep/malformed-frame, lockstep/reconnect, lockstep/restarted-world, lockstep/silent-world"
142
142
  },
143
143
  {
144
144
  "id": "AWP-AGT-007",
@@ -356,6 +356,12 @@
356
356
  "outcome": "n/a",
357
357
  "detail": "world-side requirement"
358
358
  },
359
+ {
360
+ "id": "AWP-CMD-009",
361
+ "level": "SHOULD",
362
+ "outcome": "n/a",
363
+ "detail": "world-side requirement"
364
+ },
359
365
  {
360
366
  "id": "AWP-CNF-001",
361
367
  "level": "MUST",
@@ -396,7 +402,7 @@
396
402
  "id": "AWP-CTL-001",
397
403
  "level": "MUST",
398
404
  "outcome": "pass",
399
- "detail": "125 check(s): lockstep/baseline, lockstep/integer-range, lockstep/invalid-manifest, lockstep/malformed-frame, lockstep/no-action-grants, lockstep/reconnect, lockstep/refused-submission, lockstep/restarted-world, lockstep/silent-world"
405
+ "detail": "124 check(s): lockstep/baseline, lockstep/integer-range, lockstep/invalid-manifest, lockstep/malformed-frame, lockstep/no-action-grants, lockstep/reconnect, lockstep/refused-submission, lockstep/restarted-world, lockstep/silent-world"
400
406
  },
401
407
  {
402
408
  "id": "AWP-CTL-002",
@@ -426,7 +432,7 @@
426
432
  "id": "AWP-CTL-006",
427
433
  "level": "MUST",
428
434
  "outcome": "pass",
429
- "detail": "125 check(s): lockstep/baseline, lockstep/integer-range, lockstep/invalid-manifest, lockstep/malformed-frame, lockstep/no-action-grants, lockstep/reconnect, lockstep/refused-submission, lockstep/restarted-world, lockstep/silent-world"
435
+ "detail": "124 check(s): lockstep/baseline, lockstep/integer-range, lockstep/invalid-manifest, lockstep/malformed-frame, lockstep/no-action-grants, lockstep/reconnect, lockstep/refused-submission, lockstep/restarted-world, lockstep/silent-world"
430
436
  },
431
437
  {
432
438
  "id": "AWP-CTL-007",
@@ -444,7 +450,7 @@
444
450
  "id": "AWP-CTL-009",
445
451
  "level": "MUST",
446
452
  "outcome": "pass",
447
- "detail": "127 check(s): lockstep/baseline, lockstep/integer-range, lockstep/invalid-manifest, lockstep/malformed-frame, lockstep/no-action-grants, lockstep/reconnect, lockstep/refused-submission, lockstep/restarted-world, lockstep/silent-world"
453
+ "detail": "126 check(s): lockstep/baseline, lockstep/integer-range, lockstep/invalid-manifest, lockstep/malformed-frame, lockstep/no-action-grants, lockstep/reconnect, lockstep/refused-submission, lockstep/restarted-world, lockstep/silent-world"
448
454
  },
449
455
  {
450
456
  "id": "AWP-CTL-010",
@@ -596,6 +602,12 @@
596
602
  "outcome": "n/a",
597
603
  "detail": "world-side requirement"
598
604
  },
605
+ {
606
+ "id": "AWP-EVT-004",
607
+ "level": "MUST",
608
+ "outcome": "n/a",
609
+ "detail": "world-side requirement"
610
+ },
599
611
  {
600
612
  "id": "AWP-GUI-001",
601
613
  "level": "MUST",
@@ -980,6 +992,12 @@
980
992
  "outcome": "n/a",
981
993
  "detail": "world-side requirement"
982
994
  },
995
+ {
996
+ "id": "AWP-ROB-008",
997
+ "level": "SHOULD",
998
+ "outcome": "n/a",
999
+ "detail": "world-side requirement"
1000
+ },
983
1001
  {
984
1002
  "id": "AWP-SAF-001",
985
1003
  "level": "MUST",
@@ -1206,7 +1224,7 @@
1206
1224
  "id": "AWP-TIM-003",
1207
1225
  "level": "MUST",
1208
1226
  "outcome": "pass",
1209
- "detail": "6 check(s): lockstep/baseline, lockstep/reconnect, lockstep/restarted-world"
1227
+ "detail": "7 check(s): lockstep/baseline, lockstep/malformed-frame, lockstep/reconnect, lockstep/restarted-world"
1210
1228
  },
1211
1229
  {
1212
1230
  "id": "AWP-TIM-004",
@@ -1268,6 +1286,12 @@
1268
1286
  "outcome": "n/a",
1269
1287
  "detail": "world-side requirement"
1270
1288
  },
1289
+ {
1290
+ "id": "AWP-TIM-014",
1291
+ "level": "MUST",
1292
+ "outcome": "n/a",
1293
+ "detail": "world-side requirement"
1294
+ },
1271
1295
  {
1272
1296
  "id": "AWP-TRN-001",
1273
1297
  "level": "MUST",
@@ -1422,7 +1446,7 @@
1422
1446
  "id": "AWP-VER-004",
1423
1447
  "level": "MUST",
1424
1448
  "outcome": "pass",
1425
- "detail": "111 check(s): lockstep/baseline, lockstep/integer-range, lockstep/invalid-manifest, lockstep/malformed-frame, lockstep/no-action-grants, lockstep/reconnect, lockstep/refused-submission, lockstep/restarted-world, lockstep/silent-world"
1449
+ "detail": "110 check(s): lockstep/baseline, lockstep/integer-range, lockstep/invalid-manifest, lockstep/malformed-frame, lockstep/no-action-grants, lockstep/reconnect, lockstep/refused-submission, lockstep/restarted-world, lockstep/silent-world"
1426
1450
  },
1427
1451
  {
1428
1452
  "id": "AWP-VER-005",
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "suite": {
3
3
  "name": "awp-conformance",
4
- "version": "0.1.0a6"
4
+ "version": "0.1.0a7"
5
5
  },
6
- "specification": "0.1-draft.9",
6
+ "specification": "0.1-draft.10",
7
7
  "target": "awp-demo --url {url} --token {token}",
8
8
  "side": "agent",
9
- "generated": "2026-09-26T18:45:09Z",
9
+ "generated": "2026-09-26T22:32:02Z",
10
10
  "claim": {
11
11
  "status": "conformant",
12
- "wording": "Core Agent (streaming): AWP-conformant against 0.1-draft.9 (awp-conformance 0.1.0a6)",
12
+ "wording": "Core Agent (streaming): AWP-conformant against 0.1-draft.10 (awp-conformance 0.1.0a7)",
13
13
  "classes": [
14
14
  "Core Agent"
15
15
  ],
@@ -24,7 +24,7 @@
24
24
  ],
25
25
  "counts": {
26
26
  "manual": 2,
27
- "n/a": 187,
27
+ "n/a": 191,
28
28
  "pass": 45,
29
29
  "untestable": 3
30
30
  }
@@ -354,6 +354,12 @@
354
354
  "outcome": "n/a",
355
355
  "detail": "world-side requirement"
356
356
  },
357
+ {
358
+ "id": "AWP-CMD-009",
359
+ "level": "SHOULD",
360
+ "outcome": "n/a",
361
+ "detail": "world-side requirement"
362
+ },
357
363
  {
358
364
  "id": "AWP-CNF-001",
359
365
  "level": "MUST",
@@ -594,6 +600,12 @@
594
600
  "outcome": "n/a",
595
601
  "detail": "world-side requirement"
596
602
  },
603
+ {
604
+ "id": "AWP-EVT-004",
605
+ "level": "MUST",
606
+ "outcome": "n/a",
607
+ "detail": "world-side requirement"
608
+ },
597
609
  {
598
610
  "id": "AWP-GUI-001",
599
611
  "level": "MUST",
@@ -978,6 +990,12 @@
978
990
  "outcome": "n/a",
979
991
  "detail": "world-side requirement"
980
992
  },
993
+ {
994
+ "id": "AWP-ROB-008",
995
+ "level": "SHOULD",
996
+ "outcome": "n/a",
997
+ "detail": "world-side requirement"
998
+ },
981
999
  {
982
1000
  "id": "AWP-SAF-001",
983
1001
  "level": "MUST",
@@ -1266,6 +1284,12 @@
1266
1284
  "outcome": "n/a",
1267
1285
  "detail": "world-side requirement"
1268
1286
  },
1287
+ {
1288
+ "id": "AWP-TIM-014",
1289
+ "level": "MUST",
1290
+ "outcome": "n/a",
1291
+ "detail": "world-side requirement"
1292
+ },
1269
1293
  {
1270
1294
  "id": "AWP-TRN-001",
1271
1295
  "level": "MUST",
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "awp-python"
7
- version = "0.1.0a5"
7
+ version = "0.1.0a6"
8
8
  description = "Agent World Protocol agent SDK for Python."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -28,7 +28,7 @@ from .errors import AwpError, ErrorCode, ProtocolError
28
28
  from .frames import Frame
29
29
  from .lifecycle import ActionState
30
30
 
31
- SPEC_REVISION = "0.1-draft.9"
31
+ SPEC_REVISION = "0.1-draft.10"
32
32
  PROTOCOL_VERSION = "0.1"
33
33
 
34
34
  try:
@@ -772,6 +772,9 @@ class ClientConnection:
772
772
  self._apply_status(params, events)
773
773
  elif method == "world.event":
774
774
  if self._sequence(params["status_seq"], events):
775
+ if params["event"] == "embodiment_transferred":
776
+ moved = (params.get("detail") or {}).get("embodiment")
777
+ self.embodiments = [e for e in self.embodiments if e != moved] # AWP-EMB-003
775
778
  events.append(WorldEvent(params["event"], params, self._replaying(params)))
776
779
  elif method == "session.state" and self._sequence(params["status_seq"], events):
777
780
  self.session_state = params["state"]
@@ -85,3 +85,16 @@ def test_the_clock_maps_both_ways_through_the_best_sample():
85
85
  clock.add(sample(100, 1_050, 1_050, 150)) # rtt 50: the one to trust
86
86
  assert (clock.offset_ns, clock.error_bound_ns) == (925, 25)
87
87
  assert clock.to_agent(clock.to_session(7_000)) == 7_000
88
+
89
+
90
+ def test_a_transferred_embodiment_is_no_longer_bound():
91
+ conn = ClientConnection(AGENT, MODALITIES, clock_ns=lambda: 0)
92
+ conn.receive(jsonrpc.result(conn.initialize(), manifest("streaming")))
93
+ rid = conn.open_session("streaming", embodiments=["arm_01", "gripper_01"])
94
+ conn.receive(jsonrpc.result(rid, ready("streaming", conn.outgoing()[-1]["params"])))
95
+ seq = conn.last_status_seq + 1
96
+ event = {"event": "embodiment_transferred", "status_seq": seq, "ts_mono_ns": 1}
97
+ event["detail"] = {"embodiment": "arm_01"}
98
+ conn.receive(jsonrpc.notification("world.event", event))
99
+ assert conn.embodiments == ["gripper_01"] # AWP-EMB-003
100
+ conn.submit("stop", {}) # one embodiment left: embodiment_id may be left out
@@ -81,7 +81,7 @@ wheels = [
81
81
 
82
82
  [[package]]
83
83
  name = "awp-python"
84
- version = "0.1.0a5"
84
+ version = "0.1.0a6"
85
85
  source = { editable = "." }
86
86
  dependencies = [
87
87
  { name = "jsonschema" },
File without changes
File without changes
File without changes
File without changes
File without changes