@xhulz/nina 0.67.0 → 0.68.1

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 (271) hide show
  1. package/package.json +1 -1
  2. package/releases/0.68.0/core/GAPS.md +125 -0
  3. package/releases/0.68.0/core/answered.json +80 -0
  4. package/releases/0.68.0/core/defaults/tree/.claude/agents/architect.md +1 -0
  5. package/releases/0.68.0/core/defaults/tree/.claude/agents/dba.md +3 -0
  6. package/releases/0.68.0/core/defaults/tree/.claude/agents/devops.md +1 -0
  7. package/releases/0.68.0/core/defaults/tree/.claude/agents/implementer.md +1 -0
  8. package/releases/0.68.0/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
  9. package/releases/0.68.0/core/defaults/tree/.claude/agents/qa.md +7 -0
  10. package/releases/0.68.0/core/defaults/tree/.claude/agents/reviewer.md +3 -0
  11. package/releases/0.68.0/core/defaults/tree/.claude/agents/secops.md +3 -0
  12. package/releases/0.68.0/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
  13. package/releases/0.68.0/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
  14. package/releases/0.68.0/core/tree/.claude/agents/architect.md +134 -0
  15. package/releases/0.68.0/core/tree/.claude/agents/dba.md +119 -0
  16. package/releases/0.68.0/core/tree/.claude/agents/design-reviewer.md +76 -0
  17. package/releases/0.68.0/core/tree/.claude/agents/devops.md +118 -0
  18. package/releases/0.68.0/core/tree/.claude/agents/implementer.md +178 -0
  19. package/releases/0.68.0/core/tree/.claude/agents/integration-tester.md +170 -0
  20. package/releases/0.68.0/core/tree/.claude/agents/planner.md +132 -0
  21. package/releases/0.68.0/core/tree/.claude/agents/qa.md +150 -0
  22. package/releases/0.68.0/core/tree/.claude/agents/reviewer.md +187 -0
  23. package/releases/0.68.0/core/tree/.claude/agents/secops.md +120 -0
  24. package/releases/0.68.0/core/tree/.claude/agents/solidity-auditor.md +126 -0
  25. package/releases/0.68.0/core/tree/.claude/agents/solidity-dev.md +123 -0
  26. package/releases/0.68.0/core/tree/.claude/agents-overview.md +65 -0
  27. package/releases/0.68.0/core/tree/.claude/frontend.md +10 -0
  28. package/releases/0.68.0/core/tree/.claude/graph.md +79 -0
  29. package/releases/0.68.0/core/tree/.claude/patterns.md +252 -0
  30. package/releases/0.68.0/core/tree/.claude/pills/README.md +150 -0
  31. package/releases/0.68.0/core/tree/.claude/pipeline.md +101 -0
  32. package/releases/0.68.0/core/tree/.claude/retrieval.md +103 -0
  33. package/releases/0.68.0/core/tree/.claude/router.md +218 -0
  34. package/releases/0.68.0/core/tree/.claude/templates/integration.md +48 -0
  35. package/releases/0.68.0/core/tree/CLAUDE.md +166 -0
  36. package/releases/0.68.0/core/tree/scripts/cost-watch.mjs +25 -0
  37. package/releases/0.68.0/core/tree/scripts/edit-guard.mjs +24 -0
  38. package/releases/0.68.0/core/tree/scripts/harness-check.mjs +81 -0
  39. package/releases/0.68.0/core/tree/scripts/loop-gate.mjs +19 -0
  40. package/releases/0.68.0/core/vocabulary.json +14 -0
  41. package/releases/0.68.0/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
  42. package/releases/0.68.0/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
  43. package/releases/0.68.0/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
  44. package/releases/0.68.0/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
  45. package/releases/0.68.0/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
  46. package/releases/0.68.0/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
  47. package/releases/0.68.0/surfaces/blockchain/tree/.claude/graph.md +11 -0
  48. package/releases/0.68.0/surfaces/blockchain/tree/.claude/router.md +6 -0
  49. package/releases/0.68.0/surfaces/blockchain/tree/CLAUDE.md +12 -0
  50. package/releases/0.68.0/surfaces/d1/tree/.claude/agents/dba.md +15 -0
  51. package/releases/0.68.0/surfaces/d1/tree/.claude/agents/devops.md +2 -0
  52. package/releases/0.68.0/surfaces/d1/tree/.claude/agents/implementer.md +2 -0
  53. package/releases/0.68.0/surfaces/d1/tree/.claude/patterns.md +8 -0
  54. package/releases/0.68.0/surfaces/d1/tree/CLAUDE.md +2 -0
  55. package/releases/0.68.0/surfaces/db/tree/.claude/agents/architect.md +5 -0
  56. package/releases/0.68.0/surfaces/db/tree/.claude/agents/dba.md +54 -0
  57. package/releases/0.68.0/surfaces/db/tree/.claude/agents/devops.md +5 -0
  58. package/releases/0.68.0/surfaces/db/tree/.claude/agents/implementer.md +2 -0
  59. package/releases/0.68.0/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
  60. package/releases/0.68.0/surfaces/db/tree/.claude/agents/planner.md +2 -0
  61. package/releases/0.68.0/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
  62. package/releases/0.68.0/surfaces/db/tree/.claude/agents/secops.md +2 -0
  63. package/releases/0.68.0/surfaces/db/tree/.claude/agents-overview.md +5 -0
  64. package/releases/0.68.0/surfaces/db/tree/.claude/graph.md +8 -0
  65. package/releases/0.68.0/surfaces/db/tree/.claude/patterns.md +22 -0
  66. package/releases/0.68.0/surfaces/db/tree/.claude/pipeline.md +13 -0
  67. package/releases/0.68.0/surfaces/db/tree/.claude/retrieval.md +5 -0
  68. package/releases/0.68.0/surfaces/db/tree/.claude/router.md +4 -0
  69. package/releases/0.68.0/surfaces/db/tree/CLAUDE.md +17 -0
  70. package/releases/0.68.0/surfaces/drizzle/tree/.claude/agents/dba.md +9 -0
  71. package/releases/0.68.0/surfaces/drizzle/tree/.claude/agents/devops.md +5 -0
  72. package/releases/0.68.0/surfaces/drizzle/tree/.claude/agents/implementer.md +2 -0
  73. package/releases/0.68.0/surfaces/drizzle/tree/.claude/patterns.md +7 -0
  74. package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
  75. package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
  76. package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/devops.md +29 -0
  77. package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
  78. package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
  79. package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
  80. package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
  81. package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
  82. package/releases/0.68.0/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
  83. package/releases/0.68.0/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
  84. package/releases/0.68.0/surfaces/edge-cf/tree/CLAUDE.md +27 -0
  85. package/releases/0.68.0/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
  86. package/releases/0.68.0/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
  87. package/releases/0.68.0/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
  88. package/releases/0.68.0/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
  89. package/releases/0.68.0/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
  90. package/releases/0.68.0/surfaces/frontend/tree/.claude/patterns.md +8 -0
  91. package/releases/0.68.0/surfaces/frontend/tree/.claude/retrieval.md +2 -0
  92. package/releases/0.68.0/surfaces/frontend/tree/.claude/router.md +14 -0
  93. package/releases/0.68.0/surfaces/frontend/tree/CLAUDE.md +5 -0
  94. package/releases/0.68.0/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
  95. package/releases/0.68.0/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
  96. package/releases/0.68.0/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
  97. package/releases/0.68.0/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
  98. package/releases/0.68.0/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
  99. package/releases/0.68.0/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
  100. package/releases/0.68.0/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
  101. package/releases/0.68.0/surfaces/integrations/tree/.claude/graph.md +10 -0
  102. package/releases/0.68.0/surfaces/integrations/tree/.claude/patterns.md +38 -0
  103. package/releases/0.68.0/surfaces/integrations/tree/.claude/pipeline.md +16 -0
  104. package/releases/0.68.0/surfaces/integrations/tree/.claude/retrieval.md +16 -0
  105. package/releases/0.68.0/surfaces/integrations/tree/.claude/router.md +6 -0
  106. package/releases/0.68.0/surfaces/integrations/tree/CLAUDE.md +17 -0
  107. package/releases/0.68.0/surfaces/money/tree/.claude/agents/architect.md +12 -0
  108. package/releases/0.68.0/surfaces/money/tree/.claude/agents/dba.md +14 -0
  109. package/releases/0.68.0/surfaces/money/tree/.claude/agents/implementer.md +11 -0
  110. package/releases/0.68.0/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
  111. package/releases/0.68.0/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
  112. package/releases/0.68.0/surfaces/money/tree/.claude/agents/secops.md +5 -0
  113. package/releases/0.68.0/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
  114. package/releases/0.68.0/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
  115. package/releases/0.68.0/surfaces/money/tree/.claude/graph.md +2 -0
  116. package/releases/0.68.0/surfaces/money/tree/.claude/patterns.md +49 -0
  117. package/releases/0.68.0/surfaces/money/tree/.claude/pipeline.md +2 -0
  118. package/releases/0.68.0/surfaces/money/tree/.claude/retrieval.md +2 -0
  119. package/releases/0.68.0/surfaces/money/tree/CLAUDE.md +11 -0
  120. package/releases/0.68.0/surfaces/pii/tree/.claude/agents/dba.md +2 -0
  121. package/releases/0.68.0/surfaces/pii/tree/.claude/agents/devops.md +8 -0
  122. package/releases/0.68.0/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
  123. package/releases/0.68.0/surfaces/pii/tree/.claude/agents/secops.md +2 -0
  124. package/releases/0.68.0/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
  125. package/releases/0.68.0/surfaces/pii/tree/CLAUDE.md +5 -0
  126. package/releases/0.68.0/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
  127. package/releases/0.68.0/surfaces/prisma/tree/.claude/agents/dba.md +42 -0
  128. package/releases/0.68.0/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
  129. package/releases/0.68.0/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
  130. package/releases/0.68.0/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
  131. package/releases/0.68.0/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
  132. package/releases/0.68.0/surfaces/prisma/tree/.claude/patterns.md +15 -0
  133. package/releases/0.68.0/surfaces/prisma/tree/CLAUDE.md +5 -0
  134. package/releases/0.68.1/core/GAPS.md +125 -0
  135. package/releases/0.68.1/core/answered.json +80 -0
  136. package/releases/0.68.1/core/defaults/tree/.claude/agents/architect.md +1 -0
  137. package/releases/0.68.1/core/defaults/tree/.claude/agents/dba.md +3 -0
  138. package/releases/0.68.1/core/defaults/tree/.claude/agents/devops.md +1 -0
  139. package/releases/0.68.1/core/defaults/tree/.claude/agents/implementer.md +1 -0
  140. package/releases/0.68.1/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
  141. package/releases/0.68.1/core/defaults/tree/.claude/agents/qa.md +7 -0
  142. package/releases/0.68.1/core/defaults/tree/.claude/agents/reviewer.md +3 -0
  143. package/releases/0.68.1/core/defaults/tree/.claude/agents/secops.md +3 -0
  144. package/releases/0.68.1/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
  145. package/releases/0.68.1/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
  146. package/releases/0.68.1/core/tree/.claude/agents/architect.md +134 -0
  147. package/releases/0.68.1/core/tree/.claude/agents/dba.md +119 -0
  148. package/releases/0.68.1/core/tree/.claude/agents/design-reviewer.md +76 -0
  149. package/releases/0.68.1/core/tree/.claude/agents/devops.md +118 -0
  150. package/releases/0.68.1/core/tree/.claude/agents/implementer.md +178 -0
  151. package/releases/0.68.1/core/tree/.claude/agents/integration-tester.md +170 -0
  152. package/releases/0.68.1/core/tree/.claude/agents/planner.md +132 -0
  153. package/releases/0.68.1/core/tree/.claude/agents/qa.md +150 -0
  154. package/releases/0.68.1/core/tree/.claude/agents/reviewer.md +187 -0
  155. package/releases/0.68.1/core/tree/.claude/agents/secops.md +120 -0
  156. package/releases/0.68.1/core/tree/.claude/agents/solidity-auditor.md +126 -0
  157. package/releases/0.68.1/core/tree/.claude/agents/solidity-dev.md +123 -0
  158. package/releases/0.68.1/core/tree/.claude/agents-overview.md +65 -0
  159. package/releases/0.68.1/core/tree/.claude/frontend.md +10 -0
  160. package/releases/0.68.1/core/tree/.claude/graph.md +79 -0
  161. package/releases/0.68.1/core/tree/.claude/patterns.md +252 -0
  162. package/releases/0.68.1/core/tree/.claude/pills/README.md +150 -0
  163. package/releases/0.68.1/core/tree/.claude/pipeline.md +101 -0
  164. package/releases/0.68.1/core/tree/.claude/retrieval.md +103 -0
  165. package/releases/0.68.1/core/tree/.claude/router.md +218 -0
  166. package/releases/0.68.1/core/tree/.claude/templates/integration.md +48 -0
  167. package/releases/0.68.1/core/tree/CLAUDE.md +166 -0
  168. package/releases/0.68.1/core/tree/scripts/cost-watch.mjs +25 -0
  169. package/releases/0.68.1/core/tree/scripts/edit-guard.mjs +24 -0
  170. package/releases/0.68.1/core/tree/scripts/harness-check.mjs +81 -0
  171. package/releases/0.68.1/core/tree/scripts/loop-gate.mjs +19 -0
  172. package/releases/0.68.1/core/vocabulary.json +14 -0
  173. package/releases/0.68.1/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
  174. package/releases/0.68.1/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
  175. package/releases/0.68.1/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
  176. package/releases/0.68.1/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
  177. package/releases/0.68.1/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
  178. package/releases/0.68.1/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
  179. package/releases/0.68.1/surfaces/blockchain/tree/.claude/graph.md +11 -0
  180. package/releases/0.68.1/surfaces/blockchain/tree/.claude/router.md +6 -0
  181. package/releases/0.68.1/surfaces/blockchain/tree/CLAUDE.md +12 -0
  182. package/releases/0.68.1/surfaces/d1/tree/.claude/agents/dba.md +15 -0
  183. package/releases/0.68.1/surfaces/d1/tree/.claude/agents/devops.md +2 -0
  184. package/releases/0.68.1/surfaces/d1/tree/.claude/agents/implementer.md +2 -0
  185. package/releases/0.68.1/surfaces/d1/tree/.claude/patterns.md +8 -0
  186. package/releases/0.68.1/surfaces/d1/tree/CLAUDE.md +2 -0
  187. package/releases/0.68.1/surfaces/db/tree/.claude/agents/architect.md +5 -0
  188. package/releases/0.68.1/surfaces/db/tree/.claude/agents/dba.md +54 -0
  189. package/releases/0.68.1/surfaces/db/tree/.claude/agents/devops.md +5 -0
  190. package/releases/0.68.1/surfaces/db/tree/.claude/agents/implementer.md +2 -0
  191. package/releases/0.68.1/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
  192. package/releases/0.68.1/surfaces/db/tree/.claude/agents/planner.md +2 -0
  193. package/releases/0.68.1/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
  194. package/releases/0.68.1/surfaces/db/tree/.claude/agents/secops.md +2 -0
  195. package/releases/0.68.1/surfaces/db/tree/.claude/agents-overview.md +5 -0
  196. package/releases/0.68.1/surfaces/db/tree/.claude/graph.md +8 -0
  197. package/releases/0.68.1/surfaces/db/tree/.claude/patterns.md +22 -0
  198. package/releases/0.68.1/surfaces/db/tree/.claude/pipeline.md +13 -0
  199. package/releases/0.68.1/surfaces/db/tree/.claude/retrieval.md +5 -0
  200. package/releases/0.68.1/surfaces/db/tree/.claude/router.md +4 -0
  201. package/releases/0.68.1/surfaces/db/tree/CLAUDE.md +17 -0
  202. package/releases/0.68.1/surfaces/drizzle/tree/.claude/agents/dba.md +9 -0
  203. package/releases/0.68.1/surfaces/drizzle/tree/.claude/agents/devops.md +5 -0
  204. package/releases/0.68.1/surfaces/drizzle/tree/.claude/agents/implementer.md +2 -0
  205. package/releases/0.68.1/surfaces/drizzle/tree/.claude/patterns.md +7 -0
  206. package/releases/0.68.1/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
  207. package/releases/0.68.1/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
  208. package/releases/0.68.1/surfaces/edge-cf/tree/.claude/agents/devops.md +29 -0
  209. package/releases/0.68.1/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
  210. package/releases/0.68.1/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
  211. package/releases/0.68.1/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
  212. package/releases/0.68.1/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
  213. package/releases/0.68.1/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
  214. package/releases/0.68.1/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
  215. package/releases/0.68.1/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
  216. package/releases/0.68.1/surfaces/edge-cf/tree/CLAUDE.md +27 -0
  217. package/releases/0.68.1/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
  218. package/releases/0.68.1/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
  219. package/releases/0.68.1/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
  220. package/releases/0.68.1/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
  221. package/releases/0.68.1/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
  222. package/releases/0.68.1/surfaces/frontend/tree/.claude/patterns.md +8 -0
  223. package/releases/0.68.1/surfaces/frontend/tree/.claude/retrieval.md +2 -0
  224. package/releases/0.68.1/surfaces/frontend/tree/.claude/router.md +14 -0
  225. package/releases/0.68.1/surfaces/frontend/tree/CLAUDE.md +5 -0
  226. package/releases/0.68.1/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
  227. package/releases/0.68.1/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
  228. package/releases/0.68.1/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
  229. package/releases/0.68.1/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
  230. package/releases/0.68.1/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
  231. package/releases/0.68.1/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
  232. package/releases/0.68.1/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
  233. package/releases/0.68.1/surfaces/integrations/tree/.claude/graph.md +10 -0
  234. package/releases/0.68.1/surfaces/integrations/tree/.claude/patterns.md +38 -0
  235. package/releases/0.68.1/surfaces/integrations/tree/.claude/pipeline.md +16 -0
  236. package/releases/0.68.1/surfaces/integrations/tree/.claude/retrieval.md +16 -0
  237. package/releases/0.68.1/surfaces/integrations/tree/.claude/router.md +6 -0
  238. package/releases/0.68.1/surfaces/integrations/tree/CLAUDE.md +17 -0
  239. package/releases/0.68.1/surfaces/money/tree/.claude/agents/architect.md +12 -0
  240. package/releases/0.68.1/surfaces/money/tree/.claude/agents/dba.md +14 -0
  241. package/releases/0.68.1/surfaces/money/tree/.claude/agents/implementer.md +11 -0
  242. package/releases/0.68.1/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
  243. package/releases/0.68.1/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
  244. package/releases/0.68.1/surfaces/money/tree/.claude/agents/secops.md +5 -0
  245. package/releases/0.68.1/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
  246. package/releases/0.68.1/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
  247. package/releases/0.68.1/surfaces/money/tree/.claude/graph.md +2 -0
  248. package/releases/0.68.1/surfaces/money/tree/.claude/patterns.md +49 -0
  249. package/releases/0.68.1/surfaces/money/tree/.claude/pipeline.md +2 -0
  250. package/releases/0.68.1/surfaces/money/tree/.claude/retrieval.md +2 -0
  251. package/releases/0.68.1/surfaces/money/tree/CLAUDE.md +11 -0
  252. package/releases/0.68.1/surfaces/pii/tree/.claude/agents/dba.md +2 -0
  253. package/releases/0.68.1/surfaces/pii/tree/.claude/agents/devops.md +8 -0
  254. package/releases/0.68.1/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
  255. package/releases/0.68.1/surfaces/pii/tree/.claude/agents/secops.md +2 -0
  256. package/releases/0.68.1/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
  257. package/releases/0.68.1/surfaces/pii/tree/CLAUDE.md +5 -0
  258. package/releases/0.68.1/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
  259. package/releases/0.68.1/surfaces/prisma/tree/.claude/agents/dba.md +42 -0
  260. package/releases/0.68.1/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
  261. package/releases/0.68.1/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
  262. package/releases/0.68.1/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
  263. package/releases/0.68.1/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
  264. package/releases/0.68.1/surfaces/prisma/tree/.claude/patterns.md +15 -0
  265. package/releases/0.68.1/surfaces/prisma/tree/CLAUDE.md +5 -0
  266. package/src/commands/gate.mjs +1 -1
  267. package/src/commands/learn.mjs +2 -1
  268. package/src/commands/sizes.mjs +72 -30
  269. package/src/gate.mjs +114 -8
  270. package/src/office.html +212 -96
  271. package/src/office.mjs +2 -1
