Repository navigation
Bump Cloudflare OS to a679442 - #7
Merged
Merged
Conversation
Moves the pinned submodule 6478a14 -> a679442 (upstream main, 290 commits ahead, 0 behind; upstream has no tags or releases), with only the wrapper changes the bump requires: - pnpm-workspace.yaml: the catalog is re-synced verbatim with the submodule's (capnweb ^0.12.0, capnweb-validate 0.3.0, vitest ^5.0.5, vite-plus ^1.2.0, wrangler ^4.147.0, @cloudflare/vitest-plugin, ...), and the lockfile resolves the shared toolchain to the versions cloudflare-os/pnpm-lock.yaml does: one capnweb, one wrangler/miniflare/ workerd stack. cloudflare-os/scripts (@gadgets/scripts) becomes a member, because @gadgets/error-reporting now declares it workspace:*. Overrides follow upstream's vite-plus 1.x form (vite@*) and pin the vitest plugin's miniflare and wrangler to the catalog. - @cloudflare/vitest-pool-workers is renamed @cloudflare/vitest-plugin upstream (Vitest 5); manifests and both vitest configs follow. - vite-plus 1.x reads task input/output under `cache`; the three wrapper packages' task configs move there. Their vitest runs pass --no-fsModuleCache, as upstream's shared task does: Vitest 5's module cache is shared under the root node_modules and parallel tasks race on it. - The root test script excludes @gadgets/scripts, whose test task is upstream's workspace-wide guards over its own packages. - Gatekeeper contract: GatekeeperUser gains a required commitReconnect() (connect handoff, cloudflare-os#464), and the Workshop now asks every ambient Gatekeeper for getAgentCatalog() each turn. The Custom and Book Gatekeepers implement both; neither has a connect flow or a catalog. - error-reporter takes @cloudflare/workers-types from the catalog. - gatekeeper-book: two lint findings (no-useless-spread, no-array-sort) that also fail `pnpm lint` on main with the old toolchain. - Docs and comments: the Google Gatekeeper now carries eight resource types (Drive, Slides and Chat added; Sheets read-write), and the upgrade checklist names three workspace members. scripts/deploy.ts needs no code change: the derived configs pick up the new base configs as they are (compatibility_date 2026-09-04, additive Durable Object migrations on the Workshop, GitHub and Google Workers, and Google's new AI binding), and buildCommands() still rebuilds every package from source.
Restoring the old gitlink or rolling a Worker back is only safe while the old code can still read what the new version wrote, and Cloudflare refuses a rollback across a Durable Object migration. This bump does both, so the upgrade checklist says to repair forward otherwise.
At the pinned Cloudflare OS commit, every Slack read first confirms the user still belongs to the bound workspace through team.info, so Conversation grants need team:read and Thread grants need team:read plus the conversation :read scopes. The table still listed the old, narrower sets, and a grant made with them reads nothing until the user reconnects.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Moves the pinned
cloudflare-ossubmodule to upstreammainHEAD, with only the wrapper changes the bump requires.Warning
Merge = production deploy.
deploy.ymldeploysmainto https://os.stelaxis.org on push. This bump changes stored data in ways the old version cannot read: the Workshop's per-workspace storage, Context collections, and GitHub credentials. It also adds Durable Object migrations to three Workers, which Cloudflare will not roll back across. The sequential deploy is not compatible across versions in either direction, so it has to run as a short announced maintenance window. Read Migration plan, Rollout plan and Before merging first. Nothing was deployed from this branch.Gitlink
6478a1448a11524e2f7c2575ad66fab0bc47c433a6794421279057cb8813d3e5d0710754f5d41618Compare: cloudflare/cloudflare-os@6478a14...a679442 (290 ahead, 0 behind; 1458 files).
Provenance: the commit is upstream's squash merge of cloudflare/cloudflare-os#843 into
main, GitHub-signed (verification.verified: true, reasonvalid).6478a14is an ancestor. Upstream has no tags and no releases, somainHEAD is the latest version. Upstreammainwas stilla6794421when this PR was opened, so there's no newer head to report..gitmodulesis unchanged.cloudflare/cloudflare-os-starterbumped to the samea679442in three steps (its cloudflare#17/cloudflare#22). Its changes served as a reference, but it has since restructured (cf-osCLI,link:dependencies), so nothing was copied wholesale. Every change below was made and verified against this repository's own layout.Wrapper changes, and why each is required
pnpm-workspace.yamlcloudflare-os/scriptsadded as a member; overridesvite→vite@*, plus@cloudflare/vitest-plugin>miniflare/>wrangler→catalog:catalog:against this file (drift means twocapnwebcopies).@gadgets/error-reportingnow declares@gadgets/scripts: workspace:*, which resolves only against a member of the installing workspace, so without itpnpm installfails. vite-plus 1.x depends onviteas an alias that a bareviteoverride would clobber. See Catalog re-sync.pnpm-lock.yamlcloudflare-os/pnpm-lock.yaml(see below).package.json,packages/{custom-gatekeeper,gatekeeper-book}/package.json, bothvitest.config.ts@cloudflare/vitest-pool-workers→@cloudflare/vitest-pluginvitest-pool-workersand putsvitestat^5.0.5.package.jsontest--filter '!@gadgets/scripts'vp run … testwould also run@gadgets/scripts's owntesttask: upstream's workspace-wide guards over its own packages (cwd: '..'). These can't run from this workspace (gadgets-with-timeoutnot found) and they belong to the submodule's CI.packages/{custom-gatekeeper,gatekeeper-book,error-reporter}/vite.config.tsinput/outputmoved undercache; vitest runs get--no-fsModuleCachecache(voidzero-dev/vite-task#749). Vitest 5's module cache is one directory under the rootnode_modules, shared by every package's vitest, so parallel tasks race on it (ENOTEMPTY). Upstream's shared task passes the same flag. Without it, test tasks also stopped caching.packages/custom-gatekeeper/src/custom.ts,packages/gatekeeper-book/src/book.tscommitReconnect()on the account entrypoint;getAgentCatalog(): nullon the GatekeeperGatekeeperUser.commitReconnectis now required (connect handoff, cloudflare-os#464); without ittscfails.getAgentCatalogis optional in the type, but the Workshop now calls it on every ambient Gatekeeper every turn and only stops after anullanswer. Both of ours are ambient singletons, so leaving it out would mean a handledoverseer.catalog-fallbackissue report on every chat turn. Neither has a connect flow or a catalog.packages/error-reporter/package.json@cloudflare/workers-types→catalog:workshop-sharedusescatalog:), so one version is resolved across the workspace.packages/gatekeeper-book/src/mirror.ts,__tests__/book.test.ts[...kv.list()]→Array.from(kv.list());.sort→.toSortedvp linterrors. Pre-existing: a clean export ofce7c13ewith its own lockfile failsvp linton these exact two lines. Fixed only so thepnpm lintgate is green.Array.fromkeeps the materialize-before-delete behavior.docs/customization.md,deployment.jsonc,scripts/*.ts(comments only), operator skillreferences/upgrade-and-rollback.mdteam:read. Upgrade steps name three workspace members and the version-alignment check, and say when restoring the previous gitlink is safe.scripts/deploy.ts.Not changed, deliberately:
gatekeeper-websearch(#685) on hosted installs, but it's a new capability (web search didn't exist at6478a14) with its own Worker and Workers AI search spend. The Workshop discovers it by binding and works without it. It's an opt-in follow-up, not a compatibility fix.Catalog re-sync
catalog:block inpnpm-workspace.yamlis now byte-identical tocloudflare-os/pnpm-workspace.yaml's, comments included.diffof the two blocks is empty.capnweb ^0.11.1 → ^0.12.0,capnweb-validate 0.2.4 → 0.3.0,vitest ^4.1.10 → ^5.0.5,vite-plus ^0.2.8 → ^1.2.0,wrangler ^4.119.0 → ^4.147.0,@cloudflare/vitest-pool-workers → @cloudflare/vitest-plugin ^1.4.3. Added:@cloudflare/workers-types,miniflare 5.20261001.0-alpha,typescript6,zod,diff,@vitest/browser-playwright,playwright.wranglerto 4.151.3, whose own miniflare (5.20261019.1-beta) differs from the catalog's exact alpha that the vitest-plugin override pins, giving two miniflare/workerd stacks. So the lockfile was seeded to resolve what upstream's lock does, and it records the ranges at:capnweb 0.12.0,capnweb-validate 0.3.0,wrangler 4.147.0,miniflare 5.20261001.0-alpha,workerd 1.20261001.1,vite-plus 1.2.0,vitest 5.0.5,@cloudflare/vitest-plugin 1.4.3,@cloudflare/workers-types 5.20261005.1,zod 4.6.5. Result: exactly onecapnweb, onewrangler, oneminiflare, oneworkerdinpnpm-lock.yaml. (vitest 5.0.4andtypescript 5.9.3also appear: the first is bundled by vite-plus 1.2.0, the same as upstream's lock; the second belongs to capnweb-validate, as before.)buildCommands()names gained a nested cachedvp run. Context and Scheduler still nestvp run --cache build:app, which is already pre-run uncached. GitHub, Google, Slack and MCP Portal keepbuild:configurator→build. Workshop backend'sbuildiscache: falsewith uncached codegendependsOn(build:bundled-blueprints,build:browser-runtime). The frontend is a task withenv: ['VITE_*'], and itsVITE_CF_ACCESS_MODEis passed explicitly.buildCommands()is unchanged (19 steps, all--no-cache) and still rebuilds from source;scripts/deploy.test.tspasses unmodified apart from a comment.Compatibility review
CF_ACCESS_ISS/CF_ACCESS_AUD/ADMINS, same JWT path. New: native-app device-session handoff (#712, #780), not reachable without that client. Gatekeeper connects are now bound to the initiating browser (#464):complete()returns a single-use ticket the opener redeems over the user's own session, soPUBLIC_BASE_URLis now required for connects (we already set it). The Router now stampsCloudflare-OS-Router-Version(a display label, overwritten on every request). No change to the route, Preview URLs orworkers_dev.workshop-shared/src/gatekeeper.ts)GatekeeperUser.commitReconnect()(added to Custom and Book).getAgentCatalog()dropped its authorizer parameter and is now polled every turn (added asnull). Optional/kernel-side:reconnectComplete,getAcceptedResourceUrlPatterns, user-selection tickets, git-pull transfers,createResource/applyCreation,versionTag(),ActionFields;prohibitAllSharing→containsRestrictedData.applyActiongains aGitCacheargument our implementations can ignore. Not backward-compatible with the old Workshop: a new Gatekeeper refuses some of the old Workshop's calls (applyActionwithoutGitCache,startAppUiwithoutuserSelectionExchange, connect completion); see Rollout plan.assets.directory: ../workshop-frontend/dist). The old frontend loads and saves editor contents throughOverseer.subscribeToCode()/updateCode()(workshop-frontend/src/GadgetCodeInterface.tsx@6478a14:591,648;workshop-shared/src/api.ts@6478a14:1672,1680). The new API removes both, in favour ofsubmitCodeChange()and commit-based reads (api.ts@a6794421:2797;overseer-storage.ts@a6794421:983). An old frontend against the new Workshop cannot load or save code. That covers the deploy window, a rolled-back Router, and every browser tab left open across the deploy.@gadgets/error-reporting)ErrorReporterProps/ErrorEventV1are identical. It only gains the@gadgets/scriptsdevDependency (hence the workspace member). The Workshop'sERROR_REPORTERbinding (entrypoint and props) is unchanged in the derived config.CLIENT_ID/CLIENT_SECRET×3; MCP Portal underauth: "oauth"needs none). New env reads are all optional and unset here: GitHubWEBHOOK_ORIGIN(webhooks off when unset); GooglePUBSUB_*(push off),CF_AI_GATEWAY(PDF conversion then calls Workers AItoMarkdown()directly, with no gateway); MCP PortalMCP_PORTAL_HIDDEN_SERVER_IDS. Google gains anai: AIbinding (Drive PDFs, #843), whichdeploy.tscarries over from the base config. Google authority grows: new Drive (drive.readonly), Slides and Chat resources, Chat with send/edit/react behind approval, and Sheets goes fromspreadsheets.readonlyto read-writespreadsheets, which retracts every existing Sheets grant: owners re-consent on next connect./adminis a deny-list (disabledResources), so all new resource types are offered to every user by default once deployed. Actions queued before the upgrade: some can no longer be approved after it — Gmail send/reply/forward, any Gmail action through a search- or label-restricted binding, every pending Google Docs edit, and GitHub merges queued without a bound head (see Migration plan). Slack narrow grants: Conversation grants now also needteam:read, and Thread grants needteam:readplus the conversation:readscopes, because every read first checks workspace membership throughteam.info. Workspace grants are unaffected. The Slack app's scope set is unchanged.v3, GitHubv1, Googlev4–v8. No deleted, renamed or transferred classes. In-code storage changes that the old version can't read: the Workshop's Overseer DO (v1 → v5, irreversible); Context (lazy ACL migrationaclVersion0 → 1, byte-encoded document bodies,{ id }-only library rows); GitHub (credentials move into the kit's layout and the legacy keys are deleted; legacy unbound merge actions refused); Google (Gmail's and Docs' pending actions keep their keyspace but legacy entries are refused or partly refused). Additive only: Workshop User DO backfills, the rest of Google, MCP Portal and Slack. None: Scheduler (schemaVersionstill 1), Custom, Book, Error Reporter. Full inventory in Migration plan.wrangler.jsoncfiles are now generated fromcloudflare.config.tsbut still committed, sodeploy.tsreads them as before. Every upstream Worker'scompatibility_dategoes 2026-02-02 → 2026-09-04. The Workshop dropsenhanced_error_serialization, a no-op: it has been default-on since 2026-04-21 in workerd'scompatibility-date.capnp.$schemakeys removed.deploy.tsreplaces or reconstructsvars: no upstream Worker gained a required var (MCP Portal's base still only setsMCP_ALLOW_INSECURE, which we pin).services: the base Workshop declares none, and the Router's base still onlyWORKSHOP_BACKEND.kv_namespaces/r2_buckets: same bindings, with basepreview_ids (dev-only) dropped as before.assets: still deleted on the Workshop and kept on the Router.artifacts: still disabled.secrets.required: unchanged.ai: kept from Google's base and set on the Workshop.observability: merged as before.migrations,compatibility_*,build,rules,browser,worker_loaders: inherited from base. Nothing new is silently dropped; see the derived diff below.CLOUDFLARE_OS_DEPLOYMENT,CF_VERSION_METADATA,NOTIFICATION_SERVICE_URL/CFOS_INSTALL_*) come from upstream's hosted deploy service. Left unset, update checks and push notifications stay off.AiGatewayConfig's deploy-facing contract is unchanged: sameCF_AI_GATEWAY*vars and the same constructor refusals thatdeploy.tsmirrors. The derived Workshop vars are identical (defaultgateway,cloudflare,anthropic, binding transport, no token). Admins can now add gateway models in/admin(#616).@gadgets/bundled-blueprintsis reached only via the Workshop build inside the submodule's own install. Both lockfiles install--frozen-lockfile.Compat flags newly defaulted by 2026-02-02 → 2026-09-04 (upstream Workers only)
fetch_iterable_type_support,delete_all_deletes_alarm,text_decoder_replace_surrogates,text_decoder_cjk_decoder,unhandled_rejection_after_microtask_checkpoint,websocket_close_reason_byte_limit,queue_expose_error_codes,websocket_standard_binary_type,encoder_stream_spec_compliant_backpressure,writable_stream_spec_compliant_writer,web_socket_auto_reply_to_close,enhanced_error_serialization,diagnostics_channel_has_subscribers_getter,throw_on_not_implemented_tls_options,nodejs_compat+nodejs_compat_v2(2026-08-04: now implicit on the Router and every upstream Gatekeeper), plus Python/Workflows/Containers-only flags. This is the date upstream tests at.Derived-config diff summary
Generated by calling each tree's own
generateConfigs()with its own base configs (old: a clean export ofce7c13ewith6478a14; new: this branch), normalized to sorted keys, with the account ID, Access issuer/audience and admins redacted. Nothing generated was committed.stelaxis-os-routercompatibility_date2026-02-02 → 2026-09-04 ($schemadropped)stelaxis-os-workshopenhanced_error_serialization(default-on); migrations +v3UserDirectoryDurableObject. Bindings and vars are identical: all 9GATEKEEPER_*+ERROR_REPORTERservices with the same entrypoints/props,WORKERS_AI,BROWSER,LOADER, KV/R2,ADMINS,CF_ACCESS_*,PUBLIC_BASE_URL,CF_AI_GATEWAY*.stelaxis-os-context,stelaxis-os-scheduler,stelaxis-os-slack,stelaxis-os-mcp-portalstelaxis-os-githubv1GitHubHookDriverstelaxis-os-google+ ai.binding = "AI"; migrations +v4GoogleDriveGatekeeperImpl,GoogleDocGatekeeperImpl;v5GoogleChatGatekeeperImpl;v6ChatHookDriver;v7GmailHookDriver;v8GoogleSlidesGatekeeperImplstelaxis-os-gatekeeper,stelaxis-os-book,stelaxis-os-error-reporterbuildCommands()pnpm check's dry-run binding tables confirmenv.AIon Google and the unchanged Workshop binding set. Every non-Router Worker is stillworkers_dev: false,preview_urls: false, with no route.Migration plan
Durable Object and storage changes exist. They need specialist review before merge (operator skill: hard stop on migration or irreversible data change). Inventory re-audited across every storage owner this deployment runs: the Workshop's DOs plus BLUEPRINTS/AVATARS KV and BLUEPRINT_CONTENT R2; Context's DOs and KV; Scheduler, GitHub, Google, Slack and MCP Portal DOs; Custom, Book and Error Reporter.
Rollout plan
The deploy uploads the Gatekeepers, then the Workshop, then the Router, one at a time. Old and new versions are not compatible across that boundary, in either direction, so treat the deploy as a controlled interruption: a short announced maintenance window, not a zero-downtime rollout. No compatibility bridge was built, and the deploy order is unchanged.
What breaks while versions are mixed (each confirmed in source; not claimed exhaustive):
applyAction(record.action). The new validated Gatekeepers require a secondRpcStub<GitCache>, and capnweb-validate refuses a missing required parameter. Calendar, Chat, Drive, BigQuery, Slack, MCP Portal, Context and Scheduler still take one argument.workshop-backend/src/overseer.ts@6478a14:2676;gatekeeper-github/src/github.ts:3997,gatekeeper-google/src/gmail.ts:4910,google.ts:1943,sheets.ts:253,slides.ts:193(all@validateRpc()classes); capnweb-validate README "Missing required parameter / property: Refused"AppUiContext { isAdmin }; the new type requiresuserSelectionExchange, which the validated account entrypoints check.workshop-backend/src/user.ts@6478a14:1364;workshop-shared/src/gatekeeper.ts:174-184;gatekeeper-context/src/library-gatekeeper.ts:150,gatekeeper-scheduler/src/scheduler.ts:340,packages/gatekeeper-book/src/book.ts:325complete()now returns aConnectHandoff, andreconnectComplete()doesn't exist on the old Workshop's callback.subscribeToCode()/updateCode(). Unsaved edits in an open editor are lost.What stays broken after the deploy completes unless someone acts (not a window effect):
team:read(and, for threads, the:readscopes).Operator checklist:
Before the window
team:read,channels:read,channels:history,groups:read,groups:history,im:read,im:history,mpim:read,mpim:history,search:readandusers:readmust be present, or users cannot consent to what narrow grants now need. An app set up per docs/customization.md#slack already has them, since the scope union is unchanged; add any that are missing./adminchanges below. Pick a time when the deployment is idle.During the window
CLOUDFLARE_API_TOKEN, a missing secret, a transient API error). Then re-run that same run:gh run rerun <run-id> --repo stelaxis/company-os, or "Re-run jobs" in the Actions UI. A re-run reuses the original commit, rebuilds all 11 Workers and re-uploads them, and Wrangler skips Durable Object migrations already applied. Check the deployed commit withgh run view <run-id> --json headShaagainst the merge commit. Don't use "Run workflow" (workflow_dispatch) for this:deploy.ymlchecks out without a pinned ref, so a dispatch deploys whatevermainpoints to now. That's only right for a reviewed forward-fix commit merged tomainbecause the failure was in the code. Thedeploy-productionconcurrency group queues a run behind one still in progress rather than overlapping it.After the deploy, before reopening (with the owners of any leftover actions and one designated Slack Conversation/Thread-only user taking part)
/adminGoogle decisions (Chat, Drive, Slides; Sheets is now read-write) from Before merging.gmail.ts:4930-4933; the source states no further reason). These set state rather than add content, so check the thread's current state, reject, and re-queue or do it by hand only if it is still wanted.Before merging
Required for the deploy to succeed: none. No new required secret (the three
CLIENT_ID/CLIENT_SECRETpairs, for GitHub, Google and Slack, and the Book'sGITHUB_TOKENare unchanged). No new var, KV, R2 or queue, no Access or DNS change, and no AI Gateway token (providers staycloudflare,anthropicin-account). The CI token needs no new scope: the Google Worker's newAIbinding is the same binding type the Workshop already deploys.Decisions and actions an operator should take before merging, because merge = deploy:
BLUEPRINTS/AVATARS/CONTEXT_COLLECTIONSKV and theBLUEPRINT_CONTENTR2 bucket first, read-only.team:readand the four:readconversation scopes (checklist step 1 in Rollout plan). This is the only pre-deploy change outside this repository that may be needed, and only if the app was set up with fewer scopes than our docs list./adminright after the deploy, before the window closes (the new resource patterns exist only once the new Worker is live): keep or disable Google Chat (send/edit/react with approval, and starting DMs), Drive (drive.readonly), Slides, and note that Sheets is now read-write. Also tell users that existing Google Sheets connections will ask for re-consent.wrangler deployments list --name <worker>): anywrangler secret putsince 2026-08-28 created a newer version that this PR could not see.Rollback matrix
Previous wrapper commit
ce7c13ewith gitlink6478a14. Version IDs are the "Current Version ID" each Worker reported in the last production deploy, run 33158419430 ofce7c13eon 2026-08-28. They could not be re-read live: Wrangler's OAuth token here has expired and noCLOUDFLARE_API_TOKENis set.Summary. Only the Error Reporter rolls back cleanly. Scheduler, Custom and Book can be rolled back but stay degraded against the new Workshop. Router, Context, Slack and MCP Portal are allowed by the platform but unsafe. Workshop, GitHub and Google are refused by Cloudflare (Durable Object class lifecycle change). Recovery for the unsafe and refused Workers is forward-repair.
stelaxis-os-error-reporter80017a6c-2c9c-4c03-869d-4da4136d6463wrangler rollback; contract unchangedstelaxis-os-context4acda9c5-5d11-494a-a122-2d7c63d8d505aclVersion0→1 + owner grants; byte bodies;{ id }library rows{ id }library rows, and ignores grants. RPC: the old validatedgetAgentCatalog(authorizer)declares a required parameter the new Workshop no longer passes, so it is refused every turn. → forward-repairstelaxis-os-scheduler979863e6-f3b6-4e1e-a47d-c9a148c5dbe2schemaVersion1)@validateRpc()SchedulerGatekeeper.getAgentCatalog(_authorizer)declares a required parameter, so the new Workshop's no-argument call is refused, with a handledoverseer.catalog-fallbackreport every chat turn. Short-term measure only.stelaxis-os-githubc69c7391-c26c-43e3-a2cb-911fbb7860e7GitHubHookDriver; credential layout migrated, legacy keys deletedaccessToken) → forward-repair onlystelaxis-os-google8f0fb8b1-9862-4d19-91c1-7fa991799f33AIbinding/admindisabledResourcesstelaxis-os-slackf819a180-575a-4099-9150-e6d8bbe00878boundTeamId); narrow grants need wider scopesstelaxis-os-gatekeeper(custom)a43e6369-3145-46e0-a4cb-92fd24ca445dgetAgentCatalog→ a handled issue report every chat turnstelaxis-os-bookc10ce875-1bcc-4917-baad-5a770f8544a2stelaxis-os-mcp-portal5c3482ab-ea03-40d9-8666-04219a32354cstelaxis-os-workshop4188d9e5-fcbe-44c8-9a98-bcb634b742fcstelaxis-os-router614b9b0b-1f45-4759-9c0d-de706449043csubscribeToCode()/updateCode(), so the editor can't load or save against the new Workshop → forward-repairA Worker version is its code, static assets, bindings and compatibility settings, so a rollback restores that version's binding configuration. It does not restore KV, R2, D1 or Durable Object contents ("not tracked with versions"), or anything outside the Worker such as Access policies and DNS.
wrangler secret putcreates a new version, so check secret names after any rollback rather than assuming either way. After any recovery, repeat the full Access,/admin, storage, Gatekeeper, AI, Reporter and logs verification (operator skill §11).Verification
Run in
company-os-worktrees/bump-cloudflare-osafter deleting everynode_modulesin the worktree, in CI's order. Node 26.9.0, pnpm 11.17.0.pnpm install --frozen-lockfilepnpm --dir cloudflare-os install --frozen-lockfilepnpm lintvp lint: 0 errors, 2 warnings (pre-existing, configuredwarn);tsc -p scripts/tsconfig.json: pass;vp run -r --cache build: 5/5 tasks (tscin workshop-shared, error-reporting, error-reporter, custom-gatekeeper, gatekeeper-book)pnpm testnode --test 'scripts/**/*.test.ts': 37 test cases, 37 passed (file set:scripts/deploy.test.ts).vp run … test(vitest test cases):@gadgets/error-reporting23 (1 file),custom-gatekeeper2 (1 file),error-reporter2 (1 file),gatekeeper-book28 (2 files)pnpm checkvp run --no-cachebuilds;wrangler deploy --dry-runfor all 11 Workers (11 × "--dry-run: exiting now", nothing uploaded); generatedwrangler.prod.jsoncfiles removed (0 left);pnpm-lock.yamlunchanged (sha256)pnpm --dir cloudflare-os exec vp run -F @gadgets/workshop-shared -F @gadgets/error-reporting --no-cache buildtsc)pnpm --dir cloudflare-os exec vp run -F @gadgets/error-reporting -F @gadgets/router -F @gadgets/workshop-backend --no-cache testgit-migration*.test.ts); workshop-backend integration 3 passed, 4 skipped (hard-codeddescribe.skipupstream,open-gadget-rpc.test.ts:87)diff(this repo vs submodule)vp linton a clean export ofce7c13e+6478a14, its own frozen lockfilepnpm lint, re-run after each docs-only commit (860e04c,bb78db7)tsc -p scripts/tsconfig.jsonpass; 5/5 buildsNot run: any mutating Cloudflare command, any deploy, and live
wrangler deployments list/versions list(Wrangler is not authenticated: "Your auth token has expired and could not be refreshed, and the environment is non-interactive").Top risks for the production upgrade
{ id }library rows, ACL grants), and GitHub credentials. Rollback is blocked by Cloudflare (DO lifecycle) and by data. Mitigation: specialist review, KV/R2 export, post-migration validation on the oldest workspaces and on existing Context collections first.gh run rerunon the failed run). Stale browser tabs stay broken until reloaded.drive.readonly), Slides, Sheets read-write, all offered to every user until disabled in/admin; plus Sheets re-consent for existing users.nodejs_compatanddelete_all_deletes_alarm. That's upstream's tested baseline, but these defaults are new to this deployment.