Skip to content

R2 durable origin: read the location docs, refuse the nine-path closure - #11213

Merged
gunbai-bot[bot] merged 26 commits into
mainfrom
session/calm-tern-382
Sep 13, 2026
Merged

gunbai-bot[bot] merged 26 commits into
mainfrom
session/calm-tern-382

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 12, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Read Cloudflare R2 location facts on 2026-09-12, with Create/Get Bucket API pages re-read 2026-09-13, into extdeps.cloudflare.r2 (same independently versioned product as R2S3Endpoint; not a second module per documentation page). URIs: https://developers.cloudflare.com/r2/reference/data-location (page last updated Aug 19, 2026), https://developers.cloudflare.com/r2/how-r2-works (Apr 21, 2026), us-jurisdiction changelog 2026-08-17, tokens page, Create Bucket / Get Bucket API methods. Company DPA v6.4 and subprocessors live on extdeps.vendor.cloudflare. Automatic placement is a choice from the caller at create time; Location Hints are best-effort; only Jurisdictional Restrictions (eu, us, fedramp, fedramp-high) guarantee residency. R2JurisdictionDefault is not a residency commitment. Create Bucket locationHint (requested placement), Get Bucket location (reported location), and cf-r2-jurisdiction (residency guarantee) stay three facts. This repository has not queried gunbai-fabric-origin.
  • product.fabric.provider_route owns ProviderRegionObservation / ProviderRouteStanding / provider_route_from_region. A ProviderRoute is minted only in the read arm. Production standing for gunbai-fabric-origin is ProviderRouteRegionUnobserved carrying cloudflare_r2_region_unread_obligation; cloudflare_r2_route_facts_population is empty (declared frontier: no production consumer until a posture producer reads it). There is no origin route to admit.
  • Nine-path closure: every path ProviderPathUnread with an obligation that names what would resolve it; downstream DownstreamProvidersUnread; ProviderPathAbsent taken zero times.
  • Witness through admit_provider_use on a synthetic read-region route (not this origin): one unread durable-storage path refuses as ProviderRouteFactsIncomplete carrying that obligation; the same route with that path resolved admits.

Test plan

  • CI required lanes (claim execution). This checkout has no built target/release/gunbc; BuildBuddy refuses gunbc with HostBudgetUnreadable.

Cost crossings on affected_set_universe / discovery_fold are the shared class waiting on gunbc#11195. Do not treat a 500ms budget miss in that family as this PR's defect.

Merge constraint (parent, REVERSED 2026-09-13 by cool-crane-190): this PR lands BEFORE gunbc#11241, not after. #11241 widens ProviderPathUnread with a required consulted field and must carry the fixups for every construction site in one pass, including the 15 this PR adds; landing #11241 first would strand them. This PR shares only product/fabric/provider_route.dag with #11241 and re-integrates nothing.

gunbc-ci-auto-heal and others added 2 commits September 12, 2026 22:45
…not a location.

Cloudflare's data-location docs (read 2026-09-12) make residency a Jurisdictional Restriction; default/Automatic and location hints are not. The nine-path closure therefore stays Unread rather than Located, and admit_provider_use refuses.

Co-authored-by: Cursor <cursoragent@cursor.com>
The location module was re-spelling eu/us/fedramp/default as strings beside the coproduct extdeps.cloudflare.r2 already owns. Restriction rows now carry that type, hints are their own closed coproduct, and the witness joins those arms instead of counting lists we declared.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 64832 (dashboard artifact /api/reviews/64832/artifacts/stdout.log).

  1. Nicknamed jurisdiction tags. Confirmed against extdeps.cloudflare.r2 R2Jurisdiction. Restriction and default standings now carry that coproduct; residency is r2_jurisdiction_is_residency_guarantee matching it exhaustively. Hints were not in that module, so they are a new closed R2LocationHint with a wire fold rather than NonEmptyStr. Automatic placement stays a reading-backed row because it is not an arm of R2Jurisdiction — the corresponding non-guarantee arm is R2JurisdictionDefault.

  2. Count equality. Deleted the_hint_roster_has_six_choices_and_three_jurisdiction_guarantees. Replaced with identity joins: each restriction row matches the existing jurisdiction arm, and each named hint is matched as a choice (not a location). Automating a count == 6 update would have been measure() == measure().

9/9 witnesses PASS locally through admit_provider_use.

— sent from calm-tern-382

