rcf-lite 0.24.0 → 0.26.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 (313) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/blueprints/application-account-settings/docs/topics.md +4 -1
  3. package/blueprints/application-admin-console/docs/topics.md +4 -1
  4. package/blueprints/application-api-rest/docs/topics.md +4 -1
  5. package/blueprints/application-charts/docs/topics.md +4 -1
  6. package/blueprints/application-dashboard/docs/topics.md +4 -1
  7. package/blueprints/application-datatable/docs/topics.md +4 -1
  8. package/blueprints/application-empty-error-states/docs/topics.md +4 -1
  9. package/blueprints/application-error-handling/docs/topics.md +4 -1
  10. package/blueprints/application-file-upload/docs/topics.md +4 -1
  11. package/blueprints/application-forms-wizard/docs/topics.md +4 -1
  12. package/blueprints/application-notifications-in-app/docs/topics.md +4 -1
  13. package/blueprints/application-onboarding-tour/docs/topics.md +4 -1
  14. package/blueprints/application-spa/docs/topics.md +4 -1
  15. package/blueprints/delivery-ci-workflows/docs/topics.md +4 -1
  16. package/blueprints/deploy-cloudflare-workers/docs/topics.md +4 -1
  17. package/blueprints/deploy-hetzner-server/CHANGELOG.md +55 -0
  18. package/blueprints/deploy-hetzner-server/README.md +202 -0
  19. package/blueprints/deploy-hetzner-server/blueprint.json +233 -0
  20. package/blueprints/deploy-hetzner-server/contributions/adrs/adr-3801-deploy-hetzner-server-cloud-host-contract.json +14 -0
  21. package/blueprints/deploy-hetzner-server/contributions/adrs/adr-3802-deploy-hetzner-server-snapshot-cadence.json +14 -0
  22. package/blueprints/deploy-hetzner-server/contributions/adrs/adr-3803-deploy-hetzner-server-provisioning-tool.json +20 -0
  23. package/blueprints/deploy-hetzner-server/contributions/adrs/adr-3804-deploy-hetzner-server-hardening-baseline.json +14 -0
  24. package/blueprints/deploy-hetzner-server/contributions/probes/cloud-init-render-lint.mjs +71 -0
  25. package/blueprints/deploy-hetzner-server/contributions/probes/hcloud-dry-run-mock.mjs +164 -0
  26. package/blueprints/deploy-hetzner-server/contributions/probes/manifest-schema-validate.mjs +182 -0
  27. package/blueprints/deploy-hetzner-server/contributions/probes/probe-utils.mjs +112 -0
  28. package/blueprints/deploy-hetzner-server/contributions/probes/real-account-cloud-init-hardened.mjs +64 -0
  29. package/blueprints/deploy-hetzner-server/contributions/probes/real-account-snapshot-on-demand.mjs +60 -0
  30. package/blueprints/deploy-hetzner-server/contributions/probes/real-account-throwaway-server-provision.mjs +58 -0
  31. package/blueprints/deploy-hetzner-server/contributions/probes/run-cloud-init-render-lint.mjs +9 -0
  32. package/blueprints/deploy-hetzner-server/contributions/probes/run-hcloud-dry-run-mock.mjs +9 -0
  33. package/blueprints/deploy-hetzner-server/contributions/probes/run-manifest-schema-validate.mjs +9 -0
  34. package/blueprints/deploy-hetzner-server/contributions/probes/run-real-account-cloud-init-hardened.mjs +9 -0
  35. package/blueprints/deploy-hetzner-server/contributions/probes/run-real-account-snapshot-on-demand.mjs +9 -0
  36. package/blueprints/deploy-hetzner-server/contributions/probes/run-real-account-throwaway-server-provision.mjs +9 -0
  37. package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-001.json +18 -0
  38. package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-002.json +18 -0
  39. package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-003.json +18 -0
  40. package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-004.json +18 -0
  41. package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-005.json +18 -0
  42. package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-006.json +18 -0
  43. package/blueprints/deploy-hetzner-server/contributions/schemas/hetzner-server.schema.json +108 -0
  44. package/blueprints/deploy-hetzner-server/contributions/tacs/tac-3801-deploy-hetzner-server-provisioner.json +27 -0
  45. package/blueprints/deploy-hetzner-server/contributions/tacs/tac-3802-deploy-hetzner-server-manifest-schema.json +26 -0
  46. package/blueprints/deploy-hetzner-server/contributions/tacs/tac-3803-deploy-hetzner-server-cloud-init-template.json +26 -0
  47. package/blueprints/deploy-hetzner-server/contributions/tacs/tac-3804-deploy-hetzner-server-firewall-shape.json +25 -0
  48. package/blueprints/deploy-hetzner-server/contributions/templates/cloud-init.yaml.tmpl +113 -0
  49. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37101.json +24 -0
  50. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37102.json +24 -0
  51. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37103.json +25 -0
  52. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37104.json +24 -0
  53. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37105.json +24 -0
  54. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37106.json +25 -0
  55. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37107.json +24 -0
  56. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37108.json +24 -0
  57. package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37109.json +24 -0
  58. package/blueprints/deploy-hetzner-server/docs/topics.md +48 -0
  59. package/blueprints/deploy-hetzner-server/guide/deploy-hetzner-server.md +180 -0
  60. package/blueprints/edge-cloudflare-access/docs/topics.md +4 -1
  61. package/blueprints/edge-cloudflare-rate-limiting/docs/topics.md +4 -1
  62. package/blueprints/edge-cloudflare-tunnel/CHANGELOG.md +23 -0
  63. package/blueprints/edge-cloudflare-tunnel/README.md +257 -0
  64. package/blueprints/edge-cloudflare-tunnel/blueprint.json +168 -0
  65. package/blueprints/edge-cloudflare-tunnel/contributions/adrs/adr-4001-edge-cloudflare-tunnel-ingress-bridge-contract.json +23 -0
  66. package/blueprints/edge-cloudflare-tunnel/contributions/adrs/adr-4002-edge-cloudflare-tunnel-connector-runtime.json +19 -0
  67. package/blueprints/edge-cloudflare-tunnel/contributions/adrs/adr-4003-edge-cloudflare-tunnel-hostname-mode.json +19 -0
  68. package/blueprints/edge-cloudflare-tunnel/contributions/probes/aud-presence-check.mjs +114 -0
  69. package/blueprints/edge-cloudflare-tunnel/contributions/probes/cloudflared-config-lint.mjs +80 -0
  70. package/blueprints/edge-cloudflare-tunnel/contributions/probes/manifest-schema-validate.mjs +237 -0
  71. package/blueprints/edge-cloudflare-tunnel/contributions/probes/probe-utils.mjs +231 -0
  72. package/blueprints/edge-cloudflare-tunnel/contributions/probes/real-account-connector-healthy.mjs +143 -0
  73. package/blueprints/edge-cloudflare-tunnel/contributions/probes/real-account-tunnel-hostname-routes.mjs +166 -0
  74. package/blueprints/edge-cloudflare-tunnel/contributions/probes/run-aud-presence-check.mjs +4 -0
  75. package/blueprints/edge-cloudflare-tunnel/contributions/probes/run-cloudflared-config-lint.mjs +4 -0
  76. package/blueprints/edge-cloudflare-tunnel/contributions/probes/run-manifest-schema-validate.mjs +4 -0
  77. package/blueprints/edge-cloudflare-tunnel/contributions/probes/run-real-account-connector-healthy.mjs +4 -0
  78. package/blueprints/edge-cloudflare-tunnel/contributions/probes/run-real-account-tunnel-hostname-routes.mjs +4 -0
  79. package/blueprints/edge-cloudflare-tunnel/contributions/probes/tunnel-manifest.schema.json +55 -0
  80. package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-001.json +18 -0
  81. package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-002.json +18 -0
  82. package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-003.json +18 -0
  83. package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-004.json +18 -0
  84. package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-005.json +18 -0
  85. package/blueprints/edge-cloudflare-tunnel/contributions/tacs/tac-4001-edge-cloudflare-tunnel-connector-shape.json +26 -0
  86. package/blueprints/edge-cloudflare-tunnel/contributions/tacs/tac-4002-edge-cloudflare-tunnel-manifest-schema.json +26 -0
  87. package/blueprints/edge-cloudflare-tunnel/contributions/tacs/tac-4003-edge-cloudflare-tunnel-access-binding.json +25 -0
  88. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39101.json +24 -0
  89. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39102.json +24 -0
  90. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39103.json +24 -0
  91. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39104.json +24 -0
  92. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39105.json +24 -0
  93. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39106.json +24 -0
  94. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39107.json +24 -0
  95. package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39108.json +24 -0
  96. package/blueprints/edge-cloudflare-tunnel/docs/topics.md +72 -0
  97. package/blueprints/edge-cloudflare-tunnel/guide/edge-cloudflare-tunnel.md +204 -0
  98. package/blueprints/edge-cloudflare-turnstile/docs/topics.md +4 -1
  99. package/blueprints/email-smtp-resend/docs/topics.md +4 -1
  100. package/blueprints/jobs-background/docs/topics.md +4 -1
  101. package/blueprints/messaging-queue-cloudflare/CHANGELOG.md +19 -0
  102. package/blueprints/messaging-queue-cloudflare/README.md +2 -2
  103. package/blueprints/messaging-queue-cloudflare/blueprint.json +1 -1
  104. package/blueprints/messaging-queue-cloudflare/contributions/probes/real-account-concurrency-smoke.mjs +192 -37
  105. package/blueprints/messaging-queue-cloudflare/docs/topics.md +4 -1
  106. package/blueprints/object-storage-s3/CHANGELOG.md +11 -0
  107. package/blueprints/object-storage-s3/README.md +14 -1
  108. package/blueprints/object-storage-s3/blueprint.json +12 -1
  109. package/blueprints/object-storage-s3/contributions/adrs/adr-2905-object-storage-s3-hetzner-object-storage-provider.json +30 -0
  110. package/blueprints/object-storage-s3/contributions/probes/hetzner-object-storage-round-trip.mjs +136 -0
  111. package/blueprints/object-storage-s3/contributions/probes/run-hetzner-object-storage-round-trip.mjs +11 -0
  112. package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-101.json +18 -0
  113. package/blueprints/object-storage-s3/contributions/tacs/tac-2904-object-storage-s3-hetzner-endpoint-helper.json +34 -0
  114. package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28110.json +25 -0
  115. package/blueprints/object-storage-s3/docs/topics.md +4 -1
  116. package/blueprints/object-storage-s3/guide/object-storage-s3.md +36 -0
  117. package/blueprints/observability-essentials/docs/topics.md +4 -1
  118. package/blueprints/observability-logging/docs/topics.md +4 -1
  119. package/blueprints/observability-probe-endpoints/docs/topics.md +4 -1
  120. package/blueprints/persistence-data-d1/docs/topics.md +4 -1
  121. package/blueprints/persistence-data-postgres/docs/topics.md +4 -1
  122. package/blueprints/persistence-data-sqlite/docs/topics.md +4 -1
  123. package/blueprints/platform-cloudflare-cron-triggers/docs/topics.md +4 -1
  124. package/blueprints/platform-cloudflare-durable-objects/CHANGELOG.md +15 -0
  125. package/blueprints/platform-cloudflare-durable-objects/blueprint.json +1 -1
  126. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/namespace-facade-ready.mjs +3 -3
  127. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/probe-utils.mjs +28 -14
  128. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/real-account-storage-smoke.mjs +132 -26
  129. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/sole-reader-scan.mjs +40 -39
  130. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/storage-round-trip.mjs +26 -16
  131. package/blueprints/platform-cloudflare-durable-objects/contributions/probes/websocket-hub-broadcast.mjs +31 -34
  132. package/blueprints/platform-cloudflare-durable-objects/docs/topics.md +4 -1
  133. package/blueprints/platform-cloudflare-kv/CHANGELOG.md +40 -1
  134. package/blueprints/platform-cloudflare-kv/README.md +41 -13
  135. package/blueprints/platform-cloudflare-kv/blueprint.json +1 -1
  136. package/blueprints/platform-cloudflare-kv/contributions/probes/cache-aside-hit-then-miss.mjs +26 -26
  137. package/blueprints/platform-cloudflare-kv/contributions/probes/event-secrecy.mjs +49 -31
  138. package/blueprints/platform-cloudflare-kv/contributions/probes/facade-round-trip.mjs +58 -16
  139. package/blueprints/platform-cloudflare-kv/contributions/probes/list-with-prefix.mjs +6 -5
  140. package/blueprints/platform-cloudflare-kv/contributions/probes/real-account-eventual-consistency-smoke.mjs +131 -67
  141. package/blueprints/platform-cloudflare-kv/docs/topics.md +4 -1
  142. package/blueprints/platform-docker-compose-host/CHANGELOG.md +12 -0
  143. package/blueprints/platform-docker-compose-host/README.md +76 -0
  144. package/blueprints/platform-docker-compose-host/blueprint.json +209 -0
  145. package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3901-platform-docker-compose-host-contract.json +14 -0
  146. package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3902-platform-docker-compose-host-reverse-proxy.json +14 -0
  147. package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3903-platform-docker-compose-host-reject-coolify.json +14 -0
  148. package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3904-platform-docker-compose-host-log-driver.json +14 -0
  149. package/blueprints/platform-docker-compose-host/contributions/probes/caddyfile-validate.mjs +108 -0
  150. package/blueprints/platform-docker-compose-host/contributions/probes/compose-config-lint.mjs +231 -0
  151. package/blueprints/platform-docker-compose-host/contributions/probes/probe-utils.mjs +185 -0
  152. package/blueprints/platform-docker-compose-host/contributions/probes/real-account-minimal-stack-up.mjs +41 -0
  153. package/blueprints/platform-docker-compose-host/contributions/probes/real-account-reload-burst.mjs +36 -0
  154. package/blueprints/platform-docker-compose-host/contributions/probes/run-caddyfile-validate.mjs +5 -0
  155. package/blueprints/platform-docker-compose-host/contributions/probes/run-compose-config-lint.mjs +5 -0
  156. package/blueprints/platform-docker-compose-host/contributions/probes/run-real-account-minimal-stack-up.mjs +5 -0
  157. package/blueprints/platform-docker-compose-host/contributions/probes/run-real-account-reload-burst.mjs +5 -0
  158. package/blueprints/platform-docker-compose-host/contributions/probes/run-secrets-as-files-scan.mjs +5 -0
  159. package/blueprints/platform-docker-compose-host/contributions/probes/secrets-as-files-scan.mjs +116 -0
  160. package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-001.json +18 -0
  161. package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-002.json +18 -0
  162. package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-003.json +18 -0
  163. package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-004.json +18 -0
  164. package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-005.json +18 -0
  165. package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-006.json +18 -0
  166. package/blueprints/platform-docker-compose-host/contributions/tacs/tac-3901-platform-docker-compose-host-compose-layout.json +26 -0
  167. package/blueprints/platform-docker-compose-host/contributions/tacs/tac-3902-platform-docker-compose-host-secrets-mount.json +26 -0
  168. package/blueprints/platform-docker-compose-host/contributions/tacs/tac-3903-platform-docker-compose-host-healthcheck-lint.json +26 -0
  169. package/blueprints/platform-docker-compose-host/contributions/tacs/tac-3904-platform-docker-compose-host-reverse-proxy-artefact.json +26 -0
  170. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38101.json +24 -0
  171. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38102.json +24 -0
  172. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38103.json +24 -0
  173. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38104.json +24 -0
  174. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38105.json +25 -0
  175. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38106.json +24 -0
  176. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38107.json +24 -0
  177. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38108.json +24 -0
  178. package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38109.json +24 -0
  179. package/blueprints/platform-docker-compose-host/docs/topics.md +71 -0
  180. package/blueprints/platform-docker-compose-host/guide/platform-docker-compose-host.md +94 -0
  181. package/blueprints/security-auth-clerk/docs/topics.md +4 -1
  182. package/blueprints/security-auth-keycloak/docs/topics.md +4 -1
  183. package/blueprints/security-auth-magic-link/docs/topics.md +4 -1
  184. package/blueprints/security-auth-oauth2/docs/topics.md +4 -1
  185. package/blueprints/security-secrets-management/docs/topics.md +4 -1
  186. package/fixtures/canary-manifest.json +9 -9
  187. package/guidance/harness-template.md +67 -0
  188. package/guidance/managed/agent-instructions-block.hash +1 -1
  189. package/guidance/managed/agent-instructions-block.md +67 -0
  190. package/package.json +2 -2
  191. package/rcf/adrs/adr-3801-deploy-hetzner-server-cloud-host-contract.json +13 -0
  192. package/rcf/adrs/adr-3802-deploy-hetzner-server-snapshot-cadence.json +13 -0
  193. package/rcf/adrs/adr-3803-deploy-hetzner-server-provisioning-tool.json +13 -0
  194. package/rcf/adrs/adr-3804-deploy-hetzner-server-hardening-baseline.json +13 -0
  195. package/rcf/adrs/adr-3901-platform-docker-compose-host-contract.json +13 -0
  196. package/rcf/adrs/adr-3902-platform-docker-compose-host-reverse-proxy.json +13 -0
  197. package/rcf/adrs/adr-3903-platform-docker-compose-host-reject-coolify.json +13 -0
  198. package/rcf/adrs/adr-3904-platform-docker-compose-host-log-driver.json +13 -0
  199. package/rcf/adrs/adr-4001-edge-cloudflare-tunnel-ingress-bridge-contract.json +13 -0
  200. package/rcf/adrs/adr-4002-edge-cloudflare-tunnel-connector-runtime.json +13 -0
  201. package/rcf/adrs/adr-4003-edge-cloudflare-tunnel-hostname-mode.json +13 -0
  202. package/rcf/code-nodes/cn-410.json +20 -0
  203. package/rcf/code-nodes/cn-440.json +20 -0
  204. package/rcf/code-nodes/cn-470.json +19 -0
  205. package/rcf/code-nodes/cn-500.json +12 -0
  206. package/rcf/code-nodes/cn-510.json +12 -0
  207. package/rcf/code-nodes/cn-520.json +14 -0
  208. package/rcf/code-nodes/cn-521.json +12 -0
  209. package/rcf/code-nodes/cn-522.json +13 -0
  210. package/rcf/code-nodes/cn-523.json +12 -0
  211. package/rcf/code-nodes/cn-524.json +14 -0
  212. package/rcf/code-nodes/cn-525.json +12 -0
  213. package/rcf/code-nodes/cn-526.json +14 -0
  214. package/rcf/fbs/fbs-130.json +23 -0
  215. package/rcf/fbs/fbs-140.json +23 -0
  216. package/rcf/fbs/fbs-150.json +22 -0
  217. package/rcf/fbs/fbs-160.json +15 -0
  218. package/rcf/fbs/fbs-165.json +15 -0
  219. package/rcf/fbs/fbs-170.json +16 -0
  220. package/rcf/fbs/fbs-171.json +16 -0
  221. package/rcf/fbs/fbs-172.json +15 -0
  222. package/rcf/fbs/fbs-173.json +17 -0
  223. package/rcf/fbs/fbs-174.json +17 -0
  224. package/rcf/requirements/req-110.json +58 -0
  225. package/rcf/requirements/req-111.json +32 -0
  226. package/rcf/requirements/req-112.json +42 -0
  227. package/rcf/requirements/req-113.json +33 -0
  228. package/rcf/requirements/req-114.json +20 -0
  229. package/rcf/requirements/req-115.json +38 -0
  230. package/rcf/requirements/req-120.json +20 -0
  231. package/rcf/requirements/req-121.json +20 -0
  232. package/rcf/requirements/req-122.json +20 -0
  233. package/rcf/requirements/req-123.json +42 -0
  234. package/rcf/requirements/req-124.json +27 -0
  235. package/rcf/requirements/req-125.json +20 -0
  236. package/rcf/requirements/req-130.json +32 -0
  237. package/rcf/requirements/req-131.json +54 -0
  238. package/rcf/requirements/req-132.json +27 -0
  239. package/rcf/requirements/req-133.json +20 -0
  240. package/rcf/requirements/req-134.json +42 -0
  241. package/rcf/requirements/req-140.json +149 -0
  242. package/rcf/requirements/req-145.json +53 -0
  243. package/rcf/requirements/req-150.json +20 -0
  244. package/rcf/requirements/req-151.json +85 -0
  245. package/rcf/requirements/req-152.json +20 -0
  246. package/rcf/requirements/req-153.json +59 -0
  247. package/rcf/requirements/req-154.json +44 -0
  248. package/rcf/tacs/tac-3801-deploy-hetzner-server-provisioner.json +17 -0
  249. package/rcf/tacs/tac-3802-deploy-hetzner-server-manifest-schema.json +17 -0
  250. package/rcf/tacs/tac-3803-deploy-hetzner-server-cloud-init-template.json +17 -0
  251. package/rcf/tacs/tac-3804-deploy-hetzner-server-firewall-shape.json +16 -0
  252. package/rcf/tacs/tac-3901-platform-docker-compose-host-compose-layout.json +17 -0
  253. package/rcf/tacs/tac-3902-platform-docker-compose-host-secrets-mount.json +17 -0
  254. package/rcf/tacs/tac-3903-platform-docker-compose-host-healthcheck-lint.json +17 -0
  255. package/rcf/tacs/tac-3904-platform-docker-compose-host-reverse-proxy-artefact.json +17 -0
  256. package/rcf/tacs/tac-4001-edge-cloudflare-tunnel-connector-shape.json +17 -0
  257. package/rcf/tacs/tac-4002-edge-cloudflare-tunnel-manifest-schema.json +17 -0
  258. package/rcf/tacs/tac-4003-edge-cloudflare-tunnel-access-binding.json +16 -0
  259. package/rcf/test-suites/ts-071.json +2 -2
  260. package/rcf/test-suites/ts-086.json +2 -2
  261. package/rcf/test-suites/ts-140.json +86 -0
  262. package/rcf/test-suites/ts-150.json +86 -0
  263. package/rcf/test-suites/ts-160.json +78 -0
  264. package/rcf/test-suites/ts-170.json +22 -0
  265. package/rcf/test-suites/ts-175.json +22 -0
  266. package/rcf/test-suites/ts-180.json +30 -0
  267. package/rcf/test-suites/ts-181.json +30 -0
  268. package/rcf/test-suites/ts-182.json +22 -0
  269. package/rcf/test-suites/ts-183.json +38 -0
  270. package/rcf/test-suites/ts-184.json +38 -0
  271. package/rcf/user-stories/us-11001.json +23 -0
  272. package/rcf/user-stories/us-11101.json +23 -0
  273. package/rcf/user-stories/us-11102.json +24 -0
  274. package/rcf/user-stories/us-11201.json +23 -0
  275. package/rcf/user-stories/us-11202.json +23 -0
  276. package/rcf/user-stories/us-11301.json +24 -0
  277. package/rcf/user-stories/us-11401.json +23 -0
  278. package/rcf/user-stories/us-11402.json +23 -0
  279. package/rcf/user-stories/us-11501.json +23 -0
  280. package/rcf/user-stories/us-12001.json +23 -0
  281. package/rcf/user-stories/us-12101.json +23 -0
  282. package/rcf/user-stories/us-12102.json +23 -0
  283. package/rcf/user-stories/us-12201.json +23 -0
  284. package/rcf/user-stories/us-12202.json +24 -0
  285. package/rcf/user-stories/us-12301.json +23 -0
  286. package/rcf/user-stories/us-12401.json +23 -0
  287. package/rcf/user-stories/us-12402.json +23 -0
  288. package/rcf/user-stories/us-12501.json +23 -0
  289. package/rcf/user-stories/us-13001.json +23 -0
  290. package/rcf/user-stories/us-13002.json +23 -0
  291. package/rcf/user-stories/us-13101.json +23 -0
  292. package/rcf/user-stories/us-13102.json +23 -0
  293. package/rcf/user-stories/us-13201.json +23 -0
  294. package/rcf/user-stories/us-13301.json +23 -0
  295. package/rcf/user-stories/us-13302.json +23 -0
  296. package/rcf/user-stories/us-13401.json +23 -0
  297. package/rcf/user-stories/us-14001.json +21 -0
  298. package/rcf/user-stories/us-14501.json +24 -0
  299. package/rcf/user-stories/us-15001.json +26 -0
  300. package/rcf/user-stories/us-15101.json +26 -0
  301. package/rcf/user-stories/us-15201.json +21 -0
  302. package/rcf/user-stories/us-15301.json +31 -0
  303. package/rcf/user-stories/us-15401.json +31 -0
  304. package/releases/releases.yaml +21 -1
  305. package/src/blueprint/apply.js +64 -0
  306. package/src/blueprint/consistency-lint.js +432 -0
  307. package/src/blueprint/disposition-ledger.js +224 -0
  308. package/src/blueprint/dispositions.js +44 -0
  309. package/src/blueprint/index.js +19 -0
  310. package/src/browser-verify/manifest-writer.js +53 -2
  311. package/src/browser-verify/pack-runner.js +18 -0
  312. package/src/cli/blueprint.js +103 -0
  313. package/src/setup/identity-seed.js +18 -0
