# v0.94.0 — Strict Transactional Graph Refresh > **Status:** Planned > **Scope:** Large > **User promise:** *"Refresh a private graph atomically inside one transaction with exact boundaries."* > **Blocked by:** [v0.93.0](v0.93.0.md) > **Delivery plan:** Phase 2 of > [Proposal: V1 Composable Refresh and Durable Delta Contracts](../plans/PROPOSAL_V1_COMPOSABLE_REFRESH_AND_DELTA_CONTRACTS.md) ## Theme Complete Graph V1 with strict synchronous graph refresh. Validate and lock the entire graph before execution, compute one immutable and complete source boundary, refresh every member in topological order through the common transactional finalizer, and return one structured result inside the caller's outer PostgreSQL transaction. Graph V1 remains disabled or experimental until this release's independent acceptance gate passes. Delta V1 is not part of this gate. ## Items ### GV1-5: Strict graph-refresh context Add `refresh_graph_strict()` over one structured internal graph-refresh context. Reject duplicate roots, unsupported cycles or sources, temporary or cross-database relations, `IMMEDIATE` members, non-`EXTERNAL` members, stale contracts, and unauthorized members before the first node executes. Acquire all member and admitted-source locks in canonical order before execution. Busy work, lock timeout, concurrent lifecycle change, or contract mismatch is a stable error, never a notice-and-skip success. ### GV1-6: Complete source-boundary proof Compute one immutable source-boundary manifest after locks are held. Every admitted source has a typed identity, capture mode, durable position, and proof status. Unknown, partial, missing, or unverifiable boundaries abort the graph; several incomparable source positions are never collapsed into a timestamp. Bind graph refresh identifiers and manifests to the v0.92.0 database-instance identity so clones cannot reuse source-system evidence. ### GV1-7: Atomic graph execution and result Execute the complete closure synchronously in canonical topological order. Every member uses the same prepare, owner-execute, and transactional finalize path as ordinary refresh. Return the requested and actual graph digests, contract generations, graph refresh identifier, complete boundary manifest, and exact or explicitly qualified per-node outcomes. The function performs no commit. Stream-table contents, frontiers, cleanup, history, graph metadata, and coordinator-owned writes commit or roll back with the caller's transaction. No-data execution still validates contracts, locks, and boundaries. ### GV1-8: Graph diagnostics and conformance Expose graph status, health rows, history, stable error identifiers, and metrics for strict refreshes, busy conflicts, contract failures, and boundary failures. Publish operational documentation, transaction limits, source-class admission, and capacity bounds. ## Exit criteria - [ ] A conformance extension refreshes one-node, chain, shared-upstream, and diamond graphs against one complete source boundary - [ ] It reads complete terminal tables and publishes coordinator-owned state before committing the same outer transaction - [ ] Coordinator failure rolls back graph contents, frontiers, history, and coordinator state without a committed member subset - [ ] Concurrent refresh, alter, repair, mode change, and drop tests prove the canonical lock order and strict busy behavior - [ ] Source writers on both sides of the safe boundary produce no lost or double-consumed changes - [ ] Every unadmitted or unverifiable source class fails before member execution - [ ] Crash, restore, clone, and supported-upgrade tests preserve contracts and reject stale database-instance identity - [ ] `external_graph_refresh` advertises stable major version 1 only after its transaction, concurrency, security, recovery, upgrade, and performance gates pass