Release v0.0.92
Overview
This release makes it possible to answer "why did this instance fault?" Incidents move out of the Instances.Incidents jsonb column into their own table with unbounded history, a denormalized HasActiveIncident flag with a partial index, and two new read surfaces — GET .../instances/{id}/incidents/active and GET .../instances/{id}/incidents — reached through a link-only incident block that appears identically on the state body and on metadata.incident for both a single GET and every list item (response shape v9), all while taking incident reads on the three hottest paths to zero (#972). Instance status changes move to a Postgres compare-and-set, replacing distributed locks and redundant transactions around the status flip (#975). Discovery registry reads get a read-through L1/L2 cache under the default http provider, plus a hosted bulk-read window and a now-synchronous POST utilities/discovery/refresh — measured p50 0.182 ms on a hit against 100.7 ms on a registry miss (#976). And sub-state changes relay post-commit instead of waiting on the outbox → pub/sub → inbox path, which on preprod once took 6 min 30 s, with the receiver finally taking the same per-sub-item lock the three terminal paths take (#978). This release runs on component schema 0.0.53.
