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,55 @@
1
+ # Mock OIDC provider bootstrap: shape (not a library commitment)
2
+
3
+ Shape a project stands up to satisfy REQ-010's runtime-verify posture. The mock is real OIDC on the wire; the flow controller cannot tell it apart from a live IdP for the purpose of the state machine, PKCE binding, id_token verification, and session-bridge round-trip.
4
+
5
+ A project may implement the mock in-process (a small Node HTTP server the test harness starts and tears down), against an existing library (Node has `node-oidc-provider` and equivalents; the blueprint does not commit a version), or as a persistent scratch service. The shape below is what the test harness expects, not what a specific library commits to.
6
+
7
+ ## Discovery document (`GET /.well-known/openid-configuration`)
8
+
9
+ ```
10
+ {
11
+ issuer: 'http://127.0.0.1:<port>',
12
+ authorization_endpoint: 'http://127.0.0.1:<port>/authorize',
13
+ token_endpoint: 'http://127.0.0.1:<port>/token',
14
+ userinfo_endpoint: 'http://127.0.0.1:<port>/userinfo',
15
+ jwks_uri: 'http://127.0.0.1:<port>/jwks',
16
+ end_session_endpoint: 'http://127.0.0.1:<port>/end-session',
17
+ response_types_supported: ['code'],
18
+ code_challenge_methods_supported: ['S256'],
19
+ subject_types_supported: ['public'],
20
+ id_token_signing_alg_values_supported: ['RS256']
21
+ }
22
+ ```
23
+
24
+ ## JWKS (`GET /jwks`)
25
+
26
+ A JSON Web Key Set with one RSA public key. The mock holds the corresponding private key and signs id_tokens with it. The test harness can rotate the JWKS mid-test to exercise AC-10105-2 (signature invalid).
27
+
28
+ ## Authorize (`GET /authorize`)
29
+
30
+ Accepts `response_type=code`, `client_id`, `redirect_uri`, `state`, `code_challenge`, `code_challenge_method=S256`, `nonce`, `scope=openid profile email`. Stores a pending record keyed by the code it mints. Redirects to `redirect_uri` with `code=<minted>&state=<passed>`.
31
+
32
+ ## Token (`POST /token`)
33
+
34
+ Accepts `grant_type=authorization_code` with `code`, `code_verifier`, `client_id`, `redirect_uri`. Verifies the `code_verifier` against the pending record's stored challenge. Mints:
35
+
36
+ - `access_token`: opaque
37
+ - `id_token`: signed JWT with `iss`, `aud=client_id`, `sub`, `nonce=<from-authorize>`, `iat`, `exp`
38
+ - `refresh_token`: opaque, rotates on `grant_type=refresh_token`
39
+
40
+ Also accepts `grant_type=refresh_token` with `refresh_token` and rotates. Test-controllable knobs (per-code): return `invalid_grant` on demand (for AC-10103-2, AC-10104-1), omit `id_token` (for AC-10105-4), mint id_token with wrong `iss` (for AC-10105-3), mint id_token signed by an unpublished key (for AC-10105-2), return the same `refresh_token` twice to simulate reuse (for AC-10107-2).
41
+
42
+ ## Userinfo (`GET /userinfo`)
43
+
44
+ Accepts `Authorization: Bearer <access_token>`. Returns a fixed claim record `{ sub, email }`. Used by `providerKind: 'oauth2-only'` records; OIDC-declared providers rely on the id_token for identity.
45
+
46
+ ## End session (`GET /end-session`)
47
+
48
+ Accepts `post_logout_redirect_uri` and `id_token_hint`. Returns 302 to the `post_logout_redirect_uri` after invalidating any local session state the mock holds.
49
+
50
+ ## Wiring notes for the project
51
+
52
+ - The mock listens on `127.0.0.1:<random-port>` and the harness passes the port to the provider record's endpoints. `redirect_uri` on the record points at the project's callback route.
53
+ - The mock's private key stays in the harness process; nothing off-machine holds it. The public JWKS is what the flow-controller's verifier reads.
54
+ - The mock does NOT need to persist state; a fresh instance per test suite is fine and preferred.
55
+ - The blueprint does NOT commit a specific library. If a project wants a persistent scratch service (a container the CI stands up once), that is also fine; the shape above is the contract.
@@ -0,0 +1,27 @@
1
+ # Provider selector: list-shape rendering
2
+
3
+ The reference rendering TAC-1104 emits when the project has N>1 configured providers. Framework-agnostic HTML string; a project on React, Vue, or another rendering pipeline substitutes its own selector surface as long as it honours the query-parameter contract on `/auth/sign-in?provider=<id>`.
4
+
5
+ ## Rendered shape (illustrative, not a template lock)
6
+
7
+ ```
8
+ <main data-selector="oauth2-providers">
9
+ <h1>Sign in</h1>
10
+ <ul>
11
+ <li><a href="/auth/sign-in?provider=google">Sign in with Google</a></li>
12
+ <li><a href="/auth/sign-in?provider=github">Sign in with GitHub</a></li>
13
+ <li><a href="/auth/sign-in?provider=corporate-sso">Sign in with Corporate SSO</a></li>
14
+ </ul>
15
+ </main>
16
+ ```
17
+
18
+ ## Query-parameter contract
19
+
20
+ - `GET /auth/sign-in?provider=<id>` initiates a flow against the named provider.
21
+ - `GET /auth/sign-in` with N==1 short-circuits to the single provider.
22
+ - `GET /auth/sign-in` with N>1 renders this selector (or the project's replacement).
23
+ - Any `provider=<unknown-id>` is refused with `OAUTH2_PROVIDER_UNKNOWN` (AC-10109-2).
24
+
25
+ ## Substituting a bespoke selector
26
+
27
+ A project that wants a branded rendering replaces the route handler that TAC-1104 provides; the substituted handler reads the same `providerConfig` module and renders however it wants, then links each choice to `/auth/sign-in?provider=<id>`. The state machine downstream is unchanged. There is no other seam to observe: the contract is the query parameter.
@@ -0,0 +1,31 @@
1
+ # Generic OIDC (discovery-driven) provider record
2
+
3
+ A sample provider record shape for any OIDC provider that publishes an RFC 8414 or OIDC Core discovery document. Populate the endpoints from `<issuer>/.well-known/openid-configuration` at boot; the operator or the project code writes a one-off populator that fetches discovery and returns the record on this shape.
4
+
5
+ ```
6
+ {
7
+ id: '<OPERATOR_CHOSEN_STABLE_SLUG>',
8
+ label: '<OPERATOR_CHOSEN_LABEL>',
9
+ authorizeUrl: '<DISCOVERY.authorization_endpoint>',
10
+ tokenUrl: '<DISCOVERY.token_endpoint>',
11
+ userinfoUrl: '<DISCOVERY.userinfo_endpoint>',
12
+ issuer: '<DISCOVERY.issuer>',
13
+ jwksUri: '<DISCOVERY.jwks_uri>',
14
+ endSessionEndpoint: '<DISCOVERY.end_session_endpoint>',
15
+ clientId: '<PLACEHOLDER_CLIENT_ID>',
16
+ clientSecret: '<PLACEHOLDER_CLIENT_SECRET>',
17
+ scopes: ['openid', 'profile', 'email'],
18
+ redirectUri: '<PLACEHOLDER_PROJECT_CALLBACK_URL>',
19
+ flow: 'authorisation-code-pkce',
20
+ providerKind: 'oidc',
21
+ providerLogout: 'redirect',
22
+ enabled: true
23
+ }
24
+ ```
25
+
26
+ Notes for the operator:
27
+ - Discovery is a single fetch at boot; the populator caches the result or writes the record verbatim onto the config module.
28
+ - `providerLogout: 'redirect'` is safe when `endSessionEndpoint` is present; if the discovery document omits it, drop `providerLogout` to `'none'` or the adapter refuses boot per AC-10108-3.
29
+ - `id` is a project-local stable slug the operator chooses; it appears in `principalId` derivations and in the `?provider=<id>` query parameter, so keep it short and lowercase.
30
+
31
+ Do NOT commit the real `clientSecret` in the record; read it from `security-secrets-management` (when composed) or the process environment at boot.
@@ -0,0 +1,31 @@
1
+ # GitHub (oauth2-only) provider record
2
+
3
+ A sample provider record shape for GitHub as an OAuth2-only provider. GitHub does not currently issue an id_token on the token exchange; the flow controller resolves identity through the `userinfoUrl` on this record. All fields are placeholders; the operator populates them from a project registered at the provider's console.
4
+
5
+ ```
6
+ {
7
+ id: 'github',
8
+ label: 'Sign in with GitHub',
9
+ authorizeUrl: 'https://github.com/login/oauth/authorize',
10
+ tokenUrl: 'https://github.com/login/oauth/access_token',
11
+ userinfoUrl: 'https://api.github.com/user',
12
+ issuer: null,
13
+ jwksUri: null,
14
+ clientId: '<PLACEHOLDER_GITHUB_CLIENT_ID>',
15
+ clientSecret: '<PLACEHOLDER_GITHUB_CLIENT_SECRET>',
16
+ scopes: ['read:user', 'user:email'],
17
+ redirectUri: '<PLACEHOLDER_PROJECT_CALLBACK_URL>',
18
+ flow: 'authorisation-code-pkce',
19
+ providerKind: 'oauth2-only',
20
+ endSessionEndpoint: null,
21
+ providerLogout: 'none',
22
+ enabled: true
23
+ }
24
+ ```
25
+
26
+ Notes for the operator:
27
+ - `providerKind: 'oauth2-only'` means the flow controller does not attempt id_token verification for this provider; identity is resolved through the userinfo endpoint. That is the correct posture for GitHub at v1.
28
+ - `issuer` and `jwksUri` are null because GitHub does not publish OIDC discovery. If GitHub adds OIDC support in the future the record migrates to `providerKind: 'oidc'` with the two fields populated; the flow controller's behaviour changes automatically.
29
+ - The scopes list is the minimum for identity plus verified email; a project that reaches for repository APIs adds scopes here.
30
+
31
+ Do NOT commit the real `clientSecret` in the record; read it from `security-secrets-management` (when composed) or the process environment at boot.
@@ -0,0 +1,31 @@
1
+ # Google (OIDC) provider record
2
+
3
+ A sample provider record shape for Google as an OIDC provider. All fields are placeholders; the operator populates them from a project registered at the provider's console.
4
+
5
+ ```
6
+ {
7
+ id: 'google',
8
+ label: 'Sign in with Google',
9
+ authorizeUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
10
+ tokenUrl: 'https://oauth2.googleapis.com/token',
11
+ userinfoUrl: 'https://openidconnect.googleapis.com/v1/userinfo',
12
+ issuer: 'https://accounts.google.com',
13
+ jwksUri: 'https://www.googleapis.com/oauth2/v3/certs',
14
+ clientId: '<PLACEHOLDER_GOOGLE_CLIENT_ID>',
15
+ clientSecret: '<PLACEHOLDER_GOOGLE_CLIENT_SECRET>',
16
+ scopes: ['openid', 'profile', 'email'],
17
+ redirectUri: '<PLACEHOLDER_PROJECT_CALLBACK_URL>',
18
+ flow: 'authorisation-code-pkce',
19
+ providerKind: 'oidc',
20
+ endSessionEndpoint: null,
21
+ providerLogout: 'none',
22
+ enabled: true
23
+ }
24
+ ```
25
+
26
+ Notes for the operator:
27
+ - The `clientId` and `clientSecret` come from a project registered at the provider's console; the redirect URI must match one of the registered URIs for the project or the token exchange refuses.
28
+ - `endSessionEndpoint` is null because Google does not currently expose an RP-initiated logout endpoint; leaving `providerLogout: 'none'` clears only the project session on sign-out. A project that wants a full downstream logout drives the operator to the provider's account page.
29
+ - The scopes list is the minimum for identity; a project reaching for additional Google APIs adds scopes here and the token exchange returns access tokens scoped to what was granted.
30
+
31
+ Do NOT commit the real `clientSecret` in the record; read it from `security-secrets-management` (when composed) or the process environment at boot.
@@ -0,0 +1,59 @@
1
+ # Session-bridge: opaque-handle session-record shape
2
+
3
+ Record-only reference for the shape TAC-1103's session-bridge issues and reads. Not production code; a project authors its own persistence-backed implementation against this shape (or points at an in-memory store for the reference wiring).
4
+
5
+ ## Session record
6
+
7
+ ```
8
+ {
9
+ handle: '<random-192-bit-opaque-string>',
10
+ principal: {
11
+ principalId: '<provider.id>:<sub-or-userinfo-id>',
12
+ provider: '<provider.id>',
13
+ email: '<optional-email>',
14
+ roles: [],
15
+ organisationIds: []
16
+ },
17
+ providerId: '<provider.id>',
18
+ accessToken: '<opaque-provider-access-token>',
19
+ idToken: '<optional-signed-jwt-oidc-only>',
20
+ refreshToken: '<optional-opaque-provider-refresh-token>',
21
+ chainRoot: '<initial-handle-of-the-refresh-chain>',
22
+ issuedAt: 1700000000,
23
+ expiresAt: 1700028800
24
+ }
25
+ ```
26
+
27
+ ## Reduced Principal (attached to `request.auth`)
28
+
29
+ ```
30
+ {
31
+ principalId: 'google:117340098374012345678',
32
+ provider: 'google',
33
+ email: 'operator@example.invalid',
34
+ roles: [],
35
+ organisationIds: []
36
+ }
37
+ ```
38
+
39
+ Notes:
40
+ - The reduced Principal is the ONLY object downstream code reads from `request.auth`. Access tokens, id tokens, and refresh tokens live on the session record and never appear on `request.auth`.
41
+ - `principalId` includes the provider slug on purpose: a user signed in through two providers is two principals unless the project's `enrichPrincipal` hook says otherwise (identity merging is a project-level policy decision, not a mechanism decision).
42
+ - `chainRoot` is the initial session handle for a refresh chain; refresh-token rotation preserves the same chainRoot so reuse detection can revoke every session that shares the chain in one call.
43
+ - `roles` and `organisationIds` are empty arrays by default; a project's `enrichPrincipal` hook populates them from project-side sources.
44
+
45
+ ## Cookie header shape (issued on callback)
46
+
47
+ ```
48
+ Set-Cookie: <sessionCookieName>=<handle>; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=<sessionExpirySeconds>
49
+ ```
50
+
51
+ The `<sessionCookieName>` is a project config value (default `app_session`); the `<handle>` is the session record's `handle` field; `<sessionExpirySeconds>` is the project config value (default 28800, 8 hours). The cookie value is neither the access token, the id_token, nor a refresh token.
52
+
53
+ ## Cookie header shape (issued on sign-out)
54
+
55
+ ```
56
+ Set-Cookie: <sessionCookieName>=; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=0
57
+ ```
58
+
59
+ Setting `Max-Age=0` on the same-named cookie with the same `Path` clears it in the browser; the session-record store deletes the record in the same request; a subsequent replay of the pre-signout cookie is unauthenticated.
@@ -0,0 +1,44 @@
1
+ {
2
+ "slug": "security-auth-oauth2",
3
+ "version": "1.0.0",
4
+ "category": "security",
5
+ "contributions": [
6
+ { "id": "security-auth-oauth2-REQ-001", "kind": "req", "path": "requirements/security-auth-oauth2-req-001.json" },
7
+ { "id": "security-auth-oauth2-REQ-002", "kind": "req", "path": "requirements/security-auth-oauth2-req-002.json" },
8
+ { "id": "security-auth-oauth2-REQ-003", "kind": "req", "path": "requirements/security-auth-oauth2-req-003.json" },
9
+ { "id": "security-auth-oauth2-REQ-004", "kind": "req", "path": "requirements/security-auth-oauth2-req-004.json" },
10
+ { "id": "security-auth-oauth2-REQ-005", "kind": "req", "path": "requirements/security-auth-oauth2-req-005.json" },
11
+ { "id": "security-auth-oauth2-REQ-006", "kind": "req", "path": "requirements/security-auth-oauth2-req-006.json" },
12
+ { "id": "security-auth-oauth2-REQ-007", "kind": "req", "path": "requirements/security-auth-oauth2-req-007.json" },
13
+ { "id": "security-auth-oauth2-REQ-008", "kind": "req", "path": "requirements/security-auth-oauth2-req-008.json" },
14
+ { "id": "security-auth-oauth2-REQ-009", "kind": "req", "path": "requirements/security-auth-oauth2-req-009.json" },
15
+ { "id": "security-auth-oauth2-REQ-010", "kind": "req", "path": "requirements/security-auth-oauth2-req-010.json" },
16
+ { "id": "security-auth-oauth2-US-10101", "kind": "us", "path": "user-stories/security-auth-oauth2-us-10101.json" },
17
+ { "id": "security-auth-oauth2-US-10102", "kind": "us", "path": "user-stories/security-auth-oauth2-us-10102.json" },
18
+ { "id": "security-auth-oauth2-US-10103", "kind": "us", "path": "user-stories/security-auth-oauth2-us-10103.json" },
19
+ { "id": "security-auth-oauth2-US-10104", "kind": "us", "path": "user-stories/security-auth-oauth2-us-10104.json" },
20
+ { "id": "security-auth-oauth2-US-10105", "kind": "us", "path": "user-stories/security-auth-oauth2-us-10105.json" },
21
+ { "id": "security-auth-oauth2-US-10106", "kind": "us", "path": "user-stories/security-auth-oauth2-us-10106.json" },
22
+ { "id": "security-auth-oauth2-US-10107", "kind": "us", "path": "user-stories/security-auth-oauth2-us-10107.json" },
23
+ { "id": "security-auth-oauth2-US-10108", "kind": "us", "path": "user-stories/security-auth-oauth2-us-10108.json" },
24
+ { "id": "security-auth-oauth2-US-10109", "kind": "us", "path": "user-stories/security-auth-oauth2-us-10109.json" },
25
+ { "id": "security-auth-oauth2-US-10110", "kind": "us", "path": "user-stories/security-auth-oauth2-us-10110.json" },
26
+ { "id": "security-auth-oauth2-US-10111", "kind": "us", "path": "user-stories/security-auth-oauth2-us-10111.json" },
27
+ { "id": "TAC-1101-security-auth-oauth2-flow-controller", "kind": "tac", "path": "tacs/tac-1101-security-auth-oauth2-flow-controller.json" },
28
+ { "id": "TAC-1102-security-auth-oauth2-provider-adapter", "kind": "tac", "path": "tacs/tac-1102-security-auth-oauth2-provider-adapter.json" },
29
+ { "id": "TAC-1103-security-auth-oauth2-session-bridge", "kind": "tac", "path": "tacs/tac-1103-security-auth-oauth2-session-bridge.json" },
30
+ { "id": "TAC-1104-security-auth-oauth2-provider-selector", "kind": "tac", "path": "tacs/tac-1104-security-auth-oauth2-provider-selector.json" },
31
+ {
32
+ "id": "ADR-1101-security-auth-oauth2-auth-model",
33
+ "kind": "adr",
34
+ "path": "adrs/adr-1101-security-auth-oauth2-auth-model.json",
35
+ "scope": "global",
36
+ "topic": "authModel"
37
+ },
38
+ { "id": "ADR-1102-security-auth-oauth2-provider-abstraction-contract", "kind": "adr", "path": "adrs/adr-1102-security-auth-oauth2-provider-abstraction-contract.json" },
39
+ { "id": "ADR-1103-security-auth-oauth2-pkce-discipline", "kind": "adr", "path": "adrs/adr-1103-security-auth-oauth2-pkce-discipline.json" },
40
+ { "id": "ADR-1104-security-auth-oauth2-session-bridge-shape", "kind": "adr", "path": "adrs/adr-1104-security-auth-oauth2-session-bridge-shape.json" },
41
+ { "id": "ADR-1105-security-auth-oauth2-refresh-token-posture", "kind": "adr", "path": "adrs/adr-1105-security-auth-oauth2-refresh-token-posture.json" },
42
+ { "id": "ADR-1106-security-auth-oauth2-multi-provider-routing", "kind": "adr", "path": "adrs/adr-1106-security-auth-oauth2-multi-provider-routing.json" }
43
+ ]
44
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "adrId": "ADR-1101-security-auth-oauth2-auth-model",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "OAuth2 authorisation-code with PKCE against a pluggable external IdP 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-oauth2 blueprint contributes a vendor-neutral shape of that model: identity, sign-in UX, credential storage, MFA, and account recovery live at an external IdP the project selects (Google, GitHub, Microsoft, Okta, Auth0, a corporate ADFS-fronted OIDC, a self-hosted node-oidc-provider); the project owns the flow controller, the provider-adapter seam, the session-bridge, and the sign-in UX composition. 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-clerk, 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 delegated identity via OAuth2 authorisation-code flow (RFC 6749 section 4.1) hardened with PKCE (RFC 7636, S256). Identity is proven by a completed round-trip against a project-configured IdP whose declaration satisfies the provider-abstraction contract (REQ-002). The wire credential the browser holds is a project-issued opaque-handle session cookie (`Secure`, `HttpOnly`, `SameSite=Lax`) whose value is neither the provider's access token, the id_token, nor a refresh token; provider tokens are stored server-side on the session record and never round-trip through the browser. For OIDC-declared providers the id_token is verified against the provider's JWKS on every callback (REQ-005). Refresh tokens rotate on every exchange with reuse detection (REQ-007). Sign-out invalidates the project session server-side; provider-side sign-out is an operator-declared option (REQ-008). Multi-provider composition is supported and expressed at the query-parameter layer (REQ-009). Runtime-verify binds the state machine and the identity-lift against a project-authored mock OIDC provider; live-vendor smokes are accountBound (REQ-010).",
10
+ "consequences": "The project owns the flow controller, the provider adapter, the session-bridge, and (optionally) the provider selector; the external IdP owns everything else on the identity surface. IdP swap is a provider-record write plus a JWKS-and-endpoint refresh; the flow controller and the session-bridge do not change. Composing with another auth-family blueprint (magic-link, Clerk, 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 mock-OIDC-provider runtime-verify posture keeps CI honest without demanding live-vendor credentials in every environment; a project that has live-vendor credentials wires them on top and the accountBound smokes light up. Every path that produces or consumes a session cookie flows through one narrow set of modules the ship gate compels.",
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 and are willing to own the principal registry, the email adapter, the rate-limiter, and the anti-enumeration posture. The trade against OAuth2 is running that whole surface in-house; a project that has a compelling reason to keep identity local (or that has no willing external IdP) takes that trade. This blueprint occupies the other end: identity is delegated, the local surface is small."
16
+ },
17
+ {
18
+ "name": "Hosted identity vendor with vendor-committed shape (Clerk)",
19
+ "summary": "The security-auth-clerk blueprint's model: Clerk hosts the sign-in surface, the credential storage, MFA, account recovery; the project runs a middleware boundary against Clerk's session-verification API.",
20
+ "reasonNotChosen": "Valid for projects that want the hosted-identity fast lane and are willing to commit to one vendor. The trade against OAuth2-generic is that Clerk (or the equivalent) does more of the work at the cost of a vendor commitment; OAuth2-generic keeps the mechanism vendor-neutral and asks the project to run the flow controller and the session-bridge. Projects that want the hosted lane take the sibling blueprint; projects that need vendor neutrality take this one."
21
+ },
22
+ {
23
+ "name": "Self-hosted OIDC via Keycloak with vendor-committed shape",
24
+ "summary": "The forthcoming security-auth-keycloak blueprint's model: run a Keycloak instance, federate through the OIDC authorization-code flow, wire the middleware boundary against Keycloak's realm.",
25
+ "reasonNotChosen": "Valid for projects with existing ops capacity and a hard multi-tenant IdP requirement. The trade is running the Keycloak container plus a realm configuration; small rcf-lite projects rarely need it day one. A Keycloak project on this blueprint's contract is one provider record; a Keycloak project on the vendor-committed blueprint is a richer opinion on the realm surface. The choice belongs to the project's ops posture."
26
+ },
27
+ {
28
+ "name": "Direct social sign-in with one hard-coded provider (Google-only, GitHub-only)",
29
+ "summary": "Skip the provider abstraction and wire the flow directly against one vendor's URL surface.",
30
+ "reasonNotChosen": "Cheap on day one and expensive on day thirty when the project needs a second provider or an operator wants to swap. Every code path branches on the vendor's claim shape and the vendor's cookie names; the abstraction cost is paid over months of rework. This blueprint pays the abstraction cost up front."
31
+ }
32
+ ],
33
+ "createdAt": "2026-08-30T00:00:00Z",
34
+ "updatedAt": "2026-08-30T00:00:00Z"
35
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-1102-security-auth-oauth2-provider-abstraction-contract",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "The provider-abstraction contract is a fixed record shape, not a per-vendor code path",
8
+ "context": "A blueprint that spans N provider vendors either scales through an abstraction seam or drifts into per-vendor branches inside the state machine. The proposal that minted this blueprint (round-2 proposal, review outcomes) calls this out explicitly: the authoring effort is in getting the seam right; get it wrong and the blueprint becomes either over-generic (an empty interface no one can implement without inventing every field) or under-generic (a code path per vendor with `if provider.id === 'google'` branches inside the flow controller). Neither serves a project that wants to swap or compose providers.",
9
+ "decision": "The provider abstraction is a plain data record, not an object with methods. Every provider a project drops in declares `{ id, label, authorizeUrl, tokenUrl, userinfoUrl, issuer?, jwksUri?, clientId, clientSecret, scopes[], redirectUri, flow: 'authorisation-code-pkce', providerKind: 'oidc' | 'oauth2-only', endSessionEndpoint?, providerLogout?: 'redirect' | 'none' | absent, enabled?: boolean }`. The provider adapter (TAC-1102) validates every record at boot; the flow controller (TAC-1101) reads fields from the record on every step; nothing in the state machine branches on the provider's vendor name. Vendor-specific quirks that do not fit the record shape (Google's `hd` claim, GitHub's per-org enforcement, Microsoft's tenant scoping) are the responsibility of vendor-specific companion blueprints if demand arrives; the v1 contract is deliberately narrow.",
10
+ "consequences": "Adding a provider is a config-record write, not a code edit. A project may compose N providers on one deployment; the code path is identical for each. The trade is that vendor-specific claims (Google's `hd`, Microsoft's tenant `tid`) are inaccessible through the reduced Principal unless the project authors an `enrichPrincipal` hook; that is the intended posture. A vendor whose surface diverges from the record shape (an obscure IdP that omits the standard scopes-and-endpoints vocabulary) is a project-level ADR conversation, not a mechanism change here.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Object interface with methods (`buildAuthorizeUrl`, `exchangeCode`, `verifyIdToken`)",
14
+ "summary": "Every provider implements a class that overrides the interface.",
15
+ "reasonNotChosen": "Pushes the state machine into every provider; the flow controller becomes a passthrough. That inverts the intended locus of control: the state machine is the point of consistency, and putting per-provider code in the flow shape means every provider re-implements the invariants. The record shape puts consistency in one place."
16
+ },
17
+ {
18
+ "name": "Discovery-only (read RFC 8414 metadata at boot)",
19
+ "summary": "Read `/.well-known/oauth-authorization-server` per provider and let the discovery document declare the endpoints.",
20
+ "reasonNotChosen": "Fine for providers that publish discovery; useless for the ones that do not, and there are enough of both to matter. The record shape accepts a discovery-driven boot loader as an implementation choice on the project side: a project may fetch discovery at boot and populate the record; the mechanism above the record does not change."
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-1103-security-auth-oauth2-pkce-discipline",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "PKCE is mandatory on every authorisation-code exchange and the S256 method is the sole accepted challenge",
8
+ "context": "PKCE (RFC 7636) protects the authorisation-code flow against code interception. The mechanism defines two challenge methods: `plain` (the verifier is used as the challenge unchanged) and `S256` (the challenge is BASE64URL(SHA256(verifier))). `plain` erodes the protection to nil in the presence of any component that can observe the challenge on the wire; the specification recommends S256 for that reason. A blueprint that accepts `plain` when a provider offers it is a foot-gun in every environment where the front channel is not fully trusted.",
9
+ "decision": "Every authorisation redirect this blueprint mints declares `code_challenge_method=S256`. The flow controller refuses to construct a redirect without a challenge and refuses to accept a callback whose stored pending-flow does not carry a matching S256-derived challenge for the verifier the token exchange presents. A provider whose configuration would require `plain` (or that does not enforce PKCE binding at all) is a project-level ADR conversation, not a config-flag flip: the operator supersedes this ADR with a project-level ADR that accepts the erosion for their specific environment, or the operator picks a different provider.",
10
+ "consequences": "The state machine is single-branched on PKCE: mint verifier, derive S256 challenge, store verifier, present verifier on token exchange. The mechanism is stable across every provider that speaks the RFC correctly. A provider that refuses PKCE (or accepts `plain` and does not enforce the binding on the server side) is caught either at boot (when the record is misconfigured) or at operate time (when the token exchange fails); either way the failure is loud, not silent.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Accept `plain` when a provider declares only `plain` support",
14
+ "summary": "Match the provider's declared method to keep more providers usable.",
15
+ "reasonNotChosen": "Trades a documented security property for provider breadth. A provider that only supports `plain` is a provider whose security posture is worse than the blueprint's claimed floor; accepting them silently means the floor is a lie."
16
+ },
17
+ {
18
+ "name": "Make the challenge method a project-config flag",
19
+ "summary": "Let the operator declare the method per provider.",
20
+ "reasonNotChosen": "Turns a load-bearing security invariant into a config knob the operator can flip without a paper trail. A project-level ADR is the right shape for making the trade explicit."
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-1104-security-auth-oauth2-session-bridge-shape",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Provider tokens live server-side; the browser holds an opaque handle only",
8
+ "context": "The session-bridge chooses between two shapes that both work as sign-in ceremonies. The first: the browser holds an opaque server-issued handle, and provider tokens (access, id, refresh) live on a server-side record keyed by the handle. The second: the browser holds a JWT or a similar structured credential the provider issued, and the server re-verifies on every request. The rcf-lite tier this blueprint targets is small greenfield projects with one deployable and a session-record store that is either in-memory (for a scratch project) or a small table on a persistence blueprint (SQLite or D1). At that tier the opaque-handle shape reads simpler, hides the provider token graph from the browser, and makes sign-out a single delete against the server-side store.",
9
+ "decision": "The session-bridge issues an opaque-handle cookie; provider tokens (access, id, refresh) are stored on the server-side session record keyed by the handle. The cookie value is neither the access token, the id_token, nor a refresh token; nothing exposed on `request.auth` is a provider token; nothing rendered into the client tier is a provider token. The reduced Principal (`principalId`, `provider`, `email?`, `roles[]`, `organisationIds[]`) is the only claim shape downstream code sees. `principalId` is derived from `{provider.id, subject}` so a user signed in through two providers is two principals unless the project's `enrichPrincipal` hook declares otherwise.",
10
+ "consequences": "Sign-out is one delete; refresh-token reuse detection is one lookup; a compromised session record has server-side revocation as an option. The trade is a server-side store per session; that store is a project responsibility (in-memory in the reference wiring; a table on a composed persistence blueprint otherwise). A project whose deployable count grows beyond one and whose sessions must be shared across processes is naturally led to a persistence-backed session store; the composition path is clean because the session-bridge injects the store.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "JWT-in-cookie (browser holds a project-signed JWT)",
14
+ "summary": "The cookie value is a signed JWT the browser round-trips on every request; the session-bridge verifies signature and reads the claims.",
15
+ "reasonNotChosen": "Common at scale where a stateless server is a hard constraint; carries no server-side revocation without a companion revocation-list mechanism, and puts identity claims on a token the browser holds (a footprint an XSS can lift). The rcf-lite tier does not need the statelessness enough to pay those costs."
16
+ },
17
+ {
18
+ "name": "Provider access token as the cookie",
19
+ "summary": "The browser holds the provider's access token directly.",
20
+ "reasonNotChosen": "Leaks the vendor's token surface into every browser side-channel, ties revocation to the vendor's clock, and rules out multi-provider composition (a single cookie shape cannot represent N provider tokens at once)."
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-1105-security-auth-oauth2-refresh-token-posture",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Refresh tokens rotate on every exchange and revoke the chain on reuse detection",
8
+ "context": "Refresh tokens live longer than access tokens; the operational purpose is to keep a session alive without a re-sign-in when the short-lived access token expires. The failure mode this ADR addresses is refresh-token theft: an attacker who lifts a refresh token from anywhere it lives can hold identity indefinitely if the token is not rotated. The industry pattern (RFC 6749 section 10.4; the OAuth 2.0 Security BCP) is rotation-with-reuse-detection: every exchange returns a new refresh token, the previous value is discarded, and the same value seen twice revokes the whole chain.",
9
+ "decision": "The flow controller rotates refresh tokens on every exchange: the current stored value is replaced by the provider's newly-returned value; the previous value is discarded and not retained anywhere except transiently in the exchange call itself. Presenting the same refresh-token value a second time is a `refresh_token_reuse` signal: the flow controller invalidates the session handle, clears every stored refresh token that shares the chain root, and emits one structured audit event carrying the provider id, the session-handle hash, and the detection timestamp; no token value is emitted. A provider that does not issue refresh tokens is a supported posture: the session lives out its own project-lifetime and no refresh path is exercised.",
10
+ "consequences": "The trade against a bare posture is a small piece of chain-tracking state (which handles share a chain root) and the audit surface for reuse detection; the win is that a lifted refresh token is a bounded-window attack rather than an unbounded one. A provider that does not respect rotation (returns the same refresh-token value on consecutive exchanges) presents as reuse against this blueprint and revokes the chain; that is the correct posture and any provider that violates rotation is a project-level ADR conversation.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "No rotation (keep the same refresh token across exchanges)",
14
+ "summary": "The initial refresh token is used until the provider revokes it.",
15
+ "reasonNotChosen": "Loses the whole point of the reuse-detection defence. Simpler; strictly worse."
16
+ },
17
+ {
18
+ "name": "Rotate but do not revoke on reuse",
19
+ "summary": "Rotate on every exchange, but treat a reuse presentation as a benign error.",
20
+ "reasonNotChosen": "Half the defence: the rotation prevents indefinite re-use of a single lifted token, but the reuse signal is ignored. The BCP recommendation is to treat reuse as evidence of theft and revoke."
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-1106-security-auth-oauth2-multi-provider-routing",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "1.0.0",
6
+ "status": "accepted",
7
+ "title": "Multi-provider routing is expressed at the query-parameter layer, not through a hard-coded default",
8
+ "context": "A project configured with more than one provider needs a way to route a sign-in request to a specific provider. Three shapes exist: a hard-coded default provider (the first in the list), an explicit query parameter naming the provider, or a distinct sign-in URL per provider. The first is dangerous (an operator who reorders the list changes the sign-in behaviour without a code change); the third is verbose (N routes to declare and wire). The second is observable at the URL layer and refuses ambiguity.",
9
+ "decision": "On N>1 provider configurations, the flow controller requires an explicit `provider` query parameter on the sign-in route (`GET /auth/sign-in?provider=<id>`); a missing or unknown id is refused with a stable-coded response. On N==1 configurations, the sign-in route without a `provider` parameter short-circuits to the single configured provider; a `provider` parameter naming an id other than the single configured one is refused. The provider-selector TAC (TAC-1104) renders a list-of-providers page as an optional UX; a project may substitute a bespoke selector as long as it honours the query-parameter contract.",
10
+ "consequences": "The routing is legible from the URL alone: an operator inspecting a sign-in link knows which provider is being invoked. Adding a provider is a config-record write plus a link on whatever selector surface the project uses; the state machine does not change. The trade against a hard-coded default is a small piece of URL noise on multi-provider deployments; that noise is exactly the observability the URL was for.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Hard-coded default (first provider in the list)",
14
+ "summary": "A sign-in request without a `provider` parameter defaults to the first configured provider.",
15
+ "reasonNotChosen": "Changes behaviour on a list reorder without a code change; a project that removes a provider silently changes the sign-in flow. The routing loses observability."
16
+ },
17
+ {
18
+ "name": "Distinct sign-in URL per provider (`/auth/sign-in/google`, `/auth/sign-in/github`)",
19
+ "summary": "One route per configured provider.",
20
+ "reasonNotChosen": "Verbose (N routes), and the URL vocabulary leaks the provider id into every place the sign-in URL is referenced. The query-parameter shape keeps the base URL stable across configurations."
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-oauth2-REQ-001",
3
+ "prdId": "PRD-001",
4
+ "title": "Authorisation-code flow with PKCE is the sole delegated-identity flow",
5
+ "description": "The project's authentication model is delegated identity via OAuth2 authorisation-code flow (RFC 6749 section 4.1) hardened with Proof Key for Code Exchange (RFC 7636). The implicit flow, the resource-owner password credentials flow, and the client credentials flow are refused at the flow-controller boundary. The `response_type` on the authorisation request is fixed to `code`; the token exchange is a back-channel POST that presents the `code_verifier`. The mechanism is vendor-neutral: any provider that speaks authorisation-code + PKCE plugs in through the provider-abstraction contract; no provider name appears in the flow controller's code path.",
6
+ "category": "functional",
7
+ "domain": "authentication",
8
+ "priority": "must",
9
+ "rationale": "Two failure modes justify fixing the flow. First, the implicit flow returns tokens on the front channel and cannot be hardened against interception or replay in a single-page application; browsers and IdPs have deprecated it. Second, a provider-shape choice that lets one project run authorisation-code and another run implicit forks the composition surface and forces every downstream TAC (session bridge, refresh discipline, sign-out) to reason about both. Fixing the flow at the blueprint layer keeps the flow-controller state machine linear and the provider adapter surface small.",
10
+ "tags": [
11
+ "blueprint:security-auth-oauth2",
12
+ "category:01-flow-shape"
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-oauth2-REQ-002",
3
+ "prdId": "PRD-001",
4
+ "title": "One provider-abstraction contract fixes what a plug-in provider must declare",
5
+ "description": "Every provider a project drops in is a plain data record on a fixed shape: `id` (project-local stable slug), `label` (operator-visible name), `authorizeUrl`, `tokenUrl`, `userinfoUrl`, `issuer` (OIDC), `jwksUri` (OIDC), `clientId`, `clientSecret` (server-only; the record on the client tier carries a redacted placeholder), `scopes[]`, `redirectUri`, `flow` (fixed to `authorisation-code-pkce` at v1), `providerKind` (`oidc` or `oauth2-only`). A provider whose declaration is missing a required field, or declares `providerKind: oidc` but omits `issuer` or `jwksUri`, is refused at boot with a stable-coded error naming the provider `id` and the missing field. No project code path reasons against the provider's vendor name; every reasoning path reasons against the record's fields.",
6
+ "category": "functional",
7
+ "domain": "authentication",
8
+ "priority": "must",
9
+ "rationale": "A provider abstraction that scales beyond two vendors names the shape the code depends on, not the vendors that satisfy it. If the code path branches on `provider.id === 'google'` the mechanism has already lost the promise this blueprint makes. A field-record contract lets the flow controller and the session bridge stay one implementation across every provider a project ever wires; adding a provider is a config-record write, not a code edit. Field-level fail-fast on boot is the mechanism that catches misconfigured records before they surface as a signed-in user whose profile turns out to be blank.",
10
+ "tags": [
11
+ "blueprint:security-auth-oauth2",
12
+ "category:02-provider-contract"
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-oauth2-REQ-003",
3
+ "prdId": "PRD-001",
4
+ "title": "CSRF on the authorisation redirect is defended with an unguessable state parameter",
5
+ "description": "Every authorisation redirect the flow controller mints carries a `state` parameter. The value is a cryptographically random 128-bit-or-more opaque string generated per request; the controller binds `state` to the pending flow record (provider id, code_verifier, nonce, requested redirect target, minted-at timestamp) and stores that record in an integrity-checked one-time server-side pending-flow store keyed by `state`. On callback, the controller looks up the pending flow by the returned `state`, refuses the callback if the lookup misses or the record has already been consumed, and deletes the record after a single successful consumption. A stored pending flow older than a configured `pendingFlowTtlSeconds` (default 600) is treated as absent. The `state` value is never logged, never exposed in a client-tier document, and never rendered into an error page.",
6
+ "category": "functional",
7
+ "domain": "security",
8
+ "priority": "must",
9
+ "rationale": "Without a bound `state` the authorisation callback endpoint is an unauthenticated request the browser can be tricked into invoking with an attacker-controlled `code`, and the session-issue seam is a CSRF-shaped identity forgery. Binding the flow record on the server side (rather than storing state in a cookie the browser echoes back) also carries the PKCE verifier off the client tier for the duration of the flow, which removes a category of storage-side leaks the client tier can suffer. The one-time consumption plus TTL defends against replay of a captured state value.",
10
+ "tags": [
11
+ "blueprint:security-auth-oauth2",
12
+ "category:03-csrf"
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-oauth2-REQ-004",
3
+ "prdId": "PRD-001",
4
+ "title": "PKCE with the S256 challenge method is mandatory on every authorisation-code exchange",
5
+ "description": "Every authorisation redirect includes `code_challenge` derived from a cryptographically random 43-to-128-character `code_verifier` by BASE64URL(SHA256(verifier)), and `code_challenge_method=S256`. The `plain` challenge method is not accepted. The `code_verifier` is stored server-side on the pending-flow record keyed by `state`; it is never sent on the front channel and is never rendered into the client tier. The token exchange POST carries the `code_verifier` verbatim; the flow controller refuses to construct a token-exchange request that does not carry a matching verifier for the pending flow, and refuses to consume a token-exchange response for a `state` whose stored verifier does not match. A provider that refuses the S256 challenge method or that does not appear to enforce PKCE binding at all is a project-level ADR conversation, not a config-flag flip.",
6
+ "category": "functional",
7
+ "domain": "security",
8
+ "priority": "must",
9
+ "rationale": "The authorisation-code flow without PKCE lets an attacker who intercepts an authorisation code (through a compromised redirect handler, a shared browser environment, or an intermediary proxy) redeem it at the token endpoint without further evidence of possession. PKCE binds the code to a verifier the requester holds; without the verifier the code is unspendable. Mandating S256 excludes the `plain` method that a mis-implemented provider might otherwise accept and that erodes the guarantee to nil.",
10
+ "tags": [
11
+ "blueprint:security-auth-oauth2",
12
+ "category:04-pkce"
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-oauth2-REQ-005",
3
+ "prdId": "PRD-001",
4
+ "title": "OIDC identity is verified through the id_token when the provider declares OIDC",
5
+ "description": "When a provider's declaration carries `providerKind: oidc`, the token-exchange response is expected to carry an `id_token` (a signed JWT). The flow controller verifies the id_token against the provider's `jwksUri` before any downstream consumption: signature validation with a key resolved from JWKS by the token's `kid`, `iss` equality against the provider's `issuer`, `aud` containment of the provider's `clientId`, `exp` in the future by at least one second, `iat` in the past by no more than `idTokenMaxAgeSeconds` (default 3600), and `nonce` equality against the value the flow controller minted onto the authorisation redirect and stored on the pending flow. A missing id_token when the provider declared OIDC is a refuse-fast: the flow terminates with `OAUTH2_MISSING_ID_TOKEN` and no session is issued. A provider declared as `providerKind: oauth2-only` bypasses id_token verification and relies on the userinfo endpoint's response for identity, per REQ-006.",
6
+ "category": "functional",
7
+ "domain": "security",
8
+ "priority": "must",
9
+ "rationale": "A provider that speaks OIDC lets the flow controller verify identity claims signed by the provider without a network hop after the token exchange; the id_token is the cheapest, strongest identity signal available. A refuse-fast when a declared-OIDC provider omits the id_token catches misconfiguration (a client that requested only OAuth2 scopes, a provider whose `scope=openid` was omitted) that would otherwise silently fall back to userinfo and lose the JWT audit trail. A separate posture for `oauth2-only` providers keeps the mechanism usable against providers (GitHub is the canonical example) whose surface does not include id_token.",
10
+ "tags": [
11
+ "blueprint:security-auth-oauth2",
12
+ "category:05-id-token"
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-oauth2-REQ-006",
3
+ "prdId": "PRD-001",
4
+ "title": "Session issue after code exchange goes through one bridge",
5
+ "description": "After a successful token exchange (and id_token verification for OIDC providers), the flow controller passes the resolved identity to the session-bridge (TAC-1103). The bridge translates the provider identity into a reduced `Principal` shape: `principalId` (a stable in-process id derived from the provider's `sub` claim under an OIDC provider, or the provider's userinfo `id` field under an `oauth2-only` provider, joined to the provider's `id` slug so two providers cannot collide on the same underlying sub), `provider` (the provider `id`), `email` (if the provider returned one), `roles` (an empty array by default; a project-authored bridge extension may enrich), `organisationIds` (empty by default; project-authored bridge extension may enrich). The bridge then issues a project session (opaque-handle cookie is the reference shape; the storage seam is delegated). No downstream code path reasons about the provider's raw claim shape, provider tokens, or refresh material; only the reduced `Principal` and the session handle cross the bridge outward.",
6
+ "category": "functional",
7
+ "domain": "authentication",
8
+ "priority": "must",
9
+ "rationale": "A single reduction point stops the provider's claim vocabulary from leaking through the codebase. If handlers reach for `req.auth.claims.email_verified` today the codebase depends on the provider's schema forever, and the provider-swap promise this blueprint makes collapses. Deriving `principalId` from `{provider.id, subject}` also makes multi-provider composition safe: a user who signs in through Google and later through the same email at GitHub is TWO distinct principals until the project authors an explicit identity-merge policy; the blueprint refuses to accidentally merge them.",
10
+ "tags": [
11
+ "blueprint:security-auth-oauth2",
12
+ "category:06-session-bridge"
13
+ ],
14
+ "version": "1.0.0",
15
+ "status": "approved",
16
+ "createdAt": "2026-08-30T00:00:00Z",
17
+ "updatedAt": "2026-08-30T00:00:00Z"
18
+ }