rcf-lite 0.11.0 → 0.13.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 (627) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +2 -0
  3. package/bin/view-supervisor-child.mjs +0 -0
  4. package/blueprints/application-api-rest/README.md +40 -0
  5. package/blueprints/application-api-rest/assets/middleware/auth-classes.md +45 -0
  6. package/blueprints/application-api-rest/assets/openapi/openapi-skeleton.yaml +322 -0
  7. package/blueprints/application-api-rest/assets/sample-data/sample-resources.json +53 -0
  8. package/blueprints/application-api-rest/assets/samples/request-response-pairs.md +204 -0
  9. package/blueprints/application-api-rest/blueprint.json +265 -0
  10. package/blueprints/application-api-rest/contributions/adrs/adr-301-application-api-rest-error-envelope.json +25 -0
  11. package/blueprints/application-api-rest/contributions/adrs/adr-302-application-api-rest-auth-model.json +25 -0
  12. package/blueprints/application-api-rest/contributions/adrs/adr-303-application-api-rest-api-versioning.json +25 -0
  13. package/blueprints/application-api-rest/contributions/adrs/adr-304-application-api-rest-logging.json +25 -0
  14. package/blueprints/application-api-rest/contributions/adrs/adr-305-application-api-rest-pagination.json +25 -0
  15. package/blueprints/application-api-rest/contributions/adrs/adr-306-application-api-rest-idempotency.json +25 -0
  16. package/blueprints/application-api-rest/contributions/adrs/adr-307-application-api-rest-openapi-generation.json +25 -0
  17. package/blueprints/application-api-rest/contributions/adrs/adr-308-application-api-rest-rate-limiting.json +25 -0
  18. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-001.json +18 -0
  19. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-002.json +18 -0
  20. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-003.json +18 -0
  21. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-004.json +18 -0
  22. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-005.json +18 -0
  23. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-006.json +18 -0
  24. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-007.json +18 -0
  25. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-008.json +18 -0
  26. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-009.json +18 -0
  27. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-010.json +18 -0
  28. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-011.json +18 -0
  29. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-012.json +18 -0
  30. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-013.json +18 -0
  31. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-014.json +18 -0
  32. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-015.json +18 -0
  33. package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-016.json +18 -0
  34. package/blueprints/application-api-rest/contributions/tacs/tac-301-application-api-rest-request-pipeline.json +48 -0
  35. package/blueprints/application-api-rest/contributions/tacs/tac-302-application-api-rest-auth-middleware.json +41 -0
  36. package/blueprints/application-api-rest/contributions/tacs/tac-303-application-api-rest-contract-surface.json +46 -0
  37. package/blueprints/application-api-rest/contributions/tacs/tac-304-application-api-rest-resource-layer.json +46 -0
  38. package/blueprints/application-api-rest/contributions/tacs/tac-305-application-api-rest-observability.json +40 -0
  39. package/blueprints/application-api-rest/contributions/tacs/tac-306-application-api-rest-operability.json +46 -0
  40. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2101.json +72 -0
  41. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2102.json +73 -0
  42. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2103.json +63 -0
  43. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2104.json +72 -0
  44. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2105.json +63 -0
  45. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2106.json +73 -0
  46. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2107.json +90 -0
  47. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2108.json +90 -0
  48. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2109.json +72 -0
  49. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2110.json +72 -0
  50. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2111.json +72 -0
  51. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2112.json +72 -0
  52. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2113.json +73 -0
  53. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2114.json +63 -0
  54. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2115.json +63 -0
  55. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2116.json +63 -0
  56. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2117.json +64 -0
  57. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2118.json +72 -0
  58. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2119.json +63 -0
  59. package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2120.json +73 -0
  60. package/blueprints/application-api-rest/docs/topics.md +46 -0
  61. package/blueprints/application-api-rest/guide/application-api-rest.md +41 -0
  62. package/blueprints/application-spa/README.md +90 -0
  63. package/blueprints/application-spa/assets/component-specs/actions-and-text-inputs.md +36 -0
  64. package/blueprints/application-spa/assets/component-specs/data-display.md +19 -0
  65. package/blueprints/application-spa/assets/component-specs/feedback-and-status.md +27 -0
  66. package/blueprints/application-spa/assets/component-specs/overlays.md +23 -0
  67. package/blueprints/application-spa/assets/component-specs/selection-controls.md +23 -0
  68. package/blueprints/application-spa/assets/sample-data/sample-entities.json +41 -0
  69. package/blueprints/application-spa/assets/tokens/design-tokens.json +140 -0
  70. package/blueprints/application-spa/assets/tokens/theme.css +169 -0
  71. package/blueprints/application-spa/assets/viewports.md +18 -0
  72. package/blueprints/application-spa/assets/wireframes/dashboard.md +48 -0
  73. package/blueprints/application-spa/assets/wireframes/detail.md +40 -0
  74. package/blueprints/application-spa/assets/wireframes/empty.md +31 -0
  75. package/blueprints/application-spa/assets/wireframes/error.md +46 -0
  76. package/blueprints/application-spa/assets/wireframes/form.md +50 -0
  77. package/blueprints/application-spa/assets/wireframes/list.md +45 -0
  78. package/blueprints/application-spa/assets/wireframes/session-expired.md +35 -0
  79. package/blueprints/application-spa/assets/wireframes/sign-in.md +41 -0
  80. package/blueprints/application-spa/assets/wireframes/sign-out.md +32 -0
  81. package/blueprints/application-spa/blueprint.json +387 -0
  82. package/blueprints/application-spa/contributions/adrs/adr-201-application-spa-routing.json +25 -0
  83. package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +25 -0
  84. package/blueprints/application-spa/contributions/adrs/adr-203-application-spa-client-state.json +25 -0
  85. package/blueprints/application-spa/contributions/adrs/adr-204-application-spa-error-envelope.json +25 -0
  86. package/blueprints/application-spa/contributions/adrs/adr-205-application-spa-auth-model.json +25 -0
  87. package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +13 -0
  88. package/blueprints/application-spa/contributions/adrs/adr-207-application-spa-motion.json +13 -0
  89. package/blueprints/application-spa/contributions/adrs/adr-208-application-spa-i18n.json +13 -0
  90. package/blueprints/application-spa/contributions/adrs/adr-209-application-spa-telemetry-naming.json +13 -0
  91. package/blueprints/application-spa/contributions/requirements/application-spa-req-001.json +18 -0
  92. package/blueprints/application-spa/contributions/requirements/application-spa-req-002.json +18 -0
  93. package/blueprints/application-spa/contributions/requirements/application-spa-req-003.json +18 -0
  94. package/blueprints/application-spa/contributions/requirements/application-spa-req-004.json +18 -0
  95. package/blueprints/application-spa/contributions/requirements/application-spa-req-005.json +18 -0
  96. package/blueprints/application-spa/contributions/requirements/application-spa-req-006.json +18 -0
  97. package/blueprints/application-spa/contributions/requirements/application-spa-req-007.json +18 -0
  98. package/blueprints/application-spa/contributions/requirements/application-spa-req-008.json +18 -0
  99. package/blueprints/application-spa/contributions/requirements/application-spa-req-009.json +18 -0
  100. package/blueprints/application-spa/contributions/requirements/application-spa-req-010.json +18 -0
  101. package/blueprints/application-spa/contributions/requirements/application-spa-req-011.json +18 -0
  102. package/blueprints/application-spa/contributions/requirements/application-spa-req-012.json +18 -0
  103. package/blueprints/application-spa/contributions/requirements/application-spa-req-013.json +18 -0
  104. package/blueprints/application-spa/contributions/requirements/application-spa-req-014.json +18 -0
  105. package/blueprints/application-spa/contributions/requirements/application-spa-req-015.json +18 -0
  106. package/blueprints/application-spa/contributions/requirements/application-spa-req-016.json +18 -0
  107. package/blueprints/application-spa/contributions/requirements/application-spa-req-017.json +18 -0
  108. package/blueprints/application-spa/contributions/requirements/application-spa-req-018.json +18 -0
  109. package/blueprints/application-spa/contributions/requirements/application-spa-req-019.json +18 -0
  110. package/blueprints/application-spa/contributions/requirements/application-spa-req-020.json +18 -0
  111. package/blueprints/application-spa/contributions/requirements/application-spa-req-021.json +18 -0
  112. package/blueprints/application-spa/contributions/tacs/tac-201-application-spa-app-shell.json +45 -0
  113. package/blueprints/application-spa/contributions/tacs/tac-202-application-spa-theme-system.json +32 -0
  114. package/blueprints/application-spa/contributions/tacs/tac-203-application-spa-component-library.json +32 -0
  115. package/blueprints/application-spa/contributions/tacs/tac-204-application-spa-client-data-layer.json +27 -0
  116. package/blueprints/application-spa/contributions/tacs/tac-205-application-spa-forms-engine.json +27 -0
  117. package/blueprints/application-spa/contributions/tacs/tac-206-application-spa-telemetry.json +19 -0
  118. package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +57 -0
  119. package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +56 -0
  120. package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +61 -0
  121. package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +70 -0
  122. package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +70 -0
  123. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1101.json +72 -0
  124. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1102.json +63 -0
  125. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1103.json +72 -0
  126. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1104.json +63 -0
  127. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1105.json +69 -0
  128. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1106.json +63 -0
  129. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1107.json +63 -0
  130. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1108.json +90 -0
  131. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1109.json +90 -0
  132. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1110.json +100 -0
  133. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1111.json +90 -0
  134. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1112.json +81 -0
  135. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1113.json +82 -0
  136. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1114.json +60 -0
  137. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1115.json +73 -0
  138. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1116.json +72 -0
  139. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1117.json +73 -0
  140. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1118.json +54 -0
  141. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1119.json +63 -0
  142. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1120.json +72 -0
  143. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1121.json +73 -0
  144. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1122.json +69 -0
  145. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1123.json +63 -0
  146. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1124.json +60 -0
  147. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1125.json +69 -0
  148. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1126.json +78 -0
  149. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1127.json +63 -0
  150. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1128.json +51 -0
  151. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1129.json +54 -0
  152. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1130.json +54 -0
  153. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +72 -0
  154. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1132.json +72 -0
  155. package/blueprints/application-spa/contributions/user-stories/application-spa-us-1133.json +72 -0
  156. package/blueprints/application-spa/docs/topics.md +57 -0
  157. package/blueprints/application-spa/guide/application-spa.md +40 -0
  158. package/blueprints/ci-pipeline/README.md +49 -0
  159. package/blueprints/ci-pipeline/assets/ci-provider-examples/github-actions.yml +61 -0
  160. package/blueprints/ci-pipeline/assets/ci-provider-examples/notes.md +50 -0
  161. package/blueprints/ci-pipeline/assets/report-samples/per-gate.json +12 -0
  162. package/blueprints/ci-pipeline/assets/report-samples/pipeline.json +28 -0
  163. package/blueprints/ci-pipeline/blueprint.json +46 -0
  164. package/blueprints/ci-pipeline/contributions/adrs/adr-701-ci-pipeline-ci-gates.json +25 -0
  165. package/blueprints/ci-pipeline/contributions/adrs/adr-702-ci-pipeline-strict-coverage-gate.json +25 -0
  166. package/blueprints/ci-pipeline/contributions/adrs/adr-703-ci-pipeline-node-only-runner.json +25 -0
  167. package/blueprints/ci-pipeline/contributions/adrs/adr-704-ci-pipeline-report-shape.json +25 -0
  168. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-001.json +18 -0
  169. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-002.json +18 -0
  170. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-003.json +18 -0
  171. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-004.json +18 -0
  172. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-005.json +18 -0
  173. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-006.json +18 -0
  174. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-007.json +18 -0
  175. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-008.json +18 -0
  176. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-009.json +18 -0
  177. package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-010.json +18 -0
  178. package/blueprints/ci-pipeline/contributions/tacs/tac-701-ci-pipeline-gate-runner.json +59 -0
  179. package/blueprints/ci-pipeline/contributions/tacs/tac-702-ci-pipeline-gate-report.json +32 -0
  180. package/blueprints/ci-pipeline/contributions/tacs/tac-703-ci-pipeline-aggregate-report.json +41 -0
  181. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6101.json +37 -0
  182. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6102.json +36 -0
  183. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6103.json +37 -0
  184. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6104.json +37 -0
  185. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6105.json +36 -0
  186. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6106.json +36 -0
  187. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6107.json +37 -0
  188. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6108.json +37 -0
  189. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6109.json +36 -0
  190. package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6110.json +36 -0
  191. package/blueprints/ci-pipeline/docs/topics.md +49 -0
  192. package/blueprints/ci-pipeline/guide/ci-pipeline.md +79 -0
  193. package/blueprints/deploy-cloudflare-workers/README.md +63 -0
  194. package/blueprints/deploy-cloudflare-workers/assets/ci-workflows/build-and-upload.yml.md +109 -0
  195. package/blueprints/deploy-cloudflare-workers/assets/ci-workflows/promote.yml.md +120 -0
  196. package/blueprints/deploy-cloudflare-workers/assets/verification/served-surface-probes.md +90 -0
  197. package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/bootstrap-vs-steady-state.md +87 -0
  198. package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/preview-alias-shape.md +86 -0
  199. package/blueprints/deploy-cloudflare-workers/assets/wrangler-samples/wrangler-toml-shape.md +85 -0
  200. package/blueprints/deploy-cloudflare-workers/blueprint.json +48 -0
  201. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1301-deploy-cloudflare-workers-deployment-target.json +30 -0
  202. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1302-deploy-cloudflare-workers-default-vendor.json +35 -0
  203. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1303-deploy-cloudflare-workers-preview-vs-production.json +30 -0
  204. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1304-deploy-cloudflare-workers-rollback-is-promote.json +25 -0
  205. package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1305-deploy-cloudflare-workers-dev-mode-drift.json +25 -0
  206. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-001.json +18 -0
  207. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-002.json +18 -0
  208. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-003.json +18 -0
  209. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-004.json +18 -0
  210. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-005.json +18 -0
  211. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-006.json +18 -0
  212. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-007.json +18 -0
  213. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-008.json +18 -0
  214. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-009.json +18 -0
  215. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-010.json +18 -0
  216. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-011.json +18 -0
  217. package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-012.json +18 -0
  218. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1301-deploy-cloudflare-workers-deploy-adapter.json +54 -0
  219. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1302-deploy-cloudflare-workers-wrangler-manifest.json +45 -0
  220. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1303-deploy-cloudflare-workers-preview-url-resolver.json +46 -0
  221. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1304-deploy-cloudflare-workers-promote-gate.json +57 -0
  222. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1305-deploy-cloudflare-workers-served-surface-verifier.json +51 -0
  223. package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1306-deploy-cloudflare-workers-deploy-ci-workflows.json +64 -0
  224. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12101.json +54 -0
  225. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12102.json +45 -0
  226. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12103.json +46 -0
  227. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12104.json +46 -0
  228. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12105.json +46 -0
  229. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12106.json +46 -0
  230. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12107.json +46 -0
  231. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12108.json +46 -0
  232. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12109.json +47 -0
  233. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12110.json +46 -0
  234. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12111.json +45 -0
  235. package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12112.json +46 -0
  236. package/blueprints/deploy-cloudflare-workers/docs/topics.md +46 -0
  237. package/blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md +74 -0
  238. package/blueprints/email-smtp-resend/README.md +45 -0
  239. package/blueprints/email-smtp-resend/assets/from-address-rotation-pattern.md +44 -0
  240. package/blueprints/email-smtp-resend/assets/resend-verification-pointer.md +25 -0
  241. package/blueprints/email-smtp-resend/assets/stub-adapter.md +65 -0
  242. package/blueprints/email-smtp-resend/blueprint.json +23 -0
  243. package/blueprints/email-smtp-resend/contributions/adrs/adr-401-email-smtp-resend-transport-choice.json +30 -0
  244. package/blueprints/email-smtp-resend/contributions/adrs/adr-402-email-smtp-resend-retry-and-backoff-posture.json +30 -0
  245. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-001.json +18 -0
  246. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-002.json +18 -0
  247. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-003.json +18 -0
  248. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-004.json +18 -0
  249. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-005.json +18 -0
  250. package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-006.json +18 -0
  251. package/blueprints/email-smtp-resend/contributions/tacs/tac-401-email-smtp-resend-send-adapter.json +53 -0
  252. package/blueprints/email-smtp-resend/contributions/tacs/tac-402-email-smtp-resend-webhook-verifier.json +56 -0
  253. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4101.json +45 -0
  254. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4102.json +36 -0
  255. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4103.json +45 -0
  256. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4104.json +45 -0
  257. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4105.json +36 -0
  258. package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4106.json +37 -0
  259. package/blueprints/email-smtp-resend/docs/topics.md +44 -0
  260. package/blueprints/email-smtp-resend/guide/email-smtp-resend.md +71 -0
  261. package/blueprints/observability-essentials/README.md +53 -0
  262. package/blueprints/observability-essentials/assets/probe-samples/liveness-body.json +4 -0
  263. package/blueprints/observability-essentials/assets/probe-samples/readiness-body.json +18 -0
  264. package/blueprints/observability-essentials/assets/status-page-samples/status-page-clean.html +22 -0
  265. package/blueprints/observability-essentials/assets/status-page-samples/status-page-with-notice.html +25 -0
  266. package/blueprints/observability-essentials/blueprint.json +54 -0
  267. package/blueprints/observability-essentials/contributions/adrs/adr-801-observability-essentials-health-probes.json +30 -0
  268. package/blueprints/observability-essentials/contributions/adrs/adr-802-observability-essentials-readiness-semantics.json +30 -0
  269. package/blueprints/observability-essentials/contributions/adrs/adr-803-observability-essentials-status-page-contract.json +30 -0
  270. package/blueprints/observability-essentials/contributions/adrs/adr-804-observability-essentials-probe-secrecy.json +25 -0
  271. package/blueprints/observability-essentials/contributions/adrs/adr-805-observability-essentials-notification-outcome-model.json +25 -0
  272. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-001.json +18 -0
  273. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-002.json +18 -0
  274. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-003.json +18 -0
  275. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-004.json +18 -0
  276. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-005.json +18 -0
  277. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-006.json +18 -0
  278. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-007.json +18 -0
  279. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-008.json +18 -0
  280. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-009.json +18 -0
  281. package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-010.json +18 -0
  282. package/blueprints/observability-essentials/contributions/tacs/tac-801-observability-essentials-liveness-probe.json +32 -0
  283. package/blueprints/observability-essentials/contributions/tacs/tac-802-observability-essentials-readiness-probe.json +43 -0
  284. package/blueprints/observability-essentials/contributions/tacs/tac-803-observability-essentials-status-page.json +37 -0
  285. package/blueprints/observability-essentials/contributions/tacs/tac-804-observability-essentials-notification-outcome.json +42 -0
  286. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7101.json +45 -0
  287. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7102.json +45 -0
  288. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7103.json +45 -0
  289. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7104.json +45 -0
  290. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7105.json +45 -0
  291. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7106.json +45 -0
  292. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7107.json +46 -0
  293. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7108.json +47 -0
  294. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7109.json +45 -0
  295. package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7110.json +46 -0
  296. package/blueprints/observability-essentials/docs/topics.md +57 -0
  297. package/blueprints/observability-essentials/guide/observability-essentials.md +68 -0
  298. package/blueprints/observability-probe-endpoints/README.md +53 -0
  299. package/blueprints/observability-probe-endpoints/assets/docker/dockerfile-healthcheck.md +19 -0
  300. package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes-separate-port.md +54 -0
  301. package/blueprints/observability-probe-endpoints/assets/kubernetes/podspec-probes.md +36 -0
  302. package/blueprints/observability-probe-endpoints/assets/load-balancer/health-check-config.md +23 -0
  303. package/blueprints/observability-probe-endpoints/assets/systemd/notify-service.md +30 -0
  304. package/blueprints/observability-probe-endpoints/assets/uptime-monitor/monitor-config.md +22 -0
  305. package/blueprints/observability-probe-endpoints/blueprint.json +44 -0
  306. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1501-observability-probe-endpoints-health-probes.json +30 -0
  307. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1502-observability-probe-endpoints-readiness-semantics.json +30 -0
  308. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1503-observability-probe-endpoints-kubernetes-default.json +30 -0
  309. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1504-observability-probe-endpoints-separate-port-option.json +30 -0
  310. package/blueprints/observability-probe-endpoints/contributions/adrs/adr-1505-observability-probe-endpoints-external-response-secrecy.json +30 -0
  311. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-001.json +18 -0
  312. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-002.json +18 -0
  313. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-003.json +18 -0
  314. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-004.json +18 -0
  315. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-005.json +18 -0
  316. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-006.json +18 -0
  317. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-007.json +18 -0
  318. package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-008.json +18 -0
  319. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1501-observability-probe-endpoints-profile-resolver.json +39 -0
  320. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1502-observability-probe-endpoints-handler-set.json +40 -0
  321. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1503-observability-probe-endpoints-listener-topology.json +51 -0
  322. package/blueprints/observability-probe-endpoints/contributions/tacs/tac-1504-observability-probe-endpoints-non-http-adapters.json +39 -0
  323. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14101.json +46 -0
  324. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14102.json +46 -0
  325. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14103.json +46 -0
  326. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14104.json +45 -0
  327. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14105.json +46 -0
  328. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14106.json +45 -0
  329. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14107.json +45 -0
  330. package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14108.json +46 -0
  331. package/blueprints/observability-probe-endpoints/docs/topics.md +51 -0
  332. package/blueprints/observability-probe-endpoints/guide/observability-probe-endpoints.md +83 -0
  333. package/blueprints/persistence-data-d1/README.md +50 -0
  334. package/blueprints/persistence-data-d1/assets/batch-usage/batch-atomicity-example.md +72 -0
  335. package/blueprints/persistence-data-d1/assets/facade-shape/facade-module-shape.md +115 -0
  336. package/blueprints/persistence-data-d1/assets/migration-shape/migration-file-shape.md +119 -0
  337. package/blueprints/persistence-data-d1/assets/wrangler-config/d1-binding-shape.md +93 -0
  338. package/blueprints/persistence-data-d1/blueprint.json +42 -0
  339. package/blueprints/persistence-data-d1/contributions/adrs/adr-1401-persistence-data-d1-store-model.json +30 -0
  340. package/blueprints/persistence-data-d1/contributions/adrs/adr-1402-persistence-data-d1-migration-discipline.json +30 -0
  341. package/blueprints/persistence-data-d1/contributions/adrs/adr-1403-persistence-data-d1-event-secrecy.json +25 -0
  342. package/blueprints/persistence-data-d1/contributions/adrs/adr-1404-persistence-data-d1-store-boundary.json +25 -0
  343. package/blueprints/persistence-data-d1/contributions/adrs/adr-1405-persistence-data-d1-recovery-model.json +30 -0
  344. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-001.json +18 -0
  345. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-002.json +18 -0
  346. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-003.json +18 -0
  347. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-004.json +18 -0
  348. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-005.json +18 -0
  349. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-006.json +18 -0
  350. package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-007.json +18 -0
  351. package/blueprints/persistence-data-d1/contributions/tacs/tac-1401-persistence-data-d1-facade.json +51 -0
  352. package/blueprints/persistence-data-d1/contributions/tacs/tac-1402-persistence-data-d1-migration-catalog.json +31 -0
  353. package/blueprints/persistence-data-d1/contributions/tacs/tac-1403-persistence-data-d1-deploy-gate.json +38 -0
  354. package/blueprints/persistence-data-d1/contributions/tacs/tac-1404-persistence-data-d1-recovery-runner.json +39 -0
  355. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13101.json +45 -0
  356. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13102.json +45 -0
  357. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13103.json +46 -0
  358. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13104.json +45 -0
  359. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13105.json +45 -0
  360. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13106.json +46 -0
  361. package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13107.json +38 -0
  362. package/blueprints/persistence-data-d1/docs/topics.md +59 -0
  363. package/blueprints/persistence-data-d1/guide/persistence-data-d1.md +77 -0
  364. package/blueprints/persistence-data-sqlite/README.md +50 -0
  365. package/blueprints/persistence-data-sqlite/assets/backup-procedures/hot-checkpoint-note.md +22 -0
  366. package/blueprints/persistence-data-sqlite/assets/backup-procedures/sqlite-file-copy.md +70 -0
  367. package/blueprints/persistence-data-sqlite/assets/schema-samples/catalog-file-layout.md +73 -0
  368. package/blueprints/persistence-data-sqlite/assets/schema-samples/migration-shape.md +76 -0
  369. package/blueprints/persistence-data-sqlite/blueprint.json +50 -0
  370. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-601-persistence-data-sqlite-store-model.json +30 -0
  371. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-602-persistence-data-sqlite-migration-discipline.json +30 -0
  372. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-603-persistence-data-sqlite-event-secrecy.json +25 -0
  373. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-604-persistence-data-sqlite-store-boundary.json +25 -0
  374. package/blueprints/persistence-data-sqlite/contributions/adrs/adr-605-persistence-data-sqlite-backup-model.json +25 -0
  375. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-001.json +18 -0
  376. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-002.json +18 -0
  377. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-003.json +18 -0
  378. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-004.json +18 -0
  379. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-005.json +18 -0
  380. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-006.json +18 -0
  381. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-007.json +18 -0
  382. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-008.json +18 -0
  383. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-009.json +18 -0
  384. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-010.json +18 -0
  385. package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-011.json +18 -0
  386. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-601-persistence-data-sqlite-store.json +57 -0
  387. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-602-persistence-data-sqlite-migration-runner.json +34 -0
  388. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-603-persistence-data-sqlite-migration-catalog.json +31 -0
  389. package/blueprints/persistence-data-sqlite/contributions/tacs/tac-604-persistence-data-sqlite-backup-runner.json +33 -0
  390. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5101.json +46 -0
  391. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5102.json +46 -0
  392. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5103.json +37 -0
  393. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5104.json +45 -0
  394. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5105.json +45 -0
  395. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5106.json +46 -0
  396. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5107.json +45 -0
  397. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5108.json +46 -0
  398. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5109.json +46 -0
  399. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5110.json +37 -0
  400. package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5111.json +37 -0
  401. package/blueprints/persistence-data-sqlite/docs/topics.md +49 -0
  402. package/blueprints/persistence-data-sqlite/guide/persistence-data-sqlite.md +69 -0
  403. package/blueprints/security-auth-clerk/README.md +50 -0
  404. package/blueprints/security-auth-clerk/assets/authorisation/role-claim-mapping-sample.md +99 -0
  405. package/blueprints/security-auth-clerk/assets/middleware/node-middleware-shape.md +86 -0
  406. package/blueprints/security-auth-clerk/assets/wiring/clerk-provider-react.md +48 -0
  407. package/blueprints/security-auth-clerk/assets/wiring/clerk-provider-vue.md +41 -0
  408. package/blueprints/security-auth-clerk/blueprint.json +42 -0
  409. package/blueprints/security-auth-clerk/contributions/adrs/adr-1001-security-auth-clerk-auth-model.json +30 -0
  410. package/blueprints/security-auth-clerk/contributions/adrs/adr-1002-security-auth-clerk-middleware-boundary.json +25 -0
  411. package/blueprints/security-auth-clerk/contributions/adrs/adr-1003-security-auth-clerk-authorisation-adapter-contract.json +25 -0
  412. package/blueprints/security-auth-clerk/contributions/adrs/adr-1004-security-auth-clerk-claims-mapping-discipline.json +25 -0
  413. package/blueprints/security-auth-clerk/contributions/adrs/adr-1005-security-auth-clerk-session-lifecycle.json +25 -0
  414. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-001.json +18 -0
  415. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-002.json +18 -0
  416. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-003.json +18 -0
  417. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-004.json +18 -0
  418. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-005.json +18 -0
  419. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-006.json +18 -0
  420. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-007.json +18 -0
  421. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-008.json +18 -0
  422. package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-009.json +18 -0
  423. package/blueprints/security-auth-clerk/contributions/tacs/tac-1001-security-auth-clerk-middleware.json +42 -0
  424. package/blueprints/security-auth-clerk/contributions/tacs/tac-1002-security-auth-clerk-authorisation-adapter.json +30 -0
  425. package/blueprints/security-auth-clerk/contributions/tacs/tac-1003-security-auth-clerk-session-verifier.json +38 -0
  426. package/blueprints/security-auth-clerk/contributions/tacs/tac-1004-security-auth-clerk-claims-mapper.json +22 -0
  427. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9101.json +46 -0
  428. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9102.json +38 -0
  429. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9103.json +46 -0
  430. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9104.json +46 -0
  431. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9105.json +36 -0
  432. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9106.json +36 -0
  433. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9107.json +37 -0
  434. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9108.json +36 -0
  435. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9109.json +36 -0
  436. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9110.json +37 -0
  437. package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9111.json +36 -0
  438. package/blueprints/security-auth-clerk/docs/topics.md +56 -0
  439. package/blueprints/security-auth-clerk/guide/security-auth-clerk.md +71 -0
  440. package/blueprints/security-auth-keycloak/README.md +56 -0
  441. package/blueprints/security-auth-keycloak/assets/local-container/keycloak-bootstrap.md +54 -0
  442. package/blueprints/security-auth-keycloak/assets/middleware/verifier-wiring.md +93 -0
  443. package/blueprints/security-auth-keycloak/assets/mock-introspection/mock-introspection-shape.md +62 -0
  444. package/blueprints/security-auth-keycloak/assets/provider-router/router-shape.md +71 -0
  445. package/blueprints/security-auth-keycloak/assets/realm-skeleton/realm-config-shape.md +55 -0
  446. package/blueprints/security-auth-keycloak/blueprint.json +49 -0
  447. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1201-security-auth-keycloak-auth-model.json +35 -0
  448. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1202-security-auth-keycloak-verification-mode-choice.json +30 -0
  449. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1203-security-auth-keycloak-provider-routing-seam.json +30 -0
  450. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1204-security-auth-keycloak-session-vs-token-contract.json +25 -0
  451. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1205-security-auth-keycloak-jwks-rotation-cache-lifetime.json +30 -0
  452. package/blueprints/security-auth-keycloak/contributions/adrs/adr-1206-security-auth-keycloak-refresh-and-sign-out-posture.json +25 -0
  453. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-001.json +18 -0
  454. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-002.json +18 -0
  455. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-003.json +18 -0
  456. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-004.json +18 -0
  457. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-005.json +18 -0
  458. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-006.json +18 -0
  459. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-007.json +18 -0
  460. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-008.json +18 -0
  461. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-009.json +18 -0
  462. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-010.json +18 -0
  463. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-011.json +18 -0
  464. package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-012.json +18 -0
  465. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1201-security-auth-keycloak-discovery-client.json +51 -0
  466. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1202-security-auth-keycloak-jwt-verifier.json +46 -0
  467. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1203-security-auth-keycloak-introspection-client.json +45 -0
  468. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1204-security-auth-keycloak-provider-router.json +37 -0
  469. package/blueprints/security-auth-keycloak/contributions/tacs/tac-1205-security-auth-keycloak-role-adapter.json +32 -0
  470. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11101.json +47 -0
  471. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11102.json +45 -0
  472. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11103.json +36 -0
  473. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11104.json +36 -0
  474. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11105.json +45 -0
  475. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11106.json +46 -0
  476. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11107.json +45 -0
  477. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11108.json +45 -0
  478. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11109.json +37 -0
  479. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11110.json +45 -0
  480. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11111.json +45 -0
  481. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11112.json +37 -0
  482. package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11113.json +36 -0
  483. package/blueprints/security-auth-keycloak/docs/topics.md +74 -0
  484. package/blueprints/security-auth-keycloak/guide/security-auth-keycloak.md +81 -0
  485. package/blueprints/security-auth-magic-link/README.md +46 -0
  486. package/blueprints/security-auth-magic-link/assets/email-templates/magic-link-email.md +44 -0
  487. package/blueprints/security-auth-magic-link/assets/email-templates/stub-adapter.md +55 -0
  488. package/blueprints/security-auth-magic-link/assets/principal-registry-samples/allow-list-file.md +46 -0
  489. package/blueprints/security-auth-magic-link/assets/principal-registry-samples/single-address.md +35 -0
  490. package/blueprints/security-auth-magic-link/blueprint.json +45 -0
  491. package/blueprints/security-auth-magic-link/contributions/adrs/adr-501-security-auth-magic-link-model.json +30 -0
  492. package/blueprints/security-auth-magic-link/contributions/adrs/adr-502-security-auth-magic-link-token-secrecy.json +25 -0
  493. package/blueprints/security-auth-magic-link/contributions/adrs/adr-503-security-auth-magic-link-anti-enumeration-budget.json +25 -0
  494. package/blueprints/security-auth-magic-link/contributions/adrs/adr-504-security-auth-magic-link-session-lifecycle.json +30 -0
  495. package/blueprints/security-auth-magic-link/contributions/adrs/adr-505-security-auth-magic-link-rate-limiting.json +25 -0
  496. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-001.json +18 -0
  497. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-002.json +18 -0
  498. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-003.json +18 -0
  499. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-004.json +18 -0
  500. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-005.json +18 -0
  501. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-006.json +18 -0
  502. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-007.json +18 -0
  503. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-008.json +18 -0
  504. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-009.json +18 -0
  505. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-010.json +18 -0
  506. package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-011.json +18 -0
  507. package/blueprints/security-auth-magic-link/contributions/tacs/tac-501-security-auth-magic-link-manager.json +45 -0
  508. package/blueprints/security-auth-magic-link/contributions/tacs/tac-502-security-auth-magic-link-session-manager.json +46 -0
  509. package/blueprints/security-auth-magic-link/contributions/tacs/tac-503-security-auth-magic-link-login-routes.json +76 -0
  510. package/blueprints/security-auth-magic-link/contributions/tacs/tac-504-security-auth-magic-link-email-delivery-adapter.json +26 -0
  511. package/blueprints/security-auth-magic-link/contributions/tacs/tac-505-security-auth-magic-link-principal-registry.json +26 -0
  512. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3101.json +64 -0
  513. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3102.json +54 -0
  514. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3103.json +45 -0
  515. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3104.json +55 -0
  516. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3105.json +46 -0
  517. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3106.json +46 -0
  518. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3107.json +54 -0
  519. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3108.json +46 -0
  520. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3109.json +48 -0
  521. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3110.json +45 -0
  522. package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3111.json +45 -0
  523. package/blueprints/security-auth-magic-link/docs/topics.md +45 -0
  524. package/blueprints/security-auth-magic-link/guide/security-auth-magic-link.md +65 -0
  525. package/blueprints/security-auth-oauth2/README.md +50 -0
  526. package/blueprints/security-auth-oauth2/assets/mock-provider/mock-oidc-shape.md +55 -0
  527. package/blueprints/security-auth-oauth2/assets/provider-selector/list-shape.md +27 -0
  528. package/blueprints/security-auth-oauth2/assets/providers/generic-oidc-discovery.md +31 -0
  529. package/blueprints/security-auth-oauth2/assets/providers/github-oauth2-only.md +31 -0
  530. package/blueprints/security-auth-oauth2/assets/providers/google-oidc.md +31 -0
  531. package/blueprints/security-auth-oauth2/assets/session-bridge/opaque-handle-shape.md +59 -0
  532. package/blueprints/security-auth-oauth2/blueprint.json +44 -0
  533. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1101-security-auth-oauth2-auth-model.json +35 -0
  534. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1102-security-auth-oauth2-provider-abstraction-contract.json +25 -0
  535. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1103-security-auth-oauth2-pkce-discipline.json +25 -0
  536. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1104-security-auth-oauth2-session-bridge-shape.json +25 -0
  537. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1105-security-auth-oauth2-refresh-token-posture.json +25 -0
  538. package/blueprints/security-auth-oauth2/contributions/adrs/adr-1106-security-auth-oauth2-multi-provider-routing.json +25 -0
  539. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-001.json +18 -0
  540. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-002.json +18 -0
  541. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-003.json +18 -0
  542. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-004.json +18 -0
  543. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-005.json +18 -0
  544. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-006.json +18 -0
  545. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-007.json +18 -0
  546. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-008.json +18 -0
  547. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-009.json +18 -0
  548. package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-010.json +18 -0
  549. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1101-security-auth-oauth2-flow-controller.json +61 -0
  550. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1102-security-auth-oauth2-provider-adapter.json +33 -0
  551. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1103-security-auth-oauth2-session-bridge.json +51 -0
  552. package/blueprints/security-auth-oauth2/contributions/tacs/tac-1104-security-auth-oauth2-provider-selector.json +29 -0
  553. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10101.json +47 -0
  554. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10102.json +45 -0
  555. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10103.json +36 -0
  556. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10104.json +36 -0
  557. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10105.json +55 -0
  558. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10106.json +45 -0
  559. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10107.json +46 -0
  560. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10108.json +46 -0
  561. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10109.json +37 -0
  562. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10110.json +37 -0
  563. package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10111.json +28 -0
  564. package/blueprints/security-auth-oauth2/docs/topics.md +58 -0
  565. package/blueprints/security-auth-oauth2/guide/security-auth-oauth2.md +65 -0
  566. package/blueprints/security-secrets-management/README.md +48 -0
  567. package/blueprints/security-secrets-management/assets/cli-usage/agent-access-pattern.md +69 -0
  568. package/blueprints/security-secrets-management/assets/manifest-samples/environment-aware-example.md +33 -0
  569. package/blueprints/security-secrets-management/assets/manifest-samples/secrets-yaml-shape.md +74 -0
  570. package/blueprints/security-secrets-management/assets/ui-integration/three-way-choice.md +44 -0
  571. package/blueprints/security-secrets-management/blueprint.json +43 -0
  572. package/blueprints/security-secrets-management/contributions/adrs/adr-901-security-secrets-management-secrets-source.json +30 -0
  573. package/blueprints/security-secrets-management/contributions/adrs/adr-902-security-secrets-management-default-vendor.json +35 -0
  574. package/blueprints/security-secrets-management/contributions/adrs/adr-903-security-secrets-management-agent-access-discipline.json +25 -0
  575. package/blueprints/security-secrets-management/contributions/adrs/adr-904-security-secrets-management-dotenv-reflection.json +25 -0
  576. package/blueprints/security-secrets-management/contributions/adrs/adr-905-security-secrets-management-rotation-and-audit.json +30 -0
  577. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-001.json +18 -0
  578. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-002.json +18 -0
  579. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-003.json +18 -0
  580. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-004.json +18 -0
  581. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-005.json +18 -0
  582. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-006.json +18 -0
  583. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-007.json +18 -0
  584. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-008.json +18 -0
  585. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-009.json +18 -0
  586. package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-010.json +18 -0
  587. package/blueprints/security-secrets-management/contributions/tacs/tac-901-security-secrets-management-manager-client.json +52 -0
  588. package/blueprints/security-secrets-management/contributions/tacs/tac-902-security-secrets-management-manifest.json +34 -0
  589. package/blueprints/security-secrets-management/contributions/tacs/tac-903-security-secrets-management-env-reflector.json +46 -0
  590. package/blueprints/security-secrets-management/contributions/tacs/tac-904-security-secrets-management-rotation-gate.json +57 -0
  591. package/blueprints/security-secrets-management/contributions/tacs/tac-905-security-secrets-management-agent-cli.json +59 -0
  592. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8101.json +46 -0
  593. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8102.json +45 -0
  594. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8103.json +37 -0
  595. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8104.json +45 -0
  596. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8105.json +55 -0
  597. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8106.json +46 -0
  598. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8107.json +46 -0
  599. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8108.json +45 -0
  600. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8109.json +46 -0
  601. package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8110.json +45 -0
  602. package/blueprints/security-secrets-management/docs/topics.md +46 -0
  603. package/blueprints/security-secrets-management/guide/security-secrets-management.md +68 -0
  604. package/fixtures/canary-manifest.json +1 -101
  605. package/package.json +16 -10
  606. package/rcf/.identity/profile.md +37 -0
  607. package/rcf/knowledge/INDEX.md +12 -0
  608. package/rcf/knowledge/README.md +41 -0
  609. package/rcf/knowledge/docs/.gitkeep +0 -0
  610. package/rcf/knowledge/notes/.gitkeep +0 -0
  611. package/scripts/preinstall-node-check.mjs +61 -0
  612. package/src/blueprint/apply.js +12 -6
  613. package/src/blueprint/conflicts.js +8 -8
  614. package/src/blueprint/index.js +2 -1
  615. package/src/blueprint/list.js +60 -0
  616. package/src/blueprint/loader.js +26 -1
  617. package/src/blueprint/namespace.js +20 -16
  618. package/src/blueprint/shelf-resolver.js +173 -0
  619. package/src/blueprint/supersede.js +3 -2
  620. package/src/browser-verify/invariants.js +40 -0
  621. package/src/browser-verify/runner.js +2 -0
  622. package/src/cli/blueprint.js +53 -9
  623. package/src/cli/init.js +2 -0
  624. package/src/core/store/validator.js +15 -27
  625. package/src/core/store/writer.js +64 -2
  626. package/src/ruleset/ruleset.json +1 -1
  627. package/src/setup/agent-setup.js +28 -10
@@ -0,0 +1,120 @@
1
+ # promote workflow (GitHub Actions form)
2
+
3
+ Reference shape for the `promote` workflow. Every value with `<...>` is a placeholder the project fills. The workflow triggers only on `workflow_dispatch`, accepts an optional `versionId` input, invokes the Promote Gate, and honours the Served-surface Verifier's pass or fail.
4
+
5
+ ```yaml
6
+ # .github/workflows/promote.yml
7
+ name: promote
8
+
9
+ on:
10
+ workflow_dispatch:
11
+ inputs:
12
+ versionId:
13
+ description: "Version id to promote. Leave blank for newest-of-main."
14
+ required: false
15
+ type: string
16
+
17
+ concurrency:
18
+ group: promote
19
+ cancel-in-progress: false
20
+
21
+ jobs:
22
+ promote:
23
+ runs-on: ubuntu-latest
24
+ permissions:
25
+ contents: read
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+
29
+ - uses: actions/setup-node@v4
30
+ with:
31
+ node-version-file: .nvmrc
32
+ cache: pnpm
33
+
34
+ - uses: pnpm/action-setup@v4
35
+
36
+ - name: Install pinned dependencies
37
+ run: pnpm install --frozen-lockfile
38
+
39
+ - name: Promote and verify
40
+ id: promote
41
+ env:
42
+ CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
43
+ CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
44
+ PROMOTED_BY: ${{ github.actor }}
45
+ run: node scripts/deploy/promote.mjs --version-id "${{ inputs.versionId }}"
46
+
47
+ - name: Write run summary
48
+ if: always()
49
+ run: |
50
+ {
51
+ echo "## Promote outcome"
52
+ echo ""
53
+ echo "- promotedVersionId: \`${{ steps.promote.outputs.promotedVersionId }}\`"
54
+ echo "- versionSha: \`${{ steps.promote.outputs.versionSha }}\`"
55
+ echo "- previousVersionId: \`${{ steps.promote.outputs.previousVersionId }}\`"
56
+ echo "- promotedBy: \`${{ github.actor }}\`"
57
+ echo "- outcome: \`${{ steps.promote.outcome }}\`"
58
+ } >> "$GITHUB_STEP_SUMMARY"
59
+ ```
60
+
61
+ ## The Node.js orchestration script
62
+
63
+ `scripts/deploy/promote.mjs` is the project-authored script the workflow invokes. Its body:
64
+
65
+ ```javascript
66
+ #!/usr/bin/env node
67
+ // Invoked by the promote workflow. Wraps the Promote Gate (TAC-1304).
68
+ // Resolves the newest-of-main when --version-id is blank; refuses an unknown
69
+ // version id before any vendor call; invokes the Served-surface Verifier
70
+ // after promoteVersion returns success; writes structured outputs.
71
+
72
+ import { appendFileSync } from 'node:fs';
73
+ import { parseArgs } from 'node:util';
74
+ import { createDeployAdapter } from '../../src/deploy/adapter.mjs';
75
+ import { createServedSurfaceVerifier } from '../../src/deploy/verifier.mjs';
76
+ import { createPromoteGate } from '../../src/deploy/promote-gate.mjs';
77
+
78
+ const { values } = parseArgs({
79
+ options: { 'version-id': { type: 'string', default: '' } }
80
+ });
81
+
82
+ const adapter = createDeployAdapter();
83
+ const verifier = createServedSurfaceVerifier({ adapter });
84
+ const gate = createPromoteGate({ adapter, verifier });
85
+
86
+ try {
87
+ const record = await gate.promote({
88
+ versionId: values['version-id'] || null,
89
+ promotedBy: process.env.PROMOTED_BY || 'unknown'
90
+ });
91
+ const out = process.env.GITHUB_OUTPUT;
92
+ if (out) {
93
+ // promotedVersionId is the vendor-assigned version UUID (the string
94
+ // `wrangler versions deploy` takes). versionSha is the git commit sha
95
+ // of the source tree the promoted version was built from; the verifier
96
+ // substitutes this into the health probe's `expectShape.versionSha`
97
+ // slot to reconcile served against promoted. Both identifiers are
98
+ // required on the promote record; they are never equal.
99
+ appendFileSync(out, `promotedVersionId=${record.promotedVersionId}\n`);
100
+ appendFileSync(out, `versionSha=${record.versionSha}\n`);
101
+ appendFileSync(out, `previousVersionId=${record.previousVersionId}\n`);
102
+ }
103
+ process.exit(0);
104
+ } catch (err) {
105
+ console.error(`${err.code || 'PROMOTE_FAILED'}: ${err.message}`);
106
+ process.exit(1);
107
+ }
108
+ ```
109
+
110
+ ## Reader notes
111
+
112
+ - The Worker being promoted must have been bootstrapped once with `wrangler deploy --secrets-file <path>` before the first `wrangler versions upload` from `build-and-upload` can succeed; see `assets/wrangler-samples/bootstrap-vs-steady-state.md`. Steady-state ship (this workflow's world) assumes bootstrap has already run.
113
+ - The promote record carries two identifiers: `promotedVersionId` (vendor-assigned UUID, the value `wrangler versions deploy` took) and `versionSha` (git commit sha the promoted version was built from). The verifier reconciles the served health-probe body's `versionSha` against the promote record's `versionSha`, NOT against `promotedVersionId`; see `assets/verification/served-surface-probes.md` for the boundary.
114
+ - Triggers ONLY on `workflow_dispatch`. No `push`, no `pull_request`, no `schedule`. AC-12104-2 refuses any other trigger; AC-12104-1 refuses any workflow that pushes-to-main AND promotes.
115
+ - The `versionId` input is optional (`required: false`). Blank defaults to newest-of-main, resolved by the Promote Gate through the Deploy Adapter. AC-12108-1 requires exactly one optional input; AC-12108-2 requires the blank case to resolve through `resolveNewestOfMain`.
116
+ - The Promote Gate refuses a `versionId` absent from `listVersions()` BEFORE any vendor promote call. AC-12108-3 requires the refusal to exit non-zero with `DEPLOY_VERSION_NOT_FOUND` and to leave no promote record.
117
+ - The Served-surface Verifier runs after `promoteVersion` returns success. A verifier failure exits non-zero with `PROMOTE_VERIFY_FAILED` and refuses to mark the release successful. AC-12110-3 requires this.
118
+ - `PROMOTED_BY: ${{ github.actor }}` binds the operator principal from the trigger context into the deploy-log record. AC-12104-3 requires the record.
119
+ - To rollback: invoke this workflow with the prior version id supplied as the `versionId` input. AC-12109-1 requires no separate rollback path. AC-12109-3 requires rollback promotes to run the same verifier.
120
+ - Additional approver-gating (a two-person integrity policy on every promote) layers above `workflow_dispatch` through the platform's manual-approval primitive; the blueprint's ADR set does not fix that policy.
@@ -0,0 +1,90 @@
1
+ # Served-surface probe pattern
2
+
3
+ Reference shape for the Served-surface Verifier's probe declaration. Every value with `<...>` is a placeholder the project fills.
4
+
5
+ ## Two identifiers, one probe body
6
+
7
+ The verifier reconciles a promoted version against what production is serving. The reconciliation compares two named identifiers the vendor and the project both know:
8
+
9
+ | Identifier | What it is | Where it lives | Written by |
10
+ |---|---|---|---|
11
+ | `promotedVersionId` | The vendor-assigned version UUID (`06839e70-1f7c-414f-99a9-babf3969efca`), the string `wrangler versions deploy` takes as its positional argument | The promote record's `promotedVersionId` field, emitted by the Promote Gate on every promote | The vendor CLI's response to `wrangler versions deploy`, captured by the Deploy Adapter's `promoteVersion` return value |
12
+ | `versionSha` | The git commit sha of the source tree the version was built from (the 40-character hex the `github.sha` context carries), baked into the built bundle by `build-and-upload` | The bundle as a build-time constant AND the Worker's health-probe response body | The `build-and-upload` workflow, which sets `BUILD_VERSION_SHA=${{ github.sha }}` before the build step |
13
+
14
+ The two identifiers name two different things on two different systems. They are NEVER equal by construction: `promotedVersionId` is a UUID assigned by the vendor at upload time; `versionSha` is a git sha assigned by the source-control system at commit time. Any teaching that "substitutes the promoted id into the probe body" and expects a match is wrong on the wire.
15
+
16
+ The verifier's reconciliation is: the Promote Gate captures BOTH identifiers on every promote (the vendor returns `promotedVersionId`; the project pairs it with the `versionSha` of the source-tree the version was built from, carried on the promote record's `versionSha` field). At verify time, the verifier substitutes the promote record's `versionSha` into the probe's `expectShape.versionSha` slot and refuses the probe when the served body's `versionSha` does not match.
17
+
18
+ ## The probe declaration
19
+
20
+ ```javascript
21
+ // src/deploy/verify-config.mjs
22
+ // Consumed by the Served-surface Verifier (TAC-1305). The health probe is
23
+ // mandatory; add project smoke probes for surfaces where a served-surface
24
+ // check adds signal a health probe does not.
25
+
26
+ export const probes = [
27
+ {
28
+ path: '/healthz',
29
+ method: 'GET',
30
+ successStatus: [200],
31
+ expectShape: {
32
+ // <PROMOTED_VERSION_SHA> is substituted at verify time from the
33
+ // promote record's `versionSha` field (the git sha), NOT from the
34
+ // promote record's `promotedVersionId` (the vendor UUID). The two
35
+ // are different identifiers on two different systems.
36
+ versionSha: '<PROMOTED_VERSION_SHA>'
37
+ }
38
+ },
39
+ {
40
+ // A project smoke probe: a read that exercises one binding and one
41
+ // Worker code path a health probe does not. Keep it stateless, idempotent,
42
+ // and observable in one round trip.
43
+ path: '/api/status',
44
+ method: 'GET',
45
+ successStatus: [200],
46
+ expectShape: {
47
+ ok: true
48
+ }
49
+ }
50
+ ];
51
+
52
+ export const retryBounds = {
53
+ // At most six attempts per probe over at most sixty seconds; per-request
54
+ // timeout at most five seconds. AC-12110-1 refuses a bound looser than these.
55
+ maxAttemptsPerProbe: 6,
56
+ windowMs: 60_000,
57
+ perRequestTimeoutMs: 5_000
58
+ };
59
+ ```
60
+
61
+ ## The verifier's runtime shape
62
+
63
+ The Served-surface Verifier consumes the config through the `probeConfig` interface (TAC-1305). Per probe:
64
+
65
+ 1. Compose the request against the target URL (from `probeUrl('production', null)` for a promote verify, from `probeUrl('alias', <alias>)` for a preview-only verify).
66
+ 2. Send the request; on transport error or on a status outside `successStatus`, sleep with an exponential-shaped backoff bounded by `windowMs / maxAttemptsPerProbe`.
67
+ 3. On a status in `successStatus`, parse the response body as JSON and check every key in `expectShape` matches the value in the response. `<PROMOTED_VERSION_SHA>` in `expectShape` is substituted at verify time with the promote record's `versionSha` field (the git commit sha the promoted version was built from).
68
+ 4. Pass on the first attempt whose status AND body-shape match.
69
+ 5. Fail the verify when any probe exhausts `maxAttemptsPerProbe` or when the cumulative elapsed time exceeds `windowMs`, whichever comes first. Emit `{ probePath, status, elapsedMs, outcome: 'failed', versionShaSeen }` on the result sink.
70
+
71
+ ## Compose boundary with observability-probe-endpoints
72
+
73
+ The `/healthz` probe declared above is a DEPLOY-blueprint surface. Its body carries build provenance (`versionSha`, `builtAt`, `ciRunUrl`) because the verifier's reconciliation requires it (AC-12112-3). That body shape is NOT a supervisor-integration probe response; it is the deploy blueprint's own provenance readback.
74
+
75
+ The `observability-probe-endpoints` blueprint contributes an operator-supervised probe interface derived from a target integration profile (`kubernetes`, `loadBalancer`, `uptimeMonitor`, `systemd`, `dockerHealthcheck`, `reverseProxy`). Every profile mandates a minimal response contract: `loadBalancer` requires an empty body; `kubernetes` requires exactly `{"status": "pass"|"fail"}`; the profile validator refuses any override that would add a field beyond the enumerated set. That contract's audience is the external supervisor whose conventions drive the wire shape; adding build-provenance fields to it would leak reconnaissance value to unintended readers and would fail the profile validator.
76
+
77
+ When both blueprints compose, the project runs TWO probe surfaces with distinct paths and distinct contracts:
78
+
79
+ - One `/health` (or the profile-declared path) owned by `observability-probe-endpoints`, whose body is minimal per its profile.
80
+ - One `/healthz` (or the deploy-blueprint's chosen path, distinct from the profile's) owned by `deploy-cloudflare-workers`, whose body carries `{ versionSha, builtAt, ciRunUrl }` for the verifier.
81
+
82
+ The two surfaces coexist on purpose; the deploy verifier never hits the profile-owned path and the external supervisor never hits the deploy-owned path. A project unsure which path is which picks distinct strings at apply time (`/health` for the profile, `/healthz` for the deploy verifier; or `/health` for the profile and `/build-info` for the deploy verifier) and documents both on the project's ADR set. Collapsing the two onto one path is not supported; the deploy verifier's provenance body would fail the profile validator, and stripping provenance from the body would break the verifier's reconciliation.
83
+
84
+ ## Reader notes
85
+
86
+ - A dev-mode local URL (`http://localhost:<port>`, `http://127.0.0.1:<port>`) is refused by the verifier with `DEPLOY_DEV_MODE_INADMISSIBLE`. AC-12111-1 makes this a hard refusal at the verifier layer; AC-12111-2 accepts the vendor's preview and production URL patterns.
87
+ - The health probe's response body carries `{ versionSha, builtAt, ciRunUrl }`. The Worker reads these at request time from the build-time constants injected by `build-and-upload`. AC-12112-2 requires the shape; AC-12112-3 makes the `versionSha` field the verifier's evidence that the promoted version is the version being served.
88
+ - A probe path that returns 200 with the WRONG `versionSha` fails the probe. A stale response served by a routing layer that has not converged yet fails the probe; the retry window buys the propagation-lag window; a full exhaustion fails the release.
89
+ - The project may add authenticated smoke probes; each carries an operator-chosen auth binding (a signed request header, a probe-only token) that lives in the secrets contract, not in this file. The verifier does not carry an `Authorization` header that would bypass a production auth layer; a probe surface that requires auth is exposed on a project-declared unauthenticated path (a signed-header contract for probes only, with a rotation cadence tied to the deploy-log).
90
+ - The `/healthz` path (or whichever path the project picks) MUST be listed in `[assets] run_worker_first` when the Worker declares an `[assets]` binding whose directory contains any file that could shadow the path. Without the listing, the assets pipeline may serve a stale (or absent) response before the fetch handler runs, and the verifier reads a shape that is not the Worker's answer; see `wrangler-toml-shape.md` for the discipline.
@@ -0,0 +1,87 @@
1
+ # First-deploy bootstrap versus steady-state upload
2
+
3
+ The blueprint's ship path (`wrangler versions upload` on every merge, `wrangler versions deploy <versionId>` on operator-triggered promote) works only against a Worker that already exists on the vendor. A fresh Worker has to be bootstrapped once with a different verb. This asset documents both flows.
4
+
5
+ ## Why the distinction exists
6
+
7
+ The vendor refuses `wrangler versions upload` against a Worker that has not been deployed at least once:
8
+
9
+ ```
10
+ You cannot upload a new version of a Worker that does not yet exist.
11
+ Please run the 'deploy' command first.
12
+ ```
13
+
14
+ The vendor also refuses `wrangler secret put <NAME>` against a Worker that does not yet exist:
15
+
16
+ ```
17
+ This Worker does not exist yet, so secrets cannot be set in advance
18
+ with 'wrangler secret put'.
19
+ ```
20
+
21
+ And the vendor refuses `wrangler deploy` when the Worker code references secret bindings that have not been set:
22
+
23
+ ```
24
+ The following required secrets have not been set: <NAME>, <NAME>, ...
25
+ ```
26
+
27
+ The three refusals compose into one bootstrap constraint: the FIRST deploy has to (a) create the Worker, (b) set every referenced secret in the same act. Only `wrangler deploy --secrets-file <path>` satisfies both.
28
+
29
+ ## The bootstrap flow (once per Worker)
30
+
31
+ Run this once, from an operator machine with the vendor credentials in the environment. The secrets file is a temp file in a directory the repo ignores; it must not touch the working tree and must not survive the run.
32
+
33
+ ```bash
34
+ # 1. Compose a temp secrets file. Sourced from the project's secrets
35
+ # contract (see the security-secrets-management blueprint or the
36
+ # equivalent project-authored pipeline). NO plaintext in the shell
37
+ # history; use a here-doc into a temp path outside the repo.
38
+ TMP_SECRETS="$(mktemp -t bootstrap-secrets.XXXXXX.json)"
39
+ trap 'rm -f "$TMP_SECRETS"' EXIT
40
+
41
+ # 2. Write the JSON object of secret NAME -> VALUE the Worker needs.
42
+ # The value strings are resolved from the secrets contract; this
43
+ # example shows the shape, not the values.
44
+ cat > "$TMP_SECRETS" <<'JSON'
45
+ {
46
+ "<SECRET_NAME_1>": "<value-from-secrets-contract>",
47
+ "<SECRET_NAME_2>": "<value-from-secrets-contract>"
48
+ }
49
+ JSON
50
+
51
+ # 3. First deploy: creates the Worker on the vendor AND sets every
52
+ # secret in one atomic act.
53
+ wrangler deploy --secrets-file "$TMP_SECRETS"
54
+
55
+ # 4. The trap removes the temp file. Verify it's gone.
56
+ [ ! -f "$TMP_SECRETS" ] || { echo "bootstrap-secrets leaked" >&2; exit 1; }
57
+ ```
58
+
59
+ After the bootstrap deploy returns success, the Worker exists on the vendor, every referenced secret is set, and the steady-state ship path becomes available.
60
+
61
+ ## The steady-state flow (every merge and every operator-triggered promote)
62
+
63
+ Once the Worker exists, the blueprint's ship path is the only one used:
64
+
65
+ ```bash
66
+ # On every merge to main (build-and-upload workflow, see
67
+ # `ci-workflows/build-and-upload.yml.md`):
68
+ wrangler versions upload --preview-alias main
69
+
70
+ # On operator-triggered promote (promote workflow, see
71
+ # `ci-workflows/promote.yml.md`):
72
+ wrangler versions deploy <versionId>
73
+
74
+ # When a secret's value has to rotate, steady-state is `wrangler secret
75
+ # put <NAME>` invoked from a CI step whose environment has the new value
76
+ # from the secrets contract. No temp file, because the Worker already
77
+ # exists.
78
+ wrangler secret put <NAME>
79
+ ```
80
+
81
+ ## Reader notes
82
+
83
+ - The bootstrap flow is a one-time operator act. The blueprint's Deploy Adapter (TAC-1301) does NOT wrap it; the adapter's verbs are the steady-state surface. A project that automates bootstrap wraps this shell flow in a project-local script under `scripts/deploy/` and gates it behind an explicit operator invocation.
84
+ - The temp secrets file is the only shape wrangler 4.x accepts for pre-existence secret provisioning. Any alternative (`wrangler secret put` before `wrangler deploy`, an interactive prompt, environment-variable smuggling into `wrangler.toml`) either fails or leaks the value.
85
+ - The `--secrets-file` path must be outside the repo working tree, deleted on shell exit, and never emitted to stdout. The bootstrap shell above uses `mktemp` and a `trap` to enforce this.
86
+ - After bootstrap, the CI workflows never invoke `wrangler deploy`. Every version reaches the vendor via `wrangler versions upload` (which does NOT change the served version) and every production change rides `wrangler versions deploy <versionId>` from the promote workflow. Preserving this discipline is what keeps the promote-is-explicit invariant load-bearing.
87
+ - A project that superseded the default vendor (per ADR-1302) with a different target (Fly.io, Vercel, a hyperscaler's FaaS, a self-hosted target) authors an equivalent bootstrap flow against that vendor's own create-and-provision primitives; the WHEN (once per environment, before steady-state) stays; the WHAT (which CLI verb, which primitive) is vendor-specific.
@@ -0,0 +1,86 @@
1
+ # Preview alias and per-version URL patterns
2
+
3
+ Reference shape for the three URL kinds this blueprint mandates. Every value with `<...>` is a placeholder the operator fills; no real hostname appears here.
4
+
5
+ ## The three URL kinds
6
+
7
+ Given a Worker named `<worker-name>` on an account whose workers.dev subdomain is `<subdomain>` and a production custom domain of `<production-hostname>`, the Deploy Adapter's `deploy status` surfaces three URLs:
8
+
9
+ | Kind | URL pattern | Changes on | Purpose |
10
+ |---|---|---|---|
11
+ | Per-version-id URL | `<version-prefix>-<worker-name>.<subdomain>.workers.dev` | Every upload assigns a new one; the URL for a given version is permanent | Pin a change-review link to a specific version id; never rots |
12
+ | Stable preview alias URL | `<alias>-<worker-name>.<subdomain>.workers.dev` | Never (points at a moving target: the newest-of-`<alias>`) | Persistent shareable review surface for stakeholders |
13
+ | Production URL, custom-domain branch | `<production-hostname>` (paired with `workers_dev = false`) | Only on an explicit `promote` workflow | User-facing traffic when a custom domain owns production |
14
+ | Production URL, workers.dev-only branch | `<worker-name>.<subdomain>.workers.dev` (paired with `workers_dev = true`) | Only on an explicit `promote` workflow | User-facing traffic when no custom domain is mapped |
15
+
16
+ The alias string is operator-chosen; `main` is the common default when the operator wants "the newest of the main branch" as the persistent preview. A project running multiple long-lived branches can allocate additional aliases (`staging`, `next`), each fixed to the newest-of-that-branch upload.
17
+
18
+ ## Discovering the workers.dev subdomain
19
+
20
+ The `<subdomain>` segment in every workers.dev URL above is a per-account value the operator does not name in `wrangler.toml`. `wrangler whoami` prints the account id and email but does NOT print the subdomain; there is no wrangler 4.x CLI verb that returns it. The vendor's REST API returns it:
21
+
22
+ ```
23
+ GET https://api.cloudflare.com/client/v4/accounts/<accountId>/workers/subdomain
24
+ Authorization: Bearer <cloudflareApiToken>
25
+ ```
26
+
27
+ Response:
28
+
29
+ ```json
30
+ { "result": { "subdomain": "<subdomain>" }, "success": true, "errors": [], "messages": [] }
31
+ ```
32
+
33
+ The Deploy Adapter's `resolveSubdomain()` verb (TAC-1301) wraps this call; every URL-assembly path calls the verb on boot and caches the value for the process's lifetime. A project that would rather pin the value in configuration sets an unambiguous `WORKERS_DEV_SUBDOMAIN` env var and the resolver returns that value ahead of the API call; the discovery path is the fallback so a fresh checkout works with no environment tuning.
34
+
35
+ ## The upload verb
36
+
37
+ ```
38
+ wrangler versions upload --preview-alias <alias>
39
+ ```
40
+
41
+ Uploads the current build as a new version. Assigns a version id and returns two URLs on stdout: the per-version-id URL (unique per upload, permanent) and the stable preview alias URL (fixed to `<alias>`, always pointing at the version this upload just produced). The uploaded version does NOT serve production traffic; only the promote verb changes production.
42
+
43
+ `versions upload` refuses on a Worker that has not been deployed at least once (`You cannot upload a new version of a Worker that does not yet exist. Please run the 'deploy' command first.`). The first-time-per-Worker bootstrap uses `wrangler deploy --secrets-file <path>`; see `bootstrap-vs-steady-state.md`. Every subsequent ship rides `versions upload`.
44
+
45
+ ## The promote verb
46
+
47
+ ```
48
+ wrangler versions deploy <version-id>
49
+ ```
50
+
51
+ Routes production traffic to the named version id. Requires the version id to be present in `wrangler versions list`. The blueprint's promote workflow calls this verb through the Deploy Adapter after resolving the version id from either the input `versionId` field or, when the input is empty, from the newest-of-alias resolution described below.
52
+
53
+ ## Newest-of-alias resolution
54
+
55
+ The promote workflow's optional `versionId` input defaults to newest-of-`<alias>` when empty. There is no wrangler CLI verb that maps an alias string to a version id directly (`wrangler versions view` accepts a version UUID as a positional argument only; it does not accept an alias). The working resolution reads the versions list as JSON and filters by the alias annotation:
56
+
57
+ ```
58
+ wrangler versions list --json
59
+ ```
60
+
61
+ Each item carries `id`, `number`, `metadata.created_on`, and `annotations.workers/alias` (when the version was uploaded with `--preview-alias <alias>`). Newest-of-`<alias>` is the item whose `annotations.workers/alias` equals `<alias>` with the greatest `metadata.created_on`. A worked shape:
62
+
63
+ ```javascript
64
+ // Inside the Deploy Adapter's default vendor binding.
65
+ const listOut = await runVendorCli(['versions', 'list', '--json']);
66
+ const versions = JSON.parse(listOut.stdout);
67
+ const forAlias = versions
68
+ .filter(v => v.annotations?.['workers/alias'] === alias)
69
+ .sort((a, b) => Date.parse(b.metadata.created_on) - Date.parse(a.metadata.created_on));
70
+ if (forAlias.length === 0) {
71
+ throw new Error(`DEPLOY_ALIAS_UNKNOWN: no version behind alias '${alias}'`);
72
+ }
73
+ return forAlias[0].id;
74
+ ```
75
+
76
+ A project that runs a single alias (the common `main`-only case) can drop the filter and pick the newest of any; the semantic is identical when only one alias exists.
77
+
78
+ ## The rollback verb
79
+
80
+ Rollback IS a promote of a prior version id. The blueprint's Deploy Adapter surfaces one path (`promoteVersion`); the vendor's convenience shortcut `wrangler rollback [<version-id>]` is optional operator documentation for a break-glass path that bypasses the deploy-log record and the served-surface verifier. Do not use it as the recorded ship path.
81
+
82
+ ## Reader notes
83
+
84
+ - The exact `<version-prefix>` string the vendor uses in the per-version-id URL is a vendor implementation detail; the operator does not name it. The URL is the whole shape; the adapter's `describeVersion` returns it verbatim.
85
+ - The alias URL host segment is a function of the alias string; the alias `main` produces the host segment `main-<worker-name>`. The Preview URL Resolver (TAC-1303) refuses an alias whose assembled host would equal the production URL host; a manifest that would collapse them refuses to load. Collapse is only reachable on the workers.dev-only production branch where alias `<worker-name>` (or any string that assembles to the same host) would collide with the production host; the branch's default alias `main` is safe by inspection.
86
+ - The production URL is derived from the wrangler manifest's `routes`/`route`/`workers_dev` block. When a custom domain owns production, the vendor's own custom-hostname primitive is what binds the domain to the Worker; the blueprint does not itself provision DNS or issue TLS. When `workers_dev = true` owns production, the URL is `<worker-name>.<subdomain>.workers.dev` and the resolver's `resolveSubdomain()` fills the `<subdomain>` segment.
@@ -0,0 +1,85 @@
1
+ # wrangler.toml shape sample
2
+
3
+ Reference shape for a Worker that reads a KV namespace, a D1 database, a set of secrets, and serves static assets behind an auth gate. Every value with `<...>` is a placeholder the project fills. Two production-URL branches are shown, custom-domain and workers.dev-only; pick one, delete the other.
4
+
5
+ ```toml
6
+ # repo-root wrangler.toml
7
+ name = "<worker-name>"
8
+ main = "src/worker.ts"
9
+ compatibility_date = "2026-08-01"
10
+ compatibility_flags = ["nodejs_compat"]
11
+
12
+ # --- production routing: pick ONE branch ---
13
+
14
+ # Branch A: custom domain owns production (workers_dev = false so production
15
+ # is unambiguously the custom domain; the preview alias URL still lives on
16
+ # workers.dev regardless).
17
+ routes = [
18
+ { pattern = "<production-hostname>", custom_domain = true }
19
+ ]
20
+ workers_dev = false
21
+
22
+ # Branch B (workers.dev-only, no custom domain): production is
23
+ # <worker-name>.<subdomain>.workers.dev, where <subdomain> is the account's
24
+ # workers.dev subdomain. Discover it via the CF REST API (see
25
+ # `preview-alias-shape.md` under `Discovering the workers.dev subdomain`);
26
+ # do NOT hardcode.
27
+ # workers_dev = true
28
+ # (delete the `routes = [...]` block above when using Branch B)
29
+
30
+ # --- static-assets binding ---
31
+ # The assets pipeline serves any file under `directory` at its file-path
32
+ # BEFORE the Worker's fetch handler runs. That means `./public/notes.html`
33
+ # is reachable at `/notes` and at `/notes.html` from the edge cache with
34
+ # no code executing. On any Worker with an auth gate, that ordering
35
+ # silently bypasses the gate for any collision path.
36
+ #
37
+ # `run_worker_first` is the switch that inverts the ordering: for every
38
+ # listed path (glob-matched), the fetch handler runs FIRST and the assets
39
+ # pipeline is a fallback. Set it whenever the Worker gates access to
40
+ # anything a static-file path could shadow.
41
+ [assets]
42
+ directory = "./public"
43
+ binding = "ASSETS"
44
+ run_worker_first = [
45
+ "/api/*",
46
+ "/<auth-gated-path-1>",
47
+ "/<auth-gated-path-2>"
48
+ ]
49
+
50
+ # --- non-secret vars (populated into env.<NAME> at runtime) ---
51
+ [vars]
52
+ LOG_LEVEL = "info"
53
+
54
+ # --- KV namespace binding (id filled by the operator; not a secret) ---
55
+ [[kv_namespaces]]
56
+ binding = "SESSION_KV"
57
+ id = "<kv-namespace-id>"
58
+
59
+ # --- D1 database binding ---
60
+ [[d1_databases]]
61
+ binding = "APP_DB"
62
+ database_name = "<database-name>"
63
+ database_id = "<database-id>"
64
+
65
+ # --- Secret bindings: NO DECLARATION BLOCK IN THIS FILE ---
66
+ # wrangler 4.x has no top-level `[secrets]` key. Secret binding NAMES
67
+ # are declared implicitly by the Worker code reading `env.<NAME>`; the
68
+ # vendor's pre-flight refuses `wrangler deploy` when a referenced secret
69
+ # has not been set on the target Worker. See `bootstrap-vs-steady-state.md`
70
+ # for the first-deploy path (`wrangler deploy --secrets-file <tmp>`) and
71
+ # the steady-state path (`wrangler secret put <NAME>` from CI).
72
+ #
73
+ # A project that wants a human-readable manifest of required secrets can
74
+ # maintain one in a README section or a project-owned `SECRETS.md`; that
75
+ # manifest is intent-documentation and is NOT vendor-parsed.
76
+ ```
77
+
78
+ ## Reader notes
79
+
80
+ - `name`, `main`, and `compatibility_date` are the three top-level keys the manifest loader (TAC-1302) refuses to load without. `compatibility_date` must match `\d{4}-\d{2}-\d{2}`.
81
+ - Every binding name referenced from `src/worker.ts` (through `env.SESSION_KV.get(...)`, `env.APP_DB.prepare(...)`, `env.<SECRET_NAME>`, and so on) must appear as a declaration key in this file OR as a secret set on the Worker via the vendor's secret-set flow. The manifest loader's binding-usage scan refuses the build with `WRANGLER_BINDING_UNDECLARED` when a non-secret binding is missing; the vendor's pre-flight refuses the deploy when a secret is missing on the target.
82
+ - **Assets-binding auth-gate discipline (security-class).** The `[assets] run_worker_first` list is load-bearing whenever the Worker gates access to any path that a static file under `directory` could shadow. Without it, a request to `/<gated-path>` is answered from `./public/<gated-path>.html` (if the file exists) BEFORE the fetch handler runs; the auth check is silently bypassed. The manifest loader flags a manifest that declares `[assets]` and a fetch handler with an auth middleware but no `run_worker_first` entries covering the middleware's protected routes; a project unsure which routes to list defaults to `run_worker_first = ["/*"]` and accepts serving static assets only under `not_found_handling`.
83
+ - Secret binding VALUES never appear in this file. There is no `[secrets]` block in wrangler 4.x; the vendor treats every `env.<NAME>` reference from Worker code as an implicit binding declaration and enforces its presence at deploy time. Values arrive on the Worker via the vendor's secret-set flow (see `bootstrap-vs-steady-state.md`) sourced from the project's secrets contract (see the `security-secrets-management` blueprint at slug `security-secrets-management`, or the equivalent project-authored pipeline).
84
+ - `routes` and `workers_dev` together declare the production URL. Branch A (`workers_dev = false` with a `routes = [...]` custom-domain entry) is the shape for projects that own a custom domain. Branch B (`workers_dev = true`, no `routes`) is the shape for greenfield workers.dev-only projects; production is then `<worker-name>.<subdomain>.workers.dev` and the Deploy Adapter discovers `<subdomain>` at boot rather than hardcoding it.
85
+ - Build-provenance values (`versionSha`, `builtAt`, `ciRunUrl`) are NOT declared here. They are injected into the built bundle by the `build-and-upload` workflow (see `assets/ci-workflows/build-and-upload.yml.md`). The `versionSha` served on the health probe is the git commit sha (`github.sha`), NOT the vendor-assigned version UUID; see `served-surface-probes.md` for the distinction.
@@ -0,0 +1,48 @@
1
+ {
2
+ "slug": "deploy-cloudflare-workers",
3
+ "version": "1.1.0",
4
+ "category": "deploy",
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" },
36
+ {
37
+ "id": "ADR-1301-deploy-cloudflare-workers-deployment-target",
38
+ "kind": "adr",
39
+ "path": "adrs/adr-1301-deploy-cloudflare-workers-deployment-target.json",
40
+ "scope": "global",
41
+ "topic": "deploymentTarget"
42
+ },
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" }
47
+ ]
48
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "adrId": "ADR-1301-deploy-cloudflare-workers-deployment-target",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "The project's deployment target is an artefact-upload + explicit-promote model, versions addressable at stable preview URLs, one adapter as the sole vendor caller",
8
+ "context": "Every non-trivial project ships to a running target. The failure modes accumulate the same way secrets ones do: an ad-hoc deploy shell script on a laptop, a CI step that pushes to production on every merge, a rollback path nobody has tested since the last incident, a review URL that is production itself. A single-source-of-truth model addresses the root cause: one manifest, one adapter, one upload verb, one promote verb, one served-surface verifier. This topic is scoped as a project-level global because a composing blueprint that holds a different opinion on the deployment shape (a container-image-per-commit + rolling-deploy blueprint, a monolithic-deploy blueprint, a serverless-function-per-endpoint blueprint) needs to conflict here and be resolved by the operator.",
9
+ "decision": "The project's deployment target is an artefact-upload + explicit-promote model. The Deploy Adapter (TAC-1301) is the sole caller of the deploy vendor; the wrangler manifest (TAC-1302) is the sole declaration of the deploy shape. Every merge to the main branch uploads a version through the adapter's `uploadVersion` verb and produces two addressable URLs (a per-version-id URL and a stable preview alias URL). Production only changes when the operator runs the `promote` workflow, which invokes `promoteVersion` on the adapter with a resolved version id. Rollback is a promote of a prior version id. Every promote runs the Served-surface Verifier against the production URL and fails the release on any probe breach. The vendor is pluggable; the interface is not. The default vendor is named in ADR-1302; alternatives supersede this ADR at the project level.",
10
+ "consequences": "One place to change vendors, one place to audit the deploy trail, one place to enforce the promote-is-explicit invariant. The manifest becomes a piece of documentation the project maintains as part of its normal change flow, which is the intended cost. Preview URLs and production URLs are always distinct and both discoverable through the adapter's `deploy status` verb. Composition with a blueprint that would import a vendor deploy SDK directly or that would auto-promote on merge conflicts here by design; the operator supersedes with a project-level ADR that either accepts the composed blueprint's shape or restates this one's.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Merge-to-production (coupled upload + promote)",
14
+ "summary": "Every merge to main deploys straight to production; no distinct promote step; the vendor CLI's coupled `deploy` verb is called from the merge workflow.",
15
+ "reasonNotChosen": "This is the default state most small projects drift into and the state this blueprint exists to end. Every merge is a production act; a bad merge is a bad release; rollback is a git revert followed by a second merge-to-production; the review URL is production itself. Fine for a solo project on a low-stakes surface; the wrong default for anything with users. A project that legitimately wants the coupled shape can still apply this blueprint, restate ADR-1301 with a project-level ADR that permits coupled deploy, and set the `promote` workflow to trigger on merge. The blueprint does not fight the operator; it makes the default a distinct step."
16
+ },
17
+ {
18
+ "name": "Per-commit container image + rolling deploy on a Kubernetes-shaped target",
19
+ "summary": "Every merge builds a container image tagged by commit; a controller rolls the image out to a fleet of replicas; canary and progressive delivery layer above.",
20
+ "reasonNotChosen": "A legitimate shape at a larger scale; wrong altitude for the rcf-lite tier this blueprint targets. The trade against the artefact-upload + promote model is running the controller and the fleet; the payoff is finer-grained rollout control. A project outgrowing the artefact-upload model authors a project-level ADR that adopts a container-oriented target and applies a different deploy blueprint (a future `deploy-k8s-service` blueprint would sit at that altitude)."
21
+ },
22
+ {
23
+ "name": "Vendor-committed opinionated blueprint (Cloudflare Workers only, at the contract layer)",
24
+ "summary": "Ship the blueprint tied to Cloudflare Workers at the contract layer; the manifest is `wrangler.toml`, the CLI is `wrangler`, the URLs are workers.dev, no adapter port.",
25
+ "reasonNotChosen": "Locks the project to a vendor at the blueprint layer, which the doctrine of round-2 refuses (vendor default belongs at ADR-1302, contract belongs here). A composing blueprint or a project that wants a different vendor can only escape by removing this blueprint. Splitting the contract from the default keeps both moves available; the adapter port shape (see TAC-1301) is what makes a vendor swap a project-side ADR change plus an adapter reimplementation, not a blueprint change."
26
+ }
27
+ ],
28
+ "createdAt": "2026-08-30T00:00:00Z",
29
+ "updatedAt": "2026-08-30T00:00:00Z"
30
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "adrId": "ADR-1302-deploy-cloudflare-workers-default-vendor",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "The default deployment vendor is Cloudflare Workers via the wrangler CLI",
8
+ "context": "ADR-1301 fixes the contract; a project applying this blueprint still needs a working default vendor on day one. The rcf-lite tier this blueprint targets is small greenfield projects: a single Worker or a small handful, one small team or one solo operator, no ops team standing by. A default vendor for that tier should ship with zero infrastructure to run, a small operational footprint, a runtime whose primitive shape (edge-runtime request handler, bound resources) fits the artefact-upload + promote model, and a CLI that surfaces the upload/promote/list primitives the adapter needs. Larger deployments will supersede this decision with a different vendor; the point of a default is that day one works.",
9
+ "decision": "The default deployment vendor is Cloudflare Workers accessed through the `wrangler` CLI. The Deploy Adapter's default backing binding shells to `wrangler versions upload --preview-alias <alias>` for `uploadVersion`, `wrangler versions deploy <versionId>` for `promoteVersion`, `wrangler versions list` for `listVersions`, and the vendor's alias-lookup verb for `resolveNewestOfMain`. The wrangler manifest at the repo root is `wrangler.toml` (or `wrangler.jsonc` at operator preference). The preview URL patterns are the vendor's public URL contracts (per-version-id hostnames and per-alias hostnames on the workers.dev subdomain, or their custom-hostname mapped equivalents). The default is chosen because the zero-infrastructure floor is real for the target tier: no cluster to run, no image registry to feed, per-request cold-start amortised by the vendor, and the primitives ship the artefact-upload + promote split as first-class CLI verbs. Projects that outgrow the default supersede this ADR with a project-level ADR selecting a different deploy vendor and swap the adapter's vendor binding.",
10
+ "consequences": "The project ships with a working deploy flow on day one and does not force an ops decision before the first commit. The Cloudflare account, an account id, and an API token become first-class pieces of operator state the project manages (the token scoped to the account with the minimum verbs the adapter uses; the token is a secret bound through the secrets contract, not committed anywhere). The Worker runtime shape (edge-runtime, request-scoped, no long-lived process) is now a constraint the Worker's own code respects; a project that outgrows that shape supersedes ADR-1302 with a different vendor and adapts the code to the new runtime. Composition with a vendor-specific superseding blueprint (a project-authored `deploy-fly-io` blueprint minted on demand, a future `deploy-vercel` or `deploy-k8s-service` blueprint) is a project-level ADR change and a vendor-binding swap; the ADR-1301 contract stays intact.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Fly.io",
14
+ "summary": "Deploy a Docker image to a Fly.io app; the vendor binding shells to `flyctl deploy`.",
15
+ "reasonNotChosen": "A genuinely different vendor shape (persistent VMs, per-region deploy control, a Docker image as the artefact). A reasonable pair candidate when a project wants a general-purpose deploy target with more control over the runtime. Not the day-one default because the edge-runtime shape of Cloudflare Workers fits more of the estate's actual live projects; a future `deploy-fly-io` blueprint mints on demand and composes cleanly through the ADR-1301 contract with a project-level supersede on ADR-1302."
16
+ },
17
+ {
18
+ "name": "Vercel",
19
+ "summary": "Deploy through Vercel's preview + production deploy model; the vendor binding shells to `vercel deploy` and `vercel promote`.",
20
+ "reasonNotChosen": "Vercel's preview-vs-production shape maps well onto the ADR-1301 contract. Reserved as a natural future blueprint on demand for projects that want Vercel's Next.js-first surface. Not the day-one default because the estate's live footprint is on Cloudflare Workers; a project on Vercel supersedes ADR-1302 and adapts the binding."
21
+ },
22
+ {
23
+ "name": "AWS Lambda / Google Cloud Run / other cloud-native FaaS",
24
+ "summary": "Deploy a function image or bundle to a hyperscaler's FaaS surface; the vendor binding shells to the cloud SDK's deploy verb.",
25
+ "reasonNotChosen": "Ties the project to one cloud at the deploy layer; the doctrine of ADR-1301 keeps the contract vendor-agnostic on purpose. Excellent choice for a project already committed to one cloud and using its identity model for deploy authentication; a project-level ADR supersede is the intended path."
26
+ },
27
+ {
28
+ "name": "Self-hosted VPS + a Docker Compose stack",
29
+ "summary": "SSH to a VPS and run `docker compose pull && docker compose up -d`; no vendor account, no per-request billing.",
30
+ "reasonNotChosen": "The self-hosted shape does not fit the artefact-upload + promote model without additional plumbing (a bespoke version-store, a bespoke promote step, a bespoke rollback path). A legitimate ecosystem choice for a project that wants full self-hosted control; a future `deploy-docker-compose-vps` blueprint would live at a different altitude and would not need to be `accountBound` at all."
31
+ }
32
+ ],
33
+ "createdAt": "2026-08-30T00:00:00Z",
34
+ "updatedAt": "2026-08-30T00:00:00Z"
35
+ }