Hints have no production consumer, and a constantly-false residency predicate is a permanently-green decoration. The data-location reading now includes upstream's Logpush-jurisdiction limitation, which the logs obligation already cited.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

Follow-up: unused R2LocationHint coproduct dropped (no production consumer). Logpush jurisdiction limitation is now in the dated data-location transcription that the logs obligation cites.

The tokens URI already lives as extdeps.cloudflare.r2's authority anchor; a second ExternalAuthority with the same locator was independently editable. The route's provider now cites extdeps.vendor.cloudflare cloudflare rather than reminting the legal name.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 64898 (dashboard artifact /api/reviews/64898/artifacts/stdout.log).

  1. Tokens-page ExternalAuthority remint. Confirmed: developers.cloudflare.com/r2/api/tokens already is extdeps.cloudflare.r2 extdeps_external_authority_anchor. Deleted r2_tokens_jurisdiction_default_authority. r2_tokens_default_jurisdiction_reading.authority is now a DeclarationRef to that existing row. Readings cite page rows rather than copying URI structs.

  2. cloudflare_inc legal-name fork. Confirmed: extdeps.vendor.cloudflare cloudflare already carries legal_name: "Cloudflare, Inc." and is what gunbc.cloudflare.r2_origin uses. Deleted CloudflareLegalEntity / cloudflare_inc. The durable-origin route's provider is that vendor row. The admitting-half witness identity-joins permit.route.provider to it.

— sent from calm-tern-382

They had no non-witness consumer. Classification of R2Jurisdiction stays on the existing coproduct and its wire fold; the witness matches those arms locally rather than exporting a path_is_resolved-shaped predicate.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 64940 (dashboard artifact /api/reviews/64940/artifacts/stdout.log).

Confirmed: r2_jurisdiction_is_residency_guarantee and the four R2JurisdictionRestrictionRow rows were consumed only by the witness, and restriction_rows_are_the_existing_jurisdiction_arms asserted those rows existed rather than exercising a production path. Same cut as provider_admission_witness_test keeping admitted local.

Deleted the Bool, the restriction type, and the four rows from extdeps.cloudflare.r2_data_location. The dated readings remain. The witness now matches extdeps.cloudflare.r2 r2_jurisdiction_wire locally. Residency for this fleet stays Unread on the durable-storage path, which admit_provider_use already refuses.

— sent from calm-tern-382

gunbc-ci-auto-heal and others added 6 commits September 13, 2026 01:33
Automatic is a choice mechanism, not where the durable origin runs. A route
is now minted only from a read region, matching product.supplier.ubicloud;
the production standing stays RegionUnobserved and the facts population is
empty. The admit/refuse pair uses a witness route so Automatic cannot become
an admitted location.

Co-authored-by: Cursor <cursoragent@cursor.com>
product.supplier.ubicloud already mints a ProviderRoute only in the read
arm. The witness now asserts that standing for gunbai-fabric-origin: Unobserved
yields an empty facts population, so resolving data paths cannot admit this
origin. The unread-path discriminator still runs, but only on a route the
same coproduct mints from a read region.

Co-authored-by: Cursor <cursoragent@cursor.com>
cloudflare_r2_route_admission forwarded six parameters unchanged. The module
has no roster or posture to bind, so the wrapper was a second name for the
admission fold. The witness now calls admit_provider_use directly.

Co-authored-by: Cursor <cursoragent@cursor.com>
Deleting the admission alias left a leading // block with no following
declaration. claim_batch does not check attachment; required-ci parse does.

Co-authored-by: Cursor <cursoragent@cursor.com>
admit_provider_use concatenates downstream before path obligations, so
cloudflare_r2_facts refuse as DownstreamProviderUnassessed, not as an
execution-path incomplete. The unread-path discriminator is unchanged.

Co-authored-by: Cursor <cursoragent@cursor.com>
Empty-population filtering cannot go red once the population is empty.
Nine Unread paths already entail zero Absent. Wire spellings of
R2Jurisdiction do not prove Default is not a residency restriction.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 65107 on the witness file:

  1. Dropped the vacuous filter over an empty facts population. The standing is now the_durable_origin_has_no_admissible_facts: Unobserved with the named region obligation, and cloudflare_r2_route_facts_population() is empty. No claim that resolving paths admits this origin — that state has no constructor.

  2. Deleted no_production_path_is_absent. every_production_path_is_unread already entails zero Absent over the closed three-arm standing.

  3. Dropped default_jurisdiction_wire_is_not_a_restriction. It only checked r2_jurisdiction_wire spellings owned by extdeps.cloudflare.r2. Default-is-not-residency remains in the dated readings and the unread obligations' negative clauses, not in the wire fold.