@@ -0,0 +1,13 @@
1
+ {
2
+ "cnId": "CN-522",
3
+ "path": "../../packages/rcf-lite/test/blueprint/platform-cloudflare-kv-anatomy.test.js",
4
+ "implementsAcIds": [
5
+ "AC-15001-1",
6
+ "AC-15001-2"
7
+ ],
8
+ "dependencies": [],
9
+ "version": "0.1.0",
10
+ "status": "draft",
11
+ "createdAt": "2026-09-08T12:22:47.694Z",
12
+ "updatedAt": "2026-09-08T12:22:47.694Z"
13
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "cnId": "CN-523",
3
+ "path": "../../packages/rcf-lite/test/fixtures/cf-platform/h2-cf-kv-event-secrecy-shim.mjs",
4
+ "implementsAcIds": [
5
+ "AC-15401-1"
6
+ ],
7
+ "dependencies": [],
8
+ "version": "0.1.0",
9
+ "status": "draft",
10
+ "createdAt": "2026-09-08T12:23:45.054Z",
11
+ "updatedAt": "2026-09-08T12:23:45.054Z"
12
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "cnId": "CN-524",
3
+ "path": "../../blueprints/platform-cloudflare-durable-objects/blueprint.json",
4
+ "implementsAcIds": [
5
+ "AC-15101-1",
6
+ "AC-15101-2",
7
+ "AC-15401-3"
8
+ ],
9
+ "dependencies": [],
10
+ "version": "0.1.0",
11
+ "status": "draft",
12
+ "createdAt": "2026-09-08T13:01:58.227Z",
13
+ "updatedAt": "2026-09-08T13:01:58.227Z"
14
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "cnId": "CN-525",
3
+ "path": "../../blueprints/messaging-queue-cloudflare/blueprint.json",
4
+ "implementsAcIds": [
5
+ "AC-15201-1"
6
+ ],
7
+ "dependencies": [],
8
+ "version": "0.1.0",
9
+ "status": "draft",
10
+ "createdAt": "2026-09-08T13:01:58.602Z",
11
+ "updatedAt": "2026-09-08T13:01:58.602Z"
12
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "cnId": "CN-526",
3
+ "path": "../../blueprints/edge-cloudflare-tunnel/blueprint.json",
4
+ "implementsAcIds": [
5
+ "AC-15301-1",
6
+ "AC-15301-2",
7
+ "AC-15301-3"
8
+ ],
9
+ "dependencies": [],
10
+ "version": "0.1.0",
11
+ "status": "draft",
12
+ "createdAt": "2026-09-08T13:01:58.994Z",
13
+ "updatedAt": "2026-09-08T13:01:58.994Z"
14
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "createdAt": "2026-09-07T23:59:15.656Z",
3
+ "updatedAt": "2026-09-07T23:59:15.844Z",
4
+ "acIds": [
5
+ "AC-11001-1",
6
+ "AC-11101-1",
7
+ "AC-11102-1",
8
+ "AC-11201-1",
9
+ "AC-11202-1",
10
+ "AC-11301-1",
11
+ "AC-11401-1",
12
+ "AC-11402-1",
13
+ "AC-11501-1"
14
+ ],
15
+ "fbsId": "FBS-130",
16
+ "prdId": "PRD-001",
17
+ "bsId": "BS-001",
18
+ "buildOrder": 60,
19
+ "executionStatus": "notStarted",
20
+ "title": "T-1 deploy-hetzner-server v1.0.0: 6 REQs 9 USs 4 TACs 4 ADRs 6 Node-only probes; shared hetzner-throwaway-server fixture mint with provision/destroy/sweep-orphans and dry-run mock",
21
+ "summary": "HQ round-7 T-1: deploy-hetzner-server v1.0.0 blueprint on the shelf under blueprints/deploy-hetzner-server/ (23 contributions: 6 REQs, 9 USs, 4 TACs, 4 ADRs; inventory per hetzner-round-7-spec-2026-09-07 section 5.1). Mints the shared throwaway-Hetzner-server fixture at packages/rcf-lite/test/fixtures/hetzner-throwaway-server/ (provision.mjs, destroy.mjs, sweep-orphans.mjs, hcloud-mock shim, cloud-init renderer, provisioner-facade proto, hetzner/servers/ci-throwaway.json manifest, README) that T-2 and T-3 will extend. Six Node-only probes under blueprints/deploy-hetzner-server/contributions/probes/: cloud-init-render-lint (AC-11201-1; SIMULATE_HARDENING_DRIFT mutation), manifest-schema-validate (AC-11101-1, AC-11301-1, AC-11401-1; SIMULATE_MANIFEST_INVALID mutation), hcloud-dry-run-mock (AC-11001-1, AC-11501-1; JSON-parser-strip mutation plus event-secrecy leak mutation), real-account-throwaway-server-provision (AC-11102-1; accountBound), real-account-cloud-init-hardened (AC-11202-1; accountBound), real-account-snapshot-on-demand (AC-11402-1; accountBound). Blueprint README, guide, CHANGELOG, docs/topics.md; shelf-wide topics.md sweep adding the deploy-hetzner-server row across every prior blueprint; section 6a cloudHost row on packages/rcf-lite/docs/blueprint-authoring.md. New global topics minted: linuxCloudHostContract, snapshotAndBackupCadence. Repo chain: REQ-110..115, US-11001, 11101, 11102, 11201, 11202, 11301, 11401, 11402, 11501, TS-140 with nine TCs, FBS-130, CN-410, TAC-3801..3804, ADR-3801..3804 minted via rcf define create --id per HQ round-7 T-1 reserved-block ruling (REQ-110..119 / TS-140..149 / FBS-130..139 / CN-410..439). Base commit origin/main 150d9c6.",
22
+ "dependsOnFbsIds": []
23
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "createdAt": "2026-09-08T01:45:31.629Z",
3
+ "updatedAt": "2026-09-08T01:45:31.816Z",
4
+ "acIds": [
5
+ "AC-12001-1",
6
+ "AC-12101-1",
7
+ "AC-12102-1",
8
+ "AC-12201-1",
9
+ "AC-12202-1",
10
+ "AC-12301-1",
11
+ "AC-12401-1",
12
+ "AC-12402-1",
13
+ "AC-12501-1"
14
+ ],
15
+ "fbsId": "FBS-140",
16
+ "prdId": "PRD-001",
17
+ "bsId": "BS-001",
18
+ "buildOrder": 61,
19
+ "executionStatus": "notStarted",
20
+ "title": "T-2 platform-docker-compose-host v1.0.0: 6 REQs 9 USs 4 TACs 4 ADRs 5 Node-only probes; extend shared hetzner-throwaway-server fixture with compose stack, Caddyfile, secret file mount and healthchecked service",
21
+ "summary": "HQ round-7 T-2: platform-docker-compose-host v1.0.0 blueprint on the shelf under blueprints/platform-docker-compose-host/ (23 contributions: 6 REQs, 9 USs, 4 TACs, 4 ADRs; inventory per hetzner-round-7-spec-2026-09-07 section 5.2). Extends the shared throwaway-Hetzner-server fixture minted by T-1 (packages/rcf-lite/test/fixtures/hetzner-throwaway-server/) with a compose stack (compose.yaml, caddy/Caddyfile, secrets/web-token file mount, src/serve.mjs healthchecked stub) plus five run-<probe>.mjs delegate shims. Five Node-only probes under blueprints/platform-docker-compose-host/contributions/probes/: compose-config-lint (AC-12201-1, AC-12301-1, AC-12501-1; SIMULATE_MISSING_HEALTHCHECK, SIMULATE_UNCLASSIFIED_RESTART, SIMULATE_UNCLASSIFIED_LOG_DRIVER, SIMULATE_EVENT_SECRECY_LEAK mutations), secrets-as-files-scan (AC-12101-1, AC-12102-1; SIMULATE_PLAINTEXT_SECRET mutation), caddyfile-validate (AC-12401-1; SIMULATE_INVALID_CADDYFILE mutation; runs the caddy:2 vendor container so a caddy binary on PATH is optional), real-account-minimal-stack-up (AC-12202-1; accountBound), real-account-reload-burst (AC-12402-1; accountBound). Blueprint README, guide, CHANGELOG, docs/topics.md; shelf-wide topics.md sweep adding the platform-docker-compose-host row across every prior blueprint; section 6a containerHost row on packages/rcf-lite/docs/blueprint-authoring.md. New global topic minted: containerHostContract. Repo chain: REQ-120..125, US-12001, 12101, 12102, 12201, 12202, 12301, 12401, 12402, 12501, TS-150 with nine TCs, FBS-140, CN-440, TAC-3901..3904, ADR-3901..3904 minted via rcf define create --id per HQ round-7 T-2 reserved-block ruling (REQ-120..129 / TS-150..159 / FBS-140..149 / CN-440..469). Base commit origin/main 30f7b77.",
22
+ "dependsOnFbsIds": []
23
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "createdAt": "2026-09-08T03:25:02.808Z",
3
+ "updatedAt": "2026-09-08T03:25:02.808Z",
4
+ "acIds": [
5
+ "AC-13001-1",
6
+ "AC-13002-1",
7
+ "AC-13101-1",
8
+ "AC-13102-1",
9
+ "AC-13201-1",
10
+ "AC-13301-1",
11
+ "AC-13302-1",
12
+ "AC-13401-1"
13
+ ],
14
+ "fbsId": "FBS-150",
15
+ "prdId": "PRD-001",
16
+ "bsId": "BS-001",
17
+ "buildOrder": 62,
18
+ "executionStatus": "notStarted",
19
+ "title": "T-3 edge-cloudflare-tunnel v1.0.0: 5 REQs 8 USs 3 TACs 3 ADRs 5 Node-only probes; extend shared hetzner-throwaway-server fixture with cloudflared connector (compose-service and systemd-unit variants; access-gated and public-hostname sidecar modes)",
20
+ "summary": "HQ round-7 T-3: edge-cloudflare-tunnel v1.0.0 blueprint on the shelf under blueprints/edge-cloudflare-tunnel/ (five REQs, eight USs, three TACs, three ADRs; inventory per hetzner-round-7-spec-2026-09-07 section 5.3). Extends the shared throwaway-Hetzner-server fixture minted by T-1 and extended by T-2 (packages/rcf-lite/test/fixtures/hetzner-throwaway-server/) with a cloudflared connector in both runtime shapes (compose-service alongside the T-2 web and caddy services when containerHost is applied; systemd-unit for a bare cloudHost) and both hostname modes (access-gated when zeroTrustGate is applied; public-hostname when absent), all under cloudflared/{compose-service,systemd-unit}/{access-gated,public-hostname}/. Five Node-only probes under blueprints/edge-cloudflare-tunnel/contributions/probes/: manifest-schema-validate (AC-13101-1, AC-13201-1, AC-13401-1; fixture-side SIMULATE_MANIFEST_INVALID_TUNNEL_ID, SIMULATE_MANIFEST_CREDENTIALS_INLINE, SIMULATE_MANIFEST_MISSING_CATCHALL, SIMULATE_ORIGIN_PORT_OPEN, SIMULATE_EVENT_SECRECY_LEAK mutations), cloudflared-config-lint (AC-13102-1; SIMULATE_INGRESS_INVALID mutation; runs the cloudflare/cloudflared vendor container so a cloudflared binary on PATH is optional), aud-presence-check (AC-13301-1, AC-13302-1; SIMULATE_AUD_DROP mutation; runs on both fixture variants and asserts the sidecar-read shape flips), real-account-connector-healthy (AC-13002-1; accountBound on CI_HAS_CLOUDFLARE_ACCOUNT plus CI_HAS_HETZNER_ACCOUNT), real-account-tunnel-hostname-routes (AC-13102-1 (secondary), AC-13301-1 (Access-gated sub-case); accountBound; the Access-gated sub-case additionally reads CI_HAS_CLOUDFLARE_ACCESS per Q4 ratification). Blueprint README, guide, CHANGELOG, docs/topics.md; shelf-wide topics.md sweep adding the edge-cloudflare-tunnel row across every prior blueprint; section 6a tunnelBridge row on packages/rcf-lite/docs/blueprint-authoring.md. New global topic minted: edgeIngressBridge. Repo chain: REQ-130..134, US-13001, 13002, 13101, 13102, 13201, 13301, 13302, 13401, TS-160 with eight TCs, FBS-150, CN-470, TAC-4001..4003, ADR-4001..4003 minted via rcf define create --id per HQ round-7 T-3 reserved-block ruling (REQ-130..139 / TS-160..169 / FBS-150..159 / CN-470..499). Base commit origin/main 6b4df05.",
21
+ "dependsOnFbsIds": []
22
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "createdAt": "2026-09-08T09:03:37.649Z",
3
+ "updatedAt": "2026-09-08T09:03:57.443Z",
4
+ "acIds": [
5
+ "AC-14001-1"
6
+ ],
7
+ "fbsId": "FBS-160",
8
+ "prdId": "PRD-001",
9
+ "bsId": "BS-001",
10
+ "buildOrder": 63,
11
+ "executionStatus": "notStarted",
12
+ "title": "Adapter object-storage-s3 v1.1.0 Hetzner Object Storage: minor bump adds hetznerObjectStorage provider; new hetzner-endpoint helper on the fixture side; new hetzner-object-storage-round-trip probe (accountBound gated on CI_HAS_HETZNER_OBJECT_STORAGE); MinIO round-5 T-2 probes and R2 smoke unchanged",
13
+ "summary": "HQ round-7 follow-up: object-storage-s3 v1.1.0 minor bump adding the Hetzner Object Storage provider value under the shipped S3-API facade contract (blueprints/object-storage-s3/, was 1.0.0). Delta contributions on the blueprint side (target 4): one blueprint REQ object-storage-s3-REQ-101 (Hetzner endpoint-shape contract), one blueprint US object-storage-s3-US-28110 with AC-28110-1 (labelled AC-hetznerObjectStorage-endpointRoundTrip), one blueprint TAC TAC-2904-object-storage-s3-hetzner-endpoint-helper, one blueprint ADR ADR-2905-object-storage-s3-hetzner-object-storage-provider with standardsTraceClause 'Hetzner Object Storage S3 compatibility documented endpoint shape'. Every existing v1.0.0 contribution id byte-identical (no renumber, no reshape). Extends the shared fixture packages/rcf-lite/test/fixtures/infra-s3-and-queue/ (no second fixture directory) with src/hetzner-endpoint.mjs (composes <bucket>.<location>.your-objectstorage.com from an elicited bucket and location per Hetzner storage overview fsn1/hel1/nbg1 codes) plus a fixture-side shim run-hetzner-object-storage-round-trip.mjs. New Node-only probe blueprints/object-storage-s3/contributions/probes/hetzner-object-storage-round-trip.mjs (accountBound true, gated on CI_HAS_HETZNER_OBJECT_STORAGE, records accountBoundSkipped when unset per spec section 3.5); mutation SIMULATE_HETZNER_ENDPOINT_MISSHAPEN true (fixture-side INPUT-side mutation) composes an invalid endpoint via the fixture shim and the probe FAILS naming the missing subdomain. The round-5 T-2 shipped probes (facade-round-trip, put-get-round-trip, presigned-url, multipart-upload, event-secrecy) and the R2 real-account smoke stay unchanged and continue to pass byte-identical on the extended fixture. Blueprint README extended with a Hetzner Object Storage sub-section under the provider-choice section; guide extended with a Hetzner sub-section; blueprint CHANGELOG gains a 1.1.0 entry; shelf-wide topics.md sweep updates the object-storage-s3 row from shipped v1.0.0 to shipped v1.1.0 across every blueprint's docs/topics.md per the round-6 admin-console 1.1.0 precedent (PR #169). rcf-lite package version does NOT bump for this follow-up (spec section 8). Repo chain: REQ-140, US-14001 with AC-14001-1, TS-170 with TC-170-hetzner-endpoint-round-trip-and-skipped-shape, FBS-160 (buildOrder 63), CN-500, plus blueprint REQ-101 and blueprint US-28110 as blueprint-owned deltas, minted via rcf define create --id per HQ round-7 follow-up reserved-block ruling 2026-09-08 (adapter block REQ-140..144 / TS-170..174 / FBS-160..164 / CN-500..509). Base commit origin/main 25ccece.",
14
+ "dependsOnFbsIds": []
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "createdAt": "2026-09-08T10:52:49.604Z",
3
+ "updatedAt": "2026-09-08T10:52:49.604Z",
4
+ "summary": "H-1 patch train against deploy-hetzner-server (blueprint bump 1.0.0 to 1.0.1; every existing contribution id byte-identical) and the shared throwaway-Hetzner-server fixture at packages/rcf-lite/test/fixtures/hetzner-throwaway-server/. Defect list from projects/blueprint-library/reports/real-account-r7-2026-09-08/README.md CONCERNS: (1) provision.mjs reads camelCase off the hcloud JSON (publicNet.ipv4.ip, datacenter.location.name, serverType.name) but hcloud emits snake_case (public_net, server_type, datacenter.location.name); fix reads s.public_net.ipv4.ip, s.datacenter.location.name, s.server_type.name; (2) provision.mjs expects hetzner/servers/rendered/ci-throwaway.cloud-init.yaml that nothing writes; fix renders inline via src/cloud-init-renderer.mjs before hcloud server create fires; (3) renderer substitutes ssh key NAMES into ssh_authorized_keys; fix resolves each name to its public-key material via hcloud ssh-key describe <name> --output json and inlines the .publicKey text; (4) destroy.mjs and sweep-orphans.mjs pass --output json to delete verbs that reject the flag; fix drops it and the tolerant JSON parser accepts arrays; (5) src/snapshot-verb.mjs calls a non-existent hcloud image create-image; fix shells hcloud server create-image --type snapshot --description <label> <id> and recovers the created snapshot id via hcloud image list --type=snapshot --output json by matching the serverName label; (6) src/ssh-baseline-check.mjs runs ssh immediately after provisionThrowawayServer; fix polls port 22 open plus a trivial ssh true exec, bounded up to 6 minutes, before firing the six baseline checks; (7) the deploy user has no NOPASSWD sudo in the rendered user-data; fix adds a write_files sudoers.d fragment granting NOPASSWD to that user with mode 0440; (9) hetzner/servers/ci-throwaway.json hard-codes sshKeyIds ['rcf-lite-ci']; fix adds an env override RCF_LITE_CI_SSH_KEY_NAME resolved at provision time with the manifest value as default, documented in the fixture README. Defect (8) T-2 and T-3 stub drivers are OUT of scope (H-2 owns them). Also: hcloud-dry-run-mock and the two other T-1 mocked probes gain fixture-side SIMULATE_ switches that alter INPUT only, satisfying the mutation-purity gate row; the mock reads the same rendered cloud-init the real path consumes and asserts an ssh public-key line and a NOPASSWD directive for the deploy user. Report envelopes under .rcf/reports/blueprints/deploy-hetzner-server/ regenerated from the REAL run under Baz one-off approval 2026-09-08 (repo-relative paths only, no secrets). CHANGELOG 1.0.1 entry lists the fixes by defect number. Chain: HQ hardening block H-1 REQ-145..149 / TS-175..179 / FBS-165..169 / CN-510..519 per HQ chain-block ruling 2026-09-08. Base commit origin/main 231bc74.",
5
+ "acIds": [
6
+ "AC-14501-1"
7
+ ],
8
+ "fbsId": "FBS-165",
9
+ "prdId": "PRD-001",
10
+ "bsId": "BS-001",
11
+ "buildOrder": 64,
12
+ "executionStatus": "notStarted",
13
+ "title": "H-1 hardening: deploy-hetzner-server v1.0.0 to v1.0.1 patch train; fixes the nine defects the round-7 real-account gate run d-2026-09-08-010 found; makes the shared throwaway-server fixture consume the same rendered cloud-init the real path consumes",
14
+ "dependsOnFbsIds": []
15
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "createdAt": "2026-09-08T12:22:31.659Z",
3
+ "updatedAt": "2026-09-08T14:04:50.163Z",
4
+ "acIds": [
5
+ "AC-15001-1",
6
+ "AC-15001-2"
7
+ ],
8
+ "fbsId": "FBS-170",
9
+ "prdId": "PRD-001",
10
+ "bsId": "BS-001",
11
+ "buildOrder": 65,
12
+ "executionStatus": "notStarted",
13
+ "title": "H-2 kv re-anchor and observability: five kv probes and README anchored to shipped AC-31xxx band; two previously-uncovered ACs gain runtime observables via facade-round-trip env.CACHE grep and event-secrecy whitelist scan; kv-anatomy test assertions moved with the re-anchor (addendum ruling 1)",
14
+ "summary": "H-2 kv re-anchor: renumber every anchorAcId in the five contributed kv probes (facade-round-trip, list-with-prefix, cache-aside-hit-then-miss, event-secrecy, real-account-eventual-consistency-smoke) and their header comments from AC-5xxx to the shipped AC-31xxx band; correct the kv README chain-slice pointer paragraph to name US-31101..US-31108; move kv-anatomy test assertions to the new AC-31xxx ids per dispatch addendum ruling 1; add a runtime env.CACHE-grep result on facade-round-trip covering AC-31102-1; add a whitelist-scan result on event-secrecy covering AC-31107-1; the real-account probe carries AC-31103-1 as its bound AC. Two ACs on this FBS: AC-15001-1 (no AC-5xxx string survives on the kv blueprint tree) and AC-15001-2 (every shipped kv AC appears as an anchor on a probe result with a runtime observable).",
15
+ "dependsOnFbsIds": []
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "createdAt": "2026-09-08T12:22:32.025Z",
3
+ "updatedAt": "2026-09-08T14:04:49.784Z",
4
+ "acIds": [
5
+ "AC-15101-1",
6
+ "AC-15101-2"
7
+ ],
8
+ "fbsId": "FBS-171",
9
+ "prdId": "PRD-001",
10
+ "bsId": "BS-001",
11
+ "buildOrder": 66,
12
+ "executionStatus": "notStarted",
13
+ "title": "H-2 DO real storage round-trip driver and anchor coverage: real-account-storage-smoke replaces credential-readiness pass-stub with byte-equal put/get round-trip via deployed Worker (or wrangler-dev locally); five previously-unbound DO ACs bound as additional-result anchors on existing probes; DO anatomy test assertions extended for the new bindings",
14
+ "summary": "H-2 DO storage round-trip driver and anchor coverage: replace the credential-readiness pass-stub in blueprints/platform-cloudflare-durable-objects/contributions/probes/real-account-storage-smoke.mjs with a real HTTP round-trip driver against a deployed Worker route (byte-equal read-back on 1 KiB payload); local proof via the existing wrangler-seam.mjs against miniflare or wrangler dev. Bind the five previously-unbound DO ACs (AC-33106-1, AC-33108-1, AC-33109-1, AC-33110-1, AC-33111-1) as additional-result anchors on the wrangler-seam, storage-round-trip and concurrent-increment probes; add a new probe body inside existing capability only if no existing probe carries the observable honestly. Extend the DO anatomy test to assert the thirteen-AC coverage union. Move the DO probe-body SIMULATE_ branches (sole-reader-scan, storage-round-trip, websocket-hub-broadcast) into fixture-side h2-cf shim modules (Group B scope, tracked by AC-15401-1).",
15
+ "dependsOnFbsIds": []
16
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "createdAt": "2026-09-08T12:22:32.405Z",
3
+ "updatedAt": "2026-09-08T14:04:49.404Z",
4
+ "acIds": [
5
+ "AC-15201-1"
6
+ ],
7
+ "fbsId": "FBS-172",
8
+ "prdId": "PRD-001",
9
+ "bsId": "BS-001",
10
+ "buildOrder": 67,
11
+ "executionStatus": "notStarted",
12
+ "title": "H-2 queue real concurrency driver: real-account-concurrency-smoke publishes 500 messages against a live Queues binding on a deployed Worker and asserts concurrent processing up to the documented push-invocation cap; env-absent branch keeps pass-with-skip; queue anatomy test assertions extended",
13
+ "summary": "H-2 queue real concurrency driver: replace the accountBoundSkipped pass-stub in blueprints/messaging-queue-cloudflare/contributions/probes/real-account-concurrency-smoke.mjs with a real driver that publishes 500 messages through the producer facade wired to a live Queues binding on a deployed Worker (queue name and binding parameterised via env; canonical queue rcf-lite-ci-queue-smoke, HQ supplies values at gate time) and asserts concurrent processing up to the documented push-invocation cap (Cloudflare Queues limits URL). Local proof via miniflare or wrangler dev with local queue simulation. Env-absent branch keeps section 3.5 pass-with-skip. Re-verify the Cloudflare Queues limits URL 200 at merge time and log in the PR provenance. Extend the queue anatomy test to assert the real-account round-trip shape.",
14
+ "dependsOnFbsIds": []
15
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "createdAt": "2026-09-08T12:22:32.784Z",
3
+ "updatedAt": "2026-09-08T14:04:49.011Z",
4
+ "acIds": [
5
+ "AC-15301-1",
6
+ "AC-15301-2",
7
+ "AC-15301-3"
8
+ ],
9
+ "fbsId": "FBS-173",
10
+ "prdId": "PRD-001",
11
+ "bsId": "BS-001",
12
+ "buildOrder": 68,
13
+ "executionStatus": "notStarted",
14
+ "title": "H-2 tunnel real drivers: connector-healthy runs cloudflared tunnel info against a throwaway hetzner server via T-1 fixture; hostname-routes drives undici + (with Access) two-identity JWT; manifest-schema-validate placeholder becomes fail-with-pointer; tunnel anatomy test assertions extended and the symbolic-anchor ruling recorded",
15
+ "summary": "H-2 tunnel real drivers: replace blueprints/edge-cloudflare-tunnel/contributions/probes/real-account-connector-healthy.mjs and real-account-tunnel-hostname-routes.mjs warn-on-env stubs with real drivers. connector-healthy provisions the throwaway hetzner server via the T-1 hetzner fixture surface (consumed as-is; hetzner-fixture defects are H-1 scope at HQ), brings a named cloudflared tunnel connector up, runs cloudflared tunnel info <name> through a cloudflared control shim, asserts healthy connector count is at least one, captures tunnelConnectorUp event. hostname-routes drives undici for the public-hostname sub-case and (when CI_HAS_CLOUDFLARE_ACCESS is set) a two-identity JWT sub-case (HQ note: Access is not enabled on the HQ account today, so at gate time the AUD sub-case stays pass-with-skip until HQ enables Access). manifest-schema-validate warn-on-missing-credentials-placeholder becomes fail with a fixture-setup pointer. Tunnel symbolic-anchor ruling (AC-tunnel-*) resolved and recorded in the PR body per brief C4.",
16
+ "dependsOnFbsIds": []
17
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "createdAt": "2026-09-08T12:22:33.140Z",
3
+ "updatedAt": "2026-09-08T14:04:48.623Z",
4
+ "acIds": [
5
+ "AC-15401-1",
6
+ "AC-15401-2",
7
+ "AC-15401-3"
8
+ ],
9
+ "fbsId": "FBS-174",
10
+ "prdId": "PRD-001",
11
+ "bsId": "BS-001",
12
+ "buildOrder": 69,
13
+ "executionStatus": "notStarted",
14
+ "title": "H-2 cross-cutting probe hygiene: SIMULATE_ branches moved out of shipped probe bodies into fixture-side h2-cf-platform-probe-integrity shims across the four blueprints; committed fail envelope removed and shipped-code pass envelopes committed; probe comments name test doubles honestly; new h2-cf-platform-probe-integrity anatomy test asserts SIMULATE_ purity, envelope hygiene and marker honesty",
15
+ "summary": "H-2 cross-cutting probe hygiene: SIMULATE_ branches moved out of the shipped probe bodies on the four Cloudflare-platform blueprints (kv: cache-aside-hit-then-miss, event-secrecy; DO: sole-reader-scan, storage-round-trip, websocket-hub-broadcast) into fixture-side shim modules under packages/rcf-lite/test/fixtures/cf-platform/ and .../cf-edge/ whose file names carry the h2-cf-platform-probe-integrity slug prefix (short form h2-cf). Delete the committed fail envelope at .rcf/reports/blueprints/platform-cloudflare-kv/event-secrecy.json and commit a shipped-code pass envelope in its place; regenerate the other kv envelopes and commit shipped-code pass envelopes for the DO/queue/tunnel probes. Rework or adjudicate probe comments flagged by stage-1 marker rows (kv fake clock; DO fake state, fake WebSocket pair; DO probe-utils lines 73 and 75; kv not-yet elicit gating). Add a new h2-cf-platform-probe-integrity anatomy test at packages/rcf-lite/test/blueprint/h2-cf-platform-probe-integrity.test.js that greps the four probe trees for SIMULATE_ (must be zero), walks committed envelopes for fail/warn aggregateVerdict (must be zero), and asserts marker rewording.",
16
+ "dependsOnFbsIds": []
17
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "createdAt": "2026-09-07T23:53:24.739Z",
3
+ "updatedAt": "2026-09-07T23:53:41.232Z",
4
+ "description": "The provisioner module wraps the hcloud CLI verbs (or the raw Hetzner Cloud API when provisioningTool=raw-api) and is the sole reader of the Hetzner API token via security-secrets-management. It opens on the applying project's boot path and emits a provisionerReady lifecycle event with metadata-only fields (tool, apiHost, sha of the shim). Chain: HQ round-7 T-1 reserved-block per HQ chain-block ruling 2026-09-07 (REQ-110..119 / TS-140..149 / FBS-130..139 / CN-410..439). Round-7 T-1 track of hetzner-round-7-spec-2026-09-07 section 5.1.",
5
+ "reqId": "REQ-110",
6
+ "prdId": "PRD-001",
7
+ "title": "T-1 deploy-hetzner-server v1.0.0 blueprint: provisioner is sole reader of the Hetzner API token, opens on boot, fires provisionerReady event with metadata-only payload",
8
+ "category": "functional",
9
+ "domain": "functional",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": [
15
+ "httpApi",
16
+ "auth"
17
+ ],
18
+ "reason": "keyword-scan",
19
+ "classifiedAt": "2026-09-07T23:53:24.779Z",
20
+ "signals": [
21
+ {
22
+ "source": "title",
23
+ "shape": "httpApi",
24
+ "match": "API"
25
+ },
26
+ {
27
+ "source": "title",
28
+ "shape": "auth",
29
+ "match": "token"
30
+ },
31
+ {
32
+ "source": "description",
33
+ "shape": "httpApi",
34
+ "match": "API"
35
+ },
36
+ {
37
+ "source": "description",
38
+ "shape": "httpApi",
39
+ "match": "api"
40
+ },
41
+ {
42
+ "source": "description",
43
+ "shape": "httpApi",
44
+ "match": "API"
45
+ },
46
+ {
47
+ "source": "description",
48
+ "shape": "auth",
49
+ "match": "token"
50
+ },
51
+ {
52
+ "source": "description",
53
+ "shape": "httpApi",
54
+ "match": "api"
55
+ }
56
+ ]
57
+ }
58
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "createdAt": "2026-09-07T23:53:24.971Z",
3
+ "updatedAt": "2026-09-07T23:53:41.419Z",
4
+ "description": "The applying project holds its server declarations as JSON documents under hetzner/servers/<name>.json, one file per server, matching a shipped JSON Schema that names type, location, image, ssh-key ids, firewall id, network id, cloud-init user-data path and labels. Applying the provisioner reads each manifest and creates a matching live server; the hetznerServerProvisioned event carries id, primary IPv4, location and server-type. Chain: HQ round-7 T-1 reserved-block per HQ chain-block ruling 2026-09-07. Round-7 T-1 track of hetzner-round-7-spec-2026-09-07 section 5.1.",
5
+ "reqId": "REQ-111",
6
+ "prdId": "PRD-001",
7
+ "title": "T-1 deploy-hetzner-server v1.0.0 blueprint: server manifest schema at hetzner/servers/*.json applies to a live Hetzner Cloud server",
8
+ "category": "functional",
9
+ "domain": "functional",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": [
15
+ "persistence"
16
+ ],
17
+ "reason": "keyword-scan",
18
+ "classifiedAt": "2026-09-07T23:53:25.012Z",
19
+ "signals": [
20
+ {
21
+ "source": "title",
22
+ "shape": "persistence",
23
+ "match": "schema"
24
+ },
25
+ {
26
+ "source": "description",
27
+ "shape": "persistence",
28
+ "match": "Schema"
29
+ }
30
+ ]
31
+ }
32
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "createdAt": "2026-09-07T23:53:25.205Z",
3
+ "updatedAt": "2026-09-07T23:53:41.612Z",
4
+ "description": "The cloud-init template shipped with the blueprint renders YAML that lands SSH key-only, root disabled, UFW default-deny incoming, DOCKER-USER iptables chain, fail2ban SSH jail and unattended-upgrades on every provisioned Hetzner server. A local render lint asserts the six baseline blocks are present in the rendered YAML before any provision runs. Chain: HQ round-7 T-1 reserved-block per HQ chain-block ruling 2026-09-07. Round-7 T-1 track of hetzner-round-7-spec-2026-09-07 section 5.1.",
5
+ "reqId": "REQ-112",
6
+ "prdId": "PRD-001",
7
+ "title": "T-1 deploy-hetzner-server v1.0.0 blueprint: cloud-init hardening baseline lands the six documented lines on the provisioned server",
8
+ "category": "functional",
9
+ "domain": "functional",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": [
15
+ "webUi"
16
+ ],
17
+ "reason": "keyword-scan",
18
+ "classifiedAt": "2026-09-07T23:53:25.246Z",
19
+ "signals": [
20
+ {
21
+ "source": "description",
22
+ "shape": "webUi",
23
+ "match": "template"
24
+ },
25
+ {
26
+ "source": "description",
27
+ "shape": "webUi",
28
+ "match": "renders"
29
+ },
30
+ {
31
+ "source": "description",
32
+ "shape": "webUi",
33
+ "match": "render"
34
+ },
35
+ {
36
+ "source": "description",
37
+ "shape": "webUi",
38
+ "match": "rendered"
39
+ }
40
+ ]
41
+ }
42
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "createdAt": "2026-09-07T23:53:25.436Z",
3
+ "updatedAt": "2026-09-07T23:53:41.809Z",
4
+ "description": "The firewall rule set lives inside the server manifest and is applied to the server at provision time. Rules: 22 permitted only from an operator-nominated set of source-prefix ranges; 80/443 permitted from anywhere for the reverse proxy; all other inbound traffic denied. Manifest schema validation refuses on a rule set that opens 22 to 0.0.0.0/0 or drops the 80/443 rules. Chain: HQ round-7 T-1 reserved-block per HQ chain-block ruling 2026-09-07. Round-7 T-1 track of hetzner-round-7-spec-2026-09-07 section 5.1.",
5
+ "reqId": "REQ-113",
6
+ "prdId": "PRD-001",
7
+ "title": "T-1 deploy-hetzner-server v1.0.0 blueprint: firewall shape restricts SSH to operator-nominated prefixes, permits 80/443, denies all else",
8
+ "category": "functional",
9
+ "domain": "functional",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": [
15
+ "httpApi",
16
+ "persistence"
17
+ ],
18
+ "reason": "keyword-scan",
19
+ "classifiedAt": "2026-09-07T23:53:25.477Z",
20
+ "signals": [
21
+ {
22
+ "source": "title",
23
+ "shape": "httpApi",
24
+ "match": "rest"
25
+ },
26
+ {
27
+ "source": "description",
28
+ "shape": "persistence",
29
+ "match": "schema"
30
+ }
31
+ ]
32
+ }
33
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "createdAt": "2026-09-07T23:53:25.669Z",
3
+ "updatedAt": "2026-09-07T23:53:41.996Z",
4
+ "description": "The applying project elicits a snapshot cadence per ADR-3802 (default weekly, alternatives daily and off). When non-off, the scheduled snapshot runner fires the hcloud snapshot verb and tags the snapshot with server name and wall-clock time; a snapshot-on-demand verb fires the same shape. The hetznerSnapshotTaken event carries snapshot id and wall-clock time. Chain: HQ round-7 T-1 reserved-block per HQ chain-block ruling 2026-09-07. Round-7 T-1 track of hetzner-round-7-spec-2026-09-07 section 5.1.",
5
+ "reqId": "REQ-114",
6
+ "prdId": "PRD-001",
7
+ "title": "T-1 deploy-hetzner-server v1.0.0 blueprint: snapshot cadence elicited (weekly default, daily and off alternatives), snapshot-on-demand fires a tagged snapshot",
8
+ "category": "functional",
9
+ "domain": "functional",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": [
15
+ "none"
16
+ ],
17
+ "reason": "keyword-scan",
18
+ "classifiedAt": "2026-09-07T23:53:25.710Z"
19
+ }
20
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "createdAt": "2026-09-07T23:53:25.903Z",
3
+ "updatedAt": "2026-09-07T23:53:42.183Z",
4
+ "description": "The provisioner facade emits four lifecycle events: provisionerReady, hetznerServerProvisioned, hetznerSnapshotTaken and hetznerServerDestroyed. Payloads are metadata-only: id, primary IPv4, location, server-type, snapshot id, wall-clock time. An event-secrecy probe asserts no event body carries the API token, an ssh private key, or a plaintext secret; a mutation that leaks a token into an event body FAILS the probe with a defensive-fake finding. Chain: HQ round-7 T-1 reserved-block per HQ chain-block ruling 2026-09-07. Round-7 T-1 track of hetzner-round-7-spec-2026-09-07 section 5.1.",
5
+ "reqId": "REQ-115",
6
+ "prdId": "PRD-001",
7
+ "title": "T-1 deploy-hetzner-server v1.0.0 blueprint: four lifecycle events fire with metadata-only payloads and no secret leak",
8
+ "category": "functional",
9
+ "domain": "functional",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": [
15
+ "httpApi",
16
+ "auth"
17
+ ],
18
+ "reason": "keyword-scan",
19
+ "classifiedAt": "2026-09-07T23:53:25.943Z",
20
+ "signals": [
21
+ {
22
+ "source": "description",
23
+ "shape": "httpApi",
24
+ "match": "API"
25
+ },
26
+ {
27
+ "source": "description",
28
+ "shape": "auth",
29
+ "match": "token"
30
+ },
31
+ {
32
+ "source": "description",
33
+ "shape": "auth",
34
+ "match": "token"
35
+ }
36
+ ]
37
+ }
38
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "createdAt": "2026-09-08T01:39:09.362Z",
3
+ "updatedAt": "2026-09-08T01:39:28.241Z",
4
+ "description": "The applying project runs its containerised services from a single compose.yaml at the repo root. Each service is one container. Networks and volumes are declared with explicit names. Non-secret config lives in a .env file loaded by compose. The compose file is the single source of truth for the runtime topology; the container host reads it to bring the stack up and refuses on unclassified or malformed shape. Chain: HQ round-7 T-2 reserved-block per HQ chain-block ruling 2026-09-07 (REQ-120..129 / TS-150..159 / FBS-140..149 / CN-440..469). Round-7 T-2 track of hetzner-round-7-spec-2026-09-07 section 5.2.",
5
+ "reqId": "REQ-120",
6
+ "prdId": "PRD-001",
7
+ "title": "T-2 platform-docker-compose-host v1.0.0 blueprint: compose.yaml at repo root is the source of truth (service-per-container, named networks and volumes, .env for non-secret config)",
8
+ "category": "functional",
9
+ "domain": "functional",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": [
15
+ "none"
16
+ ],
17
+ "reason": "keyword-scan",
18
+ "classifiedAt": "2026-09-08T01:39:09.405Z"
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "createdAt": "2026-09-08T01:40:03.788Z",
3
+ "updatedAt": "2026-09-08T01:40:04.018Z",
4
+ "description": "Every secret used by any compose service is injected as a file mount under the compose secrets top-level key. The compose file contains no plaintext secret literal on any service argument, environment variable, or command clause (grep-refuse). When security-secrets-management is applied, the secret is sourced through that facade; when it is not, the guide names a documented file-based fallback path. The mounted secret file lands at mode 0o400 inside the container. Chain: HQ round-7 T-2 reserved-block per HQ chain-block ruling 2026-09-07. Round-7 T-2 track of hetzner-round-7-spec-2026-09-07 section 5.2.",
5
+ "reqId": "REQ-121",
6
+ "prdId": "PRD-001",
7
+ "title": "T-2 platform-docker-compose-host: secrets as file mounts, no plaintext literal in compose (grep-refuse); references security-secrets-management when applied",
8
+ "category": "functional",
9
+ "domain": "functional",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": [
15
+ "none"
16
+ ],
17
+ "reason": "keyword-scan",
18
+ "classifiedAt": "2026-09-08T01:40:03.831Z"
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "createdAt": "2026-09-08T01:40:04.204Z",
3
+ "updatedAt": "2026-09-08T01:40:04.433Z",
4
+ "description": "Every service that terminates HTTP declares a healthcheck block. The compose file refuses at docker compose config time when any HTTP-terminating service is missing the block. The healthcheck defaults per service kind are elicited (http default, tcp and command alternatives). The stack is not considered up until every declared service reaches healthy inside the elicited timeout. Chain: HQ round-7 T-2 reserved-block per HQ chain-block ruling 2026-09-07. Round-7 T-2 track of hetzner-round-7-spec-2026-09-07 section 5.2.",
5
+ "reqId": "REQ-122",
6
+ "prdId": "PRD-001",
7
+ "title": "T-2 platform-docker-compose-host: healthcheck contract on every HTTP-terminating service refuses at docker compose config on missing",
8
+ "category": "functional",
9
+ "domain": "functional",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": [
15
+ "none"
16
+ ],
17
+ "reason": "keyword-scan",
18
+ "classifiedAt": "2026-09-08T01:40:04.247Z"
19
+ }
20
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "createdAt": "2026-09-08T01:40:04.619Z",
3
+ "updatedAt": "2026-09-08T01:40:04.848Z",
4
+ "description": "Every service declares a restart policy. Long-running services declare restart: unless-stopped. Jobs (short-lived services that exit after completion) declare restart: on-failure. Any service that declares neither, or declares an unclassified value outside the two allowed policies, refuses at the compose-config-lint gate before docker compose up runs. Chain: HQ round-7 T-2 reserved-block per HQ chain-block ruling 2026-09-07. Round-7 T-2 track of hetzner-round-7-spec-2026-09-07 section 5.2.",
5
+ "reqId": "REQ-123",
6
+ "prdId": "PRD-001",
7
+ "title": "T-2 platform-docker-compose-host: restart discipline (unless-stopped on long-running, on-failure on jobs); refuses at lint on unclassified",
8
+ "category": "functional",
9
+ "domain": "functional",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": [
15
+ "httpApi"
16
+ ],
17
+ "reason": "keyword-scan",
18
+ "classifiedAt": "2026-09-08T01:40:04.662Z",
19
+ "signals": [
20
+ {
21
+ "source": "title",
22
+ "shape": "httpApi",
23
+ "match": "rest"
24
+ },
25
+ {
26
+ "source": "description",
27
+ "shape": "httpApi",
28
+ "match": "rest"
29
+ },
30
+ {
31
+ "source": "description",
32
+ "shape": "httpApi",
33
+ "match": "rest"
34
+ },
35
+ {
36
+ "source": "description",
37
+ "shape": "httpApi",
38
+ "match": "rest"
39
+ }
40
+ ]
41
+ }
42
+ }