@xhulz/nina 0.83.0 → 0.85.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 (273) hide show
  1. package/README.md +2 -0
  2. package/bin/nina.mjs +6 -1
  3. package/package.json +1 -1
  4. package/releases/0.84.0/core/GAPS.md +125 -0
  5. package/releases/0.84.0/core/answered.json +134 -0
  6. package/releases/0.84.0/core/defaults/tree/.claude/agents/architect.md +1 -0
  7. package/releases/0.84.0/core/defaults/tree/.claude/agents/dba.md +3 -0
  8. package/releases/0.84.0/core/defaults/tree/.claude/agents/devops.md +1 -0
  9. package/releases/0.84.0/core/defaults/tree/.claude/agents/implementer.md +1 -0
  10. package/releases/0.84.0/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
  11. package/releases/0.84.0/core/defaults/tree/.claude/agents/qa.md +7 -0
  12. package/releases/0.84.0/core/defaults/tree/.claude/agents/reviewer.md +3 -0
  13. package/releases/0.84.0/core/defaults/tree/.claude/agents/secops.md +3 -0
  14. package/releases/0.84.0/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
  15. package/releases/0.84.0/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
  16. package/releases/0.84.0/core/tiers.json +5 -0
  17. package/releases/0.84.0/core/tree/.claude/agents/architect.md +140 -0
  18. package/releases/0.84.0/core/tree/.claude/agents/dba.md +123 -0
  19. package/releases/0.84.0/core/tree/.claude/agents/design-reviewer.md +82 -0
  20. package/releases/0.84.0/core/tree/.claude/agents/devops.md +122 -0
  21. package/releases/0.84.0/core/tree/.claude/agents/implementer.md +208 -0
  22. package/releases/0.84.0/core/tree/.claude/agents/integration-tester.md +174 -0
  23. package/releases/0.84.0/core/tree/.claude/agents/planner.md +132 -0
  24. package/releases/0.84.0/core/tree/.claude/agents/qa.md +154 -0
  25. package/releases/0.84.0/core/tree/.claude/agents/reviewer.md +191 -0
  26. package/releases/0.84.0/core/tree/.claude/agents/secops.md +124 -0
  27. package/releases/0.84.0/core/tree/.claude/agents/solidity-auditor.md +130 -0
  28. package/releases/0.84.0/core/tree/.claude/agents/solidity-dev.md +127 -0
  29. package/releases/0.84.0/core/tree/.claude/agents-overview.md +65 -0
  30. package/releases/0.84.0/core/tree/.claude/frontend.md +10 -0
  31. package/releases/0.84.0/core/tree/.claude/graph.md +79 -0
  32. package/releases/0.84.0/core/tree/.claude/patterns.md +256 -0
  33. package/releases/0.84.0/core/tree/.claude/pills/README.md +150 -0
  34. package/releases/0.84.0/core/tree/.claude/pipeline.md +101 -0
  35. package/releases/0.84.0/core/tree/.claude/retrieval.md +103 -0
  36. package/releases/0.84.0/core/tree/.claude/router.md +224 -0
  37. package/releases/0.84.0/core/tree/.claude/templates/integration.md +48 -0
  38. package/releases/0.84.0/core/tree/CLAUDE.md +167 -0
  39. package/releases/0.84.0/core/tree/scripts/cost-watch.mjs +27 -0
  40. package/releases/0.84.0/core/tree/scripts/edit-guard.mjs +24 -0
  41. package/releases/0.84.0/core/tree/scripts/harness-check.mjs +84 -0
  42. package/releases/0.84.0/core/tree/scripts/loop-gate.mjs +19 -0
  43. package/releases/0.84.0/core/vocabulary.json +18 -0
  44. package/releases/0.84.0/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
  45. package/releases/0.84.0/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
  46. package/releases/0.84.0/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
  47. package/releases/0.84.0/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
  48. package/releases/0.84.0/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
  49. package/releases/0.84.0/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
  50. package/releases/0.84.0/surfaces/blockchain/tree/.claude/graph.md +11 -0
  51. package/releases/0.84.0/surfaces/blockchain/tree/.claude/router.md +6 -0
  52. package/releases/0.84.0/surfaces/blockchain/tree/CLAUDE.md +12 -0
  53. package/releases/0.84.0/surfaces/d1/tree/.claude/agents/dba.md +15 -0
  54. package/releases/0.84.0/surfaces/d1/tree/.claude/agents/devops.md +2 -0
  55. package/releases/0.84.0/surfaces/d1/tree/.claude/agents/implementer.md +2 -0
  56. package/releases/0.84.0/surfaces/d1/tree/.claude/patterns.md +8 -0
  57. package/releases/0.84.0/surfaces/d1/tree/CLAUDE.md +2 -0
  58. package/releases/0.84.0/surfaces/db/tree/.claude/agents/architect.md +5 -0
  59. package/releases/0.84.0/surfaces/db/tree/.claude/agents/dba.md +54 -0
  60. package/releases/0.84.0/surfaces/db/tree/.claude/agents/devops.md +5 -0
  61. package/releases/0.84.0/surfaces/db/tree/.claude/agents/implementer.md +2 -0
  62. package/releases/0.84.0/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
  63. package/releases/0.84.0/surfaces/db/tree/.claude/agents/planner.md +2 -0
  64. package/releases/0.84.0/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
  65. package/releases/0.84.0/surfaces/db/tree/.claude/agents/secops.md +2 -0
  66. package/releases/0.84.0/surfaces/db/tree/.claude/agents-overview.md +5 -0
  67. package/releases/0.84.0/surfaces/db/tree/.claude/graph.md +8 -0
  68. package/releases/0.84.0/surfaces/db/tree/.claude/patterns.md +22 -0
  69. package/releases/0.84.0/surfaces/db/tree/.claude/pipeline.md +13 -0
  70. package/releases/0.84.0/surfaces/db/tree/.claude/retrieval.md +5 -0
  71. package/releases/0.84.0/surfaces/db/tree/.claude/router.md +4 -0
  72. package/releases/0.84.0/surfaces/db/tree/CLAUDE.md +17 -0
  73. package/releases/0.84.0/surfaces/drizzle/tree/.claude/agents/dba.md +9 -0
  74. package/releases/0.84.0/surfaces/drizzle/tree/.claude/agents/devops.md +5 -0
  75. package/releases/0.84.0/surfaces/drizzle/tree/.claude/agents/implementer.md +2 -0
  76. package/releases/0.84.0/surfaces/drizzle/tree/.claude/patterns.md +7 -0
  77. package/releases/0.84.0/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
  78. package/releases/0.84.0/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
  79. package/releases/0.84.0/surfaces/edge-cf/tree/.claude/agents/devops.md +29 -0
  80. package/releases/0.84.0/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
  81. package/releases/0.84.0/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
  82. package/releases/0.84.0/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
  83. package/releases/0.84.0/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
  84. package/releases/0.84.0/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
  85. package/releases/0.84.0/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
  86. package/releases/0.84.0/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
  87. package/releases/0.84.0/surfaces/edge-cf/tree/CLAUDE.md +29 -0
  88. package/releases/0.84.0/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
  89. package/releases/0.84.0/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
  90. package/releases/0.84.0/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
  91. package/releases/0.84.0/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
  92. package/releases/0.84.0/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
  93. package/releases/0.84.0/surfaces/frontend/tree/.claude/patterns.md +8 -0
  94. package/releases/0.84.0/surfaces/frontend/tree/.claude/retrieval.md +2 -0
  95. package/releases/0.84.0/surfaces/frontend/tree/.claude/router.md +14 -0
  96. package/releases/0.84.0/surfaces/frontend/tree/CLAUDE.md +5 -0
  97. package/releases/0.84.0/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
  98. package/releases/0.84.0/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
  99. package/releases/0.84.0/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
  100. package/releases/0.84.0/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
  101. package/releases/0.84.0/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
  102. package/releases/0.84.0/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
  103. package/releases/0.84.0/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
  104. package/releases/0.84.0/surfaces/integrations/tree/.claude/graph.md +10 -0
  105. package/releases/0.84.0/surfaces/integrations/tree/.claude/patterns.md +38 -0
  106. package/releases/0.84.0/surfaces/integrations/tree/.claude/pipeline.md +16 -0
  107. package/releases/0.84.0/surfaces/integrations/tree/.claude/retrieval.md +16 -0
  108. package/releases/0.84.0/surfaces/integrations/tree/.claude/router.md +6 -0
  109. package/releases/0.84.0/surfaces/integrations/tree/CLAUDE.md +17 -0
  110. package/releases/0.84.0/surfaces/money/tree/.claude/agents/architect.md +12 -0
  111. package/releases/0.84.0/surfaces/money/tree/.claude/agents/dba.md +14 -0
  112. package/releases/0.84.0/surfaces/money/tree/.claude/agents/implementer.md +11 -0
  113. package/releases/0.84.0/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
  114. package/releases/0.84.0/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
  115. package/releases/0.84.0/surfaces/money/tree/.claude/agents/secops.md +5 -0
  116. package/releases/0.84.0/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
  117. package/releases/0.84.0/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
  118. package/releases/0.84.0/surfaces/money/tree/.claude/graph.md +2 -0
  119. package/releases/0.84.0/surfaces/money/tree/.claude/patterns.md +49 -0
  120. package/releases/0.84.0/surfaces/money/tree/.claude/pipeline.md +2 -0
  121. package/releases/0.84.0/surfaces/money/tree/.claude/retrieval.md +2 -0
  122. package/releases/0.84.0/surfaces/money/tree/CLAUDE.md +11 -0
  123. package/releases/0.84.0/surfaces/pii/tree/.claude/agents/dba.md +2 -0
  124. package/releases/0.84.0/surfaces/pii/tree/.claude/agents/devops.md +8 -0
  125. package/releases/0.84.0/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
  126. package/releases/0.84.0/surfaces/pii/tree/.claude/agents/secops.md +2 -0
  127. package/releases/0.84.0/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
  128. package/releases/0.84.0/surfaces/pii/tree/CLAUDE.md +5 -0
  129. package/releases/0.84.0/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
  130. package/releases/0.84.0/surfaces/prisma/tree/.claude/agents/dba.md +42 -0
  131. package/releases/0.84.0/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
  132. package/releases/0.84.0/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
  133. package/releases/0.84.0/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
  134. package/releases/0.84.0/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
  135. package/releases/0.84.0/surfaces/prisma/tree/.claude/patterns.md +15 -0
  136. package/releases/0.84.0/surfaces/prisma/tree/CLAUDE.md +5 -0
  137. package/releases/0.85.0/core/GAPS.md +125 -0
  138. package/releases/0.85.0/core/answered.json +137 -0
  139. package/releases/0.85.0/core/defaults/tree/.claude/agents/architect.md +1 -0
  140. package/releases/0.85.0/core/defaults/tree/.claude/agents/dba.md +3 -0
  141. package/releases/0.85.0/core/defaults/tree/.claude/agents/devops.md +1 -0
  142. package/releases/0.85.0/core/defaults/tree/.claude/agents/implementer.md +1 -0
  143. package/releases/0.85.0/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
  144. package/releases/0.85.0/core/defaults/tree/.claude/agents/qa.md +7 -0
  145. package/releases/0.85.0/core/defaults/tree/.claude/agents/reviewer.md +3 -0
  146. package/releases/0.85.0/core/defaults/tree/.claude/agents/secops.md +3 -0
  147. package/releases/0.85.0/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
  148. package/releases/0.85.0/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
  149. package/releases/0.85.0/core/tiers.json +5 -0
  150. package/releases/0.85.0/core/tree/.claude/agents/architect.md +140 -0
  151. package/releases/0.85.0/core/tree/.claude/agents/dba.md +123 -0
  152. package/releases/0.85.0/core/tree/.claude/agents/design-reviewer.md +82 -0
  153. package/releases/0.85.0/core/tree/.claude/agents/devops.md +122 -0
  154. package/releases/0.85.0/core/tree/.claude/agents/implementer.md +208 -0
  155. package/releases/0.85.0/core/tree/.claude/agents/integration-tester.md +174 -0
  156. package/releases/0.85.0/core/tree/.claude/agents/planner.md +132 -0
  157. package/releases/0.85.0/core/tree/.claude/agents/qa.md +154 -0
  158. package/releases/0.85.0/core/tree/.claude/agents/reviewer.md +191 -0
  159. package/releases/0.85.0/core/tree/.claude/agents/secops.md +124 -0
  160. package/releases/0.85.0/core/tree/.claude/agents/solidity-auditor.md +130 -0
  161. package/releases/0.85.0/core/tree/.claude/agents/solidity-dev.md +127 -0
  162. package/releases/0.85.0/core/tree/.claude/agents-overview.md +65 -0
  163. package/releases/0.85.0/core/tree/.claude/frontend.md +10 -0
  164. package/releases/0.85.0/core/tree/.claude/graph.md +79 -0
  165. package/releases/0.85.0/core/tree/.claude/patterns.md +256 -0
  166. package/releases/0.85.0/core/tree/.claude/pills/README.md +150 -0
  167. package/releases/0.85.0/core/tree/.claude/pipeline.md +101 -0
  168. package/releases/0.85.0/core/tree/.claude/retrieval.md +103 -0
  169. package/releases/0.85.0/core/tree/.claude/router.md +224 -0
  170. package/releases/0.85.0/core/tree/.claude/templates/integration.md +48 -0
  171. package/releases/0.85.0/core/tree/CLAUDE.md +167 -0
  172. package/releases/0.85.0/core/tree/scripts/cost-watch.mjs +27 -0
  173. package/releases/0.85.0/core/tree/scripts/edit-guard.mjs +24 -0
  174. package/releases/0.85.0/core/tree/scripts/harness-check.mjs +84 -0
  175. package/releases/0.85.0/core/tree/scripts/loop-gate.mjs +19 -0
  176. package/releases/0.85.0/core/vocabulary.json +18 -0
  177. package/releases/0.85.0/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
  178. package/releases/0.85.0/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
  179. package/releases/0.85.0/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
  180. package/releases/0.85.0/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
  181. package/releases/0.85.0/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
  182. package/releases/0.85.0/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
  183. package/releases/0.85.0/surfaces/blockchain/tree/.claude/graph.md +11 -0
  184. package/releases/0.85.0/surfaces/blockchain/tree/.claude/router.md +6 -0
  185. package/releases/0.85.0/surfaces/blockchain/tree/CLAUDE.md +12 -0
  186. package/releases/0.85.0/surfaces/d1/tree/.claude/agents/dba.md +15 -0
  187. package/releases/0.85.0/surfaces/d1/tree/.claude/agents/devops.md +2 -0
  188. package/releases/0.85.0/surfaces/d1/tree/.claude/agents/implementer.md +2 -0
  189. package/releases/0.85.0/surfaces/d1/tree/.claude/patterns.md +8 -0
  190. package/releases/0.85.0/surfaces/d1/tree/CLAUDE.md +2 -0
  191. package/releases/0.85.0/surfaces/db/tree/.claude/agents/architect.md +5 -0
  192. package/releases/0.85.0/surfaces/db/tree/.claude/agents/dba.md +54 -0
  193. package/releases/0.85.0/surfaces/db/tree/.claude/agents/devops.md +5 -0
  194. package/releases/0.85.0/surfaces/db/tree/.claude/agents/implementer.md +2 -0
  195. package/releases/0.85.0/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
  196. package/releases/0.85.0/surfaces/db/tree/.claude/agents/planner.md +2 -0
  197. package/releases/0.85.0/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
  198. package/releases/0.85.0/surfaces/db/tree/.claude/agents/secops.md +2 -0
  199. package/releases/0.85.0/surfaces/db/tree/.claude/agents-overview.md +5 -0
  200. package/releases/0.85.0/surfaces/db/tree/.claude/graph.md +8 -0
  201. package/releases/0.85.0/surfaces/db/tree/.claude/patterns.md +22 -0
  202. package/releases/0.85.0/surfaces/db/tree/.claude/pipeline.md +13 -0
  203. package/releases/0.85.0/surfaces/db/tree/.claude/retrieval.md +5 -0
  204. package/releases/0.85.0/surfaces/db/tree/.claude/router.md +4 -0
  205. package/releases/0.85.0/surfaces/db/tree/CLAUDE.md +17 -0
  206. package/releases/0.85.0/surfaces/drizzle/tree/.claude/agents/dba.md +9 -0
  207. package/releases/0.85.0/surfaces/drizzle/tree/.claude/agents/devops.md +5 -0
  208. package/releases/0.85.0/surfaces/drizzle/tree/.claude/agents/implementer.md +2 -0
  209. package/releases/0.85.0/surfaces/drizzle/tree/.claude/patterns.md +7 -0
  210. package/releases/0.85.0/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
  211. package/releases/0.85.0/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
  212. package/releases/0.85.0/surfaces/edge-cf/tree/.claude/agents/devops.md +29 -0
  213. package/releases/0.85.0/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
  214. package/releases/0.85.0/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
  215. package/releases/0.85.0/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
  216. package/releases/0.85.0/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
  217. package/releases/0.85.0/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
  218. package/releases/0.85.0/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
  219. package/releases/0.85.0/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
  220. package/releases/0.85.0/surfaces/edge-cf/tree/CLAUDE.md +29 -0
  221. package/releases/0.85.0/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
  222. package/releases/0.85.0/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
  223. package/releases/0.85.0/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
  224. package/releases/0.85.0/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
  225. package/releases/0.85.0/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
  226. package/releases/0.85.0/surfaces/frontend/tree/.claude/patterns.md +8 -0
  227. package/releases/0.85.0/surfaces/frontend/tree/.claude/retrieval.md +2 -0
  228. package/releases/0.85.0/surfaces/frontend/tree/.claude/router.md +14 -0
  229. package/releases/0.85.0/surfaces/frontend/tree/CLAUDE.md +5 -0
  230. package/releases/0.85.0/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
  231. package/releases/0.85.0/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
  232. package/releases/0.85.0/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
  233. package/releases/0.85.0/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
  234. package/releases/0.85.0/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
  235. package/releases/0.85.0/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
  236. package/releases/0.85.0/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
  237. package/releases/0.85.0/surfaces/integrations/tree/.claude/graph.md +10 -0
  238. package/releases/0.85.0/surfaces/integrations/tree/.claude/patterns.md +38 -0
  239. package/releases/0.85.0/surfaces/integrations/tree/.claude/pipeline.md +16 -0
  240. package/releases/0.85.0/surfaces/integrations/tree/.claude/retrieval.md +16 -0
  241. package/releases/0.85.0/surfaces/integrations/tree/.claude/router.md +6 -0
  242. package/releases/0.85.0/surfaces/integrations/tree/CLAUDE.md +17 -0
  243. package/releases/0.85.0/surfaces/money/tree/.claude/agents/architect.md +12 -0
  244. package/releases/0.85.0/surfaces/money/tree/.claude/agents/dba.md +14 -0
  245. package/releases/0.85.0/surfaces/money/tree/.claude/agents/implementer.md +11 -0
  246. package/releases/0.85.0/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
  247. package/releases/0.85.0/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
  248. package/releases/0.85.0/surfaces/money/tree/.claude/agents/secops.md +5 -0
  249. package/releases/0.85.0/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
  250. package/releases/0.85.0/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
  251. package/releases/0.85.0/surfaces/money/tree/.claude/graph.md +2 -0
  252. package/releases/0.85.0/surfaces/money/tree/.claude/patterns.md +49 -0
  253. package/releases/0.85.0/surfaces/money/tree/.claude/pipeline.md +2 -0
  254. package/releases/0.85.0/surfaces/money/tree/.claude/retrieval.md +2 -0
  255. package/releases/0.85.0/surfaces/money/tree/CLAUDE.md +11 -0
  256. package/releases/0.85.0/surfaces/pii/tree/.claude/agents/dba.md +2 -0
  257. package/releases/0.85.0/surfaces/pii/tree/.claude/agents/devops.md +8 -0
  258. package/releases/0.85.0/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
  259. package/releases/0.85.0/surfaces/pii/tree/.claude/agents/secops.md +2 -0
  260. package/releases/0.85.0/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
  261. package/releases/0.85.0/surfaces/pii/tree/CLAUDE.md +5 -0
  262. package/releases/0.85.0/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
  263. package/releases/0.85.0/surfaces/prisma/tree/.claude/agents/dba.md +42 -0
  264. package/releases/0.85.0/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
  265. package/releases/0.85.0/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
  266. package/releases/0.85.0/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
  267. package/releases/0.85.0/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
  268. package/releases/0.85.0/surfaces/prisma/tree/.claude/patterns.md +15 -0
  269. package/releases/0.85.0/surfaces/prisma/tree/CLAUDE.md +5 -0
  270. package/src/commands/dashboard.mjs +31 -6
  271. package/src/dashboard.mjs +11 -8
  272. package/src/demo.mjs +434 -0
  273. package/src/office.mjs +42 -9
