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,46 @@
1
+ {
2
+ "usId": "observability-probe-endpoints-US-14105",
3
+ "prdId": "PRD-001",
4
+ "reqId": "observability-probe-endpoints-REQ-005",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Each profile's response contract is exactly what its supervisor reads and nothing more",
8
+ "asA": "operator whose service is probed by a supervisor with a fixed idea of what a probe response looks like",
9
+ "iWant": "the response contract to match the supervisor's shape and stay minimal",
10
+ "soThat": "the supervisor's parsing never sees an unexpected field and the surface never carries operational detail the supervisor does not read",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-14105-1",
14
+ "description": "The `loadBalancer` profile answers with an empty response body and the resolved status code (200 pass, 503 fail).",
15
+ "given": "a process on the `loadBalancer` profile whose readiness predicate is pass, then fail",
16
+ "when": "an HTTP GET is issued against the resolved health path in each state",
17
+ "then": "the pass response has status 200 with content-length 0 and no body; the fail response has status 503 with content-length 0 and no body",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-14105-2",
23
+ "description": "The `kubernetes` profile answers with a JSON body of exactly `{\"status\":\"pass\"}` or `{\"status\":\"fail\"}` and no additional keys.",
24
+ "given": "a process on the `kubernetes` profile with liveness pass and readiness pass, then readiness fail",
25
+ "when": "an HTTP GET is issued against `/live` and `/ready` in each state and the parsed JSON body key set is inspected",
26
+ "then": "the parsed body is exactly a one-key object whose only key is `status` and whose value is `pass` or `fail` matching the resolved answer",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-14105-3",
32
+ "description": "The `dockerHealthcheck` profile exits with code 0 on pass and a non-zero code on fail; the profile emits no HTTP surface.",
33
+ "given": "a process configured with `probeInterface.profile: dockerHealthcheck` and the profile's readiness predicate pass, then fail",
34
+ "when": "the profile's healthcheck command entry point is invoked in each state",
35
+ "then": "the pass invocation exits with code 0; the fail invocation exits with a non-zero code; the process opens no HTTP probe listener when this profile is selected",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-1502-observability-probe-endpoints-handler-set",
42
+ "TAC-1504-observability-probe-endpoints-non-http-adapters"
43
+ ],
44
+ "createdAt": "2026-08-30T00:00:00Z",
45
+ "updatedAt": "2026-08-30T00:00:00Z"
46
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "usId": "observability-probe-endpoints-US-14106",
3
+ "prdId": "PRD-001",
4
+ "reqId": "observability-probe-endpoints-REQ-006",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "External-visible probe responses expose no internal identifier or operational value",
8
+ "asA": "operator whose probe surface is reachable by anyone who resolves the traffic host",
9
+ "iWant": "the probe response to carry no dependency name, environment, hostname, replica id, build hash, or metric",
10
+ "soThat": "the surface never fingerprints the service to a reader who was not meant to inspect the internal shape",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-14106-1",
14
+ "description": "The Kubernetes profile's `/live` and `/ready` responses contain no substring matching a declared dependency name, environment name, hostname, replica identifier, build hash, or commit sha.",
15
+ "given": "a process on the Kubernetes profile with declared dependencies `paymentsProvider` and `primaryStore`, environment `live`, hostname `svc-abc-123`, build hash `deadbeef`, commit sha `abcd1234abcd1234abcd1234abcd12341234abcd`",
16
+ "when": "an HTTP GET is issued against `/live` and against `/ready` and each response body is scanned for the tokens above",
17
+ "then": "no scan finds any of the tokens on either response body",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-14106-2",
23
+ "description": "The profile validator refuses a profile override that adds a field beyond the enumerated response contract at boot.",
24
+ "given": "a profile configuration that adds a `dependencies` array to the Kubernetes profile's response body",
25
+ "when": "the profile validator runs at boot",
26
+ "then": "the process exits with a non-zero code and emits a `PROBE_RESPONSE_FIELD_REFUSED` error naming the offending field and the profile name",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-14106-3",
32
+ "description": "The load-balancer and reverse-proxy profile responses contain content-length zero on every request.",
33
+ "given": "a process on the `loadBalancer` profile and a second process on the `reverseProxy` profile, both booted normally",
34
+ "when": "HTTP GET requests are issued against the resolved health path on each process for both pass and fail states",
35
+ "then": "every response carries `Content-Length: 0` and the response body is empty",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-1502-observability-probe-endpoints-handler-set"
42
+ ],
43
+ "createdAt": "2026-08-30T00:00:00Z",
44
+ "updatedAt": "2026-08-30T00:00:00Z"
45
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "usId": "observability-probe-endpoints-US-14107",
3
+ "prdId": "PRD-001",
4
+ "reqId": "observability-probe-endpoints-REQ-007",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The probe paths sit on the project's auth-exempt list scoped exactly to the resolved set on the resolved listener",
8
+ "asA": "operator running the service behind an auth middleware that rejects unauthenticated requests by default",
9
+ "iWant": "the supervisor's probe requests to bypass auth on exactly the profile-resolved probe paths and only on the listener the profile bound those handlers to",
10
+ "soThat": "the supervisor gets the answer without a credential it cannot present and no adjacent route falls under the same exemption",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-14107-1",
14
+ "description": "On the Kubernetes profile with fused topology and an auth middleware that rejects unauthenticated requests, GET on the resolved `/live` and `/ready` paths returns the probe status; GET on any other user-traffic route returns the middleware's unauthenticated response.",
15
+ "given": "a process on the Kubernetes profile with fused topology, a project auth middleware installed on the user-traffic listener that returns 401 on unauthenticated requests, and a user-authored `/api/orders` route on that listener",
16
+ "when": "unauthenticated GET requests are issued to `/live`, `/ready`, `/api/orders`, and `/ready/next`",
17
+ "then": "`/live` and `/ready` return 200 or 503 per the probe answer; `/api/orders` returns 401; `/ready/next` returns the route's normal handler-or-not-found response after the middleware runs (a match on `/ready/next` is not treated as an exempt path)",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-14107-2",
23
+ "description": "On the Kubernetes profile with separate-port topology, the separate probe listener does not install the project auth middleware and answers probes without an auth challenge; the user-traffic listener answers `/live` and `/ready` under normal auth rules.",
24
+ "given": "a process on the Kubernetes profile with `probeListener.separatePort: 9091` and a project auth middleware installed on the user-traffic listener",
25
+ "when": "unauthenticated GET requests are issued to `/live` and `/ready` on both port 9091 and on the user-traffic port",
26
+ "then": "the port-9091 requests return the probe status; the user-traffic-port requests return the auth middleware's unauthenticated response",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-14107-3",
32
+ "description": "The exemption list produced by the profile at boot enumerates exactly the resolved probe path set, scoped by exact-match rules, and is refused if any entry contains a wildcard or prefix syntax.",
33
+ "given": "the exemption list produced by the profile resolver on the Kubernetes profile default",
34
+ "when": "the exemption-list emitter runs and the produced entries are inspected",
35
+ "then": "the list contains exactly the strings `/live` and `/ready` and their exact-match matcher rule; any injected entry containing `*` or a trailing slash to imply a prefix causes the emitter to refuse with a stable-coded error",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-1503-observability-probe-endpoints-listener-topology"
42
+ ],
43
+ "createdAt": "2026-08-30T00:00:00Z",
44
+ "updatedAt": "2026-08-30T00:00:00Z"
45
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "usId": "observability-probe-endpoints-US-14108",
3
+ "prdId": "PRD-001",
4
+ "reqId": "observability-probe-endpoints-REQ-008",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Switching the target integration is a configuration change that takes effect on next boot",
8
+ "asA": "operator moving a service from one supervising system to another",
9
+ "iWant": "the shift to be a change to the profile name and its options and nothing else",
10
+ "soThat": "the migration cost is bounded and the source tree stays free of per-supervisor conditionals",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-14108-1",
14
+ "description": "A running service on the `kubernetes` profile, reconfigured to `probeInterface.profile: loadBalancer` and restarted, binds a single `/health` handler with the `singleHealthSignal` semantic model without changes to the source tree.",
15
+ "given": "a process booted on `kubernetes` default, and the same source tree with only `probeInterface.profile` changed to `loadBalancer` in configuration",
16
+ "when": "the process restarts on the new configuration and the topology binds",
17
+ "then": "a GET against `/health` returns 200 or 503; no probe handler is bound at `/live` or `/ready`; a source-tree diff between the two boots contains no non-configuration changes",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-14108-2",
23
+ "description": "A profile switch that requires a new custom profile is authored against the profile contract and filed under `profiles/custom/<name>` in the project; the switch is then a configuration change to `probeInterface.profile: custom:<name>`.",
24
+ "given": "a project that authored a `custom:tcpOnly` profile against the profile contract at `profiles/custom/tcpOnly.js` (or equivalent)",
25
+ "when": "the operator sets `probeInterface.profile: custom:tcpOnly` in configuration and the process restarts",
26
+ "then": "the resolver loads the custom profile, the topology binds the profile's declared surface, and no additional source-tree change is required to move between the shipped set and the custom profile",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-14108-3",
32
+ "description": "The profile-resolver call site is a single import point in the process boot path; the source-tree scan finds no per-profile conditional outside the profile modules and the resolver itself.",
33
+ "given": "the project's boot-path source tree",
34
+ "when": "a scan searches for `probeInterface.profile` usage and per-profile branching (e.g., `if (profile === 'kubernetes')`) outside the `profiles/` directory and the profile-resolver module",
35
+ "then": "the scan finds exactly one usage of `probeInterface.profile` (the resolver invocation) and zero per-profile conditionals in the rest of the boot path",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-1501-observability-probe-endpoints-profile-resolver",
42
+ "TAC-1502-observability-probe-endpoints-handler-set"
43
+ ],
44
+ "createdAt": "2026-08-30T00:00:00Z",
45
+ "updatedAt": "2026-08-30T00:00:00Z"
46
+ }
@@ -0,0 +1,51 @@
1
+ # observability-probe-endpoints blueprint coordination vocabulary
2
+
3
+ This file is the observability-probe-endpoints half of the cross-blueprint contract. The Phase 1 conflict detector matches scope:global ADR topics by EXACT string equality, and AC ids are unnamespaced by the 0.5.0 grammar. Any blueprint intended to compose with this one must reuse these exact strings and respect these bands.
4
+
5
+ ## Global ADR topics this blueprint contributes (exact strings)
6
+
7
+ | Topic string | observability-probe-endpoints contribution | Origin | Composition note |
8
+ |---|---|---|---|
9
+ | `healthProbes` | ADR-1501-observability-probe-endpoints-health-probes | Reused from the observability-essentials vocabulary (observability-essentials contributes a self-supervised two-endpoint HTTP JSON contract on the request-traffic listener at the same topic string). This blueprint contributes an elicit-from-target-integration-profile model on the same topic string on purpose. | The one project-wide decision on the health probe interface. Composing this blueprint with observability-essentials fires a `globalAdrTopic` conflict by design because the two blueprints answer different questions: essentials commits to a self-supervised HTTP JSON floor; this blueprint commits to an elicit-and-adapt model whose shape follows the external supervisor. Expected resolution: one project-level ADR that either commits to the elicit-and-adapt model (external supervisor drives the shape) or the fused self-supervised model (project owns the shape) or an explicit hybrid with boundaries |
10
+ | `readinessSemantics` | ADR-1502-observability-probe-endpoints-readiness-semantics | Reused from the observability-essentials vocabulary (observability-essentials contributes strict-any-fail-over-declared-deps as the project-wide readiness rule at the same topic string). This blueprint contributes per-profile readiness semantics on the same topic string on purpose. | The one project-wide readiness semantics decision. Composing with observability-essentials fires a `globalAdrTopic` conflict by design. Expected resolution: one project-level ADR that commits to one of the two rules or an explicit hybrid |
11
+
12
+ The observability-probe-endpoints blueprint claims two global topics. Every other contribution is scope-local (ADR-1503 the Kubernetes default, ADR-1504 the separate-port option, and ADR-1505 the external-response secrecy rule do not contribute global topics; a composing blueprint that holds an opinion on the default profile, on probe-listener topology, or on response secrecy authors its own project-level ADR if it wants to override).
13
+
14
+ Note on the deliberate conflict with observability-essentials: this blueprint is designed for the EXTERNAL-SYSTEM INTEGRATION case (orchestrators, load balancers, uptime monitors probing the service, with their conventions driving the wire shape). observability-essentials is designed for the SELF-SUPERVISED all-in-one case (probes plus public status page plus notification outcome sink for a project that designs its own observability floor). Both are legitimate; each is the right default for its case. The conflict is the mechanism telling the operator to pick one intentionally. Precedent for the vendor-sibling pattern: security-auth-clerk conflicts with security-auth-magic-link on `authModel` on purpose; persistence-data-d1 conflicts with persistence-data-sqlite on both `persistenceStore` and `migrationDiscipline` on purpose. This blueprint follows the same pattern on `healthProbes` and `readinessSemantics`.
15
+
16
+ Note on the delineation from observability-essentials's `statusPageContract` topic: this blueprint does not contribute an opinion on the public status page. A project that wants the probe surface from this blueprint AND the public status page and notification outcome sink from observability-essentials resolves the two `healthProbes` and `readinessSemantics` conflicts with project-level ADRs and keeps `statusPageContract` on the essentials-supplied side; the blueprints then compose without further conflict.
17
+
18
+ Rules for new topics (inherited from the application-spa, application-api-rest, security-auth-magic-link, persistence-data-sqlite, ci-pipeline, observability-essentials, security-secrets-management, security-auth-clerk, email-smtp-resend, and deploy-cloudflare-workers vocabularies, restated as law): lower camel case, one concept per topic, no version suffixes. A topic names the decision area, not the chosen answer. Do not mint variants of existing strings (`probeInterface`, `probeSurface`, `probes`, `livenessReadiness`, `probeTransport` are all wrong when `healthProbes` already exists; `readinessAggregation`, `readyPolicy`, `readinessRule` are all wrong when `readinessSemantics` already exists).
19
+
20
+ ## Id number bands (registry bootstrap)
21
+
22
+ AC ids (and therefore US numeric ids, which anchor them) are NOT namespaced by the 0.5.0 schema grammar; the band allocation IS the AC-collision enforcement mechanism. Composing blueprints take a fresh band rather than proposing namespaced AC ids. Band allocation is ratified policy (2026-08-19); this table is the shared registry-bootstrap replicated across every shipped and forthcoming blueprint's `docs/topics.md` until a mechanism-side central registry lands (v1.1 candidate).
23
+
24
+ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. Rows are recorded at ship, never predicted.
25
+
26
+ | Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
27
+ |---|---|---|---|---|
28
+ | application-spa | 1101-1899 | 2xx | shipped v1.3.0 | `clientRouting`, `theming`, `clientState`, `errorEnvelope`, `authModel` |
29
+ | application-api-rest | 2101-2899 | 3xx | shipped v1.0.0 | `errorEnvelope`, `authModel`, `apiVersioning`, `logging` |
30
+ | security-auth-magic-link | 3101-3899 | 5xx | shipped v1.0.0 | `authModel` |
31
+ | email-smtp-resend | 4101-4899 | 4xx | shipped v1.0.0 | none |
32
+ | hello-panel (walkthrough exemplar) | 4101-4899 | 4xx | doc-reserved; teaching exemplar in `packages/rcf-lite/docs/blueprint-authoring-walkthrough.md`, not shipped as a blueprint directory | `operatorPanel` |
33
+ | persistence-data-sqlite | 5101-5899 | 6xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
34
+ | ci-pipeline | 6101-6899 | 7xx | shipped v1.0.0 | `ciGates`, `strictCoverageGate` |
35
+ | observability-essentials | 7101-7899 | 8xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics`, `statusPageContract` |
36
+ | security-secrets-management | 8101-8899 | 9xx | shipped v1.0.0 | `secretsSource` |
37
+ | security-auth-clerk | 9101-9899 | 10xx | shipped v1.0.0 | `authModel` |
38
+ | security-auth-oauth2 | 10101-10899 | 11xx | shipped v1.0.0 | `authModel` |
39
+ | security-auth-keycloak | 11101-11899 | 12xx | shipped v1.0.0 | `authModel` |
40
+ | deploy-cloudflare-workers | 12101-12899 | 13xx | shipped v1.0.0 | `deploymentTarget` |
41
+ | persistence-data-d1 | 13101-13899 | 14xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
42
+ | observability-probe-endpoints | 14101-14899 | 15xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics` |
43
+
44
+ US 14101-14108 sit at the LOW end of the 14101-14899 band on purpose. A project-side story that mechanically derives from an observability-probe-endpoints REQ id into the number `14108` would collide against observability-probe-endpoints-US-14108 in this package; the band leaves headroom at the HIGH end (US 14181-14899) so a project's own stories anchored to observability-probe-endpoints REQs can allocate without conflict. The watchpost run4 lesson applies here too. Band spacing between the previous HQ-lane row (persistence-data-d1, 13101-13899, 14xx) and this one (14101-14899, 15xx) reflects the four-digit widening pattern opened by security-auth-clerk at 10xx and continued through the round-2 HQ lane.
45
+
46
+ ## Shared expectations for future composing blueprints
47
+
48
+ - Reuse `healthProbes` exactly as spelled here when your blueprint holds an opinion on the health probe interface; contribute your own scope:global ADR on that string and let composition surface the pairing. A future blueprint that ships a metrics-probe hybrid or a health-check protocol variant (an OpenTelemetry-agent-scrape probe, a JMX health surface) will conflict here by design and expect a project-level ADR resolution.
49
+ - Reuse `readinessSemantics` exactly as spelled here when your blueprint holds an opinion on readiness aggregation or its evaluator cadence.
50
+ - The Kubernetes default (ADR-1503), the separate-port option (ADR-1504), and the external-response secrecy rule (ADR-1505) are scope-local. A composing blueprint that holds a different opinion on the default profile, the listener topology, or the response surface authors its own project-level ADR; none of them are minted as globals because the space of legitimate variations is smaller than the space of legitimate `healthProbes` variations.
51
+ - Global topics that plausibly belong to a future blueprint and are NOT claimed by any shipped blueprint: `messageSerialisation` and `deliverySemantics` (a message-consumer blueprint's natural globals), `caching` (unclaimed by every shipped blueprint), `metricsExport` and `tracingProtocol` (natural globals for a metrics or tracing blueprint that would compose alongside this one), `deploymentPackaging` (unclaimed; a natural global for a container-image or artefact-bundling blueprint that composes above the deploy target). Define any of these in your own package's topics doc, in this file's format, and consider whether the band-registry table above needs your slug added.
@@ -0,0 +1,83 @@
1
+ # Observability probe endpoints blueprint guide
2
+
3
+ ## What it is
4
+
5
+ A default probe-surface blueprint for rcf-lite projects that must integrate with an EXTERNAL supervising system whose conventions drive the probe wire shape. The blueprint contributes the WHAT of a probe pattern: how the operator declares which external supervisor the service runs under (`kubernetes`, `loadBalancer`, `uptimeMonitor`, `systemd`, `dockerHealthcheck`, `reverseProxy`, or a project-authored `custom:<name>`), how each profile fixes the probe transport, path or command surface, response contract, and semantic distinction between liveness and readiness for that supervisor, how a fused-listener default coexists with a `probeListener.separatePort` opt-in for probe-traffic isolation, how the auth-exempt list stays scoped to the resolved probe path set exactly, and how switching supervising systems is a configuration change rather than a source-tree reshape.
6
+
7
+ Concretely, the blueprint ships eight requirements, eight user stories (twenty-four acceptance criteria), four architecture components, and five architecture decision records. Two ADRs are `scope: global` on the topics `healthProbes` (the profile-elicited probe interface) and `readinessSemantics` (per-profile readiness aggregation); the other three are scope-local (Kubernetes default profile, separate-port option, external-response secrecy rule). The two global ADRs conflict with the observability-essentials sibling by design; see 'Boundary with observability-essentials' below.
8
+
9
+ ## What it is not
10
+
11
+ Not an all-in-one observability floor. There is no public status page here, no notification outcome sink, no metrics-export surface, no distributed-tracing surface, no authenticated operator dashboard. observability-essentials is the blueprint for the self-supervised all-in-one case; this one exists for the case where the external supervising system's conventions come first.
12
+
13
+ Not a readiness-check implementation. The blueprint fixes the SHAPE of the readiness predicate boundary (a synchronous function returning pass or fail, reading state a project-supplied evaluator maintains on its own cadence) and each profile's default aggregation rule. The per-dependency check code and the evaluator implementation are project-authored.
14
+
15
+ Not a supervisor-specific SDK. The blueprint holds no SDK dependency on Kubernetes, no client library for a specific cloud load balancer, no wrapper around a specific uptime-monitor API. The profile contract shapes the wire surface; the project brings whichever integration bits it needs on the outside of the boundary.
16
+
17
+ Not an auth middleware. The blueprint emits an exact-match exempt-path list the project's own auth middleware installer consumes. The middleware installer, the auth model itself, and the check code stay project-side; the exemption is a boundary contract, not a middleware implementation.
18
+
19
+ Not a listener library. The topology component (TAC-1503) accepts a project-supplied `userTrafficListener` and a project-supplied `listenerFactory` for the separate-port case. The blueprint holds no opinion on the HTTP server library (Node HTTP, Express, Hono, Fastify, or the Worker-style edge platform's own router).
20
+
21
+ ## Boundary with observability-essentials
22
+
23
+ observability-essentials and observability-probe-endpoints are BOTH `observability` category blueprints. They answer different questions:
24
+
25
+ - **observability-essentials** targets the self-supervised, all-in-one case: the project owns its observability surface end to end, wires two HTTP JSON probes (`/healthz`, `/readyz`) on the request-traffic listener with a stable body shape, ships a public status page for external readers, and ships a notification outcome sink for durable notification records. The audience of the probe body is the operator inspecting the deployed service in triage. The identity is 'a default observability floor'.
26
+
27
+ - **observability-probe-endpoints** targets the external-integration case: the service runs under a specific external supervising system (a Kubernetes kubelet, an application load balancer, an uptime monitor, a systemd unit, a Docker HEALTHCHECK invocation, a reverse-proxy upstream health check), and the wire shape of the probes follows that supervisor's conventions. The audience of the probe response IS the external supervisor; the response is minimal by construction so the surface never carries reconnaissance value to unintended readers. The identity is 'make your service correctly probeable by whatever external system supervises it'.
28
+
29
+ Composing the two on one project fires two `globalAdrTopic` conflicts (on `healthProbes` and on `readinessSemantics`) on purpose. The four documented resolution paths per topic apply: adopt the incoming blueprint (remove the existing), keep the existing (do not add the incoming), author a project-level ADR that supersedes both, or declare the resolution on the add itself with `--resolve`. The right resolution is usually one of two shapes:
30
+
31
+ - **Shape A (external supervisor wins):** the project runs under a supervisor whose conventions drive the wire shape; a project-level ADR fixes both topics against the probe-endpoints model and observability-essentials contributes the public status page and notification outcome sink through the compose while keeping its `statusPageContract` topic untouched.
32
+ - **Shape B (self-supervised wins):** the project designs its own observability floor without a specific external supervisor's conventions in view; a project-level ADR fixes both topics against the essentials model and this blueprint is not applied.
33
+
34
+ Explicit hybrids exist (an internal essentials-shaped surface for one audience and a profile-shaped external surface for the supervising system) and are legitimate; the project-level ADR names both surfaces with explicit boundaries and both blueprints compose.
35
+
36
+ Composing with the `deploy-cloudflare-workers` blueprint is a separate concern: that blueprint mandates its own build-provenance probe (`/healthz` by convention) whose response body carries `{ versionSha, builtAt, ciRunUrl }` for the deploy verifier's reconciliation, which is incompatible with every profile's minimal response contract; the two surfaces coexist on distinct paths (this blueprint's profile-owned path stays minimal, the deploy blueprint's provenance path lives on a separate string), and the boundary is documented on the deploy side in `assets/verification/served-surface-probes.md`.
37
+
38
+ ## When to reach for it
39
+
40
+ Reach for the observability-probe-endpoints blueprint when:
41
+
42
+ - The service runs under a specific external supervising system (Kubernetes, cloud load balancer, uptime monitor, systemd unit under `Type=notify`, Docker HEALTHCHECK invocation, reverse-proxy upstream health check) whose conventions drive what a probe looks like and what the answer means.
43
+ - The probe surface is reachable by parties beyond the intended supervisor (a fused-topology deployment where the public host resolves to the same port that answers probes), and the response contract must be minimal to keep reconnaissance value low.
44
+ - Multi-environment deployments switch supervising systems across environments (a `dev` environment on Docker Compose with a load-balancer-shaped health check, a `live` environment on Kubernetes with liveness and readiness); a configuration change per environment is the intended migration path.
45
+ - The probes are one integration surface among several the service exposes; other observability concerns (public status page, notification outcomes, metrics export, tracing) belong to other blueprints and stay out of scope here.
46
+
47
+ ## When it does not fit
48
+
49
+ Do not reach for the observability-probe-endpoints blueprint when:
50
+
51
+ - The project is a self-supervised all-in-one deployment where a single opinionated observability floor is the intended shape; observability-essentials is the right pick.
52
+ - The service is not probed by an external supervisor at all (a batch job with no supervising loop, a one-shot script, an internal-only tool without a health-check consumer). The blueprint's elicitation surface has nothing to fix in that case.
53
+ - The probes need to expose richer per-dependency state on the wire for a specific supervising system that reads it (an OpenTelemetry-agent-scrape shape, a gRPC-health-with-service-name shape). The blueprint's default profile set does not cover those; a `custom:<name>` profile is the mechanism escape, or a project-level ADR supersedes ADR-1501 and the project authors the richer surface directly.
54
+ - The project already has a project-level `healthProbes` ADR the operator wants to keep; applying this blueprint would fire a conflict the operator does not want to resolve. Not applying the blueprint is a legitimate outcome.
55
+
56
+ The round-2 shelf brief originally scoped this blueprint as a `kubernetes-service` deployment-shape blueprint, then reshaped it during review into `observability-probe-endpoints` (a probe-surface blueprint for any external supervising system, with Kubernetes as the shipped default). The reshape moves the identity from 'ship on Kubernetes' to 'be probeable by whichever supervisor probes you'; the boundary with observability-essentials (self-supervised all-in-one) came out of that reshape too. A future `deploy-kubernetes` blueprint in the `deploy` category may take on the deployment-manifest side of the original candidate; this one is the probe-surface side.
57
+
58
+ ## What a good outcome looks like
59
+
60
+ A project applies the observability-probe-endpoints blueprint on a fresh tree, declares its `probeInterface.profile` value for each environment, wires the readiness predicate against its declared dependency evaluator, chooses fused topology or `probeListener.separatePort` per environment, realises TAC-1501 through TAC-1504 in project-authored FBSes, and lands on a deployed service where:
61
+
62
+ - A Kubernetes-supervised pod on the shipped default answers HTTPGet `/live` and `/ready` on the container's request-traffic port; the standard `livenessProbe: { httpGet: { path: /live, port: <containerPort> } }` and `readinessProbe: { httpGet: { path: /ready, port: <containerPort> } }` on the podspec work without further wiring.
63
+ - A load-balancer-supervised container on the `loadBalancer` profile answers one HTTP GET at the resolved `/health` path with the status code alone and an empty body; the LB target-group health check sees the status flip within its own health-check interval budget and pulls the target from rotation without ambiguity from a body it never read.
64
+ - A systemd-supervised process on the `systemd` profile emits `sd_notify(READY=1)` after boot and `sd_notify(WATCHDOG=1)` on the configured watchdog cadence; the unit under `Type=notify` starts cleanly and stays healthy under the watchdog timeout.
65
+ - A Docker HEALTHCHECK on the `dockerHealthcheck` profile exits 0 on pass and non-zero on fail from the exec entry point the profile exposes; the container's HEALTHCHECK status flips as `docker inspect` reports.
66
+ - A separate-port Kubernetes deployment on `probeListener.separatePort: 9091` exposes only the traffic port on the Service; probes reach the pod on port 9091 from the kubelet on the pod network and never appear on the public interface.
67
+ - An unauthenticated GET against `/live` or `/ready` on the auth-installed listener answers without a credential challenge; an unauthenticated GET against `/ready/next` (a path adjacent to the exempt entry but not exempt itself) returns the middleware's normal unauthenticated response; the exemption never expanded beyond the resolved probe path set.
68
+ - A response body scan against every profile's response finds no dependency name, no environment identifier, no hostname, no replica id, no build hash, no commit sha; the pass or fail answer is the whole response surface.
69
+ - Switching a service from Kubernetes to a Docker Compose deployment behind a load balancer is a change to `probeInterface.profile` in configuration; a source-tree diff between the two boots contains no non-configuration changes and no per-profile conditional appears outside the profile modules and the resolver call site.
70
+
71
+ ## Operator decisions that remain open after apply
72
+
73
+ - Target integration profile (`kubernetes` default; `loadBalancer`, `uptimeMonitor`, `systemd`, `dockerHealthcheck`, `reverseProxy` supplied; `custom:<name>` slot for project-authored profiles). Blueprint owns the profile contract shape; project owns the per-environment selection.
74
+ - Probe path defaults (`/live` and `/ready` for Kubernetes, `/health` for load balancer, per-profile defaults elsewhere). Blueprint owns the defaults; project overrides at boot for compliance with a particular supervisor convention or platform mandate.
75
+ - Listener topology (fused user-traffic listener default, `probeListener.separatePort: <N>` opt-in). Blueprint owns the two shapes; project owns the per-environment choice.
76
+ - Readiness predicate implementation (the per-dependency check code, the evaluator cadence, the timeout budgets). Blueprint owns the predicate boundary and each profile's default aggregation rule; project owns the checks and the cadence values.
77
+ - Custom profile authoring (a project that authors `custom:<name>` supplies the profile object against the shipped contract). Blueprint owns the contract; project owns the profile.
78
+ - Auth middleware installer (the project supplies the installer that consumes the exempt-path list the topology component emits). Blueprint owns the exempt-list shape; project owns the middleware and the installer.
79
+ - systemd watchdog cadence, Docker HEALTHCHECK interval, TCP probe port. Blueprint owns the transport shape; project owns the cadence and interval values.
80
+
81
+ ## Cost-honesty paragraph
82
+
83
+ Shipping this doc set costs the project the following. Every process pays the profile-resolver step at boot and one indirection through the frozen profile object at each probe binding site; the cost is small but real. A project that wants hot-reload of the profile selection restarts the process gracefully; the blueprint declines to support live rebinding. The separate-port topology opens a second HTTP listener when in effect; the extra port is a small memory cost and one more thing to think about in the deployment substrate. The profile-swap-is-config invariant costs the project a small amount of author discipline: per-profile branching in the boot path outside the resolver call site would defeat the invariant, and the AC scan catches the drift only if the project wires it into its own CI. The response-minimalism-by-construction rule costs the project any richer probe body it may have wanted for its own consumption (that surface belongs to observability-essentials, to an authenticated dashboard, or to a project-side triage endpoint outside the probe path set). The blueprint says nothing about the public status page, the notification outcome sink, metrics export, distributed tracing, or the auth model itself; a project that needs any of those spends its own build cycles on them and this blueprint does not save it any work there.
@@ -0,0 +1,50 @@
1
+ # Persistence data D1 blueprint (v1.0.0)
2
+
3
+ The ninth content blueprint on the rcf-build-lite blueprint mechanism. Scope: Cloudflare D1 as the project's primary durable store for Workers-deployed applications, accessed request-scoped through a Worker-side facade module that is the sole reader of the D1 binding, with numbered forward-only migrations owned by the wrangler CLI, a deploy pipeline gate ordering the migrations apply strictly before the Worker deploy, prepared-statement discipline that closes the SQL-injection surface by construction, batch atomicity for multi-statement writes, and a two-path recovery model (Time Travel plus a scheduled portable export). Targeted at small greenfield rcf-lite projects deployed on Workers; other engines behind the same facade contract on supersede.
4
+
5
+ ## Apply
6
+
7
+ ```
8
+ rcf define blueprint add <path-to>/blueprints/persistence-data-d1
9
+ ```
10
+
11
+ Phase 1 resolves local path sources only; registry and git-ref resolution is a mechanism follow-up. Apply is idempotent; `rcf define blueprint list` shows the applied entry grouped under the `persistence` category; `rcf define blueprint remove persistence-data-d1` cleanly removes an unreferenced application.
12
+
13
+ ## Anatomy
14
+
15
+ | Piece | Where | What |
16
+ |---|---|---|
17
+ | Metadata | `blueprint.json` | Slug, version, category `persistence`, and the 23 contributions with scope/topic on the two global ADRs |
18
+ | Doc set | `contributions/` | 7 REQs, 7 USs (20 ACs), 4 TACs, 5 ADRs, all schema-valid and namespaced (`persistence-data-d1-REQ-001` prefix family; `ADR-1401-persistence-data-d1-store-model` suffix family) |
19
+ | Wrangler D1 binding sample | `assets/wrangler-config/d1-binding-shape.md` | The exact shape of a `d1_databases[]` entry with `binding`, `database_name`, `database_id`, `migrations_dir`, `migrations_table`, and `migrations_pattern`, worked as one committable example with placeholders only |
20
+ | Migration file shape sample | `assets/migration-shape/migration-file-shape.md` | The exact shape of a numbered migration file under the wrangler-configured directory, with a worked four-migration example |
21
+ | Facade module shape sample | `assets/facade-shape/facade-module-shape.md` | The exact shape of the D1 store facade module (`createStore({ env, bindingName, onEvent })` factory, named verbs, prepared-statement discipline, batch atomicity) with a worked domain example |
22
+ | Batch usage sample | `assets/batch-usage/batch-atomicity-example.md` | The exact shape of a multi-statement atomic write through `db.batch([...])`, with the mid-batch-failure rollback semantics called out |
23
+ | Guide | `guide/persistence-data-d1.md` | Operator-facing: when to use it, when not, what stays your call, and the promotion signals for the sibling single-file SQLite blueprint and future Postgres or replication blueprints |
24
+ | Coordination vocabulary | `docs/topics.md` | The two global-topic strings this blueprint contributes and the shared id band registry (application-spa, application-api-rest, security-auth-magic-link, email-smtp-resend, persistence-data-sqlite, ci-pipeline, observability-essentials, security-secrets-management, security-auth-clerk, persistence-data-d1) |
25
+
26
+ The doc set is contributions (copied into the project tree by `rcf define blueprint add`); the guide, assets, and docs are package-resident references. Guide rendering into `rcf/knowledge/docs/blueprint-guides/` and asset ingestion are mechanism follow-ups; until they land, the working agent reads them from the applied blueprint's source path recorded in `manifest.blueprints[].source`.
27
+
28
+ ## What it contributes, and what it deliberately does not
29
+
30
+ Contributed kinds: REQ, US (with inline ACs), TAC, ADR. Adherence is expressed as ACs; the blueprint ships no test files (ratified decision 5) and no code.
31
+
32
+ No FBS contributions, as a matter of principle (ratified policy 2026-08-19): FBSs are the work of the implementing agent, not the blueprint; project constraints have to be applied at the time of creation. The blueprint contributes the WHAT (the store facade contract, the wrangler-owned migration discipline, the deploy-pipeline gate contract, the prepared-statement and batch atomicity boundaries, the two-path recovery model, the metadata-only event log discipline); the implementing agent derives the HOW-tasks (FBS) in the host project, where the ACs contributed here get picked up by the project's own build sequencing.
33
+
34
+ Deliberately not contributed: the domain schema (the tables the project's own entities live in are project-authored, on top of the migration directory the project maintains; the blueprint governs the facade contract and the migration discipline, not the domain shape); an ORM or query builder above the D1 prepared-statement surface (the facade is a project-authored surface; how it internally implements its verbs above the vendor binding is not blueprint-owned, but the boundary discipline refuses raw-SQL passthrough on the public surface); a Worker deploy blueprint (a companion `deploy-cloudflare-workers` blueprint is the natural pair for the Worker deploy step the deploy-gate TAC assumes; until it ships, projects wire their own deploy step); a secrets management surface for the CI credential that runs `wrangler d1 migrations apply` and `wrangler deploy` (the credential storage and rotation posture are the concern of the `security-secrets-management` blueprint, not this one); a CI pipeline template (CI shape is the concern of the `ci-pipeline` blueprint, not this one; this blueprint contributes the requirement that the migrations-apply step orders strictly before the deploy step, not the file that implements it); a replication or failover surface (D1's read-replica surface is a read-scaling primitive, not a failover primitive; a project needing failover supersedes ADR-1401 with an alternate engine); a logical schema-agnostic dump beyond the vendor's `wrangler d1 export` (out of scope; see ADR-1405's alternatives).
35
+
36
+ ## The two global decisions
37
+
38
+ ADR-1401-persistence-data-d1-store-model ships `scope: global` on topic `persistenceStore`. This is the project's primary durable store engine choice: one Cloudflare D1 database bound into the Worker under a named binding, one entry point through the facade. A composing blueprint that holds a different engine opinion (the single-file SQLite blueprint on the same topic, a future Postgres blueprint, a KV-store blueprint) conflicts here by design and expects a project-level ADR resolution.
39
+
40
+ ADR-1402-persistence-data-d1-migration-discipline ships `scope: global` on topic `migrationDiscipline`. This is the project's schema-evolution posture: numbered forward-only `.sql` files under the wrangler-configured directory, applied by the vendor CLI, gated in the deploy pipeline. A composing blueprint that holds an opinion on migration discipline (the SQLite blueprint's boot-time runner-at-open discipline on the same topic, a future event-sourced projection blueprint) conflicts here by design.
41
+
42
+ See `docs/topics.md` for the exact strings, the expected resolutions, the delineation from the application-api-rest blueprint's `logging` topic (which governs the wire-log shape, not the store-event log shape), the deliberate-conflict statement against the persistence-data-sqlite blueprint (both blueprints ship the same two global topics with different vendor answers on purpose, mirroring the application-spa plus application-api-rest pairing on `errorEnvelope` and `authModel`), and the AC id band allocation (persistence-data-d1 owns 13101-13899, ADR/TAC suffix block 1401-1499).
43
+
44
+ ## Quality bar
45
+
46
+ Single D1 database bound into the Worker under one named binding read by exactly one facade module; every read and write through the facade issued as `db.prepare(<static SQL literal>).bind(...)` with no consumer-supplied SQL and no `db.exec(<consumer string>)` on any path; multi-statement writes requiring atomicity through `db.batch([...])` with no partial-batch results surfaced; numbered forward-only `.sql` migration files under the wrangler-configured directory with the vendor CLI as the sole applier and the vendor bookkeeping table as the sole applied-state ledger; deploy pipeline that orders `wrangler d1 migrations apply` strictly before `wrangler deploy` per environment and refuses the deploy on any apply failure; two-path recovery (Time Travel point-in-time restore within the plan window and a scheduled `wrangler d1 export` to a portable off-vendor artifact) exercisable from the ops or CI surface without a Worker code change; structured event log at five defined moments (facadeReady, migrationsApplied, backupExported, timeTravelRestored, queryFailed) with metadata-only fields carrying no domain-row values. Every bar is carried by ACs in the doc set, not by this README.
47
+
48
+ ## Known mechanism-reach gaps
49
+
50
+ None at v1.0.0. Every AC on every story is bound to at least one TAC that the host project must realise, and every AC's `then` clause is runtime-observable in the deployed application (source-tree import-graph scans for the boundary properties, wrangler CLI exit-code checks for the migration and deploy-gate properties, D1 read round-trips for the row-preservation properties on export and restore, event-sink accumulation for the log-shape properties, targeted grep for the SQL-string discipline). The mechanism-reach principle from the authoring standard section 7 is satisfied at ship: a project that applies this blueprint and does not realise a TAC leaves an unresolved `tacIds` reference on the story that `rcf define validate` and `rcf audit coverage` refuse. The one operational surface a project must own on its own is the CI pipeline that wires the deploy gate (TAC-1403); that responsibility is stated as a TAC interface (`ciStep.migrationsApply`, `ciStep.deploy`) with an explicit ordering contract, not as a smuggled runtime probe. The recovery runner (TAC-1404) is similarly a project-owned ops surface; the blueprint contributes the shape and the event contract, not the ops file that invokes it.
@@ -0,0 +1,72 @@
1
+ # Batch atomicity in the D1 facade
2
+
3
+ D1 does not expose explicit BEGIN / COMMIT to the Worker binding. `db.batch([...])` is the vendor's atomicity primitive for multi-statement writes: the vendor's contract states that a mid-batch failure aborts and rolls back the entire sequence. This asset shows the shape a facade verb takes when its domain contract requires two or more statements to land as one unit (AC-13105-1, AC-13105-2).
4
+
5
+ ## Verb shape
6
+
7
+ ```javascript
8
+ // src/store/entityBVerbs.js
9
+ // A verb whose domain contract requires insertA + insertB + auditEntry
10
+ // to land as one unit, or none.
11
+
12
+ export function entityBVerbs(db, onEvent) {
13
+ return {
14
+ async createEntityBWithAudit({
15
+ entityAId,
16
+ entityBId,
17
+ payload,
18
+ auditActor,
19
+ now,
20
+ }) {
21
+ const batch = [
22
+ db
23
+ .prepare(
24
+ 'INSERT INTO entityB (id, entityAId, payload, createdAt) VALUES (?, ?, ?, ?)'
25
+ )
26
+ .bind(entityBId, entityAId, payload, now),
27
+ db
28
+ .prepare(
29
+ 'UPDATE entityA SET updatedAt = ? WHERE id = ?'
30
+ )
31
+ .bind(now, entityAId),
32
+ db
33
+ .prepare(
34
+ 'INSERT INTO auditEntry (id, actor, action, targetId, at) VALUES (?, ?, ?, ?, ?)'
35
+ )
36
+ .bind(crypto.randomUUID(), auditActor, 'entityBCreated', entityBId, now),
37
+ ];
38
+
39
+ try {
40
+ const results = await db.batch(batch);
41
+ return { entityBId };
42
+ } catch (err) {
43
+ onEvent({
44
+ event: 'queryFailed',
45
+ ts: new Date().toISOString(),
46
+ verb: 'createEntityBWithAudit',
47
+ code: err.cause?.code ?? 'unknown',
48
+ });
49
+ throw err;
50
+ }
51
+ },
52
+ };
53
+ }
54
+ ```
55
+
56
+ Notes:
57
+
58
+ - Every statement in the batch is a prepared statement authored inside the verb. The static SQL literals live in the verb body; values reach D1 only through `bind`. The prepared-statement discipline holds inside the batch as it does for single-statement verbs.
59
+ - The verb does not chain sequential `db.prepare(...).run()` calls under an application-side try-catch to fake atomicity. The vendor's batch primitive is the only shape that gives the atomicity guarantee. AC-13105-1 verifies this by inspection.
60
+ - On any statement in the batch failing, D1 rolls the sequence back (the vendor's contract); the verb rethrows without surfacing any partial state to the caller. AC-13105-2 exercises this against a local D1 primed to violate a UNIQUE constraint on the second statement.
61
+
62
+ ## What batch is not
63
+
64
+ Not a cross-verb transaction. `batch()` is atomic across the statements in one call. Two independent facade verbs called sequentially by a consumer are NOT one transaction; the facade does not expose a begin/commit primitive because D1 does not support one on the Worker binding. AC-13105-3 verifies this by inspection.
65
+
66
+ Not a way to fake atomicity around a computed decision. A workflow that reads with `first()`, computes something, then writes-if-condition is not atomic; a concurrent Worker request can change the read's result between the read and the write. Push the condition into the SQL (an `INSERT ... WHERE NOT EXISTS`, an `UPDATE ... WHERE version = ?`, an optimistic-lock pattern) so the whole decision lands in one batched statement.
67
+
68
+ Not the only shape for a single-statement write. Single-statement writes commit as their own transaction naturally (SQLite's default autocommit); use `db.prepare(...).run()` directly for those verbs. Batch is reserved for the multi-statement-atomic case; using batch for a one-statement write is harmless but adds a wrapper the verb does not need.
69
+
70
+ ## Query-count budget
71
+
72
+ D1's queries-per-Worker-invocation limit (currently 1000 on Paid, 50 on Free per the vendor's currently published limits) counts statements inside batches as individual queries. A verb whose batch grows past a few dozen statements is a design smell; break the domain contract into smaller atomic units, or reconsider whether the contract truly needs cross-statement atomicity.
@@ -0,0 +1,115 @@
1
+ # D1 store facade module shape
2
+
3
+ The facade (TAC-1401) is one module that reads the D1 binding from the Worker `env`, exposes named domain verbs, issues every statement as a parameterised prepared statement, uses `db.batch([...])` for multi-statement atomicity, and emits structured lifecycle events on the injected sink. This asset shows the exact shape with a worked domain example.
4
+
5
+ ## Module layout
6
+
7
+ ```
8
+ src/store/
9
+ facade.js // this file: createStore + named verbs
10
+ entityAVerbs.js // named verbs partitioned by domain slice (optional)
11
+ entityBVerbs.js
12
+ sessionVerbs.js
13
+ auditVerbs.js
14
+ ```
15
+
16
+ The `facade.js` module is the ONLY file in the source tree that reads `env[BINDING_NAME]`. Every domain slice imports helpers from `facade.js` (the request-scoped `db` handle, the event emitter) and exports its named verbs; `facade.js` re-exports them into the store's public surface. A grep of the source tree for `env.<BINDING_NAME>` (or `env["<BINDING_NAME>"]`) returns exactly one match, and it is inside `facade.js`. AC-13101-1 is verified by that grep.
17
+
18
+ ## `createStore` factory
19
+
20
+ ```javascript
21
+ // src/store/facade.js
22
+ // The ONE module that reads the D1 binding.
23
+
24
+ let isolateFirstInvocation = true;
25
+
26
+ export function createStore({ env, bindingName, onEvent }) {
27
+ const db = env[bindingName]; // The ONE binding read in the tree.
28
+ if (!db) {
29
+ throw new Error(`D1 binding '${bindingName}' not present on env`);
30
+ }
31
+
32
+ if (isolateFirstInvocation) {
33
+ isolateFirstInvocation = false;
34
+ onEvent({
35
+ event: 'facadeReady',
36
+ ts: new Date().toISOString(),
37
+ bindingName,
38
+ environment: env.ENVIRONMENT ?? 'unknown',
39
+ });
40
+ }
41
+
42
+ return {
43
+ // Named domain verbs (per AC-13101-2, no raw-query passthrough).
44
+ ...entityAVerbs(db, onEvent),
45
+ ...entityBVerbs(db, onEvent),
46
+ ...sessionVerbs(db, onEvent),
47
+ ...auditVerbs(db, onEvent),
48
+ };
49
+ }
50
+ ```
51
+
52
+ ## Named domain verb (single-statement)
53
+
54
+ ```javascript
55
+ // src/store/entityAVerbs.js
56
+ // Every SQL literal is static and authored here.
57
+
58
+ export function entityAVerbs(db, onEvent) {
59
+ return {
60
+ async findEntityAByName({ name }) {
61
+ try {
62
+ return await db
63
+ .prepare('SELECT id, name, createdAt, updatedAt FROM entityA WHERE name = ?')
64
+ .bind(name)
65
+ .first();
66
+ } catch (err) {
67
+ onEvent({
68
+ event: 'queryFailed',
69
+ ts: new Date().toISOString(),
70
+ verb: 'findEntityAByName',
71
+ code: err.cause?.code ?? 'unknown',
72
+ });
73
+ throw err;
74
+ }
75
+ },
76
+
77
+ async insertEntityA({ id, name, createdAt, updatedAt }) {
78
+ try {
79
+ return await db
80
+ .prepare(
81
+ 'INSERT INTO entityA (id, name, createdAt, updatedAt) VALUES (?, ?, ?, ?)'
82
+ )
83
+ .bind(id, name, createdAt, updatedAt)
84
+ .run();
85
+ } catch (err) {
86
+ onEvent({
87
+ event: 'queryFailed',
88
+ ts: new Date().toISOString(),
89
+ verb: 'insertEntityA',
90
+ code: err.cause?.code ?? 'unknown',
91
+ });
92
+ throw err;
93
+ }
94
+ },
95
+ };
96
+ }
97
+ ```
98
+
99
+ Notes:
100
+
101
+ - The SQL literal is a static string authored inside the verb. It does not embed values from consumer arguments; the values reach D1 only through `bind`. AC-13104-1 verifies this by grep.
102
+ - The verb's typed parameter list names the fields the SQL literal binds. It does not accept a `sql` or `query` string parameter. AC-13104-2 verifies this by inspection of the exported surface.
103
+ - The verb catches D1 errors, emits a `queryFailed` event carrying only metadata (the verb name, the D1 error code), and rethrows. The event payload never includes `name` or any bound value. ADR-1403's discipline is enforced at emit time.
104
+
105
+ ## Named domain verb (multi-statement atomic write via batch)
106
+
107
+ See `assets/batch-usage/batch-atomicity-example.md` for the worked shape.
108
+
109
+ ## What this asset is not
110
+
111
+ Not a runnable facade. The snippets above are the SHAPE; a project's own domain verbs are authored per the domain's actual tables. Types, error wrappers, and observability adapters are project decisions on top of the shape.
112
+
113
+ Not an ORM. Projects that reach for Drizzle or Kysely wire it inside the verb bodies and preserve the outward verb surface. The prepared-statement discipline (static SQL literals inside the verb, values only through `bind`) survives an ORM: most ORMs emit static SQL from typed queries at build time, and the AC-13104-1 grep still lands on static literals.
114
+
115
+ Not the ci-pipeline gate. TAC-1403's deploy-gate is a CI file, not a facade responsibility; the two surfaces meet only through the shared event-record shape.