khive-changeset 0.5.0

Producer-agnostic KG change-set op-list model and NDJSON-delta serialization
Documentation
# Delete and Merge Preimages

Delete and merge operations carry full stage-time preimages so later review, conflict detection, or compensation has the original records needed to reason about a destructive mutation.

## `DeleteOp`

`DeleteOp` contains a target ID, hard/soft flag, and required `DeletePreimage`. The preimage is an entity, note, or edge tagged by `substrate`; `substrate` avoids colliding with the embedded entity/note record's own `kind` field.

Custom deserialization requires `target_id` to equal the embedded record ID. A missing preimage, mismatched ID, unknown field, invalid note salience/decay factor, or invalid edge weight is a parse error. Because `preimage` is not optional, a delete without captured prior state is unrepresentable.

## `MergeOp`

`MergeOp` contains destination `into_id`, removed `from_id`, and a required `MergePreimage`. The preimage holds both complete entities and every incident edge the merge expects to rewire.

Deserialization requires `into_id` and `from_id` to match their embedded entity IDs. Every listed incident edge must touch at least one merge participant; unrelated edges are rejected. Embedded edges also retain the finite `[0.0, 1.0]` weight invariant.

## Strict embedded records

The public `khive_types` record deserializers accept unknown fields, so this crate first decodes private `deny_unknown_fields` mirrors. It then converts to the real `Entity`, `Note`, or `Link` and reuses `Note::is_valid`/`Link::is_valid` for range checks rather than duplicating their full validation logic.