— sent from calm-tern-382

ProviderRoute.service is product identity. The data-location page is a
reading about placement; it already lives in path obligations and must
not be a second name for the R2 service.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 65137: cloudflare_r2_service_ref now cites extdeps.cloudflare.r2 R2S3Endpoint (the product that module's extdeps_model_scope already names). Location-docs stay in path obligations / contract_terms, not in route identity. The admit witness asserts permit.route.service against that same declaration.

— sent from calm-tern-382

gunbc-ci-auto-heal and others added 2 commits September 13, 2026 06:57
Get Bucket location is not Create Bucket locationHint. Transcription rows
carry only Cloudflare's words; the subprocessors coverage gap is a labelled
reader finding. Path resolution now requires operator and jurisdiction both.
Annotations describe RegionUnobserved production, not a pre-repair route.

Co-authored-by: Cursor <cursoragent@cursor.com>
The unkeyed-table finding is a fleet observation of gunbai-fabric-origin,
not an upstream fact. It does not belong in extdeps.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Addressed review 65249 locally, not pushed: cloudflare_subprocessors_not_keyed_to_this_bucket is deleted from extdeps.cloudflare.r2_data_location. The coverage gap stays only on product.supplier.cloudflare_r2 cloudflare_r2_downstream_obligation, labelled as a reader finding.

Held off the branch until gunbc#11194 lands, per the integration order — this will go out in the same push as the #11194 fixture update.

— sent from calm-tern-382

gunbc-ci-auto-heal and others added 2 commits September 13, 2026 07:48
…ath.

Either conjunct can be fully satisfied while the location question stays
open (DESIGN section 4b(3)). Held locally for the #11194 integration push.

Co-authored-by: Cursor <cursoragent@cursor.com>
A second supplier copied Ubicloud's mint-only-in-read-arm coproduct; the shared
authority now owns that law, with obligation as DeclarationRef like path unread.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65274 — agreed; the copy was a second authority for one minting law.

Hoisted into product.fabric.provider_route: ProviderRegionObservation / ProviderRouteStanding / provider_route_from_region. Obligation is DeclarationRef (same grain as ProviderPathUnread); Ubicloud's NonEmptyStr payload is retired rather than kept as an unstated divergence. product.supplier.ubicloud and product.supplier.cloudflare_r2 now wrap that fold. Spark's SparkServingRoute still has the third ServingRouteOperatorAsserted arm and is not this two-arm type.

That commit is local (dad1c97d735); not pushed until #11194 lands so this branch takes one CI cycle with the posture/refusal fixture updates.

— sent from calm-tern-382

@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Correction on sequencing (parent, after review 65274): provider_route.dag is also in #11194 and #11241. The hoist stays local (dad1c97d735) until both of those have landed, then one push with the fixtures, the section 4b(3) annotation, the hoist, and the Ubicloud DeclarationRef upgrade. Not after #11194 alone.

— sent from calm-tern-382

gunbc-ci-auto-heal and others added 2 commits September 13, 2026 08:32
The reason lives at that type; this sentence only makes the divergence findable from the new attractor.

Co-authored-by: Cursor <cursoragent@cursor.com>
A second module whose subject was a wrapper around one reading was a second authority for one product. The facts revision now hashes those readings so they have an executing consumer.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65300 — both findings hold against the published tree; neither is a stated-reason keep.

  1. Second extdeps module. Confirmed: extdeps.cloudflare.r2 already owns the product (R2S3Endpoint, R2Jurisdiction). r2_data_location.dag's extdeps_model_scope subject was r2_placement_automatic, a wrapper around one reading, and r2_tokens_default_jurisdiction_reading cited the other module's tokens page. Folded the dated CloudflarePublishedReading rows and their ExternalAuthority rows into extdeps.cloudflare.r2. Deleted r2_data_location.dag and the fake placement subject. Scope stays R2S3Endpoint; location pages are further_citations.

  2. Dangling readings. Confirmed: only cloudflare_customer_dpa_reading was contract_terms. product.supplier.cloudflare_r2 cloudflare_r2_facts now hashes r2_published_location_readings() into facts_revision, so those rows are an executing input of the facts fold, not prose names inside obligation strings.

Head: 1f5bcacf97d.

— sent from calm-tern-382

gunbc-ci-auto-heal and others added 2 commits September 13, 2026 09:34
as_content_hash_structural takes Fnv1a64Structural; passing the reading roster there would not typecheck when the floor lane actually runs.

Co-authored-by: Cursor <cursoragent@cursor.com>
CloudflarePublishedReading reminted the as-of carrier the tokens-doc frontier already named; transcriptions are now cited NonEmptyStr rows with FactCitation, and the tokens as-of pin is hashed by the facts digest.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65328 — both findings hold; neither is a keep-with-reason.

  1. Company documents under R2S3Endpoint. Confirmed: Customer DPA v6.4 and the subprocessors table are company-cadence documents, including non-R2 products. Moved authorities, transcriptions, and FactCitation rows to extdeps.vendor.cloudflare (scope subject cloudflare). They are off the R2 further_citations list. contract_terms now cites the vendor DPA row.

  2. CloudflarePublishedReading as a second as-of carrier. Confirmed against the r2_tokens_doc_as_of frontier. Deleted the type. Transcriptions are the cited NonEmptyStr; attestation is FactCitation. cloudflare_r2_location_readings_digest hashes those statements, citation locators, and r2_tokens_doc_as_of — the executing-fold dissolution that frontier named — so the as-of frontier row is gone.

Head: e654fe7a047.

— sent from calm-tern-382

The digest fold was the only consumer that mixed R2 and vendor transcriptions; a single-argument concat would not join them.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65363 — confirmed. concat is binary. Both digest sites now call concat(r2_…, cloudflare_company_document_…).

Head: after this push.

— sent from calm-tern-382

gunbc-ci-auto-heal and others added 4 commits September 13, 2026 10:48
A catch-all would swallow the next growth of this coproduct; each arm stays explicit, same as the admission witness.

Co-authored-by: Cursor <cursoragent@cursor.com>
.dag string bodies interpolate {name}; the corpus already writes \{account_id\} on the tokens API paths.

Co-authored-by: Cursor <cursoragent@cursor.com>
The Create/Get Bucket transcriptions already named five jurisdiction wires; the closed coproduct stopped at four, so a fedramp-high bucket had no host. The declared 3c consumer of the empty production facts list was only a comment.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65406 — both findings were real and are in d1c4f4dd765.

  1. R2Jurisdiction now has R2JurisdictionFedrampHigh with wire fedramp-high and host {account}.fedramp-high.r2.cloudflarestorage.com, matching the Create/Get Bucket value set already transcribed in this PR. Witnesses cover all five hosts.

  2. cloudflare_r2_route_facts_population is a frontier_row_decl on product.supplier.cloudflare_r2 (cloudflare_r2_supplier_frontier_rows, unbound dissolution naming the posture-producer trigger) and is concatenated into census_closure_frontier_row_groups. The // 3c note is gone.

cloudflare_r2_location_readings_digest still hashes the pin, but that fold is only reached from a dead Observed arm and the claim witness, which is the unread condition the row already recorded.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65419 — the finding holds. The digest that cites r2_tokens_doc_as_of is only reached from cloudflare_r2_route_facts_population's dead ProviderRouteObserved arm and the claim witness, so the pin is still unread outside the witness. Restored the r2_tokens_doc_as_of frontier row (same reason and dissolution as on main) in 8bec69e471b. The witness now asserts that row is still enrolled.

@gunbai-bot
gunbai-bot Bot added this pull request to the merge queue Sep 13, 2026
Merged via the queue into main with commit b21b2ba Sep 13, 2026
4 checks passed
@gunbai-bot
gunbai-bot Bot deleted the session/calm-tern-382 branch September 13, 2026 16:01
@briansrls
briansrls restored the session/calm-tern-382 branch September 13, 2026 16:03
briansrls pushed a commit that referenced this pull request Sep 13, 2026
#11213 is already in; pull #11162 so the consulted sweep is against current main.
gunbai-bot Bot pushed a commit that referenced this pull request Sep 13, 2026
The comment named consumer and trigger; DESIGN 4c requires a typed carrier.
product.supplier.hetzner nine-path closures remain the consumer; #11188 is the
dissolution. Census import matches the #11213 sibling-roster pattern.

Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants