release: version packages - #103
Open
github-actions[bot] wants to merge 1 commit into
Open
Conversation
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ✅ Deployment successful! View logs |
anchorage-showcase-single-tenant | 07c54ee | Sep 03 2026, 12:49 PM |
github-actions
Bot
force-pushed
the
changeset-release/dev
branch
from
September 3, 2026 12:47
69dbd54 to
07c54ee
Compare
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.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and publish to npm yourself or setup this action to publish automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to dev, this PR will be updated.
Releases
@proofoftech/fleet-control@0.5.0
Minor Changes
8ae28bf: Add token-driven bounded no-export cleanup with durable operation-keyed terminal receipts.
advanceCleanupDeployment()performs at most one bounded scan chunk or one action group per call; the terminal call persists an immutable receipt, releases the deployment's ownership claims, and deletes the fleet row in one D1 batch. Receipts survive same-key reprovisioning and force decommission; read them withreadCleanupReceipt()and garbage-collect them explicitly withpruneCleanupReceipts()(database-time cutoff, stable order, limit 1..1,000).cleanupDeploymentArtifacts()and the default failed-provision rollback drain this engine on capable stacks.application-resources-deployedthroughmaintenance-armed, and rows with external staging evidence now refuse toward export-backed decommissioning; trusted plain deployments keep no-export cleanup throughworker-deployed.cleanup-advancing.provisionDeployment()refuses to resume it with a fixed redirect to cleanup; complete the cleanup (receipt) and reprovision fresh. Previously the row kept its provisioning phase and could be retried as provisioning.deleteReleasingClaimsdeletes the row and leaves claims for later reconciliation. Force does not delete the ordinary Worker script or application R2, so do not reprovision the same names until residual physical resources are confirmed removed; provisioning fails closed on ownership mismatch.auditFleetDrift()treats a deployment under active bounded cleanup as its own reconciliation authority: no expectation-based, orphan, or record-level findings (includingincomplete-provisioning) while the cleanup intent is active.Add
ProvisionDeploymentOptions.failureCleanup: 'drain' | 'bounded'(default'drain'); with'bounded'the rollback performs at most one bounded advance and surfaces the resumable outcome through the newProvisioningError.cleanupfield.36a4b7c: Add token-driven bounded normal decommissioning for at-least-once control-plane Worker workflows. Fleet D1 owns scan progress. Each call performs at most one bounded scan chunk; only an exact matching verify may immediately consume that result through its single same-lease resource action. Other calls perform at most one lifecycle or resource action group.
Persist an immutable database-export receipt authority before the first D1 scan or export. Retries after artifact commit or Fleet state-write loss converge on the same filesystem or R2 receipt; authority changes and byte collisions preserve the committed winner and fail closed. Custom bounded backends must expose the paired receipt authority and export capability. Queue-driven bounded decommissioning requires Workers Paid because its bounded multi-R2 read groups can exceed the Free plan external-subrequest limit.
Add a root-only bounded backend-switch advance API that uses the same durable token and receipt guarantees. It binds teardown to one immutable switch snapshot and captured entry subphase, advances at most one release, R2 resource, scan chunk, or D1 action group per call, and preserves legacy recovery after a shell-less deployment reaches export authorization. A pending ordinary Worker requires lossless exact-version inspection, authoritative secret-name inventory, and its persisted Durable Object namespace identities. Custom switch providers must expose the bounded scan, receipt, database, residual, delete, and conditional pending-artifact inspection capabilities required by the durable state they resume.
d9f864f: Add a bounded, resumable fleet drift audit API with a durable, provider-neutral operation store.
advanceFleetAudit()performs at most one bounded stage chunk per call — one global-stage slice of up tomaxItemsPerCallitems (1..2,000, default 500), or exactly one Fleet record's inspection and re-arm — against aFleetOperationStore;D1FleetOperationStoreimplements that port over the existing Fleet D1 binding with account-and-kind-scoped leases, lease-fenced guarded batches, and audit generation pinning. Callstartwith an operation id, the audited records, andstaleAfterMs, then re-enqueue only the pending token each call returns. Start requires at most 10,000 records whose canonical bytes total at most 16 MiB, with each record within the 96 KiB staged-row byte bound and the per-record structure bounds: plain JSON data (noundefined-valued properties, dates, class instances, or cycles) within depth 64, 8,192 nodes, and 4 KiB per string value or object key. Every record must satisfy the deployment identifier grammar, and an explicit generation must be a positive safe integer. Every such refusal has a fixed message and precedes every durable effect. ThestaleAfterMsand operation-id refusals also occur before the lease; after the lease row is written, the foreign-kind, no-finalized-generation, andauditClock-sample refusals write nothing else. These accepted inputs are intentionally narrower thanauditFleetDrift(), which does not require that identifier grammar, an explicit generation, or the bounded path's row and structure bounds. Read the findings back page by page withreadFleetAuditFindingsPage()once the operation is terminal;abandonFleetAuditOperation()unblocks a stuck running operation and releases any pin an already-terminal one still holds.auditFleetDrift()keeps its exact signature, refusal message, finding vocabulary, finding order, provider interaction order, return value, and stop behavior. It now drains the same decomposed stages in memory, and a frozen golden baseline (findings and the full store/backend/resolver call log) pins all of that.maintenance-stalecomposition durably record a fixed template alone; any finding detail, composed by the engine or passed through from the pinned inventory generation, that fails a non-throwing credential-substring and control-byte gate persists a fixed withheld-detail fallback instead of aborting the operation.@proofoftech/fleet-controlR3 inventory generation and keeps it through completion, so a finding page stays interpretable against the exact generation it was computed from; only explicit result garbage collection, terminal failure, or abandonment releases it. A replayed start never re-resolves "latest": it reuses the persisted generation.emission-bound-exceededreason, and releases the pin. One record's whole per-call emission set (its findings plus the cross-record ownership facts it newly claims) must also fit inside the one guarded D1 batch itsper-recordcall commits — a ceiling of 99 rows. A record whose live inspection alone would approach that ceiling fails with the same reason rather than emitting a partial finding set.maintenance-stalefinding persists one of the six fixed detail-template families where the drain composes the raw diagnostic; any unsafe finding detail, composed or passed through, becomes the fixed withheld-detail fallback; concurrent mutation can cause either a re-arm refusal on a Fleet reread mismatch or inspection-derived findings against later provider truth, with the bounded path's typically older snapshot making both more likely; andemission-bound-exceeded(from the staged-row envelope or the 99-row ceiling) andgeneration-unavailableare terminal whole-operation failures with no drain counterpart, whileauditFleetDrift()completes and returns its full finding array over the identical world and clocks. Every other output is proven byte-for-byte equivalent to the drain under identical frozen worlds and clocks.recordrows; a record-processingper-recordcall additionally re-pages the accumulatedfactrows. Each stage-running call also structurally re-parses every accumulatedrecordrow through three plain-data traversals.findingrows are never re-paged. A stale token, astart, and afinalizecall read neither. The complete aggregate cost of one bounded audit spans1 + records + Σ max(1, ⌈source_i / maxItemsPerCall⌉)stage-running calls: one per-record-to-finalize transition, one processing call per record, and at least one call per global source. Every such call re-reads O(G) generation rows and re-pages and structurally re-parses O(R) accumulatedrecordrows; a record-processingper-recordcall additionally re-pages accumulatedfactrows. In the records-dominated case, this is O(records) full generation re-reads, O(records²/1,000) accumulated-row page reads, O(records²) billed rows read, and O(records²) structuralFleetRecordre-parses at three plain-data traversals each, the dominant CPU term. This checkpoint's in-memory suite measured about 0.25 ms per record-row re-parse per call: one per-record call over 1,001 accumulated rows took roughly 0.5 s in fix 7, and a 1,200-record full drain took roughly 122 s in fix 6. A late per-record call at the 10,000-record ceiling therefore spends seconds of isolate CPU re-parsing before its provider work. The per-call guarantee covers bounded provider work and bounded emission, not bounded CPU or bounded rows read. See the fleet control guide for the full envelope.No existing public export changes shape, and the Worker subpath is unchanged.
2600c07: Add a bounded, resumable account inventory API with durable generations.
advanceFleetInventory()performs at most one provider stage chunk per call against aFleetInventoryRunStore;D1FleetInventoryRunStoreimplements that port over the existing Fleet D1 binding with operation-keyed runs, lease-fenced guarded batches, generation pinning, and bounded garbage collection. Build the provider seam withcloudflareFleetInventoryContext(client), callstartwith an operation id, then re-enqueue only the pending token each call returns. The final call returns aFleetInventoryGenerationRef; read the rows back as today'sFleetResourceInventorywithreadFleetInventoryGeneration(). Budgets are caller-supplied and validated:maxProviderRequests9..1,000 andmaxStagedRowsPerChunk1..2,000 (default 500).collectFleetInventory()keeps its exact signature, refusal message, provider encounter order, finding vocabulary, finding order, and result bytes. It now drains the same engine in memory, and a frozen golden baseline pins all of that. The one exception is the scale limit below.collectFleetInventory()is now subject to the samemaxProviderRequestsbound as a bounded run, capped at 1,000 per stage chunk, and six stages carry no resumption cursor so they must finish in one chunk. An account whose largest such stage needs more than 1,000 provider operations — in practice roughly 1,000 prefix-matching plain Workers, whichroute-claimsreaches first — now rejects withfleet inventory stage '<stage>' cannot complete one chunk within its provider request budgetinstead of returning an inventory, where the previous single-pass enumeration completed under the 10,000-item collection bound. Nothing is written and no partial result is returned. There is deliberately no unbounded mode; narrowscriptNamePrefixto split such an account. See the fleet control guide for the stage list and the arithmetic.CollectFleetInventoryOptions. The shape is identical, so this is not a break.registered script '<name>' could not be inspectedandplain Worker '<name>' could not be inventoried. The transient text stays call-local, socollectFleetInventory()still returns today's exact bytes while a persisted row carries no provider text.malformed-script-registrationfinding naming the key by its listing ordinal rather than by its bytes. That finding is positionally attributable but does not carry the offending name.collectFleetInventory()has always given.inventoryBoundExceededis consolidated intocloudflare-client-config.tsand shared by both provider modules. The refusal messages are byte-identical.No existing public export changes shape, and the Worker subpath is unchanged.
bb9291c: Add
CloudflareApiPlainWorkerBackend, a direct Cloudflare API backend for platform-authored ordinary Workers. Its adapter classifies each mutation's dispatch under the operation's own execution context, so a queued mutation's pre-dispatch failure rejects instead of resolving{ status: 'failed' }. Construct it with a plain-onlyCloudflareProvisioningClient. Configure that client with a shared rate coordinator and a durable export store. The existing Wrangler and Workers for Platforms backends keep their public provisioning contracts.Expose the configured provider request timeout through the public
CloudflareProvisioningClient.requestTimeoutMsgetter.Harden provider behavior across the built-in backends:
CLOUDFLARE_LOGrequests verbose output.PlainWorkerBackend.identityCallervalues that are not printable, single-line ASCII tokens from 1 through 128 characters.When upgrading, construct direct ordinary-Worker clients with
plane: 'plain-worker'and nodispatchNamespace. KeepdispatchNamespaceon Workers for Platforms clients, provide one quota coordinator across every replica sharing a provider token, and ensure the token can complete the documented attachment scans before destructive teardown.224421b:
PlainWorkerProvisioningApi.listDatabasesaccepts an optional name filter. The direct Cloudflare API adapter forwards it as the D1 list query and the Wrangler adapter filters its parsed inventory locally;PlainWorkerBackend.findDatabasepasses the deployment's database name and keeps its exact-name comparison and its duplicate-name and missing-UUID refusals.cfcd24c: Export the shared
PlainWorkerBackend, itsPlainWorkerProvisioningApiport, and the port's ordinary-Worker record types. Port adapters must verify database exports independently against the durable store's committed size and digest.WranglerLoopBackendnow extends this core while retaining the same constructor options and provisioning members.Harden ordinary-Worker provisioning and teardown:
Provider-neutral error messages now describe plain-Worker and provider operations instead of Wrangler. Error-message text compatibility is not claimed by this release.
When upgrading, consumers that matched
deployWorkerrejections by identity or message text should catchWorkerDeploymentErrorand readcreatedByAttemptandresourceState.Patch Changes
FileSystemDatabaseExportStore.writeno longer awaits the reader's cancel in its failure cleanup. When the body is atee()branch, that cancel settles when the tee source is exhausted or errors, or the other branch is cancelled, so a write refused by the store's own checks held its rejection and its temporary file until then, and held both indefinitely when nothing drove the source. It now rejects with the store's error and removes the file without awaiting the cancel.@proofoftech/flowsafe@0.20.1
Patch Changes
flowsafe-provisionsets a 64 MiBmaxBufferon thewrangler d1 execute --jsonchild process whose output it parses. Node's default is 1 MiB counted across the captured stdout and stderr together, so a response past that was truncated and the run surfaced asfailed to execute Wrangler 4with anENOBUFScause instead of the parsed rows.anchorage-agent-starter@0.0.17
Patch Changes
showcase@0.0.23
Patch Changes