Skip to content

id: PoC: verify DO jurisdiction mechanics and confirm vendor residency guarantees #2285

Open

Description

@dezren39

Follow-up C from the Durable Object jurisdiction investigation on #2061
(doc: doc/2026-10-29T11-43-02Z_investigation_do_jurisdiction_pinning/, §5 and §1.5).

Parent epic: #2056. Context: #2044.

Needs a Cloudflare account to deploy a scratch Worker — not doable from a repo-only worker session. Two halves: code mechanics (small PoC) and a written vendor ask (not code).

Half 1 — PoC (one deployed scratch Worker, no user data)

  1. idFromName(name) vs jurisdiction("eu").idFromName(name) produce different IDs in this account (docs assert it; confirm).
  2. ctx.id.jurisdiction reads back eu inside the object, including from an alarm; confirm both undefined cases (unrestricted namespace; alarm scheduled before 2026-03-15).
  3. A mismatched namespace/ID pair throws; an unrestricted namespace silently accepts a foreign ID (the failure mode the design guards against).
  4. Export from an eu object, import into a us object: signatures still verify (migration path).
  5. R2: create an eu-jurisdiction bucket, confirm the Worker binding needs the jurisdiction field and that the S3 jurisdiction endpoint cannot reach outside the jurisdiction.

Half 2 — the written ask to Cloudflare (blocks any DPA that claims EU residency)

The docs guarantee the object "only run[s] and store[s] data within a region" and that it is never migrated out of the jurisdiction's data-centre list. They do not say that DO SQLite's storage replication path stays inside the jurisdiction:

  • SQLite commits are forwarded to five follower machines, each in a different physical data center, and WAL batches/snapshots go to object storage (blog). No jurisdiction statement appears in that post.
  • Point-in-time recovery / bookmark retention: jurisdiction-confined? Not documented either way.
  • Does fedramp jurisdiction for Durable Objects require a separate entitlement (R2's FedRAMP jurisdiction explicitly does; DO's docs say nothing)?

Ask Cloudflare support/account team in writing and record the answer on this issue. A negative or evasive answer changes the hosted edition's residency claim, so this is not optional polish.

Acceptance

  • PoC results recorded as a comment (or short doc) with what was observed, including failures.
  • The vendor answer, or the exact question as sent plus the date, recorded here.
  • Any gap the answer exposes filed as an issue.

Acceptance criteria

  • PoC results recorded here (or in a short doc): all five Half-1 mechanics confirmed or the failure recorded, including both ctx.id.jurisdiction undefined cases
  • The Cloudflare written ask (Half 2) sent verbatim and dated on this issue; the vendor answer recorded when it arrives
  • Any residency gap the answer exposes is filed as its own issue

