kcode-k1-access-profile-wire 0.2.0

Canonical profile mutation wire codecs for K1 access profiles
Documentation
# Access profile wire

This leaf owns the canonical byte representation of profile mutations. It has no persistence or retained state. The unchanged canonical profile value codec and its public value identities are reexported from `kcode-k1-access-profile-codec`.

## Public API

The crate reexports `encode_profile`, `decode_profile`, `AuthorizationProfile`, its subject and identifier types, and `ProfileName`. It exposes `OperationId`, `ProfileOperation`, `ProfileMutation`, `encode_operation`, and `parse_operation`.

`ProfileMutation` has the original `Create`, `Replace`, and `Delete` variants plus:

```rust
CreateNamed { owner: UserId, name: ProfileName, profile: AuthorizationProfile }
Rename { profile_id: ProfileId, actor: UserId, name: ProfileName }
```

`ProfileMutation` and `ProfileOperation` implement `Clone`, `Debug`, `Eq`, and `PartialEq`. The reexports retain the exact identities of their defining crates: profile codec identities come through the codec, `ProfileId` comes through values, and `ProfileName` comes through records.

## Mutation bytes

All mutations begin `[1][action][operation_id:16]`. The original actions and bytes are unchanged: Create is action `1` followed by `[owner:12][profile...]`; Replace is action `2` followed by `[profile_id:12][actor:12][profile...]`; Delete is action `3` followed by `[profile_id:12][actor:12]` and is exactly 42 bytes.

CreateNamed is action `4` followed by `[owner:12][name_length:u32 big-endian][name UTF-8 bytes][profile...]`. Rename is action `5` followed by `[profile_id:12][actor:12][name_length:u32 big-endian][name UTF-8 bytes]`. Name bytes are neither trimmed nor normalized. Parsing rejects truncated names, invalid UTF-8, `ProfileName` validation failures, and trailing Rename bytes.

The crate is synchronous and has no I/O, persistence, migration or legacy decoder, state, authorization decisions, People HTTP behavior, or generic schema framework.