rcf-lite 0.28.2 → 0.29.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 (327) hide show
  1. package/CHANGELOG.md +317 -0
  2. package/bin/rcf.js +8 -0
  3. package/fixtures/canary-manifest.json +9 -9
  4. package/guidance/define-draft-shapes.md +89 -0
  5. package/guidance/define-intake.md +97 -0
  6. package/guidance/define-intent.md +107 -0
  7. package/guidance/discover-prototype.md +67 -0
  8. package/guidance/discovery-prototypes.md +69 -0
  9. package/guidance/harness-template.md +34 -0
  10. package/guidance/managed/agent-instructions-block.hash +1 -1
  11. package/guidance/managed/agent-instructions-block.md +34 -0
  12. package/guidance/manifest.json +9 -2
  13. package/package.json +1 -1
  14. package/rcf/adrs/adr-4120-canonical-json-hashing.json +30 -0
  15. package/rcf/adrs/adr-4121-define-sidecars.json +30 -0
  16. package/rcf/adrs/adr-4122-define-gates-blocking-and-optout.json +30 -0
  17. package/rcf/adrs/adr-4123-readiness-single-object.json +30 -0
  18. package/rcf/adrs/adr-4124-define-freeze-verb.json +30 -0
  19. package/rcf/adrs/adr-4126-persona-tagged-blockers-two-levels.json +40 -0
  20. package/rcf/adrs/adr-4127-readiness-tab-order-and-register.json +40 -0
  21. package/rcf/adrs/adr-4129-questions-harness-driven-loop.json +25 -0
  22. package/rcf/adrs/adr-4130-intake-harness-split-tool-scanned.json +20 -0
  23. package/rcf/adrs/adr-4132-prototypes-in-discovery-as-evidence.json +20 -0
  24. package/rcf/adrs/adr-4133-dag-dependency-depth-layout.json +40 -0
  25. package/rcf/adrs/adr-4134-index-json-route.json +35 -0
  26. package/rcf/adrs/adr-4135-readiness-po-register-and-adapter.json +35 -0
  27. package/rcf/adrs/adr-4136-embedding-host-fixture.json +35 -0
  28. package/rcf/code-nodes/cn-700.json +23 -0
  29. package/rcf/code-nodes/cn-701.json +14 -0
  30. package/rcf/code-nodes/cn-702.json +14 -0
  31. package/rcf/code-nodes/cn-703.json +16 -0
  32. package/rcf/code-nodes/cn-720.json +15 -0
  33. package/rcf/code-nodes/cn-721.json +15 -0
  34. package/rcf/code-nodes/cn-722.json +15 -0
  35. package/rcf/code-nodes/cn-723.json +18 -0
  36. package/rcf/code-nodes/cn-724.json +14 -0
  37. package/rcf/code-nodes/cn-725.json +37 -0
  38. package/rcf/code-nodes/cn-726.json +25 -0
  39. package/rcf/code-nodes/cn-727.json +23 -0
  40. package/rcf/code-nodes/cn-728.json +37 -0
  41. package/rcf/code-nodes/cn-729.json +26 -0
  42. package/rcf/code-nodes/cn-730.json +24 -0
  43. package/rcf/code-nodes/cn-731.json +20 -0
  44. package/rcf/code-nodes/cn-732.json +14 -0
  45. package/rcf/code-nodes/cn-733.json +14 -0
  46. package/rcf/code-nodes/cn-734.json +14 -0
  47. package/rcf/code-nodes/cn-735.json +20 -0
  48. package/rcf/code-nodes/cn-736.json +14 -0
  49. package/rcf/code-nodes/cn-737.json +14 -0
  50. package/rcf/code-nodes/cn-738.json +14 -0
  51. package/rcf/code-nodes/cn-739.json +18 -0
  52. package/rcf/code-nodes/cn-740.json +19 -0
  53. package/rcf/code-nodes/cn-741.json +16 -0
  54. package/rcf/code-nodes/cn-742.json +16 -0
  55. package/rcf/code-nodes/cn-743.json +15 -0
  56. package/rcf/code-nodes/cn-744.json +22 -0
  57. package/rcf/code-nodes/cn-745.json +16 -0
  58. package/rcf/code-nodes/cn-746.json +14 -0
  59. package/rcf/code-nodes/cn-747.json +18 -0
  60. package/rcf/code-nodes/cn-748.json +16 -0
  61. package/rcf/code-nodes/cn-749.json +16 -0
  62. package/rcf/code-nodes/cn-750.json +15 -0
  63. package/rcf/code-nodes/cn-751.json +18 -0
  64. package/rcf/code-nodes/cn-752.json +14 -0
  65. package/rcf/fbs/fbs-190.json +37 -0
  66. package/rcf/fbs/fbs-191.json +34 -0
  67. package/rcf/fbs/fbs-192.json +17 -0
  68. package/rcf/fbs/fbs-193.json +37 -0
  69. package/rcf/fbs/fbs-194.json +35 -0
  70. package/rcf/fbs/fbs-195.json +37 -0
  71. package/rcf/fbs/fbs-196.json +45 -0
  72. package/rcf/fbs/fbs-197.json +41 -0
  73. package/rcf/fbs/fbs-198.json +42 -0
  74. package/rcf/fbs/fbs-199.json +59 -0
  75. package/rcf/fbs/fbs-200.json +46 -0
  76. package/rcf/fbs/fbs-201.json +49 -0
  77. package/rcf/fbs/fbs-202.json +110 -0
  78. package/rcf/fbs/fbs-203.json +100 -0
  79. package/rcf/requirements/req-001.json +2 -1
  80. package/rcf/requirements/req-002.json +3 -2
  81. package/rcf/requirements/req-003.json +2 -1
  82. package/rcf/requirements/req-004.json +2 -1
  83. package/rcf/requirements/req-005.json +2 -1
  84. package/rcf/requirements/req-006.json +2 -1
  85. package/rcf/requirements/req-007.json +2 -1
  86. package/rcf/requirements/req-008.json +2 -1
  87. package/rcf/requirements/req-009.json +2 -1
  88. package/rcf/requirements/req-010.json +5 -2
  89. package/rcf/requirements/req-011.json +2 -1
  90. package/rcf/requirements/req-012.json +2 -1
  91. package/rcf/requirements/req-013.json +2 -1
  92. package/rcf/requirements/req-014.json +2 -1
  93. package/rcf/requirements/req-015.json +2 -1
  94. package/rcf/requirements/req-016.json +5 -2
  95. package/rcf/requirements/req-017.json +6 -2
  96. package/rcf/requirements/req-018.json +5 -2
  97. package/rcf/requirements/req-019.json +5 -2
  98. package/rcf/requirements/req-020.json +5 -2
  99. package/rcf/requirements/req-021.json +5 -2
  100. package/rcf/requirements/req-022.json +5 -2
  101. package/rcf/requirements/req-023.json +6 -4
  102. package/rcf/requirements/req-024.json +5 -2
  103. package/rcf/requirements/req-025.json +5 -2
  104. package/rcf/requirements/req-026.json +5 -2
  105. package/rcf/requirements/req-027.json +5 -2
  106. package/rcf/requirements/req-028.json +5 -2
  107. package/rcf/requirements/req-029.json +5 -2
  108. package/rcf/requirements/req-030.json +5 -2
  109. package/rcf/requirements/req-040.json +5 -2
  110. package/rcf/requirements/req-041.json +5 -2
  111. package/rcf/requirements/req-042.json +5 -2
  112. package/rcf/requirements/req-043.json +5 -2
  113. package/rcf/requirements/req-050.json +5 -2
  114. package/rcf/requirements/req-051.json +5 -2
  115. package/rcf/requirements/req-052.json +5 -2
  116. package/rcf/requirements/req-053.json +5 -2
  117. package/rcf/requirements/req-054.json +5 -2
  118. package/rcf/requirements/req-060.json +5 -2
  119. package/rcf/requirements/req-061.json +5 -2
  120. package/rcf/requirements/req-062.json +5 -2
  121. package/rcf/requirements/req-063.json +5 -2
  122. package/rcf/requirements/req-070.json +5 -2
  123. package/rcf/requirements/req-071.json +5 -2
  124. package/rcf/requirements/req-072.json +5 -2
  125. package/rcf/requirements/req-073.json +5 -2
  126. package/rcf/requirements/req-074.json +5 -2
  127. package/rcf/requirements/req-075.json +5 -2
  128. package/rcf/requirements/req-076.json +5 -2
  129. package/rcf/requirements/req-077.json +5 -2
  130. package/rcf/requirements/req-080.json +5 -2
  131. package/rcf/requirements/req-081.json +5 -2
  132. package/rcf/requirements/req-082.json +5 -2
  133. package/rcf/requirements/req-083.json +5 -2
  134. package/rcf/requirements/req-084.json +5 -2
  135. package/rcf/requirements/req-085.json +5 -2
  136. package/rcf/requirements/req-086.json +5 -2
  137. package/rcf/requirements/req-090.json +5 -2
  138. package/rcf/requirements/req-091.json +5 -2
  139. package/rcf/requirements/req-092.json +5 -2
  140. package/rcf/requirements/req-093.json +5 -2
  141. package/rcf/requirements/req-094.json +5 -2
  142. package/rcf/requirements/req-100.json +5 -2
  143. package/rcf/requirements/req-101.json +5 -2
  144. package/rcf/requirements/req-102.json +5 -2
  145. package/rcf/requirements/req-103.json +5 -2
  146. package/rcf/requirements/req-104.json +5 -2
  147. package/rcf/requirements/req-110.json +5 -2
  148. package/rcf/requirements/req-111.json +5 -2
  149. package/rcf/requirements/req-112.json +5 -2
  150. package/rcf/requirements/req-113.json +5 -2
  151. package/rcf/requirements/req-114.json +5 -2
  152. package/rcf/requirements/req-115.json +5 -2
  153. package/rcf/requirements/req-120.json +5 -2
  154. package/rcf/requirements/req-121.json +5 -2
  155. package/rcf/requirements/req-122.json +5 -2
  156. package/rcf/requirements/req-123.json +5 -2
  157. package/rcf/requirements/req-124.json +5 -2
  158. package/rcf/requirements/req-125.json +5 -2
  159. package/rcf/requirements/req-130.json +6 -2
  160. package/rcf/requirements/req-131.json +6 -2
  161. package/rcf/requirements/req-132.json +6 -2
  162. package/rcf/requirements/req-133.json +6 -2
  163. package/rcf/requirements/req-134.json +6 -2
  164. package/rcf/requirements/req-140.json +5 -2
  165. package/rcf/requirements/req-145.json +5 -2
  166. package/rcf/requirements/req-150.json +6 -2
  167. package/rcf/requirements/req-151.json +6 -2
  168. package/rcf/requirements/req-152.json +6 -2
  169. package/rcf/requirements/req-153.json +6 -2
  170. package/rcf/requirements/req-154.json +5 -2
  171. package/rcf/requirements/req-155.json +4 -1
  172. package/rcf/requirements/req-156.json +4 -1
  173. package/rcf/requirements/req-157.json +4 -1
  174. package/rcf/requirements/req-158.json +4 -1
  175. package/rcf/requirements/req-159.json +4 -1
  176. package/rcf/requirements/req-160.json +4 -1
  177. package/rcf/requirements/req-161.json +4 -1
  178. package/rcf/requirements/req-162.json +4 -1
  179. package/rcf/requirements/req-163.json +5 -2
  180. package/rcf/requirements/req-164.json +5 -2
  181. package/rcf/requirements/req-165.json +5 -2
  182. package/rcf/requirements/req-170.json +33 -0
  183. package/rcf/requirements/req-171.json +44 -0
  184. package/rcf/requirements/req-172.json +25 -0
  185. package/rcf/requirements/req-173.json +25 -0
  186. package/rcf/requirements/req-174.json +31 -0
  187. package/rcf/requirements/req-175.json +31 -0
  188. package/rcf/requirements/req-176.json +25 -0
  189. package/rcf/requirements/req-180.json +31 -0
  190. package/rcf/requirements/req-181.json +31 -0
  191. package/rcf/requirements/req-182.json +25 -0
  192. package/rcf/requirements/req-186.json +25 -0
  193. package/rcf/requirements/req-187.json +31 -0
  194. package/rcf/requirements/req-188.json +25 -0
  195. package/rcf/tacs/tac-4120-define-delta-and-freeze.json +21 -0
  196. package/rcf/tacs/tac-4121-define-ledgers.json +35 -0
  197. package/rcf/tacs/tac-4122-define-gates.json +61 -0
  198. package/rcf/tacs/tac-4123-define-readiness.json +61 -0
  199. package/rcf/tacs/tac-4124-define-freeze.json +28 -0
  200. package/rcf/tacs/tac-4127-readiness-view.json +49 -0
  201. package/rcf/tacs/tac-4128-define-guidance.json +53 -0
  202. package/rcf/tacs/tac-4129-define-questions.json +45 -0
  203. package/rcf/tacs/tac-4130-define-intake-brief.json +35 -0
  204. package/rcf/tacs/tac-4131-build-dag-view.json +39 -0
  205. package/rcf/tacs/tac-4132-id-lookup.json +42 -0
  206. package/rcf/tacs/tac-4133-readiness-po-layer.json +37 -0
  207. package/rcf/tacs/tac-4134-wespa-host-fixture.json +54 -0
  208. package/rcf/test-suites/ts-016.json +3 -3
  209. package/rcf/test-suites/ts-204.json +30 -0
  210. package/rcf/test-suites/ts-205.json +22 -0
  211. package/rcf/test-suites/ts-206.json +22 -0
  212. package/rcf/test-suites/ts-207.json +22 -0
  213. package/rcf/test-suites/ts-208.json +22 -0
  214. package/rcf/test-suites/ts-209.json +22 -0
  215. package/rcf/test-suites/ts-210.json +22 -0
  216. package/rcf/test-suites/ts-211.json +22 -0
  217. package/rcf/test-suites/ts-212.json +22 -0
  218. package/rcf/test-suites/ts-213.json +50 -0
  219. package/rcf/test-suites/ts-214.json +74 -0
  220. package/rcf/test-suites/ts-215.json +211 -0
  221. package/rcf/test-suites/ts-216.json +94 -0
  222. package/rcf/test-suites/ts-217.json +62 -0
  223. package/rcf/test-suites/ts-218.json +78 -0
  224. package/rcf/test-suites/ts-219.json +70 -0
  225. package/rcf/test-suites/ts-220.json +78 -0
  226. package/rcf/test-suites/ts-221.json +78 -0
  227. package/rcf/test-suites/ts-222.json +100 -0
  228. package/rcf/test-suites/ts-223.json +94 -0
  229. package/rcf/test-suites/ts-224.json +70 -0
  230. package/rcf/test-suites/ts-225.json +78 -0
  231. package/rcf/test-suites/ts-226.json +158 -0
  232. package/rcf/test-suites/ts-227.json +38 -0
  233. package/rcf/test-suites/ts-228.json +86 -0
  234. package/rcf/test-suites/ts-229.json +83 -0
  235. package/rcf/user-stories/us-15601.json +4 -4
  236. package/rcf/user-stories/us-17001.json +27 -0
  237. package/rcf/user-stories/us-17002.json +22 -0
  238. package/rcf/user-stories/us-17003.json +22 -0
  239. package/rcf/user-stories/us-17004.json +22 -0
  240. package/rcf/user-stories/us-17005.json +22 -0
  241. package/rcf/user-stories/us-17006.json +21 -0
  242. package/rcf/user-stories/us-17007.json +21 -0
  243. package/rcf/user-stories/us-17008.json +22 -0
  244. package/rcf/user-stories/us-17101.json +22 -0
  245. package/rcf/user-stories/us-17102.json +22 -0
  246. package/rcf/user-stories/us-17201.json +38 -0
  247. package/rcf/user-stories/us-17301.json +38 -0
  248. package/rcf/user-stories/us-17302.json +50 -0
  249. package/rcf/user-stories/us-17401.json +70 -0
  250. package/rcf/user-stories/us-17402.json +55 -0
  251. package/rcf/user-stories/us-17403.json +60 -0
  252. package/rcf/user-stories/us-17501.json +48 -0
  253. package/rcf/user-stories/us-17502.json +60 -0
  254. package/rcf/user-stories/us-17503.json +65 -0
  255. package/rcf/user-stories/us-17601.json +58 -0
  256. package/rcf/user-stories/us-18001.json +55 -0
  257. package/rcf/user-stories/us-18002.json +35 -0
  258. package/rcf/user-stories/us-18101.json +35 -0
  259. package/rcf/user-stories/us-18202.json +40 -0
  260. package/rcf/user-stories/us-18601.json +55 -0
  261. package/rcf/user-stories/us-18602.json +50 -0
  262. package/rcf/user-stories/us-18603.json +45 -0
  263. package/rcf/user-stories/us-18701.json +50 -0
  264. package/rcf/user-stories/us-18702.json +50 -0
  265. package/rcf/user-stories/us-18801.json +45 -0
  266. package/rcf/user-stories/us-204.json +59 -0
  267. package/rcf/user-stories/us-205.json +64 -0
  268. package/rcf/user-stories/us-206.json +54 -0
  269. package/releases/releases.yaml +31 -1
  270. package/src/cli/feedback.js +126 -10
  271. package/src/cli/freeze.js +730 -0
  272. package/src/cli/help.js +23 -0
  273. package/src/cli/ledger.js +615 -0
  274. package/src/cli/questions.js +288 -0
  275. package/src/cli/readiness.js +498 -0
  276. package/src/cli/view.js +29 -0
  277. package/src/core/store/writer.js +86 -6
  278. package/src/define/freeze-record.js +247 -0
  279. package/src/define/ledgers.js +712 -0
  280. package/src/feedback/redact.js +105 -19
  281. package/src/intake/index.js +1 -1
  282. package/src/intake/orchestrator.js +117 -0
  283. package/src/mcp/tools.js +354 -0
  284. package/src/query/delta.js +282 -0
  285. package/src/query/gates.js +1107 -0
  286. package/src/query/index.js +50 -0
  287. package/src/query/questions.js +438 -0
  288. package/src/query/readiness.js +574 -0
  289. package/src/server/index.js +60 -1
  290. package/src/server/routes.js +133 -4
  291. package/src/setup/identity-seed.js +17 -0
  292. package/src/view/build-dag.js +563 -0
  293. package/src/view/components/badge.js +41 -0
  294. package/src/view/components/diff.js +72 -0
  295. package/src/view/components/doc-row.js +62 -0
  296. package/src/view/components/empty-state.js +35 -0
  297. package/src/view/components/entity-selector.js +137 -0
  298. package/src/view/components/filter-bar.js +97 -0
  299. package/src/view/components/findings-list.js +49 -0
  300. package/src/view/components/index.js +12 -0
  301. package/src/view/components/pill.js +46 -0
  302. package/src/view/components/sub-tab-strip.js +43 -0
  303. package/src/view/components/toast.js +25 -0
  304. package/src/view/components-fixture.js +265 -0
  305. package/src/view/doc-renderers/architecture.js +304 -0
  306. package/src/view/doc-renderers/build.js +160 -0
  307. package/src/view/doc-renderers/helpers.js +2 -2
  308. package/src/view/doc-renderers/index.js +2 -0
  309. package/src/view/doc-renderers/prd.js +35 -6
  310. package/src/view/doc-renderers/req.js +10 -2
  311. package/src/view/doc-renderers/user-story.js +10 -5
  312. package/src/view/html-page.js +717 -300
  313. package/src/view/index.js +109 -3
  314. package/src/view/live-client.js +61 -8
  315. package/src/view/needs-work.js +79 -0
  316. package/src/view/page-init.js +2193 -0
  317. package/src/view/product-map.js +751 -0
  318. package/src/view/readiness/phrasebook.js +115 -0
  319. package/src/view/readiness/po-layer.js +288 -0
  320. package/src/view/readiness/question-adapter.js +329 -0
  321. package/src/view/readiness/stage-legend.js +71 -0
  322. package/src/view/readiness.js +505 -0
  323. package/src/view/style.css +2279 -266
  324. package/src/view/test-host/embed-client.js +121 -0
  325. package/src/view/test-host/fixture.js +183 -0
  326. package/src/view/test-host/lints.js +220 -0
  327. package/src/view/view-index.js +323 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T10:18:25.373Z",
3
- "updatedAt": "2026-09-07T10:20:10.276Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-051",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-1 typed put get delete list verbs with metadata field pattern realise the Workers KV binding shape behind the facade",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T10:18:25.402Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:platform-integrations"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T10:18:25.579Z",
3
- "updatedAt": "2026-09-07T10:20:10.276Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-052",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-1 cache-aside helper reads local first falls back to origin and writes back with elicited TTL floor 1 second",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T10:18:25.608Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:platform-integrations"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T10:18:25.784Z",
3
- "updatedAt": "2026-09-07T10:20:10.276Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-053",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-1 lifecycle events facadeReady kvHit kvMiss kvWrite carry metadata-only fields key size ttl timestamp",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T10:18:25.813Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:platform-integrations"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T10:18:25.999Z",
3
- "updatedAt": "2026-09-07T10:20:10.276Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-054",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-1 eventual-consistency note in the guide: a write may not appear on a global read within the same request and the elicited TTL sets the staleness ceiling",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T10:18:26.039Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:platform-integrations"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T12:26:47.779Z",
3
- "updatedAt": "2026-09-07T12:26:47.813Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "description": "T-2 platform-cloudflare-cron-triggers v1.0.0: one scheduled() handler in the applied project source tree is the SOLE reader of the Cloudflare Workers Cron Trigger event (the event handler shape documented at https://developers.cloudflare.com/workers/configuration/cron-triggers/). The handler binds on boot, wires the dispatcher (REQ-061) and the event sink (per TAC-3303), and emits a cronReady lifecycle event on the injected sink with a metadata-only payload. Chain: HQ round-6 T-2 reserved-block per HQ chain-block ruling 2026-09-07T12:25Z.",
5
5
  "category": "functional",
6
6
  "domain": "platform",
@@ -16,5 +16,8 @@
16
16
  ],