Activity

  1. added
    app/idPackage/app: id (pkgs/ or apps/ in this repo)
    effort/sSmall: expected under 2 hours of work
    kind/questionQuestion or design decision to resolve
    on Oct 29, 2026
  2. developing-today commented on Oct 29, 2026

    @developing-today
    Contributor
  3. added
    priority/normalOrdinary priority (the default)
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 29, 2026
  4. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Intake review

    Related: #2061 (jurisdiction investigation, §5/§1.5), #2044, #2283/#2284 (sibling follow-ups A/B), epic #2056

    Notes: Two halves: a small deployed-Worker PoC and a vendor ask. Needs a Cloudflare account — not doable from a repo-only session, per the body.

    Risks: An evasive vendor answer changes the hosted edition's residency claim — treat Half 2 as blocking for any EU-residency DPA language.

    Suggested approach: Half 1 via a scratch Worker on Drew's Cloudflare account; Half 2 via support/account team in writing.

    🤖 Agent note · filed

    • Agent: fleet monitor (repo-fleet-monitor)
    • Session / ID: repo-fleet-monitor run 2026-10-29T12:12Z (07:12 CDT)
    • Found via: monitor reconciliation
    • Task: Duty 2 intake enrichment — acceptance criteria appended (original body preserved verbatim above it), labels normalized, meta/enriched applied. Still-live check this pass: no merged PR or fix commit explicitly resolving this issue was found; where a queue triage task owns verification, it is named in the notes.
    • Expectation: see the effort label; done = the appended acceptance criteria are met.
    • Links: this issue
  5. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    Unblock read from task 5800 (queue triage of the #2285 → #3403 → #3399 chain). Posting here because #3399 Phase 1 is gated on this issue's evidence and has now parked twice (tasks 5798, 5800) without progress.

    Correction to the "not doable from a repo-only worker session" premise. The OpenChamber execution host has wrangler on PATH and CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID present in the environment (names checked only — no values read). So Half 1's scratch-Worker PoC appears executable from here, not account-inaccessible. What is missing is not access but authorization: deploying a scratch Worker and an eu-jurisdiction R2 bucket creates billable/side-effecting resources on Drew's Cloudflare account.

    Decision required (Drew): authorize one scratch deployment under the jurisdiction PoC (no user data), i.e. may an agent run #2285 Half 1 non-interactively on that account?

    Unblocks on yes: #2285 Half 1 evidence → #3403 phase 0 → #3399 phase 1 (this chain, 3 tasks). Half 2 (written vendor/residency ask) remains Drew's regardless — it is correspondence, not code, and it is the part that gates EU-residency DPA language.

    Meanwhile: #3399 task 5800 is being blocked escalated-to-user (not parked again) so the chain stops burning a 30-minute park cycle on an unchanged gate. Nothing in the repo was edited.

  6. added
    queue/queuedHas a queued task in the Supabase agent queue
    source/creatorFiled by the new-issue-creator job
    task/triageQueue packet kind: verify, reproduce, and route this item
    on Nov 3, 2026
  7. developing-today commented on Nov 3, 2026

    @developing-today
    Contributor

    agent-note:v1
    state: reviewed (coverage loop-back)
    Coverage pass 2026-11-03, loop-back review: this issue was re-reviewed (drift / overlap / already-handled / stale / blockers / ordering) so every open issue in the four repos is reviewed and in the system. Verdict: still live; in the system as task 6817 (triage, queued, priority 50) in repo-health-code-pilot. Labels audited and synced. If it is already handled at current main, its triage closes it with evidence; if oversized, the triage files the split; blockers belong on this issue.
    Found via: coverage loop-back 2026-11-03

  8. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 3, 2026
  9. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    Queue pickup — task 6817 (triage), OpenChamber scheduled lane. Revalidating #2285 and its Cloudflare authorization gate; no repo changes planned unless evidence shows they are needed.

  10. added
    queue/blockedQueue or user escalation state
    status/blockedQueue or user escalation state
    user/escalatedQueue or user escalation state
    and removed
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    on Nov 3, 2026
  11. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    Triage verdict — authorization required; no PoC or vendor result yet

    Fresh GitHub revalidation: #2285 remains OPEN and assigned to Drew. The latest substantive note (2026-11-03T10:44Z) asks Drew to authorize one scratch Worker plus an eu-jurisdiction R2 bucket on the account. No authorization, deployed PoC findings, or vendor response has appeared since; no open PR for #2285 was found.

    The blocker is a user decision, not a code defect: deploying the requested scratch resources has account/billing side effects, and sending the written residency questions is external correspondence. This lane did not deploy resources or contact Cloudflare. Half 1 must verify all five mechanics in the issue (including the two undefined ctx.id.jurisdiction cases); Half 2 must be sent in writing and its answer recorded before any EU-residency claim is treated as established.

    Decision needed from Drew: authorize or decline the one no-user-data scratch deployment described above, and handle/authorize the written vendor ask. Until then the residency gate remains unresolved; no vendor email is represented as sent. Queue task 6817 is blocked escalated-to-user; labels now reflect queue/blocked, status/blocked, user/escalated.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

app/idPackage/app: id (pkgs/ or apps/ in this repo)effort/sSmall: expected under 2 hours of workkind/questionQuestion or design decision to resolvemeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)queue/blockedQueue or user escalation statesource/creatorFiled by the new-issue-creator jobstatus/blockedQueue or user escalation statetask/triageQueue packet kind: verify, reproduce, and route this itemuser/escalatedQueue or user escalation state

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions