rcf-lite 0.22.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/bin/rcf.js +13 -2
  3. package/blueprints/application-account-settings/docs/topics.md +2 -0
  4. package/blueprints/application-admin-console/docs/topics.md +2 -0
  5. package/blueprints/application-api-rest/docs/topics.md +2 -0
  6. package/blueprints/application-charts/docs/topics.md +2 -0
  7. package/blueprints/application-dashboard/docs/topics.md +2 -0
  8. package/blueprints/application-datatable/docs/topics.md +2 -0
  9. package/blueprints/application-empty-error-states/docs/topics.md +2 -0
  10. package/blueprints/application-error-handling/docs/topics.md +2 -0
  11. package/blueprints/application-file-upload/docs/topics.md +2 -0
  12. package/blueprints/application-forms-wizard/docs/topics.md +2 -0
  13. package/blueprints/application-notifications-in-app/docs/topics.md +2 -0
  14. package/blueprints/application-onboarding-tour/docs/topics.md +2 -0
  15. package/blueprints/application-spa/docs/topics.md +3 -1
  16. package/blueprints/delivery-ci-workflows/docs/topics.md +2 -0
  17. package/blueprints/deploy-cloudflare-workers/CHANGELOG.md +69 -0
  18. package/blueprints/deploy-cloudflare-workers/README.md +12 -0
  19. package/blueprints/deploy-cloudflare-workers/blueprint.json +234 -36
  20. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1306-deploy-cloudflare-workers-spa-shape.json +30 -0
  21. package/blueprints/deploy-cloudflare-workers/contributions/probes/assets-manifest-scan.mjs +207 -0
  22. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-013.json +18 -0
  23. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-014.json +18 -0
  24. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12113.json +36 -0
  25. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12114.json +27 -0
  26. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12115.json +27 -0
  27. package/blueprints/deploy-cloudflare-workers/docs/topics.md +3 -1
  28. package/blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md +25 -0
  29. package/blueprints/email-smtp-resend/docs/topics.md +2 -0
  30. package/blueprints/jobs-background/CHANGELOG.md +16 -0
  31. package/blueprints/jobs-background/README.md +105 -0
  32. package/blueprints/jobs-background/blueprint.json +149 -0
  33. package/blueprints/jobs-background/contributions/adrs/adr-3101-jobs-background-model.json +27 -0
  34. package/blueprints/jobs-background/contributions/adrs/adr-3102-jobs-background-scheduler-mode.json +25 -0
  35. package/blueprints/jobs-background/contributions/adrs/adr-3103-jobs-background-requires-applied-capabilities.json +25 -0
  36. package/blueprints/jobs-background/contributions/adrs/adr-3104-jobs-background-timeout-floor.json +25 -0
  37. package/blueprints/jobs-background/contributions/probes/apply-time-override.mjs +95 -0
  38. package/blueprints/jobs-background/contributions/probes/apply-time-refusal.mjs +82 -0
  39. package/blueprints/jobs-background/contributions/probes/event-secrecy.mjs +69 -0
  40. package/blueprints/jobs-background/contributions/probes/fake-clock-cron.mjs +65 -0
  41. package/blueprints/jobs-background/contributions/probes/probe-utils.mjs +91 -0
  42. package/blueprints/jobs-background/contributions/probes/retry-and-fail.mjs +65 -0
  43. package/blueprints/jobs-background/contributions/probes/run-apply-time-override.mjs +10 -0
  44. package/blueprints/jobs-background/contributions/probes/run-apply-time-refusal.mjs +11 -0
  45. package/blueprints/jobs-background/contributions/probes/run-event-secrecy.mjs +11 -0
  46. package/blueprints/jobs-background/contributions/probes/run-fake-clock-cron.mjs +11 -0
  47. package/blueprints/jobs-background/contributions/probes/run-retry-and-fail.mjs +11 -0
  48. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-001.json +18 -0
  49. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-002.json +18 -0
  50. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-003.json +18 -0
  51. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-004.json +18 -0
  52. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-005.json +18 -0
  53. package/blueprints/jobs-background/contributions/requirements/jobs-background-req-006.json +18 -0
  54. package/blueprints/jobs-background/contributions/tacs/tac-3101-jobs-background-job-definition.json +50 -0
  55. package/blueprints/jobs-background/contributions/tacs/tac-3102-jobs-background-scheduler.json +50 -0
  56. package/blueprints/jobs-background/contributions/tacs/tac-3103-jobs-background-run-log.json +49 -0
  57. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30101.json +25 -0
  58. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30102.json +25 -0
  59. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30103.json +25 -0
  60. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30104.json +25 -0
  61. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30105.json +25 -0
  62. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30106.json +25 -0
  63. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30107.json +25 -0
  64. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30108.json +25 -0
  65. package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30109.json +25 -0
  66. package/blueprints/jobs-background/docs/topics.md +62 -0
  67. package/blueprints/jobs-background/guide/jobs-background.md +147 -0
  68. package/blueprints/messaging-queue-cloudflare/CHANGELOG.md +15 -0
  69. package/blueprints/messaging-queue-cloudflare/README.md +125 -0
  70. package/blueprints/messaging-queue-cloudflare/blueprint.json +67 -0
  71. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3001-messaging-queue-cloudflare-adapter.json +30 -0
  72. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3002-messaging-queue-cloudflare-delivery-semantics.json +25 -0
  73. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3003-messaging-queue-cloudflare-max-attempts-floor.json +25 -0
  74. package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3004-messaging-queue-cloudflare-batch-defaults.json +25 -0
  75. package/blueprints/messaging-queue-cloudflare/contributions/probes/event-secrecy.mjs +137 -0
  76. package/blueprints/messaging-queue-cloudflare/contributions/probes/probe-utils.mjs +82 -0
  77. package/blueprints/messaging-queue-cloudflare/contributions/probes/producer-facade-ready.mjs +35 -0
  78. package/blueprints/messaging-queue-cloudflare/contributions/probes/publish-to-delivery.mjs +94 -0
  79. package/blueprints/messaging-queue-cloudflare/contributions/probes/real-account-concurrency-smoke.mjs +54 -0
  80. package/blueprints/messaging-queue-cloudflare/contributions/probes/retry-and-dlq.mjs +87 -0
  81. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-event-secrecy.mjs +5 -0
  82. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-producer-facade-ready.mjs +11 -0
  83. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-publish-to-delivery.mjs +5 -0
  84. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-real-account-concurrency-smoke.mjs +5 -0
  85. package/blueprints/messaging-queue-cloudflare/contributions/probes/run-retry-and-dlq.mjs +5 -0
  86. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-001.json +18 -0
  87. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-002.json +18 -0
  88. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-003.json +18 -0
  89. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-004.json +18 -0
  90. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-005.json +18 -0
  91. package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-006.json +18 -0
  92. package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3001-messaging-queue-cloudflare-producer-facade.json +56 -0
  93. package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3002-messaging-queue-cloudflare-consumer-registration.json +40 -0
  94. package/blueprints/messaging-queue-cloudflare/contributions/tacs/tac-3003-messaging-queue-cloudflare-event-sink.json +39 -0
  95. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29101.json +34 -0
  96. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29102.json +34 -0
  97. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29103.json +25 -0
  98. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29104.json +25 -0
  99. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29105.json +25 -0
  100. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29106.json +25 -0
  101. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29107.json +25 -0
  102. package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29108.json +25 -0
  103. package/blueprints/messaging-queue-cloudflare/docs/topics.md +62 -0
  104. package/blueprints/messaging-queue-cloudflare/guide/messaging-queue-cloudflare.md +110 -0
  105. package/blueprints/object-storage-s3/docs/topics.md +2 -0
  106. package/blueprints/observability-essentials/docs/topics.md +2 -0
  107. package/blueprints/observability-logging/docs/topics.md +2 -0
  108. package/blueprints/observability-probe-endpoints/docs/topics.md +2 -0
  109. package/blueprints/persistence-data-d1/docs/topics.md +2 -0
  110. package/blueprints/persistence-data-postgres/docs/topics.md +2 -0
  111. package/blueprints/persistence-data-sqlite/docs/topics.md +2 -0
  112. package/blueprints/security-auth-clerk/docs/topics.md +2 -0
  113. package/blueprints/security-auth-keycloak/docs/topics.md +2 -0
  114. package/blueprints/security-auth-magic-link/docs/topics.md +2 -0
  115. package/blueprints/security-auth-oauth2/docs/topics.md +2 -0
  116. package/blueprints/security-secrets-management/docs/topics.md +2 -0
  117. package/fixtures/canary-manifest.json +6 -6
  118. package/package.json +1 -1
  119. package/rcf/code-nodes/cn-206.json +14 -0
  120. package/rcf/code-nodes/cn-207.json +13 -0
  121. package/rcf/code-nodes/cn-208.json +14 -0
  122. package/rcf/code-nodes/cn-209.json +14 -0
  123. package/rcf/code-nodes/cn-210.json +13 -0
  124. package/rcf/code-nodes/cn-211.json +12 -0
  125. package/rcf/code-nodes/cn-212.json +12 -0
  126. package/rcf/code-nodes/cn-213.json +12 -0
  127. package/rcf/code-nodes/cn-214.json +15 -0
  128. package/rcf/code-nodes/cn-215.json +13 -0
  129. package/rcf/code-nodes/cn-216.json +14 -0
  130. package/rcf/code-nodes/cn-217.json +13 -0
  131. package/rcf/fbs/fbs-062.json +20 -0
  132. package/rcf/fbs/fbs-063.json +22 -0
  133. package/rcf/fbs/fbs-064.json +23 -0
  134. package/rcf/requirements/req-029.json +57 -0
  135. package/rcf/requirements/req-030.json +67 -0
  136. package/rcf/requirements/req-042.json +59 -0
  137. package/rcf/requirements/req-043.json +39 -0
  138. package/rcf/test-suites/ts-072.json +62 -0
  139. package/rcf/test-suites/ts-073.json +38 -0
  140. package/rcf/test-suites/ts-074.json +30 -0
  141. package/rcf/test-suites/ts-075.json +38 -0
  142. package/rcf/test-suites/ts-076.json +70 -0
  143. package/rcf/user-stories/us-2901.json +45 -0
  144. package/rcf/user-stories/us-2902.json +36 -0
  145. package/rcf/user-stories/us-3001.json +45 -0
  146. package/rcf/user-stories/us-4201.json +69 -0
  147. package/rcf/user-stories/us-4301.json +78 -0
  148. package/releases/releases.yaml +11 -1
  149. package/src/blueprint/apply.js +7 -4
  150. package/src/blueprint/capabilities.js +25 -0
  151. package/src/cli/blueprint.js +8 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,26 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.23.0] - 2026-09-07
10
+
11
+ rcf-lite 0.23.0 adds the infrastructure spine four blueprints wide: a Postgres store with a facade contract and forward-only migrations, an S3-shape object store with a Cloudflare R2 first adapter, a Cloudflare Queues producer and consumer with dead-letter semantics, and a background-jobs discipline that refuses to apply until a queue is applied. Each blueprint verifies against the real engine with node-only probes, and the four surfaces compose through the capability mechanism the round-3 admin console shipped.
12
+
13
+ ### Added
14
+
15
+ - **Round 5 T-1: `persistence-data-postgres` v1.0.0 on the shelf (PR #155).** Postgres facade as the sole reader of the `pg` client, numbered forward-only migrations with per-file transactions, prepared-statement discipline enforced by a source-tree AST scan, a transactional-atomicity helper, scheduled `pg_dump` recovery plus vendor point-in-time recovery, and a connection-pool posture per deploy target. Declares `capabilities: ["relationalStore"]`. Conflicts by design with `persistence-data-sqlite` and `persistence-data-d1` on `persistenceStore` and `migrationDiscipline`. Reserves the round-6 Hyperdrive adapter slot at the driver ADR boundary. Six probes drive `postgres:17-alpine` in the shared `packages/rcf-lite/test/fixtures/infra-postgres/` fixture; probe reports land under `.rcf/reports/blueprints/persistence-data-postgres/` and set the round-5 ship-time evidence precedent.
16
+ - **Round 5 T-2: `object-storage-s3` v1.0.0 on the shelf, with `security-secrets-management` 1.0.1 folded into the same PR (PR #157).** S3-API facade, Cloudflare R2 as the first adapter, MinIO as the local dev target, put, get, delete, list, a presigned-URL contract with a bounded TTL, multipart upload above an elicited threshold, and metadata-only lifecycle events. Refuses composition without `security-secrets-management` applied; the override `--allow-no-secrets-yet` records a note on `source.notes`. In the same PR, `security-secrets-management` bumps to 1.0.1 declaring `capabilities: ["secretsProvider"]` so the bare-project refusal fires end to end. Declares `capabilities: ["objectStorage"]`. Mints the new global topic `objectStorageContract`. Five probes run against MinIO plus one accountBound-skipped R2 smoke.
17
+ - **Round 5 T-3: `messaging-queue-cloudflare` v1.0.0 on the shelf (PR #159).** Producer facade, consumer registration on the Worker's `queue` handler, publish, consume, ack, retry with the attempt counter, dead-letter contract per Cloudflare Queues docs (default retries 3, DLQ 4-day retention), batch consume, and metadata-only lifecycle events. One blueprint, contract plus first adapter. Declares `capabilities: ["queue"]`. Mints the new global topic `deliverySemantics`. Reserved slug `messaging-queue-postgres` sibling documented, deferred pending demand. Five probes drive `wrangler dev` locally plus one accountBound-skipped concurrency smoke that runs against a real account when `CI_HAS_CLOUDFLARE_ACCOUNT` is set.
18
+ - **Round 5 T-4: `jobs-background` v1.0.0 on the shelf (PR #163).** Job-definition contract (name, handler, input schema, retry policy, timeout), scheduler contract (cron and one-shot delayed), retry contract on top of the applied queue, and a metadata-only job-run event log. Refuses to apply on a bare project with exit 3 and the stable message id `jobs-background-no-queue`; the `--allow-no-queue-yet` override records a note on `source.notes`. Declares `capabilities: ["backgroundJobs"]`. Mints the new global topic `backgroundJobModel`. Reserves the round-6 Workflows scheduler-mode slot at the ADR boundary. Five probes: apply-time refusal, apply-time override, fake-clock cron, retry-and-fail, event-secrecy.
19
+ - **Authoring standard capability table extended.** `packages/rcf-lite/docs/blueprint-authoring.md` section 6a gains four new rows: `relationalStore`, `objectStorage`, `queue`, `backgroundJobs`. Chunk-zero-style append, loader unchanged.
20
+
21
+ #### Also in this release
22
+
23
+ - **Round 6 T-0: `deploy-cloudflare-workers` v1.1.0 to v1.2.0 (PR #164).** Additive minor bump that blesses the Workers-with-static-assets shape as the SPA-on-Workers deploy shape. Adds two new elicits (`assets-directory`, `run-worker-first`), ADR-1306 carrying the verbatim Cloudflare Pages landing-page recommendation, the `cf-platform` shared sample-app fixture under `packages/rcf-lite/test/fixtures/cf-platform/`, and the `assets-manifest-scan` probe that parses the applied fixture wrangler.toml and asserts the `[assets]` block presence, `run_worker_first` presence and absence of the Pages-only `pages_build_output_dir` field. No capability minted, no new global topic, no runtime dependency added; the shipped v1.1.0 contribution set carries through unchanged.
24
+
25
+ ### Fixed
26
+
27
+ - **CLI stdout truncation on large outputs (PR #159).** `bin/rcf.js` now flushes stdout before `process.exit` at both exit sites. Previously, stdout was truncated at the 65536-byte pipe buffer on outputs past that size; first hit by `rcf audit coverage --format mermaid` on the umbrella tree.
28
+
9
29
  ## [0.22.0] - 2026-09-07
10
30
 
11
31
  rcf-lite 0.22.0 fills the visual shelf with five application blueprints (empty and error states, file upload with a WCAG keyboard gate, a multi-step forms wizard, a self-service account settings area, and a first-run onboarding tour). Account settings reuses the admin-console capability-gating mechanism, so the five settings surfaces only render when the applied auth blueprint declares the capability. The four shipped auth blueprints and the logging blueprint pick up additive capability declarations in the same release.
package/bin/rcf.js CHANGED
@@ -267,9 +267,20 @@ export function isSameEntryPoint(metaUrl, argvPath) {
267
267
  const isMain = process.argv[1] && isSameEntryPoint(import.meta.url, process.argv[1]);
268
268
  if (isMain) {
269
269
  main(process.argv.slice(2))
270
- .then((code) => process.exit(code))
270
+ .then((code) => {
271
+ // Await stdout drain before exit so large payloads (mermaid or
272
+ // JSON output above ~64KiB) are not truncated when a parent
273
+ // captures stdout via child_process execFile / spawn. process.exit
274
+ // otherwise races the OS pipe flush and drops the tail; the
275
+ // golden fixture tests hit this once the dogfood tree crosses
276
+ // the pipe buffer size. write('', cb) fires the callback once
277
+ // pending buffer flushes, then process.exit(code) tears down
278
+ // immediately - keeping the long-running mcp stdio subcommand
279
+ // path unchanged (mcp resolves once its own done promise fires).
280
+ process.stdout.write('', () => process.exit(code));
281
+ })
271
282
  .catch((err) => {
272
283
  process.stderr.write(`[rcf] unexpected failure: ${err.message}\n${err.stack}\n`);
273
- process.exit(1);
284
+ process.stdout.write('', () => process.exit(1));
274
285
  });
275
286
  }
@@ -27,6 +27,8 @@ The blueprint claims no new global topics at v1.0.0. Account-settings is a consu
27
27
  | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
28
28
  | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
29
29
  | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
30
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
31
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
30
32
 
31
33
  The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
32
34
 
@@ -27,6 +27,8 @@ The blueprint claims no new global topics at v1.0.0. The console is a consumer o
27
27
  | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
28
28
  | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
29
29
  | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
30
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
31
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
30
32
 
31
33
  The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
32
34
 
@@ -50,6 +50,8 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
50
50
  | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
51
51
  | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
52
52
  | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
53
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
54
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
53
55
 
54
56
  Suffix-family ids (ADR, TAC): SPA numbers in the 2xx range, this package takes 3xx (ADR-301 to ADR-308, TAC-301 to TAC-306); the next blueprint should take 4xx.
55
57
 
@@ -26,6 +26,8 @@ The blueprint claims no new global topics at v1.0.0. The chart-component contrac
26
26
  | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
27
27
  | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
28
28
  | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
29
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
30
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
29
31
 
30
32
  The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
31
33
 
@@ -26,6 +26,8 @@ The blueprint claims no new global topics at v1.0.0. The dashboard-shell contrac
26
26
  | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
27
27
  | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
28
28
  | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
29
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
30
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
29
31
 
30
32
  The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
31
33
 
@@ -25,6 +25,8 @@ The blueprint claims no new global topics at v1.0.0. The datatable shell is a ge
25
25
  | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
26
26
  | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
27
27
  | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
28
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
29
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
28
30
 
29
31
  The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
30
32
 
@@ -26,6 +26,8 @@ The blueprint claims no new global topics at v1.0.0. Every ADR (HTTP status cont
26
26
  | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
27
27
  | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
28
28
  | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
29
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
30
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
29
31
 
30
32
  The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
31
33
 
@@ -32,5 +32,7 @@
32
32
  | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
33
33
  | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
34
34
  | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
35
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
36
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
35
37
 
36
38
  The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
@@ -27,6 +27,8 @@ The blueprint claims no new global topics at v1.0.0. Every ADR (transport branch
27
27
  | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
28
28
  | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
29
29
  | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
30
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
31
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
30
32
 
31
33
  The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
32
34
 
@@ -26,6 +26,8 @@ The blueprint claims no new global topics at v1.0.0. Every ADR (navigation postu
26
26
  | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
27
27
  | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
28
28
  | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorage` |
29
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
30
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
29
31
 
30
32
  The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
31
33
 
@@ -29,6 +29,8 @@ The `application-notifications-` prefix is reserved for the sibling channel blue
29
29
  | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
30
30
  | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
31
31
  | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
32
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
33
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
32
34
  | application-notifications-email (reserved) | to be claimed at ship | to be claimed at ship | name-only doc reservation (not shipped) | tba |
33
35
  | application-notifications-push (reserved) | to be claimed at ship | to be claimed at ship | name-only doc reservation (not shipped) | tba |
34
36
  | application-notifications-webhook (reserved) | to be claimed at ship | to be claimed at ship | name-only doc reservation (not shipped) | tba |
@@ -25,6 +25,8 @@ The blueprint claims no new global topics at v1.0.0. Onboarding-tour is a consum
25
25
  | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
26
26
  | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
27
27
  | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
28
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
29
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
28
30
 
29
31
  The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
30
32
 
@@ -38,7 +38,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
38
38
  | security-auth-clerk | 9101-9899 | 10xx | shipped v1.0.0 | `authModel` |
39
39
  | security-auth-oauth2 | 10101-10899 | 11xx | shipped v1.0.0 | `authModel` |
40
40
  | security-auth-keycloak | 11101-11899 | 12xx | shipped v1.0.0 | `authModel` |
41
- | deploy-cloudflare-workers | 12101-12899 | 13xx | shipped v1.0.0 | `deploymentTarget` |
41
+ | deploy-cloudflare-workers | 12101-12899 | 13xx | shipped v1.2.0 | `deploymentTarget` |
42
42
  | persistence-data-d1 | 13101-13899 | 14xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
43
43
  | observability-probe-endpoints | 14101-14899 | 15xx | shipped v1.1.0 | `healthProbes`, `readinessSemantics` |
44
44
  | observability-logging | 15101-15899 | 16xx | shipped v1.0.0 | `logging` |
@@ -55,6 +55,8 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
55
55
  | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
56
56
  | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
57
57
  | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
58
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
59
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
58
60
 
59
61
  SPA v1.1.0 stays on the LOW end of its band: v1.0.0 occupied US-1101 through US-1128; v1.1.0 adds US-1129 and US-1130, leaving headroom above 1130 for future minor bumps and for project-side stories that mechanically derive to the 11xx numeric range.
60
62
 
@@ -61,6 +61,8 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
61
61
  | application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
62
62
  | persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
63
63
  | object-storage-s3 | 28101-28899 | 29xx | shipped v1.0.0 | `objectStorageContract` |
64
+ | messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
65
+ | jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
64
66
 
65
67
  US 6101-6110 sit at the LOW end of the 6101-6899 band on purpose. A project-side story that mechanically derives from `delivery-ci-workflows-REQ-011` into the number `6111` would collide against delivery-ci-workflows-US-6111 in this package; the band leaves headroom at the HIGH end (US 6181-6899) so a project's own stories anchored to delivery-ci-workflows REQs can allocate without conflict. The watchpost run4 lesson applies here too.
66
68
 
@@ -0,0 +1,69 @@
1
+ # Changelog
2
+
3
+ All notable changes to the `deploy-cloudflare-workers` blueprint are recorded here.
4
+ The format follows Keep a Changelog. Versions are semver, per
5
+ `packages/rcf-lite/docs/blueprint-authoring.md` section 6.
6
+
7
+ ## 1.2.0 - 2026-09-07
8
+
9
+ Additive minor bump. Blesses the Workers-with-static-assets shape as the
10
+ ratified SPA-on-Workers deploy shape, per the Cloudflare Pages
11
+ landing-page recommendation (2026-09-06). Seven new contributions in the
12
+ existing 12xx US band and 13xx suffix block; every shipped v1.1.0
13
+ contribution carries through unchanged.
14
+
15
+ Added
16
+
17
+ - REQ `deploy-cloudflare-workers-REQ-013`: Workers-with-static-assets
18
+ shape. An elicited `[assets] directory` value is emitted on
19
+ `wrangler.toml`; the manifest never carries `pages_build_output_dir`
20
+ alongside `[assets]`.
21
+ - REQ `deploy-cloudflare-workers-REQ-014`: SPA fallback discipline via
22
+ elicited `run_worker_first`. A truthy answer emits
23
+ `run_worker_first = true` under `[assets]`; a falsy or unanswered
24
+ answer omits the field and lets Cloudflare's runtime serve assets
25
+ before the Worker fetch handler runs.
26
+ - US `-US-12113`: SPA-on-Workers deploy. Runtime-observable ACs on the
27
+ emitted `[assets]` block shape.
28
+ - US `-US-12114`: assets-directory elicitation. Recorded on the applied
29
+ sidecar as `appliedElicitations.assets-directory`.
30
+ - US `-US-12115`: migrate-from-Pages guidance. Guide section links
31
+ Cloudflare's own migrate-from-Pages walkthrough.
32
+ - ADR `ADR-1306-deploy-cloudflare-workers-spa-shape`: Workers-with-
33
+ static-assets as the ratified SPA-on-Workers deploy shape.
34
+ Contribution entry carries `recommendedDefault: true` and
35
+ `standardsTraceClause: Cloudflare Pages landing-page recommendation
36
+ (2026-09-06)`. Body quotes the landing-page recommendation verbatim
37
+ (fetched 2026-09-06 in the round-6 proposal and re-verified at
38
+ ratification).
39
+ - Elicits (top-level `elicits[]`): `assets-directory` (string, default
40
+ empty) and `run-worker-first` (boolean, default false). The spec's
41
+ intended `when: {elicitedNonEmpty: [assets-directory]}` predicate on
42
+ `run-worker-first` is not shipped this round because the loader's
43
+ supported `when` block only accepts `requiresCapability` arrays; the
44
+ guide teaches that `run-worker-first` is only meaningful when
45
+ `assets-directory` is non-empty.
46
+ - Probe module `contributions/probes/assets-manifest-scan.mjs`
47
+ (`anchorAcId: AC-12113-1`, `accountBound: false`): parses the applied
48
+ fixture `wrangler.toml`, asserts `[assets] directory` matches the
49
+ elicited answer, asserts `run_worker_first` matches the elicited
50
+ answer, and refuses on any `pages_build_output_dir` presence.
51
+
52
+ Changed
53
+
54
+ - Existing ADR contribution entries (`ADR-1301` through `ADR-1305`)
55
+ gain the `generic enterprise practice` sentinel on
56
+ `standardsTraceClause` at the contribution entry, per
57
+ `blueprint-authoring.md` section 8a.4. The ADR bodies are not touched.
58
+
59
+ Notes
60
+
61
+ - No new capability minted; `capabilities` remains absent.
62
+ - No new global topic minted; the existing `deploymentTarget` topic on
63
+ ADR-1301 covers the deploy shape unchanged.
64
+ - No runtime dependency added to applying projects.
65
+ - `suggestedCompanions` unchanged (`logging`, `errorHandling`).
66
+ - The shared `cf-platform` sample-app fixture at
67
+ `packages/rcf-lite/test/fixtures/cf-platform/` ships alongside this
68
+ bump as the probe target. T-1 (KV), T-2 (cron), T-3 (Durable Objects)
69
+ and T-5's Turnstile sub-fixture extend the same fixture later.
@@ -44,6 +44,18 @@ See `docs/topics.md` for the exact strings, the expected resolutions, the deline
44
44
 
45
45
  Repo-root wrangler manifest as the sole declaration of Worker name, entry, compatibility settings, and every binding; one Deploy Adapter as the sole caller of the vendor CLI on the boundary; every merge to main uploads a Worker version reachable at both a permanent per-version-id URL and a stable preview alias URL; the uploaded version never serves production traffic; production only changes when the `promote` workflow runs on an explicit operator trigger; the promote workflow accepts one input `versionId` (empty defaults to newest-of-main); rollback IS a promote of a prior version id, on the same workflow, with the same audit shape; every promote runs the Served-surface Verifier against the production URL with bounded retries; a promote whose verifier fails is not marked successful; every uploaded version carries build provenance (commit sha, build timestamp, CI run URL) readable at a fixed health-probe path; the health probe's `versionSha` field is the served-surface verifier's confirmation that the promoted version is the version being served; no secret value ever lives in the wrangler manifest, in a committed environment file, in a CI variable readable outside the promote job, or in any CI log line; a probe against a dev-mode local URL is refused as coverage for a `deployed`-scope AC; the manifest loader refuses a wrangler config whose production route resolves to the same host as the preview alias URL. Every bar is carried by ACs in the doc set, not by this README.
46
46
 
47
+ ## What v1.2.0 adds
48
+
49
+ v1.2.0 is an additive-minor bump. Every shipped v1.1.0 contribution carries through unchanged; the compose invocation is identical (`rcf define blueprint add <path-to>/blueprints/deploy-cloudflare-workers` unchanged); no capability minted; no new global topic; no runtime dependency added; `suggestedCompanions` unchanged (`logging`, `errorHandling`). The bump blesses the Workers-with-static-assets shape as the ratified SPA-on-Workers deploy shape, per the Cloudflare Pages landing-page recommendation (fetched 2026-09-06, verbatim quote on `ADR-1306`).
50
+
51
+ - **Workers-with-static-assets shape (`REQ-013`, `REQ-014`).** Two new REQs cover the `[assets] directory` block on `wrangler.toml` and the SPA fallback discipline via `run_worker_first`. Three new USs in the existing 12xx band (`US-12113` SPA-on-Workers deploy, `US-12114` assets-directory elicitation, `US-12115` migrate-from-Pages guidance) bind the runtime-observable ACs to `TAC-1302-deploy-cloudflare-workers-wrangler-manifest`.
52
+ - **Ratified shape decision (`ADR-1306-deploy-cloudflare-workers-spa-shape`).** Body carries the Cloudflare landing-page quote verbatim; the contribution entry carries `recommendedDefault: true` and `standardsTraceClause: Cloudflare Pages landing-page recommendation (2026-09-06)` per `blueprint-authoring.md` section 8a.2. The ADR names a project-level supersede path for projects that keep the bare-Worker shape or stay on Pages.
53
+ - **Two new elicits.** `assets-directory` (kind `string`, default empty) picks the static-assets root; `run-worker-first` (kind `boolean`, default `false`) picks the SPA fallback discipline. The loader-side `when-elicitedNonEmpty` predicate the spec calls for is a mechanism follow-up, so `run-worker-first` fires unconditionally in v1.2.0; the guide teaches that the elicit is only meaningful when `assets-directory` is non-empty.
54
+ - **Probe module (`contributions/probes/assets-manifest-scan.mjs`).** `accountBound: false`, `anchorAcId: AC-12113-1`. Source-tree parser reads the applied fixture's `wrangler.toml` and asserts the `[assets]` shape against the elicited answers; refuses on `pages_build_output_dir` presence anywhere on the manifest (the Workers-with-static-assets shape and the Pages shape are mutually exclusive per the Cloudflare static-assets doc).
55
+ - **Shared sample-app fixture (`packages/rcf-lite/test/fixtures/cf-platform/`).** T-0 mints the fixture; T-1 (KV), T-2 (cron), T-3 (Durable Objects) and T-5's Turnstile sub-fixture extend it later. Ships `wrangler.toml` with the ratified `[assets]` block, `dist/index.html`, a minimal `src/index.mjs` Worker entry, `package.json` with `wrangler` as a devDependency and `wrangler dev` as the start script, a `run-assets-manifest-scan.mjs` shim wiring the probe against the fixture, and a `README.md` naming the manual `wrangler dev` boot line and the two induced-failure switches (`SIMULATE_MIXED_SHAPE`, `SIMULATE_EMPTY_ASSETS`). The fixture never binds port 4200.
56
+
57
+ A project on v1.1.0 picks up v1.2.0 with the same compose invocation; a fresh apply on a project answering both elicits reads the applied sidecar at `rcf/blueprints/deploy-cloudflare-workers.applied.json`. A project on Pages that wants to migrate reads the guide's new `Workers-with-static-assets: the SPA-on-Workers shape` section for the Cloudflare migrate-from-Pages link.
58
+
47
59
  ## What v1.1.0 adds
48
60
 
49
61
  v1.1.0 is an additive-non-global minor bump. No global topics change; no contribution is removed; the compose invocation is unchanged. The bump cures seven content findings that the round-2 dogfood acceptance build surfaced when a stranger followed the v1.0.0 teaching against wrangler 4.x reality (three HIGH, three MEDIUM, one LOW). Every fixed teaching is execution-verified against the shipped vendor CLI, with one depth-stop caveat: the bootstrap flow taught in `assets/wrangler-samples/bootstrap-vs-steady-state.md` (F-006) is composed from vendor CLI refusals reproduced against a real Worker (the three refusal-message excerpts in the asset are byte-verified against the shipped CLI's output) and each individual vendor primitive it composes is verified in isolation, but the composed `wrangler deploy --secrets-file <tmp>` bootstrap sequence itself is not end-to-end executed as a single verified run in this ship. A project applying the blueprint exercises the composed sequence the first time it bootstraps a Worker.
@@ -1,48 +1,246 @@
1
1
  {
2
2
  "slug": "deploy-cloudflare-workers",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "category": "deploy",
5
5
  "contributions": [
6
- { "id": "deploy-cloudflare-workers-REQ-001", "kind": "req", "path": "requirements/deploy-cloudflare-workers-req-001.json" },
7
- { "id": "deploy-cloudflare-workers-REQ-002", "kind": "req", "path": "requirements/deploy-cloudflare-workers-req-002.json" },
8
- { "id": "deploy-cloudflare-workers-REQ-003", "kind": "req", "path": "requirements/deploy-cloudflare-workers-req-003.json" },
9
- { "id": "deploy-cloudflare-workers-REQ-004", "kind": "req", "path": "requirements/deploy-cloudflare-workers-req-004.json" },
10
- { "id": "deploy-cloudflare-workers-REQ-005", "kind": "req", "path": "requirements/deploy-cloudflare-workers-req-005.json" },
11
- { "id": "deploy-cloudflare-workers-REQ-006", "kind": "req", "path": "requirements/deploy-cloudflare-workers-req-006.json" },
12
- { "id": "deploy-cloudflare-workers-REQ-007", "kind": "req", "path": "requirements/deploy-cloudflare-workers-req-007.json" },
13
- { "id": "deploy-cloudflare-workers-REQ-008", "kind": "req", "path": "requirements/deploy-cloudflare-workers-req-008.json" },
14
- { "id": "deploy-cloudflare-workers-REQ-009", "kind": "req", "path": "requirements/deploy-cloudflare-workers-req-009.json" },
15
- { "id": "deploy-cloudflare-workers-REQ-010", "kind": "req", "path": "requirements/deploy-cloudflare-workers-req-010.json" },
16
- { "id": "deploy-cloudflare-workers-REQ-011", "kind": "req", "path": "requirements/deploy-cloudflare-workers-req-011.json" },
17
- { "id": "deploy-cloudflare-workers-REQ-012", "kind": "req", "path": "requirements/deploy-cloudflare-workers-req-012.json" },
18
- { "id": "deploy-cloudflare-workers-US-12101", "kind": "us", "path": "user-stories/deploy-cloudflare-workers-us-12101.json" },
19
- { "id": "deploy-cloudflare-workers-US-12102", "kind": "us", "path": "user-stories/deploy-cloudflare-workers-us-12102.json" },
20
- { "id": "deploy-cloudflare-workers-US-12103", "kind": "us", "path": "user-stories/deploy-cloudflare-workers-us-12103.json" },
21
- { "id": "deploy-cloudflare-workers-US-12104", "kind": "us", "path": "user-stories/deploy-cloudflare-workers-us-12104.json" },
22
- { "id": "deploy-cloudflare-workers-US-12105", "kind": "us", "path": "user-stories/deploy-cloudflare-workers-us-12105.json" },
23
- { "id": "deploy-cloudflare-workers-US-12106", "kind": "us", "path": "user-stories/deploy-cloudflare-workers-us-12106.json" },
24
- { "id": "deploy-cloudflare-workers-US-12107", "kind": "us", "path": "user-stories/deploy-cloudflare-workers-us-12107.json" },
25
- { "id": "deploy-cloudflare-workers-US-12108", "kind": "us", "path": "user-stories/deploy-cloudflare-workers-us-12108.json" },
26
- { "id": "deploy-cloudflare-workers-US-12109", "kind": "us", "path": "user-stories/deploy-cloudflare-workers-us-12109.json" },
27
- { "id": "deploy-cloudflare-workers-US-12110", "kind": "us", "path": "user-stories/deploy-cloudflare-workers-us-12110.json" },
28
- { "id": "deploy-cloudflare-workers-US-12111", "kind": "us", "path": "user-stories/deploy-cloudflare-workers-us-12111.json" },
29
- { "id": "deploy-cloudflare-workers-US-12112", "kind": "us", "path": "user-stories/deploy-cloudflare-workers-us-12112.json" },
30
- { "id": "TAC-1301-deploy-cloudflare-workers-deploy-adapter", "kind": "tac", "path": "tacs/tac-1301-deploy-cloudflare-workers-deploy-adapter.json" },
31
- { "id": "TAC-1302-deploy-cloudflare-workers-wrangler-manifest", "kind": "tac", "path": "tacs/tac-1302-deploy-cloudflare-workers-wrangler-manifest.json" },
32
- { "id": "TAC-1303-deploy-cloudflare-workers-preview-url-resolver", "kind": "tac", "path": "tacs/tac-1303-deploy-cloudflare-workers-preview-url-resolver.json" },
33
- { "id": "TAC-1304-deploy-cloudflare-workers-promote-gate", "kind": "tac", "path": "tacs/tac-1304-deploy-cloudflare-workers-promote-gate.json" },
34
- { "id": "TAC-1305-deploy-cloudflare-workers-served-surface-verifier", "kind": "tac", "path": "tacs/tac-1305-deploy-cloudflare-workers-served-surface-verifier.json" },
35
- { "id": "TAC-1306-deploy-cloudflare-workers-deploy-ci-workflows", "kind": "tac", "path": "tacs/tac-1306-deploy-cloudflare-workers-deploy-ci-workflows.json" },
6
+ {
7
+ "id": "deploy-cloudflare-workers-REQ-001",
8
+ "kind": "req",
9
+ "path": "requirements/deploy-cloudflare-workers-req-001.json"
10
+ },
11
+ {
12
+ "id": "deploy-cloudflare-workers-REQ-002",
13
+ "kind": "req",
14
+ "path": "requirements/deploy-cloudflare-workers-req-002.json"
15
+ },
16
+ {
17
+ "id": "deploy-cloudflare-workers-REQ-003",
18
+ "kind": "req",
19
+ "path": "requirements/deploy-cloudflare-workers-req-003.json"
20
+ },
21
+ {
22
+ "id": "deploy-cloudflare-workers-REQ-004",
23
+ "kind": "req",
24
+ "path": "requirements/deploy-cloudflare-workers-req-004.json"
25
+ },
26
+ {
27
+ "id": "deploy-cloudflare-workers-REQ-005",
28
+ "kind": "req",
29
+ "path": "requirements/deploy-cloudflare-workers-req-005.json"
30
+ },
31
+ {
32
+ "id": "deploy-cloudflare-workers-REQ-006",
33
+ "kind": "req",
34
+ "path": "requirements/deploy-cloudflare-workers-req-006.json"
35
+ },
36
+ {
37
+ "id": "deploy-cloudflare-workers-REQ-007",
38
+ "kind": "req",
39
+ "path": "requirements/deploy-cloudflare-workers-req-007.json"
40
+ },
41
+ {
42
+ "id": "deploy-cloudflare-workers-REQ-008",
43
+ "kind": "req",
44
+ "path": "requirements/deploy-cloudflare-workers-req-008.json"
45
+ },
46
+ {
47
+ "id": "deploy-cloudflare-workers-REQ-009",
48
+ "kind": "req",
49
+ "path": "requirements/deploy-cloudflare-workers-req-009.json"
50
+ },
51
+ {
52
+ "id": "deploy-cloudflare-workers-REQ-010",
53
+ "kind": "req",
54
+ "path": "requirements/deploy-cloudflare-workers-req-010.json"
55
+ },
56
+ {
57
+ "id": "deploy-cloudflare-workers-REQ-011",
58
+ "kind": "req",
59
+ "path": "requirements/deploy-cloudflare-workers-req-011.json"
60
+ },
61
+ {
62
+ "id": "deploy-cloudflare-workers-REQ-012",
63
+ "kind": "req",
64
+ "path": "requirements/deploy-cloudflare-workers-req-012.json"
65
+ },
66
+ {
67
+ "id": "deploy-cloudflare-workers-US-12101",
68
+ "kind": "us",
69
+ "path": "user-stories/deploy-cloudflare-workers-us-12101.json"
70
+ },
71
+ {
72
+ "id": "deploy-cloudflare-workers-US-12102",
73
+ "kind": "us",
74
+ "path": "user-stories/deploy-cloudflare-workers-us-12102.json"
75
+ },
76
+ {
77
+ "id": "deploy-cloudflare-workers-US-12103",
78
+ "kind": "us",
79
+ "path": "user-stories/deploy-cloudflare-workers-us-12103.json"
80
+ },
81
+ {
82
+ "id": "deploy-cloudflare-workers-US-12104",
83
+ "kind": "us",
84
+ "path": "user-stories/deploy-cloudflare-workers-us-12104.json"
85
+ },
86
+ {
87
+ "id": "deploy-cloudflare-workers-US-12105",
88
+ "kind": "us",
89
+ "path": "user-stories/deploy-cloudflare-workers-us-12105.json"
90
+ },
91
+ {
92
+ "id": "deploy-cloudflare-workers-US-12106",
93
+ "kind": "us",
94
+ "path": "user-stories/deploy-cloudflare-workers-us-12106.json"
95
+ },
96
+ {
97
+ "id": "deploy-cloudflare-workers-US-12107",
98
+ "kind": "us",
99
+ "path": "user-stories/deploy-cloudflare-workers-us-12107.json"
100
+ },
101
+ {
102
+ "id": "deploy-cloudflare-workers-US-12108",
103
+ "kind": "us",
104
+ "path": "user-stories/deploy-cloudflare-workers-us-12108.json"
105
+ },
106
+ {
107
+ "id": "deploy-cloudflare-workers-US-12109",
108
+ "kind": "us",
109
+ "path": "user-stories/deploy-cloudflare-workers-us-12109.json"
110
+ },
111
+ {
112
+ "id": "deploy-cloudflare-workers-US-12110",
113
+ "kind": "us",
114
+ "path": "user-stories/deploy-cloudflare-workers-us-12110.json"
115
+ },
116
+ {
117
+ "id": "deploy-cloudflare-workers-US-12111",
118
+ "kind": "us",
119
+ "path": "user-stories/deploy-cloudflare-workers-us-12111.json"
120
+ },
121
+ {
122
+ "id": "deploy-cloudflare-workers-US-12112",
123
+ "kind": "us",
124
+ "path": "user-stories/deploy-cloudflare-workers-us-12112.json"
125
+ },
126
+ {
127
+ "id": "TAC-1301-deploy-cloudflare-workers-deploy-adapter",
128
+ "kind": "tac",
129
+ "path": "tacs/tac-1301-deploy-cloudflare-workers-deploy-adapter.json"
130
+ },
131
+ {
132
+ "id": "TAC-1302-deploy-cloudflare-workers-wrangler-manifest",
133
+ "kind": "tac",
134
+ "path": "tacs/tac-1302-deploy-cloudflare-workers-wrangler-manifest.json"
135
+ },
136
+ {
137
+ "id": "TAC-1303-deploy-cloudflare-workers-preview-url-resolver",
138
+ "kind": "tac",
139
+ "path": "tacs/tac-1303-deploy-cloudflare-workers-preview-url-resolver.json"
140
+ },
141
+ {
142
+ "id": "TAC-1304-deploy-cloudflare-workers-promote-gate",
143
+ "kind": "tac",
144
+ "path": "tacs/tac-1304-deploy-cloudflare-workers-promote-gate.json"
145
+ },
146
+ {
147
+ "id": "TAC-1305-deploy-cloudflare-workers-served-surface-verifier",
148
+ "kind": "tac",
149
+ "path": "tacs/tac-1305-deploy-cloudflare-workers-served-surface-verifier.json"
150
+ },
151
+ {
152
+ "id": "TAC-1306-deploy-cloudflare-workers-deploy-ci-workflows",
153
+ "kind": "tac",
154
+ "path": "tacs/tac-1306-deploy-cloudflare-workers-deploy-ci-workflows.json"
155
+ },
36
156
  {
37
157
  "id": "ADR-1301-deploy-cloudflare-workers-deployment-target",
38
158
  "kind": "adr",
39
159
  "path": "adrs/adr-1301-deploy-cloudflare-workers-deployment-target.json",
40
160
  "scope": "global",
41
- "topic": "deploymentTarget"
161
+ "topic": "deploymentTarget",
162
+ "standardsTraceClause": "generic enterprise practice"
163
+ },
164
+ {
165
+ "id": "ADR-1302-deploy-cloudflare-workers-default-vendor",
166
+ "kind": "adr",
167
+ "path": "adrs/adr-1302-deploy-cloudflare-workers-default-vendor.json",
168
+ "standardsTraceClause": "generic enterprise practice"
42
169
  },
43
- { "id": "ADR-1302-deploy-cloudflare-workers-default-vendor", "kind": "adr", "path": "adrs/adr-1302-deploy-cloudflare-workers-default-vendor.json" },
44
- { "id": "ADR-1303-deploy-cloudflare-workers-preview-vs-production", "kind": "adr", "path": "adrs/adr-1303-deploy-cloudflare-workers-preview-vs-production.json" },
45
- { "id": "ADR-1304-deploy-cloudflare-workers-rollback-is-promote", "kind": "adr", "path": "adrs/adr-1304-deploy-cloudflare-workers-rollback-is-promote.json" },
46
- { "id": "ADR-1305-deploy-cloudflare-workers-dev-mode-drift", "kind": "adr", "path": "adrs/adr-1305-deploy-cloudflare-workers-dev-mode-drift.json" }
170
+ {
171
+ "id": "ADR-1303-deploy-cloudflare-workers-preview-vs-production",
172
+ "kind": "adr",
173
+ "path": "adrs/adr-1303-deploy-cloudflare-workers-preview-vs-production.json",
174
+ "standardsTraceClause": "generic enterprise practice"
175
+ },
176
+ {
177
+ "id": "ADR-1304-deploy-cloudflare-workers-rollback-is-promote",
178
+ "kind": "adr",
179
+ "path": "adrs/adr-1304-deploy-cloudflare-workers-rollback-is-promote.json",
180
+ "standardsTraceClause": "generic enterprise practice"
181
+ },
182
+ {
183
+ "id": "ADR-1305-deploy-cloudflare-workers-dev-mode-drift",
184
+ "kind": "adr",
185
+ "path": "adrs/adr-1305-deploy-cloudflare-workers-dev-mode-drift.json",
186
+ "standardsTraceClause": "generic enterprise practice"
187
+ },
188
+ {
189
+ "id": "deploy-cloudflare-workers-REQ-013",
190
+ "kind": "req",
191
+ "path": "requirements/deploy-cloudflare-workers-req-013.json"
192
+ },
193
+ {
194
+ "id": "deploy-cloudflare-workers-REQ-014",
195
+ "kind": "req",
196
+ "path": "requirements/deploy-cloudflare-workers-req-014.json"
197
+ },
198
+ {
199
+ "id": "deploy-cloudflare-workers-US-12113",
200
+ "kind": "us",
201
+ "path": "user-stories/deploy-cloudflare-workers-us-12113.json"
202
+ },
203
+ {
204
+ "id": "deploy-cloudflare-workers-US-12114",
205
+ "kind": "us",
206
+ "path": "user-stories/deploy-cloudflare-workers-us-12114.json"
207
+ },
208
+ {
209
+ "id": "deploy-cloudflare-workers-US-12115",
210
+ "kind": "us",
211
+ "path": "user-stories/deploy-cloudflare-workers-us-12115.json"
212
+ },
213
+ {
214
+ "id": "ADR-1306-deploy-cloudflare-workers-spa-shape",
215
+ "kind": "adr",
216
+ "path": "adrs/adr-1306-deploy-cloudflare-workers-spa-shape.json",
217
+ "recommendedDefault": true,
218
+ "elicited": false,
219
+ "standardsTraceClause": "Cloudflare Pages landing-page recommendation (2026-09-06)"
220
+ }
221
+ ],
222
+ "elicits": [
223
+ {
224
+ "id": "assets-directory",
225
+ "prompt": "Assets directory: the path (relative to the Worker source root) whose files Cloudflare serves at the edge as static assets under the Workers-with-static-assets shape. An empty answer keeps the bare-Worker shape (no [assets] block on the generated wrangler.toml). A non-empty answer emits [assets] directory = the answered path.",
226
+ "kind": "string",
227
+ "default": ""
228
+ },
229
+ {
230
+ "id": "run-worker-first",
231
+ "prompt": "Run Worker first: whether the Worker fetch handler runs BEFORE static asset lookup for every request. True emits run_worker_first = true under the [assets] block (right for a SPA whose Worker owns arbitrary routing or whose auth middleware must gate every path). False (default) omits the field and lets Cloudflare's runtime serve a matching static asset before the Worker runs. Only meaningful when assets-directory is non-empty; the loader-side when-elicitedNonEmpty predicate is a mechanism follow-up.",
232
+ "kind": "boolean",
233
+ "default": false
234
+ }
235
+ ],
236
+ "suggestedCompanions": [
237
+ {
238
+ "role": "logging",
239
+ "reason": "Every promote and every served-surface verify writes a structured deploy log record and a probe verdict; a logging companion supplies the record factory the deploy adapter and the verifier both call."
240
+ },
241
+ {
242
+ "role": "errorHandling",
243
+ "reason": "A promote refusal (bad version id, verifier fail, mixed-shape wrangler manifest) constructs an internal error record; an error-handling companion supplies the record factory and the boundary at which the deploy adapter's refusals surface to the operator."
244
+ }
47
245
  ]
48
246
  }