17
17
  "reason": "keyword-scan",
18
18
  "classifiedAt": "2026-09-07T12:26:47.812Z"
19
- }
19
+ },
20
+ "tags": [
21
+ "capability:platform-integrations"
22
+ ]
20
23
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T12:26:47.991Z",
3
- "updatedAt": "2026-09-07T12:28:41.280Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "description": "T-2 platform-cloudflare-cron-triggers v1.0.0: the dispatcher module accepts an ordered map of cron-expression to handler pairs and, on every scheduled() invocation, matches the incoming Cron Trigger event's cron expression against the map and routes exactly to the matched handler. An unmatched expression records an unmatchedExpression event on the sink and the scheduled invocation returns without side effect. The routed handler receives a bounded context {expression, scheduledTime, sink} so its own emissions can be attributed. Chain: HQ round-6 T-2 reserved-block per HQ chain-block ruling 2026-09-07T12:25Z.",
5
5
  "category": "functional",
6
6
  "domain": "platform",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T12:29:00.000Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:platform-integrations"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T12:26:48.199Z",
3
- "updatedAt": "2026-09-07T12:26:48.232Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "description": "T-2 platform-cloudflare-cron-triggers v1.0.0: an elicited skew-tolerance window (default 30 seconds per ADR-3303; floor 5s, ceiling 5 minutes) governs how the dispatcher classifies a fire. If the observed handler start time is within the window of the event's scheduledTime, the fire's outcome is onTime and a cronFired event carries {expression, scheduledTime, outcome: onTime, duration}. If the observed start is outside the window, a cronSkewed event fires with the delta (observed minus scheduled, in milliseconds) and the outcome is skewed; the handler still runs. Chain: HQ round-6 T-2 reserved-block per HQ chain-block ruling 2026-09-07T12:25Z.",
5
5
  "category": "functional",
6
6
  "domain": "platform",
@@ -16,5 +16,8 @@
16
16
  ],
17
17
  "reason": "keyword-scan",
18
18
  "classifiedAt": "2026-09-07T12:26:48.230Z"
19
- }
19
+ },
20
+ "tags": [
21
+ "capability:platform-integrations"
22
+ ]
20
23
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T12:26:48.409Z",
3
- "updatedAt": "2026-09-07T12:26:48.442Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "description": "T-2 platform-cloudflare-cron-triggers v1.0.0: an elicited soft-budget duration (default 30 seconds per elicited answer, no floor) governs when a running handler is flagged as stalled. The dispatcher never terminates a handler on soft-budget breach (Cloudflare's platform concern is the sole terminator); it fires a cronStalled event with metadata-only payload {expression, scheduledTime, outcome: stalled, duration, softBudgetMs} at the moment the observed duration crosses the budget and lets the handler continue. Every scheduled-side event record on the sink carries only {expression, scheduledTime, outcome, duration} plus the event tag; handler input closures, PII fields and body bytes never cross the sink boundary. Chain: HQ round-6 T-2 reserved-block per HQ chain-block ruling 2026-09-07T12:25Z.",
5
5
  "category": "functional",
6
6
  "domain": "platform",
@@ -16,5 +16,8 @@
16
16
  ],
17
17
  "reason": "keyword-scan",
18
18
  "classifiedAt": "2026-09-07T12:26:48.441Z"
19
- }
19
+ },
20
+ "tags": [
21
+ "capability:platform-integrations"
22
+ ]
20
23
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T14:11:36.742Z",
3
- "updatedAt": "2026-09-07T14:13:26.508Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-070",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-3 platform-cloudflare-durable-objects v1.0.0 blueprint: the DO facade is the sole reader of env.CELL and env.HUB and opens on boot with namespaceReady",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T14:11:36.775Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:platform-integrations"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T14:11:36.953Z",
3
- "updatedAt": "2026-09-07T14:13:26.508Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-071",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-3 single-cell shape exposes typed domain verbs and serialises concurrent invocations per instance",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T14:11:36.986Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:platform-integrations"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T14:11:37.164Z",
3
- "updatedAt": "2026-09-07T14:13:26.508Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-072",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-3 storage API provides typed put/get/delete on the object with an elicited backend (SQL or KV)",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T14:11:37.197Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:platform-integrations"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T14:11:37.377Z",
3
- "updatedAt": "2026-09-07T14:13:26.508Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-073",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-3 alarm surface fires alarm() exactly once per scheduled time and doAlarmFired carries objectName and scheduledTime",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T14:11:37.412Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:platform-integrations"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T14:11:37.592Z",
3
- "updatedAt": "2026-09-07T14:13:26.508Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-074",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-3 hibernatable WebSocket hub accepts clients via state.acceptWebSocket and the wake handler runs from cold reading the same storage",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T14:11:37.625Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:platform-integrations"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T14:11:37.805Z",
3
- "updatedAt": "2026-09-07T14:13:26.508Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-075",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-3 lifecycle events fire at namespace and object level with metadata-only payloads",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T14:11:37.838Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:platform-integrations"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T14:11:38.018Z",
3
- "updatedAt": "2026-09-07T14:13:26.508Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-076",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-3 sole-reader guarantee enforced by AST scan: no non-facade module imports env.CELL or env.HUB",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T14:11:38.051Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:platform-integrations"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T14:11:38.243Z",
3
- "updatedAt": "2026-09-07T14:13:26.508Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-077",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-3 migration-safe class exports: stable class names committed to wrangler with a paired [[migrations]] block",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T14:11:38.275Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:platform-integrations"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T16:49:01.509Z",
3
- "updatedAt": "2026-09-07T17:14:19.059Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-080",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-4 edge-cloudflare-access v1.0.0 blueprint: the Access JWT validator is the sole reader of the Cf-Access-Jwt-Assertion header and reduces principal onto request.auth",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T16:49:01.543Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:edge-security"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T16:49:11.871Z",
3
- "updatedAt": "2026-09-07T17:14:19.252Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-081",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-4 edge-cloudflare-access v1.0.0: an Access application is declared with an elicited hostname or self-hosted-app id and an elicited policy shape from the enum",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T16:49:11.906Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:edge-security"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T16:49:12.089Z",
3
- "updatedAt": "2026-09-07T17:14:19.438Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-082",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-4 edge-cloudflare-access v1.0.0: the operator issues a Zero Trust policy via the dashboard or the API path documented in the guide",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T16:49:12.123Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:edge-security"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T16:49:12.304Z",
3
- "updatedAt": "2026-09-07T17:14:19.647Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-083",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-4 edge-cloudflare-access v1.0.0: the audit event carries metadata-only fields email, outcome, timestamp and path with no token value or headers",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T16:49:12.339Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:edge-security"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T16:49:12.520Z",
3
- "updatedAt": "2026-09-07T17:14:19.838Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-084",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-4 edge-cloudflare-access v1.0.0: break-glass posture with an elicited bypass-service-auth token pair for CI-signed automation",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T16:49:12.555Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:edge-security"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T16:49:12.737Z",
3
- "updatedAt": "2026-09-07T17:14:20.026Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-085",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-4 edge-cloudflare-access v1.0.0: the composition with application-admin-console flips the sign-in surface when the applied capability set contains zeroTrustGate",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T16:49:12.772Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:edge-security"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T16:49:12.954Z",
3
- "updatedAt": "2026-09-07T17:14:20.211Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "reqId": "REQ-086",
5
5
  "prdId": "PRD-001",
6
6
  "title": "T-4 application-admin-console v1.1.0 minor: consume zeroTrustGate optionally, replacing the local sign-in form with an Access-gated surface when the capability is applied",
@@ -14,5 +14,8 @@
14
14
  "shapes": [],
15
15
  "reason": "content-pending",
16
16
  "classifiedAt": "2026-09-07T16:49:12.990Z"
17
- }
17
+ },
18
+ "tags": [
19
+ "capability:edge-security"
20
+ ]
18
21
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T19:54:00.724Z",
3
- "updatedAt": "2026-09-07T20:18:17.227Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "description": "The applying project reaches Cloudflare Turnstile through a client widget mount that renders on elicited surfaces using the elicited TURNSTILE_SITEKEY. The mount injects only Cloudflare Turnstile JS (challenges.cloudflare.com/turnstile/v0/api.js) and no other third-party script. On submit the widget populates a hidden Cf-Turnstile-Response token field in the form payload. Chain: HQ round-6 T-5 reserved-block per HQ chain-block ruling 2026-09-07 (REQ-090..099 / US-90xx..94xx / TS-120..129 / FBS-110..119 / CN-350..379).",
5
5
  "reqId": "REQ-090",
6
6
  "prdId": "PRD-001",
@@ -40,5 +40,8 @@
40
40
  "match": "form"
41
41
  }
42
42
  ]
43
- }
43
+ },
44
+ "tags": [
45
+ "capability:edge-security"
46
+ ]
44
47
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T19:54:00.947Z",
3
- "updatedAt": "2026-09-07T20:18:17.412Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "description": "The applying project verifies every Turnstile response token server-side by POSTing {secret: TURNSTILE_SECRET, response: <token>} to https://challenges.cloudflare.com/turnstile/v0/siteverify per Cloudflare Turnstile documented endpoint. On success:true the handler proceeds; on success:false the handler rejects with 400 and the refusal body carries the error-codes[] value, not the sitekey or secret.",
5
5
  "reqId": "REQ-091",
6
6
  "prdId": "PRD-001",
@@ -49,5 +49,8 @@
49
49
  "match": "endpoint"
50
50
  }
51
51
  ]
52
- }
52
+ },
53
+ "tags": [
54
+ "capability:edge-security"
55
+ ]
53
56
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T19:54:01.170Z",
3
- "updatedAt": "2026-09-07T20:18:17.597Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "description": "The applying project registers a token-required guard at every elicited surface. A submit whose payload lacks the Cf-Turnstile-Response field is rejected with 400 before any downstream handler runs. The refusal body carries a stable error-code, not the sitekey.",
5
5
  "reqId": "REQ-092",
6
6
  "prdId": "PRD-001",
@@ -28,5 +28,8 @@
28
28
  "match": "token"
29
29
  }
30
30
  ]
31
- }
31
+ },
32
+ "tags": [
33
+ "capability:edge-security"
34
+ ]
32
35
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T19:54:01.402Z",
3
- "updatedAt": "2026-09-07T20:18:17.783Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "description": "When both security-auth-magic-link and edge-cloudflare-turnstile are applied, the magic-link mint surface reads through the Turnstile guard: a mint submit without a valid Turnstile response is refused with 400 before the mint fires. Composition uses the TAC-3603 hook on the shipped magic-link mint surface.",
5
5
  "reqId": "REQ-093",
6
6
  "prdId": "PRD-001",
@@ -48,5 +48,8 @@
48
48
  "match": "magic-link"
49
49
  }
50
50
  ]
51
- }
51
+ },
52
+ "tags": [
53
+ "capability:edge-security"
54
+ ]
52
55
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T19:54:01.626Z",
3
- "updatedAt": "2026-09-07T20:18:17.970Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "description": "The applying operator elicits one of Cloudflare Turnstile documented widget modes: managed (default; renders challenge only when Cloudflare deems it necessary), non-interactive (always renders a non-interactive challenge) or invisible (mounts an invisible widget). The default mode is managed per the shipped ADR.",
5
5
  "reqId": "REQ-094",
6
6
  "prdId": "PRD-001",
@@ -28,5 +28,8 @@
28
28
  "match": "renders"
29
29
  }
30
30
  ]
31
- }
31
+ },
32
+ "tags": [
33
+ "capability:edge-security"
34
+ ]
32
35
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T21:38:51.465Z",
3
- "updatedAt": "2026-09-07T23:05:23.440Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "description": "The applying project holds its rate-limit rule set as a set of JSON documents under the elicited rate-limit-rules-dir (default cloudflare/rate-limits/), one file per rule per ADR-3703. Every manifest file declares the seven documented fields the Cloudflare WAF rate-limiting rules contract names per https://developers.cloudflare.com/waf/rate-limiting-rules/: id, expression, threshold, period, characteristics, action, duration. The zone id is elicited and stored via secretsManagement; no rule references a secret in plaintext. Chain: HQ round-6 T-6 reserved-block per HQ chain-block ruling 2026-09-07 (REQ-100..109 / TS-130..139 / FBS-120..129 / CN-380..409). Round-6 T-6 track of Cloudflare-round-6-spec-2026-09-06 section 5.6.",
5
5
  "reqId": "REQ-100",
