rcf-lite 0.0.1 → 0.8.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 (349) hide show
  1. package/CHANGELOG.md +344 -0
  2. package/LICENSE +202 -0
  3. package/README.md +92 -4
  4. package/bin/rcf-verify.js +122 -0
  5. package/bin/rcf.js +174 -0
  6. package/bin/view-supervisor-child.mjs +14 -0
  7. package/fixtures/canary-manifest.json +103 -0
  8. package/guidance/README.md +25 -0
  9. package/guidance/build-cycle-playbook.md +492 -0
  10. package/guidance/build-cycle.md +40 -0
  11. package/guidance/document-model.md +45 -0
  12. package/guidance/elicitation-playbook.md +442 -0
  13. package/guidance/harness-template.md +246 -0
  14. package/guidance/managed/README.md +63 -0
  15. package/guidance/managed/agent-instructions-block.hash +1 -0
  16. package/guidance/managed/agent-instructions-block.md +220 -0
  17. package/guidance/managed/legacy-fragment-hashes.json +22 -0
  18. package/guidance/manifest.json +21 -0
  19. package/guidance/overview.md +48 -0
  20. package/guidance/persona-programme.md +44 -0
  21. package/package.json +71 -8
  22. package/rcf/adrs/adr-001.json +25 -0
  23. package/rcf/adrs/adr-002.json +25 -0
  24. package/rcf/adrs/adr-003.json +25 -0
  25. package/rcf/adrs/adr-004.json +20 -0
  26. package/rcf/adrs/adr-005.json +20 -0
  27. package/rcf/adrs/adr-006.json +25 -0
  28. package/rcf/adrs/adr-007.json +25 -0
  29. package/rcf/adrs/adr-008.json +25 -0
  30. package/rcf/adrs/adr-009.json +25 -0
  31. package/rcf/build-sequence.json +11 -0
  32. package/rcf/code-nodes/cn-001.json +14 -0
  33. package/rcf/code-nodes/cn-002.json +14 -0
  34. package/rcf/code-nodes/cn-003.json +15 -0
  35. package/rcf/code-nodes/cn-004.json +17 -0
  36. package/rcf/code-nodes/cn-005.json +19 -0
  37. package/rcf/code-nodes/cn-006.json +17 -0
  38. package/rcf/code-nodes/cn-007.json +16 -0
  39. package/rcf/code-nodes/cn-008.json +19 -0
  40. package/rcf/code-nodes/cn-009.json +16 -0
  41. package/rcf/code-nodes/cn-010.json +18 -0
  42. package/rcf/code-nodes/cn-011.json +18 -0
  43. package/rcf/code-nodes/cn-012.json +18 -0
  44. package/rcf/code-nodes/cn-013.json +19 -0
  45. package/rcf/code-nodes/cn-014.json +16 -0
  46. package/rcf/code-nodes/cn-015.json +16 -0
  47. package/rcf/code-nodes/cn-016.json +16 -0
  48. package/rcf/code-nodes/cn-017.json +16 -0
  49. package/rcf/code-nodes/cn-018.json +15 -0
  50. package/rcf/code-nodes/cn-019.json +16 -0
  51. package/rcf/code-nodes/cn-020.json +16 -0
  52. package/rcf/code-nodes/cn-021.json +16 -0
  53. package/rcf/code-nodes/cn-022.json +16 -0
  54. package/rcf/code-nodes/cn-023.json +16 -0
  55. package/rcf/code-nodes/cn-024.json +16 -0
  56. package/rcf/code-nodes/cn-025.json +16 -0
  57. package/rcf/code-nodes/cn-026.json +16 -0
  58. package/rcf/code-nodes/cn-027.json +16 -0
  59. package/rcf/code-nodes/cn-028.json +16 -0
  60. package/rcf/code-nodes/cn-029.json +19 -0
  61. package/rcf/code-nodes/cn-030.json +14 -0
  62. package/rcf/code-nodes/cn-031.json +14 -0
  63. package/rcf/code-nodes/cn-032.json +14 -0
  64. package/rcf/code-nodes/cn-033.json +14 -0
  65. package/rcf/code-nodes/cn-034.json +14 -0
  66. package/rcf/code-nodes/cn-035.json +14 -0
  67. package/rcf/code-nodes/cn-036.json +14 -0
  68. package/rcf/code-nodes/cn-037.json +14 -0
  69. package/rcf/code-nodes/cn-038.json +14 -0
  70. package/rcf/code-nodes/cn-039.json +14 -0
  71. package/rcf/code-nodes/cn-040.json +14 -0
  72. package/rcf/code-nodes/cn-041.json +14 -0
  73. package/rcf/code-nodes/cn-042.json +14 -0
  74. package/rcf/code-nodes/cn-043.json +14 -0
  75. package/rcf/code-nodes/cn-044.json +14 -0
  76. package/rcf/code-nodes/cn-045.json +14 -0
  77. package/rcf/code-nodes/cn-046.json +14 -0
  78. package/rcf/code-nodes/cn-047.json +14 -0
  79. package/rcf/code-nodes/cn-048.json +14 -0
  80. package/rcf/code-nodes/cn-049.json +14 -0
  81. package/rcf/code-nodes/cn-050.json +14 -0
  82. package/rcf/code-nodes/cn-051.json +14 -0
  83. package/rcf/code-nodes/cn-052.json +14 -0
  84. package/rcf/code-nodes/cn-053.json +14 -0
  85. package/rcf/code-nodes/cn-054.json +14 -0
  86. package/rcf/code-nodes/cn-055.json +14 -0
  87. package/rcf/code-nodes/cn-056.json +14 -0
  88. package/rcf/code-nodes/cn-057.json +14 -0
  89. package/rcf/fbs/fbs-001.json +49 -0
  90. package/rcf/fbs/fbs-002.json +42 -0
  91. package/rcf/fbs/fbs-003.json +37 -0
  92. package/rcf/fbs/fbs-004.json +39 -0
  93. package/rcf/fbs/fbs-005.json +38 -0
  94. package/rcf/fbs/fbs-006.json +48 -0
  95. package/rcf/fbs/fbs-007.json +39 -0
  96. package/rcf/fbs/fbs-008.json +40 -0
  97. package/rcf/fbs/fbs-009.json +36 -0
  98. package/rcf/fbs/fbs-010.json +41 -0
  99. package/rcf/fbs/fbs-011.json +36 -0
  100. package/rcf/fbs/fbs-012.json +46 -0
  101. package/rcf/fbs/fbs-013.json +42 -0
  102. package/rcf/fbs/fbs-014.json +49 -0
  103. package/rcf/fbs/fbs-015.json +32 -0
  104. package/rcf/manifest.json +17 -0
  105. package/rcf/prd.json +47 -0
  106. package/rcf/requirements/req-001.json +19 -0
  107. package/rcf/requirements/req-002.json +19 -0
  108. package/rcf/requirements/req-003.json +19 -0
  109. package/rcf/requirements/req-004.json +19 -0
  110. package/rcf/requirements/req-005.json +19 -0
  111. package/rcf/requirements/req-006.json +19 -0
  112. package/rcf/requirements/req-007.json +19 -0
  113. package/rcf/requirements/req-008.json +19 -0
  114. package/rcf/requirements/req-009.json +19 -0
  115. package/rcf/tacs/tac-001.json +45 -0
  116. package/rcf/tacs/tac-002.json +109 -0
  117. package/rcf/tacs/tac-003.json +40 -0
  118. package/rcf/tacs/tac-004.json +51 -0
  119. package/rcf/tacs/tac-005.json +52 -0
  120. package/rcf/tacs/tac-006.json +104 -0
  121. package/rcf/tacs/tac-007.json +38 -0
  122. package/rcf/tacs/tac-008.json +51 -0
  123. package/rcf/tad.json +51 -0
  124. package/rcf/test-suites/PENDING.md +23 -0
  125. package/rcf/test-suites/ts-001.json +38 -0
  126. package/rcf/test-suites/ts-002.json +38 -0
  127. package/rcf/test-suites/ts-003.json +43 -0
  128. package/rcf/test-suites/ts-004.json +44 -0
  129. package/rcf/test-suites/ts-005.json +30 -0
  130. package/rcf/test-suites/ts-006.json +36 -0
  131. package/rcf/test-suites/ts-007.json +43 -0
  132. package/rcf/test-suites/ts-008.json +37 -0
  133. package/rcf/test-suites/ts-009.json +38 -0
  134. package/rcf/test-suites/ts-010.json +38 -0
  135. package/rcf/test-suites/ts-011.json +44 -0
  136. package/rcf/test-suites/ts-012.json +36 -0
  137. package/rcf/test-suites/ts-013.json +38 -0
  138. package/rcf/test-suites/ts-014.json +38 -0
  139. package/rcf/test-suites/ts-015.json +38 -0
  140. package/rcf/test-suites/ts-016.json +37 -0
  141. package/rcf/test-suites/ts-017.json +38 -0
  142. package/rcf/test-suites/ts-018.json +38 -0
  143. package/rcf/test-suites/ts-019.json +37 -0
  144. package/rcf/test-suites/ts-020.json +46 -0
  145. package/rcf/test-suites/ts-021.json +46 -0
  146. package/rcf/test-suites/ts-022.json +46 -0
  147. package/rcf/test-suites/ts-023.json +46 -0
  148. package/rcf/test-suites/ts-024.json +46 -0
  149. package/rcf/test-suites/ts-025.json +52 -0
  150. package/rcf/user-stories/us-101.json +40 -0
  151. package/rcf/user-stories/us-102.json +40 -0
  152. package/rcf/user-stories/us-201.json +40 -0
  153. package/rcf/user-stories/us-202.json +40 -0
  154. package/rcf/user-stories/us-203.json +32 -0
  155. package/rcf/user-stories/us-301.json +40 -0
  156. package/rcf/user-stories/us-302.json +40 -0
  157. package/rcf/user-stories/us-303.json +40 -0
  158. package/rcf/user-stories/us-304.json +40 -0
  159. package/rcf/user-stories/us-401.json +40 -0
  160. package/rcf/user-stories/us-402.json +40 -0
  161. package/rcf/user-stories/us-403.json +40 -0
  162. package/rcf/user-stories/us-501.json +40 -0
  163. package/rcf/user-stories/us-502.json +40 -0
  164. package/rcf/user-stories/us-503.json +40 -0
  165. package/rcf/user-stories/us-601.json +40 -0
  166. package/rcf/user-stories/us-602.json +40 -0
  167. package/rcf/user-stories/us-701.json +40 -0
  168. package/rcf/user-stories/us-702.json +40 -0
  169. package/rcf/user-stories/us-801.json +49 -0
  170. package/rcf/user-stories/us-802.json +49 -0
  171. package/rcf/user-stories/us-803.json +49 -0
  172. package/rcf/user-stories/us-804.json +49 -0
  173. package/rcf/user-stories/us-805.json +49 -0
  174. package/rcf/user-stories/us-901.json +40 -0
  175. package/src/.gitkeep +0 -0
  176. package/src/admissibility/enforce.js +142 -0
  177. package/src/admissibility/index.js +8 -0
  178. package/src/admissibility/markers.js +104 -0
  179. package/src/admissibility/scope-lint.js +163 -0
  180. package/src/browser-verify/auth-smoke.js +109 -0
  181. package/src/browser-verify/index.js +29 -0
  182. package/src/browser-verify/invariants.js +336 -0
  183. package/src/browser-verify/manifest-writer.js +189 -0
  184. package/src/browser-verify/runner.js +171 -0
  185. package/src/build/bundle.js +198 -0
  186. package/src/build/formatters/json.js +18 -0
  187. package/src/build/formatters/markdown.js +406 -0
  188. package/src/build/index.js +14 -0
  189. package/src/build/mark.js +177 -0
  190. package/src/build/queue.js +285 -0
  191. package/src/cli/browser-verify.js +231 -0
  192. package/src/cli/build.js +584 -0
  193. package/src/cli/coverage.js +219 -0
  194. package/src/cli/create.js +358 -0
  195. package/src/cli/delete.js +127 -0
  196. package/src/cli/design.js +353 -0
  197. package/src/cli/doctor.js +548 -0
  198. package/src/cli/fbs.js +171 -0
  199. package/src/cli/finalise.js +377 -0
  200. package/src/cli/guidance.js +206 -0
  201. package/src/cli/help.js +156 -0
  202. package/src/cli/impact.js +119 -0
  203. package/src/cli/init.js +282 -0
  204. package/src/cli/intake.js +153 -0
  205. package/src/cli/link.js +128 -0
  206. package/src/cli/mcp.js +160 -0
  207. package/src/cli/preflight.js +220 -0
  208. package/src/cli/read.js +168 -0
  209. package/src/cli/req-baseline.js +269 -0
  210. package/src/cli/req-classify.js +135 -0
  211. package/src/cli/review.js +295 -0
  212. package/src/cli/test-suite.js +221 -0
  213. package/src/cli/trace.js +172 -0
  214. package/src/cli/ui-baseline.js +292 -0
  215. package/src/cli/ui-classify.js +108 -0
  216. package/src/cli/update.js +197 -0
  217. package/src/cli/validate.js +168 -0
  218. package/src/cli/view.js +452 -0
  219. package/src/core/baseline-catalog/data/auth.json +42 -0
  220. package/src/core/baseline-catalog/data/http-api.json +42 -0
  221. package/src/core/baseline-catalog/data/notifications.json +33 -0
  222. package/src/core/baseline-catalog/data/persistence.json +33 -0
  223. package/src/core/baseline-catalog/data/web-ui.json +60 -0
  224. package/src/core/baseline-catalog/index.js +121 -0
  225. package/src/core/errors/index.js +167 -0
  226. package/src/core/fixtures/register-canary/canary-prompt-01.json +18 -0
  227. package/src/core/fixtures/register-canary/canary-prompt-02.json +21 -0
  228. package/src/core/fixtures/register-canary/canary-prompt-03.json +17 -0
  229. package/src/core/isolation/index.js +60 -0
  230. package/src/core/mcp/framing.js +103 -0
  231. package/src/core/mcp/index.js +8 -0
  232. package/src/core/mcp/server.js +228 -0
  233. package/src/core/patterns/register-canary.js +209 -0
  234. package/src/core/patterns/req-shapes.js +158 -0
  235. package/src/core/patterns/services.js +358 -0
  236. package/src/core/patterns/ui-shapes.js +166 -0
  237. package/src/core/store/cn-resolve.js +134 -0
  238. package/src/core/store/derive-deps.js +93 -0
  239. package/src/core/store/ids.js +78 -0
  240. package/src/core/store/index.js +20 -0
  241. package/src/core/store/init.js +255 -0
  242. package/src/core/store/loader.js +214 -0
  243. package/src/core/store/tp-resolve.js +176 -0
  244. package/src/core/store/validator.js +191 -0
  245. package/src/core/store/walker.js +944 -0
  246. package/src/core/store/writer.js +1879 -0
  247. package/src/design/index.js +11 -0
  248. package/src/design/writer.js +271 -0
  249. package/src/finalise/detect.js +151 -0
  250. package/src/finalise/index.js +31 -0
  251. package/src/finalise/ingest.js +160 -0
  252. package/src/finalise/install.js +119 -0
  253. package/src/finalise/ship-without-verified.js +131 -0
  254. package/src/finalise/spawn.js +84 -0
  255. package/src/intake/fidelity.js +105 -0
  256. package/src/intake/index.js +6 -0
  257. package/src/intake/manifest-writer.js +100 -0
  258. package/src/intake/orchestrator.js +138 -0
  259. package/src/intake/validate.js +80 -0
  260. package/src/mcp/map-errors.js +131 -0
  261. package/src/mcp/prompts.js +49 -0
  262. package/src/mcp/resources.js +244 -0
  263. package/src/mcp/tools.js +1212 -0
  264. package/src/preflight/design-shapes.js +185 -0
  265. package/src/preflight/index.js +90 -0
  266. package/src/preflight/manifest-writer.js +264 -0
  267. package/src/preflight/scanner.js +206 -0
  268. package/src/preflight/secrets.js +134 -0
  269. package/src/preflight/session.js +246 -0
  270. package/src/query/attestation.js +285 -0
  271. package/src/query/coverage.js +308 -0
  272. package/src/query/formatters/json.js +21 -0
  273. package/src/query/formatters/mermaid.js +209 -0
  274. package/src/query/formatters/table.js +203 -0
  275. package/src/query/impact.js +173 -0
  276. package/src/query/index.js +13 -0
  277. package/src/query/refuse-on-admissibility.js +73 -0
  278. package/src/query/trace.js +345 -0
  279. package/src/register-canary/fixture-loader.js +87 -0
  280. package/src/register-canary/index.js +10 -0
  281. package/src/register-canary/record-writer.js +132 -0
  282. package/src/register-canary/runner.js +156 -0
  283. package/src/req-baseline/gate.js +86 -0
  284. package/src/req-baseline/index.js +27 -0
  285. package/src/req-baseline/open-candidates.js +143 -0
  286. package/src/req-baseline/opt-out.js +195 -0
  287. package/src/req-baseline/sweep.js +230 -0
  288. package/src/req-detection/classifier.js +181 -0
  289. package/src/req-detection/index.js +9 -0
  290. package/src/req-detection/persist.js +55 -0
  291. package/src/review/index.js +325 -0
  292. package/src/review/mutation.js +117 -0
  293. package/src/review/ui-baseline-drift.js +138 -0
  294. package/src/ruleset/index.js +140 -0
  295. package/src/ruleset/ruleset.json +146 -0
  296. package/src/server/index.js +178 -0
  297. package/src/server/routes.js +110 -0
  298. package/src/server/sse.js +118 -0
  299. package/src/setup/agent-setup.js +362 -0
  300. package/src/setup/identity-seed.js +104 -0
  301. package/src/setup/knowledge-seed.js +123 -0
  302. package/src/setup/managed-block.js +193 -0
  303. package/src/setup/managed-gitignore.js +166 -0
  304. package/src/setup/managed-markers.js +49 -0
  305. package/src/ui-baseline/defaults.js +119 -0
  306. package/src/ui-baseline/index.js +25 -0
  307. package/src/ui-baseline/manifest-writer.js +282 -0
  308. package/src/ui-baseline/session.js +178 -0
  309. package/src/ui-detection/classifier.js +192 -0
  310. package/src/verify/chain/index.js +221 -0
  311. package/src/verify/cli/cleanup.js +61 -0
  312. package/src/verify/cli/help.js +56 -0
  313. package/src/verify/cli/mcp.js +98 -0
  314. package/src/verify/cli/provision.js +71 -0
  315. package/src/verify/cli/report.js +71 -0
  316. package/src/verify/cli/run.js +155 -0
  317. package/src/verify/engine/brief.js +87 -0
  318. package/src/verify/engine/index.js +177 -0
  319. package/src/verify/engine/launcher.js +307 -0
  320. package/src/verify/mcp/tools.js +107 -0
  321. package/src/verify/profile/index.js +146 -0
  322. package/src/verify/provision/index.js +256 -0
  323. package/src/verify/report/index.js +139 -0
  324. package/src/verify/report/renderer.js +118 -0
  325. package/src/verify/verdict/index.js +313 -0
  326. package/src/view/doc-renderers/adr.js +44 -0
  327. package/src/view/doc-renderers/build-sequence.js +40 -0
  328. package/src/view/doc-renderers/fbs.js +128 -0
  329. package/src/view/doc-renderers/helpers.js +159 -0
  330. package/src/view/doc-renderers/index.js +12 -0
  331. package/src/view/doc-renderers/prd.js +45 -0
  332. package/src/view/doc-renderers/req.js +43 -0
  333. package/src/view/doc-renderers/tac.js +38 -0
  334. package/src/view/doc-renderers/tad.js +74 -0
  335. package/src/view/doc-renderers/test-suite.js +45 -0
  336. package/src/view/doc-renderers/user-story.js +63 -0
  337. package/src/view/html-page.js +462 -0
  338. package/src/view/index.js +63 -0
  339. package/src/view/live-client.js +338 -0
  340. package/src/view/mermaid-diagram.js +178 -0
  341. package/src/view/style.css +735 -0
  342. package/src/view/tree-model.js +152 -0
  343. package/src/view/vendored/mermaid.min.js +2607 -0
  344. package/src/view-supervisor/index.js +26 -0
  345. package/src/view-supervisor/logs.js +32 -0
  346. package/src/view-supervisor/manifest-writer.js +178 -0
  347. package/src/view-supervisor/persist-until.js +85 -0
  348. package/src/view-supervisor/supervisor.js +276 -0
  349. package/src/watch/index.js +152 -0
