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.
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/CHANGELOG.md +6 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/PKG-INFO +5 -5
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/README.md +4 -4
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/conformance/README.md +9 -9
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/conformance/core-agent-lockstep.json +36 -12
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/conformance/core-agent-streaming.json +29 -5
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/pyproject.toml +1 -1
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/__init__.py +1 -1
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/client.py +3 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/test_client.py +13 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/uv.lock +1 -1
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/.gitignore +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/.gitmodules +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/.python-version +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/AGENTS.md +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/CLAUDE.md +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/LICENSE +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/conformance/frames.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/conformance/manifest-lockstep.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/conformance/manifest-streaming.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/scripts/sync_spec.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/lifecycle.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/action-cancel-result.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/action-ref.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/action-schema.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/action-status.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/action-submit-result.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/action-submit.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/agent-manifest.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/approval-requested.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/approval-respond.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/common.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/embodiment.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/empty-result.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/error.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/frame-inline.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/frame-tree.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/obs-report.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/observation-channel.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/ping-result.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/ping.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/profiles/gui-actions.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/reset-result.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/reset.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/restore.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/safety-policy.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-open.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-ready.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-resume.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-state.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-telemetry.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-transfer-result.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-transfer.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/snapshot-result.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/subscribe-result.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/subscribe.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/task-update.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/tick-result.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/tick.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/unsubscribe.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/world-event.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/world-manifest.schema.json +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/aio.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/clock.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/demo.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/errors.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/frames.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/jsonrpc.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/lifecycle.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/py.typed +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/schema.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/__init__.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/conftest.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/test_aio.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/test_client_traces.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/test_evidence.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/test_frames.py +0 -0
- {awp_python-0.1.0a5 → awp_python-0.1.0a6}/tests/test_schema.py +0 -0
- {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.
|
|
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.
|
|
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
|
-

|
|
31
31
|
|
|
32
|
-
In both time models, the demo agent built on the client is **Core Agent: AWP-conformant against 0.1-draft.
|
|
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.
|
|
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.
|
|
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
|
-

|
|
10
10
|
|
|
11
|
-
In both time models, the demo agent built on the client is **Core Agent: AWP-conformant against 0.1-draft.
|
|
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.
|
|
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
|
-

|
|
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.
|
|
8
|
-
| Core Agent | `awp-demo`, [`manifest-streaming.json`](manifest-streaming.json) | Core Agent (streaming): AWP-conformant against 0.1-draft.
|
|
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.
|
|
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.
|
|
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.
|
|
51
|
-
- `awp.SPEC_REVISION` is `"0.1-draft.
|
|
52
|
-
- The `spec/` submodule is pinned at the tag `spec-v0.1-draft.
|
|
53
|
-
- Each report records `"specification": "0.1-draft.
|
|
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.
|
|
4
|
+
"version": "0.1.0a7"
|
|
5
5
|
},
|
|
6
|
-
"specification": "0.1-draft.
|
|
6
|
+
"specification": "0.1-draft.10",
|
|
7
7
|
"target": "awp-demo --url {url} --token {token}",
|
|
8
8
|
"side": "agent",
|
|
9
|
-
"generated": "2026-09-
|
|
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.
|
|
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":
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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.
|
|
4
|
+
"version": "0.1.0a7"
|
|
5
5
|
},
|
|
6
|
-
"specification": "0.1-draft.
|
|
6
|
+
"specification": "0.1-draft.10",
|
|
7
7
|
"target": "awp-demo --url {url} --token {token}",
|
|
8
8
|
"side": "agent",
|
|
9
|
-
"generated": "2026-09-
|
|
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.
|
|
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":
|
|
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",
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/action-cancel-result.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/action-submit-result.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/approval-requested.schema.json
RENAMED
|
File without changes
|
{awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/approval-respond.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/observation-channel.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/profiles/gui-actions.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-telemetry.schema.json
RENAMED
|
File without changes
|
{awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-transfer-result.schema.json
RENAMED
|
File without changes
|
{awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/session-transfer.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
{awp_python-0.1.0a5 → awp_python-0.1.0a6}/src/awp/_spec/schemas/subscribe-result.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|