Forge did not yet achieve the requested drastic release-system simplification. The core per-project boundary remains sound:
main event
-> affected-project production build
-> immutable ready Worker version
-> one project publication lane
-> expected-current publish
-> generic health
-> receipt or guarded restoreHowever, a small ProductionDeployer is insufficient if the surrounding system retains or recreates controller behavior. Complexity has migrated into the builder, provider broker, private host lifecycle, bootstrap, synthetic preview validation, merge handoff, evidence records, token sharing, and legacy command and schema surfaces.
The goal is not to make each of those subsystems robust. The goal is to delete most of them and leave one obvious normal lifecycle.
The private host needs one provider deployment before its Durable Object and container are usable. That is acceptable only as immutable build preparation: one attempt-derived Worker, one version, one deployment, forever. Forge must never change traffic among versions of that host, persist a current-host pointer, or give ProductionDeployer host rollback behavior. Any host change creates a new host identity and a new stable Worker version.
Cloudflare intentionally pairs Beta Worker/Version resources with the existing script-name Deployment API. The builder must preserve this exact join:
immutable Worker UUID
-> exact attempt-derived current Worker name
-> immutable version UUID owned by that Worker
-> explicit deployment under that exact nameBefore deployment, read the UUID and exact name again. After deployment, prove the deployed version belongs to that Worker UUID. Name lookup must never replace the UUID as root identity.
Converting a Wrangler multipart dry run to Beta JSON can silently drop generated
chunks, WASM, text/data blobs, assets, or other module types. Either the runner
host is explicitly restricted to exactly one module and fails on every other
part, or the converter copies every emitted part deterministically. Synthetic
export default {} tests are insufficient; test the real compiled host output.
A path-shaped allowlist for /workers/workers/{uuid}/versions is not enough.
Before forwarding a version mutation, the broker must prove the signed build
attempt owns the attempt-derived name and provider truth maps that exact name to
the requested UUID. Otherwise a compromised builder can upload to another
account Worker with a syntactically valid UUID.
An immutable dispatch claim plus one bounded provider readback is appropriate. Durable phases that later resume Worker creation, version upload, host deployment, application creation, or readiness are not. Evidence may survive; execution resumption must not. A mismatching, partial, or unresolved artifact fails that attempt rather than entering a repair lifecycle.
Pure identity, request-construction, and readback functions may be shared. Operational orchestration must not be. After the cutover window, delete or make the bootstrap unconditionally inert. It must not remain callable for arbitrary future generations or become the practical repair path whenever normal builds fail.
Shared code is safe; shared authority is not. Preview must use distinct account or resource namespaces, tokens, registry paths, application names, Durable Object namespaces, evidence, and publication surfaces. A preview-controlled request must be structurally unable to name a production resource.
Commands and schemas such as release enqueue, release attempt, global
components, and a global receipt preserve the legacy mental model even when
fields are empty. The merge queue should do only preview validation and a main
CAS. Its output is a merged main generation. Independent project builds begin
from the ordinary main event afterward. Remove legacy-empty fields rather than
keeping compatibility schema.
A validation event must link durably to exact Platform CI and Platform Preview
run IDs. A request stuck in validating with empty evidence is a delivery defect,
not permission to seed a generation or wake a controller. Repair only the
idempotent event-to-workflow handoff. Validation events and real main events
must have explicit different kinds; ref-name pattern inference is insufficient.
Main is independent of production provider readiness, production build success, and publication. Main may still require complete PR preview validation. This distinction must remain explicit so a preview outage is not “repaired” by making main wait for production or by silently dropping preview requirements.
Affected projects should be computed at the main CAS, where prior and new main SHAs are both authoritative, and persisted as immutable build requests. A history-free production builder must consume those requests; it must not rediscover impact from local Git history or reconstruct a cumulative production baseline.
The surviving rule should be newest successful eligible ready deployment per project. A newer requested or failed-before-ready build must not permanently block an older ready generation. A newer ready row wins. Once a generation publishes, all lower generations are permanently below the published floor. Finishing last never wins.
The lane must compare the immediate current deployment ID and its exact 100% version ID. A restore creates a new deployment selecting the historical prior version. Receipts explain observed provider truth; they must not become a D1 active pointer.
Edge /health/dependencies is useful public behavior evidence, but it cannot be
the sole proof of an independently deployed downstream Worker. The publisher
must first read the exact Cloudflare deployment, version, and bindings directly.
Project manifests may declare generic direct health, dependency health, and
public behavior probes without feature-name heuristics.
Builder, deployer, preview, migration operator, and runtime must have upstream Cloudflare permissions that are actually disjoint. Internal URL allowlists are defense in depth, not least-privilege evidence. Prove separation with one forbidden upstream operation per token role.
Prefer immutable, digest-linked records:
image receipt
private-host receipt
application receipt
stable-version ready evidence
publication attempt
terminal publication receiptDo not update one artifact-set mega-row from image build through publication. That is another state machine and weakens forensic evidence.
API documentation and local tests prove only the intended request contract. Until a disposable real-provider proof succeeds, status is “implemented locally, provider contract unverified.” Never call the host ready based on fixtures or Wrangler output.
The release-system merge can prove preview, main, and builder mechanics. It does not count as Better Auth plus NOMOREGIT or either of the two independent product feature proofs. Those must traverse the already-live ordinary path afterward.
Close obsolete release-system PRs. Held product and migration PRs must be rebased and reviewed against current main and live schema before enqueue. No pre-cutover candidate metadata, controller attempt, or old queue entry may become runnable merely because validation delivery starts working.
Historical documents and open PR bodies disagree about whether migrations 0024 and 0025 are applied. Live D1 ledger, exact DDL, integrity checks, and protected row counts are authoritative. Never apply, adopt, or replay a migration from a stale checklist. Preserve product data; delete release authority separately.
The future system should contain only:
Delete or make unreachable:
The repeated mistake was not insufficient safety. It was applying safety to too many durable operational units. Each ambiguity acquired a claim, phase, reconciliation rule, or recovery path until the surrounding system behaved like the controller it was meant to replace.
The next implementation should be judged primarily by deletion count and the number of authorities that cease to exist—not by how robustly another bootstrap or broker workflow can resume.