@@ -0,0 +1,44 @@
1
+ # Persona programme: tail-interview template
2
+
3
+ <!-- Never-skip-RCF invariant is a platform rule; see build-cycle-playbook.md §13 and elicitation-playbook.md §11.1 for the byte-identical statement. Editors: any change to guidance wording is subject to canary release-block. -->
4
+
5
+ ## 1. Why this exists
6
+
7
+ Personas run against a shipping build; the run produces a corpus of behaviour a real user would see. Two classes of finding do not surface in that corpus by construction:
8
+
9
+ 1. **Affective failure modes.** Register fatigue, first-impression posture, "did that feel long to read" - the persona is an LLM; asking it to notice these during the run is asking it to be something it structurally cannot be.
10
+ 2. **Silent non-asks.** Credentials the persona would have volunteered if asked. Permissions the operator granted that the agent forgot to act on. Preferences the persona has a settled view on that the run never touched. A persona reporting only what the agent said produces a corpus with a systematic blind spot on the credentials and permissions it never got a chance to describe.
11
+
12
+ The tail interview is the mechanised second question, run after the main persona task closes. It never turns the persona back into a human; it just asks the questions the run itself could not, in a dedicated turn, and records the answers on the run's report for the corpus reader.
13
+
14
+ ## 2. When to run it
15
+
16
+ At the end of every persona run, immediately after the main task closes and before the report is finalised. The tail interview is a mandatory closing turn - the persona role definition dispatches it in a fresh turn against the same persona; the corpus reader picks up the appended answers alongside the primary run.
17
+
18
+ ## 3. The tail interview
19
+
20
+ Reach the persona in a dedicated turn, in character, and pose these five questions. The persona answers as the persona, not as a reviewer of the run; if the honest answer is "I do not know" or "as an LLM I cannot judge", say so - do not fabricate an answer to have something to write.
21
+
22
+ > **Tail interview.** After the persona run's main task completes, the persona role is asked the following questions in a dedicated dispatch turn. Answer as the persona, in the persona's voice, without breaking character. If the honest answer is "I do not know" or "as an LLM I cannot judge", say so; do not fabricate.
23
+ >
24
+ > 1. **Response length and density.** Across the run, did any agent response feel long or dense to read? Which ones, and at what points? If none felt long, say so plainly; do not invent length concerns to have an answer.
25
+ > 2. **Silent non-asks.** What did the agent NOT ask you that you (as the persona) would have volunteered if asked? Think about credentials, permissions, preferences, or context that would have been useful earlier in the run but the agent never raised. If nothing comes to mind, say so.
26
+ > 3. **First-impression posture.** Read the agent's first response again. Does it read as "the agent has this in hand and you can steer" or "the agent is asking you to do the work of parsing"? Name specifics.
27
+ > 4. **Register drift.** Did the agent's register (formality, jargon density, verbosity) change across the run? If yes, at what point and in which direction? If no, say so.
28
+ > 5. **Anything else the run made you think about that the questions above did not cover?**
29
+
30
+ ## 4. Recording the answers
31
+
32
+ The persona role appends the answers to the run's report under a dedicated `tailInterview` section. Each answer carries the question id (1-5) so a corpus reader can join across runs; free-text follow-ups land at question 5.
33
+
34
+ The corpus reader treats the tail interview as advisory signal, not ground truth. An LLM persona's introspective answers are lower-fidelity than a human's, and reading them straight would over-weight them. The value is directional: a pattern of "the agent felt long at the same point across three runs" is signal even if any single answer is noisy.
35
+
36
+ ## 5. What this is not
37
+
38
+ - Not a reviewer's verdict on the run. The persona is playing the persona; the reviewer's verdict lives elsewhere.
39
+ - Not a scoring rubric. There is no numeric grading; the answers are prose.
40
+ - Not a substitute for the primary run. A persona programme with a strong tail interview and a weak primary run is a bad persona run; the tail interview does not compensate.
41
+
42
+ ## 6. Where the template lives
43
+
44
+ Ships with the build-lite guidance pack so operators running personas via rcf-lite have the template as a discoverable resource; `rcf guidance persona-programme` prints it, and MCP-wired agents reach the same content via the `rcf://docs/persona-programme` resource. The operator-side persona role definitions that run the interview inherit the template from here; a change to the wording lands in one place.
package/package.json CHANGED
@@ -1,14 +1,77 @@
1
1
  {
2
2
  "name": "rcf-lite",
3
- "version": "0.0.1",
4
- "description": "Reserved for RCF Lite, the Requirements Confidence Framework lite suite from Stravica. First real release lands here as 0.7.1.",
5
- "repository": {
6
- "type": "git",
7
- "url": "git+https://github.com/Stravica/rcf-lite.git"
3
+ "version": "0.8.0",
4
+ "type": "module",
5
+ "description": "One-install tooling for the Requirements Confidence Framework (RCF): the unified `rcf` CLI (init, view, validate, build, verify, finalise and 25+ more verbs), an MCP server, the live tree viewer and the fresh-context adversarial ship-gate verifier. Consumes @stravica-ai/rcf-schemas.",
6
+ "license": "Apache-2.0",
7
+ "homepage": "https://github.com/Stravica/rcf-lite",
8
+ "bugs": "https://github.com/Stravica/rcf-lite/issues",
9
+ "keywords": [
10
+ "rcf",
11
+ "requirements",
12
+ "traceability",
13
+ "mcp",
14
+ "cli",
15
+ "sdd",
16
+ "verification",
17
+ "adversarial"
18
+ ],
19
+ "engines": {
20
+ "node": ">=24.0.0"
21
+ },
22
+ "bin": {
23
+ "rcf": "bin/rcf.js",
24
+ "rcf-verify": "bin/rcf-verify.js"
8
25
  },
9
- "homepage": "https://stravica.ai",
10
26
  "files": [
11
- "README.md"
27
+ "bin",
28
+ "src",
29
+ "guidance",
30
+ "rcf",
31
+ "fixtures",
32
+ "README.md",
33
+ "LICENSE",
34
+ "CHANGELOG.md"
12
35
  ],
13
- "license": "Apache-2.0"
36
+ "publishConfig": {
37
+ "registry": "https://registry.npmjs.org/",
38
+ "access": "public"
39
+ },
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "git+https://github.com/Stravica/rcf-lite.git",
43
+ "directory": "packages/rcf-lite"
44
+ },
45
+ "imports": {
46
+ "#core/store": "./src/core/store/index.js",
47
+ "#core/store/*": "./src/core/store/*",
48
+ "#core/errors": "./src/core/errors/index.js",
49
+ "#core/mcp-shell": "./src/core/mcp/index.js",
50
+ "#core/isolation": "./src/core/isolation/index.js",
51
+ "#core/patterns/ui-shapes": "./src/core/patterns/ui-shapes.js",
52
+ "#core/patterns/req-shapes": "./src/core/patterns/req-shapes.js",
53
+ "#core/patterns/services": "./src/core/patterns/services.js",
54
+ "#core/patterns/register-canary": "./src/core/patterns/register-canary.js",
55
+ "#core/baseline-catalog": "./src/core/baseline-catalog/index.js",
56
+ "#core/fixtures/register-canary/*": "./src/core/fixtures/register-canary/*",
57
+ "#ruleset": "./src/ruleset/index.js",
58
+ "#admissibility": "./src/admissibility/index.js"
59
+ },
60
+ "dependencies": {
61
+ "@stravica-ai/rcf-schemas": "0.4.3",
62
+ "ajv": "^8.20.0",
63
+ "ajv-formats": "^3.0.1"
64
+ },
65
+ "devDependencies": {
66
+ "@modelcontextprotocol/sdk": "^1.29.0",
67
+ "mermaid": "11.6.0"
68
+ },
69
+ "scripts": {
70
+ "test": "node --test --test-concurrency=1 'test/**/*.test.js'",
71
+ "vendor": "node scripts/vendor-mermaid.mjs",
72
+ "build:managed": "node scripts/gen-managed-artefacts.mjs",
73
+ "canary:register": "node scripts/canary-register.mjs",
74
+ "rcf": "node bin/rcf.js",
75
+ "rcf-verify": "node bin/rcf-verify.js"
76
+ }
14
77
  }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-001",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "0.1.0",
