state-hub/docs/evidence/STATE-WP-0079-d2-dual-read-20260831.md
tegwick 803bb95e1d
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
record D2 Fabric dual-read cutover evidence
Assistant: codex
Assistant-Model: gpt-5.6-sol
Assistant-Session: 01a053ff-1d6f-7fe2-ac1c-a6eb40a42a0c
2026-08-31 23:22:43 +02:00

4.1 KiB

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.