Assistant: codex Assistant-Model: gpt-5.6-sol Assistant-Session: 01a053ff-1d6f-7fe2-ac1c-a6eb40a42a0c
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).
- Activating that import changed the live summary to 49 nodes / 58 edges and reported the 131/117 import as the previous import.
- Activating
47e5358e-d04b-4969-99a2-ca88423ad054restored 131 nodes / 117 edges and reported the old import as previous. - The full fin-hub cutover gate was rerun after roll-forward and again returned
ready: truewith 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.