Upstream sync plus two fork fix commits. `pnpm fork:sync --verify` is
clean on the merge.
## Upstream (foundation/main → 5af356e, 11 commits)
- **cloudflare#464 / cloudflare#473 — connect handoff**: adopted wholesale, with the fork's
initiator guards kept in front. Completion tickets are bound to the
initiating browser and redeemed from the popup; BroadcastChannel
transport dropped.
- **cloudflare#381 / cloudflare#382 / cloudflare#308 — restricted data**: observer-verification model
adopted; the fork's owner-only tier is retained alongside it. Share
modal stays usable for restricted workspaces.
- **cloudflare#460 — gatekeeper-kit overhaul**: replayable credential runs,
declared action fences, conformance consumer. Reviewed against
gatekeeper-ai-executor: no wiring needed (it uses zero kit modules; no
provider credentials, single action kind, strategy-A observers).
- **cloudflare#450 — multi-tab Google Docs**; **cloudflare#433 — xlsx export** in
workspace-sheets; **cloudflare#478** integration test; **cloudflare#470** vitest bump;
**cloudflare#454** sidebar CSS.
## Fork fixes (config fallout from ae28b29)
- `b23db94d`: manifest-lib reads and drops `limits`/`placement` (no
v1-contract field; golden regenerated); staging strips dev-only
`browser.remote`; integration harness drops backend assets for test
boots (inline configs resolve `assets.directory` against the harness
root).
- `a8815836`: removes `browser.remote` (verified dev-only in wrangler's
own source; prod Browser Rendering comes from the binding, now pinned in
the deploy-contract test); run-dev-server drops backend assets in normal
dev mode (run-local unchanged).
## Verification
- scripts 378/378, backend 881, integration 82/82, frontend 474,
ai-executor 57+6 — all green, no workarounds.
- `types:scripts`, package `tsc`, lint (0 errors), `fork:sync --verify`
clean.
## Open (not in this PR)
- Context `artifacts` prod namespace flows verbatim into preview configs
— needs a product call (cut vs per-preview namespace).
- Customer manifests now ship frontend assets on the backend too
(consequence of the fork's backend-assets decision).
Rename
prohibitAllSharingtocontainsRestrictedData, with a typed-storage option ( as @kentonv suggested in this comment #340 (comment) ) so the rename does not need to migrate anything. Once #382 lands, reads off persisted records go through a helper that accepts both names.I'm not planning on landing this PR until #382 is ready for review