Add the fail-closed recovery regression: reopening a store holding durable observation intents must fail without the registered schema table — neither a null channel host nor an empty one (no registered schemas) can admit the frozen intents, so recovery is refused at the session_registry_impl.hpp channel guard. Cut speculative generality with no consumer: the channel_descriptor on_exchange callback and its exchange_hook plumbing in enqueue_observation_intent return when the wallet-bridge unification lands; likewise channel_host::catalog() and channel_catalog_entry had zero callers and no authorized RPC. Consolidate the identical 128-byte bounded charset identifier and 64-hex digest grammar (previously duplicated in guest_channel.cpp, session_registry_impl.hpp, and observation_intent_unix_server.cpp) into src/control/channel_identifier_grammar.hpp without changing semantics, and document the cached-replay vs registry-replay response divergence plus that channel_id is registration metadata only (registry admission matches by schema_id). |
||
|---|---|---|
| .. | ||
| prompts | ||
| architecture.md | ||
| build.md | ||
| client-adoption-matrix.md | ||
| future-work.md | ||
| host-setup.md | ||
| hostile-content-analysis.md | ||
| managed-client-setup.md | ||
| quickstart.md | ||
| session-policy.md | ||
| threat-model.md | ||
| validation-surface.md | ||