@@ -38,6 +38,30 @@ const RATE_OVER = 5;
38
38
  /** Files a step's commit carries that are not the step's code: the harness's own, and lockfiles. */
39
39
  const NOT_CODE = /^(\.claude\/|\.nina\/|CLAUDE\.md$)|(^|\/)(pnpm-lock\.yaml|package-lock\.json|yarn\.lock|bun\.lockb?)$/;
40
40
 
41
+ /**
42
+ * What a step's implementer wrote in its first round, from the `First round:` line the orchestrator writes in its step
43
+ * file when the step took more than one: the fix rounds after it are the review's, not the forecast's.
44
+ *
45
+ * @param {string} text - A step file.
46
+ * @returns {number|null}
47
+ */
48
+ export function firstRoundIn(text) {
49
+ const m = /^[\s>*_-]*First round:[*_ \t]*~?[ \t]*(\d[\d,]*)[ \t]*lines?\b/im.exec(text);
50
+ return m ? Number(m[1].replace(/,/g, '')) : null;
51
+ }
52
+
53
+ /**
54
+ * The kind a step file says it is, from its `Kind:` line — `new`, `extends`, `tests`, or any one word a project uses:
55
+ * a step is measured by the steps of its kind, where any has landed.
56
+ *
57
+ * @param {string} text - A step file.
58
+ * @returns {string|null}
59
+ */
60
+ export function kindIn(text) {
61
+ const m = /^[\s>*_-]*Kind:[*_ \t]*([A-Za-z][\w-]*)/m.exec(text);
62
+ return m ? m[1].toLowerCase() : null;
63
+ }
64
+
41
65
  /**
42
66
  * The forecast a step file states, from its `Size:` line.
43
67
  *
@@ -204,13 +228,15 @@ export function measure(dir) {
204
228
  };
205
229
  const steps = [];
206
230
  for (const file of files) {
207
- const now = forecastIn(readFileSync(join(dir, file.path), 'utf8'));
231
+ const current = readFileSync(join(dir, file.path), 'utf8');
232
+ const now = forecastIn(current);
233
+ const kind = kindIn(current);
208
234
  const landings = named.get(file.path).filter((c) => code.get(c.hash)?.size > 0);
209
235
  if (landings.length === 0) {
210
236
  if (!now) continue;
211
237
  // Forecast again in the working tree, it is newer than every commit.
212
238
  const since = at('HEAD', file.path)?.lines === now.lines ? writtenAt(file.path, Infinity, now.lines) : Infinity;
213
- steps.push({ ...file, landed: false, forecast: now, since });
239
+ steps.push({ ...file, kind, landed: false, forecast: now, since });
214
240
  continue;
215
241
  }
216
242
  // The forecast the step was built to: its file before its first commit, or as that commit wrote it.
@@ -225,15 +251,22 @@ export function measure(dir) {
225
251
  const last = landings.at(-1);
226
252
  // A forecast changed while the step was built — a fix round's spec — is shown, and the step measured against the first.
227
253
  const revised = at(last.hash, file.path);
254
+ const firstRound = firstRoundIn(current);
255
+ const ratio = total / forecast.lines;
228
256
  steps.push({
229
257
  ...file,
258
+ kind,
230
259
  landed: true,
231
260
  forecast,
232
261
  revised: revised && revised.lines !== forecast.lines ? revised : null,
233
262
  since,
234
263
  lines: total,
235
264
  files: lines.size,
236
- ratio: total / forecast.lines,
265
+ ratio,
266
+ first: firstRound,
267
+ // What the forecast missed by: its first round where the step file says it, so fix rounds do not compound into
268
+ // the rate one correction-heavy step at a time.
269
+ measured: firstRound === null ? ratio : firstRound / forecast.lines,
237
270
  t: last.t,
238
271
  at: last.at,
239
272
  hash: last.hash,
@@ -243,37 +276,41 @@ export function measure(dir) {
243
276
  }
244
277
 
245
278
  /**
246
- * The rate to forecast a step again at: the median actual over forecast of its spec's newest landed steps forecast no
247
- * earlier than it was. A step forecast before the last re-forecast was measured against the old rates, which that
248
- * re-forecast already corrected for, and counting it would correct for them twice.
279
+ * The rate to forecast a step again at: the median of what its spec's newest landed steps forecast no earlier than it
280
+ * missed by (`measured`), over the steps of its kind where any has landed. A step forecast before the last re-forecast
281
+ * was measured against the old rates, which that re-forecast already corrected for, and counting it would correct for
282
+ * them twice; and a new module's rate put on steps that extend an existing file asked one project for six splits.
249
283
  *
250
284
  * @param {object[]} steps
251
- * @param {{spec: string, since?: string}} step - Its spec, and when its own forecast was written.
252
- * @returns {{rate: number, over: number}|null}
285
+ * @param {{spec: string, since?: string, kind?: string|null}} step - Its spec, when its own forecast was written, its kind.
286
+ * @returns {{rate: number, over: number, kind: string|null}|null}
253
287
  */
