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": "persistence-data-sqlite-US-5106",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-sqlite-REQ-006",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Store lifecycle emits structured events on a single sink",
8
+ "asA": "operator who needs to answer 'when did the store come up, what version did it migrate through, when did the last snapshot land' from the log stream",
9
+ "iWant": "the store to emit structured events at open, at every migration run that applied work, at every backup checkpoint, and at close",
10
+ "soThat": "the store's lifecycle is a first-class observable and my dashboards do not have to shell into the database to answer basic questions",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-5106-1",
14
+ "description": "The store facade accepts an onEvent sink function at open time and invokes it with a structured record on every lifecycle moment: opened at successful open, migrated when the runner applied at least one migration, backupCheckpoint when a snapshot completes, closed on graceful shutdown.",
15
+ "given": "the store is opened with an injected onEvent sink and taken through open, migrate, backup, and close",
16
+ "when": "the sink is inspected after each lifecycle moment",
17
+ "then": "the sink has received one record for each moment with the event name field set to opened, migrated, backupCheckpoint, and closed respectively, each carrying a valid ISO-8601 timestamp",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-5106-2",
23
+ "description": "The migrated event carries the schema version transition and the list of migration versions applied during that run.",
24
+ "given": "the store opens against a file at version v_k with the build at max known version v_n where v_n > v_k",
25
+ "when": "the migrated event fires",
26
+ "then": "the event record contains a from field equal to v_k, a to field equal to v_n, and an applied field whose value is the array of integers v_k+1 through v_n in ascending order",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-5106-3",
32
+ "description": "The opened event carries the store identifier the facade was opened against; the backupCheckpoint event carries the artifact path the backup runner wrote to.",
33
+ "given": "the store is opened against identifier I and a subsequent backup writes to artifact path B",
34
+ "when": "the opened and backupCheckpoint events fire",
35
+ "then": "the opened event's store identifier field equals I and the backupCheckpoint event's artifact path field equals B, both as strings the operator can pass back into their tooling verbatim",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-601-persistence-data-sqlite-store",
42
+ "TAC-604-persistence-data-sqlite-backup-runner"
43
+ ],
44
+ "createdAt": "2026-08-21T00:00:00Z",
45
+ "updatedAt": "2026-08-21T00:00:00Z"
46
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "usId": "persistence-data-sqlite-US-5107",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-sqlite-REQ-007",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "The store facade is the only module that talks to the underlying engine",
8
+ "asA": "developer who needs the engine to be swappable and the domain to be testable against a double",
9
+ "iWant": "one module to hold the engine binding and expose named verbs, with no consumer importing the engine directly",
10
+ "soThat": "the boundary between the domain and the engine is the only place that has to move when the engine changes and the only place tests have to mock",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-5107-1",
14
+ "description": "Exactly one source-tree module imports the engine binding. Every other module that touches persistence imports the store facade.",
15
+ "given": "the running source tree after boot",
16
+ "when": "the import graph is inspected for uses of the engine binding module",
17
+ "then": "the engine binding is imported by exactly one file (the store facade) and no other file in the source tree imports it, verified by an import-graph query or a targeted grep",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-5107-2",
23
+ "description": "The facade exposes named verbs for every persistence operation the domain requires; it does not expose a general-purpose query method that accepts raw engine-native queries from consumers.",
24
+ "given": "the store facade's public surface",
25
+ "when": "the surface is inspected",
26
+ "then": "every exported function has a domain-shaped name and typed parameters (not a raw query string parameter), and no exported function accepts an engine-native query object or raw SQL string as a call argument from consumer code",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-5107-3",
32
+ "description": "Replacing the facade with an in-memory double that implements the same verb surface allows the domain code to run against it without importing the engine binding.",
33
+ "given": "a test double implementing the same named verbs as the facade with an in-memory backing store",
34
+ "when": "the domain code runs against the double in place of the facade",
35
+ "then": "the domain code executes to completion without importing the engine binding at any point in its call path and its behaviour is unchanged from a facade-backed run for the operations under test",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-601-persistence-data-sqlite-store"
42
+ ],
43
+ "createdAt": "2026-08-21T00:00:00Z",
44
+ "updatedAt": "2026-08-21T00:00:00Z"
45
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "usId": "persistence-data-sqlite-US-5108",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-sqlite-REQ-008",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Backup produces a self-contained artifact without downtime",
8
+ "asA": "operator who cannot take the application offline to take a backup",
9
+ "iWant": "a backup runner that snapshots the store to a portable artifact while the application keeps serving requests",
10
+ "soThat": "recovery is a matter of pointing a compatible build at the artifact, and the backup schedule is not blocked on planning a maintenance window",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-5108-1",
14
+ "description": "The backup runner produces an artifact file at the requested output path while the application continues to serve reads and writes; requests served during the snapshot do not fail because of the snapshot.",
15
+ "given": "the store is open under normal load and the backup runner is invoked with an output path P",
16
+ "when": "the backup runner completes and the served-request log for the snapshot window is inspected",
17
+ "then": "an artifact file exists at P and every request served during the snapshot window reports its normal outcome, with no request marked failed on account of the backup operation",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-5108-2",
23
+ "description": "A fresh process opening the snapshot artifact through the same facade boots to the same schema version as the source store held at snapshot completion, and reads the rows that were committed at or before the snapshot completion timestamp.",
24
+ "given": "a snapshot artifact at path P produced by AC-5108-1 and a fresh process invoking the open entry point against P",
25
+ "when": "the fresh process's boot sequence completes and consumer code reads through the facade",
26
+ "then": "the fresh process's opened event names P as its store identifier, the reported schema version equals the source store's schema version at snapshot completion, and reads of rows committed at or before the snapshot completion timestamp return the committed values",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-5108-3",
32
+ "description": "The backup runner emits a backupCheckpoint event on the store's event log at snapshot completion, carrying the artifact path and the ISO-8601 completion timestamp.",
33
+ "given": "the backup runner completes an artifact at path P at time T",
34
+ "when": "the event log is inspected",
35
+ "then": "the log contains exactly one backupCheckpoint event whose artifact path field equals P and whose completion timestamp field equals T",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-604-persistence-data-sqlite-backup-runner",
42
+ "TAC-601-persistence-data-sqlite-store"
43
+ ],
44
+ "createdAt": "2026-08-21T00:00:00Z",
45
+ "updatedAt": "2026-08-21T00:00:00Z"
46
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "usId": "persistence-data-sqlite-US-5109",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-sqlite-REQ-009",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Migration failure names the failing version and leaves the store unchanged past it",
8
+ "asA": "operator diagnosing a deploy that failed at boot on a migration",
9
+ "iWant": "the failure to name the failing version and its description in a stable-coded error, and to leave the store on the previous version so recovery is a code fix and a redeploy",
10
+ "soThat": "the diagnostic loop is one step (open the failing migration, fix, redeploy) instead of a data-recovery incident",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-5109-1",
14
+ "description": "When a migration's statements or its bookkeeping row fails, the migration runner throws an error whose code is a stable identifier for the migration-failed condition, whose message contains the failing version integer and the migration's description string.",
15
+ "given": "a store at version v_k and a pending migration v_k+1 whose statements throw",
16
+ "when": "the migration runner attempts v_k+1",
17
+ "then": "the thrown error's code is a stable string identifier documented in the store facade, and its message contains the integer v_k+1 and the description string configured on that migration",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-5109-2",
23
+ "description": "The store facade's open entry point propagates the migration failure to its caller without swallowing it or converting it to a different error class.",
24
+ "given": "a boot sequence whose migration run fails on v_k+1",
25
+ "when": "the caller catches the error thrown by the open entry point",
26
+ "then": "the caught error is the same error the migration runner threw, with the same code and message, unwrapped or wrapped in a chain that preserves the original code and message",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ },
30
+ {
31
+ "id": "AC-5109-3",
32
+ "description": "A store whose migration failed at v_k+1 opens cleanly on a subsequent boot after v_k+1 is fixed and the build is redeployed; no manual recovery step is required against the on-disk artifact.",
33
+ "given": "the failing v_k+1 statement is corrected in the migration catalog and the same store artifact is opened by the corrected build",
34
+ "when": "the boot sequence invokes the open entry point",
35
+ "then": "the migration runner applies v_k+1 and any later pending migrations, the migrated event fires, and consumer code sees the store at the build's max known version",
36
+ "testable": true,
37
+ "scope": "runtime"
38
+ }
39
+ ],
40
+ "tacIds": [
41
+ "TAC-602-persistence-data-sqlite-migration-runner",
42
+ "TAC-601-persistence-data-sqlite-store"
43
+ ],
44
+ "createdAt": "2026-08-21T00:00:00Z",
45
+ "updatedAt": "2026-08-21T00:00:00Z"
46
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "usId": "persistence-data-sqlite-US-5110",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-sqlite-REQ-010",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Store events carry no secret material",
8
+ "asA": "operator who ships store event logs to a third-party observability provider",
9
+ "iWant": "every field on every store event to be limited to store metadata; no domain data, no credential material, no secret values",
10
+ "soThat": "a log-store breach is not a domain-data breach and the ops team does not have to negotiate a redaction rule with the provider",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-5110-1",
14
+ "description": "The fields on the opened, migrated, backupCheckpoint, and closed events are restricted to store metadata: event name, ISO-8601 timestamp, store identifier, schema version integers, migration version integers, migration description strings, and backup artifact paths. No event field carries a value read from a domain row.",
15
+ "given": "the store is taken through open, migrate, backup, and close",
16
+ "when": "every event record captured on the sink is inspected",
17
+ "then": "every field on every record matches one of the metadata field types listed above, and no field's value equals a value read from any domain table",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-5110-2",
23
+ "description": "A grep of the store facade source for domain-table column names, secret-flagged column names, and the values of well-known secret columns (session handles, token secrets, private keys) finds them referenced only inside the narrow CRUD verbs that read or write those columns, never inside the event-emission call sites.",
24
+ "given": "the store facade source and the domain schema definition",
25
+ "when": "the grep is executed",
26
+ "then": "matches appear only inside CRUD verb bodies and never inside onEvent call arguments or event-record construction sites",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-601-persistence-data-sqlite-store",
33
+ "TAC-604-persistence-data-sqlite-backup-runner"
34
+ ],
35
+ "createdAt": "2026-08-21T00:00:00Z",
36
+ "updatedAt": "2026-08-21T00:00:00Z"
37
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "usId": "persistence-data-sqlite-US-5111",
3
+ "prdId": "PRD-001",
4
+ "reqId": "persistence-data-sqlite-REQ-011",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "title": "Opening a store already at target version is a silent no-op",
8
+ "asA": "operator whose routine boots must not emit spurious migrated events",
9
+ "iWant": "the migration runner to apply no work and emit no migrated event when the on-disk version already equals the build's max",
10
+ "soThat": "a migrated event in the log means real schema evolution and my post-migration bookkeeping does not fire on every boot",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-5111-1",
14
+ "description": "Opening a store whose bookkeeping table records the same schema version the build's max known migration version equals results in a migration run whose applied-versions array is empty and no changes to the store artifact.",
15
+ "given": "a store artifact whose highest bookkeeping row records version N and a build whose max known migration version is N",
16
+ "when": "the boot sequence invokes the open entry point",
17
+ "then": "the migration run's applied-versions array is empty, no new bookkeeping row has been written, and a byte-for-byte comparison of the store artifact before and after the open shows no schema-affecting change",
18
+ "testable": true,
19
+ "scope": "runtime"
20
+ },
21
+ {
22
+ "id": "AC-5111-2",
23
+ "description": "On the no-op open path, the opened event fires but the migrated event does NOT fire; the sink receives one opened record and zero migrated records.",
24
+ "given": "the no-op open in AC-5111-1 with an event sink attached",
25
+ "when": "the sink is inspected after the open entry point returns",
26
+ "then": "the sink has received exactly one opened record and zero migrated records for this open",
27
+ "testable": true,
28
+ "scope": "runtime"
29
+ }
30
+ ],
31
+ "tacIds": [
32
+ "TAC-601-persistence-data-sqlite-store",
33
+ "TAC-602-persistence-data-sqlite-migration-runner"
34
+ ],
35
+ "createdAt": "2026-08-21T00:00:00Z",
36
+ "updatedAt": "2026-08-21T00:00:00Z"
37
+ }
@@ -0,0 +1,49 @@
1
+ # persistence-data-sqlite blueprint coordination vocabulary
2
+
3
+ This file is the persistence-data-sqlite 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.4.4 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 | persistence-data-sqlite contribution | Origin | Composition note |
8
+ |---|---|---|---|
9
+ | `persistenceStore` | ADR-601-persistence-data-sqlite-store-model | Minted here; pre-cleared as unclaimed against application-spa (`clientRouting`, `theming`, `clientState`, `errorEnvelope`, `authModel`), application-api-rest (`errorEnvelope`, `authModel`, `apiVersioning`, `logging`), security-auth-magic-link (`authModel`), and the hello-panel walkthrough exemplar (`operatorPanel`) | The one primary durable store engine for the project. Any composing blueprint that holds an opinion on the store engine (a Postgres-first blueprint, a KV-store blueprint, an event-sourced blueprint) contributes its own scope:global ADR on this exact string and lets composition surface the pairing. Expected resolution: one project-level ADR that fixes the engine and states the tier reasoning |
10
+ | `migrationDiscipline` | ADR-602-persistence-data-sqlite-migration-discipline | Minted here; pre-cleared as unclaimed against application-spa, application-api-rest, security-auth-magic-link, and hello-panel | The one schema-evolution discipline for the project. A composing blueprint that holds an opinion on migration discipline (event-sourced projections, dual-write patterns, tenant-per-schema, bidirectional up/down migrations) conflicts here by design. Expected resolution: one project-level ADR fixing the discipline |
11
+
12
+ The persistence-data-sqlite blueprint claims two global topics. Every other contribution is scope-local (the three operational ADRs, ADR-603 through ADR-605, do not contribute global topics; a composing blueprint that holds an opinion on event-secrecy, the module-boundary posture, or the backup model authors its own project-level ADR if it wants to override).
13
+
14
+ Note on the delineation from the application-api-rest blueprint's `logging` topic: `logging` (owned by application-api-rest ADR-304) governs the wire-log shape of the HTTP tier. This blueprint's ADR-603 governs the STORE-EVENT log shape (opened, migrated, backupCheckpoint, closed). The two log surfaces may share a shipper but do not share a topic. A blueprint that contributes a unified log discipline across all tiers would author its own scope:global ADR on `logging` and expect to conflict with REST there, not here.
15
+
16
+ Rules for new topics (inherited from the application-spa and REST 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 (`store`, `dataStore`, `db`, `dbEngine` are all wrong when `persistenceStore` already exists; `schemaMigrations`, `dbMigrations`, `migrations` are all wrong when `migrationDiscipline` already exists).
17
+
18
+ ## Id number bands (registry bootstrap)
19
+
20
+ AC ids (and therefore US numeric ids, which anchor them) are NOT namespaced by the 0.4.4 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).
21
+
22
+ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. Rows are recorded at ship, never predicted.
23
+
24
+ | Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
25
+ |---|---|---|---|---|
26
+ | application-spa | 1101-1899 | 2xx | shipped v1.3.0 | `clientRouting`, `theming`, `clientState`, `errorEnvelope`, `authModel` |
27
+ | application-api-rest | 2101-2899 | 3xx | shipped v1.0.0 | `errorEnvelope`, `authModel`, `apiVersioning`, `logging` |
28
+ | security-auth-magic-link | 3101-3899 | 5xx | shipped v1.0.0 | `authModel` |
29
+ | email-smtp-resend | 4101-4899 | 4xx | shipped v1.0.0 | none |
30
+ | 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` |
31
+ | persistence-data-sqlite | 5101-5899 | 6xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
32
+ | ci-pipeline | 6101-6899 | 7xx | shipped v1.0.0 | `ciGates`, `strictCoverageGate` |
33
+ | observability-essentials | 7101-7899 | 8xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics`, `statusPageContract` |
34
+ | security-secrets-management | 8101-8899 | 9xx | shipped v1.0.0 | `secretsSource` |
35
+ | security-auth-clerk | 9101-9899 | 10xx | shipped v1.0.0 | `authModel` |
36
+ | security-auth-oauth2 | 10101-10899 | 11xx | shipped v1.0.0 | `authModel` |
37
+ | security-auth-keycloak | 11101-11899 | 12xx | shipped v1.0.0 | `authModel` |
38
+ | deploy-cloudflare-workers | 12101-12899 | 13xx | shipped v1.0.0 | `deploymentTarget` |
39
+ | persistence-data-d1 | 13101-13899 | 14xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
40
+ | observability-probe-endpoints | 14101-14899 | 15xx | shipped v1.0.0 | `healthProbes`, `readinessSemantics` |
41
+
42
+ US 5101-5111 sit at the LOW end of the 5101-5899 band on purpose. A project-side story that mechanically derives from `persistence-data-sqlite-REQ-011` into the number `5111` would collide against persistence-data-sqlite-US-5111 in this package; the band leaves headroom at the HIGH end (US 5181-5899) so a project's own stories anchored to persistence-data-sqlite REQs can allocate without conflict. The watchpost run4 lesson applies here too.
43
+
44
+ ## Shared expectations for future composing blueprints
45
+
46
+ - Reuse `persistenceStore` exactly as spelled here when your blueprint holds an opinion on the project's primary durable store engine; contribute your own scope:global ADR on that string and let composition surface the pairing. A Postgres-first blueprint (see the persistence guide 'when it does not fit') will conflict here by design.
47
+ - Reuse `migrationDiscipline` exactly as spelled here when your blueprint holds an opinion on schema evolution; a blueprint that contributes an event-sourced projection story or a dual-write pattern conflicts here by design.
48
+ - This blueprint's decision states the SQLite single-file engine plus the forward-only numbered-catalog discipline. Compose compatible caching, outbox, or projection blueprints, or expect the operator to supersede with one project-level ADR per topic.
49
+ - 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 application-spa, application-api-rest, security-auth-magic-link, and this blueprint). 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,69 @@
1
+ # Persistence blueprint guide
2
+
3
+ ## What it is
4
+
5
+ A default durable-store floor for small greenfield rcf-lite projects. The blueprint contributes the WHAT of a persistence pattern: how the store gets opened, how the schema evolves, how migrations apply, how a mid-migration crash is handled, how the store event log looks, how the boundary between the domain and the engine is drawn, and how backups are taken. The default engine is a single SQLite file in WAL mode; Postgres is a documented future variant behind the same facade.
6
+
7
+ Concretely, the blueprint ships eleven requirements, eleven user stories (twenty-five acceptance criteria), four architecture components, and five architecture decision records. Two ADRs are `scope: global` on the topics `persistenceStore` (the engine choice) and `migrationDiscipline` (the forward-only refuse-newer-at-open posture); the other three are scope-local operational ADRs (event secrecy, store-boundary discipline, backup model) that a composing blueprint does not conflict with by default.
8
+
9
+ ## What it is not
10
+
11
+ Not a domain schema. The tables the project's own entities live in are project-authored, on top of the migration catalog the project maintains. The blueprint governs the store facade and the migration discipline; the domain shape is the project's own responsibility.
12
+
13
+ Not an ORM. There is no query builder, no active-record layer, no framework-shaped abstraction between the facade's named verbs and the engine binding. Projects that want an ORM wire it inside the facade's implementation and preserve the outward verb surface.
14
+
15
+ Not a Postgres blueprint. A future `persistence-postgres` blueprint (see 'when it does not fit') will contribute a Postgres-flavoured store TAC and an ADR on `persistenceStore` that deliberately conflicts with this one; until then, projects that need Postgres supersede ADR-601 with a project-level ADR.
16
+
17
+ Not a logical dump story. Backups are file-level engine-native snapshots. Cross-engine migration and portable dumps are out of scope; projects that need them layer a dump runner beside the file-level backup runner.
18
+
19
+ Not a connection pool. The facade holds one handle for the process lifetime. Projects that select an engine that benefits from a pool (Postgres) wire it inside the facade and preserve the outward interface.
20
+
21
+ Not a replication story. Cross-region replication and hot standbys are engine-native decisions a project makes on top of the file-level backup story; the blueprint's backup runner does not orchestrate them.
22
+
23
+ ## When to reach for it
24
+
25
+ Reach for the persistence-data-sqlite blueprint when:
26
+
27
+ - The project is a small greenfield rcf-lite deployment (single deployable, one small team, one host or a small container fleet, no ops team standing by).
28
+ - The domain has a natural relational shape (bounded set of entities with well-defined relationships) that SQL expresses cleanly.
29
+ - Zero-infrastructure persistence is a feature (no database server to run, no connection pool to size, no network round trip between the process and the store).
30
+ - The scale envelope is single-writer (concurrent writers negotiate through the same process, not across processes on different hosts) and the working set fits on the same host the process runs on.
31
+ - The recovery story that fits is 'copy the file to safe storage, point a compatible build at the copy'; downtime-free file-level backup is the primary recovery path.
32
+
33
+ ## When it does not fit
34
+
35
+ Do not reach for the persistence-data-sqlite blueprint when:
36
+
37
+ - Multi-writer scale across hosts, hot standby replication, or cross-region durability are project requirements. A `persistence-postgres` blueprint (unshipped at v1.0.0, promotion signal: the third project asks for it) will own this. Until then, a project with these needs supersedes ADR-601 with a project-level ADR selecting the alternate engine and rewrites the migration catalog into the alternate dialect. The store facade contract, the migration runner contract, and the backup runner contract are preserved.
38
+ - The working set is genuinely too large for a single host to hold with reasonable performance (tens of gigabytes of hot data, hundreds of writes per second sustained). At that scale the single-writer envelope becomes an operator experience problem, and Postgres (or the engine ADR-601 promotes) is the more defensible shape.
39
+ - The domain shape is genuinely non-relational (opaque blob storage, event streams, time-series with a fixed retention model). A different blueprint (a KV-store blueprint, an event-sourced blueprint, a time-series blueprint) owns those shapes; supersede with a project-level ADR and skip this blueprint.
40
+ - The project has a hard requirement for a portable schema-agnostic dump as the primary backup (compliance mandate, cross-engine restore drill). File-level backup is the primary recovery path in ADR-605; projects that need the logical dump layer it on top, or supersede ADR-605 with a project-level ADR.
41
+ - The deploy target does not have a persistent filesystem the SQLite file can live on (ephemeral containers with no volume mount, serverless functions). The blueprint assumes a stable path the file survives at across deploys; a project without that assumption picks a different engine.
42
+
43
+ The design brief `w-2026-07-28-029` originally scoped store-selection separately from the persistence-data-sqlite blueprint. The persistence-data-sqlite blueprint at v1.0.0 does not include a Postgres engine variant because the rcf-lite blueprint mechanism (Phase 1) has no variant/profile selector: two engine TACs contributed together are both applied, and both leave dangling tacIds references if only one is realised. Shipping SQLite-first with Postgres as a documented promotion path mirrors the security-auth-magic-link blueprint's keycloak-local deferral (see the auth guide) and keeps v1.0.0 shippable. A future `persistence-postgres` blueprint plus a mechanism-side variant concept (v1.1 candidate) is the natural evolution.
44
+
45
+ ## What a good outcome looks like
46
+
47
+ A project applies the persistence-data-sqlite blueprint on a fresh tree, wires its own domain migration entries into the catalog (starting at version 1), realises the four TACs in project-authored FBSes, and lands on a deployed application where:
48
+
49
+ - The boot sequence opens the store once through the facade; the opened event fires with the configured store path; the schemaVersion read returns the catalog's max version.
50
+ - A schema change ships as a new numbered entry in the catalog; the next deploy's boot fires a migrated event whose applied array contains exactly the new version; consumer code reads through the facade at the new schema.
51
+ - A SIGKILL of the process while a write is in flight leaves the store openable on the next boot, with committed writes intact and the in-flight transaction rolled back; the opened event fires cleanly, no corruption error surfaces.
52
+ - A rollback to an older build against a store the newer build wrote fails at boot with a stable-coded refuse-newer error naming both versions; the operator diagnoses in one step (the older build cannot run against the newer store) and redeploys the newer build.
53
+ - A backup runs on a cron against the live store; the backupCheckpoint event fires on the sink with the artifact path and the completion timestamp; a fresh process opens the artifact and reads the rows committed at or before the completion timestamp.
54
+ - The auth event log, the wire-request log, and every other domain log surface holds no store-lifecycle records; the store's event log holds no domain-row values.
55
+
56
+ ## Operator decisions that remain open after apply
57
+
58
+ - Engine choice (SQLite default, Postgres or KV-store or event-sourced by superseding ADR-601). Blueprint owns the facade contract on both sides of the boundary; project owns the engine.
59
+ - Migration catalog layout (one file or one file per migration, under the schema-samples reference). Blueprint owns the shape; project owns the layout choice at whatever history size feels comfortable.
60
+ - Store path or connection string (the configuration input to the open entry point). Blueprint owns the entry point signature; project owns the deployed value and how it is supplied (env var, config file, container volume).
61
+ - Domain schema (every table beyond the schemaVersion bookkeeping table). Blueprint owns the migration discipline; project owns the tables.
62
+ - Backup schedule and destination (cron cadence, artifact path template, retention). Blueprint owns the backup runner and its event; project owns when and where.
63
+ - Restore drill cadence (a backup you have not restored is a hope, not a backup). Blueprint owns the artifact shape; project owns proving it works.
64
+ - Log sink implementation (where opened / migrated / backupCheckpoint / closed events go). Blueprint owns the event shape and the metadata-only discipline; project owns the shipper.
65
+ - Facade verb catalogue (the named CRUD verbs the domain needs). Blueprint owns the boundary discipline (named verbs, no raw-query passthrough); project owns the verbs.
66
+
67
+ ## Cost-honesty paragraph
68
+
69
+ Shipping this doc set costs the project the following. Every boot pays the migration runner's cost (a single SELECT against the bookkeeping table on a routine boot; the full migration cost on a schema evolution boot). Every facade verb is a project-authored function; the boundary discipline means new query shapes are a two-file edit (facade plus consumer) instead of a scattered raw SQL fragment. Every schema change is a numbered entry the project must not edit after shipping (a shipped migration is a fact of production; a correction is a new migration). The refuse-newer property makes rollback deploys fail at boot rather than silently; that safety comes at the cost of ops running the older build against the older data (or accepting that a data-shape change is one-way). File-level backup is fast and cheap but engine-native; a project that needs a portable dump layers it on top and keeps both in sync. The store's event log is deliberately minimal; a project that needs richer per-operation events (row-level audit trail, hot-path timing) authors those on top of the facade's verbs, not inside the store event sink.
@@ -0,0 +1,50 @@
1
+ # Security auth Clerk blueprint (v1.0.0)
2
+
3
+ The tenth content blueprint on the rcf-build-lite blueprint mechanism, category `security`. A Clerk-committed sibling to `security-auth-magic-link` on the `authModel` global topic: Clerk hosts the identity surface (users, sessions, sign-in UX, credential storage, MFA, account recovery); the project owns a framework-agnostic middleware boundary, a session verifier confined to one module, a Clerk-claim-to-project-verb authorisation adapter, and a reduced principal shape the rest of the codebase reasons against. Targeted at small greenfield rcf-lite projects that want hosted identity without building the user-and-session surface themselves; larger deployments supersede the vendor by superseding ADR-1001 with a project-level ADR and swapping the middleware and verifier adapters.
4
+
5
+ ## Apply
6
+
7
+ ```
8
+ rcf define blueprint add <path-to>/blueprints/security-auth-clerk
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 `security` category; `rcf define blueprint remove security-auth-clerk` cleanly removes an unreferenced application.
12
+
13
+ Composing with `security-auth-magic-link` (or any other blueprint contributing `scope: global` on `authModel`, which includes `application-spa` and `application-api-rest`) raises a `globalAdrTopic` conflict at add time. The four documented resolutions apply (adopt the incoming, keep the existing, project-level supersede ADR, or `--resolve authModel=project:<ADR-id>` on the add). See `docs/topics.md` for the deliberate-conflict statement.
14
+
15
+ ## Anatomy
16
+
17
+ | Piece | Where | What |
18
+ |---|---|---|
19
+ | Metadata | `blueprint.json` | Slug, version, category `security`, and the 29 contributions with scope/topic on the one global ADR |
20
+ | Doc set | `contributions/` | 9 REQs, 11 USs (25 ACs), 4 TACs, 5 ADRs, all schema-valid and namespaced (`security-auth-clerk-REQ-001` prefix family; `ADR-1001-security-auth-clerk-auth-model` suffix family) |
21
+ | React-family sample | `assets/wiring/clerk-provider-react.md` | The shape of a `ClerkProvider` wiring in a React-family client tier: where the provider mounts, what the SPA blueprint's session-and-redirect posture composes with |
22
+ | Vue-family sample | `assets/wiring/clerk-provider-vue.md` | The same shape rendered for a Vue-family client tier so the operator can pattern-match without a framework translation step |
23
+ | Middleware sample | `assets/middleware/node-middleware-shape.md` | The framework-agnostic middleware boundary contract (`verify(request)`), with adapter samples for Express and Fastify |
24
+ | Role-claim mapping | `assets/authorisation/role-claim-mapping-sample.md` | A worked verb-to-role mapping-table example, with the reduction from Clerk's `org:role` claim shape into the project's `roles` array |
25
+ | Guide | `guide/security-auth-clerk.md` | Operator-facing: when to use it, when not, the promotion signals for the OAuth2 and Keycloak siblings, the operator decisions that remain open, the cost-honesty paragraph |
26
+ | Coordination vocabulary | `docs/topics.md` | The one global-topic string 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) |
27
+
28
+ 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`.
29
+
30
+ ## What it contributes, and what it deliberately does not
31
+
32
+ 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.
33
+
34
+ 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 (Clerk-hosted identity, the `__session` cookie transport, the middleware boundary shape, the authorisation-adapter contract, the claims-mapping discipline, the session-lifecycle posture, the `signInStrategy` config surface, the read-only provisioning posture, the delegated rate-limit posture, the accountBound runtime-verify posture); 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.
35
+
36
+ Deliberately not contributed: a Clerk SDK version pin (the blueprint fixes the shape, not the version; the project's package manifest pins the SDK); MFA configuration (Clerk owns MFA at the hosted surface; the blueprint delegates); a Clerk-webhook consumer contract (out of scope for the default; a project that needs one adds one project-authored TAC and one scope-local ADR); a project-side user table or organisation table (Clerk is authoritative; a project that mirrors state into a local table does so through a project-authored consumer, not through this blueprint); a project-side rate limiter or anti-enumeration defence on the sign-in flow (Clerk-delegated per REQ-007); a fixed sign-in strategy choice (fixed shape per REQ-005, choice is project-owned); an OAuth2 provider list (that is the sibling `security-auth-oauth2` blueprint's territory when it ships); a Keycloak realm configuration (that is `security-auth-keycloak`'s territory when it ships).
37
+
38
+ ## The one global decision
39
+
40
+ ADR-1001-security-auth-clerk-auth-model ships `scope: global` on topic `authModel`. This is the project's single decision on how identity is proven, where credentials live, and what the wire credential looks like. Composing with `security-auth-magic-link`, `application-spa`, `application-api-rest`, or any future `security-auth-*` blueprint conflicts here by design and expects a project-level ADR resolution. The composition-precedent (SPA + REST on `errorEnvelope` and `authModel`) is the same pattern.
41
+
42
+ See `docs/topics.md` for the exact strings, the expected resolutions, and the AC id band allocation (security-auth-clerk owns 9101-9899, ADR/TAC suffix block 10xx / 1001-1099; this is the first blueprint whose ADR/TAC suffix crosses into four digits).
43
+
44
+ ## Quality bar
45
+
46
+ A framework-agnostic middleware boundary as the single point of authentication decision on the server; every runtime path that needs the caller's identity reads the reduced Principal shape attached at `request.auth`; the Clerk SDK is imported by exactly two modules (middleware wiring and session verifier); the wire credential is Clerk's `__session` cookie with Secure, HttpOnly, and SameSite=Lax; a tampered cookie is rejected with an audit event carrying no cookie value; every authorisation check goes through the adapter's `can` or `assert` and speaks in project verbs, never in Clerk role or claim vocabulary; role-based UI slots render only when the adapter grants the verb and the corresponding server-side handler enforces the same verb through `assert`; a Clerk-initiated sign-out invalidates subsequent requests within the documented `revocationCheckIntervalMs`; the sign-in surface applies no project-authored rate limiter (Clerk-delegated); user and organisation mutations against Clerk are confined to a provisioning script directory (not a request handler); the `signInStrategy` config surface fixes the shape not the choice; runtime-verify ACs are `accountBound` and skip with a stable-coded reason when Clerk is unreachable rather than passing on a fake. 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, given the same posture the security-secrets-management blueprint takes: 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 (cookie-jar inspection for the transport contract, `request.auth` shape inspection for the principal reduction, source-tree import scans for the Clerk-SDK boundary, `can` and `assert` return values for the authorisation adapter, page-render inspection for the UI-slot gating, live sign-out plus replay for the revocation behaviour, live rate-limit burst against Clerk for the delegation posture, and source-tree call-site scans for the read-only provisioning posture). 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 is the middleware boundary implementation for its specific HTTP framework (an Express shim, a Fastify plugin, a Workers fetch wrapper) plus the vendor adapter inside the session verifier; those responsibilities are stated as TAC interfaces, not as smuggled runtime probes. Two ACs whose runtime observability depends on the operator's Clerk deployment reachability are AC-9107-2 (revocation propagation window) and AC-9109-2 (Clerk-documented rate-limit response shape): both are accountBound and the runtime-verify skip mechanism named on AC-9110-2 covers them when Clerk is unreachable.
@@ -0,0 +1,99 @@
1
+ # Verb-to-role mapping sample
2
+
3
+ A worked example of the project-authored mapping table the authorisation adapter (TAC-1002) consumes, plus a worked example of the claims-mapper reduction (TAC-1004) that turns Clerk's raw claim shape into the `Principal.roles` and `Principal.organisationIds` the adapter reasons against.
4
+
5
+ ## The mapping table
6
+
7
+ The mapping table is a project-authored module the adapter loads once at construction. Verbs are project vocabulary; roles are the strings Clerk propagates. A verb absent from the table evaluates to `false` on `can` and throws on `assert`.
8
+
9
+ ```
10
+ // src/authz/mapping-table.ts
11
+ export const mappingTable = {
12
+ // Editorial workflow
13
+ 'article.read': { roles: ['reader', 'editor', 'admin'] },
14
+ 'article.edit': { roles: ['editor', 'admin'] },
15
+ 'article.delete': { roles: ['admin'] },
16
+
17
+ // Billing surface
18
+ 'billing.invoice.view': { roles: ['billing', 'admin'] },
19
+ 'billing.invoice.void': { roles: ['admin'] },
20
+
21
+ // Admin dashboard
22
+ 'admin.dashboard.view': { roles: ['admin'] },
23
+ 'admin.users.view': { roles: ['admin'] },
24
+ 'admin.users.impersonate': { roles: ['admin'] },
25
+ };
26
+ ```
27
+
28
+ ## The claims-mapper reduction
29
+
30
+ The claims mapper reads a raw Clerk claim bag (as returned by the session verifier on success) and produces the `Principal` the adapter reasons against. The `CLERK_CLAIM_KEYS` constant is the one place in the module that hard-codes Clerk-side claim key strings; a Clerk-side rename is a one-file change here.
31
+
32
+ ```
33
+ // src/auth/claims-mapper.ts
34
+ const CLERK_CLAIM_KEYS = {
35
+ userId: 'sub', // Clerk emits the user id on the JWT-standard sub claim
36
+ organisationMemberships: 'org_memberships',
37
+ organisationId: 'org_id',
38
+ organisationRole: 'org_role',
39
+ publicMetadata: 'public_metadata',
40
+ // Adjust these values against Clerk's currently-canonical claim vocabulary at
41
+ // the SDK version the project builds against.
42
+ };
43
+
44
+ export function reduceClaims(rawClaims) {
45
+ const principalId = rawClaims?.[CLERK_CLAIM_KEYS.userId];
46
+ if (!principalId || typeof principalId !== 'string') {
47
+ const err = new Error('PRINCIPAL_REDUCTION_FAILED: missing or invalid user id claim');
48
+ err.code = 'PRINCIPAL_REDUCTION_FAILED';
49
+ throw err;
50
+ }
51
+
52
+ const orgMemberships = rawClaims[CLERK_CLAIM_KEYS.organisationMemberships] ?? [];
53
+ const organisationIds = orgMemberships.map((m) => m[CLERK_CLAIM_KEYS.organisationId]);
54
+ const orgRoles = orgMemberships.map((m) => m[CLERK_CLAIM_KEYS.organisationRole]);
55
+
56
+ // Global roles (from publicMetadata.roles by convention) plus per-org roles
57
+ // flatten into one bare-string roles array; the set membership is what the
58
+ // adapter reasons against.
59
+ const globalRoles = rawClaims?.[CLERK_CLAIM_KEYS.publicMetadata]?.roles ?? [];
60
+ const roles = Array.from(new Set([...globalRoles, ...orgRoles]));
61
+
62
+ return {
63
+ principalId,
64
+ roles,
65
+ organisationIds,
66
+ claims: rawClaims,
67
+ };
68
+ }
69
+ ```
70
+
71
+ ## Downstream code speaks in verbs
72
+
73
+ ```
74
+ // src/handlers/article-edit.ts
75
+ import { assert } from '../authz/adapter';
76
+
77
+ export async function handleArticleEdit(request, response) {
78
+ assert(request.auth, 'article.edit', { organisationId: request.body.organisationId });
79
+ // If assert did not throw, the caller is allowed.
80
+ // Proceed with the edit.
81
+ }
82
+ ```
83
+
84
+ Never:
85
+
86
+ ```
87
+ // ANTI-PATTERN: bypasses the adapter, reads Clerk vocabulary in a handler.
88
+ if (request.auth.roles.includes('editor') || request.auth.roles.includes('admin')) {
89
+ // ...
90
+ }
91
+ ```
92
+
93
+ The scan on AC-9104-3 catches the anti-pattern; the discipline is that every check goes through `can` or `assert`.
94
+
95
+ ## Notes
96
+
97
+ - The mapping table is small enough at project boot that adding a verb is a one-line edit; a project whose table grows past a hundred verbs is signal to consolidate at a coarser verb grain, not to bypass the adapter.
98
+ - The organisation-scoping subject shape (`{ organisationId }` on the second argument of `assert`) is the blueprint's default. Projects that need finer subject shapes (record-owner predicates, hierarchical org trees) layer them above the adapter's return value rather than replacing the adapter.
99
+ - The `publicMetadata.roles` convention above is one of several ways to propagate global roles from Clerk into the session; the specific convention is a Clerk-configuration choice the operator makes on the Clerk dashboard, and the claims mapper adjusts accordingly.