Data model: Event write hygiene
No data shape changes. Every surviving writer writes the same row bytes (store.serialize_event_line).
- Status event log (
kitty-specs/<mission>/status.events.jsonl): written only throughstatus/store.py's atomic primitives. It is reached fromemit.py(flat shell) and fromcoordination/status_service.append_event_stream_log(theBookkeepingTransactionfunnel), plus the census families listed instatus/_unsafe.ALLOWED_CALLERS. - Invocation index (
kitty-ops/ops-index.jsonl): a derived performance index, not an event log. It is written only byinvocation/writer.InvocationWriter._append_to_index. - Produce seam registry (
status/adapters.py): three handler lists (status, lifecycle, resolved-binding). All are empty in open-core. Invariants: - registration is idempotent by qualified name;
- every
fire_*is non-raising and bounded bySPEC_KITTY_STATUS_FANOUT_TIMEOUT(default 10 s; a non-positive value runs the handler inline); - an empty registry is a no-op.