@@ -0,0 +1,49 @@
1
+ <!-- nina:slot money.1 -->
2
+
3
+ ---
4
+
5
+ ## Monetary values & percentages
6
+
7
+ - **Money is an integer of the currency's minor unit**, end to end — {{MINOR_UNIT}}, never a float, never a type that can hold a fraction of one. Source of precision: `{{MONEY_MODULE}}`.
8
+ - **Percentages are basis points** (`40% → 4000`, `100% → 10000`) so a distribution is exact without floating point.
9
+ - **Parsing, formatting and percentage arithmetic live in one module and nowhere else.** A second place that turns a string into money is a second rounding rule, and the two will disagree on a value somebody is owed.
10
+ - **Never** convert to a floating-point type before formatting, and never let a display format round a stored value.
11
+ - Monetary database columns are integer. JSON responses serialize them as **strings**, not numbers, so no client parses them into a float. The service owns the conversion.
12
+
13
+ <!-- nina:slot money.2 -->
14
+
15
+ ---
16
+
17
+ ## Distribution invariants (enforced by reviewer + unit tests)
18
+
19
+ The distribution engine lives in `{{CORE_PKG}}`. It is pure and total over integer {{MINOR_UNIT}}:
20
+
21
+ - A destination is either a percentage (basis points of the amount) or a fixed value.
22
+ - `total = Σ destinations`, computed in {{MINOR_UNIT}}.
23
+ - `total > amount` → **reject.** Never clamp, never distribute what is not there.
24
+ - `total < amount` → **allow**, surface the shortfall, and leave the remainder **parked**. Silence is the defect here: an unexplained remainder is indistinguishable from a bug.
25
+ - `total = amount` → OK.
26
+ - A retention is just another destination — the same arithmetic applies to it, with no special case.
27
+
28
+ <!-- nina:slot money.3 -->
29
+
30
+ ---
31
+
32
+ ## State machines & idempotency (enforced by reviewer)
33
+
34
+ - **Every money-moving entity is a state machine.** Its states and legal transitions are declared in `.claude/architecture.md`; the code follows the declaration, not the other way round. Illegal transitions throw; they are never silently coerced.
35
+ - **Every transition writes an audit row** (entity type, entity id, from, to, actor). No transition without a trail — the trail is what makes a money bug diagnosable after the money has moved.
36
+ - **Outbound transfers are idempotent.** Each carries a unique key, and dedupe happens before the side effect, at the serialization point.
37
+ - **One serialization point per balance.** Whatever computes and dispatches against a single balance never runs concurrently with itself. Two concurrent runs over one balance is how a double send happens even when every individual write is correct.
38
+
39
+ <!-- nina:slot money.4 -->
40
+ - **Money computation and dispatch go through the serialization point.** Routes, queue consumers and tools never run a distribution or a transfer synchronously in the request path.
41
+
42
+ <!-- nina:slot money.5 -->
43
+ - **The distribution engine lives in `{{CORE_PKG}}`.** Services call it as a pure function; they do not embed money logic inline.
44
+
45
+ <!-- nina:slot money.6 -->
46
+ - Idempotency on money-moving writes: the record carries an idempotency key, and the serialization point refuses the second attempt *before* the side effect.
47
+
48
+ <!-- nina:slot money.7 -->
49
+ - `{{CORE_PKG}}` is the most-tested package — pure functions over fixtures. Cover the distribution invariants exhaustively: over, under, exact, mixed percentage and fixed, and rounding.
@@ -0,0 +1,2 @@
1
+ <!-- nina:slot money.1 -->
2
+ - **Money invariants respected** — a distribution never exceeds the amount; a shortfall is parked, not distributed; transfers idempotent; every transition audited.
@@ -0,0 +1,2 @@
1
+ <!-- nina:slot money.1 -->
2
+ | New distribution / transfer logic | `.claude/architecture.md` § *Money*, `.claude/patterns.md` § *Distribution invariants*, `{{CORE_PKG}}/` | architect → implementer → reviewer → qa |
@@ -0,0 +1,11 @@
1
+ <!-- nina:slot money.1 -->
2
+ 3. **An outbound transfer is idempotent — it is NEVER sent twice.** Every transfer carries an idempotency key, and deduplication happens at a single serialization point **before** the side effect, never after it. A retry, a re-delivered queue message, a double-click and a replayed webhook must all collapse to one transfer. This is the highest-blast-radius invariant in the system: almost everything else can be corrected afterwards, and a duplicated transfer cannot.
3
+
4
+ <!-- nina:slot money.2 -->
5
+ 4. **Conservation — what comes in equals what goes out plus what is retained.** A distribution may NEVER exceed the amount it distributes → **block**. If it is **less**, **alert** and leave the remainder **parked** and visible — never silently distributed, never silently absorbed. All arithmetic is integer {{MINOR_UNIT}}; percentages are basis points. The LLM never computes a monetary value.
6
+
7
+ <!-- nina:slot money.3 -->
8
+ 5. **State-machine integrity.** Every money-moving entity has an explicit set of states and legal transitions, declared in `.claude/architecture.md` § *State machines* — not inferred from whatever code happens to exist. Only declared transitions are legal; an illegal one throws and is never silently coerced. **Every transition writes an audit row** (entity, id, from → to, actor, when). Skipping a state, inventing one, or landing a transition with no audit row is a hard reject.
9
+
10
+ <!-- nina:slot money.4 -->
11
+ - **money movement**: anything that creates, moves, settles or records a balance
@@ -0,0 +1,2 @@
1
+ <!-- nina:slot pii.1 -->
2
+ - **Privacy.** No sensitive value in clear text where it must not be. The categories are declared in `.claude/architecture.md` § *Privacy* — they are not decided per query, and not decided by you. **Document bytes live only in the object store, referenced by key: the column holds the key, never the bytes.** Any column the architect's spec flagged for masking must be encrypted at rest. Reject a schema that widens what is stored in the clear.
@@ -0,0 +1,8 @@
1
+ <!-- nina:slot pii.1 -->
2
+
3
+ **Point it at an UNAUTHENTICATED route — a sign-in page is the right one.** Never sign in, and never
4
+ screenshot a signed-in page. Accounts on deployed environments hold real personal data, and a
5
+ screenshot or a console dump pulls it into agent transcripts and logs, where it persists and nobody
6
+ ever looks for it again. That is a privacy leak with no upside here: the sign-in page proves
7
+ everything this check is for. It renders from the same bundle, it exercises the same build-time env
8
+ inlining (a missing variable blanks it identically), and it needs no session.
@@ -0,0 +1,8 @@
1
+ <!-- nina:slot pii.1 -->
2
+ - Check for privacy regressions: **no sensitive value in a log, an error message — a library's own included — a URL or a test fixture**, per the categories in `.claude/architecture.md` § *Privacy*; document bytes only in the object store, never plaintext in the database; no leaked secret.
3
+
4
+ <!-- nina:slot pii.2 -->
5
+ - **privacy** — the privacy check above, in full: no sensitive value in a log, an error message, a
6
+ URL or a test fixture; document bytes only in the object store; no leaked secret. Where
7
+ **tenant-and-privacy** is dispatched, its reviewer owns this too and there is no separate one; where
8
+ it is not, this is a dimension of its own. Either way it is never nobody's.
@@ -0,0 +1,2 @@
1
+ <!-- nina:slot pii.1 -->
2
+ - **Privacy (Hard Rule #8)** — the categories declared in `.claude/architecture.md` § *Privacy* must never appear in logs, in responses that do not need them, in error paths, or in the database in clear text. Check every endpoint that returns a person's record for fields it includes by accident: a `select` that quietly grew a column is the usual way this leaks. Check the error paths too — they are written last and reviewed least — and what the libraries on them print or carry in their own errors, bound values included.
@@ -0,0 +1,5 @@
1
+ <!-- nina:slot pii.1 -->
2
+ - **Nothing personal reaches the chain.** What is written on-chain is public, permanent, and beyond
3
+ deletion by anyone — including by you, and including after a subject asks. A hash of a personal
4
+ identifier is not a protection: it is a lookup table for whoever holds the input set. Reject a
5
+ personal datum stored in state, emitted in an event, or passed as calldata.
@@ -0,0 +1,5 @@
1
+ <!-- nina:slot pii.1 -->
2
+ 8. **Sensitive personal data is classified, and the classification is enforced.** What counts as sensitive here — identity documents, financial identifiers, anything a person would not expect to be readable by whoever can read a log — is declared in `.claude/architecture.md` § *Privacy*, along with the regime that governs it ({{PRIVACY_REGIME}}). Encrypted at rest. **No sensitive value in a log, an error message, a URL, an analytics event, or an agent transcript** — the places nobody thinks about are exactly the ones that persist. That includes what a library puts in its own errors and prints itself: a database client's error can carry the query and every bound value, and a framework can log a whole error past the logger it was given. A database error is mapped at the data layer to a typed error from a closed list before anything logs or returns it, and a test proves that a bound value it writes reaches no thrown error. **A value absent from an error that never held it proves nothing:** each test that shows a mapper or a sanitizer keeps a value out drives a failure whose raw error carries it — the spec names that failure class and cites where it renders bound values, an error that prints the call or a violation that echoes the input, never one that names only its constraint — and asserts first that the raw, unmapped error of the same operation contains the value, a control kept in memory and never printed; the mutant that copies the raw error's `message`, `cause` or details across turns it red.<!-- nina:why --> In one project a spec proved its error mapper on a foreign-key failure, whose message and details name only the constraint, so no mapper that copied them could turn the test red.<!-- /nina:why --> **A test that proves a value stays out matches by containment** (`String(v).includes(value)`), never by equality: a leak arrives inside an id, a message or a key. It gives each log call in the source a run, counts the console's calls by method and asserts each method the path must not use at zero, and reads at least what the console prints of each entry and each error the runs produce, recursively: every own key, symbols and non-enumerable ones too (`Reflect.ownKeys`), and the entries of every `Map`, `Set`, `Headers` and `URLSearchParams`, unless the spec rules one out in writing. Its controls put their value where the real emitter puts its own, past a call's first argument and among several, and the spec names the window its spy covers and why nothing logs after it. Its forbidden values are the run's own that § *Privacy* keeps out — where it lists what may be logged, every other value the run carries — each with a control that embeds it in a longer string under an allowed key and must fail the check — the values one run adds as much as a shared list's, since a check that folds accents passes every control written in ASCII — and no fixture value inside another's.<!-- nina:why --> In one project an allowlist check that refused only equal values passed a mutant logging `${id}:${amount}`; the next read `Object.keys` and missed an amount on a non-enumerable property and an info log no row inspected; the one after left out a class and four log paths.<!-- /nina:why --> Where what it claims to keep out names a class — an attribute, an amount — it covers every member: a surface with open-ended slots is read whole, never through a list of them — every attribute of every element a rendered page carries, just as every property of an error is — and a sweep that read nothing fails; each forbidden value is looked for in every form the code can give it, formatted and raw; and each state that shows, hides or replaces a value is swept on its own, the one built to withhold it most of all. One mutant puts the value in a slot the check does not name — `data-x` on a page; on an object or an error, a non-enumerable key, a symbol key, a nested object, a `Map` entry, `cause`, the end of `message` or `stack` — and one per field puts that field's raw value in each such slot, on every error the code throws, not only one it builds: one left green is a slot or a form the check misses. The implementer runs them on its mirror, as one block it reuses, before `DIFF-READY`, whatever the step lists, and reports one left green as the row the spec lacks (Hard Rule #17), adding it only in a file the step authorizes.<!-- nina:why --> In one project a walk of own keys missed a `Map`, a symbol key and a nested object, and every control put its value in a call's first argument, where the runtime's loggers put theirs second; then three steps in two days went back from review for a slot no listed mutant tried — an error's `cause`, its `stack`, a hidden key.<!-- /nina:why --><!-- nina:why --> In one project a sweep of `data-testid`, `aria-label` and `title`, proven by mutants in those three, stayed green with the label in a `data-label`; the next swept every attribute for the formatted amounts and missed their raw centavos; the one after swept only the state that shows the figure, and the row built to show none carried it in a `title`.<!-- /nina:why --> Document bytes live only in the object store, referenced by key, never in the database in clear text.
3
+
4
+ <!-- nina:slot pii.2 -->
5
+ - **personal data**: where it is collected, stored, logged or sent
@@ -0,0 +1,2 @@
1
+ <!-- nina:slot prisma.1 -->
2
+ | `prisma-client-api` | a new or changed Prisma query |
@@ -0,0 +1,42 @@
1
+ <!-- nina:slot prisma.1 -->
2
+ | `prisma-cli` | **before ANY `prisma` CLI command** — `validate`, `format`, `migrate dev`, `migrate diff`, `migrate deploy`. Flags differ between versions, and one of them (`migrate diff --shadow-database-url` against a live database) destroys the database it points at |
3
+ | `prisma-client-api` | auditing a new or changed query — filters, operators, `$transaction` semantics. Through a driver adapter, cite the adapter's installed source for what a transaction does: the skill describes the default engine, and an adapter can roll back less |
4
+
5
+ <!-- nina:slot prisma.2 -->
6
+ Neither skill covers a **caching or edge layer sitting on top of the client** — cache strategy,
7
+ edge-client behaviour and the rule about never caching a read that authorizes a write belong to that
8
+ layer's own integration doc, declared like any other integration. A skill does not replace it.
9
+
10
+ <!-- nina:slot prisma.3 -->
11
+ - **With Prisma, both offline.** Run `pnpm --filter {{DB_PKG_NAME}} exec prisma validate`; it must pass. Then run `prisma migrate diff` in its **offline, file-only form** and read the generated SQL, not just the Prisma delta. Its flags changed in Prisma 7, so read the installed major (`prisma --version`) before writing the command:
12
+
13
+ ```
14
+ # Prisma 6. Compare the PREVIOUS schema against the working one — pure file-to-file, no database.
15
+ git show HEAD:{{DB_PKG}}/prisma/schema.prisma > /tmp/schema-head.prisma
16
+ pnpm --filter {{DB_PKG_NAME}} exec prisma migrate diff \
17
+ --from-schema-datamodel /tmp/schema-head.prisma \
18
+ --to-schema-datamodel prisma/schema.prisma \
19
+ --script
20
+ ```
21
+
22
+ From Prisma 7 the two flags are `--from-schema` and `--to-schema`, and the schema engine starts from the
23
+ datasource in `prisma.config.ts` even for this diff: with none there, it prints nothing and exits 0. For
24
+ SQLite a placeholder the diff never opens is enough, a `file:` URL under a gitignored directory; for any
25
+ other provider, find out what the diff opens before you give it one. Never a real database's URL. A first schema has nothing at `HEAD`: diff it `--from-empty`. Compare the output against the
26
+ hand-written `migration.sql` to confirm the declarative parts match.
27
+
28
+ ⚠️ **Do NOT reach for `--from-migrations`.** It looks like the natural choice and it is a trap:
29
+ Prisma refuses it without a shadow database (`--shadow-database-url`, or from Prisma 7 a
30
+ `shadowDatabaseUrl` in `prisma.config.ts`), which pushes you toward supplying a database URL — the exact move that destroys databases (below). The file-to-file form above answers the
31
+ same question with no database involved.
32
+
33
+ ⛔ **NEVER point `--shadow-database-url`, `--from-url`, `--to-url`, `--from-schema-datasource` — or, from Prisma 7, a `shadowDatabaseUrl` or the config datasource behind `--from-config-datasource` — at a real database, most of all not the one `{{SECRETS_LOCAL}}` names.** Prisma **executes** the entire migration history against whatever database those flags name, which **DESTROYS ALL DATA** in it. A shadow database must be a disposable, empty database and nothing else. It does not announce itself: the command completes with a reassuring "empty migration" result and no error, having already destroyed everything in the database it was pointed at. If the offline form above cannot answer your question, **STOP and report that to the orchestrator** instead of reaching for a database URL.
34
+
35
+ <!-- nina:slot prisma.4 -->
36
+ - **Where reads are cached through Prisma Accelerate,** every `findUnique` / `findMany` on a hot read path names its `cacheStrategy` (`ttl` / `swr`), and one that feeds a correctness-critical write names none.
37
+
38
+ <!-- nina:slot prisma.5 -->
39
+ - **On an edge runtime,** new Prisma code paths use the edge client of the installed major: `@prisma/client/edge` up to Prisma 6; from 7, the client the `prisma-client` generator writes with the platform's `runtime` set, imported from where it is generated — `@prisma/client/edge` fails there with `MODULE_NOT_FOUND`.
40
+
41
+ <!-- nina:slot prisma.6 -->
42
+ - Run a Prisma command that writes to a real database — `prisma migrate dev`, `migrate deploy`, `migrate reset`, `migrate resolve`, `db push`, `db execute`, `$executeRaw*` — or **any `prisma migrate diff` variant carrying a database URL**, which silently wipes the database it points at.
@@ -0,0 +1,11 @@
1
+ <!-- nina:slot prisma.1 -->
2
+ - **`prisma-cli`** — before `migrate deploy` or any other Prisma CLI command against a real database.
3
+
4
+ <!-- nina:slot prisma.2 -->
5
+ - **Prisma migrations go out with `prisma migrate deploy`**, and nothing else changes a shared database's schema.
6
+
7
+ <!-- nina:slot prisma.3 -->
8
+ - Run `prisma migrate diff --shadow-database-url <url>` against any live database. It **executes** the migration history against that database, destroying everything in it, and reports success. Use a disposable shadow database or don't run it.
9
+
10
+ <!-- nina:slot prisma.4 -->
11
+ - Run `prisma migrate reset` against a shared database, ever.
@@ -0,0 +1,2 @@
1
+ <!-- nina:slot prisma.1 -->
2
+ | `prisma-client-api` | a new or changed Prisma query |
@@ -0,0 +1,2 @@
1
+ <!-- nina:slot prisma.1 -->
2
+ | `prisma-cli` | a Prisma CLI command |
@@ -0,0 +1,2 @@
1
+ <!-- nina:slot prisma.1 -->
2
+ | `prisma-client-api` | a new or changed Prisma query |
@@ -0,0 +1,15 @@
1
+ <!-- nina:slot prisma.1 -->
2
+ - **Database table/column names** (Prisma `@map` / `@@map`): `snake_case` in SQL, `camelCase` in TS.
3
+
4
+ <!-- nina:slot prisma.2 -->
5
+ - Where Prisma reads are cached through Accelerate, `cacheStrategy` lives in `{{DB_PKG}}`: services do not add, strip, or override cache policies.
6
+
7
+ <!-- nina:slot prisma.3 -->
8
+
9
+ ### Prisma
10
+
11
+ - Schema lives in `{{DB_PKG}}/prisma/schema.prisma`. Nowhere else.
12
+ - **Never write raw SQL** unless justified in a code comment with perf data.
13
+ - N+1 is solved with `include` / `select`, chosen deliberately.
14
+ - Where reads are cached through Accelerate, every `findUnique` / `findMany` on a hot path defines its `cacheStrategy`, and no direct connection string is embedded in code.
15
+ - Tests run a real Prisma client against a real database; the client is never mocked.
@@ -0,0 +1,5 @@
1
+ <!-- nina:slot prisma.1 -->
2
+ | Run any `prisma` CLI command (the database gate, devops, and the integration gate where there is one) | `prisma-cli` | flags differ between versions; `migrate diff --shadow-database-url` against a live DB wiped dev/staging once |
3
+
4
+ <!-- nina:slot prisma.2 -->
5
+ | Write or audit a Prisma query (architect, implementer, the database gate, reviewer) | `prisma-client-api` | filters, operators, `$transaction` semantics. a caching or edge layer on top of the client is **NOT covered** — its cache strategy belongs to that layer's own integration doc |
@@ -0,0 +1,125 @@
1
+ # Known gaps
2
+
3
+ The harness was extracted by slicing one live project, and a slice cannot be cleaner than the
4
+ thing it was cut from. This file tracks what is still shaped by that origin.
5
+
6
+ ## Closed
7
+
8
+ **Domain examples in the core.** The extraction had to leave money and PII nouns in otherwise
9
+ invariant rules, because byte-exact recomposition was the proof that nothing was lost and
10
+ rewriting a line broke it. Once projects started pinning a release, that constraint lifted:
11
+ the core no longer names payouts, escrow, KYC, PIX, CPF or a single provider, and the
12
+ `db` surface no longer assumes the write it protects is a money movement. `fixtures/acme`
13
+ holds the line — it declares no `money` and no `pii` surface, and the test fails on any of
14
+ those words reappearing.
15
+
16
+ **The single-provider assumption.** `external-api` became `integrations`, plural, cut by how
17
+ a premise is settled (`installed-library` / `live-api` / `platform-binding`) rather than by
18
+ one project's payment provider.
19
+
20
+ **The `money` surface was one project's money path.** It shipped that project's state machine
21
+ (`DETECTADA → CASADA | DIVERGENTE | SEM_REGRA`) as a harness rule, named its models, its
22
+ currency and its escrow vocabulary, and assumed one payment provider. It now states the
23
+ invariants and nothing else: conservation, idempotency of an irreversible send, one
24
+ serialization point per balance, integer minor units, and a state machine the **project**
25
+ declares in its own `.claude/architecture.md`. `fixtures/ledger` holds that line — a money
26
+ project whose minor unit is `cents`, whose engine is `packages/settlement`, and whose deny
27
+ list fails on `escrow`, `centavos`, `Payout`, `DETECTADA` or any of the rest reappearing.
28
+
29
+ **The `pii` surface was one country's regime.** It named CPF/CNPJ, PIX keys, KYC documents, LGPD,
30
+ R2 and Postgres as if they were universal categories. It now says that sensitive categories are
31
+ **declared by the project** in its own `.claude/architecture.md`, and states what is invariant:
32
+ classified, encrypted at rest, never in a log, an error, a URL, an analytics event or an agent
33
+ transcript, and document bytes only in the object store. `fixtures/ledger` declares `pii` with a
34
+ `GDPR` regime and fails on any of the old words returning.
35
+
36
+ **Incident dates that read as false history.** Five places told a rule through a date it happened
37
+ on — a wiped database on 2026-09-16, a blocked deploy on 2026-09-21, specs split across two
38
+ directories before 2026-09-04. In the project where it happened that is provenance; in a new one it
39
+ is a claim about a past it does not have, and an agent will go looking for it. The rules keep their
40
+ force without the date: *"the command completes with a reassuring 'empty migration' result and no
41
+ error, having already destroyed everything in the database it was pointed at."*
42
+
43
+ **A rule cross-reference that pointed at nothing.** The hard rules are one numbered list assembled
44
+ from several layers, so a project that declares no `integrations` surface has no rule 12 — while the
45
+ core still said "the premise rule (#12 below)". `compose-test` now checks every `Hard Rule #N`
46
+ against the rules the project actually composed, and `fixtures/plain` declares no surface at all, so
47
+ the most reduced case is exercised on every run.
48
+
49
+ **Invariant rules that landed in the project layer.** Four rules were generically valuable but were
50
+ stated through an incident or an inventory belonging to one project, so the project layer swallowed
51
+ them and a new project got nothing. Each was restated in the layer that actually owns it:
52
+
53
+ | Spec | What it got back |
54
+ |---|---|
55
+ | secops | the **AuthN / session** dimension is now core: credential issuance and consumption, cookie flags, fixation across a privilege change, origin allowlist, and any dev bypass that could reach production. The project slot survives for the auth library and the bypasses that project actually has. |
56
+ | qa | the *"pre-existing failure"* traps moved to `surfaces/frontend` — they are facts about a jsdom + vitest harness, not about one feature. The project slot held only the provenance, so it was dropped. |
57
+ | architect, implementer | both specs now state the Route → Service → Data rule themselves instead of only `patterns.md` stating it. The project slot survives for the package names. |
58
+ | patterns | *"when correcting a document, delete what you are correcting"* is now a core section. |
59
+
60
+ **The threat model was numbered, and the numbers came from slots.** Dimensions 1–8 lived in surface
61
+ fragments and 9–10 in the core, so a project declaring every surface got 1–10 and everyone else got
62
+ a list with holes: `acme` read `2, 3, 6, 8, 9, 10`, and a surfaceless project began at **9**. The
63
+ list is bullets now, valid under any combination. The core's rate-limiting dimension also named one
64
+ project's auth strategy (`magic-link request, dev routes`); it says `issues a credential` instead.
65
+
66
+ **A surface's technology was named in files nothing gated.** The item above used to bundle two
67
+ different things under "stack-specific", and only one of them was a choice. `Prisma` appeared in 7
68
+ ungated core files and Cloudflare's runtime in 10 — technologies that already *have* surfaces, named
69
+ in text every project composes. A frontend-only project read a `CLAUDE.md` that discussed Prisma, a
70
+ `patterns.md` headed *API (Cloudflare Worker / Hono) conventions*, and a qa spec telling it to kill
71
+ stray `workerd` processes that could not exist. The reviewer even pointed at `CLAUDE.md` §
72
+ *Cloudflare plugin skills*, a section that lives in the edge-cf surface — a dangling cross-reference
73
+ of exactly the kind already closed once here.
74
+
75
+ 42 sites were fixed by saying what the rule means rather than which product implements it: "if the
76
+ database was touched" instead of "if Prisma touched", "deploy config" instead of "wrangler config",
77
+ "the local emulator" instead of "Miniflare". None of it lost precision, because the instruction was
78
+ never about the product. Where a genuine specific was worth keeping it moved into `surfaces/edge-cf`
79
+ behind a slot.
80
+
81
+ The deny lists never caught this, and could not: they guard one fixture's output against *domain*
82
+ leaks, and a substring match makes a word like `Hono` unusable because it fires on `Honor`. The
83
+ guard is now a layer audit in `compose:test` — for every core file, a surface's technology may be
84
+ named only if the file is gated on that surface. It asks the question once, of everything, instead
85
+ of only of what a fixture happens to compose.
86
+
87
+ **Money in the core, and the heavy-gate list that carried it.** The extraction closed money's nouns
88
+ (payout, escrow, the state machine) but not the word itself: ten places in the core listed "money, the
89
+ database, auth, an integration" as the changes that are always gated in full, so a project with no
90
+ money was told that under-gating a money movement was a protocol violation, and its devops that a
91
+ production deploy "moves real money". The audit now holds `money` like a technology, and found 19 of
92
+ them. The list is one definition of **critical paths** in `CLAUDE.md` — auth in the core, and the
93
+ database, an integration boundary, money movement, personal data and contract code each added by its
94
+ own surface — and the ten places say "a critical path". Two copies of money's own rules had also
95
+ landed in `surfaces/db` (`BigInt` columns, a money-integrity check in the dba's report), contradicting
96
+ the money surface's integer minor unit; they are gone, since the money surface already says it better.
97
+ The same pass found Cloudflare's `Pages`, `Worker` and a capitalised `Wrangler` in the core and in
98
+ two surfaces, and the leftovers no audit could name: a model called `DestinationAccount` and a spec
99
+ set called `retention-spec1..8` in the router's examples, "all nine stages" where a profile composes
100
+ seven to eleven, `userId` as the name of owner scoping, and "the harness's first three months" told
101
+ as the history of whichever project was reading it.
102
+
103
+ ## Open
104
+
105
+ **The core is domain-agnostic, not stack-agnostic — deliberately.** The stack's own commands are
106
+ vocabulary now, with the release's defaults (`core/vocabulary.json`): the typecheck, lint and build
107
+ commands a spec tells a stage to run, and the test command every stage but qa is told not to run. qa's
108
+ own targeted `vitest run` stays literal. What remains is the stack's substance, not its commands:
109
+ `vitest` and its memory discipline, `TSDoc`, `TypeScript`, `turbo`, and `pnpm` wherever a sentence
110
+ describes the workspace rather than a command to run. That is the single track
111
+ this harness is for, and most of it is load-bearing: the qa spec's memory discipline is a fact about
112
+ vitest, not about testing. Unlike the surface leak above, this is not a defect — there is no
113
+ `pnpm` surface a project could decline. It becomes a gap only when a project on another stack
114
+ appears. The `.js`-extension and barrel-export rules are the sharpest case — they assume a
115
+ TypeScript monorepo that emits `dist/`, and `fixtures/plain` needs `PKG_SCOPE` and `EMITTING_PKGS`
116
+ in its vocabulary to compose at all. If a second stack ever arrives, those are a `ts-monorepo`
117
+ surface, not core.
118
+
119
+ **A composed project is not a finished project — by design.** With no project layer, `CLAUDE.md`
120
+ still opens with blank lines and no title, mission or stack. That is not a defect to fix in the
121
+ core: the missing text is the part only this project can say. `init` conducts the interview and
122
+ writes it to `.nina/TODO.md`, and it deliberately writes **no stub fragments**, because a stub is
123
+ a filled slot as far as every tool is concerned — a tree of TODOs would compose and check clean
124
+ while saying nothing. So `compose` keeps naming the unfilled slots until a person fills them, and
125
+ the blank opening is that list being honest rather than the core being incomplete.
@@ -0,0 +1,137 @@
1
+ {
2
+ "2026-09-22-integration-tester__regenerate-the-premise-index-after-editing-an-integration-doc": {
3
+ "in": "core/tree/.claude/agents/integration-tester.md"
4
+ },
5
+ "2026-09-22-qa__exit-code-is-the-verdict": {
6
+ "in": "core/tree/.claude/agents/qa.md"
7
+ },
8
+ "2026-09-22-shared__test-must-name-the-mutation-that-fails-it": {
9
+ "in": "core/tree/.claude/agents/reviewer.md"
10
+ },
11
+ "2026-09-25-shared__docs-match-final-code": {
12
+ "in": "core/tree/.claude/agents/implementer.md"
13
+ },
14
+ "2026-09-25-shared__fail-closed-on-every-branch": {
15
+ "in": "core/tree/.claude/agents/implementer.md"
16
+ },
17
+ "2026-09-25-shared__test-must-fail-under-its-mutation": {
18
+ "in": "core/tree/.claude/agents/implementer.md"
19
+ },
20
+ "2026-09-25-shared__tsdoc-covers-members": {
21
+ "in": "core/tree/CLAUDE.md"
22
+ },
23
+ "2026-09-26-architect__revision-sweeps-contradicted-text": {
24
+ "in": "core/tree/.claude/agents/architect.md"
25
+ },
26
+ "2026-09-26-shared__run-the-mutation-not-only-the-assertion": {
27
+ "in": "core/tree/.claude/agents/qa.md"
28
+ },
29
+ "2026-09-26-shared__validate-patterns-against-real-samples": {
30
+ "in": "core/tree/.claude/agents/implementer.md"
31
+ },
32
+ "2026-09-28-shared__docs-match-final-code": {
33
+ "in": "core/tree/.claude/agents/implementer.md"
34
+ },
35
+ "2026-09-28-shared__fail-closed-on-every-branch": {
36
+ "in": "core/tree/.claude/agents/implementer.md"
37
+ },
38
+ "2026-09-28-shared__test-must-fail-under-its-mutation": {
39
+ "in": "core/tree/.claude/agents/qa.md"
40
+ },
41
+ "2026-10-08-implementer__spike-result-claims-only-what-ran": {
42
+ "in": "core/tree/.claude/agents/implementer.md"
43
+ },
44
+ "2026-10-10-architect__mirrored-parsers-cite-the-whole-input-path": {
45
+ "in": "core/tree/.claude/agents/architect.md"
46
+ },
47
+ "2026-10-10-architect__rule-checkers-cover-every-form-the-rule-names": {
48
+ "in": "core/tree/.claude/agents/architect.md"
49
+ },
50
+ "2026-10-10-architect__security-filters-list-their-bypasses": {
51
+ "in": "core/tree/.claude/agents/architect.md"
52
+ },
53
+ "2026-10-10-implementer__fails-if-mutations-are-run": {
54
+ "in": "core/tree/.claude/agents/implementer.md"
55
+ },
56
+ "2026-10-10-shared__controls-drive-the-code-they-guard": {
57
+ "in": "core/tree/.claude/agents/implementer.md"
58
+ },
59
+ "2026-10-11-implementer__a-miss-in-your-mutation-log-is-a-claim-to-fix": {
60
+ "in": "core/tree/.claude/agents/implementer.md"
61
+ },
62
+ "2026-10-11-implementer__tsdoc-covers-fake-members-and-local-functions": {
63
+ "in": "core/tree/CLAUDE.md"
64
+ },
65
+ "2026-10-11-shared__doc-claims-match-the-recorded-premises": {
66
+ "in": "core/tree/.claude/agents/implementer.md"
67
+ },
68
+ "2026-10-13-architect__source-scanners-match-lexer-tokens": {
69
+ "in": "core/tree/.claude/agents/architect.md"
70
+ },
71
+ "2026-10-13-implementer__batteries-drop-each-guard-conjunct": {
72
+ "in": "core/tree/.claude/agents/implementer.md"
73
+ },
74
+ "2026-10-13-shared__scratch-dirs-are-named-for-your-stage": {
75
+ "in": "core/tree/CLAUDE.md"
76
+ },
77
+ "2026-10-15-implementer__tsdoc-sweep-includes-edited-test-stub-members": {
78
+ "in": "core/tree/.claude/agents/implementer.md"
79
+ },
80
+ "2026-10-18-architect__spike-checks-fail-closed": {
81
+ "in": "core/tree/.claude/agents/architect.md"
82
+ },
83
+ "2026-10-20-shared__dictated-tsdoc-for-unbuilt-consumer-is-a-contract": {
84
+ "in": "core/tree/.claude/patterns.md"
85
+ },
86
+ "2026-10-20-shared__network-controls-use-a-local-listener": {
87
+ "in": "core/tree/CLAUDE.md"
88
+ },
89
+ "2026-10-20-shared__wrangler-update-check-stays-local": {
90
+ "in": "surfaces/edge-cf/tree/CLAUDE.md"
91
+ },
92
+ "2026-10-21-harness__sizes-names-matches-a-step-number-anywhere-in-the-subject": {
93
+ "in": "core/tree/.claude/router.md"
94
+ },
95
+ "2026-10-21-implementer__size-cap-is-checked-before-writing-not-after": {
96
+ "in": "core/tree/.claude/agents/implementer.md"
97
+ },
98
+ "2026-10-21-implementer__tsdoc-sweep-includes-edited-test-stub-members": {
99
+ "in": "core/tree/.claude/agents/implementer.md"
100
+ },
101
+ "2026-10-21-shared__leak-check-matches-by-containment-and-covers-every-privacy-class": {
102
+ "in": "surfaces/pii/tree/CLAUDE.md"
103
+ },
104
+ "2026-10-23-implementer__a-never-in-an-attribute-check-sweeps-every-attribute": {
105
+ "in": "surfaces/pii/tree/CLAUDE.md"
106
+ },
107
+ "2026-10-23-shared__invisible-or-lookalike-characters-are-written-as-escapes": {
108
+ "in": "core/tree/.claude/agents/implementer.md"
109
+ },
110
+ "2026-10-23-shared__scratch-files-live-in-your-mktemp-dir-never-the-scratchpad-root": {
111
+ "in": "core/tree/CLAUDE.md"
112
+ },
113
+ "2026-10-24-shared__scratch-root-holds-no-path-note": {
114
+ "in": "core/tree/CLAUDE.md"
115
+ },
116
+ "2026-10-25-architect__pass-through-inputs-vary-across-cases": {
117
+ "in": "core/tree/.claude/agents/architect.md"
118
+ },
119
+ "2026-10-25-implementer__survivors-are-equivalent-or-killed": {
120
+ "in": "core/tree/.claude/agents/implementer.md"
121
+ },
122
+ "2026-10-27-architect__leak-walk-reads-what-the-console-prints": {
123
+ "in": "surfaces/pii/tree/CLAUDE.md"
124
+ },
125
+ "2026-10-28-architect__no-leak-test-needs-a-control-that-the-raw-error-carries-it": {
126
+ "in": "surfaces/pii/tree/CLAUDE.md"
127
+ },
128
+ "2026-10-28-implementer__a-leak-row-is-tried-with-unnamed-slot-mutants-before-diff-ready": {
129
+ "in": "surfaces/pii/tree/CLAUDE.md"
130
+ },
131
+ "2026-10-28-implementer__fails-if-comment-from-the-per-test-red-list": {
132
+ "in": "core/tree/.claude/agents/implementer.md"
133
+ },
134
+ "2026-10-29-architect__a-row-for-a-behaviour-at-two-call-sites-runs-at-each": {
135
+ "in": "core/tree/.claude/agents/architect.md"
136
+ }
137
+ }
@@ -0,0 +1 @@
1
+ <!-- nina:slot project.7 -->
@@ -0,0 +1,3 @@
1
+ <!-- nina:slot project.1 -->
2
+ description: Use when a diff touches the schema, a migration or a query, in the same message as the reviewer. Architect and implementer may also ask it while designing one. Checks migration safety, query cost and indexes, cache and freshness rules, and data integrity, and returns APPROVED or REJECTED. The reviewer does not approve without its sign-off. Never writes application code.
3
+ <!-- nina:slot project.4 -->
@@ -0,0 +1 @@
1
+ <!-- nina:slot project.4 -->
@@ -0,0 +1 @@
1
+ <!-- nina:slot project.4 -->
@@ -0,0 +1,3 @@
1
+ <!-- nina:slot project.1 -->
2
+ description: Use when a diff touches an integration boundary, meaning a service, library or platform binding whose behavior this project does not define. Verifies each premise against the real dependency rather than the mock, and returns APPROVED or REJECTED. A wrong premise goes back to the architect, code that does not honor a premise to the implementer.
3
+ <!-- nina:slot project.5 -->
@@ -0,0 +1,7 @@
1
+ <!-- nina:slot project.1 -->
2
+ description: Use after the reviewer approves. Runs the tests of the packages the diff touched, once and never beside another test run, and returns PASS or FAIL with the exit code as the verdict. A failure loops back to the implementer, or to the architect when the test is right and the spec was wrong. Never writes code.
3
+
4
+ <!-- nina:slot project.5 package-run -->
5
+ ```bash
6
+ cd <package-path> && pnpm exec vitest run [--reporter=verbose] > /tmp/qa-<dir>.txt 2>&1; echo "EXIT=$?"
7
+ ```
@@ -0,0 +1,3 @@
1
+ <!-- nina:slot project.1 -->
2
+ description: Use after the implementer produces a diff, in the same message as every gate the diff triggered. Audits the diff against the architect's spec, runs typecheck, lint and build (never the tests, which qa runs after approval), and names every gate the diff triggers, which run beside it; qa waits for all of them. Returns APPROVED or REJECTED. Read-only, never fixes.
3
+ <!-- nina:slot project.3 -->
@@ -0,0 +1,3 @@
1
+ <!-- nina:slot project.1 -->
2
+ description: Use after the last step of a milestone passes qa, or when the owner asks for a security pass. Audits the assembled system as an attacker and as a privacy and compliance auditor, scoped to the milestone's diff, and returns SECURE or BLOCKED with each finding's severity. Not a substitute for the reviewer. Writes nothing to the repo.
3
+ <!-- nina:slot project.7 -->
@@ -0,0 +1,3 @@
1
+ <!-- nina:slot project.1 -->
2
+ description: Use on any diff that touches a contract, a deploy script, or a library version the contracts import, wherever the pipeline is. Audits the diff as an attacker before anything deploys, and returns APPROVED or REJECTED with the path and call sequence of each finding. The reviewer does not approve, and devops does not deploy, without its sign-off.
3
+ <!-- nina:slot project.5 -->
@@ -0,0 +1,3 @@
1
+ <!-- nina:slot project.1 -->
2
+ description: Use when the architect's spec changes contract code. Writes the contract change and its adversarial tests, treating deployed code as immutable, so work that cannot be made safe as specified is BLOCKED rather than merged with a follow-up. Hands its diff to the solidity-auditor.
3
+ <!-- nina:slot project.5 -->
@@ -0,0 +1,5 @@
1
+ {
2
+ "low": { "DEEP_MODEL": "claude-sonnet-5-5", "WORK_EFFORT": "medium" },
3
+ "medium": { "DEEP_MODEL": "claude-sonnet-5-5", "DEEP_EFFORT": "xhigh", "WORK_EFFORT": "high" },
4
+ "high": {}
5
+ }