6
+ "status": "accepted",
7
+ "title": "Local filesystem is the single source of truth",
8
+ "context": "RCF Build Lite must guarantee that a project's RCF documents live in the source repository, beside the code. v1 tooling operated over the GitHub API rather than the local repo, which broke the in-repository differentiator and tied the tool to a network surface.",
9
+ "decision": "Every read and write targets the local rcf tree directly. No external service, cache or database mirrors the documents. The CLI, the MCP server and the build loop all reach the filesystem only through the document store.",
10
+ "consequences": "The tool works offline and stays harness-agnostic. There is no sync problem and no second source to drift. The cost is that any multi-user or hosted scenario is out of scope by construction, which matches the product boundaries.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "GitHub API as source of truth",
14
+ "summary": "Read and write documents through the GitHub contents API as v1 did.",
15
+ "reasonNotChosen": "Breaks the in-repository differentiator, requires network access and hit the API single-file fetch limit on large documents."
16
+ },
17
+ {
18
+ "name": "Local database index",
19
+ "summary": "Keep the files but maintain a database index for fast queries.",
20
+ "reasonNotChosen": "Introduces a second source of truth that can drift; query volumes for a single project do not justify it."
21
+ }
22
+ ],
23
+ "createdAt": "2026-06-25T00:00:00Z",
24
+ "updatedAt": "2026-06-25T00:00:00Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-002",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "0.1.0",
6
+ "status": "accepted",
7
+ "title": "Validate against the published schema bundle at boundaries",
8
+ "context": "A non-coder cannot catch a malformed RCF document by eye, and an AI agent left unchecked can drift the document shape silently. Validation has to be a property of the tool, not a discipline of the user.",
9
+ "decision": "Register the published @stravica/rcf-schemas bundle once at start-up and validate every document on load and before persist. Refuse to write any document that does not validate.",
10
+ "consequences": "On-disk state is always valid. A small validation cost runs on every operation. The published schema package is the single source of truth for shape; local drift is impossible.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Local copies of the schemas",
14
+ "summary": "Vendor the schemas into the tool repository and validate against the local copy.",
15
+ "reasonNotChosen": "Allows local copies to drift from the published contract; the whole point of publishing the schemas is that every consumer keys to the same version."
16
+ },
17
+ {
18
+ "name": "Validate only on persist",
19
+ "summary": "Skip validation on load to save the cost of validating documents already on disk.",
20
+ "reasonNotChosen": "Misses drift caused by edits made outside the tool; load validation is what makes broken trees visible to the owner."
21
+ }
22
+ ],
23
+ "createdAt": "2026-06-25T00:00:00Z",
24
+ "updatedAt": "2026-06-25T00:00:00Z"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "adrId": "ADR-003",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "0.1.0",
6
+ "status": "accepted",
7
+ "title": "Plain JavaScript, no TypeScript pin",
8
+ "context": "v1 was TypeScript-heavy and the build pipeline was a maintenance burden out of proportion to the project size. The product is small enough that boundary validation can carry the safety types would, and contributors should not have to set up a TypeScript toolchain to read or edit the code.",
9
+ "decision": "Build Lite is Node 24 ESM, plain JavaScript with JSDoc where types help. Schema validation at boundaries does the work compile-time types would otherwise do.",
10
+ "consequences": "Lower friction for contributors and a faster iteration loop. Some IDE assistance is given up. The team accepts that giving up in exchange for the simpler stack.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "TypeScript everywhere",
14
+ "summary": "Author the tool in TypeScript with a tsc build step.",
15
+ "reasonNotChosen": "Adds a toolchain dependency for a small project; boundary validation carries the safety guarantee instead."
16
+ },
17
+ {
18
+ "name": "JSDoc plus checkJs",
19
+ "summary": "Use JSDoc with TypeScript checkJs to get partial type checking without authoring TypeScript.",
20
+ "reasonNotChosen": "Worth considering later if friction grows; not the round-1 default because the schema bundle is already the load-bearing contract."
21
+ }
22
+ ],
23
+ "createdAt": "2026-06-25T00:00:00Z",
24
+ "updatedAt": "2026-06-25T00:00:00Z"
25
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "adrId": "ADR-004",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "0.1.0",
6
+ "status": "accepted",
7
+ "title": "Thin adapters over a shared core",
8
+ "context": "The same operations are reached from the CLI, the MCP server and the build loop. Putting behaviour in any surface guarantees drift between surfaces.",
9
+ "decision": "Put every behaviour in a shared core module set. The CLI, the MCP server and the build loop are thin adapters that map their surface verbs to core operations and render results. The core's internal API is the stable contract.",
10
+ "consequences": "One behaviour, many surfaces, no drift between how a verb behaves on the CLI versus over MCP. The adapters carry no business logic so they are small and easy to keep in step.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Per-surface implementations",
14
+ "summary": "Implement each verb separately for the CLI and for MCP.",
15
+ "reasonNotChosen": "Guaranteed drift over time; the cost of duplication is paid forever in tests and bug reports."
16
+ }
17
+ ],
18
+ "createdAt": "2026-06-25T00:00:00Z",
19
+ "updatedAt": "2026-06-25T00:00:00Z"
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "adrId": "ADR-005",
3
+ "prdId": "PRD-001",
4
+ "tadId": "TAD-001",
5
+ "version": "0.1.0",
6
+ "status": "accepted",
7
+ "title": "MCP is local stdio only",
8
+ "context": "Remote MCP cannot see the user's local codebase or RCF documents, which breaks the in-repository differentiator and the source-of-truth rule. The product is local-first by design; the MCP surface must follow.",
9
+ "decision": "The MCP server uses local stdio transport only. No network listener is opened. Remote MCP is excluded.",
10
+ "consequences": "The harness gets the full feature set with filesystem access. There is no hosted MCP path. The trade matches the local-filesystem source-of-truth rule and keeps the product boundaries clean.",
11
+ "alternativesConsidered": [
12
+ {
13
+ "name": "Hosted MCP server",
14
+ "summary": "Run an MCP server over network transport with the user pointing it at a remote project.",
15
+ "reasonNotChosen": "Breaks the in-repository differentiator and the source-of-truth rule; a hosted surface would have to mirror or re-fetch the local tree."
16
+ }
17
+ ],
18
+ "createdAt": "2026-06-25T00:00:00Z",
19
+ "updatedAt": "2026-06-25T00:00:00Z"
20
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "createdAt": "2026-07-20T17:03:19.245Z",
3
+ "updatedAt": "2026-07-20T17:56:46.383Z",
4
+ "context": "The tool's target user is a non-coding owner who cannot self-verify a deployed application. Across the persona programme the one thing every such user could always exercise was the app running locally; a deployment could dead-end (run 03), be accepted-not-deployed (run 04), or pass locally yet fail in production (run 05). A build whose only demonstrable outcome lives on a remote runtime the owner cannot inspect leaves them with nothing they can check.",
5
+ "decision": "Every build lands, as its default outcome, a working and documented local preview loop - a dev server, seeded data where the app needs it, ideally reachable in one command. This holds whether or not the owner has stated a hosting target and whether they asked for a recommendation or not; local-first is the rock-solid default, and remote deployment is an addition on top of it, never a replacement for it. The elicitation and build-cycle guidance both carry this as a required deliverable, and the definition of done for a build includes the preview loop being present and documented.",
6
+ "consequences": "The owner always has a runtime they can drive and review, independent of any cloud account or deploy step. Local preview also becomes the honest substrate for the runtime-provenance discipline (ADR-008): a claim verified against local preview can say so truthfully. The cost is that a working local preview does not prove the deployed runtime works - which is precisely why provenance labelling and the interim self-review exist alongside this decision, not instead of it.",
7
+ "alternativesConsidered": [
8
+ {
9
+ "name": "Deploy-first, preview optional",
10
+ "summary": "Treat a successful cloud deployment as the primary outcome and local preview as a nicety.",
11
+ "reasonNotChosen": "Strands owners whose deploy dead-ends or who decline to deploy, and hides defects behind a runtime they cannot inspect."
12
+ },
13
+ {
14
+ "name": "Preview only when the owner asks",
15
+ "summary": "Produce a local preview loop only when the owner explicitly requests one.",
16
+ "reasonNotChosen": "The owners who most need it are the least likely to know to ask; a default that depends on the user knowing the right question fails the target user."
17
+ }
18
+ ],
19
+ "adrId": "ADR-006",
20
+ "prdId": "PRD-001",
21
+ "tadId": "TAD-001",
22
+ "version": "0.1.0",
23
+ "status": "accepted",
24
+ "title": "Local-first preview is the default build outcome"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "createdAt": "2026-07-20T17:03:19.405Z",
3
+ "updatedAt": "2026-07-20T17:56:46.538Z",
4
+ "context": "Elicitation ran to a full RCF tree without ever establishing where the application would run. In run 03 the agent silently committed an entire Node-plus-node:sqlite stack that the owner's Cloudflare-only holdings could not host, dead-ending at deploy with no flag; run 04 chose the same incompatible stack class but disclosed it, and the difference was traced to that persona's contract forcing hosting into the spec early. The stack is a load-bearing architecture decision being made for a user who cannot judge it, and making it before the deploy target is known is how the G9 silent-architecture failure happens.",
5
+ "decision": "Elicitation establishes the deploy target early - a first-class elicitation item asked before the stack is committed, not inferred late - and the stack choice is constrained by the answer. When the owner does not know where it will run, the agent runs a jargon-free hosting-choice walkthrough (ADR captured separately in the guidance) rather than choosing silently. The deploy target and the stack constraint it implies are captured as an ADR on the project's own tree so the decision is visible and revisable.",
6
+ "consequences": "The stack the tool builds can actually be hosted where the owner can host it, and the hosting decision is surfaced instead of buried. Elicitation gains an early question the lite method did not previously carry, and the harness fragment gains a rule that a stack must not be committed before the deploy target is established. The cost is a small increase in elicitation length up front, paid back many times over against a dead-end at deploy the owner cannot diagnose.",
7
+ "alternativesConsidered": [
8
+ {
9
+ "name": "Infer hosting from the stack later",
10
+ "summary": "Let the agent pick a stack on technical merit and determine hosting afterwards.",
11
+ "reasonNotChosen": "Produced the run-03 dead-end: a stack chosen before hosting is a stack that may have no host, discovered only at deploy."
12
+ },
13
+ {
14
+ "name": "Always ask the owner to choose a host explicitly",
15
+ "summary": "Require the owner to name a hosting provider during elicitation.",
16
+ "reasonNotChosen": "The target user often does not know the options; a bare demand to choose freezes them. The guidance must walk an unsure owner through choosing, not just ask."
17
+ }
18
+ ],
19
+ "adrId": "ADR-007",
20
+ "prdId": "PRD-001",
21
+ "tadId": "TAD-001",
22
+ "version": "0.1.0",
23
+ "status": "accepted",
24
+ "title": "Deploy target is elicited early and constrains the stack"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "createdAt": "2026-07-20T17:03:19.567Z",
3
+ "updatedAt": "2026-07-20T17:56:46.693Z",
4
+ "context": "In run 05 the tool's self-verification claimed the work was 'verified against a live Worker', but its end-to-end tests actually ran against wrangler dev on localhost, which does not enforce the Cloudflare edge PBKDF2 iteration cap. The result was 89/89 green tests, a confident verification claim, and a CRITICAL signup/login 500 on the actually-deployed runtime. The failure was not laziness but provenance: a claim implied a runtime it had never touched. A non-coding owner cannot tell 'verified against the deployed runtime' from 'verified against a local emulator', so the claim itself must carry the distinction.",
5
+ "decision": "Every 'verified' or 'tested' claim the tool or its agent makes names the runtime it was checked against - for example 'verified against wrangler dev (localhost) - NOT the deployed Worker runtime'. No claim may state or imply deploy-runtime verification that did not happen. The build-cycle guidance requires the runtime label on verification claims in the Test and Finalise stages and in the PR body's verification section; a claim without a named runtime is treated as incomplete.",
6
+ "consequences": "The owner can see exactly what was and was not proven, and the gap between 'passes locally' and 'works deployed' stops being invisible. This makes local preview (ADR-006) an honest thing to cite rather than a false proxy for deployment, and it defines the seam the interim self-review and the future independent gate target. The cost is that verification claims become longer and, deliberately, less reassuring - which is the point: an unlabelled claim was falsely reassuring.",
7
+ "alternativesConsidered": [
8
+ {
9
+ "name": "Require verification against the deployed runtime",
10
+ "summary": "Mandate that every verification run against the real deployed target, removing the provenance ambiguity by removing local verification.",
11
+ "reasonNotChosen": "Not always possible for the owner (no deploy yet, no account), and it belongs to the productised independent gate (rcf-verify-lite); the base offering's job is to label provenance honestly, not to force a deployed run."
12
+ },
13
+ {
14
+ "name": "Trust green suites as verification",
15
+ "summary": "Treat a passing test suite as sufficient evidence of 'verified'.",
16
+ "reasonNotChosen": "Run 05 is the counter-example: 89/89 green with a critical production failure. A green suite is evidence about the runtime it ran on and nothing more."
17
+ }
18
+ ],
19
+ "adrId": "ADR-008",
20
+ "prdId": "PRD-001",
21
+ "tadId": "TAD-001",
22
+ "version": "0.1.0",
23
+ "status": "accepted",
24
+ "title": "Verification claims carry runtime provenance"
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "createdAt": "2026-07-20T17:03:19.722Z",
3
+ "updatedAt": "2026-07-28T16:40:20.554Z",
4
+ "context": "The persona programme showed self-verification is only as truthful as the runtime it verifies against, and that a green suite plus a confident claim can still ship a user-facing defect (runs 03 and 05). The durable answer is a productised independent verification gate (rcf-verify-lite), being scoped separately at HQ. But the base offering needs a stopgap now, and it must not pretend to be the independent gate: an in-loop self-review by the same agent is not an independent check and cannot be sold as one.",
5
+ "decision": "The guidance carries interim self-review guidance - documentation and prompt-level, not a new subsystem - for a carefully-scoped manual-review subagent dispatch: a periodic review every few FBS builds plus one at the end of the build. The reviewer runs fresh-context, drives the APP against the acceptance criteria rather than reading the code, and targets the defect classes green suites miss: session-class bugs, false-promise UI (stubs that imply real actions), runtime mismatch (localhost versus deployed), dead auth paths, and dead code. The guidance states plainly that this is an interim stopgap until rcf-verify-lite exists and that it is not the independent verification gate.",
6
+ "consequences": "The base offering gains a review step that catches the defect classes the five-stage loop demonstrably missed, at documentation cost and with no new code surface to maintain. Because it is guidance, it can ship now and be retired or folded into rcf-verify-lite later without a migration. The cost and the honesty boundary are the same point: a same-programme reviewer is better than nothing and weaker than an independent gate, and the guidance says so rather than overclaiming. Update 2026-07-28: rcf-verify-lite has since shipped and rcf finalise runs it as the independent gate, so the 'stopgap until the gate exists' framing recorded in the decision above is spent. The decision itself stands - the self-review is still guidance, still not a subsystem, still not the gate - but it is now positioned as the cheap in-loop check that runs between builds, subordinate to the finalise gate rather than a placeholder for it, and AC-805-4 and the guidance were reworded to match.",
7
+ "alternativesConsidered": [
8
+ {
9
+ "name": "Wait for rcf-verify-lite",
10
+ "summary": "Ship no review step until the productised independent gate exists.",
11
+ "reasonNotChosen": "Leaves the base offering shipping the exact defect classes the programme caught, for months, against users who cannot catch them themselves."
12
+ },
13
+ {
14
+ "name": "Build an independent-gate subsystem now",
15
+ "summary": "Solve the independent-verification problem inside rcf-build-lite immediately.",
16
+ "reasonNotChosen": "That is a separate product being scoped at HQ; duplicating it here pre-empts a repo reshape and over-builds the lite tier. The Tier-1 scope is guidance, not a gate."
17
+ }
18
+ ],
19
+ "adrId": "ADR-009",
20
+ "prdId": "PRD-001",
21
+ "tadId": "TAD-001",
22
+ "version": "0.1.0",
23
+ "status": "accepted",
24
+ "title": "Interim self-review is guidance, not the independent gate"
25
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "bsId": "BS-001",
3
+ "prdId": "PRD-001",
4
+ "version": "0.1.0",
5
+ "status": "draft",
6
+ "title": "RCF Build Lite initial delivery",
7
+ "buildPhilosophy": "Dependency-first. Build the document store, then the read-only view surface, then mutating CRUD, then the query layer, then the build loop, then the MCP surface over everything below. Each layer is usable on its own before the next is added.",
8
+ "generationStrategy": "dependencyFirst",
9
+ "createdAt": "2026-06-25T00:00:00Z",
10
+ "updatedAt": "2026-07-02T10:22:43Z"
11
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "cnId": "CN-001",
3
+ "path": "src/core/store/validator.js#getAjv",
4
+ "title": "Ajv instance builder registering the published schema bundle once",
5
+ "description": "Builds and caches the single Ajv 2020 instance, registering the published @stravica-ai/rcf-schemas bundle at start-up. Satisfies the 'published bundle, registered once' clause.",
6
+ "implementsAcIds": [
7
+ "AC-701-3"
8
+ ],
9
+ "dependencies": [],
10
+ "version": "0.1.0",
11
+ "status": "draft",
12
+ "createdAt": "2026-07-10T11:13:55.704Z",
13
+ "updatedAt": "2026-07-10T11:13:55.704Z"
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "cnId": "CN-002",
3
+ "path": "src/core/store/walker.js#netNewErrors",
4
+ "title": "Net-new error diff between pre- and post-write error sets",
5
+ "description": "Diffs post-write errors against pre-write errors on the full structured tuple, so an operation is refused only when it introduces breakage not already present.",
6
+ "implementsAcIds": [
7
+ "AC-701-1"
8
+ ],
9
+ "dependencies": [],
10
+ "version": "0.1.0",
11
+ "status": "draft",
12
+ "createdAt": "2026-07-10T11:13:55.793Z",
13
+ "updatedAt": "2026-07-10T11:13:55.793Z"
14
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "cnId": "CN-003",
3
+ "path": "src/core/errors/index.js#rcfError",
4
+ "title": "Structured error constructor",
5
+ "description": "Constructs the plain-data RcfError carrying kind, message, documentId, filePath, field and rule. The structured-object contract every surface returns rather than free text.",
6
+ "implementsAcIds": [
7
+ "AC-702-1",
8
+ "AC-702-3"
9
+ ],
10
+ "dependencies": [],
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "createdAt": "2026-07-10T11:13:55.883Z",
14
+ "updatedAt": "2026-07-10T11:13:55.883Z"
15
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "cnId": "CN-004",
3
+ "path": "src/core/store/walker.js",
4
+ "title": "Tree walker module (file-level)",
5
+ "description": "File-level Code Node over the whole walker module. Parallel to symbol-level Code Nodes over simulateWriteErrors/netNewErrors for the granularity comparison.",
6
+ "implementsAcIds": [
7
+ "AC-701-1",
8
+ "AC-102-1",
9
+ "AC-102-2",
10
+ "AC-102-3"
11
+ ],
12
+ "dependencies": [],
13
+ "version": "0.1.0",
14
+ "status": "draft",
15
+ "createdAt": "2026-07-10T11:13:55.972Z",
16
+ "updatedAt": "2026-07-10T11:15:24.638Z"
17
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "cnId": "CN-005",
3
+ "path": "src/core/store/validator.js#validateDocument",
4
+ "title": "Schema validation entry point with structured field+rule errors",
5
+ "description": "Validates one document against its schema; on failure extracts the offending field and broken rule and returns a structured error carrying all failures.",
6
+ "implementsAcIds": [
7
+ "AC-701-2",
8
+ "AC-702-1",
9
+ "AC-702-2"
10
+ ],
11
+ "dependencies": [
12
+ "CN-001",
13
+ "CN-003"
14
+ ],
15
+ "version": "0.1.0",
16
+ "status": "draft",
17
+ "createdAt": "2026-07-10T11:14:05.169Z",
18
+ "updatedAt": "2026-07-10T11:14:05.169Z"
19
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "cnId": "CN-006",
3
+ "path": "src/core/errors/index.js#formatErrors",
4
+ "title": "Multi-error renderer with field+rule detail",
5
+ "description": "Renders a list of structured errors plus a summary line, surfacing field and rule in verbose mode and reporting every failure together rather than only the first.",
6
+ "implementsAcIds": [
7
+ "AC-702-1",
8
+ "AC-702-2"
9
+ ],
10
+ "dependencies": [
11
+ "CN-003"
12
+ ],
13
+ "version": "0.1.0",
14
+ "status": "draft",
15
+ "createdAt": "2026-07-10T11:14:05.257Z",
16
+ "updatedAt": "2026-07-10T11:14:05.257Z"
17
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "cnId": "CN-007",
3
+ "path": "src/mcp/map-errors.js#issueFromRcfError",
4
+ "title": "MCP structured-issue mapper",
5
+ "description": "Maps an RcfError to the structured issue object delivered to an AI tool over MCP, so validation errors reach the tool as actionable objects, not free text.",
6
+ "implementsAcIds": [
7
+ "AC-702-3"
8
+ ],
9
+ "dependencies": [
10
+ "CN-003"
11
+ ],
12
+ "version": "0.1.0",
13
+ "status": "draft",
14
+ "createdAt": "2026-07-10T11:14:05.346Z",
15
+ "updatedAt": "2026-07-10T11:14:05.346Z"
16
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "cnId": "CN-008",
3
+ "path": "src/core/store/validator.js",
4
+ "title": "Schema validator module (file-level)",
5
+ "description": "File-level Code Node over the whole validator module. Parallel to symbol-level Code Nodes over getAjv/validateDocument for the granularity comparison.",
6
+ "implementsAcIds": [
7
+ "AC-701-2",
8
+ "AC-701-3",
9
+ "AC-702-1",
10
+ "AC-702-2"
11
+ ],
12
+ "dependencies": [
13
+ "CN-004"
14
+ ],
15
+ "version": "0.1.0",
16
+ "status": "draft",
17
+ "createdAt": "2026-07-10T11:14:05.435Z",
18
+ "updatedAt": "2026-07-10T11:14:05.435Z"
19
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "cnId": "CN-009",
3
+ "path": "src/core/store/walker.js#simulateWriteErrors",
4
+ "title": "In-memory post-write tree simulation",
5
+ "description": "Recomputes the walker error set as if a change-set were applied, without touching disk. The core of the B5 post-write validation gate that lets a write refuse only net-new breakage.",
6
+ "implementsAcIds": [
7
+ "AC-701-1"
8
+ ],
9
+ "dependencies": [
10
+ "CN-005"
11
+ ],
12
+ "version": "0.1.0",
13
+ "status": "draft",
14
+ "createdAt": "2026-07-10T11:14:14.814Z",
15
+ "updatedAt": "2026-07-10T11:14:14.814Z"
16
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "cnId": "CN-010",
3
+ "path": "src/core/store/loader.js#loadDocument",
4
+ "title": "Load-path validation",
5
+ "description": "Reads and parses a document by id, then validates it against the published schema on load, so every document brought into memory is validated at the boundary.",
6
+ "implementsAcIds": [
7
+ "AC-701-2",
8
+ "AC-701-3"
9
+ ],
10
+ "dependencies": [
11
+ "CN-005",
12
+ "CN-003"
13
+ ],
14
+ "version": "0.1.0",
15
+ "status": "draft",
16
+ "createdAt": "2026-07-10T11:14:14.902Z",
17
+ "updatedAt": "2026-07-10T11:14:14.902Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "cnId": "CN-011",
3
+ "path": "src/core/store/writer.js#postWriteGate",
4
+ "title": "Post-write refusal gate",
5
+ "description": "Runs a change-set through the tree simulation and refuses the write if any error appears post-write that was not present pre-write. The enforcement point for 'refuse invalid writes'.",
6
+ "implementsAcIds": [
7
+ "AC-701-1"
8
+ ],
9
+ "dependencies": [
10
+ "CN-009",
11
+ "CN-002",
12
+ "CN-003"
13
+ ],
14
+ "version": "0.1.0",
15
+ "status": "draft",
16
+ "createdAt": "2026-07-10T11:14:23.483Z",
17
+ "updatedAt": "2026-07-10T11:14:23.483Z"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "cnId": "CN-012",
3
+ "path": "src/core/store/writer.js",
4
+ "title": "Persistence / CRUD writer module (file-level)",
5
+ "description": "File-level Code Node over the whole writer module. Parallel to symbol-level Code Nodes over postWriteGate/createDocument for the granularity comparison.",
6
+ "implementsAcIds": [
7
+ "AC-701-1",
8
+ "AC-701-2"
9
+ ],
10
+ "dependencies": [
11
+ "CN-008",
12
+ "CN-004"
13
+ ],
14
+ "version": "0.1.0",
15
+ "status": "draft",
16
+ "createdAt": "2026-07-10T11:14:23.587Z",
17
+ "updatedAt": "2026-07-10T11:14:23.587Z"
18
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "cnId": "CN-013",
3
+ "path": "src/core/store/writer.js#createDocument",
4
+ "title": "Create verb with pre-write validation and post-write gate",
5
+ "description": "Assembles a document body, schema-validates it, and routes through the post-write gate so a create that would produce an invalid document writes nothing and a successful create validates.",
6
+ "implementsAcIds": [
7
+ "AC-701-1",
8
+ "AC-701-2"
9
+ ],
10
+ "dependencies": [
11
+ "CN-005",
12
+ "CN-011",
13
+ "CN-003"
14
+ ],
15
+ "version": "0.1.0",
16
+ "status": "draft",
17
+ "createdAt": "2026-07-10T11:14:23.703Z",
18
+ "updatedAt": "2026-07-10T11:14:23.703Z"
19
+ }