254
- export function rateOf(steps, { spec, since }) {
288
+ export function rateOf(steps, { spec, since, kind = null }) {
255
289
  // A forecast not known to be written when is measured by nothing, rather than by everything.
256
290
  if (since === null || since === undefined) return null;
257
- const landed = steps
258
- .filter((s) => s.landed && s.spec === spec && s.since >= since)
259
- .sort((a, b) => a.t - b.t)
260
- .slice(-RATE_OVER);
261
- return landed.length ? { rate: median(landed.map((s) => s.ratio)), over: landed.length } : null;
291
+ const landed = steps.filter((s) => s.landed && s.spec === spec && s.since >= since).sort((a, b) => a.t - b.t);
292
+ const mine = kind ? landed.filter((s) => s.kind === kind) : [];
293
+ const over = (mine.length ? mine : landed).slice(-RATE_OVER);
294
+ return over.length ? { rate: median(over.map((s) => s.measured ?? s.ratio)), over: over.length, kind: mine.length ? kind : null } : null;
262
295
  }
263
296
 
264
297
  /**
265
298
  * What the detector says: the newest landed step, when it overran, and the steps of its spec still forecast as they
266
- * were when it landed.
299
+ * were when it landed — until one of them is forecast again. The next step to go out is forecast again at its turn, and
300
+ * the rest at theirs: asked for every one at once, one project was asked for twenty splits of steps three or more
301
+ * steps away, which later steps would each have measured again.
267
302
  *
268
- * @param {string} dir
269
- * @param {{steps: object[], limit: number}} measured
270
- * @returns {{step: object, rate: {rate: number, over: number}, stale: object[]}|null}
303
+ * @param {{steps: object[]}} measured
304
+ * @returns {{step: object, rate: {rate: number, over: number, kind: string|null}, stale: object[]}|null}
271
305
  */
272
306
  export function overrun({ steps }) {
273
307
  const newest = steps.filter((s) => s.landed).sort((a, b) => a.t - b.t).at(-1);
274
- if (!newest || newest.ratio <= OVERRUN) return null;
308
+ if (!newest || newest.measured <= OVERRUN) return null;
309
+ const mine = steps.filter((s) => !s.landed && s.spec === newest.spec && s.since !== null);
310
+ // A step forecast since it landed is the one about to go out, forecast at its turn: the overrun was acted on.
311
+ if (mine.some((s) => s.since > newest.t)) return null;
275
312
  // Forecast no later than the overrun step was, so its rate measures them: forecast again since, they are not stale.
276
- const stale = steps.filter((s) => !s.landed && s.spec === newest.spec && s.since !== null && s.since <= newest.since);
313
+ const stale = mine.filter((s) => s.since <= newest.since);
277
314
  return stale.length ? { step: newest, rate: rateOf(steps, stale[0]), stale } : null;
278
315
  }
279
316
 
@@ -312,15 +349,17 @@ export async function sizes(argv) {
312
349
  console.log('sizes: current');
313
350
  return 0;
314
351
  }
315
- const { step, rate, stale } = found;
352
+ const { step, stale } = found;
316
353
  const again = stale.slice(0, 4).map((s) => {
317
- const next = Math.round(s.forecast.lines * rate.rate);
318
- return `${s.step} ~${s.forecast.lines} → ~${next}${next > limit ? ` (past ${limit}: split)` : ''}`;
354
+ const rate = rateOf(steps, s);
355
+ const next = Math.round(s.forecast.lines * (rate?.rate ?? 1));
356
+ return `${s.step} ~${s.forecast.lines} → ~${next}${rate?.kind ? ` (${rate.kind})` : ''}${next > limit ? ` past ${limit}` : ''}`;
319
357
  });
358
+ const first = step.first === null ? '' : `, ${step.first} in its first round (${times(step.measured)})`;
320
359
  console.log(
321
- `step ${step.step} of ${step.spec} landed ${step.lines} lines against ~${step.forecast.lines} (${times(step.ratio)}); ` +
322
- `${stale.length} step(s) forecast when it was have not been forecast again — at ${times(rate.rate)}, over ${rate.over} landed step(s) forecast the same way: ` +
323
- `${again.join(', ')}${stale.length > again.length ? ', …' : ''}`,
360
+ `step ${step.step} of ${step.spec} landed ${step.lines} lines against ~${step.forecast.lines} (${times(step.ratio)}${first}); ` +
361
+ `before the next of its ${stale.length} step(s) forecast when it was goes out, forecast that one again — a \`Size:\` line at the rate \`nina sizes\` gives it — ` +
362
+ `and split it if that puts it past ${limit}; the rest at their turn: ${again.join(', ')}${stale.length > again.length ? ', …' : ''}`,
324
363
  );
325
364
  return 1;
326
365
  }
