# STATE-WP-0079 D2 dual-read cutover evidence — 2026-08-31 ## Outcome The Railiance Fabric authority snapshot is active on the `railiance01` State Hub read model and the executable fin-hub parity gate is green. Import idempotency and production rollback/roll-forward were exercised against retained immutable imports. This completes the D2 dual-read evidence. It does not authorize retirement of State Hub or claim a hosted Railiance Fabric owner service; that operational residual is `RAIL-FAB-WP-0028`. ## Authority snapshot - Producer: `railiance-fabric` - Contract: `railiance.fabric/v1alpha2`, `financial-fabric-v1` - Revision: `snapshot-set:sha256:991bca294474e76a65e28011d813aace15d040aa7c173fcf8874a5d548aa7b35` - Source path: `registry://accepted-snapshots` - Exported at: `2026-08-31T20:44:15Z` - Content hash: `caae66795ce8e969b086609f7905c129206e4a027eb60c65086fc183e88613a2` - Counts: 131 nodes, 117 edges, 2 actors, 1 fabric, 0 unresolved references - State Hub import: `47e5358e-d04b-4969-99a2-ca88423ad054` ## Compatibility defect and deployment The first production import correctly failed closed, but exposed two receiver defects: the Pydantic receiver omitted the contract's `deployment_overlay`, and `fabric_graph_imports.source_commit` was `varchar(80)` while deterministic snapshot-set revisions are 84 characters. The invalid-import diagnostic then also hit that width constraint and returned HTTP 500 instead of 422. State Hub commit `cf40c7b` aligned the receiver, bounded invalid provenance metadata, added migration `b5e6f7a8c9d0`, and added regression coverage. It was deployed atomically as image `main-cf40c7b`, Helm revision 56. Commit `cdff3b7` then added immutable-import activation for operational rollback and was deployed as image `main-cdff3b7`, Helm revision 57. Final health reported `primary/railiance01`, database connected, and schema `b5e6f7a8c9d0` applied. Verification: - Full State Hub suite before the first deployment: 828 passed; dashboard build completed (one pre-existing SQLAlchemy resource warning and one broken-link warning). - Focused activation/financial/import tests after the rollback addition: 5 passed. - The exact saved authority payload validated as 131 nodes / 117 edges before deployment. ## Parity and idempotency `finhub fabric-cutover-check` compared the saved authority export with `/fabric/graph/summary`. All checks passed: API/schema/kind, content hash, node/edge/actor/fabric/unresolved counts, source revision/path, and export time. The result was `ready: true` with no failures. Posting the identical saved payload a second time returned `created: false`, `idempotent: true`, and the same import id. No duplicate graph was created. ## Exercised rollback and roll-forward The previous valid import remained intact as `f844733d-bfc2-4809-a3c6-8cc8fbb5a84d` (49 nodes, 58 edges, content hash `9d08056060753445727cff8cff7a7be1525b113dabcf45c4039bce98a1f5e912`). 1. Activating that import changed the live summary to 49 nodes / 58 edges and reported the 131/117 import as the previous import. 2. Activating `47e5358e-d04b-4969-99a2-ca88423ad054` restored 131 nodes / 117 edges and reported the old import as previous. 3. The full fin-hub cutover gate was rerun after roll-forward and again returned `ready: true` with zero failures. Activation changes only the per-source latest marker; both graph imports remain immutable and readable. ## Caller and owner-surface review A fresh code scan of repo-manager, fin-hub, hub-core, activity-core, ops-hub, railiance-fabric, and the retirement project found no runtime callers of the State Hub `/fabric/graph*` routes. Matches were contracts, operator docs, and retirement inventory only. Railiance Fabric currently documents a workstation-local registry service at `127.0.0.1:8765`; no Kubernetes/Helm production deployment was found in railiance-apps, railiance-cluster, rail-kubernetes, or railiance-fabric. Its accepted snapshot set is deterministic, but many component snapshots predate this cutover. `RAIL-FAB-WP-0028` owns the hosted runtime, persistence, authentication, freshness, recovery, and eventual direct-consumer switch.