6
6
  "prdId": "PRD-001",
@@ -9,5 +9,8 @@
9
9
  "domain": "functional",
10
10
  "priority": "must",
11
11
  "version": "0.1.0",
12
- "status": "draft"
12
+ "status": "draft",
13
+ "tags": [
14
+ "capability:edge-security"
15
+ ]
13
16
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T21:38:51.792Z",
3
- "updatedAt": "2026-09-07T23:05:23.637Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "description": "The blueprint ships no committed script that writes rules to the live Cloudflare zone. The applying project's operator applies each rule via a documented wrangler command flow or a Cloudflare dashboard flow per TAC-3702 and the guide. The elicited rate-limit-management-surface value records the flow the operator chose; the guide covers both. Chain: HQ round-6 T-6 reserved-block per HQ chain-block ruling 2026-09-07.",
5
5
  "reqId": "REQ-101",
6
6
  "prdId": "PRD-001",
@@ -9,5 +9,8 @@
9
9
  "domain": "functional",
10
10
  "priority": "must",
11
11
  "version": "0.1.0",
12
- "status": "draft"
12
+ "status": "draft",
13
+ "tags": [
14
+ "capability:edge-security"
15
+ ]
13
16
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T21:38:52.126Z",
3
- "updatedAt": "2026-09-07T23:05:23.824Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "description": "Given a rule that permits N requests per period on a characteristic set, when a client sends the (N+1)th request within that period, Cloudflare refuses the request at the edge for the elicited duration. The refusal response is HTTP 429 with a Retry-After header consistent with the elicited duration and a Cf-Ray header identifying the CF edge per https://developers.cloudflare.com/waf/rate-limiting-rules/. The origin Worker never sees the refused requests. Chain: HQ round-6 T-6 reserved-block per HQ chain-block ruling 2026-09-07.",
5
5
  "reqId": "REQ-102",
6
6
  "prdId": "PRD-001",
@@ -9,5 +9,8 @@
9
9
  "domain": "functional",
10
10
  "priority": "must",
11
11
  "version": "0.1.0",
12
- "status": "draft"
12
+ "status": "draft",
13
+ "tags": [
14
+ "capability:edge-security"
15
+ ]
13
16
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T21:38:52.452Z",
3
- "updatedAt": "2026-09-07T23:05:24.011Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "description": "The blueprint ships a scheduled drift-audit runner (TAC-3703) the applying project can wire behind the elicited rate-limit-drift-audit-cadence per ADR-3704. When enabled, the runner fetches the live rate-limiting rules on the elicited zone via the Cloudflare API, diffs against the local manifest, and constructs one drift-audit record per mismatched rule. Records write through the applied logger with the metadata-only shape {ruleId, clientIpHash, outcome, timestamp, diff}; no record carries a full IP, a request body or a user agent. Chain: HQ round-6 T-6 reserved-block per HQ chain-block ruling 2026-09-07.",
5
5
  "reqId": "REQ-103",
6
6
  "prdId": "PRD-001",
@@ -9,5 +9,8 @@
9
9
  "domain": "functional",
10
10
  "priority": "must",
11
11
  "version": "0.1.0",
12
- "status": "draft"
12
+ "status": "draft",
13
+ "tags": [
14
+ "capability:edge-security"
15
+ ]
13
16
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T21:38:52.795Z",
3
- "updatedAt": "2026-09-07T23:05:24.201Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
4
  "description": "When both edge-cloudflare-rate-limiting and security-auth-magic-link are applied on the same project, the zone-level rate rule sits at the CF edge and refuses the (N+1)th request for the elicited duration before it reaches the origin; the security-auth-magic-link per-email application rate limiter continues to run at the mint-surface. The two rules operate on different characteristic sets (IP-per-URL vs per-email per-minute) and are additive. ADR-3702 records the layering. Chain: HQ round-6 T-6 reserved-block per HQ chain-block ruling 2026-09-07.",
5
5
  "reqId": "REQ-104",
6
6
  "prdId": "PRD-001",
@@ -9,5 +9,8 @@
9
9
  "domain": "functional",
10
10
  "priority": "must",
11
11
  "version": "0.1.0",
12
- "status": "draft"
12
+ "status": "draft",
13
+ "tags": [
14
+ "capability:edge-security"
15
+ ]
13
16
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "createdAt": "2026-09-07T23:53:24.739Z",
3
- "updatedAt": "2026-09-07T23:53:41.232Z",
3
+ "updatedAt": "2026-09-22T13:47:34.538Z",
4
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
5
  "reqId": "REQ-110",
6
6
  "prdId": "PRD-001",
@@ -54,5 +54,8 @@
54
54
  "match": "api"
55
55
  }
56
56
  ]
57
- }
57
+ },
58
+ "tags": [
59
+ "capability:deploy"
60
+ ]
58
61
  }