diff --git a/docs/evidence/STATE-WP-0079-d2-dual-read-20260831.md b/docs/evidence/STATE-WP-0079-d2-dual-read-20260831.md new file mode 100644 index 0000000..44a727c --- /dev/null +++ b/docs/evidence/STATE-WP-0079-d2-dual-read-20260831.md @@ -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. diff --git a/workplans/STATE-WP-0079-retirement-strangler.md b/workplans/STATE-WP-0079-retirement-strangler.md index 1da2935..8360eeb 100644 --- a/workplans/STATE-WP-0079-retirement-strangler.md +++ b/workplans/STATE-WP-0079-retirement-strangler.md @@ -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