kenny-protocollisted
Install: claude install-skill t11z/kenny
# kenny wire protocol
The contract is **`docs/protocol.md` + `docs/fixtures/`**. It is the single source of
truth; `protocol.py` (Pydantic) and `protocol.rs` (serde) are implementations of it.
## Invariants
- One JSON object per WebSocket message. Frame types: `register`, `request`, `response`,
`telemetry`, `ping`, `pong`.
- `request`/`response` are correlated by `id` (server-generated UUID).
- `telemetry` is **pushed** by the agent, not requested. `telemetry_collect` returns the
same snapshot shape on demand.
- Every telemetry section payload carries `status` ∈ {ok, warn, crit} and a `summary`
string. Health thresholds are authoritative on the server (`health_rules.py`).
- Error codes: `timeout`, `not_found`, `exec_failed`, `unsupported`, `bad_args`, `internal`.
## Changing the contract (synchronization point)
1. Edit `docs/protocol.md` and add/adjust fixtures in `docs/fixtures/`.
2. Update **both** `protocol.py` and `protocol.rs`; keep field names and optionality identical.
3. Bump `PROTOCOL_VERSION` on any breaking change.
4. Run `/contract-check`. Never let one language change shape without the other.
A contract change is owned by the orchestrator, not by a single component subagent.