record D2 Fabric dual-read cutover evidence
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s

Assistant: codex
Assistant-Model: gpt-5.6-sol
Assistant-Session: 01a053ff-1d6f-7fe2-ac1c-a6eb40a42a0c
This commit is contained in:
tegwick 2026-08-31 23:22:43 +02:00
parent cdff3b7e08
commit 803bb95e1d
2 changed files with 109 additions and 0 deletions

View file

@ -0,0 +1,88 @@
# 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.

View file

@ -404,6 +404,27 @@ remaining repo-manager/hub-core/activity-core/ops-hub families, and explicit
authorization for production writer changes. It must resume from a fresh
caller scan, not from the obsolete 2026-08-20 snapshot.
**D2 dual-read evidence completed 2026-08-31.** The deterministic authority
snapshot is now the active `railiance01` read model at import
`47e5358e-d04b-4969-99a2-ca88423ad054`: 131 nodes, 117 edges, 2 actors, 1
fabric, 0 unresolved, content hash `caae6679…`, snapshot-set revision
`991bca29…`. `finhub fabric-cutover-check` is green on every schema, content,
count, and provenance check; exact re-ingest is idempotent. A receiver contract
drift/column-width defect was fixed in `cf40c7b` and deployed with migration
`b5e6f7a8c9d0` as Helm revision 56. Immutable-import activation was added in
`cdff3b7` and deployed as revision 57. Production rollback to retained import
`f844733d…` (49/58) and roll-forward to `47e5358e…` (131/117) were both
exercised, followed by another green gate.
The fresh named-repo caller scan found no runtime consumers of
`/fabric/graph*`; only contracts, docs, and retirement inventory matched. The
owner service is still workstation-local and its accepted-snapshot freshness is
not automated, so hosted runtime/persistence/auth/freshness and the eventual
direct route are live owner residual `RAIL-FAB-WP-0028`. Evidence:
`docs/evidence/STATE-WP-0079-d2-dual-read-20260831.md`. T04 remains `wait` on
the non-D2 repo-manager/hub-core/activity-core/ops-hub route receipts and the
explicit writer-change authorization already stated above.
## Retire legacy surfaces
```task