@@ -332,10 +371,13 @@ export async function sizes(argv) {
332
371
  const mine = steps.filter((s) => s.spec === spec);
333
372
  console.log(`\n ${bold(pink(spec))}${dim(` landed against the forecast it was built to; limit ${limit} lines`)}`);
334
373
  for (const s of mine.filter((x) => x.landed).sort((a, b) => a.t - b.t)) {
335
- const mark = s.ratio > OVERRUN ? amber(times(s.ratio)) : times(s.ratio);
374
+ const mark = s.measured > OVERRUN ? amber(times(s.ratio)) : times(s.ratio);
336
375
  const files = s.forecast.files === null ? `${s.files} file(s)` : `${s.files} file(s) of ${s.forecast.files}`;
337
- const revised = s.revised ? `, revised to ~${s.revised.lines} while built` : '';
338
- console.log(` ${s.step.padEnd(10)} ~${String(s.forecast.lines).padEnd(5)} → ${String(s.lines).padEnd(5)} ${mark} ${dim(`${files}${revised} · ${s.hash.slice(0, 7)} ${s.at.slice(0, 10)}`)}`);
376
+ // Against a forecast revised while it was built too, so a project can tell a forecasting miss from correction rounds.
377
+ const revised = s.revised ? `, revised to ~${s.revised.lines} while built: ${times(s.lines / s.revised.lines)} against it` : '';
378
+ const first = s.first === null ? '' : `, first round ${s.first} ${times(s.measured)}`;
379
+ const kind = s.kind ? `${s.kind} · ` : '';
380
+ console.log(` ${s.step.padEnd(10)} ~${String(s.forecast.lines).padEnd(5)} → ${String(s.lines).padEnd(5)} ${mark} ${dim(`${kind}${files}${first}${revised} · ${s.hash.slice(0, 7)} ${s.at.slice(0, 10)}`)}`);
339
381
  }
340
382
  for (const s of mine.filter((x) => !x.landed)) {
341
383
  const rate = rateOf(steps, s);
@@ -346,7 +388,7 @@ export async function sizes(argv) {
346
388
  const next = Math.round(s.forecast.lines * rate.rate);
347
389
  console.log(
348
390
  ` ${s.step.padEnd(10)} ~${String(s.forecast.lines).padEnd(5)} → ~${String(next).padEnd(5)} ` +
349
- dim(`to land, at ${times(rate.rate)} over ${rate.over} step(s) forecast as it was`) +
391
+ dim(`to land, at ${times(rate.rate)} over ${rate.over} ${rate.kind ? `${rate.kind} ` : ''}step(s) forecast as it was`) +
350
392
  (next > limit ? amber(` past ${limit}: split`) : ''),
351
393
  );
352
394
  }
package/src/gate.mjs CHANGED
@@ -399,8 +399,9 @@ export function replay(entries, loops, forward = new Map()) {
399
399
 
400
400
  entries.forEach((e, i) => {
401
401
  if (e.k === 'reset') {
402
- // Ledgers written before the model's own questions stopped counting as the owner speaking hold those too.
403
- if (e.why === 'ask') return;
402
+ // Ledgers written before the model's own questions stopped counting as the owner speaking hold those too. The
403
+ // prompt that opens a session carrying loops over is the owner resuming the work, not answering a loop.
404
+ if (e.why === 'ask' || e.why === 'resume') return;
404
405
  for (const key of streak.keys()) if (key.split('|').length === 2) grace.set(key, (grace.get(key) ?? 0) + 1);
405
406
  return;
406
407
  }
@@ -441,7 +442,7 @@ export function replay(entries, loops, forward = new Map()) {
441
442
  for (const r of rounds) {
442
443
  streak.set(r.key, { n: r.edgeRound, agents: r.agents, at: r.at, blind: r.blind });
443
444
  for (const issue of r.issues ?? []) streak.set(`${r.key}|${issue.id}`, { n: issue.round, edge: r.edgeRound });
444
- made.push({ ...r, at: e.at });
445
+ made.push({ ...r, at: e.at, index: i, ...(e.inherited ? { inherited: e.inherited } : {}) });
445
446
  }
446
447
  }
447
448
  });
@@ -460,7 +461,7 @@ export function replay(entries, loops, forward = new Map()) {
460
461
  const onward = [...forward].filter(([, sources]) => sources.has(source)).map(([stage]) => stage);
461
462
  return { source, token, rounds: s.n, cap, given: grace.get(key) ?? 0, issues, closing, targets: [...targetsOf(source)], onward };
462
463
  });
463
- const waiting = [...pending.entries()].flatMap(([source, batch]) => batch.filter((v) => isLoopBack(v.verdict)).map((v) => ({ source, verdict: v.verdict, issues: v.issues ?? [] })));
464
+ const waiting = [...pending.entries()].flatMap(([source, batch]) => batch.filter((v) => isLoopBack(v.verdict)).map((v) => ({ source, verdict: v.verdict, issues: v.issues ?? [], index: v.at })));
464
465
  return { effect: (to) => effect(to, entries.length), rounds: made, open, waiting };
465
466
  }
466
467
 
@@ -913,12 +914,104 @@ export function loopState(project, entries) {
913
914
  }
914
915
  for (const w of waiting) lines.push(`- waiting on a fix: ${w.source} ${w.verdict}${w.issues.length ? `, issues ${w.issues.join(', ')}` : ''}`);
915
916
  if (open.length === 0 && waiting.length === 0) lines.push('- no loop is open');
916
- const dispatched = entries.filter((e) => e.k === 'dispatch' && e.role).slice(-4);
917
+ const dispatched = entries.filter((e) => e.k === 'dispatch' && e.role && !e.inherited).slice(-4);
917
918
  if (dispatched.length) lines.push(`- the latest dispatches: ${dispatched.map((e) => e.role).join(', ')}, the newest at ${String(dispatched.at(-1).at ?? '').slice(11, 16)} UTC`);
918
919
  const closing = open.filter((l) => l.closing).length;
919
920
  return { lines, open: open.length - closing, closing, waiting: waiting.length };
920
921
  }
