rcf-lite 0.12.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 (625) hide show
  1. package/CHANGELOG.md +11 -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 +15 -9
  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/writer.js +64 -2
  625. package/src/setup/agent-setup.js +28 -10
@@ -0,0 +1,86 @@
1
+ # Node middleware boundary shape
2
+
3
+ The framework-agnostic middleware boundary contract, worked as a shape reference plus two framework-specific adapter samples. The blueprint's TAC-1001 fixes the shape (`verify(request) -> { authenticated, principal?, reason? }`) and the attachment convention (`request.auth`). The framework adapters below are one-file wrappers around the same `verify`; a project on Fastify does not import the Express sample, and vice versa.
4
+
5
+ ## The core `verify` shape
6
+
7
+ ```
8
+ // src/auth/middleware.ts (or the project's equivalent module path)
9
+ import { createSessionVerifier } from './session-verifier';
10
+ import { reduceClaims } from './claims-mapper';
11
+
12
+ export function createVerify({ clerkClient, auditSink, clock }) {
13
+ const verifier = createSessionVerifier({ clerkClient, auditSink, clock });
14
+
15
+ return async function verify(request) {
16
+ const cookieHeader = request.headers.cookie ?? '';
17
+ const sessionCookie = parseCookie(cookieHeader, '__session');
18
+ if (!sessionCookie) {
19
+ return { authenticated: false, reason: 'no-session-cookie' };
20
+ }
21
+
22
+ const result = await verifier.verifySessionCookie(sessionCookie);
23
+ if (!result.valid) {
24
+ return { authenticated: false, reason: result.reason ?? 'invalid-session' };
25
+ }
26
+
27
+ const principal = reduceClaims(result.claims);
28
+ return { authenticated: true, principal };
29
+ };
30
+ }
31
+ ```
32
+
33
+ `parseCookie` is a one-liner cookie-header parser the project already has (or writes as a two-line helper); Clerk's SDK exposes its own cookie helpers on some Node adapters, and using those is fine.
34
+
35
+ ## Express adapter
36
+
37
+ ```
38
+ // src/auth/adapters/express.ts
39
+ import { createVerify } from '../middleware';
40
+
41
+ export function expressMiddleware(deps) {
42
+ const verify = createVerify(deps);
43
+
44
+ return async function (req, res, next) {
45
+ const result = await verify(req);
46
+ if (!result.authenticated) {
47
+ if (req.accepts('html')) {
48
+ return res.redirect(302, '/sign-in');
49
+ }
50
+ return res.status(401).json({ error: 'unauthenticated', reason: result.reason });
51
+ }
52
+ req.auth = result.principal;
53
+ next();
54
+ };
55
+ }
56
+ ```
57
+
58
+ ## Fastify adapter
59
+
60
+ ```
61
+ // src/auth/adapters/fastify.ts
62
+ import fp from 'fastify-plugin';
63
+ import { createVerify } from '../middleware';
64
+
65
+ export const fastifyPlugin = fp(async (fastify, deps) => {
66
+ const verify = createVerify(deps);
67
+
68
+ fastify.addHook('preHandler', async (request, reply) => {
69
+ const result = await verify(request);
70
+ if (!result.authenticated) {
71
+ if (request.headers.accept?.includes('text/html')) {
72
+ return reply.redirect(302, '/sign-in');
73
+ }
74
+ return reply.code(401).send({ error: 'unauthenticated', reason: result.reason });
75
+ }
76
+ request.auth = result.principal;
77
+ });
78
+ });
79
+ ```
80
+
81
+ ## Notes
82
+
83
+ - Both adapters attach to `request.auth`; downstream handlers read the same field name regardless of framework. This is what the `AC-9101-2` runtime observation binds against.
84
+ - Both adapters refuse with 401 for API-shaped requests and a 302 redirect for HTML-shaped ones; the shape choice is a route-class convention the operator adjusts if the project's error envelope differs.
85
+ - Neither adapter caches the verification result across requests inside the adapter; the caching (if any) lives inside the session verifier and is bounded by the `revocationCheckIntervalMs` window on ADR-1005.
86
+ - Neither adapter reads the raw claim bag; the reduction happens once inside `createVerify` and the adapter attaches the reduced `Principal`.
@@ -0,0 +1,48 @@
1
+ # ClerkProvider wiring: React-family sample
2
+
3
+ This is a shape-level sample for wiring Clerk's client SDK into a React-family client tier. It is a reference for the operator or the working agent realising the blueprint's TACs; it is not a copy-paste production module. The Clerk SDK identifiers below (`@clerk/clerk-react`, `ClerkProvider`, `useAuth`, `useUser`) reflect the SDK's shape at the blueprint's authoring window; consult Clerk's currently-canonical documentation at the project's build time and adjust if the package or export name has changed.
4
+
5
+ ## Where the provider mounts
6
+
7
+ The provider wraps the client tier's route surface once, at the top of the tree, above the router. Every route inside the provider has access to the Clerk client through the hook surface; nothing outside the provider does.
8
+
9
+ ```
10
+ // src/main.tsx (or the framework's equivalent boot module)
11
+ import { ClerkProvider } from '@clerk/clerk-react';
12
+ import { Router } from './router';
13
+
14
+ const publishableKey = window.__CLERK_PUBLISHABLE_KEY__;
15
+ // Read from the project's config surface, not from process.env directly.
16
+ // The secrets-management blueprint's Secrets Manager client is the source
17
+ // on the server side; the client tier consumes the publishable key
18
+ // as a build-time replacement or a boot-time injected global.
19
+
20
+ export function App() {
21
+ return (
22
+ <ClerkProvider publishableKey={publishableKey}>
23
+ <Router />
24
+ </ClerkProvider>
25
+ );
26
+ }
27
+ ```
28
+
29
+ ## What the client tier reads
30
+
31
+ Two hooks cover most cases:
32
+
33
+ - `useAuth()` returns `{ isSignedIn, signOut, ... }`. The client tier calls `signOut()` on the operator's sign-out action; this is what invalidates the session on Clerk's side per AC-9107-1.
34
+ - `useUser()` returns the resolved user object; the client tier reads it for display purposes (an avatar, a display name). Downstream authorisation checks do not run on the client-tier user object; they run on the server against `request.auth` through the authorisation adapter.
35
+
36
+ ## The `__session` cookie is invisible to the client tier
37
+
38
+ The Clerk SDK on the client tier does not read the `__session` cookie value (it is HttpOnly). The SDK's client-side state (whether the user is signed in, who the user is at the display level) is synchronised through Clerk's own client-side session store; the cookie is the credential the browser sends to the project's server on every same-origin request.
39
+
40
+ ## Composition with the SPA blueprint
41
+
42
+ If the project has applied `application-spa`, the SPA blueprint's 401-redirect posture composes with this blueprint's middleware: a route the SPA blueprint marks as requiring authentication redirects to the sign-in surface when the middleware refuses; the SPA blueprint's error envelope shape is unchanged by this blueprint.
43
+
44
+ ## What this sample deliberately does not cover
45
+
46
+ - A specific router library binding (React Router, TanStack Router). The provider mounts above the router; the router choice is the project's.
47
+ - Server-side rendering configuration. The Clerk SDK has SSR support that varies by framework (Next.js, Remix); consult the currently-canonical Clerk documentation for the project's framework.
48
+ - The sign-in and sign-up components themselves (`<SignIn />`, `<SignUp />`, or the hosted alternative). Those are Clerk-provided; the operator mounts them at a route (`/sign-in`, `/sign-up`) and the blueprint's job is to verify the resulting session on the server.
@@ -0,0 +1,41 @@
1
+ # Clerk plugin wiring: Vue-family sample
2
+
3
+ The Vue-family counterpart to the React sample. Same shape (a provider mounted once, above the router); different SDK. The Clerk Vue-family package identifier below (`@clerk/vue`) reflects Clerk's Vue support at the blueprint's authoring window; consult Clerk's currently-canonical documentation at the project's build time and adjust if the package or plugin surface has changed.
4
+
5
+ ## Where the plugin registers
6
+
7
+ The plugin registers on the Vue app instance once, at boot, before the router is used.
8
+
9
+ ```
10
+ // src/main.ts (or the framework's equivalent boot module)
11
+ import { createApp } from 'vue';
12
+ import { clerkPlugin } from '@clerk/vue';
13
+ import App from './App.vue';
14
+ import { router } from './router';
15
+
16
+ const publishableKey = window.__CLERK_PUBLISHABLE_KEY__;
17
+ // Read from the project's config surface, not from import.meta.env directly.
18
+ // Same convention as the React sample.
19
+
20
+ const app = createApp(App);
21
+ app.use(clerkPlugin, { publishableKey });
22
+ app.use(router);
23
+ app.mount('#app');
24
+ ```
25
+
26
+ ## What the client tier reads
27
+
28
+ The Clerk Vue plugin exposes composables (`useAuth`, `useUser`, `useSignOut`) whose surface mirrors the React hooks. The client tier calls `useSignOut()` (or the equivalent) on the operator's sign-out action; that is what invalidates the session on Clerk's side per AC-9107-1.
29
+
30
+ ## The `__session` cookie is invisible to the client tier
31
+
32
+ Same rule as the React sample: the cookie is HttpOnly; the SDK synchronises client-side sign-in state through its own store; the cookie rides on every same-origin request to the project's server.
33
+
34
+ ## Composition with the SPA blueprint
35
+
36
+ If the project has applied `application-spa`, the SPA blueprint's 401-redirect posture composes with this blueprint's middleware exactly as it does in the React case; the SPA blueprint's session-and-redirect posture is framework-agnostic on the client tier.
37
+
38
+ ## What this sample deliberately does not cover
39
+
40
+ - Nuxt-specific module wiring. Clerk has Nuxt-specific modules; the operator on a Nuxt project consults Clerk's Nuxt documentation for the module-mode wiring rather than following this shape.
41
+ - The sign-in and sign-up components. Same as the React sample: those are Clerk-provided.
@@ -0,0 +1,42 @@
1
+ {
2
+ "slug": "security-auth-clerk",
3
+ "version": "1.0.0",
4
+ "category": "security",
5
+ "contributions": [
6
+ { "id": "security-auth-clerk-REQ-001", "kind": "req", "path": "requirements/security-auth-clerk-req-001.json" },
7
+ { "id": "security-auth-clerk-REQ-002", "kind": "req", "path": "requirements/security-auth-clerk-req-002.json" },
8
+ { "id": "security-auth-clerk-REQ-003", "kind": "req", "path": "requirements/security-auth-clerk-req-003.json" },
9
+ { "id": "security-auth-clerk-REQ-004", "kind": "req", "path": "requirements/security-auth-clerk-req-004.json" },
10
+ { "id": "security-auth-clerk-REQ-005", "kind": "req", "path": "requirements/security-auth-clerk-req-005.json" },
11
+ { "id": "security-auth-clerk-REQ-006", "kind": "req", "path": "requirements/security-auth-clerk-req-006.json" },
12
+ { "id": "security-auth-clerk-REQ-007", "kind": "req", "path": "requirements/security-auth-clerk-req-007.json" },
13
+ { "id": "security-auth-clerk-REQ-008", "kind": "req", "path": "requirements/security-auth-clerk-req-008.json" },
14
+ { "id": "security-auth-clerk-REQ-009", "kind": "req", "path": "requirements/security-auth-clerk-req-009.json" },
15
+ { "id": "security-auth-clerk-US-9101", "kind": "us", "path": "user-stories/security-auth-clerk-us-9101.json" },
16
+ { "id": "security-auth-clerk-US-9102", "kind": "us", "path": "user-stories/security-auth-clerk-us-9102.json" },
17
+ { "id": "security-auth-clerk-US-9103", "kind": "us", "path": "user-stories/security-auth-clerk-us-9103.json" },
18
+ { "id": "security-auth-clerk-US-9104", "kind": "us", "path": "user-stories/security-auth-clerk-us-9104.json" },
19
+ { "id": "security-auth-clerk-US-9105", "kind": "us", "path": "user-stories/security-auth-clerk-us-9105.json" },
20
+ { "id": "security-auth-clerk-US-9106", "kind": "us", "path": "user-stories/security-auth-clerk-us-9106.json" },
21
+ { "id": "security-auth-clerk-US-9107", "kind": "us", "path": "user-stories/security-auth-clerk-us-9107.json" },
22
+ { "id": "security-auth-clerk-US-9108", "kind": "us", "path": "user-stories/security-auth-clerk-us-9108.json" },
23
+ { "id": "security-auth-clerk-US-9109", "kind": "us", "path": "user-stories/security-auth-clerk-us-9109.json" },
24
+ { "id": "security-auth-clerk-US-9110", "kind": "us", "path": "user-stories/security-auth-clerk-us-9110.json" },
25
+ { "id": "security-auth-clerk-US-9111", "kind": "us", "path": "user-stories/security-auth-clerk-us-9111.json" },
26
+ { "id": "TAC-1001-security-auth-clerk-middleware", "kind": "tac", "path": "tacs/tac-1001-security-auth-clerk-middleware.json" },
27
+ { "id": "TAC-1002-security-auth-clerk-authorisation-adapter", "kind": "tac", "path": "tacs/tac-1002-security-auth-clerk-authorisation-adapter.json" },
28
+ { "id": "TAC-1003-security-auth-clerk-session-verifier", "kind": "tac", "path": "tacs/tac-1003-security-auth-clerk-session-verifier.json" },
29
+ { "id": "TAC-1004-security-auth-clerk-claims-mapper", "kind": "tac", "path": "tacs/tac-1004-security-auth-clerk-claims-mapper.json" },
30
+ {
31
+ "id": "ADR-1001-security-auth-clerk-auth-model",
32
+ "kind": "adr",
33
+ "path": "adrs/adr-1001-security-auth-clerk-auth-model.json",
34
+ "scope": "global",
35
+ "topic": "authModel"
36
+ },
37
+ { "id": "ADR-1002-security-auth-clerk-middleware-boundary", "kind": "adr", "path": "adrs/adr-1002-security-auth-clerk-middleware-boundary.json" },
38
+ { "id": "ADR-1003-security-auth-clerk-authorisation-adapter-contract", "kind": "adr", "path": "adrs/adr-1003-security-auth-clerk-authorisation-adapter-contract.json" },
39
+ { "id": "ADR-1004-security-auth-clerk-claims-mapping-discipline", "kind": "adr", "path": "adrs/adr-1004-security-auth-clerk-claims-mapping-discipline.json" },
40
+ { "id": "ADR-1005-security-auth-clerk-session-lifecycle", "kind": "adr", "path": "adrs/adr-1005-security-auth-clerk-session-lifecycle.json" }
41
+ ]
42
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "adrId": "ADR-1001-security-auth-clerk-auth-model",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Clerk-hosted identity with server-verified session cookies is the project's authentication model",
8
+ "context": "A project has one authentication model; the client tier, the server tier, and every operator surface must reason against it. The security-auth-clerk blueprint contributes a Clerk-committed shape of that model: identity, sign-in UX, credential storage, MFA, and account recovery all live at Clerk; the project owns the reduction of a verified session into a principal and the authorisation adapter that speaks in project verbs. A client-tier blueprint (application-spa), a server-tier blueprint (application-api-rest), and every other auth-family blueprint (security-auth-magic-link, security-auth-oauth2 when it ships, security-auth-keycloak when it ships) contribute their own decisions on this topic; blueprint composition surfaces the pairing at add time for the operator to reconcile into one project-level model. That surfacing is intended.",
9
+ "decision": "The project's authentication model is Clerk-hosted identity. Sign-in is delegated to Clerk's sign-in surfaces (hosted UI or embedded components); credential storage, MFA, account recovery, and sign-in strategy choice are Clerk's concerns. The wire credential is a Clerk-issued session cookie named `__session` (per Clerk's currently-supported cookie contract), Secure, HttpOnly, SameSite=Lax. Server-side middleware verifies the cookie against Clerk's session-verification surface and lifts the resolved claims into a reduced Principal shape the rest of the project reasons against. The project does not own a user table, does not mint credentials, and does not implement sign-in UX beyond wiring the Clerk surface into a route. User and organisation provisioning are Clerk-owned and are read-only from the runtime's perspective (REQ-009). Rate-limiting and anti-enumeration on the sign-in flow are Clerk's (REQ-007).",
10
+ "consequences": "The project owns the middleware boundary, the session verifier, the claims mapper, and the authorisation adapter; Clerk owns everything else on the identity surface. Vendor swap (from Clerk to a different hosted identity vendor) is a project-level ADR supersede on this topic plus an adapter swap on the middleware and verifier modules; the boundary shape does not change. Composing with another auth-family blueprint (magic-link, OAuth2, Keycloak) conflicts on this topic by design; the expected resolution is one project-level ADR that fixes the identity surface and the credential shape for the whole project. The `accountBound` posture on runtime-verify ACs is explicit: runs without Clerk reachability skip those ACs with a stable-coded reason; passing without a live Clerk session is not an option.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Passwordless magic-link with server-issued opaque cookie sessions",
14
+ "summary": "The security-auth-magic-link blueprint's model: mint a single-use token on POST /login, deliver by email, verify on GET /login/verify, issue an opaque-handle session cookie.",
15
+ "reasonNotChosen": "Valid for projects that want no third-party identity dependency; the trade is that the project owns the principal registry, the email adapter, the rate-limiter, and the anti-enumeration posture. Clerk removes that surface at the cost of a vendor dependency; the blueprint at hand names that trade explicitly."
16
+ },
17
+ {
18
+ "name": "Self-hosted OIDC via Keycloak",
19
+ "summary": "Run a Keycloak instance the project federates against through the OIDC authorization-code flow.",
20
+ "reasonNotChosen": "Valid for projects with existing ops capacity and a hard multi-tenant IdP requirement; the container plus realm configuration cost is disproportionate at the rcf-lite tier this blueprint targets. A future security-auth-keycloak blueprint covers that shape and conflicts here on the same topic; the operator resolves at apply."
21
+ },
22
+ {
23
+ "name": "Direct OAuth2 authorization-code flow with a specific external provider (Google, GitHub)",
24
+ "summary": "Skip a hosted identity vendor; wire OAuth2 directly against one or more social providers.",
25
+ "reasonNotChosen": "Valid where a project wants exactly one social sign-in and nothing more; the trade is that the project owns token handling, refresh flows, provider quirks, and the principal registry. A future security-auth-oauth2 blueprint covers that shape and conflicts here on the same topic; the operator resolves at apply."
26
+ }
27
+ ],
28
+ "createdAt": "2026-08-30T00:00:00Z",
29
+ "updatedAt": "2026-08-30T00:00:00Z"
30
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-1002-security-auth-clerk-middleware-boundary",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "The middleware boundary contract is framework-agnostic and single-shaped",
8
+ "context": "Every project that consumes this blueprint runs on some Node HTTP framework, and the field of realistic frameworks is not one: rcf-lite projects ship on Express, Fastify, plain Node HTTP, and Cloudflare Workers with roughly equal frequency. Fixing the framework at the blueprint layer would force the majority of consumers into a shim they did not want; leaving both the shape and the framework open would leave the blueprint unable to make any concrete claim about what an authenticated request looks like.",
9
+ "decision": "The middleware boundary contract is a single function shape, `verify(request) -> { authenticated, principal?, reason? }`, and one attachment convention, `request.auth`. Framework-specific adapters are project-authored thin shims that call the same `verify`. The blueprint ships adapter samples for two of the four common shapes (Express and Fastify are the two the guide's samples cover); the other two are one-file adaptations the project authors when it needs them.",
10
+ "consequences": "The middleware module has one testable surface (`verify`) that the shim wrappers do not distort. Framework variance is absorbed at the shim layer, where it should be; the blueprint's ACs bind to the shape the middleware produces, not to the shim's plumbing. A project that hosts multiple runtimes (an Express main app and a Workers edge function, say) reuses the same verifier and mapper through two shims and pays the shim cost twice.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Ship as an Express middleware",
14
+ "summary": "Fix the framework at Express; every consumer imports the middleware as Express-shaped and adapts on the way in.",
15
+ "reasonNotChosen": "Locks out Fastify, Workers, and plain Node HTTP consumers; Express is not the majority framework at the rcf-lite tier, and forcing a shim is the wrong default."
16
+ },
17
+ {
18
+ "name": "Ship as a Clerk-SDK-directly-consumed pattern with no boundary module",
19
+ "summary": "Every route imports Clerk's SDK directly and reads whichever claim shape it needs.",
20
+ "reasonNotChosen": "Breaks REQ-001's principal reduction and REQ-004's authorisation adapter; the vendor lock is total and the swap cost is a rewrite."
21
+ }
22
+ ],
23
+ "createdAt": "2026-08-30T00:00:00Z",
24
+ "updatedAt": "2026-08-30T00:00:00Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-1003-security-auth-clerk-authorisation-adapter-contract",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Authorisation checks speak in project verbs through the adapter, never in Clerk claim vocabulary",
8
+ "context": "Downstream code that reads `principal.roles.includes('admin')` or `principal.claims['org:role'] === 'X'` ties the project to Clerk's claim vocabulary version and drifts silently when Clerk changes it. It also makes the vendor swap a codebase sweep rather than an adapter change. The blueprint ships an authorisation adapter (TAC-1002) that maps Clerk claims onto project-defined verbs; the discipline that keeps the adapter useful is that every downstream check goes through it.",
9
+ "decision": "Every authorisation check in the project goes through `can(principal, verb, subject?)` or `assert(principal, verb, subject?)` on the authorisation adapter. Verbs are project-defined strings owned by the project's mapping-table module. No handler, no middleware wrapper, no template, and no view helper reads `principal.roles`, `principal.organisationIds`, or `principal.claims` directly. The source-tree scan on AC-9104-3 is the enforcement mechanism.",
10
+ "consequences": "The vocabulary the project's code speaks in is project-owned; changing the Clerk vendor is a mapping-table rewrite plus an adapter swap on the middleware and verifier, not a codebase sweep. The trade is that adding a new authorisation check requires adding a verb to the mapping table before the handler can call `can` on it; the adapter refuses unknown verbs, which forces the discipline. A project that finds itself adding a new verb per change is signal that the mapping is too fine-grained; consolidate at the mapping level, not by bypassing the adapter.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Handlers read `principal.roles` directly for simple cases",
14
+ "summary": "Allow direct role reads on the principal for the common case; use the adapter only for the complex cases.",
15
+ "reasonNotChosen": "The common case is the majority of the code; the discipline collapses if the adapter is optional. The scan-catches-everything discipline requires 'no direct reads anywhere'."
16
+ },
17
+ {
18
+ "name": "Skip verbs and speak in roles",
19
+ "summary": "The adapter exposes `hasRole(principal, roleName)` and downstream code checks for role membership rather than verb grants.",
20
+ "reasonNotChosen": "Same failure mode as reading `principal.roles` directly, one indirection deeper. Roles are Clerk's vocabulary; verbs are the project's, and the project's vocabulary is what the code should speak in."
21
+ }
22
+ ],
23
+ "createdAt": "2026-08-30T00:00:00Z",
24
+ "updatedAt": "2026-08-30T00:00:00Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-1004-security-auth-clerk-claims-mapping-discipline",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Clerk claim keys live in one named constant record; the raw `claims` bag is an escape hatch",
8
+ "context": "Clerk's claim vocabulary is not stable across major SDK versions; a rename on the Clerk side (a claim key shifting from one string to another) is a real thing that happens between versions. The blueprint's ambition to keep the vendor swap cheap depends on the project not scattering literal Clerk claim keys through its handler code. At the same time, refusing to expose the raw claims at all forces the project to author every mapping up front, which fights the incremental-adoption posture the rcf-lite tier depends on.",
9
+ "decision": "The claims mapper (TAC-1004) exports one named constant record `CLERK_CLAIM_KEYS` that maps each project-facing name (`userId`, `roles`, `organisations`, ...) to the Clerk-side claim key string at the SDK version the project builds against. Every reduction step in the mapper reads through that record; no other module in the mapper hard-codes a Clerk claim key. The mapper's `reduceClaims` return value carries a `claims` field with the raw claim bag verbatim as an escape hatch; downstream reads on `.claims` are treated as a code-review-visible smell but not a mechanism refusal.",
10
+ "consequences": "A Clerk-side claim rename is a one-file change: update `CLERK_CLAIM_KEYS`. The escape hatch admits a small class of downstream code that reads a raw Clerk claim directly rather than through a reduction; the discipline states that if the same claim is read more than once it must move into the reduction. The scan on AC-9104-3 catches `.roles`, `.organisationIds`, and `.claims` reads outside the adapter and the mapper; a scan that catches `.claims[<key>]` in a handler is a code-review flag, not a mechanism refusal.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Refuse to expose the raw claims bag at all",
14
+ "summary": "The mapper reduces to the fixed shape and drops everything else on the floor.",
15
+ "reasonNotChosen": "Forces the project to author every mapping up front. The escape hatch is what makes incremental adoption cheap; disciplining its use is a code-review concern, not a mechanism one."
16
+ },
17
+ {
18
+ "name": "Read the raw claim bag freely everywhere",
19
+ "summary": "Skip the reduction; downstream code reads `principal.claims[key]` directly.",
20
+ "reasonNotChosen": "Same failure mode as the discipline this whole blueprint exists to prevent; claim keys sprawl and the vendor swap becomes a rewrite."
21
+ }
22
+ ],
23
+ "createdAt": "2026-08-30T00:00:00Z",
24
+ "updatedAt": "2026-08-30T00:00:00Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-1005-security-auth-clerk-session-lifecycle",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Session verification honours Clerk revocation within a bounded freshness window",
8
+ "context": "Clerk owns session issuance and revocation; the project's verifier owns the read side. Verifying every request against Clerk's revocation-aware endpoint on every request is a per-request round trip whose latency the project pays for; caching the verification result for the session's declared expiry admits a window during which a revoked session continues to verify against a stale cache. The blueprint's decision on this trade must be explicit because REQ-006 makes revocation a hard requirement and the shape of 'hard' is bounded by whichever number the operator picks here.",
9
+ "decision": "The session verifier honours Clerk-side revocation within `revocationCheckIntervalMs` of the revocation event. The default value is 30000 (30 seconds) when the Clerk SDK version in use exposes a revocation-aware verify (in which case the verifier consults the SDK's revocation surface at or shorter than that interval); when the SDK version does not, the verifier falls back to a per-request revocation check on the same call path and the interval becomes de facto zero at the cost of one Clerk round trip per verification. Either way the number is documented at the project's config surface and every verification event's audit record carries a `revocationCheckMode` field naming which shape was used.",
10
+ "consequences": "Under the default, a revoked session may continue to verify for up to 30 seconds after revocation before the verifier's cache expires and the next verification observes the revocation. The trade is stated: 30 seconds is short enough that operator-visible sign-out is prompt and long enough that per-request Clerk round trips are avoided on the hot path. Projects with a stricter freshness requirement drop the interval or use the SDK's revocation-aware verify directly at the cost of that round trip; projects with a laxer requirement raise the interval but the ceiling is the session's own expiry (a longer cache than the session's lifetime is a bug the verifier refuses to boot with).",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Revocation-check on every request always",
14
+ "summary": "The verifier always consults Clerk's revocation surface on every verification; no local cache.",
15
+ "reasonNotChosen": "One Clerk round trip per request is a cost the rcf-lite tier's hot path does not want to eat by default; projects that need it enable it explicitly."
16
+ },
17
+ {
18
+ "name": "No revocation check until the session expires",
19
+ "summary": "The verifier caches until the session's declared expiry and never re-checks against Clerk before then.",
20
+ "reasonNotChosen": "Sign-out becomes eventual to a degree operator-visible sign-out cannot tolerate; the whole point of REQ-006 is that the cookie stops working when the operator signs out."
21
+ }
22
+ ],
23
+ "createdAt": "2026-08-30T00:00:00Z",
24
+ "updatedAt": "2026-08-30T00:00:00Z"
25
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "security-auth-clerk-REQ-001",
3
+ "prdId": "PRD-001",
4
+ "title": "Clerk owns the identity surface; the project reads a resolved principal",
5
+ "description": "The project's authentication model delegates the identity surface (users, sessions, sign-in UX, credential storage, MFA, account recovery) to Clerk. The project does not own a user table, does not mint or store credentials, and does not implement the sign-in UI beyond mounting a Clerk-hosted component or route. What the project owns is the reduction of a verified Clerk session into a stable in-process principal shape (a `principalId` string, a `roles` string array, an `organisationIds` string array) that the rest of the project reasons against. Any code path that needs to know who the current caller is reads that resolved principal; no code path calls Clerk directly outside the middleware and session-verifier boundary.",
6
+ "category": "functional",
7
+ "domain": "authentication",
8
+ "priority": "must",
9
+ "rationale": "Two failure modes justify the strict boundary. First, calls to Clerk scattered across the codebase make the vendor swap a rewrite rather than an adapter change; the blueprint's promise (Clerk is the default, another hosted identity vendor is a project-level ADR supersede) collapses. Second, code that reasons against raw Clerk claim shapes ties the project to Clerk's claim vocabulary version and drifts silently when Clerk changes it; a stable in-process principal shape is the seam that absorbs that drift.",
10
+ "tags": [
11
+ "blueprint:security-auth-clerk",
12
+ "category:01-identity-boundary"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-30T00:00:00Z",
17
+ "updatedAt": "2026-08-30T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "security-auth-clerk-REQ-002",
3
+ "prdId": "PRD-001",
4
+ "title": "Session-cookie transport under Clerk's session model",
5
+ "description": "The wire credential is a Clerk-issued session cookie named `__session` (Clerk's documented cookie name at Clerk's currently-supported major). The cookie is Secure, HttpOnly, and SameSite=Lax under a top-level domain; the project does not read the cookie value from JavaScript on the client. Every request that requires an authenticated caller carries the cookie; the server-side middleware verifies the cookie against Clerk's session-verification surface and lifts the resolved principal onto the request. Bearer-in-header transport is out of scope for the blueprint's default; a project that requires it authors a project-level ADR and layers the required transport alongside the cookie one without removing the cookie floor.",
6
+ "category": "security",
7
+ "domain": "authentication",
8
+ "priority": "must",
9
+ "rationale": "The session-cookie model is what Clerk ships as the default browser flow and it composes with the SPA blueprint's XSS floor (HttpOnly means script exfiltration is not the failure mode) and with the REST blueprint's CSRF-shape choice (SameSite=Lax is the floor and a project can layer a double-submit token on top). Pinning the cookie name to Clerk's documented value is what lets the verifier and the middleware speak the same wire without a translation layer.",
10
+ "tags": [
11
+ "blueprint:security-auth-clerk",
12
+ "category:02-session-transport"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-30T00:00:00Z",
17
+ "updatedAt": "2026-08-30T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "security-auth-clerk-REQ-003",
3
+ "prdId": "PRD-001",
4
+ "title": "Framework-agnostic middleware boundary contract",
5
+ "description": "The project integrates Clerk on the server through a middleware boundary whose shape is fixed by the blueprint and whose framework is not. The boundary is a function of the form `verify(request) -> { authenticated: boolean, principal?: Principal, reason?: string }` where `Principal` is the reduced shape from REQ-001. Framework-specific adapters (an Express request handler, a Fastify hook, a Node HTTP wrapper, a Cloudflare Workers fetch handler) are project-authored thin wrappers that delegate to the same underlying verifier; the blueprint does not mandate Express and does not mandate any single HTTP framework, only the shape of the boundary. A request that fails verification is denied at the boundary; a request that passes carries the principal onto the request object under a fixed field name (`request.auth`) for downstream handlers to read.",
6
+ "category": "technical",
7
+ "domain": "authentication",
8
+ "priority": "must",
9
+ "rationale": "Fixing the shape and leaving the framework open is what lets the blueprint apply cleanly against every Node HTTP framework the rcf-lite tier realistically ships against. A project on Fastify does not have to import Express to consume this blueprint; a project on Workers does not have to shim a Node middleware chain. The stable field name (`request.auth`) is what lets downstream handlers and higher-level authorisation checks read the principal without adapter-specific glue.",
10
+ "tags": [
11
+ "blueprint:security-auth-clerk",
12
+ "category:03-middleware-boundary"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-30T00:00:00Z",
17
+ "updatedAt": "2026-08-30T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "security-auth-clerk-REQ-004",
3
+ "prdId": "PRD-001",
4
+ "title": "Authorisation adapter maps Clerk claims onto project verbs",
5
+ "description": "The project's authorisation layer does not consume Clerk claim shapes directly. A single Authorisation Adapter module owns the mapping from a verified principal (roles array, organisation ids array, arbitrary claim bag from the Clerk session) onto the set of project-defined verbs the caller is allowed to perform. The adapter's surface is `can(principal, verb, subject?) -> boolean` and `assert(principal, verb, subject?) -> void | throw`. Verbs are project-defined strings (`article.edit`, `admin.dashboard.view`, `billing.invoice.void`); the adapter's mapping table is project-authored and read from a single module the rest of the project imports. No downstream code path checks `principal.roles.includes('admin')` or `principal.organisationIds.includes('X')` directly; every check goes through `can` or `assert`.",
6
+ "category": "technical",
7
+ "domain": "authorisation",
8
+ "priority": "must",
9
+ "rationale": "Clerk's role and organisation vocabulary is Clerk's, not the project's; the same failure mode that motivates REQ-001's principal reduction motivates a further reduction from principal claims onto project verbs. Downstream code that speaks in verbs is legible (the site's `article.edit` is unambiguous), swap-safe (moving from Clerk to a different identity vendor is an adapter-mapping change, not a codebase rewrite), and testable (project verbs give the test surface a stable vocabulary).",
10
+ "tags": [
11
+ "blueprint:security-auth-clerk",
12
+ "category:04-authorisation-adapter"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-30T00:00:00Z",
17
+ "updatedAt": "2026-08-30T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "security-auth-clerk-REQ-005",
3
+ "prdId": "PRD-001",
4
+ "title": "Sign-in strategy is a fixed-shape config surface",
5
+ "description": "Clerk supports multiple sign-in strategies (email link, email code, password, phone code, OAuth via named providers, SAML). The project's Clerk instance is configured to enable one or more of them; the blueprint fixes the SHAPE of that configuration on the project side as a single `signInStrategy` config record (`{ primary: string, alternates: string[] }`) rather than fixing the CHOICE. The values in the record are Clerk's currently-documented strategy identifiers (as printed by the Clerk dashboard or the Clerk SDK's strategy enumeration at the project's build time). The project's sign-in surface reads the config record and does not hard-code any strategy string; changing the enabled strategy set is a config edit and a Clerk-dashboard change, not a codebase change.",
6
+ "category": "functional",
7
+ "domain": "authentication",
8
+ "priority": "should",
9
+ "rationale": "Fixing the shape leaves the choice open to the operator without leaving the codebase full of hard-coded strategy strings that drift as Clerk's vocabulary drifts. A project that starts on email link and later adds SAML for enterprise is a config bump, not a fork of the sign-in surface. Fixing the choice at the blueprint layer would be premature at the rcf-lite tier where the operator's requirements around sign-in shape are project-specific.",
10
+ "tags": [
11
+ "blueprint:security-auth-clerk",
12
+ "category:05-sign-in-strategy"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-30T00:00:00Z",
17
+ "updatedAt": "2026-08-30T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "security-auth-clerk-REQ-006",
3
+ "prdId": "PRD-001",
4
+ "title": "Sign-out invalidates on Clerk's server; subsequent requests fail verification",
5
+ "description": "Sign-out is initiated by a client-side call to the Clerk sign-out surface (the `signOut` method on Clerk's client SDK or the equivalent server-invoked revocation). The blueprint requires that after sign-out the same session cookie no longer verifies: a subsequent request carrying the pre-sign-out `__session` cookie MUST be treated as unauthenticated by the middleware. Client-side cookie clearing alone is not the revocation mechanism; the revocation is a Clerk-side state change and the middleware's session verifier must observe it. An administrative revoke of a user or session on the Clerk dashboard has the same runtime effect as user-initiated sign-out.",
6
+ "category": "security",
7
+ "domain": "authentication",
8
+ "priority": "must",
9
+ "rationale": "The same rule the magic-link blueprint restates about server-side revocation applies here for the same reason: a session that only ends when the browser forgets its cookie is a session an attacker with the cookie can still ride. Clerk owns the revocation surface; the blueprint's job is to require that the middleware's verifier honours it and does not cache past its useful life.",
10
+ "tags": [
11
+ "blueprint:security-auth-clerk",
12
+ "category:06-sign-out-revocation"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-30T00:00:00Z",
17
+ "updatedAt": "2026-08-30T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "security-auth-clerk-REQ-007",
3
+ "prdId": "PRD-001",
4
+ "title": "Rate-limiting and anti-enumeration are delegated to Clerk",
5
+ "description": "The project does not implement rate-limiting or anti-enumeration on the sign-in flow. Clerk applies its own throttling and account-enumeration defences at the identity surface; the project's job is to name the delegation and not to layer a second-rate rate limiter on top. If the project's request-shape floor requires a rate limiter for other routes (a public API, a webhook receiver), it authors that separately; the sign-in and sign-up surfaces are Clerk's.",
6
+ "category": "security",
7
+ "domain": "authentication",
8
+ "priority": "should",
9
+ "rationale": "A project-side rate limiter over the sign-in flow either duplicates what Clerk already does (dead code that drifts) or interferes with it (retries and back-off that Clerk's own surface handles differently, resulting in confusing user-facing errors). Naming the delegation explicitly is the acceptance bar; the runtime observability is that the sign-in surface's rate-limit behaviour matches Clerk's documented behaviour rather than a project-authored variant.",
10
+ "tags": [
11
+ "blueprint:security-auth-clerk",
12
+ "category:07-rate-limiting-delegation"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-30T00:00:00Z",
17
+ "updatedAt": "2026-08-30T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "security-auth-clerk-REQ-008",
3
+ "prdId": "PRD-001",
4
+ "title": "Runtime acceptance rides a real Clerk development instance",
5
+ "description": "Clerk hosts the identity surface; there is no in-project emulator for the sign-in flow at the fidelity the acceptance criteria depend on. Runtime acceptance for the blueprint's ACs uses a real Clerk development instance (Clerk's documented development-tier deployment shape) with placeholder-configured publishable and secret keys held in the project's secrets manifest. The blueprint's `accountBound` posture is explicit: an environment without Clerk reachability cannot satisfy the runtime-verify class of ACs and the project's ship gate must acknowledge that.",
6
+ "category": "nonFunctional",
7
+ "domain": "authentication",
8
+ "priority": "must",
9
+ "rationale": "Faking Clerk's session issuance in-process elides the parts of the flow the blueprint most needs verified (real signature check on real Clerk-issued cookies, real revocation-on-sign-out, real claim propagation). The rcf-lite ship gate accommodates `accountBound` tests already; the blueprint states the posture and the ACs bind to it rather than pretending an emulator will do.",
10
+ "tags": [
11
+ "blueprint:security-auth-clerk",
12
+ "category:08-account-bound"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-30T00:00:00Z",
17
+ "updatedAt": "2026-08-30T00:00:00Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "reqId": "security-auth-clerk-REQ-009",
3
+ "prdId": "PRD-001",
4
+ "title": "User and organisation provisioning are read-only from the project's perspective",
5
+ "description": "Users and organisations are created, updated, and deleted through Clerk's surfaces (the Clerk dashboard, the Clerk sign-up flow, or the Clerk Backend API called from a project-authored provisioning script). The project's runtime does not create, update, or delete users or organisations on Clerk's behalf as part of the request lifecycle; roles and organisation memberships are read from the verified session by the middleware and propagated as read-only fields on the principal. A project that needs to mirror Clerk state into a local table for query purposes does so through a project-authored Clerk-webhook consumer whose contract is out of scope for the blueprint's default (a project that includes one authors one additional TAC and a scope-local ADR).",
6
+ "category": "technical",
7
+ "domain": "authentication",
8
+ "priority": "must",
9
+ "rationale": "Split-brain identity state (Clerk holds one shape, the project's tables hold a divergent shape) is the failure mode this requirement forecloses. Clerk is authoritative for identity; the project reads. Mirroring is a project decision layered on the read-only floor, not a substitute for it.",
10
+ "tags": [
11
+ "blueprint:security-auth-clerk",
12
+ "category:09-provisioning-boundary"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-30T00:00:00Z",
17
+ "updatedAt": "2026-08-30T00:00:00Z"
18
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "tacId": "TAC-1001-security-auth-clerk-middleware",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "approved",
7
+ "name": "Clerk middleware boundary",
8
+ "purpose": "The framework-agnostic boundary the project's HTTP surface delegates to for every request that reaches an authenticated route. Owns the `verify(request) -> { authenticated, principal?, reason? }` contract and the attachment of `request.auth` for downstream handlers. Delegates the actual session-cookie verification to the session verifier (TAC-1003) and the claim-to-principal reduction to the claims mapper (TAC-1004). Framework-specific adapters (Express middleware, Fastify hook, Node HTTP wrapper, Workers fetch wrapper) are project-authored thin shims that delegate to this one module.",
9
+ "responsibilities": [
10
+ "Expose `verify(request)` returning `{ authenticated: boolean, principal?: Principal, reason?: string }` (AC-9101-2, AC-9101-3).",
11
+ "Attach `request.auth` on the request object when verification succeeds; do not attach it on failure (AC-9101-2, AC-9102-1).",
12
+ "Refuse requests on failed verification with a status appropriate to the route class (401 for API-shaped, redirect for page-shaped) as declared by the wiring shim; the handler must not be invoked (AC-9103-2, AC-9103-3, AC-9107-1).",
13
+ "Read the `__session` cookie by name from the request; do not accept credentials from any other transport under the blueprint's default (AC-9101-1, AC-9101-3).",
14
+ "Read the `signInStrategy` config record from the project's config module for any sign-in surface that requires it; hold no hard-coded strategy string (AC-9108-1, AC-9108-2).",
15
+ "Confine the import of Clerk's server SDK to this module and to the session verifier (TAC-1003); other project code imports the middleware, not the SDK (AC-9102-2)."
16
+ ],
17
+ "internalStructure": "One stateless factory function producing the `verify` closure over an injected session verifier and an injected claims mapper. Framework shims (an `expressMiddleware()` wrapper, a `fastifyPlugin()` wrapper, a `workersHandler()` wrapper) are one-file adapters colocated with this TAC's module directory; each delegates to the same `verify`. The wrapper for a given framework is enabled by the project's boot code choosing one; the blueprint does not mandate the choice.",
18
+ "interfaces": [
19
+ {
20
+ "name": "sessionVerifier",
21
+ "kind": "read-api",
22
+ "description": "The session verifier (TAC-1003) exposing `verifySessionCookie(cookieValue) -> { valid, claims?, revokedAt? }`. The middleware calls this on the `__session` cookie value and treats a non-valid return as unauthenticated."
23
+ },
24
+ {
25
+ "name": "claimsMapper",
26
+ "kind": "read-api",
27
+ "description": "The claims mapper (TAC-1004) exposing `reduceClaims(rawClaims) -> Principal`. The middleware calls this on a valid session's claims to produce the `Principal` it attaches to `request.auth`."
28
+ },
29
+ {
30
+ "name": "config",
31
+ "kind": "read-api",
32
+ "description": "The project's config module exposing `signInStrategy: { primary, alternates }`. The middleware reads it once at construction; a re-read is a boot-time concern."
33
+ }
34
+ ],
35
+ "dependencies": [
36
+ { "name": "Clerk session verifier", "kind": "tac", "tacId": "TAC-1003-security-auth-clerk-session-verifier", "description": "The session-verification surface the middleware delegates cookie verification to." },
37
+ { "name": "Clerk claims mapper", "kind": "tac", "tacId": "TAC-1004-security-auth-clerk-claims-mapper", "description": "The reduction from raw Clerk claims onto the project's Principal shape." }
38
+ ],
39
+ "tradeoffs": "Fixing the shape and the boundary while leaving the framework open costs the project one thin shim per HTTP framework it uses. Projects on a single framework carry one shim and pay nothing; projects that host multiple runtimes (an Express main app plus a Workers edge function) carry two shims but share the verifier and the mapper. That is intentional: the seam that absorbs framework variation is the shim, not the middleware.",
40
+ "createdAt": "2026-08-30T00:00:00Z",
41
+ "updatedAt": "2026-08-30T00:00:00Z"
42
+ }