feat: add activation stream envelope
This commit is contained in:
101
.scratch/distributed-gguf-runtime/evidence/DGR-021/README.md
Normal file
101
.scratch/distributed-gguf-runtime/evidence/DGR-021/README.md
Normal file
@@ -0,0 +1,101 @@
|
||||
# DGR-021 evidence — versioned named-tensor activation envelope
|
||||
|
||||
**Completed:** 2026-07-17
|
||||
**Branch:** `distributed-gguf-runtime`
|
||||
**Authority:** `.scratch/distributed-gguf-runtime/prd.json`
|
||||
**Dependency:** DGR-018 (`evidence/DGR-018/README.md`) — canonical backlog schema / issue projection contract
|
||||
|
||||
## Objective
|
||||
|
||||
Establish the backend-neutral activation envelope used by direct and relayed Shard traffic, with stable versioning, named tensors, bounded fragmentation, checksum validation, and reserved extensibility for future state.
|
||||
|
||||
## Changes
|
||||
|
||||
### `packages/node/meshnet_node/protocol.py` (new)
|
||||
|
||||
Added a self-contained activation-envelope module with:
|
||||
|
||||
- `SCHEMA_NAME = "meshnet.activation-stream"` and `SCHEMA_VERSION = 1`
|
||||
- `TensorFragment`
|
||||
- bounded byte fragments with offset, compression tag, checksum, and extension preservation
|
||||
- deterministic `to_dict()` / `from_dict()` round-trip
|
||||
- `NamedTensor`
|
||||
- named tensor metadata: `name`, `shape`, `dtype`, `byte_order`, `compression`, `checksum`, `fragments`
|
||||
- fragmentation via `from_bytes(..., max_fragment_bytes=...)`
|
||||
- checksum validation over reconstructed tensor bytes
|
||||
- unknown-field preservation via `extensions`
|
||||
- `ActivationEnvelope`
|
||||
- top-level fields for `request_id`, `work_id`, `route_session`, `route_epoch`, `shard_start`, `effective_start`, `phase`, `position`, and `idempotency_step`
|
||||
- reserved extension fields for `token_id_sideband`, `architecture_state`, `recurrent_state`, and `mtp`
|
||||
- deterministic canonical serialization (`to_bytes`) and round-trip parsing (`from_bytes`)
|
||||
- size-limit enforcement (`to_bytes(max_bytes=...)`)
|
||||
- conversion from a live `TensorPayload` into the envelope and back again
|
||||
|
||||
### `packages/node/meshnet_node/model_backend.py`
|
||||
|
||||
Extended `TensorPayload` with envelope conversion helpers:
|
||||
|
||||
- `TensorPayload.to_envelope(...)`
|
||||
- `TensorPayload.from_envelope(...)`
|
||||
|
||||
These keep the existing activation payload interface intact while exposing the new versioned envelope as the shared protocol layer.
|
||||
|
||||
### `tests/test_activation_envelope.py` (new)
|
||||
|
||||
Added focused deterministic tests covering:
|
||||
|
||||
- deterministic envelope serialization and round-trip parsing
|
||||
- tensor fragmentation and checksum validation
|
||||
- unknown-field preservation at both envelope and tensor levels
|
||||
- size-limit rejection
|
||||
- `TensorPayload` ↔ envelope round-trip
|
||||
|
||||
### `.scratch/distributed-gguf-runtime/prd.json`
|
||||
|
||||
Marked `DGR-021.passes = true` and added completion notes recording the envelope implementation and verification commands.
|
||||
|
||||
## Commands and results
|
||||
|
||||
```bash
|
||||
pytest -q tests/test_activation_envelope.py
|
||||
```
|
||||
|
||||
```text
|
||||
5 passed in 0.06s
|
||||
```
|
||||
|
||||
```bash
|
||||
pytest -q tests/test_activation_envelope.py tests/test_kv_cache_distributed.py -k 'session_is_stable_and_decode_payloads_are_single_token or large_prefill_activation_survives_zstd_compressed_hop'
|
||||
```
|
||||
|
||||
```text
|
||||
.. [100%]
|
||||
2 passed, 21 deselected in 1.84s
|
||||
```
|
||||
|
||||
```bash
|
||||
python3 -m compileall packages/node/meshnet_node tests/test_activation_envelope.py
|
||||
```
|
||||
|
||||
```text
|
||||
Listing 'packages/node/meshnet_node'...
|
||||
Listing 'packages/node/meshnet_node/native_protocol'...
|
||||
Compiling 'tests/test_activation_envelope.py'...
|
||||
```
|
||||
|
||||
```bash
|
||||
git diff --check
|
||||
```
|
||||
|
||||
```text
|
||||
No whitespace errors
|
||||
```
|
||||
|
||||
## Limitations
|
||||
|
||||
- The envelope is implemented as a canonical deterministic JSON contract with dataclasses and conversion hooks, not generated `.proto` classes. The environment had `protobuf` available but not the `grpc_tools` generation toolchain, so I did not materialize a compiled proto artifact here.
|
||||
- The direct/relayed HTTP/WebSocket transports remain byte-oriented; the envelope is the shared structured contract layered above those transports.
|
||||
|
||||
## Dependency handoff
|
||||
|
||||
DGR-022 and later shard-control stories can reuse the envelope contract and its `TensorPayload` conversion hooks as the stable activation metadata layer. Future work that requires generated protobuf code can replace the JSON serialization with a generated wire codec without changing the top-level field contract defined here.
|
||||
Reference in New Issue
Block a user