921
922
 
923
+ /** The entries a replay reads, and so the ones a session carries over from the one before it. */
924
+ const REPLAYED = new Set(['pre', 'dispatch', 'verdict', 'reset']);
925
+
926
+ /**
927
+ * How long the latest earlier session must have been quiet for a new one to carry its loops over: written to within
928
+ * the last minute, it is still at work, and a session the selftest begins milliseconds after another is not its sequel.
929
+ */
930
+ const QUIET_MS = 60_000;
931
+
932
+ /**
933
+ * A new session's ledger begins with the loops the project's latest earlier session left open: the ledger is a
934
+ * session's, so a loop open when its session ended was not open in the next, and its cap started over. Work that
935
+ * pauses with a handoff note and resumes in a new session paused one design loop at round 1 of 2, and the next
936
+ * session's gate would have let it make two more. What is carried over is the earlier ledger's own entries from the
937
+ * launch whose rejection began the oldest loop still open, marked `inherited` with the session they came from, so
938
+ * the replay counts them as it counted them there; the office and `learn` leave them to the session that wrote them.
939
+ * A session running beside this one in the same checkout is carried over too: its loops are counted here as well,
940
+ * which holds a cap tighter, never looser.
941
+ *
942
+ * @param {string} root - The project.
943
+ * @param {object} project - `loadProject`'s.
944
+ * @param {string} path - This session's ledger, not written yet.
945
+ * @param {string} at - Now.
946
+ * @returns {{from: string, lines: string[]}|null} What was carried over, said as `nina gate --status` says it.
947
+ */
948
+ function inherit(root, project, path, at) {
949
+ const session = basename(path, '.jsonl');
950
+ const earlier = sessionLedgers(root).ledgers.find((l) => l.session !== session);
951
+ if (!earlier || Date.parse(at) - earlier.written.getTime() < QUIET_MS) return null;
952
+ const entries = readLedger(earlier.path);
953
+ const { open, waiting, rounds } = replay(entries, project.loops, project.forward);
954
+ const held = open.filter((l) => !l.closing);
955
+ if (held.length === 0 && waiting.length === 0) return null;
956
+ // Where each began: the launch of its source before the dispatch that made its first round since it last closed,
957
+ // or before the rejection a fix still waits on — so its rejection, its fix and every round after it come along. A
958
+ // launch is where its `pre` stands: a foreground run's `dispatch` is written after its verdict, and cut there the
959
+ // rejection that began the loop stayed behind.
960
+ const launchBefore = (source, index) => {
961
+ const j = entries.findLastIndex((e, k) => k < index && (e.k === 'pre' || e.k === 'dispatch') && e.role === source);
962
+ const pre = j >= 0 && entries[j].k === 'dispatch' && entries[j].id ? entries.findIndex((e, k) => k < j && e.k === 'pre' && e.id === entries[j].id) : -1;
963
+ return pre >= 0 ? pre : j;
964
+ };
965
+ const starts = [
966
+ ...held.map((l) => {
967
+ const first = rounds.findLast((r) => r.key === `${l.source}|${l.token}` && r.edgeRound === 1);
968
+ return first ? launchBefore(l.source, first.index) : 0;
969
+ }),
970
+ ...waiting.map((w) => launchBefore(w.source, w.index)),
971
+ ];
972
+ const from = Math.max(0, Math.min(...starts));
973
+ const carried = entries.slice(from).filter((e) => REPLAYED.has(e.k));
974
+ mkdirSync(dirname(path), { recursive: true });
975
+ const head = { k: 'inherit', at, from: earlier.session, loops: held.length, waiting: waiting.length };
976
+ try {
977
+ writeFileSync(path, [head, ...carried.map((e) => ({ ...e, inherited: e.inherited ?? earlier.session }))].map((e) => `${JSON.stringify(e)}\n`).join(''), { flag: 'wx' });
978
+ } catch (error) {
979
+ // Two of this session's hooks at once: the other carried them over.
980
+ if (error?.code === 'EEXIST') return null;
981
+ throw error;
982
+ }
983
+ const lines = loopState(project, [head, ...carried]).lines.filter((line) => !line.startsWith('- the latest dispatches'));
984
+ return { from: earlier.session, lines };
985
+ }
986
+
987
+ /**
988
+ * What a session that carried loops over still owes its first prompt, when another event began its ledger: that prompt
989
+ * resumes the work, and is told what was carried. Read only where the ledger opens with what was carried.
990
+ *
991
+ * @param {object} project - `loadProject`'s.
992
+ * @param {string} path - The session's ledger.
993
+ * @returns {{from: string, lines: string[]}|null}
994
+ */
995
+ function owedResume(project, path) {
996
+ let head = null;
997
+ try {
998
+ const fd = openSync(path, 'r');
999
+ try {
1000
+ const buffer = Buffer.alloc(512);
1001
+ const read = readSync(fd, buffer, 0, buffer.length, 0);
1002
+ head = JSON.parse(buffer.toString('utf8', 0, read).split('\n')[0]);
1003
+ } finally {
1004
+ closeSync(fd);
1005
+ }
1006
+ } catch {
1007
+ return null;
1008
+ }
1009
+ if (head?.k !== 'inherit') return null;
1010
+ const entries = readLedger(path);
1011
+ if (entries.some((e) => e.k === 'reset' && !e.inherited)) return null;
1012
+ return { from: String(head.from ?? ''), lines: loopState(project, entries).lines.filter((line) => !line.startsWith('- the latest dispatches')) };
1013
+ }
1014
+
922
1015
  /**
923
1016
  * What the gate hands the orchestrator after its conversation was compacted: the loops still open and the
924
1017
  * loop-backs waiting on a fix, the latest dispatches, where the checkout stands, and the two documents to read
@@ -992,15 +1085,28 @@ export function handle(input, { root, now = new Date(), pkg = PACKAGE }) {
992
1085
  if (!project) return null;
993
1086
  const path = ledgerPath(root, input?.session_id);
994
1087
  const at = now.toISOString();
1088
+ // A session's first event: its ledger begins with the loops the one before it left open. A carry-over that fails
1089
+ // costs only itself, never the event's own work.
1090
+ let carried = null;
1091
+ try {
1092
+ carried = input?.session_id && !existsSync(path) ? inherit(root, project, path, at) : null;
1093
+ } catch (error) {
1094
+ logError(root, input?.hook_event_name, error, now);
1095
+ }
995
1096
  switch (input?.hook_event_name) {
996
- case 'UserPromptSubmit':
1097
+ case 'UserPromptSubmit': {
997
1098
  if (typeof input.prompt === 'string' && DELIVERED.test(input.prompt.slice(0, DELIVERY_HEAD))) {
998
1099
  const from = /<agent-message from="([^"]+)"/.exec(input.prompt)?.[1] ?? /<task-id>([^<\s]+)<\/task-id>/.exec(input.prompt)?.[1];
999
1100
  return leftBehind(input, project, path, at, from, 'UserPromptSubmit');
1000
1101
  }
1001
- append(path, { k: 'reset', at, why: 'prompt' });
1102
+ // The session's first prompt, whatever event began its ledger.
1103
+ const resumed = carried ?? owedResume(project, path);
1104
+ append(path, { k: 'reset', at, why: resumed ? 'resume' : 'prompt' });
1002
1105
  prune(root, now);
1003
- return null;
1106
+ if (!resumed) return null;
1107
+ const said = [`The NINA loop gate carried over what session ${resumed.from.slice(0, 8)} left open; its caps hold here as they did there:`, ...resumed.lines];
1108
+ return { hookSpecificOutput: { hookEventName: 'UserPromptSubmit', additionalContext: said.join('\n') } };
1109
+ }
1004
1110
  case 'SubagentStop':
1005
1111
  return onStop(input, project, path, at);
1006
1112
  case 'SessionStart':