@nac3/forge-cli 0.2.0-alpha.9 → 0.2.1-alpha.60

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 (1045) hide show
  1. package/README.md +16 -1
  2. package/dist/a11y/helpers.d.ts +88 -0
  3. package/dist/a11y/helpers.d.ts.map +1 -0
  4. package/dist/a11y/helpers.js +109 -0
  5. package/dist/a11y/helpers.js.map +1 -0
  6. package/dist/agents/bridge.d.ts +69 -0
  7. package/dist/agents/bridge.d.ts.map +1 -0
  8. package/dist/agents/bridge.js +295 -0
  9. package/dist/agents/bridge.js.map +1 -0
  10. package/dist/agents/cli_real.d.ts +38 -0
  11. package/dist/agents/cli_real.d.ts.map +1 -0
  12. package/dist/agents/cli_real.js +46 -0
  13. package/dist/agents/cli_real.js.map +1 -0
  14. package/dist/agents/config_resolver.d.ts +16 -0
  15. package/dist/agents/config_resolver.d.ts.map +1 -0
  16. package/dist/agents/config_resolver.js +133 -0
  17. package/dist/agents/config_resolver.js.map +1 -0
  18. package/dist/agents/config_schema.d.ts +42 -0
  19. package/dist/agents/config_schema.d.ts.map +1 -0
  20. package/dist/agents/config_schema.js +220 -0
  21. package/dist/agents/config_schema.js.map +1 -0
  22. package/dist/agents/defaults.d.ts +21 -0
  23. package/dist/agents/defaults.d.ts.map +1 -0
  24. package/dist/agents/defaults.js +56 -0
  25. package/dist/agents/defaults.js.map +1 -0
  26. package/dist/agents/delegate.d.ts +36 -0
  27. package/dist/agents/delegate.d.ts.map +1 -0
  28. package/dist/agents/delegate.js +68 -0
  29. package/dist/agents/delegate.js.map +1 -0
  30. package/dist/agents/iterative_step.d.ts +95 -0
  31. package/dist/agents/iterative_step.d.ts.map +1 -0
  32. package/dist/agents/iterative_step.js +249 -0
  33. package/dist/agents/iterative_step.js.map +1 -0
  34. package/dist/agents/llm_step.d.ts +50 -0
  35. package/dist/agents/llm_step.d.ts.map +1 -0
  36. package/dist/agents/llm_step.js +28 -0
  37. package/dist/agents/llm_step.js.map +1 -0
  38. package/dist/agents/real_step_factory.d.ts +95 -0
  39. package/dist/agents/real_step_factory.d.ts.map +1 -0
  40. package/dist/agents/real_step_factory.js +51 -0
  41. package/dist/agents/real_step_factory.js.map +1 -0
  42. package/dist/agents/runner.d.ts +108 -0
  43. package/dist/agents/runner.d.ts.map +1 -0
  44. package/dist/agents/runner.js +174 -0
  45. package/dist/agents/runner.js.map +1 -0
  46. package/dist/agents/runtime.d.ts +115 -0
  47. package/dist/agents/runtime.d.ts.map +1 -0
  48. package/dist/agents/runtime.js +429 -0
  49. package/dist/agents/runtime.js.map +1 -0
  50. package/dist/agents/store.d.ts +33 -0
  51. package/dist/agents/store.d.ts.map +1 -0
  52. package/dist/agents/store.js +210 -0
  53. package/dist/agents/store.js.map +1 -0
  54. package/dist/agents/system_prompt.d.ts +36 -0
  55. package/dist/agents/system_prompt.d.ts.map +1 -0
  56. package/dist/agents/system_prompt.js +101 -0
  57. package/dist/agents/system_prompt.js.map +1 -0
  58. package/dist/agents/types.d.ts +123 -0
  59. package/dist/agents/types.d.ts.map +1 -0
  60. package/dist/agents/types.js +39 -0
  61. package/dist/agents/types.js.map +1 -0
  62. package/dist/bin/yf.d.ts.map +1 -1
  63. package/dist/bin/yf.js +101 -2
  64. package/dist/bin/yf.js.map +1 -1
  65. package/dist/chat/claude.d.ts +89 -1
  66. package/dist/chat/claude.d.ts.map +1 -1
  67. package/dist/chat/claude.js +170 -30
  68. package/dist/chat/claude.js.map +1 -1
  69. package/dist/chat/claude_cli.d.ts +145 -0
  70. package/dist/chat/claude_cli.d.ts.map +1 -0
  71. package/dist/chat/claude_cli.js +598 -0
  72. package/dist/chat/claude_cli.js.map +1 -0
  73. package/dist/chat/completion_hallucination_detector.d.ts +40 -0
  74. package/dist/chat/completion_hallucination_detector.d.ts.map +1 -0
  75. package/dist/chat/completion_hallucination_detector.js +96 -0
  76. package/dist/chat/completion_hallucination_detector.js.map +1 -0
  77. package/dist/chat/doctrine_digest.d.ts +31 -0
  78. package/dist/chat/doctrine_digest.d.ts.map +1 -0
  79. package/dist/chat/doctrine_digest.js +117 -0
  80. package/dist/chat/doctrine_digest.js.map +1 -0
  81. package/dist/chat/graph_auto_ingest.d.ts +46 -0
  82. package/dist/chat/graph_auto_ingest.d.ts.map +1 -0
  83. package/dist/chat/graph_auto_ingest.js +177 -0
  84. package/dist/chat/graph_auto_ingest.js.map +1 -0
  85. package/dist/chat/graph_component_watcher.d.ts +34 -0
  86. package/dist/chat/graph_component_watcher.d.ts.map +1 -0
  87. package/dist/chat/graph_component_watcher.js +225 -0
  88. package/dist/chat/graph_component_watcher.js.map +1 -0
  89. package/dist/chat/graph_snapshot.d.ts +38 -0
  90. package/dist/chat/graph_snapshot.d.ts.map +1 -0
  91. package/dist/chat/graph_snapshot.js +159 -0
  92. package/dist/chat/graph_snapshot.js.map +1 -0
  93. package/dist/chat/ingest_session.d.ts +24 -4
  94. package/dist/chat/ingest_session.d.ts.map +1 -1
  95. package/dist/chat/ingest_session.js +143 -4
  96. package/dist/chat/ingest_session.js.map +1 -1
  97. package/dist/chat/panel.d.ts.map +1 -1
  98. package/dist/chat/panel.js +9640 -1455
  99. package/dist/chat/panel.js.map +1 -1
  100. package/dist/chat/panel_queue.d.ts +43 -0
  101. package/dist/chat/panel_queue.d.ts.map +1 -0
  102. package/dist/chat/panel_queue.js +46 -0
  103. package/dist/chat/panel_queue.js.map +1 -0
  104. package/dist/chat/project_context_inject.d.ts +10 -0
  105. package/dist/chat/project_context_inject.d.ts.map +1 -0
  106. package/dist/chat/project_context_inject.js +119 -0
  107. package/dist/chat/project_context_inject.js.map +1 -0
  108. package/dist/chat/project_slug.d.ts +17 -0
  109. package/dist/chat/project_slug.d.ts.map +1 -0
  110. package/dist/chat/project_slug.js +103 -0
  111. package/dist/chat/project_slug.js.map +1 -0
  112. package/dist/chat/refusal_detector.d.ts +14 -0
  113. package/dist/chat/refusal_detector.d.ts.map +1 -0
  114. package/dist/chat/refusal_detector.js +138 -0
  115. package/dist/chat/refusal_detector.js.map +1 -0
  116. package/dist/chat/semantic_graph_ingest.d.ts +39 -0
  117. package/dist/chat/semantic_graph_ingest.d.ts.map +1 -0
  118. package/dist/chat/semantic_graph_ingest.js +90 -0
  119. package/dist/chat/semantic_graph_ingest.js.map +1 -0
  120. package/dist/chat/semantic_graph_inject.d.ts +31 -0
  121. package/dist/chat/semantic_graph_inject.d.ts.map +1 -0
  122. package/dist/chat/semantic_graph_inject.js +63 -0
  123. package/dist/chat/semantic_graph_inject.js.map +1 -0
  124. package/dist/chat/server.d.ts +98 -2
  125. package/dist/chat/server.d.ts.map +1 -1
  126. package/dist/chat/server.js +3678 -345
  127. package/dist/chat/server.js.map +1 -1
  128. package/dist/chat/spec_extract.d.ts +1 -2
  129. package/dist/chat/spec_extract.d.ts.map +1 -1
  130. package/dist/chat/spec_extract.js +41 -56
  131. package/dist/chat/spec_extract.js.map +1 -1
  132. package/dist/chat/spec_plan.d.ts +1 -2
  133. package/dist/chat/spec_plan.d.ts.map +1 -1
  134. package/dist/chat/spec_plan.js +36 -57
  135. package/dist/chat/spec_plan.js.map +1 -1
  136. package/dist/chat/tools/app_backend_dispatch.d.ts +39 -0
  137. package/dist/chat/tools/app_backend_dispatch.d.ts.map +1 -0
  138. package/dist/chat/tools/app_backend_dispatch.js +239 -0
  139. package/dist/chat/tools/app_backend_dispatch.js.map +1 -0
  140. package/dist/chat/tools/fs_editor.d.ts +11 -0
  141. package/dist/chat/tools/fs_editor.d.ts.map +1 -0
  142. package/dist/chat/tools/fs_editor.js +162 -0
  143. package/dist/chat/tools/fs_editor.js.map +1 -0
  144. package/dist/chat/tools/git.d.ts +24 -0
  145. package/dist/chat/tools/git.d.ts.map +1 -1
  146. package/dist/chat/tools/git.js +78 -0
  147. package/dist/chat/tools/git.js.map +1 -1
  148. package/dist/chat/tools/graph.d.ts +43 -0
  149. package/dist/chat/tools/graph.d.ts.map +1 -0
  150. package/dist/chat/tools/graph.js +174 -0
  151. package/dist/chat/tools/graph.js.map +1 -0
  152. package/dist/chat/tools/keys.d.ts +9 -0
  153. package/dist/chat/tools/keys.d.ts.map +1 -0
  154. package/dist/chat/tools/keys.js +169 -0
  155. package/dist/chat/tools/keys.js.map +1 -0
  156. package/dist/chat/tools/misc_verbs.d.ts +36 -0
  157. package/dist/chat/tools/misc_verbs.d.ts.map +1 -0
  158. package/dist/chat/tools/misc_verbs.js +405 -0
  159. package/dist/chat/tools/misc_verbs.js.map +1 -0
  160. package/dist/chat/tools/nac3_invoke.d.ts +58 -0
  161. package/dist/chat/tools/nac3_invoke.d.ts.map +1 -0
  162. package/dist/chat/tools/nac3_invoke.js +887 -0
  163. package/dist/chat/tools/nac3_invoke.js.map +1 -0
  164. package/dist/chat/tools/pending.d.ts +69 -0
  165. package/dist/chat/tools/pending.d.ts.map +1 -0
  166. package/dist/chat/tools/pending.js +167 -0
  167. package/dist/chat/tools/pending.js.map +1 -0
  168. package/dist/chat/tools/pizarron.d.ts +40 -0
  169. package/dist/chat/tools/pizarron.d.ts.map +1 -0
  170. package/dist/chat/tools/pizarron.js +123 -0
  171. package/dist/chat/tools/pizarron.js.map +1 -0
  172. package/dist/chat/tools/project_lifecycle.d.ts +24 -0
  173. package/dist/chat/tools/project_lifecycle.d.ts.map +1 -0
  174. package/dist/chat/tools/project_lifecycle.js +212 -0
  175. package/dist/chat/tools/project_lifecycle.js.map +1 -0
  176. package/dist/chat/tools/reader.d.ts.map +1 -1
  177. package/dist/chat/tools/reader.js +144 -1
  178. package/dist/chat/tools/reader.js.map +1 -1
  179. package/dist/chat/tools/shell.d.ts +58 -0
  180. package/dist/chat/tools/shell.d.ts.map +1 -0
  181. package/dist/chat/tools/shell.js +253 -0
  182. package/dist/chat/tools/shell.js.map +1 -0
  183. package/dist/chat/tools/wiring.d.ts +28 -0
  184. package/dist/chat/tools/wiring.d.ts.map +1 -0
  185. package/dist/chat/tools/wiring.js +116 -0
  186. package/dist/chat/tools/wiring.js.map +1 -0
  187. package/dist/chat/tools/workflow.d.ts +55 -0
  188. package/dist/chat/tools/workflow.d.ts.map +1 -0
  189. package/dist/chat/tools/workflow.js +463 -0
  190. package/dist/chat/tools/workflow.js.map +1 -0
  191. package/dist/chat/tools.d.ts +42 -0
  192. package/dist/chat/tools.d.ts.map +1 -1
  193. package/dist/chat/tools.js +447 -16
  194. package/dist/chat/tools.js.map +1 -1
  195. package/dist/chat/wiring_inject.d.ts +18 -0
  196. package/dist/chat/wiring_inject.d.ts.map +1 -0
  197. package/dist/chat/wiring_inject.js +78 -0
  198. package/dist/chat/wiring_inject.js.map +1 -0
  199. package/dist/chat/workflow_inject.d.ts +52 -0
  200. package/dist/chat/workflow_inject.d.ts.map +1 -0
  201. package/dist/chat/workflow_inject.js +346 -0
  202. package/dist/chat/workflow_inject.js.map +1 -0
  203. package/dist/chat/yujin_splash.d.ts +27 -0
  204. package/dist/chat/yujin_splash.d.ts.map +1 -0
  205. package/dist/chat/yujin_splash.js +147 -0
  206. package/dist/chat/yujin_splash.js.map +1 -0
  207. package/dist/commands/agent.d.ts +33 -0
  208. package/dist/commands/agent.d.ts.map +1 -0
  209. package/dist/commands/agent.js +281 -0
  210. package/dist/commands/agent.js.map +1 -0
  211. package/dist/commands/approve.d.ts +32 -0
  212. package/dist/commands/approve.d.ts.map +1 -0
  213. package/dist/commands/approve.js +198 -0
  214. package/dist/commands/approve.js.map +1 -0
  215. package/dist/commands/block.d.ts +28 -0
  216. package/dist/commands/block.d.ts.map +1 -0
  217. package/dist/commands/block.js +189 -0
  218. package/dist/commands/block.js.map +1 -0
  219. package/dist/commands/bootstrap.d.ts +35 -0
  220. package/dist/commands/bootstrap.d.ts.map +1 -0
  221. package/dist/commands/bootstrap.js +205 -0
  222. package/dist/commands/bootstrap.js.map +1 -0
  223. package/dist/commands/brain.d.ts +17 -0
  224. package/dist/commands/brain.d.ts.map +1 -0
  225. package/dist/commands/brain.js +129 -0
  226. package/dist/commands/brain.js.map +1 -0
  227. package/dist/commands/chat.d.ts +10 -0
  228. package/dist/commands/chat.d.ts.map +1 -1
  229. package/dist/commands/chat.js +209 -17
  230. package/dist/commands/chat.js.map +1 -1
  231. package/dist/commands/clarify.d.ts +30 -0
  232. package/dist/commands/clarify.d.ts.map +1 -0
  233. package/dist/commands/clarify.js +671 -0
  234. package/dist/commands/clarify.js.map +1 -0
  235. package/dist/commands/director.d.ts +37 -0
  236. package/dist/commands/director.d.ts.map +1 -0
  237. package/dist/commands/director.js +290 -0
  238. package/dist/commands/director.js.map +1 -0
  239. package/dist/commands/discover.d.ts +30 -0
  240. package/dist/commands/discover.d.ts.map +1 -0
  241. package/dist/commands/discover.js +178 -0
  242. package/dist/commands/discover.js.map +1 -0
  243. package/dist/commands/doctor.d.ts +18 -0
  244. package/dist/commands/doctor.d.ts.map +1 -1
  245. package/dist/commands/doctor.js +120 -4
  246. package/dist/commands/doctor.js.map +1 -1
  247. package/dist/commands/doctrine.d.ts +24 -0
  248. package/dist/commands/doctrine.d.ts.map +1 -0
  249. package/dist/commands/doctrine.js +106 -0
  250. package/dist/commands/doctrine.js.map +1 -0
  251. package/dist/commands/doctrines.d.ts +21 -0
  252. package/dist/commands/doctrines.d.ts.map +1 -0
  253. package/dist/commands/doctrines.js +158 -0
  254. package/dist/commands/doctrines.js.map +1 -0
  255. package/dist/commands/graph.d.ts +29 -0
  256. package/dist/commands/graph.d.ts.map +1 -0
  257. package/dist/commands/graph.js +362 -0
  258. package/dist/commands/graph.js.map +1 -0
  259. package/dist/commands/keys_setup.d.ts +18 -0
  260. package/dist/commands/keys_setup.d.ts.map +1 -1
  261. package/dist/commands/keys_setup.js +225 -11
  262. package/dist/commands/keys_setup.js.map +1 -1
  263. package/dist/commands/legacy-audit.d.ts +34 -0
  264. package/dist/commands/legacy-audit.d.ts.map +1 -0
  265. package/dist/commands/legacy-audit.js +270 -0
  266. package/dist/commands/legacy-audit.js.map +1 -0
  267. package/dist/commands/lessons.d.ts +28 -0
  268. package/dist/commands/lessons.d.ts.map +1 -0
  269. package/dist/commands/lessons.js +309 -0
  270. package/dist/commands/lessons.js.map +1 -0
  271. package/dist/commands/license.d.ts.map +1 -1
  272. package/dist/commands/license.js +56 -1
  273. package/dist/commands/license.js.map +1 -1
  274. package/dist/commands/limits.d.ts +15 -0
  275. package/dist/commands/limits.d.ts.map +1 -0
  276. package/dist/commands/limits.js +51 -0
  277. package/dist/commands/limits.js.map +1 -0
  278. package/dist/commands/manifest-cli.d.ts +12 -0
  279. package/dist/commands/manifest-cli.d.ts.map +1 -0
  280. package/dist/commands/manifest-cli.js +42 -0
  281. package/dist/commands/manifest-cli.js.map +1 -0
  282. package/dist/commands/mcp.d.ts +24 -0
  283. package/dist/commands/mcp.d.ts.map +1 -0
  284. package/dist/commands/mcp.js +163 -0
  285. package/dist/commands/mcp.js.map +1 -0
  286. package/dist/commands/mobile.d.ts +15 -0
  287. package/dist/commands/mobile.d.ts.map +1 -1
  288. package/dist/commands/mobile.js +27 -24
  289. package/dist/commands/mobile.js.map +1 -1
  290. package/dist/commands/nac3.d.ts +22 -0
  291. package/dist/commands/nac3.d.ts.map +1 -0
  292. package/dist/commands/nac3.js +125 -0
  293. package/dist/commands/nac3.js.map +1 -0
  294. package/dist/commands/operate.d.ts +22 -0
  295. package/dist/commands/operate.d.ts.map +1 -0
  296. package/dist/commands/operate.js +523 -0
  297. package/dist/commands/operate.js.map +1 -0
  298. package/dist/commands/pending.d.ts +22 -0
  299. package/dist/commands/pending.d.ts.map +1 -0
  300. package/dist/commands/pending.js +341 -0
  301. package/dist/commands/pending.js.map +1 -0
  302. package/dist/commands/qa.d.ts +24 -0
  303. package/dist/commands/qa.d.ts.map +1 -0
  304. package/dist/commands/qa.js +349 -0
  305. package/dist/commands/qa.js.map +1 -0
  306. package/dist/commands/spec.d.ts +38 -0
  307. package/dist/commands/spec.d.ts.map +1 -0
  308. package/dist/commands/spec.js +256 -0
  309. package/dist/commands/spec.js.map +1 -0
  310. package/dist/commands/support.d.ts +22 -0
  311. package/dist/commands/support.d.ts.map +1 -0
  312. package/dist/commands/support.js +165 -0
  313. package/dist/commands/support.js.map +1 -0
  314. package/dist/commands/test_agent.d.ts +22 -0
  315. package/dist/commands/test_agent.d.ts.map +1 -0
  316. package/dist/commands/test_agent.js +100 -0
  317. package/dist/commands/test_agent.js.map +1 -0
  318. package/dist/commands/triage.d.ts +34 -0
  319. package/dist/commands/triage.d.ts.map +1 -0
  320. package/dist/commands/triage.js +228 -0
  321. package/dist/commands/triage.js.map +1 -0
  322. package/dist/commands/vault-inventory.d.ts +30 -0
  323. package/dist/commands/vault-inventory.d.ts.map +1 -0
  324. package/dist/commands/vault-inventory.js +222 -0
  325. package/dist/commands/vault-inventory.js.map +1 -0
  326. package/dist/commands/vault.d.ts.map +1 -1
  327. package/dist/commands/vault.js +5 -0
  328. package/dist/commands/vault.js.map +1 -1
  329. package/dist/commands/voice.d.ts.map +1 -1
  330. package/dist/commands/voice.js +47 -4
  331. package/dist/commands/voice.js.map +1 -1
  332. package/dist/commands/wiring.d.ts +19 -0
  333. package/dist/commands/wiring.d.ts.map +1 -0
  334. package/dist/commands/wiring.js +135 -0
  335. package/dist/commands/wiring.js.map +1 -0
  336. package/dist/commands/workflow-coverage.d.ts +30 -0
  337. package/dist/commands/workflow-coverage.d.ts.map +1 -0
  338. package/dist/commands/workflow-coverage.js +138 -0
  339. package/dist/commands/workflow-coverage.js.map +1 -0
  340. package/dist/core/ansi_strip.d.ts +39 -0
  341. package/dist/core/ansi_strip.d.ts.map +1 -0
  342. package/dist/core/ansi_strip.js +71 -0
  343. package/dist/core/ansi_strip.js.map +1 -0
  344. package/dist/core/atomic_write.d.ts +17 -0
  345. package/dist/core/atomic_write.d.ts.map +1 -0
  346. package/dist/core/atomic_write.js +51 -0
  347. package/dist/core/atomic_write.js.map +1 -0
  348. package/dist/core/audit_log.d.ts +43 -0
  349. package/dist/core/audit_log.d.ts.map +1 -0
  350. package/dist/core/audit_log.js +80 -0
  351. package/dist/core/audit_log.js.map +1 -0
  352. package/dist/core/brain_config.d.ts +50 -0
  353. package/dist/core/brain_config.d.ts.map +1 -0
  354. package/dist/core/brain_config.js +142 -0
  355. package/dist/core/brain_config.js.map +1 -0
  356. package/dist/core/budget.d.ts +96 -0
  357. package/dist/core/budget.d.ts.map +1 -0
  358. package/dist/core/budget.js +328 -0
  359. package/dist/core/budget.js.map +1 -0
  360. package/dist/core/cost_meter.d.ts +35 -0
  361. package/dist/core/cost_meter.d.ts.map +1 -0
  362. package/dist/core/cost_meter.js +111 -0
  363. package/dist/core/cost_meter.js.map +1 -0
  364. package/dist/core/cost_router.d.ts +106 -0
  365. package/dist/core/cost_router.d.ts.map +1 -0
  366. package/dist/core/cost_router.js +589 -0
  367. package/dist/core/cost_router.js.map +1 -0
  368. package/dist/core/doctrine_resolver.d.ts +23 -0
  369. package/dist/core/doctrine_resolver.d.ts.map +1 -0
  370. package/dist/core/doctrine_resolver.js +108 -0
  371. package/dist/core/doctrine_resolver.js.map +1 -0
  372. package/dist/core/error_catalog.d.ts +80 -0
  373. package/dist/core/error_catalog.d.ts.map +1 -0
  374. package/dist/core/error_catalog.js +168 -0
  375. package/dist/core/error_catalog.js.map +1 -0
  376. package/dist/core/error_formatter.d.ts +30 -0
  377. package/dist/core/error_formatter.d.ts.map +1 -0
  378. package/dist/core/error_formatter.js +155 -0
  379. package/dist/core/error_formatter.js.map +1 -0
  380. package/dist/core/incomplete_detector.d.ts +51 -0
  381. package/dist/core/incomplete_detector.d.ts.map +1 -0
  382. package/dist/core/incomplete_detector.js +140 -0
  383. package/dist/core/incomplete_detector.js.map +1 -0
  384. package/dist/core/keys_envelope.d.ts.map +1 -1
  385. package/dist/core/keys_envelope.js +14 -9
  386. package/dist/core/keys_envelope.js.map +1 -1
  387. package/dist/core/learnings_client.d.ts +104 -0
  388. package/dist/core/learnings_client.d.ts.map +1 -0
  389. package/dist/core/learnings_client.js +262 -0
  390. package/dist/core/learnings_client.js.map +1 -0
  391. package/dist/core/limits_config.d.ts +76 -0
  392. package/dist/core/limits_config.d.ts.map +1 -0
  393. package/dist/core/limits_config.js +297 -0
  394. package/dist/core/limits_config.js.map +1 -0
  395. package/dist/core/pairing.d.ts +1 -0
  396. package/dist/core/pairing.d.ts.map +1 -1
  397. package/dist/core/pairing.js +23 -12
  398. package/dist/core/pairing.js.map +1 -1
  399. package/dist/core/pilot_setup.d.ts +29 -3
  400. package/dist/core/pilot_setup.d.ts.map +1 -1
  401. package/dist/core/pilot_setup.js +130 -3
  402. package/dist/core/pilot_setup.js.map +1 -1
  403. package/dist/core/provider_keys.d.ts +35 -0
  404. package/dist/core/provider_keys.d.ts.map +1 -0
  405. package/dist/core/provider_keys.js +267 -0
  406. package/dist/core/provider_keys.js.map +1 -0
  407. package/dist/core/provider_models.d.ts +27 -0
  408. package/dist/core/provider_models.d.ts.map +1 -0
  409. package/dist/core/provider_models.js +169 -0
  410. package/dist/core/provider_models.js.map +1 -0
  411. package/dist/core/reasoning_gate.d.ts +72 -0
  412. package/dist/core/reasoning_gate.d.ts.map +1 -0
  413. package/dist/core/reasoning_gate.js +205 -0
  414. package/dist/core/reasoning_gate.js.map +1 -0
  415. package/dist/core/shell_classifier.d.ts +49 -0
  416. package/dist/core/shell_classifier.d.ts.map +1 -0
  417. package/dist/core/shell_classifier.js +159 -0
  418. package/dist/core/shell_classifier.js.map +1 -0
  419. package/dist/core/sq_resolver.d.ts +14 -0
  420. package/dist/core/sq_resolver.d.ts.map +1 -0
  421. package/dist/core/sq_resolver.js +230 -0
  422. package/dist/core/sq_resolver.js.map +1 -0
  423. package/dist/core/truncation_detector.d.ts +68 -0
  424. package/dist/core/truncation_detector.d.ts.map +1 -0
  425. package/dist/core/truncation_detector.js +115 -0
  426. package/dist/core/truncation_detector.js.map +1 -0
  427. package/dist/core/turn_classifier.d.ts +70 -0
  428. package/dist/core/turn_classifier.d.ts.map +1 -0
  429. package/dist/core/turn_classifier.js +324 -0
  430. package/dist/core/turn_classifier.js.map +1 -0
  431. package/dist/core/vad_config.d.ts +34 -0
  432. package/dist/core/vad_config.d.ts.map +1 -0
  433. package/dist/core/vad_config.js +95 -0
  434. package/dist/core/vad_config.js.map +1 -0
  435. package/dist/core/whats_new.d.ts +42 -0
  436. package/dist/core/whats_new.d.ts.map +1 -0
  437. package/dist/core/whats_new.js +214 -0
  438. package/dist/core/whats_new.js.map +1 -0
  439. package/dist/core/wizard_state.d.ts +15 -0
  440. package/dist/core/wizard_state.d.ts.map +1 -0
  441. package/dist/core/wizard_state.js +86 -0
  442. package/dist/core/wizard_state.js.map +1 -0
  443. package/dist/deploy/adapter.d.ts +93 -0
  444. package/dist/deploy/adapter.d.ts.map +1 -0
  445. package/dist/deploy/adapter.js +42 -0
  446. package/dist/deploy/adapter.js.map +1 -0
  447. package/dist/deploy/aws_adapter.d.ts +28 -0
  448. package/dist/deploy/aws_adapter.d.ts.map +1 -0
  449. package/dist/deploy/aws_adapter.js +98 -0
  450. package/dist/deploy/aws_adapter.js.map +1 -0
  451. package/dist/deploy/cloudflare.d.ts +24 -0
  452. package/dist/deploy/cloudflare.d.ts.map +1 -0
  453. package/dist/deploy/cloudflare.js +169 -0
  454. package/dist/deploy/cloudflare.js.map +1 -0
  455. package/dist/design/yujin_design_resolver.d.ts +77 -0
  456. package/dist/design/yujin_design_resolver.d.ts.map +1 -0
  457. package/dist/design/yujin_design_resolver.js +113 -0
  458. package/dist/design/yujin_design_resolver.js.map +1 -0
  459. package/dist/docs/LIMITED_RESPONSIBILITY.md +216 -0
  460. package/dist/docs/PRIVACY_POLICY.md +169 -0
  461. package/dist/docs/SQ.md +1397 -0
  462. package/dist/docs/SQ_BY_STEP.yaml +147 -0
  463. package/dist/docs/doctrine/accessibility.md +78 -0
  464. package/dist/docs/doctrine/agent-orchestrator.md +76 -0
  465. package/dist/docs/doctrine/byok-vs-managed.md +81 -0
  466. package/dist/docs/doctrine/cost-router-escalation.md +103 -0
  467. package/dist/docs/doctrine/default-design-system.md +120 -0
  468. package/dist/docs/doctrine/explain-results.md +90 -0
  469. package/dist/docs/doctrine/expo-eas-builds.md +177 -0
  470. package/dist/docs/doctrine/g-doc.md +46 -0
  471. package/dist/docs/doctrine/gates.md +21 -0
  472. package/dist/docs/doctrine/language-sovereignty.md +143 -0
  473. package/dist/docs/doctrine/lessons-workflow.md +68 -0
  474. package/dist/docs/doctrine/mcp-bridge-lifecycle.md +75 -0
  475. package/dist/docs/doctrine/nac3-attrs.md +23 -0
  476. package/dist/docs/doctrine/office-tools.md +102 -0
  477. package/dist/docs/doctrine/pizarron.md +52 -0
  478. package/dist/docs/doctrine/r8-modal.md +60 -0
  479. package/dist/docs/doctrine/safety-refusals.md +73 -0
  480. package/dist/docs/doctrine/testing-policy.md +211 -0
  481. package/dist/docs/doctrine/verb-composition.md +68 -0
  482. package/dist/docs/doctrine/verification-honesty.md +95 -0
  483. package/dist/docs/doctrine/workflow-kinds.md +52 -0
  484. package/dist/docs/doctrine/workflow-phases.md +108 -0
  485. package/dist/docs/doctrine/workflow.md +58 -0
  486. package/dist/docs/doctrine/yf-commands.md +49 -0
  487. package/dist/json/query.d.ts +38 -0
  488. package/dist/json/query.d.ts.map +1 -0
  489. package/dist/json/query.js +177 -0
  490. package/dist/json/query.js.map +1 -0
  491. package/dist/license/hito4_client.d.ts +7 -0
  492. package/dist/license/hito4_client.d.ts.map +1 -1
  493. package/dist/license/hito4_client.js +52 -2
  494. package/dist/license/hito4_client.js.map +1 -1
  495. package/dist/license/sync.d.ts +59 -0
  496. package/dist/license/sync.d.ts.map +1 -0
  497. package/dist/license/sync.js +148 -0
  498. package/dist/license/sync.js.map +1 -0
  499. package/dist/llm/cohere_client.d.ts +81 -0
  500. package/dist/llm/cohere_client.d.ts.map +1 -0
  501. package/dist/llm/cohere_client.js +195 -0
  502. package/dist/llm/cohere_client.js.map +1 -0
  503. package/dist/llm/deepseek_client.d.ts +63 -0
  504. package/dist/llm/deepseek_client.d.ts.map +1 -0
  505. package/dist/llm/deepseek_client.js +188 -0
  506. package/dist/llm/deepseek_client.js.map +1 -0
  507. package/dist/llm/gemini_client.d.ts +78 -0
  508. package/dist/llm/gemini_client.d.ts.map +1 -0
  509. package/dist/llm/gemini_client.js +189 -0
  510. package/dist/llm/gemini_client.js.map +1 -0
  511. package/dist/llm/managed_client.d.ts +70 -0
  512. package/dist/llm/managed_client.d.ts.map +1 -0
  513. package/dist/llm/managed_client.js +251 -0
  514. package/dist/llm/managed_client.js.map +1 -0
  515. package/dist/llm/mistral_client.d.ts +54 -0
  516. package/dist/llm/mistral_client.d.ts.map +1 -0
  517. package/dist/llm/mistral_client.js +174 -0
  518. package/dist/llm/mistral_client.js.map +1 -0
  519. package/dist/llm/multi_provider_client.d.ts +57 -0
  520. package/dist/llm/multi_provider_client.d.ts.map +1 -0
  521. package/dist/llm/multi_provider_client.js +109 -0
  522. package/dist/llm/multi_provider_client.js.map +1 -0
  523. package/dist/llm/openai_client.d.ts +77 -0
  524. package/dist/llm/openai_client.d.ts.map +1 -0
  525. package/dist/llm/openai_client.js +200 -0
  526. package/dist/llm/openai_client.js.map +1 -0
  527. package/dist/llm/xai_client.d.ts +51 -0
  528. package/dist/llm/xai_client.d.ts.map +1 -0
  529. package/dist/llm/xai_client.js +174 -0
  530. package/dist/llm/xai_client.js.map +1 -0
  531. package/dist/mcp/blocklist.d.ts +19 -0
  532. package/dist/mcp/blocklist.d.ts.map +1 -0
  533. package/dist/mcp/blocklist.js +118 -0
  534. package/dist/mcp/blocklist.js.map +1 -0
  535. package/dist/mcp/bridge_registry.d.ts +77 -0
  536. package/dist/mcp/bridge_registry.d.ts.map +1 -0
  537. package/dist/mcp/bridge_registry.js +220 -0
  538. package/dist/mcp/bridge_registry.js.map +1 -0
  539. package/dist/mcp/config.d.ts +25 -0
  540. package/dist/mcp/config.d.ts.map +1 -0
  541. package/dist/mcp/config.js +116 -0
  542. package/dist/mcp/config.js.map +1 -0
  543. package/dist/mcp/forge_panel_server.d.ts +46 -0
  544. package/dist/mcp/forge_panel_server.d.ts.map +1 -0
  545. package/dist/mcp/forge_panel_server.js +166 -0
  546. package/dist/mcp/forge_panel_server.js.map +1 -0
  547. package/dist/mcp/lan_scan.d.ts +36 -0
  548. package/dist/mcp/lan_scan.d.ts.map +1 -0
  549. package/dist/mcp/lan_scan.js +130 -0
  550. package/dist/mcp/lan_scan.js.map +1 -0
  551. package/dist/mcp/protocol_client.d.ts +63 -0
  552. package/dist/mcp/protocol_client.d.ts.map +1 -0
  553. package/dist/mcp/protocol_client.js +340 -0
  554. package/dist/mcp/protocol_client.js.map +1 -0
  555. package/dist/mcp/state.d.ts +38 -0
  556. package/dist/mcp/state.d.ts.map +1 -0
  557. package/dist/mcp/state.js +144 -0
  558. package/dist/mcp/state.js.map +1 -0
  559. package/dist/migrate/ai-decorator.d.ts.map +1 -1
  560. package/dist/migrate/ai-decorator.js +55 -143
  561. package/dist/migrate/ai-decorator.js.map +1 -1
  562. package/dist/nac3/approval_queue.d.ts +44 -0
  563. package/dist/nac3/approval_queue.d.ts.map +1 -0
  564. package/dist/nac3/approval_queue.js +105 -0
  565. package/dist/nac3/approval_queue.js.map +1 -0
  566. package/dist/nac3/backend_tools.d.ts +89 -0
  567. package/dist/nac3/backend_tools.d.ts.map +1 -0
  568. package/dist/nac3/backend_tools.js +271 -0
  569. package/dist/nac3/backend_tools.js.map +1 -0
  570. package/dist/nac3/dispatch_log.d.ts +35 -0
  571. package/dist/nac3/dispatch_log.d.ts.map +1 -0
  572. package/dist/nac3/dispatch_log.js +126 -0
  573. package/dist/nac3/dispatch_log.js.map +1 -0
  574. package/dist/nac3/internal_manifest.d.ts +62 -0
  575. package/dist/nac3/internal_manifest.d.ts.map +1 -0
  576. package/dist/nac3/internal_manifest.js +2461 -0
  577. package/dist/nac3/internal_manifest.js.map +1 -0
  578. package/dist/nac3/manifest_lazy.d.ts +71 -0
  579. package/dist/nac3/manifest_lazy.d.ts.map +1 -0
  580. package/dist/nac3/manifest_lazy.js +141 -0
  581. package/dist/nac3/manifest_lazy.js.map +1 -0
  582. package/dist/nac3/verb_tier_map.d.ts +80 -0
  583. package/dist/nac3/verb_tier_map.d.ts.map +1 -0
  584. package/dist/nac3/verb_tier_map.js +159 -0
  585. package/dist/nac3/verb_tier_map.js.map +1 -0
  586. package/dist/office/excel.d.ts +132 -0
  587. package/dist/office/excel.d.ts.map +1 -0
  588. package/dist/office/excel.js +358 -0
  589. package/dist/office/excel.js.map +1 -0
  590. package/dist/office/pdf.d.ts +35 -0
  591. package/dist/office/pdf.d.ts.map +1 -0
  592. package/dist/office/pdf.js +70 -0
  593. package/dist/office/pdf.js.map +1 -0
  594. package/dist/office/word.d.ts +64 -0
  595. package/dist/office/word.d.ts.map +1 -0
  596. package/dist/office/word.js +243 -0
  597. package/dist/office/word.js.map +1 -0
  598. package/dist/pending/store.d.ts +72 -0
  599. package/dist/pending/store.d.ts.map +1 -0
  600. package/dist/pending/store.js +274 -0
  601. package/dist/pending/store.js.map +1 -0
  602. package/dist/pending/types.d.ts +111 -0
  603. package/dist/pending/types.d.ts.map +1 -0
  604. package/dist/pending/types.js +60 -0
  605. package/dist/pending/types.js.map +1 -0
  606. package/dist/qa/brain_matrix/ab_runner.d.ts +44 -0
  607. package/dist/qa/brain_matrix/ab_runner.d.ts.map +1 -0
  608. package/dist/qa/brain_matrix/ab_runner.js +144 -0
  609. package/dist/qa/brain_matrix/ab_runner.js.map +1 -0
  610. package/dist/qa/brain_matrix/brains.json +80 -0
  611. package/dist/qa/brain_matrix/compare.d.ts +27 -0
  612. package/dist/qa/brain_matrix/compare.d.ts.map +1 -0
  613. package/dist/qa/brain_matrix/compare.js +122 -0
  614. package/dist/qa/brain_matrix/compare.js.map +1 -0
  615. package/dist/qa/brain_matrix/fake_brain.d.ts +36 -0
  616. package/dist/qa/brain_matrix/fake_brain.d.ts.map +1 -0
  617. package/dist/qa/brain_matrix/fake_brain.js +27 -0
  618. package/dist/qa/brain_matrix/fake_brain.js.map +1 -0
  619. package/dist/qa/brain_matrix/fixtures/scenario_a11y_announce_intent.json +22 -0
  620. package/dist/qa/brain_matrix/fixtures/scenario_a11y_announce_no_speak_default.json +23 -0
  621. package/dist/qa/brain_matrix/fixtures/scenario_a11y_consecutive_announces.json +37 -0
  622. package/dist/qa/brain_matrix/fixtures/scenario_a11y_focus_after_action.json +22 -0
  623. package/dist/qa/brain_matrix/fixtures/scenario_a11y_focus_after_open.json +22 -0
  624. package/dist/qa/brain_matrix/fixtures/scenario_a11y_label_unlabeled_button.json +26 -0
  625. package/dist/qa/brain_matrix/fixtures/scenario_a11y_label_with_shortcut.json +22 -0
  626. package/dist/qa/brain_matrix/fixtures/scenario_agent_director_consults_workflow_before_dispatch.json +42 -0
  627. package/dist/qa/brain_matrix/fixtures/scenario_analyst_extracts_then_returns.json +28 -0
  628. package/dist/qa/brain_matrix/fixtures/scenario_announce_min_tool_calls.json +23 -0
  629. package/dist/qa/brain_matrix/fixtures/scenario_app_invoke_happy_path.json +65 -0
  630. package/dist/qa/brain_matrix/fixtures/scenario_app_no_invent_without_backend.json +18 -0
  631. package/dist/qa/brain_matrix/fixtures/scenario_app_schema_fail_recover.json +48 -0
  632. package/dist/qa/brain_matrix/fixtures/scenario_approval_modal_no_redundancy.json +21 -0
  633. package/dist/qa/brain_matrix/fixtures/scenario_args_redacted_in_audit.json +17 -0
  634. package/dist/qa/brain_matrix/fixtures/scenario_audit_consumers_intent.json +19 -0
  635. package/dist/qa/brain_matrix/fixtures/scenario_audit_consumers_intent_en.json +19 -0
  636. package/dist/qa/brain_matrix/fixtures/scenario_audit_log_on_destructive.json +18 -0
  637. package/dist/qa/brain_matrix/fixtures/scenario_brain_explains_after_invoke.json +28 -0
  638. package/dist/qa/brain_matrix/fixtures/scenario_byok_on_managed_brain_overflow.json +28 -0
  639. package/dist/qa/brain_matrix/fixtures/scenario_byok_required_policy.json +35 -0
  640. package/dist/qa/brain_matrix/fixtures/scenario_coder_consults_nac_spec_before_writing.json +28 -0
  641. package/dist/qa/brain_matrix/fixtures/scenario_concise_no_loop.json +23 -0
  642. package/dist/qa/brain_matrix/fixtures/scenario_consult_nac_spec_intent.json +19 -0
  643. package/dist/qa/brain_matrix/fixtures/scenario_contradiction_rfp_cost.json +38 -0
  644. package/dist/qa/brain_matrix/fixtures/scenario_cost_router_attachment_frontier.json +24 -0
  645. package/dist/qa/brain_matrix/fixtures/scenario_cost_router_escalation_explicit.json +23 -0
  646. package/dist/qa/brain_matrix/fixtures/scenario_cost_router_idle_reset.json +24 -0
  647. package/dist/qa/brain_matrix/fixtures/scenario_csv_via_excel_read.json +22 -0
  648. package/dist/qa/brain_matrix/fixtures/scenario_default_design_system_override_shadcn.json +45 -0
  649. package/dist/qa/brain_matrix/fixtures/scenario_default_design_system_use_card_template.json +44 -0
  650. package/dist/qa/brain_matrix/fixtures/scenario_destructive_no_text_confirm.json +20 -0
  651. package/dist/qa/brain_matrix/fixtures/scenario_diff_explains_changes.json +32 -0
  652. package/dist/qa/brain_matrix/fixtures/scenario_director_delegates_to_analyst.json +26 -0
  653. package/dist/qa/brain_matrix/fixtures/scenario_director_no_self_delegation.json +20 -0
  654. package/dist/qa/brain_matrix/fixtures/scenario_director_terminal_done_marker.json +19 -0
  655. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_after_unknown_intent.json +17 -0
  656. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_a11y.json +24 -0
  657. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_agent_orchestrator.json +24 -0
  658. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_byok_vs_managed.json +24 -0
  659. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_cost_router.json +24 -0
  660. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_default_design_system.json +50 -0
  661. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_g_doc.json +24 -0
  662. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_gates.json +23 -0
  663. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_intent_en.json +19 -0
  664. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_language_sovereignty.json +53 -0
  665. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_lessons_workflow.json +24 -0
  666. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_mcp_lifecycle.json +24 -0
  667. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_nac3_attrs.json +24 -0
  668. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_office.json +24 -0
  669. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_pizarron.json +23 -0
  670. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_r8_modal.json +23 -0
  671. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_testing_policy.json +55 -0
  672. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_workflow.json +23 -0
  673. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_workflow_phases.json +24 -0
  674. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_yf_commands.json +24 -0
  675. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_explain_results.json +22 -0
  676. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_safety_refusals.json +22 -0
  677. package/dist/qa/brain_matrix/fixtures/scenario_doctrine_verb_composition.json +22 -0
  678. package/dist/qa/brain_matrix/fixtures/scenario_eco_defers_complex.json +17 -0
  679. package/dist/qa/brain_matrix/fixtures/scenario_eco_short_query.json +27 -0
  680. package/dist/qa/brain_matrix/fixtures/scenario_env_list_intent.json +20 -0
  681. package/dist/qa/brain_matrix/fixtures/scenario_env_list_intent_en.json +20 -0
  682. package/dist/qa/brain_matrix/fixtures/scenario_env_no_secret_leak.json +21 -0
  683. package/dist/qa/brain_matrix/fixtures/scenario_env_secret_suppression.json +35 -0
  684. package/dist/qa/brain_matrix/fixtures/scenario_env_secret_suppression_en.json +21 -0
  685. package/dist/qa/brain_matrix/fixtures/scenario_excel_append_handles_csv_refusal.json +28 -0
  686. package/dist/qa/brain_matrix/fixtures/scenario_excel_append_sheet_intent.json +20 -0
  687. package/dist/qa/brain_matrix/fixtures/scenario_excel_append_sheet_intent_en.json +20 -0
  688. package/dist/qa/brain_matrix/fixtures/scenario_excel_append_then_list.json +34 -0
  689. package/dist/qa/brain_matrix/fixtures/scenario_excel_list_sheets_first.json +22 -0
  690. package/dist/qa/brain_matrix/fixtures/scenario_excel_sheet_named.json +23 -0
  691. package/dist/qa/brain_matrix/fixtures/scenario_explain_voice_yes.json +22 -0
  692. package/dist/qa/brain_matrix/fixtures/scenario_explains_forge_error.json +39 -0
  693. package/dist/qa/brain_matrix/fixtures/scenario_focus_after_modal_open.json +29 -0
  694. package/dist/qa/brain_matrix/fixtures/scenario_fs_find_intent.json +21 -0
  695. package/dist/qa/brain_matrix/fixtures/scenario_fs_find_intent_en.json +20 -0
  696. package/dist/qa/brain_matrix/fixtures/scenario_fs_find_with_glob.json +22 -0
  697. package/dist/qa/brain_matrix/fixtures/scenario_fs_mkdir_intent.json +20 -0
  698. package/dist/qa/brain_matrix/fixtures/scenario_fs_move_intent.json +20 -0
  699. package/dist/qa/brain_matrix/fixtures/scenario_fs_read_handles_missing.json +28 -0
  700. package/dist/qa/brain_matrix/fixtures/scenario_fs_stat_before_read.json +22 -0
  701. package/dist/qa/brain_matrix/fixtures/scenario_generated_app_nac3_default.json +24 -0
  702. package/dist/qa/brain_matrix/fixtures/scenario_git_branch_list_intent.json +20 -0
  703. package/dist/qa/brain_matrix/fixtures/scenario_git_diff_intent.json +20 -0
  704. package/dist/qa/brain_matrix/fixtures/scenario_git_log_intent.json +20 -0
  705. package/dist/qa/brain_matrix/fixtures/scenario_git_log_intent_en.json +20 -0
  706. package/dist/qa/brain_matrix/fixtures/scenario_git_pull_intent.json +19 -0
  707. package/dist/qa/brain_matrix/fixtures/scenario_git_push_intent.json +20 -0
  708. package/dist/qa/brain_matrix/fixtures/scenario_git_show_metadata_only.json +22 -0
  709. package/dist/qa/brain_matrix/fixtures/scenario_git_status_branch_combo.json +44 -0
  710. package/dist/qa/brain_matrix/fixtures/scenario_git_status_intent.json +20 -0
  711. package/dist/qa/brain_matrix/fixtures/scenario_git_status_intent_en.json +20 -0
  712. package/dist/qa/brain_matrix/fixtures/scenario_github_clone_repo_intent.json +20 -0
  713. package/dist/qa/brain_matrix/fixtures/scenario_github_create_repo_intent.json +20 -0
  714. package/dist/qa/brain_matrix/fixtures/scenario_id_format_in_reply.json +27 -0
  715. package/dist/qa/brain_matrix/fixtures/scenario_iterations_idempotent_adenda.json +27 -0
  716. package/dist/qa/brain_matrix/fixtures/scenario_iterations_query_history.json +29 -0
  717. package/dist/qa/brain_matrix/fixtures/scenario_iterations_tracker_acknowledge.json +28 -0
  718. package/dist/qa/brain_matrix/fixtures/scenario_json_parse_handles_malformed.json +34 -0
  719. package/dist/qa/brain_matrix/fixtures/scenario_json_parse_intent.json +30 -0
  720. package/dist/qa/brain_matrix/fixtures/scenario_json_parse_intent_en.json +30 -0
  721. package/dist/qa/brain_matrix/fixtures/scenario_json_query_extract.json +23 -0
  722. package/dist/qa/brain_matrix/fixtures/scenario_json_stringify_intent.json +20 -0
  723. package/dist/qa/brain_matrix/fixtures/scenario_json_stringify_intent_en.json +20 -0
  724. package/dist/qa/brain_matrix/fixtures/scenario_keys_set_intent.json +20 -0
  725. package/dist/qa/brain_matrix/fixtures/scenario_keys_status_intent.json +20 -0
  726. package/dist/qa/brain_matrix/fixtures/scenario_keys_status_intent_en.json +20 -0
  727. package/dist/qa/brain_matrix/fixtures/scenario_language_sovereignty_not_conducive_spa_python.json +61 -0
  728. package/dist/qa/brain_matrix/fixtures/scenario_language_sovereignty_user_picks_python.json +48 -0
  729. package/dist/qa/brain_matrix/fixtures/scenario_lazy_complex_verb.json +27 -0
  730. package/dist/qa/brain_matrix/fixtures/scenario_lazy_doctrine_only_when_needed.json +17 -0
  731. package/dist/qa/brain_matrix/fixtures/scenario_lazy_simple_verb.json +21 -0
  732. package/dist/qa/brain_matrix/fixtures/scenario_lesson_recall_overrides.json +22 -0
  733. package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_restart_app_intent.json +19 -0
  734. package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_run_app_intent.json +19 -0
  735. package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_run_app_intent_en.json +19 -0
  736. package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_stop_app_intent.json +20 -0
  737. package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_stop_app_intent_en.json +20 -0
  738. package/dist/qa/brain_matrix/fixtures/scenario_long_doctrine_no_truncate.json +23 -0
  739. package/dist/qa/brain_matrix/fixtures/scenario_manifest_read_intent.json +19 -0
  740. package/dist/qa/brain_matrix/fixtures/scenario_manual_open_intent.json +19 -0
  741. package/dist/qa/brain_matrix/fixtures/scenario_mcp_bridge_unreachable_graceful.json +39 -0
  742. package/dist/qa/brain_matrix/fixtures/scenario_mcp_disabled_bridge_no_verbs.json +18 -0
  743. package/dist/qa/brain_matrix/fixtures/scenario_mcp_discover_tools_intent.json +19 -0
  744. package/dist/qa/brain_matrix/fixtures/scenario_mcp_invariant_1_no_verbs.json +19 -0
  745. package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_destructive_pauses_for_r8.json +42 -0
  746. package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_happy_path_writes_pizarron.json +76 -0
  747. package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_network_timeout_graceful.json +41 -0
  748. package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_two_hop.json +68 -0
  749. package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_with_auth_loaded.json +76 -0
  750. package/dist/qa/brain_matrix/fixtures/scenario_mcp_revoked_token_graceful.json +33 -0
  751. package/dist/qa/brain_matrix/fixtures/scenario_mcp_set_creds_intent.json +21 -0
  752. package/dist/qa/brain_matrix/fixtures/scenario_mcp_set_creds_no_token_arg.json +27 -0
  753. package/dist/qa/brain_matrix/fixtures/scenario_mcp_show_tools_before_invoke.json +44 -0
  754. package/dist/qa/brain_matrix/fixtures/scenario_mcp_toggle_intent.json +20 -0
  755. package/dist/qa/brain_matrix/fixtures/scenario_multi_turn_clarify_then_act.json +24 -0
  756. package/dist/qa/brain_matrix/fixtures/scenario_nac3_attrs_doctrine.json +53 -0
  757. package/dist/qa/brain_matrix/fixtures/scenario_nac3_discover_schemas_intent.json +19 -0
  758. package/dist/qa/brain_matrix/fixtures/scenario_nac3_required_attr_missing.json +19 -0
  759. package/dist/qa/brain_matrix/fixtures/scenario_no_bare_ok_after_destructive.json +27 -0
  760. package/dist/qa/brain_matrix/fixtures/scenario_no_global_learnings_no_recall.json +20 -0
  761. package/dist/qa/brain_matrix/fixtures/scenario_no_hardcoded_color_use_token.json +47 -0
  762. package/dist/qa/brain_matrix/fixtures/scenario_no_id_leak_in_reply.json +24 -0
  763. package/dist/qa/brain_matrix/fixtures/scenario_no_invent_verb.json +18 -0
  764. package/dist/qa/brain_matrix/fixtures/scenario_no_loop_after_repeated_fail.json +42 -0
  765. package/dist/qa/brain_matrix/fixtures/scenario_no_password_echo.json +28 -0
  766. package/dist/qa/brain_matrix/fixtures/scenario_npm_outdated_all_current.json +28 -0
  767. package/dist/qa/brain_matrix/fixtures/scenario_npm_outdated_intent.json +20 -0
  768. package/dist/qa/brain_matrix/fixtures/scenario_npm_outdated_intent_en.json +20 -0
  769. package/dist/qa/brain_matrix/fixtures/scenario_npm_outdated_then_explain.json +35 -0
  770. package/dist/qa/brain_matrix/fixtures/scenario_office_excel_read_intent.json +24 -0
  771. package/dist/qa/brain_matrix/fixtures/scenario_office_excel_update_cell_picks_right_verb.json +26 -0
  772. package/dist/qa/brain_matrix/fixtures/scenario_office_excel_write_required_args.json +23 -0
  773. package/dist/qa/brain_matrix/fixtures/scenario_office_overwrite_explicit.json +23 -0
  774. package/dist/qa/brain_matrix/fixtures/scenario_office_word_write_intent.json +27 -0
  775. package/dist/qa/brain_matrix/fixtures/scenario_panel_open_settings_intent.json +19 -0
  776. package/dist/qa/brain_matrix/fixtures/scenario_panel_send_message_intent.json +19 -0
  777. package/dist/qa/brain_matrix/fixtures/scenario_pdf_read_intent.json +22 -0
  778. package/dist/qa/brain_matrix/fixtures/scenario_pizarron_clear_tab_explicit_close.json +17 -0
  779. package/dist/qa/brain_matrix/fixtures/scenario_pizarron_for_chart.json +30 -0
  780. package/dist/qa/brain_matrix/fixtures/scenario_pizarron_for_long_table.json +28 -0
  781. package/dist/qa/brain_matrix/fixtures/scenario_pizarron_read_tab_intent.json +20 -0
  782. package/dist/qa/brain_matrix/fixtures/scenario_pizarron_render_not_inline.json +20 -0
  783. package/dist/qa/brain_matrix/fixtures/scenario_prefer_native_read_file.json +28 -0
  784. package/dist/qa/brain_matrix/fixtures/scenario_prefer_native_verb_over_shell.json +22 -0
  785. package/dist/qa/brain_matrix/fixtures/scenario_prefer_native_workflow_state.json +28 -0
  786. package/dist/qa/brain_matrix/fixtures/scenario_project_init_intent.json +20 -0
  787. package/dist/qa/brain_matrix/fixtures/scenario_project_set_root_intent.json +20 -0
  788. package/dist/qa/brain_matrix/fixtures/scenario_promote_lesson_after_correction.json +17 -0
  789. package/dist/qa/brain_matrix/fixtures/scenario_r8_destructive_shell_exec.json +21 -0
  790. package/dist/qa/brain_matrix/fixtures/scenario_read_then_parse_order.json +36 -0
  791. package/dist/qa/brain_matrix/fixtures/scenario_reader_bookmark_jump_intent.json +19 -0
  792. package/dist/qa/brain_matrix/fixtures/scenario_reader_bookmark_set_intent.json +19 -0
  793. package/dist/qa/brain_matrix/fixtures/scenario_reader_for_long_doc.json +21 -0
  794. package/dist/qa/brain_matrix/fixtures/scenario_reader_list_docs_intent.json +19 -0
  795. package/dist/qa/brain_matrix/fixtures/scenario_reader_next_block_intent.json +19 -0
  796. package/dist/qa/brain_matrix/fixtures/scenario_reader_read_section_intent.json +19 -0
  797. package/dist/qa/brain_matrix/fixtures/scenario_reader_recap_intent.json +19 -0
  798. package/dist/qa/brain_matrix/fixtures/scenario_reader_search_intent.json +20 -0
  799. package/dist/qa/brain_matrix/fixtures/scenario_reader_search_intent_en.json +20 -0
  800. package/dist/qa/brain_matrix/fixtures/scenario_refuses_blanket_chmod_777.json +17 -0
  801. package/dist/qa/brain_matrix/fixtures/scenario_refuses_bypass_approval_modal.json +18 -0
  802. package/dist/qa/brain_matrix/fixtures/scenario_refuses_delete_critical_en.json +18 -0
  803. package/dist/qa/brain_matrix/fixtures/scenario_refuses_disable_vault_encryption.json +18 -0
  804. package/dist/qa/brain_matrix/fixtures/scenario_refuses_drop_database.json +17 -0
  805. package/dist/qa/brain_matrix/fixtures/scenario_refuses_force_push_main.json +17 -0
  806. package/dist/qa/brain_matrix/fixtures/scenario_refuses_force_push_main_en.json +17 -0
  807. package/dist/qa/brain_matrix/fixtures/scenario_refuses_leak_vault_en.json +18 -0
  808. package/dist/qa/brain_matrix/fixtures/scenario_refuses_modify_node_modules.json +17 -0
  809. package/dist/qa/brain_matrix/fixtures/scenario_refuses_skip_hooks.json +17 -0
  810. package/dist/qa/brain_matrix/fixtures/scenario_refuses_skip_hooks_en.json +17 -0
  811. package/dist/qa/brain_matrix/fixtures/scenario_refuses_to_delete_critical.json +18 -0
  812. package/dist/qa/brain_matrix/fixtures/scenario_refuses_to_leak_vault.json +18 -0
  813. package/dist/qa/brain_matrix/fixtures/scenario_respects_global_learnings.json +28 -0
  814. package/dist/qa/brain_matrix/fixtures/scenario_respects_workflow_gate_g2.json +39 -0
  815. package/dist/qa/brain_matrix/fixtures/scenario_revoke_lesson_request.json +21 -0
  816. package/dist/qa/brain_matrix/fixtures/scenario_scaffolder_destructive_pauses_for_approval.json +23 -0
  817. package/dist/qa/brain_matrix/fixtures/scenario_sq9b_deploy_checks_git_status.json +25 -0
  818. package/dist/qa/brain_matrix/fixtures/scenario_sq9b_install_checks_node_version.json +25 -0
  819. package/dist/qa/brain_matrix/fixtures/scenario_sq9b_publish_checks_gh_cli.json +25 -0
  820. package/dist/qa/brain_matrix/fixtures/scenario_sq_rules_active.json +30 -0
  821. package/dist/qa/brain_matrix/fixtures/scenario_sumie_icon_pick_from_catalog.json +56 -0
  822. package/dist/qa/brain_matrix/fixtures/scenario_tester_uses_shell_exec_only.json +27 -0
  823. package/dist/qa/brain_matrix/fixtures/scenario_text_diff_intent.json +20 -0
  824. package/dist/qa/brain_matrix/fixtures/scenario_text_diff_intent_en.json +20 -0
  825. package/dist/qa/brain_matrix/fixtures/scenario_truncated_response_retry.json +22 -0
  826. package/dist/qa/brain_matrix/fixtures/scenario_unknown_command_clarify.json +23 -0
  827. package/dist/qa/brain_matrix/fixtures/scenario_url_parse_compose.json +23 -0
  828. package/dist/qa/brain_matrix/fixtures/scenario_url_parse_handles_invalid.json +27 -0
  829. package/dist/qa/brain_matrix/fixtures/scenario_url_parse_intent.json +20 -0
  830. package/dist/qa/brain_matrix/fixtures/scenario_url_parse_intent_en.json +20 -0
  831. package/dist/qa/brain_matrix/fixtures/scenario_url_parse_then_inspect_query.json +28 -0
  832. package/dist/qa/brain_matrix/fixtures/scenario_url_then_stringify_order.json +34 -0
  833. package/dist/qa/brain_matrix/fixtures/scenario_user_just_greets.json +17 -0
  834. package/dist/qa/brain_matrix/fixtures/scenario_user_overrides_proceeds.json +24 -0
  835. package/dist/qa/brain_matrix/fixtures/scenario_user_revokes_in_middle.json +22 -0
  836. package/dist/qa/brain_matrix/fixtures/scenario_voice_open_pizarron.json +21 -0
  837. package/dist/qa/brain_matrix/fixtures/scenario_word_outline_extraction.json +22 -0
  838. package/dist/qa/brain_matrix/fixtures/scenario_word_overwrite_explicit.json +20 -0
  839. package/dist/qa/brain_matrix/fixtures/scenario_word_section_count.json +28 -0
  840. package/dist/qa/brain_matrix/fixtures/scenario_workflow_doctrine.json +53 -0
  841. package/dist/qa/brain_matrix/fixtures/scenario_workflow_done_specs.json +32 -0
  842. package/dist/qa/brain_matrix/fixtures/scenario_workflow_intent_capture.json +22 -0
  843. package/dist/qa/brain_matrix/fixtures/scenario_workflow_phase_jump_block.json +26 -0
  844. package/dist/qa/brain_matrix/fixtures/scenario_workflow_phase_v_step_15.json +41 -0
  845. package/dist/qa/brain_matrix/fixtures/scenario_workflow_run_step_intent.json +19 -0
  846. package/dist/qa/brain_matrix/fixtures/scenario_workflow_set_intent.json +20 -0
  847. package/dist/qa/brain_matrix/fixtures/scenario_workflow_state_injection.json +32 -0
  848. package/dist/qa/brain_matrix/fixtures/scenario_workflow_state_recovers_after_clarify.json +25 -0
  849. package/dist/qa/brain_matrix/fixtures/scenario_workflow_step_1_intake.json +24 -0
  850. package/dist/qa/brain_matrix/fixtures/scenario_yf_command_doctrine.json +56 -0
  851. package/dist/qa/brain_matrix/fixtures/scenario_yf_doctrine_list_intent.json +19 -0
  852. package/dist/qa/brain_matrix/fixtures/scenario_yf_qa_compare_intent.json +17 -0
  853. package/dist/qa/brain_matrix/invariants.d.ts +18 -0
  854. package/dist/qa/brain_matrix/invariants.d.ts.map +1 -0
  855. package/dist/qa/brain_matrix/invariants.js +333 -0
  856. package/dist/qa/brain_matrix/invariants.js.map +1 -0
  857. package/dist/qa/brain_matrix/report.d.ts +12 -0
  858. package/dist/qa/brain_matrix/report.d.ts.map +1 -0
  859. package/dist/qa/brain_matrix/report.js +131 -0
  860. package/dist/qa/brain_matrix/report.js.map +1 -0
  861. package/dist/qa/brain_matrix/runner.d.ts +31 -0
  862. package/dist/qa/brain_matrix/runner.d.ts.map +1 -0
  863. package/dist/qa/brain_matrix/runner.js +561 -0
  864. package/dist/qa/brain_matrix/runner.js.map +1 -0
  865. package/dist/qa/brain_matrix/types.d.ts +180 -0
  866. package/dist/qa/brain_matrix/types.d.ts.map +1 -0
  867. package/dist/qa/brain_matrix/types.js +2 -0
  868. package/dist/qa/brain_matrix/types.js.map +1 -0
  869. package/dist/qa/brain_matrix/validate_scenario.d.ts +23 -0
  870. package/dist/qa/brain_matrix/validate_scenario.d.ts.map +1 -0
  871. package/dist/qa/brain_matrix/validate_scenario.js +128 -0
  872. package/dist/qa/brain_matrix/validate_scenario.js.map +1 -0
  873. package/dist/semantic_graph/ast_extract.d.ts +15 -0
  874. package/dist/semantic_graph/ast_extract.d.ts.map +1 -0
  875. package/dist/semantic_graph/ast_extract.js +162 -0
  876. package/dist/semantic_graph/ast_extract.js.map +1 -0
  877. package/dist/semantic_graph/derive.d.ts +36 -0
  878. package/dist/semantic_graph/derive.d.ts.map +1 -0
  879. package/dist/semantic_graph/derive.js +285 -0
  880. package/dist/semantic_graph/derive.js.map +1 -0
  881. package/dist/semantic_graph/llm_claim.d.ts +21 -0
  882. package/dist/semantic_graph/llm_claim.d.ts.map +1 -0
  883. package/dist/semantic_graph/llm_claim.js +164 -0
  884. package/dist/semantic_graph/llm_claim.js.map +1 -0
  885. package/dist/semantic_graph/npm_enrich.d.ts +49 -0
  886. package/dist/semantic_graph/npm_enrich.d.ts.map +1 -0
  887. package/dist/semantic_graph/npm_enrich.js +173 -0
  888. package/dist/semantic_graph/npm_enrich.js.map +1 -0
  889. package/dist/semantic_graph/render.d.ts +28 -0
  890. package/dist/semantic_graph/render.d.ts.map +1 -0
  891. package/dist/semantic_graph/render.js +70 -0
  892. package/dist/semantic_graph/render.js.map +1 -0
  893. package/dist/semantic_graph/store.d.ts +44 -0
  894. package/dist/semantic_graph/store.d.ts.map +1 -0
  895. package/dist/semantic_graph/store.js +360 -0
  896. package/dist/semantic_graph/store.js.map +1 -0
  897. package/dist/semantic_graph/types.d.ts +59 -0
  898. package/dist/semantic_graph/types.d.ts.map +1 -0
  899. package/dist/semantic_graph/types.js +17 -0
  900. package/dist/semantic_graph/types.js.map +1 -0
  901. package/dist/support/github_dispatcher.d.ts +36 -0
  902. package/dist/support/github_dispatcher.d.ts.map +1 -0
  903. package/dist/support/github_dispatcher.js +292 -0
  904. package/dist/support/github_dispatcher.js.map +1 -0
  905. package/dist/support/reports.d.ts +31 -0
  906. package/dist/support/reports.d.ts.map +1 -0
  907. package/dist/support/reports.js +162 -0
  908. package/dist/support/reports.js.map +1 -0
  909. package/dist/telemetry/usage.d.ts +67 -0
  910. package/dist/telemetry/usage.d.ts.map +1 -0
  911. package/dist/telemetry/usage.js +208 -0
  912. package/dist/telemetry/usage.js.map +1 -0
  913. package/dist/test_agent/gemini_user.d.ts +9 -0
  914. package/dist/test_agent/gemini_user.d.ts.map +1 -0
  915. package/dist/test_agent/gemini_user.js +58 -0
  916. package/dist/test_agent/gemini_user.js.map +1 -0
  917. package/dist/test_agent/profiles.d.ts +23 -0
  918. package/dist/test_agent/profiles.d.ts.map +1 -0
  919. package/dist/test_agent/profiles.js +117 -0
  920. package/dist/test_agent/profiles.js.map +1 -0
  921. package/dist/test_agent/runner.d.ts +56 -0
  922. package/dist/test_agent/runner.d.ts.map +1 -0
  923. package/dist/test_agent/runner.js +134 -0
  924. package/dist/test_agent/runner.js.map +1 -0
  925. package/dist/test_agent/target_http.d.ts +22 -0
  926. package/dist/test_agent/target_http.d.ts.map +1 -0
  927. package/dist/test_agent/target_http.js +51 -0
  928. package/dist/test_agent/target_http.js.map +1 -0
  929. package/dist/test_agent/types.d.ts +117 -0
  930. package/dist/test_agent/types.d.ts.map +1 -0
  931. package/dist/test_agent/types.js +22 -0
  932. package/dist/test_agent/types.js.map +1 -0
  933. package/dist/vault/store.d.ts.map +1 -1
  934. package/dist/vault/store.js +14 -1
  935. package/dist/vault/store.js.map +1 -1
  936. package/dist/version.d.ts +1 -1
  937. package/dist/version.d.ts.map +1 -1
  938. package/dist/version.js +1 -1
  939. package/dist/version.js.map +1 -1
  940. package/dist/voice/config.d.ts +12 -0
  941. package/dist/voice/config.d.ts.map +1 -1
  942. package/dist/voice/config.js +25 -2
  943. package/dist/voice/config.js.map +1 -1
  944. package/dist/voice/providers/google.d.ts +9 -0
  945. package/dist/voice/providers/google.d.ts.map +1 -1
  946. package/dist/voice/providers/google.js +152 -26
  947. package/dist/voice/providers/google.js.map +1 -1
  948. package/dist/voice/router.d.ts +10 -0
  949. package/dist/voice/router.d.ts.map +1 -1
  950. package/dist/voice/router.js +39 -20
  951. package/dist/voice/router.js.map +1 -1
  952. package/dist/voice/types.d.ts +5 -2
  953. package/dist/voice/types.d.ts.map +1 -1
  954. package/dist/voice/types.js.map +1 -1
  955. package/dist/wiring/discover.d.ts +14 -0
  956. package/dist/wiring/discover.d.ts.map +1 -0
  957. package/dist/wiring/discover.js +383 -0
  958. package/dist/wiring/discover.js.map +1 -0
  959. package/dist/wiring/store.d.ts +19 -0
  960. package/dist/wiring/store.d.ts.map +1 -0
  961. package/dist/wiring/store.js +182 -0
  962. package/dist/wiring/store.js.map +1 -0
  963. package/dist/wiring/types.d.ts +61 -0
  964. package/dist/wiring/types.d.ts.map +1 -0
  965. package/dist/wiring/types.js +36 -0
  966. package/dist/wiring/types.js.map +1 -0
  967. package/dist/workflow/definitions.d.ts +60 -0
  968. package/dist/workflow/definitions.d.ts.map +1 -0
  969. package/dist/workflow/definitions.js +178 -0
  970. package/dist/workflow/definitions.js.map +1 -0
  971. package/dist/workflow/definitions_client.d.ts +12 -0
  972. package/dist/workflow/definitions_client.d.ts.map +1 -0
  973. package/dist/workflow/definitions_client.js +81 -0
  974. package/dist/workflow/definitions_client.js.map +1 -0
  975. package/dist/workflow/evolution.d.ts +10 -0
  976. package/dist/workflow/evolution.d.ts.map +1 -0
  977. package/dist/workflow/evolution.js +62 -0
  978. package/dist/workflow/evolution.js.map +1 -0
  979. package/dist/workflow/graph.d.ts +59 -0
  980. package/dist/workflow/graph.d.ts.map +1 -0
  981. package/dist/workflow/graph.js +137 -0
  982. package/dist/workflow/graph.js.map +1 -0
  983. package/dist/workflow/phase_inference.d.ts +56 -0
  984. package/dist/workflow/phase_inference.d.ts.map +1 -0
  985. package/dist/workflow/phase_inference.js +107 -0
  986. package/dist/workflow/phase_inference.js.map +1 -0
  987. package/dist/workflow/select.d.ts +28 -0
  988. package/dist/workflow/select.d.ts.map +1 -0
  989. package/dist/workflow/select.js +38 -0
  990. package/dist/workflow/select.js.map +1 -0
  991. package/dist/workflow/state.d.ts +290 -0
  992. package/dist/workflow/state.d.ts.map +1 -0
  993. package/dist/workflow/state.js +213 -0
  994. package/dist/workflow/state.js.map +1 -0
  995. package/dist/workflow/view.d.ts +47 -0
  996. package/dist/workflow/view.d.ts.map +1 -0
  997. package/dist/workflow/view.js +103 -0
  998. package/dist/workflow/view.js.map +1 -0
  999. package/docs/SQ.md +1397 -0
  1000. package/docs/SQ_BY_STEP.yaml +147 -0
  1001. package/docs/doctrine/accessibility.md +78 -0
  1002. package/docs/doctrine/agent-orchestrator.md +76 -0
  1003. package/docs/doctrine/byok-vs-managed.md +81 -0
  1004. package/docs/doctrine/cost-router-escalation.md +103 -0
  1005. package/docs/doctrine/default-design-system.md +120 -0
  1006. package/docs/doctrine/explain-results.md +90 -0
  1007. package/docs/doctrine/expo-eas-builds.md +177 -0
  1008. package/docs/doctrine/g-doc.md +46 -0
  1009. package/docs/doctrine/gates.md +21 -0
  1010. package/docs/doctrine/language-sovereignty.md +143 -0
  1011. package/docs/doctrine/lessons-workflow.md +68 -0
  1012. package/docs/doctrine/mcp-bridge-lifecycle.md +75 -0
  1013. package/docs/doctrine/nac3-attrs.md +23 -0
  1014. package/docs/doctrine/office-tools.md +102 -0
  1015. package/docs/doctrine/pizarron.md +52 -0
  1016. package/docs/doctrine/r8-modal.md +60 -0
  1017. package/docs/doctrine/safety-refusals.md +73 -0
  1018. package/docs/doctrine/testing-policy.md +211 -0
  1019. package/docs/doctrine/verb-composition.md +68 -0
  1020. package/docs/doctrine/verification-honesty.md +95 -0
  1021. package/docs/doctrine/workflow-kinds.md +52 -0
  1022. package/docs/doctrine/workflow-phases.md +108 -0
  1023. package/docs/doctrine/workflow.md +58 -0
  1024. package/docs/doctrine/yf-commands.md +49 -0
  1025. package/package.json +19 -3
  1026. package/src/i18n/catalogs/ar.json +134 -10
  1027. package/src/i18n/catalogs/de.json +134 -10
  1028. package/src/i18n/catalogs/en.json +134 -10
  1029. package/src/i18n/catalogs/es.json +134 -10
  1030. package/src/i18n/catalogs/fr.json +134 -10
  1031. package/src/i18n/catalogs/hi.json +134 -10
  1032. package/src/i18n/catalogs/it.json +134 -10
  1033. package/src/i18n/catalogs/ja.json +134 -10
  1034. package/src/i18n/catalogs/pt.json +134 -10
  1035. package/src/i18n/catalogs/zh.json +134 -10
  1036. package/templates/nextjs-app/README.md +48 -0
  1037. package/templates/nextjs-app/next.config.js +8 -0
  1038. package/templates/nextjs-app/package.json +33 -0
  1039. package/templates/nextjs-app/src/app/globals.css +43 -0
  1040. package/templates/nextjs-app/src/app/layout.tsx +29 -0
  1041. package/templates/nextjs-app/src/app/page.tsx +63 -0
  1042. package/templates/nextjs-app/src/nac/manifest.ts +36 -0
  1043. package/templates/nextjs-app/tsconfig.json +21 -0
  1044. package/templates/nextjs-app/yujin.forge.json +11 -0
  1045. package/templates/sumi-context.template.md +57 -0
package/docs/SQ.md ADDED
@@ -0,0 +1,1397 @@
1
+ # Yujin Forge -- Estandares de Calidad (SQ)
2
+
3
+ > **Lectura obligatoria antes de tocar codigo en cualquier
4
+ > proyecto Yujin.** Aplica a Sumi (Claude assistant), a
5
+ > cualquier colaborador humano, y a cualquier herramienta
6
+ > automatizada del pipeline. La violacion de cualquier seccion
7
+ > es bug critico, no preferencia.
8
+
9
+ > Este documento consolida las normas de calidad y entregables
10
+ > de Yujin Forge. Se sintetiza con `PROJECT.md` (gobernanza +
11
+ > topologia). En caso de conflicto, **este documento prevalece
12
+ > sobre cualquier otra preferencia de estilo o conveniencia**.
13
+
14
+ > Ultima revision: 2026-05-25 (post-bug SyntaxError del panel +
15
+ > incorporacion de la regla Pablo-time + agregado de
16
+ > volumetrias + stateless + 4 manuales obligatorios).
17
+
18
+ ---
19
+
20
+ ## 0. Principios fundamentales
21
+
22
+ ### 0.1 El tiempo de Pablo es para juicio, no para reproducir bugs
23
+
24
+ Los humanos tienen tiempo de vida finito. Spending Pablo's
25
+ hours on basic bugs (syntax errors, broken buttons, 404s,
26
+ missing imports, modals que no abren, files que no cargan,
27
+ console errors al cargar) es un debito permanente contra su
28
+ budget de vida. **No es recuperable.**
29
+
30
+ Sumi y CI cazan los bugs basicos ANTES de que Pablo los vea.
31
+ Cuando Pablo evalua, evalua decisiones de **alta complejidad
32
+ funcional**: "esta voz suena bien para el usuario ADIP?",
33
+ "esta extraccion perdio contexto?", "este flujo UX se siente
34
+ intuitivo?", "el aleman lee rigido?". Esas son preguntas que
35
+ solo el puede contestar. Para esas estan las horas de Pablo,
36
+ no para clickear botones que tendrian que andar.
37
+
38
+ **Esta es la regla mas importante del documento.** Todo lo
39
+ demas se deriva de ella.
40
+
41
+ ### 0.2 Cero fallback al codigo legacy del mismo sistema
42
+
43
+ Si el codigo primario falla, se ARREGLA. **No** se desvia al
44
+ renderer / handler / rutina obsoleta del mismo sistema. El
45
+ patron `if (newFn) {...} else { legacyFn() }` esta prohibido
46
+ cuando ambas vias pertenecen al mismo codebase.
47
+
48
+ Fallback **legitimo** (NO bloqueado por esta regla):
49
+ - Multi-region failover (us-east-1 → eu-west-1).
50
+ - Multi-provider (SES → SendGrid, Anthropic Claude → Bedrock
51
+ cuando rate-limited).
52
+ - Schema gates idempotentes (table missing → skip silencioso
53
+ con warning + return).
54
+ - Cache miss (APCu vacio → DB query).
55
+ - Locale i18n (es missing → en → first available).
56
+
57
+ Cualquier otro fallback es regression disfrazada.
58
+
59
+ ### 0.3 Cero dano silencioso
60
+
61
+ Cuando el sistema no puede satisfacer un request (ambiguo, no
62
+ encontrado, bloqueado, gate fallo), **debe** throw o devolver
63
+ `is_error: true` con un mensaje estructurado nombrando el
64
+ remedio. **NO** debe adivinar + degradar + esperar.
65
+
66
+ ### 0.4 Calidad industrial
67
+
68
+ Naming claro. Errores estructurados. Provenance emitida (trace
69
+ en pizarra para chat tools, audit log para acciones en DB).
70
+ Docs sincronizadas. Nada hardcoded que pertenezca a un catalogo.
71
+ Nada que un reviewer pueda llamar atajo.
72
+
73
+ ### 0.5 Agnostico por default
74
+
75
+ Los layers del sistema saben de primitivas (formatos de
76
+ documento, providers de voz, tool_use de Claude, file
77
+ scaffolding, schemas de manifest NAC3). Saben **nada** de
78
+ ninguna app especifica. Logica especifica de aplicacion vive
79
+ en templates, manifests, plugins, decorators — nunca en el
80
+ runtime.
81
+
82
+ ### 0.6 Definicion de "proyecto Yujin"
83
+
84
+ **Un proyecto Yujin es CUALQUIER codebase tocado por Forge**,
85
+ en cualquiera de estas dos modalidades:
86
+
87
+ 1. **Proyectos nuevos** creados por Forge:
88
+ - `yf new <slug>` -- scaffold inicial desde template.
89
+ - `yf migrate ... --ai-silent` que produce un decorated output.
90
+ - Scaffold generado por el spec ingest pipeline
91
+ (bloque 4.5: drag-drop spec -> Claude extract -> plan ->
92
+ approve -> escribir archivos).
93
+ - Cualquier proyecto que arranque su vida desde Forge.
94
+
95
+ 2. **Proyectos existentes** modificados por Forge:
96
+ - `yf migrate <existing-repo>` con o sin `--apply`.
97
+ - File edits via chat panel + tool dispatches
98
+ (forge.git_commit, forge.run_app, etc).
99
+ - Decoration que Forge inyecta en una app pre-existente.
100
+ - Cualquier commit que tenga "Co-Authored-By: Forge" o
101
+ equivalente.
102
+
103
+ **No hay opt-out.** Si Forge toco el proyecto, **el proyecto
104
+ es Yujin y queda sujeto a este SQ**.
105
+
106
+ Esto vale tanto para apps propias (CRM Yujin, conduit,
107
+ yujin.app) como para apps de adopters (ADIP, third-party).
108
+ Si quieren que Forge ayude, aceptan el SQ.
109
+
110
+ ### 0.7 Componentes obligatorios en TODO proyecto Yujin
111
+
112
+ Todo proyecto Yujin (segun sec 0.6) **debe** incluir:
113
+
114
+ 1. **NAC-3 decoration** al nivel apropiado para el target
115
+ (HTML estatico, React app, Vue app, Vanilla JS). Cada
116
+ elemento interactivo carga `data-nac-id` + `data-nac-role`
117
+ + `data-nac-action` segun el contrato NAC-3.
118
+
119
+ 2. **Yujin Pilot embebido -- OBLIGATORIO**, no opcional.
120
+ Pilot es el chat + voice cockpit multi-modelo que drives
121
+ la app desde lenguaje natural. La razon de la
122
+ obligatoriedad:
123
+
124
+ - Sin Pilot, el end-user no tiene como hablarle a la app
125
+ decorada con NAC-3 -- los hooks existen pero nadie los
126
+ invoca.
127
+ - Pilot es lo que convierte "una app decorada" en "una
128
+ app Yujin" desde el punto de vista del usuario final.
129
+ - Pilot impone una experiencia consistente cross-product
130
+ (mismo modal, mismas opciones de provider, misma
131
+ pizarra de trace).
132
+ - Pilot es la unica via reconocida para inyectar la
133
+ dispatcher de NAC-3 disambiguation con el modelo cheap-
134
+ fast (ver memoria `nac3-disambiguation-model-split`).
135
+
136
+ No se acepta "el cliente no quiere Pilot". Si el cliente
137
+ no quiere Pilot, no es proyecto Yujin -- Forge no lo
138
+ toca. Esa conversacion va a Pablo, no al desarrollador
139
+ que arma el proyecto.
140
+
141
+ La inyeccion de Pilot la hace `yf migrate --with-pilot`
142
+ automaticamente, o `yf pilot install <dir>` explicito.
143
+ El test de aceptacion del proyecto verifica que Pilot
144
+ carga + dispatch llega + provider keys persisten
145
+ (cubierto por la suite visual del proyecto, sec 2.2).
146
+
147
+ 3. **10 idiomas canonicos NAC3** en strings user-facing
148
+ (ver sec 2.6).
149
+
150
+ 4. **Los 4 manuales** del sec 3 (INFRASTRUCTURE,
151
+ ARCHITECTURE, USER_MANUAL, MAINTENANCE_MANUAL).
152
+
153
+ 5. **Tests de cobertura visual al 100%** (sec 2.2).
154
+
155
+ 6. **Pre-development checklist completo** (sec 4) antes de
156
+ cualquier modificacion.
157
+
158
+ La ausencia de cualquiera de estos 6 componentes es bug
159
+ critico del proyecto, no preferencia. Forge debe negarse a
160
+ shipping un proyecto Yujin con componentes faltantes.
161
+
162
+ ### 0.8 Dual mode de comunicacion: didactico vs tecnico
163
+
164
+ Forge expone sus consultas, ronda de clarificacion y
165
+ resultados en **dos modos**, configurables por proyecto y
166
+ cambiables en runtime:
167
+
168
+ **(a) Modo didactico (default para usuarios no-dev):**
169
+
170
+ - Exposicion **minima** de datos tecnicos (no stack traces,
171
+ no nombres de archivos / lineas, no jerga JS / SQL).
172
+ - **Mayor autonomia**: Forge decide los detalles tecnicos
173
+ internos por su cuenta y solo consulta al usuario lo
174
+ estrictamente necesario para entender que quiere lograr.
175
+ - Consultas siempre en lenguaje natural orientado a
176
+ resultados ("cuantos usuarios al mismo tiempo?", no
177
+ "concurrent connections cap?").
178
+ - Mensajes de progreso: "ya generamos el formulario de
179
+ registro", no "wrote `app/register.tsx` (42 lines)".
180
+ - Errores presentados como acciones: "no pude leer este PDF.
181
+ Probemos con otro archivo?", no "ParseError at line 87".
182
+
183
+ **(b) Modo tecnico (para programadores avanzados):**
184
+
185
+ - Exposicion **completa**: archivos tocados, lineas
186
+ modificadas, tool calls disparados, latencias, tokens, etc.
187
+ - **Involucra al usuario** en las decisiones tecnicas:
188
+ "elegimos Postgres o SQLite para este target? Costos vs
189
+ portabilidad..."
190
+ - Surface diffs antes de aplicar; pide confirmacion para
191
+ cambios irreversibles.
192
+ - Stack traces visibles; errores con error_id + request_id.
193
+ - Mensajes de progreso con metadata: "scaffolded
194
+ `app/register.tsx`, 42 lines, 3 components".
195
+
196
+ **Activacion:**
197
+
198
+ 1. Per-proyecto: `yujin.forge.json` lleva `"mode":
199
+ "didactico" | "tecnico"`. Default: `"didactico"`.
200
+ 2. Runtime via chat: comando `/modo didactico` o
201
+ `/modo tecnico` (alias EN: `/mode didactic`,
202
+ `/mode technical`). Se persiste en `yujin.forge.json`.
203
+ 3. Runtime via CLI: `yf chat --mode didactico|tecnico` o
204
+ variable de entorno `YF_MODE=tecnico`.
205
+
206
+ **Contrato:** ambos modos respetan la misma arquitectura
207
+ (stateless, multi-tenant, etc). El cambio de modo afecta
208
+ **solo la capa de presentacion + el nivel de consulta**, no
209
+ los outputs funcionales.
210
+
211
+ **Implementacion (referencia):** el server inyecta `mode` en
212
+ el system prompt del LLM + el panel UI consulta `mode` para
213
+ decidir si renderiza diffs / stack traces / tool latencias.
214
+ Cambiar el modo NO requiere recargar -- el siguiente turno
215
+ ya usa el modo nuevo.
216
+
217
+ ### 0.9 Test Playwright -- aprobacion visual explicita
218
+
219
+ El test visual de un proyecto Yujin debe **mostrar todas las
220
+ pantallas aplicativas al usuario** y exigir su OK explicito
221
+ o registro de pedidos de modificacion. No es suficiente que
222
+ los tests pasen verdes en CI; el usuario tiene que **ver**
223
+ cada pantalla.
224
+
225
+ Flujo obligatorio:
226
+
227
+ 1. La suite Playwright captura screenshot de **cada pantalla
228
+ aplicativa** del proyecto (entry, hub, list views, detail
229
+ views, modals, forms, error states) bajo
230
+ `tests/visual/evidence/<scenario>/<lang>/<browser>.png`.
231
+
232
+ 2. Forge expone un comando `yf review-screens` que renderiza
233
+ una galeria local con todas las screenshots organizadas
234
+ por flow + idioma + breakpoint. El usuario navega y marca
235
+ cada una con:
236
+ - **OK explicito** (verde) - se promueve a baseline.
237
+ - **Pedido de modificacion** (rojo) - se registra el
238
+ comentario; Forge abre un issue / task para el ajuste.
239
+ - **No revisado** (amarillo) - bloquea release.
240
+
241
+ 3. **Gate**: no hay release si quedan screenshots "no
242
+ revisadas" o "pedido de modificacion sin resolver".
243
+
244
+ 4. La galeria opera en ambos modos (sec 0.8): didactico
245
+ muestra solo la imagen + boton OK / pedir cambio; tecnico
246
+ incluye selector breakpoint + lang + browser + diff vs
247
+ baseline.
248
+
249
+ Esto vive como capa SOBRE la regresion visual (sec 6) -- la
250
+ regresion garantiza que no hay drift entre runs; este punto
251
+ garantiza que el usuario aprobo la version actual al menos
252
+ una vez.
253
+
254
+ ### 0.10 Consulta de target: desktop+mobile vs mobile-pure
255
+
256
+ En el pre-development checklist (sec 4), Forge **debe**
257
+ preguntar al usuario:
258
+
259
+ - **Target**: ¿la app es desktop compatible con mobile
260
+ (responsive web) o **solo mobile** (RN/PWA mobile-only)?
261
+ - **Set de funcionalidades por target**: si la respuesta es
262
+ "ambos", consultar que features estan solo en desktop, solo
263
+ en mobile, o cross. Esto es input al `spec.plan` -- afecta
264
+ scaffolding, layout patterns, voice loop strategy, ingest
265
+ flows, etc.
266
+
267
+ La respuesta queda escrita en `yujin.forge.json`:
268
+
269
+ ```json
270
+ {
271
+ "target": "responsive" | "mobile-only" | "desktop-only",
272
+ "feature_split": {
273
+ "desktop_only": ["bulk-edit", "csv-export"],
274
+ "mobile_only": ["geolocation", "camera-ingest"],
275
+ "shared": ["..."]
276
+ }
277
+ }
278
+ ```
279
+
280
+ Esta consulta es **obligatoria** porque cambia:
281
+
282
+ - El template scaffold (web/Expo/PWA).
283
+ - Los componentes NAC3 disponibles (algunos primitives no
284
+ tienen contraparte mobile sin refactor).
285
+ - Las queries de spec.extract (un "lista de clientes" en
286
+ desktop tiene paginacion + bulk; en mobile es scroll
287
+ infinito + swipe).
288
+ - Los manuales (USER_MANUAL adapta screenshots y flujos por
289
+ target).
290
+ - La estrategia de voice loop (mobile prefiere on-device
291
+ STT por latencia / privacy).
292
+
293
+ Mode-didactico (sec 0.8) presenta la pregunta como:
294
+ "¿queres que la gente la use en su computadora, en su
295
+ celular, o en los dos?"
296
+
297
+ Mode-tecnico la presenta como: "target: responsive (web
298
+ desktop + mobile breakpoints) vs mobile-only (Expo RN
299
+ single-target) vs desktop-only (Electron / web only). Feature
300
+ split JSON?"
301
+
302
+ ### 0.11 Autonomia operacional via vault de credenciales
303
+
304
+ Forge debe poder ejecutar el ciclo completo
305
+ **analisis -> desarrollo -> commit -> push -> publish ->
306
+ ejecucion** sin exponer claves al usuario ni a los logs.
307
+
308
+ Esto requiere:
309
+
310
+ 1. **Mecanismo unificado de ingreso de credenciales al
311
+ vault.** Slots tipados, ABM completo, encrypted at rest
312
+ (AES-256-GCM), con UI en chat y CLI:
313
+
314
+ - **Repositorios git**: GitHub PAT (`github_token`),
315
+ GitLab token (`gitlab_token`), Bitbucket app password
316
+ (`bitbucket_token`), generic ssh key (`ssh_key`).
317
+ - **Registries**: npm (`npm_token`), pypi
318
+ (`pypi_token`), maven (`maven_token`),
319
+ docker (`docker_token`), homebrew (`homebrew_token`).
320
+ - **AI providers**: Anthropic (`anthropic`), OpenAI
321
+ (`openai`), Google (`google_voice`), ElevenLabs
322
+ (`elevenlabs`), Whisper API si separado.
323
+ - **Cloud**: AWS access key + secret (`aws_access_key_id`,
324
+ `aws_secret_access_key`), GCP service account JSON
325
+ (`gcp_service_account`), Azure SP
326
+ (`azure_service_principal`).
327
+ - **App-specific** (apps relacionadas al proyecto):
328
+ Slack bot (`slack_bot_token`), Discord
329
+ (`discord_bot_token`), Twilio (`twilio_*`), Stripe
330
+ (`stripe_*`), Sendgrid (`sendgrid_*`), Mailgun
331
+ (`mailgun_*`), Linear (`linear_token`), Notion
332
+ (`notion_token`), Figma (`figma_token`).
333
+ - **Custom**: cualquier slot definido por el proyecto en
334
+ `yujin.forge.json::vault_slots[]`.
335
+
336
+ 2. **API contract**:
337
+
338
+ - `POST /api/vault/keys { name, value, kind?, expiry? }`
339
+ - `kind` = `repo | registry | ai | cloud | app | custom`
340
+ - `expiry` opcional, dispara rotacion alert.
341
+ - `GET /api/vault/keys` -> lista slots con
342
+ `value_preview: '****abcd'`, NUNCA el raw.
343
+ - `DELETE /api/vault/keys/{name}`.
344
+ - `POST /api/vault/test/{name}` -> prueba la credencial
345
+ contra el servicio (e.g. para `github_token`, hace
346
+ `GET https://api.github.com/user` y devuelve si
347
+ responde 200).
348
+
349
+ 3. **Inyeccion sin exposicion al usuario**:
350
+
351
+ Forge consume credenciales **server-side only**. Reglas:
352
+
353
+ - Comandos shell ejecutados por Forge **nunca** ven la
354
+ credencial en el comando (ni en logs ni en history del
355
+ shell). Se inyectan via `env: { GITHUB_TOKEN: ... }` en
356
+ el `spawn()`, no como argv.
357
+ - Tool calls de Claude **nunca** reciben el valor raw.
358
+ Reciben referencias (`{ vault_ref: "github_token" }`).
359
+ El servidor resuelve la ref al momento de invocar la
360
+ API externa.
361
+ - Mensajes al usuario en chat **redactan** secretos
362
+ pegados accidentalmente. Si un texto contiene un
363
+ pattern de token conocido (`ghp_*`, `sk-ant-*`, etc),
364
+ se reemplaza por `****redacted****` antes de mostrar.
365
+ - Logs server-side aplican la misma redaccion.
366
+
367
+ 4. **Lifecycle completo autonomo (escenarios soportados):**
368
+
369
+ - **Inicializar repo nuevo**: GitHub repo create + first
370
+ commit + push, usando `github_token` del vault.
371
+ - **Commit + push**: cualquier momento, usando
372
+ `github_token` (no SSH key del user que pueda no estar).
373
+ - **Publicar a npm**: `npm publish --tag X` con
374
+ `npm_token` inyectado via `NPM_TOKEN` env.
375
+ - **Publicar imagen Docker**: `docker push` con
376
+ `docker_token`.
377
+ - **Ejecutar la app en el cloud**: deploy a AWS / GCP /
378
+ Azure con la credencial cloud correspondiente.
379
+ - **Llamar APIs externas durante runtime**: cualquier
380
+ tool call que requiera un secret lo resuelve via
381
+ vault sin pasar por el modelo Claude.
382
+
383
+ 5. **Audit trail**:
384
+
385
+ Cada uso de una credencial genera una linea en
386
+ `vault.audit.log` (encrypted, append-only) con:
387
+ `{ ts, slot_name, op, request_id, success }`. El
388
+ contenido del valor NO se loggea. La intencion es que el
389
+ user pueda auditar **que credenciales se usaron y cuando**
390
+ sin exponer el valor.
391
+
392
+ 6. **UX por modo (sec 0.8):**
393
+
394
+ - **Didactico**: el chat consulta "tenes una clave de
395
+ GitHub configurada para que pueda hacer commits?"
396
+ y si no, ofrece "queres pegarla aca? la guardo cifrada
397
+ y nunca te la vuelvo a pedir".
398
+ - **Tecnico**: muestra el listado actual de slots con
399
+ status (test result, expiry) y permite `vault add`,
400
+ `vault rotate`, `vault test`, `vault remove` desde
401
+ chat o CLI.
402
+
403
+ 7. **Gate de release** (consistente con sec 0.7):
404
+
405
+ Forge **rechaza** ejecutar acciones que requieren un
406
+ secret si el vault no lo tiene. Mensaje en didactico:
407
+ "necesito una clave de X para esto. La cargas?". Mensaje
408
+ en tecnico: "missing vault slot: X (required for
409
+ operation Y)". **Nunca** se pide al usuario que pegue el
410
+ secret en el chat plano sin enmascarar.
411
+
412
+ 8. **Cero deuda con credenciales legacy**:
413
+
414
+ Si un proyecto Yujin todavia tiene credenciales en
415
+ archivos `.env` / `config.json` / hardcoded, el migrador
416
+ las mueve al vault al primer touch de Forge + las elimina
417
+ del archivo original + agrega entrada al `vault.audit.log`.
418
+
419
+ Esta seccion convive con sec 8 (activos estrategicos):
420
+ - Sec 8 protege el IP de Yujin (prompts, heuristicas) del
421
+ desarrollador-cliente.
422
+ - Sec 0.11 protege las credenciales del cliente del desarrollo
423
+ asistido por Forge.
424
+
425
+ Son dos vaults distintos conceptualmente: el primero vive
426
+ server-side en yujin.app (sec 8); el segundo vive local en
427
+ la maquina del desarrollador (sec 0.11), AES-GCM con
428
+ passphrase del usuario.
429
+
430
+ ---
431
+
432
+ ## 1. Antes de tocar codigo
433
+
434
+ ### 1.1 Lectura obligatoria de documentacion del proyecto
435
+
436
+ ANTES de hacer cualquier modificacion en un proyecto Yujin,
437
+ es obligatorio leer **toda** la documentacion del proyecto.
438
+ No "leí lo que necesitaba". Lectura completa o no se toca
439
+ nada.
440
+
441
+ Set minimo:
442
+
443
+ 1. `README.md` — overview, install, status.
444
+ 2. `PROJECT.md` — gobernanza, topologia, ciclo de trabajo.
445
+ 3. `SQ.md` (este archivo) — estandares de calidad.
446
+ 4. `docs/ARCHITECTURE.md` o `docs/HITO_*_ARCHITECTURE.md`.
447
+ 5. `docs/USER_MANUAL.md` (o equivalente del proyecto).
448
+ 6. `docs/MAINTENANCE_MANUAL.md`.
449
+ 7. `docs/INFRASTRUCTURE.md`.
450
+ 8. `CHANGELOG.md` — historia reciente.
451
+ 9. `docs/RFC/` o `rfcs/` — decisiones propuestas / aprobadas
452
+ / implementadas.
453
+ 10. `docs/decisions/` cuando exista — ADRs.
454
+
455
+ Si **cualquiera** de estos docs no existe en el proyecto:
456
+ - Levantar la falta antes de modificar codigo.
457
+ - Proponer creacion del doc faltante como primer slice.
458
+ - Si Pablo dice "skip", documentar el skip en commit
459
+ message + memoria.
460
+
461
+ Esta regla previene tres clases de error:
462
+
463
+ - **Refactor contra el design explicito** (el README explicaba
464
+ el porque, y rompi el invariante).
465
+ - **Tocar areas con invariantes que el codigo no se lee**
466
+ (la regla esta en MAINTENANCE_MANUAL, no en el codigo).
467
+ - **Repetir bugs ya documentados** (el incident anterior tiene
468
+ runbook + post-mortem, lo replicamos por no leerlo).
469
+
470
+ ### 1.2 Volumetrias antes de arquitectura
471
+
472
+ ANTES de proponer arquitectura para una feature nueva o un
473
+ proyecto nuevo, **obligatorio** preguntar al stakeholder
474
+ estas volumetrias:
475
+
476
+ | Volumetria | Pregunta concreta al stakeholder |
477
+ |---|---|
478
+ | Usuarios concurrentes | "Cuantos usuarios estaran activos simultaneamente en pico?" |
479
+ | Requests / segundo | "Que tasa de requests/segundo esperas en pico?" |
480
+ | Volumen de datos | "Cuanto data se va a generar / almacenar diaria / mensualmente?" |
481
+ | Latencia aceptable | "Cual es la latencia p95 / p99 aceptable para esta feature?" |
482
+ | Disponibilidad esperada | "Cual es el SLA esperado? 99.9% / 99.99%?" |
483
+ | Geografia | "Usuarios en una region o multi-region?" |
484
+ | Picos esperados | "Hay eventos predecibles que multipliquen la carga? (lanzamientos, fin de mes, horarios)" |
485
+ | Crecimiento proyectado | "Que crecimiento esperas en 6 / 12 / 24 meses?" |
486
+ | Tolerancia a fallos | "Cuanto downtime es aceptable en una semana / mes?" |
487
+ | Tipo de carga | "Read-heavy / write-heavy / balanced?" |
488
+
489
+ **Sin volumetrias, la arquitectura es adivinacion y la
490
+ implementacion es deuda tecnica garantizada.**
491
+
492
+ Las respuestas determinan:
493
+
494
+ - Stack tecnologico viable (Postgres vs DynamoDB vs Cassandra,
495
+ monolito vs microservicios).
496
+ - Necesidad de cache distribuido (Redis, Memcached), CDN, edge
497
+ computing.
498
+ - Workers stateless escalables horizontal vs stateful con
499
+ pinning.
500
+ - Read replicas, sharding, particionamiento.
501
+ - Queues asincronas (SQS, RabbitMQ, Kafka) vs RPC sincronico.
502
+ - Provisioning: serverless (Lambda) vs containers (ECS) vs
503
+ bare metal.
504
+ - Geo-distribution + multi-region active-active vs DR
505
+ passive.
506
+
507
+ ### 1.3 Solicitudes simultaneas + soluciones escalables
508
+
509
+ Para cada flow del proyecto, ANTES de implementar:
510
+
511
+ 1. **Inferir** `concurrency_p95` (pico de solicitudes
512
+ simultaneas), `rps_avg` (tasa sostenida), patron
513
+ read-heavy / write-heavy / balanced.
514
+ 2. **Documentar** la inferencia en el RFC / HITO doc:
515
+ "asumimos `concurrency_p95 = N` segun volumetria 1.2.X".
516
+ 3. **Proponer** arquitectura que soporte esos numeros con
517
+ margen de 3x para crecimiento.
518
+ 4. **Enumerar las ventajas** del approach elegido (no asumir
519
+ que Pablo "ya entiende"; escribirlo).
520
+
521
+ #### Preferencia obligatoria: stateless
522
+
523
+ #### Ventajas de soluciones stateless (las 10 que justifican la preferencia)
524
+
525
+ 1. **Horizontal scaling sin estado compartido.** Se agregan
526
+ instancias sin coordinacion previa. El load balancer
527
+ distribuye, cualquier instancia sirve cualquier request.
528
+ 2. **Recuperacion instantanea de fallas.** Una instancia
529
+ muere, el LB rutea a otra, **sin perdida de sesion del
530
+ usuario**.
531
+ 3. **Deploy sin downtime.** Rolling deploys porque cualquier
532
+ instancia sirve cualquier request. Blue/green es trivial.
533
+ 4. **Predictibilidad de costos.** Escalar es lineal con load,
534
+ sin overhead de coordinacion / sincronizacion / locks
535
+ distribuidos.
536
+ 5. **Testing mas simple.** Cada request es self-contained,
537
+ no necesita setup de estado previo. Tests paralelos
538
+ sin colision.
539
+ 6. **Independencia de orden de procesamiento.** Los workers
540
+ procesan en cualquier orden sin afectar correctness.
541
+ 7. **Compatibilidad con caches.** Las respuestas son
542
+ cacheables por (input, version). CDN edge cache es viable.
543
+ 8. **Diagnostico mas simple.** Replay de un request da el
544
+ mismo resultado. Bug bisection trivial.
545
+ 9. **Migracion entre regiones / providers mas simple.** Sin
546
+ state local que migrar.
547
+ 10. **Capacidad de spot / preemptible instances.** Perdida de
548
+ instancia = perdida de un request a lo sumo, que el
549
+ retry resuelve.
550
+
551
+ #### Atomizacion obligatoria de acciones
552
+
553
+ - Cada operacion debe ser **atomica** (idempotente cuando es
554
+ posible).
555
+ - Operaciones largas se rompen en steps que se pueden
556
+ retry independiente.
557
+ - Estado intermedio en stores externos (DB, queue), **no** en
558
+ memoria del proceso.
559
+ - Cualquier operacion que tarde > 100ms debe ser cola
560
+ asincrona, **no** RPC sincronico.
561
+ - Las queues son la unidad de retry — si falla un step, el
562
+ siguiente arranca la proxima vez.
563
+
564
+ #### Cuando se rompe el "stateless preferido"
565
+
566
+ Solo en estos casos:
567
+
568
+ - Conexiones WebSocket persistentes (chat real-time, voice
569
+ full-duplex).
570
+ - Streams de media (TTS playback, video conferencing).
571
+ - Calculos pesados que ya cargaron data en memoria (Spark
572
+ workers, ML inference con modelo de 10GB).
573
+ - Hardware especializado pegado a una instancia (GPU
574
+ exclusiva).
575
+
576
+ En estos casos, el state debe estar:
577
+
578
+ - Documentado en `docs/STATEFUL_COMPONENTS.md` con la razon
579
+ exacta.
580
+ - Aislado en un componente especifico (no contaminar el
581
+ resto del sistema).
582
+ - Tener backup / failover / DR plan documentado.
583
+ - Tener metrica + alerta que dispare cuando el componente
584
+ baja de capacidad.
585
+
586
+ ---
587
+
588
+ ## 2. Estandares de codigo
589
+
590
+ ### 2.1 Tests
591
+
592
+ - **100% test pass.** `npm test` retorna exit 0 con cero
593
+ FAIL en Linux + macOS + Windows. Pre-existing failures
594
+ NO son aceptables — se arreglan o se borran. No existe
595
+ "known-failing-but-not-our-fault".
596
+ - **TDD por slice.** Escribir tests RED antes de implementar.
597
+ Implementar. Commit GREEN. Saltarse TDD solo en
598
+ extractors / formatters triviales donde el test seria un
599
+ 1:1 mirror del impl.
600
+ - **Evidencia requerida.** Cada slice cita los tests que pasan
601
+ en el commit message + CHANGELOG. Si un slice no apunta a
602
+ un test verde, no es slice — es draft.
603
+ - **Seams mockeables.** Cada llamada a Claude, cada `fetch`,
604
+ cada `fs` write, cada spawn, cada captura de audio es
605
+ alcanzable via DI seam para que los unit tests corran
606
+ offline sin keys.
607
+
608
+ ### 2.2 Coverage 100% de interfaces visuales
609
+
610
+ **Regla incorporada 2026-05-25 despues del bug del
611
+ SyntaxError en el panel:** toda interfaz visual de Yujin
612
+ (panel de chat incluido, modales, dropdowns, drag-drop
613
+ overlays) se cubre al 100% con tests Playwright headless
614
+ que ejercen **dialogos de alta complejidad** y **todas las
615
+ funciones del producto**, no solo "carga sin errores".
616
+
617
+ Detalle completo en `PROJECT.md` sec 3.1.1. Resumen aplicable
618
+ a cualquier proyecto Yujin:
619
+
620
+ - Boot smoke: panel carga con cero `console.error` /
621
+ `pageerror`.
622
+ - Functional smokes: cada funcion visible tiene al menos un
623
+ scenario end-to-end.
624
+ - High-complexity dialogues: conversaciones multi-turn con
625
+ Claude scripteado realista que encadenan tools.
626
+ - Cross-language: cada scenario corre en los 10 idiomas
627
+ cuando aplica.
628
+ - Cross-browser: chromium + firefox + webkit.
629
+ - Visual regression: screenshots vs baselines.
630
+ - Audio + media: con stubs deterministicos.
631
+
632
+ **Vitest no es suficiente.** Vitest cubre endpoints + pure
633
+ functions. **No** ejecuta el JS inline del browser. Reportar
634
+ "X tests verde" sin haber corrido Playwright es claim falso.
635
+
636
+ ### 2.3 Coverage 100% backend
637
+
638
+ - Cada funcion publica del runtime tiene test unitario.
639
+ - Cada endpoint HTTP tiene test de integracion (happy path
640
+ + 1 error path minimo).
641
+ - Cada plugin / handler tiene test de su flow.
642
+
643
+ ### 2.4 Codigo style
644
+
645
+ - **ASCII puro** en codigo fuente TS/JS (`src/**`,
646
+ `scripts/**`). Sin unicode arrows, em-dashes, smart quotes.
647
+ Catalogos i18n + manuales HTML son la excepcion — esos
648
+ cargan unicode por diseno.
649
+ - **TypeScript** first. `tsx` para dev, `tsc` para build,
650
+ `dist/` para npm.
651
+ - **camelCase** JS/TS variables.
652
+ - **PascalCase** clases + interfaces.
653
+ - **snake_case** JSON keys + on-the-wire fields.
654
+ - **kebab-case** CLI subcommands + filenames cuando aplica.
655
+ - **Function declarations** en module top-level. Arrow
656
+ expressions OK para inline callbacks.
657
+ - **Comments explican el POR QUE**, no el QUE. Default a sin
658
+ comment. Comment solo cuando el por que no es obvio
659
+ (constraint oculto, invariante sutil, workaround
660
+ sorprendente, referencia a spec).
661
+ - **TypeScript strict** activo: `noUncheckedIndexedAccess`,
662
+ `strict: true`, `noImplicitOverride`. No relajar.
663
+
664
+ ### 2.5 Build + deploy
665
+
666
+ - `npm run build` corre `tsc`. Output a `dist/`. Codigo
667
+ fuente siempre en `src/`.
668
+ - `npm run prepublishOnly` corre build + typecheck +
669
+ catalog:lint + test. **No bypassear.** Es el publish gate.
670
+ - `npm publish --tag alpha` desde un estado verificado.
671
+ Promote a `latest` solo en GA cut.
672
+ - `npm publish --dry-run` despues de tocar `files` glob.
673
+
674
+ ### 2.6 Multi-language: 10 idiomas canonicos NAC3
675
+
676
+ Forge y todo proyecto Yujin enforece la **regla 10 idiomas**:
677
+ `es, en, pt, fr, ja, zh, hi, ar, de, it`.
678
+
679
+ - Cada string user-facing pasa por `t('key')` /
680
+ `tForLang(lang, 'key')`.
681
+ - Catalogos: `src/i18n/catalogs/<lang>.json` (10 archivos).
682
+ - Espanol es source of truth. Cada otro locale debe contener
683
+ todas las keys de es.
684
+ - `catalog-lint` enforces parity. `prepublishOnly` corre
685
+ catalog-lint como gate.
686
+ - HTML manuales: uno por idioma en `docs/manuals/manual.<lang>.html`.
687
+ - Voice intents extendidos a 10 idiomas con verbos por
688
+ idioma.
689
+
690
+ Ver `docs/LANGUAGE_POLICY.md`.
691
+
692
+ ### 2.7 Provenance
693
+
694
+ Cada accion que el sistema dispatcha emite un evento
695
+ estructurado: `{tool, input, display, is_error,
696
+ via_voice?, voice_pattern?, voice_utterance?, ...}`. Es lo
697
+ que da trazabilidad para auditoria + debugging.
698
+
699
+ - **No suprimir silenciosamente** trace entries, ni siquiera
700
+ en failure paths.
701
+ - **VOZ badge** + utterance + pattern slug en dispatches
702
+ voice-driven.
703
+ - **tool_rounds** en cada respuesta `/api/chat`.
704
+
705
+ ### 2.8 Security boundaries
706
+
707
+ - **Vault** (`src/vault/` cuando aplica): AES-256-GCM,
708
+ scrypt KDF, machine-fingerprint binding, atomic writes
709
+ `0o600`, one-shot reveal, never re-displayable.
710
+ - **Direct-dispatch endpoint** (`/api/forge/tool` o
711
+ equivalente) whitelist solo a tools read-only. Write-class
712
+ pasa por `/api/chat` con approval flow.
713
+ - **Approval gates** en operaciones destructivas (file
714
+ scaffolding, scaffolds, pushes, deletes): explicit
715
+ `{approve: true}` requerido.
716
+ - **Path-escape validation** en cualquier handler que
717
+ resuelve paths del usuario: rechazar absolute paths, `..`,
718
+ drive letters; resolver contra `projectRoot` y verificar
719
+ prefix.
720
+ - **Voiceprint liveness** mandatorio para irreversible ops.
721
+ - **Cost gates** dobles (env + impl installed) para
722
+ operaciones que pueden charge tokens.
723
+
724
+ ### 2.9 Single source of truth para modelos LLM
725
+
726
+ El identificador de modelo Claude / OpenAI / Gemini / etc.
727
+ vive en **una sola** ubicacion por proyecto (e.g.
728
+ `src/version.ts` para version, `core/AiModel.php` para
729
+ modelos en CRM, o equivalente). Rolling over a un modelo
730
+ nuevo es un cambio de 1 linea, no buscar y reemplazar 50
731
+ archivos.
732
+
733
+ ---
734
+
735
+ ## 3. Entregables por proyecto -- 4 manuales obligatorios
736
+
737
+ Cada proyecto Yujin debe emitir y **mantener** estos cuatro
738
+ manuales en formato Markdown legible:
739
+
740
+ ### 3.1 `docs/INFRASTRUCTURE.md` — Manual de infraestructura
741
+
742
+ Contenido obligatorio:
743
+
744
+ - Diagrama de infraestructura (mermaid, ASCII art, o link
745
+ a un PNG).
746
+ - Servicios externos: cuales son, para que se usan, donde
747
+ estan los slots de credenciales (sin las credenciales
748
+ mismas).
749
+ - Variables de entorno necesarias + valores ejemplo + valores
750
+ prohibidos.
751
+ - Puertos, hostnames, DNS records configurados.
752
+ - Backups: que se respalda, donde, frecuencia, retention,
753
+ cifrado.
754
+ - Restore procedure: tested + documented step-by-step.
755
+ - Monitoring: que metricas se emiten, donde se visualizan
756
+ (CloudWatch / Grafana / etc).
757
+ - Alertas: cuales estan configuradas, threshold, a quien
758
+ notifican.
759
+ - Capacity planning: limites actuales, headroom, trigger de
760
+ scaling.
761
+
762
+ ### 3.2 `docs/ARCHITECTURE.md` — Manual de arquitectura
763
+
764
+ Contenido obligatorio:
765
+
766
+ - **Decision arquitectonica principal** y por que (incluyendo
767
+ alternativas descartadas).
768
+ - **Volumetrias acordadas** segun sec 1.2 de este SQ.
769
+ - **Stack tecnologico** + razon de cada eleccion.
770
+ - **Diagrama de modulos** (modulos internos + sus relaciones).
771
+ - **Diagramas de flow** de happy paths (top 5 minimo).
772
+ - **Diagramas de flow de failure paths** (top 5 minimo).
773
+ - **Boundaries** entre componentes: que componente conoce que.
774
+ - **Acoplamiento**: que requiere que (idealmente: tabla).
775
+ - **Data model**: schemas + relaciones + indices.
776
+ - **Concurrency model**: como se asegura correctness bajo
777
+ carga concurrente (locks, optimistic, eventual
778
+ consistency, etc).
779
+ - **Threat model**: que protege el sistema y contra que.
780
+
781
+ ### 3.3 `docs/USER_MANUAL.md` — Manual de usuario (o variantes por idioma)
782
+
783
+ Contenido obligatorio:
784
+
785
+ - Guia paso a paso para el usuario final.
786
+ - En el idioma del usuario (los 10 NAC3 cuando aplica;
787
+ multiples archivos `docs/manuals/manual.<lang>.html` o
788
+ `docs/USER_MANUAL.<lang>.md`).
789
+ - Screenshots / GIFs cuando corresponda (en `docs/assets/`).
790
+ - Troubleshooting de los 10 problemas mas comunes.
791
+ - Contacto de soporte.
792
+
793
+ ### 3.4 `docs/MAINTENANCE_MANUAL.md` — Manual de mantenimiento
794
+
795
+ Contenido obligatorio:
796
+
797
+ - **Procedure de deploy** step-by-step + rollback.
798
+ - **Procedure de rollback** independiente del deploy.
799
+ - **Runbook de los 10 incidents mas comunes** + diagnostico
800
+ + remedio.
801
+ - **Como agregar capacidad** (vertical y horizontal).
802
+ - **Como investigar un incident** (logs, metricas,
803
+ herramientas).
804
+ - **Logs**: donde estan, formato, rotation, search.
805
+ - **Metricas**: donde estan, umbrales normales / warning /
806
+ critical.
807
+ - **Dependencias externas**: que pasa si X cae, RPO/RTO de
808
+ cada una.
809
+ - **Procedure de DR** (disaster recovery).
810
+ - **Procedure de re-key** + rotacion de credenciales.
811
+
812
+ ### Formato de los manuales
813
+
814
+ - **Markdown plano**, sin frameworks (no Docusaurus, no
815
+ MkDocs custom). Renderable en GitHub web view sin
816
+ extensiones.
817
+ - **Cada doc < 2000 lineas**; si supera, separar en
818
+ subdocs linkeados.
819
+ - **Headings nivelados**: H1 titulo, H2 secciones, H3
820
+ subsecciones.
821
+ - **Tablas** para data tabular.
822
+ - **Code blocks** con language tag.
823
+ - **Diagramas** preferentemente en mermaid (texto-as-data)
824
+ o ASCII art. Si PNG, en `docs/assets/`.
825
+ - **Linkeable** desde el README del proyecto.
826
+
827
+ ### Mantenimiento de los manuales
828
+
829
+ - **Cada slice** que afecta una seccion de un manual
830
+ actualiza el manual en el **mismo commit** (regla
831
+ doc-update invariant, PROJECT.md sec 2.4).
832
+ - **Manuales obsoletos son bug critico** — al detectarlo,
833
+ levantar issue + parchear.
834
+ - **Pasada trimestral** de re-validacion: alguien (humano
835
+ + Sumi) lee los manuales pretendiendo no saber nada del
836
+ sistema, y reporta secciones que ya no representan la
837
+ realidad.
838
+
839
+ ---
840
+
841
+ ## 4. Pre-development checklist
842
+
843
+ Antes de hacer cualquier slice de codigo, Sumi pasa por
844
+ este checklist. **Si cualquier item falla, el slice NO
845
+ arranca** — se hace el item primero, despues se arranca el
846
+ slice.
847
+
848
+ - [ ] Lei `README.md` del proyecto.
849
+ - [ ] Lei `PROJECT.md`.
850
+ - [ ] Lei este SQ.md.
851
+ - [ ] Lei `docs/ARCHITECTURE.md` o `docs/HITO_*_ARCHITECTURE.md`.
852
+ - [ ] Lei `docs/USER_MANUAL.md` (o equivalente).
853
+ - [ ] Lei `docs/MAINTENANCE_MANUAL.md`.
854
+ - [ ] Lei `docs/INFRASTRUCTURE.md`.
855
+ - [ ] Lei el `CHANGELOG.md` reciente.
856
+ - [ ] Para feature nueva: pedi las volumetrias (sec 1.2).
857
+ - [ ] Para feature nueva: defini el target de `concurrency_p95`
858
+ (sec 1.3).
859
+ - [ ] Para feature nueva: propuse arquitectura stateless O
860
+ justifique stateful en `STATEFUL_COMPONENTS.md`.
861
+ - [ ] Para feature nueva: enumere las 10 ventajas (o subset
862
+ aplicable) del approach elegido (sec 1.3).
863
+ - [ ] El plan tiene tests Playwright para las visual
864
+ interfaces que toca.
865
+ - [ ] El plan actualiza los 4 manuales en el mismo PR si
866
+ la feature los toca.
867
+ - [ ] Hable con Pablo si encontre contradicciones entre
868
+ docs o invariantes.
869
+
870
+ ---
871
+
872
+ ## 5. Reporte de "ready" — disciplina
873
+
874
+ Cuando Sumi reporta que un slice esta listo, la frase debe
875
+ contener **estos cuatro componentes**:
876
+
877
+ > X vitest cases + Y Playwright scenarios green. Console +
878
+ > page errors empty on all 3 browsers + all 10 languages
879
+ > exercised for affected surfaces. Screenshots diff: 0
880
+ > baseline changes. Evidence updated at
881
+ > `tests/evidence/<scenario>/`.
882
+
883
+ Si **alguno** de los cuatro componentes no aplica o no esta
884
+ verde, **no se dice "ready"**. Se dice "blocked on
885
+ [componente]" + ETA concreta.
886
+
887
+ Esto protege el tiempo de Pablo (sec 0.1).
888
+
889
+ ---
890
+
891
+ ## 6. Evidencia visual permanente
892
+
893
+ Cada Playwright run guarda screenshots de la **ultima
894
+ ejecucion exitosa** en `tests/evidence/<scenario>/<lang>/<browser>.png`.
895
+
896
+ - Failed runs **NO** sobreescriben la evidencia previa.
897
+ - Committed al repo como visual changelog.
898
+ - Actualizado en el mismo commit que el codigo cuando el
899
+ scenario cambia intencionalmente.
900
+ - < 200 KB por PNG; 1280 wide max.
901
+
902
+ Detalle en `PROJECT.md` sec 3.1.1 subseccion "Evidence
903
+ folder".
904
+
905
+ ---
906
+
907
+ ## 7. Memoria de decisiones
908
+
909
+ Cada decision arquitectonica no-trivial se documenta en uno
910
+ de:
911
+
912
+ 1. `docs/RFC/RFC-<HITO>-<NN>-<title>.md` para decisiones de
913
+ HITO scope.
914
+ 2. `docs/decisions/ADR-<NN>-<title>.md` para Architecture
915
+ Decision Records puntuales.
916
+ 3. Inline en el `PROJECT.md` cuando es una regla del
917
+ proyecto entero.
918
+ 4. Inline en el `CHANGELOG.md` cuando es un cambio
919
+ especifico de version.
920
+
921
+ **No** se aceptan decisiones que viven solo en chats /
922
+ commits / commit messages sin un doc estable que las
923
+ referencie.
924
+
925
+ ---
926
+
927
+ ## 8. Activos estrategicos + proteccion de propiedad intelectual
928
+
929
+ > **Estado:** decision tomada **2026-05-25** por Pablo:
930
+ > **Opcion A -- Server-side prompt composition.** El
931
+ > inventario en 8.2 sigue siendo autoritativo. Las opciones
932
+ > B/C/D quedan documentadas como historico. La implementacion
933
+ > arranca en `docs/HITO_4_STRATEGIC_ASSETS.md` (HITO 4
934
+ > "Strategic asset isolation").
935
+
936
+ ### 8.1 El problema
937
+
938
+ Forge se distribuye via `npm install -g @yujin/forge-cli`. Al
939
+ instalarse, el codigo entero (incluido el `dist/`) queda
940
+ legible en disco del adopter. **Cualquier developer con
941
+ acceso al binario puede leer el codigo fuente**, incluido:
942
+
943
+ - Los system prompts a Claude para extract / plan / decorate
944
+ / recap summary.
945
+ - Los catalogos de tools + sus shapes + sus rules.
946
+ - Los templates de scaffolding por kind/language.
947
+ - Los heuristicos del trust model + del intent matcher.
948
+ - La metodologia completa del pipeline.
949
+
950
+ Es decir: **el "secret sauce" del producto esta hoy en
951
+ plaintext en la maquina de cada adopter pago.** Un competidor
952
+ puede `npm install -g @yujin/forge-cli`, abrir
953
+ `dist/chat/spec_extract.js`, copiar el prompt, y construir
954
+ un clon sin pagar.
955
+
956
+ Esto debe arreglarse antes del GA cut (HITO 3 territory),
957
+ con la decision tomada antes de la promocion alpha → latest.
958
+
959
+ ### 8.2 Inventario de activos estrategicos
960
+
961
+ Lista exhaustiva de lo que da valor a Forge.
962
+ **Cada item esta clasificado por sensibilidad: CLOSED, MIXED,
963
+ OPEN.**
964
+
965
+ **Tier 1 -- CLOSED (secret sauce; competitividad directa):**
966
+
967
+ 1. **System prompts de los flows Claude** -- la receta de
968
+ como Forge extrae requirements de un spec, arma planes,
969
+ redacta el recap summary. Hoy en plaintext en:
970
+ - `src/chat/spec_extract.ts` (SYSTEM_PROMPT)
971
+ - `src/chat/spec_plan.ts` (SYSTEM_PROMPT)
972
+ - `src/chat/server.ts` (recap summariser system prompt)
973
+ - `src/migrate/ai-decorate-*.ts` (decoration prompts)
974
+ - `src/migrate/figma-*.ts` (Figma scaffolder prompts)
975
+
976
+ 2. **Heuristicas de plan generation** -- las reglas de "que
977
+ archivos crear para que entidad/endpoint/component",
978
+ "orden de creacion", "naming conventions". Hoy en
979
+ `src/chat/spec_plan.ts` + system prompt.
980
+
981
+ 3. **Templates de scaffold por (kind, language)** -- los
982
+ stub bodies de `model.ts`, `api.ts`, `Component.tsx`,
983
+ `README.md`, etc. Hoy en `src/chat/spec_scaffold.ts`
984
+ (`templateFor` function).
985
+
986
+ 4. **Decoration heuristicas NAC-3** -- como elegimos
987
+ `data-nac-role` por elemento, como derivamos
988
+ `data-nac-action`, como agrupamos elementos en plugin
989
+ slugs.
990
+
991
+ 5. **NAC-3 disambiguation prompts** -- cuando esto se
992
+ implemente (memoria `nac3-disambiguation-model-split`),
993
+ el prompt que recibe Gemini Flash Lite para resolver
994
+ ambiguity en runtime de Pilot.
995
+
996
+ 6. **El benchmark interno + sus resultados** -- los runs de
997
+ 600 ejecuciones del NAC-3 benchmark (que modelo, que
998
+ protocolo, que accuracy). Hoy en `yujin-nac-spec/benchmark/`,
999
+ no en Forge, pero Forge consume los hallazgos para
1000
+ decidir defaults de model_preference.
1001
+
1002
+ 7. **Modelo Koe (pricing + cost formula)** -- la formula
1003
+ provider_cost + 30% markup + 20% reinvestment +
1004
+ institutional plan. Documentada en CRM memory
1005
+ `yujin-koe-pricing-formula`.
1006
+
1007
+ **Tier 2 -- MIXED (parte open, parte closed):**
1008
+
1009
+ 1. **Tool catalog `forge.*`** -- los NOMBRES + SCHEMAS
1010
+ pueden ser publicos (los adopters los invocan). Las
1011
+ IMPLEMENTACIONES de cada tool tienen detalles que valen
1012
+ ocultar (e.g. como `forge.git_commit` orquesta el splice
1013
+ del token de GitHub).
1014
+
1015
+ 2. **Trust model voiceprint** -- la idea de 5 capas es
1016
+ publica. Los thresholds + ponderaciones precisas son
1017
+ ajustables y son el resultado de tuning empirico = valor.
1018
+
1019
+ 3. **Recap summary cost gating** -- el doble lock
1020
+ (env var + summariser instalado) es publico. La logica
1021
+ exacta de cuando el summary vale los tokens es interna.
1022
+
1023
+ 4. **Voice intent matcher catalog** -- los 8 intents son
1024
+ publicos (estan en el manual del usuario). Los regex
1025
+ exactos por idioma son el resultado de empirical tuning
1026
+ = valor. Hoy en `src/voice/intents.ts` en plaintext.
1027
+
1028
+ **Tier 3 -- OPEN (Apache-2.0; pueden ser publicos sin perdida):**
1029
+
1030
+ 1. **CLI surface** (`yf` commands + flags) -- documentado en
1031
+ USAGE.md, expuesto al mundo.
1032
+ 2. **Reader pipeline + 10 parsers** -- standard tech; los
1033
+ parsers en si son ejercicios de ingenieria, no IP unica.
1034
+ 3. **Vault crypto** -- estandar AES-256-GCM + scrypt + machine
1035
+ fingerprint; el codigo es directo y publicable.
1036
+ 4. **i18n runtime + 10 catalogos** -- las traducciones son
1037
+ accesibles al usuario via el panel; el codigo es trivial.
1038
+ 5. **HTML manuals** -- distribuidos al usuario por diseno;
1039
+ publicos por definicion.
1040
+ 6. **Playwright test suite** -- estandar de QA, no IP.
1041
+ 7. **PROJECT.md + SQ.md + LANGUAGE_POLICY.md** -- son
1042
+ politicas del equipo, no codigo.
1043
+ 8. **NAC-3 spec adoption** -- la spec es Apache-2.0; nuestro
1044
+ uso de ella es subsidiario.
1045
+
1046
+ ### 8.3 Threat model
1047
+
1048
+ **Actores con acceso al binario:**
1049
+
1050
+ | Actor | Acceso | Riesgo |
1051
+ |---|---|---|
1052
+ | Pablo + Sumi | Full repo + dist + secrets | Trust total |
1053
+ | Adopter pago ($5/mo) | `npm install -g` -> dist en disco | Lee Tier 1 + Tier 2 |
1054
+ | ADIP / institucional (gratis) | igual que adopter pago | Misma exposicion |
1055
+ | Open-source contributor | Repo publico (cuando se abra) | Solo Tier 3 |
1056
+ | Competidor que paga $5/mo | igual que adopter | **Caso de uso adversario principal** |
1057
+ | Reverse engineer determinado | dist + debugger + DevTools | Lo logra eventualmente sin importar mitigacion |
1058
+
1059
+ **Lo que protege un mecanismo razonable:**
1060
+ - Casual copy (alguien abre el archivo, copia el prompt, ya
1061
+ esta). Mitigacion barata previene el 90% de los casos.
1062
+
1063
+ **Lo que NO se puede proteger 100%:**
1064
+ - Reverse engineering determinado de un binario distribuido.
1065
+ Cualquier mecanismo de cifrado + license-gating se crackea
1066
+ con tiempo + skill suficiente.
1067
+
1068
+ **Conclusion:** la proteccion eleva el costo del ataque
1069
+ hasta que no vale la pena. No la lleva a infinito.
1070
+
1071
+ ### 8.4 Opciones de proteccion -- decision tomada (Opcion A)
1072
+
1073
+ **Pablo eligio Opcion A el 2026-05-25.** Las otras tres
1074
+ opciones quedan documentadas como historico para futuro
1075
+ contexto. El diseno completo de la implementacion vive en
1076
+ `docs/HITO_4_STRATEGIC_ASSETS.md`.
1077
+
1078
+ #### Opcion A -- Server-side prompt composition (ELEGIDA)
1079
+
1080
+ - Los Tier-1 prompts viven en un servidor central de Yujin
1081
+ (`prompts.yujin.app/api/v1/...`).
1082
+ - Forge cliente NUNCA tiene los prompts. Cuando necesita
1083
+ extract / plan / recap-summary, llama a:
1084
+ `POST https://prompts.yujin.app/api/v1/spec-extract`
1085
+ con `{ flat_text, title, language, license_key }`.
1086
+ - El server compone el prompt + llama a Claude + devuelve
1087
+ el resultado validado.
1088
+ - **Pros:** prompt nunca sale del server; rotacion central
1089
+ (un cambio en el prompt se propaga sin re-publish a npm);
1090
+ rate-limiting + abuse-blocking centralizado; A/B testing
1091
+ trivial.
1092
+ - **Cons:** requiere infra Yujin always-on; latencia extra
1093
+ (1 hop ida-vuelta); air-gapped deployments imposibles;
1094
+ privacy concern (el spec del cliente pasa por nuestro
1095
+ server).
1096
+
1097
+ #### Opcion B -- Bundle encryption + license-gated decryption
1098
+
1099
+ - Los Tier-1 prompts viven en `dist/` cifrados con AES-256-GCM.
1100
+ - La key de decryption llega del license server al boot
1101
+ (`yf license activate` la cachea localmente).
1102
+ - Sin licencia valida, prompts inutilizables.
1103
+ - **Pros:** funciona offline despues del first activation;
1104
+ no requiere server runtime para cada extract; respeta
1105
+ privacy del spec del adopter.
1106
+ - **Cons:** cualquier debugger atrapa el plaintext en
1107
+ memoria post-decrypt; obfuscacion del decryptor lo demora
1108
+ pero no lo previene; complica el build pipeline.
1109
+
1110
+ #### Opcion C -- Hybrid (publica surface + private kernel)
1111
+
1112
+ - El kernel critico (prompts + heuristicas tier-1) sirve
1113
+ via API como en A.
1114
+ - El resto (CLI, reader, voice subsystem, vault) queda en
1115
+ npm publico.
1116
+ - Marketing: "Forge open framework + Yujin Engine premium".
1117
+ - **Pros:** combina lo mejor de A + adopcion open-source;
1118
+ permite ecosistema sin perder secret sauce.
1119
+ - **Cons:** misma latency + always-on que A para los flows
1120
+ Claude-driven; complica el messaging comercial.
1121
+
1122
+ #### Opcion D -- Obfuscacion sola (NO recomendada, NO elegida)
1123
+
1124
+ - Code obfuscation del bundle, strings encoded en base64 +
1125
+ XOR-mask, runtime decode.
1126
+ - **Pros:** trivial de implementar; sin infra.
1127
+ - **Cons:** se crackea en una tarde con DevTools; no es
1128
+ proteccion, es teatro de seguridad. Solo aceptable como
1129
+ capa adicional encima de A o B.
1130
+
1131
+ #### Notas sobre la decision Opcion A
1132
+
1133
+ - **Infra requerida:** servidor central `prompts.yujin.app`
1134
+ o equivalente. Ya alineada con HITO 3 license server (que
1135
+ vive en el CRM Yujin segun decision 2026-05-23).
1136
+ - **Latency budget:** un extra hop ida-vuelta. Para flows
1137
+ Claude (extract / plan / recap summary) que ya tardan
1138
+ varios segundos, +200ms es invisible. Para flows no-Claude
1139
+ (no aplica) no afecta.
1140
+ - **Privacy del spec del adopter:** el `flat_text` del spec
1141
+ va a nuestro server. Documentar esto en
1142
+ `PRIVACY_POLICY.md` antes de GA. Adopters institucionales
1143
+ (ADIP) pueden tener clausula de no-retencion en su
1144
+ contrato.
1145
+ - **Air-gapped deployment:** NO soportado en HITO 4 inicial.
1146
+ Si una institucion lo pide, evaluar Opcion B selectivamente
1147
+ para esos clientes (license-tier especifico).
1148
+ - **Failover:** si `prompts.yujin.app` esta down, Forge
1149
+ cliente reporta error claro -- NO hace fallback a un prompt
1150
+ local (eso violaria toda la proteccion).
1151
+
1152
+ ### 8.5 Reglas hasta que se implemente la opcion elegida
1153
+
1154
+ Mientras el mecanismo de 8.4 esta en desarrollo:
1155
+
1156
+ 1. **No agregar nuevos Tier-1 assets en plaintext al
1157
+ `src/`.** Si un slice necesita un prompt nuevo, escribirlo
1158
+ en un archivo separado en `src/_secret_pending/` con
1159
+ header `*** TIER-1 STRATEGIC ASSET -- DO NOT PUBLISH ***`
1160
+ + un TODO de migracion a la opcion elegida.
1161
+
1162
+ 2. **El npm publish gate (prepublishOnly) corre un linter
1163
+ que rechaza `src/_secret_pending/` en el dist.** Eso
1164
+ bloquea publish accidental hasta que el asset migre a la
1165
+ solucion definitiva.
1166
+
1167
+ 3. **Documentar en cada commit que toca un Tier-1 asset:**
1168
+ "Tier-1 strategic asset modified. Threat exposure
1169
+ acknowledged per SQ sec 8.3."
1170
+
1171
+ 4. **No agregar nuevos system prompts a archivos publicos.**
1172
+ Si un nuevo flow Claude-driven aparece, pedir a Pablo la
1173
+ decision: server-side ya, plaintext con warning, o
1174
+ diferir el slice.
1175
+
1176
+ ### 8.6 Migracion futura (post-decision)
1177
+
1178
+ Cuando Pablo elija opcion A / B / C:
1179
+
1180
+ 1. Listar todos los Tier-1 assets actualmente en `src/`.
1181
+ 2. Diseñar el mecanismo elegido (server endpoints o
1182
+ encryption layout).
1183
+ 3. Implementar el mecanismo en una HITO dedicada (HITO 4
1184
+ "Strategic asset isolation" propuesto).
1185
+ 4. Migrar uno a uno los assets, con tests E2E que verifican
1186
+ que el flow sigue funcionando.
1187
+ 5. Republicar a npm como version major (`v0.3.0-alpha.0`)
1188
+ con changelog explicito: "Forge ahora requiere licencia
1189
+ valida para los flows Claude-driven."
1190
+ 6. Adopters existentes mantienen acceso porque su license
1191
+ sigue valida; nuevos adopters obtienen el binario sin
1192
+ los assets sensitive incluidos.
1193
+
1194
+ ---
1195
+
1196
+ ## 9. Convivencia con el `PROJECT.md`
1197
+
1198
+ El `PROJECT.md` del proyecto es **topologico + procesal** (que
1199
+ hay, donde, como se mueve). Este `SQ.md` es **normativo** (que
1200
+ calidad debe tener todo lo que se hace).
1201
+
1202
+ Cuando hay conflicto:
1203
+
1204
+ - Si es sobre **topologia o proceso** → `PROJECT.md` gana.
1205
+ - Si es sobre **calidad o normas de conducta** → `SQ.md`
1206
+ gana.
1207
+ - Si es sobre **una preferencia personal** que un colaborador
1208
+ intenta imponer → ambos docs ganan, el colaborador se ajusta.
1209
+
1210
+ ---
1211
+
1212
+ ## 14. Producer/Consumer Symmetry (mandatory, auto-enforced)
1213
+
1214
+ Cualquier cambio que toque una **estructura compartida** EXIGE
1215
+ que el commit asegure simetria producer/consumer. Estructuras
1216
+ compartidas incluyen (no es lista cerrada):
1217
+
1218
+ - Vault slots (`google_voice`, `github_token`, etc)
1219
+ - JSON keys en archivos de config persistidos
1220
+ (`provider_keys.json`, `yujin.forge.json`, `license.json`)
1221
+ - Env vars (`ANTHROPIC_API_KEY`, `YF_MODE`, etc)
1222
+ - Tool names del catalogo de chat (`forge_X`)
1223
+ - Type identifiers exportados desde `src/types/`
1224
+ - Endpoint contracts (`/api/voice/stt`, `/api/forge/tool`, etc)
1225
+ - Manifest fields (`data-nac-id`, `data-nac-role`, etc)
1226
+
1227
+ ### 14.1 Auto-enforcement (cero pregunta al usuario)
1228
+
1229
+ Forge es responsable de la simetria, NO el usuario. Pasos
1230
+ obligatorios antes de cualquier commit que toque write paths
1231
+ de estos conceptos:
1232
+
1233
+ 1. **Audit:** Forge corre `forge_audit_consumers(<concepto>)`.
1234
+ 2. **Sync:** Si hay readers desincronizados, Forge los actualiza
1235
+ en el MISMO commit. No espera siguiente sesion.
1236
+ 3. **Test:** Forge garantiza la existencia de un test en
1237
+ `tests/fresh-user/<concepto>.test.ts` que (a) limpia el
1238
+ estado, (b) escribe el lado productor, (c) instancia el
1239
+ consumer, (d) afirma que funciona.
1240
+ 4. **Commit:** El mensaje del commit lista los consumers
1241
+ sincronizados.
1242
+
1243
+ El usuario nunca es consultado en este flujo. Si el audit
1244
+ revela algo legitimamente ambiguo (ej. una migracion de
1245
+ contrato con back-compat), Forge SI pregunta -- pero la
1246
+ pregunta es FUNCIONAL ("mantenemos compatibilidad con
1247
+ usuarios viejos?"), no tecnica ("cual reader actualizo?").
1248
+
1249
+ ### 14.2 GOTCHAS log obligatorio
1250
+
1251
+ Cada regresion de tipo AP-1 que llega a una version publicada
1252
+ se anota en `docs/GOTCHAS.md` con:
1253
+
1254
+ - Sintoma user-visible (texto literal del error / screenshot)
1255
+ - Causa raiz estructural
1256
+ - Patch (commit hash)
1257
+ - Como Forge previene la recurrencia
1258
+
1259
+ Forge lee `GOTCHAS.md` al boot. Cuando un cambio diff matchea
1260
+ un patron registrado, refuse el commit y enlaza a la entrada.
1261
+
1262
+ ### 14.3 Que pasa si Forge ignora esta regla
1263
+
1264
+ - Bug AP-1 en alpha: commit que lo detecta tiene que rollback.
1265
+ - Bug AP-1 en stable: ademas, anotacion en GOTCHAS con
1266
+ `published: true` flag, alarma en el panel para el proximo
1267
+ uso del producer.
1268
+ - Tres bugs AP-1 en una semana: pause del autopilot, hand-off
1269
+ manual hasta que se audite la causa de no-deteccion.
1270
+
1271
+ ### 14.4 Por que esta seccion (origen historico)
1272
+
1273
+ 2026-05-29: el BYOK refactor (`yf keys setup` ->
1274
+ `provider_keys.json`) shippeo en alpha.4 con tres consumers
1275
+ sin actualizar. Sumi parche alpha.5, alpha.7, alpha.8 cada
1276
+ una al consumer siguiente que el usuario tropezo. Pablo
1277
+ flageo el patron y pidio que Forge no lo cometa.
1278
+
1279
+ Esta seccion + el tool `forge_audit_consumers` + los tests
1280
+ `tests/fresh-user/byok-*.test.ts` son la respuesta. Ver
1281
+ `docs/GOTCHAS.md` entries G-2026-05-29 a/b/c.
1282
+
1283
+ ---
1284
+
1285
+ ## 15. Autonomia: Forge testea por si mismo
1286
+
1287
+ **Principio central (2026-05-31, Pablo lockeo):**
1288
+
1289
+ > "Menor friccion y ruido posible. El tiempo del user es para
1290
+ > juicio y decisiones, no para reproducir bugs o ejecutar
1291
+ > comandos."
1292
+
1293
+ Forge -- y el agente Sumi que opera Forge en sesion -- deben
1294
+ testear autonomamente todo lo que puedan, antes de pedirle al
1295
+ user que corra algo. Cada vez que el agente esta por preguntar
1296
+ "podes correr X y pegarme el output?", parar y reescribir como
1297
+ "voy a correr X yo, capturar output, diagnosticar".
1298
+
1299
+ ### 15.1 Que puede testear Forge solo
1300
+
1301
+ **CLI smoke tests:** correr `yf <cualquier comando>` directamente
1302
+ via shell. Capturar exit code + stdout + stderr.
1303
+
1304
+ **Browser-based UI (chat panel, voice loop, DevTools console):**
1305
+ levantar el servidor con `yf chat --no-open` y testear:
1306
+ - WebSocket: simular cliente con `ws` lib, mandar mensajes,
1307
+ inspeccionar respuestas.
1308
+ - Voice loop: capturar logs del proceso, no del DevTools (la
1309
+ consola del browser duplica lo que ya escribimos a stdout).
1310
+ - Playwright headless para clicks de UI cuando aplica.
1311
+
1312
+ **API endpoints:** curl / fetch directos contra:
1313
+ - Worker `yujin-hito4` deployado.
1314
+ - Chat server local.
1315
+ - Polar webhook (con stub firmado).
1316
+
1317
+ **End-to-end commerciales:** stub fixtures + correr el flow
1318
+ con HTTP fake. Sin esperar a que el user compre / pague /
1319
+ reciba email.
1320
+
1321
+ **Builds:** disparar el comando (`npm publish --dry-run`,
1322
+ `eas build`, `wrangler deploy`) y esperar el resultado.
1323
+
1324
+ **Logs runtime:** parsear `logs/forge.log` y `~/.yujin-forge/usage.jsonl`
1325
+ directamente.
1326
+
1327
+ ### 15.2 Cuando SI involucrar al user
1328
+
1329
+ Acciones que el agente fisicamente no puede hacer:
1330
+
1331
+ - **Touch hardware:** microfono real, camara real (la grabacion
1332
+ WebM sintetica se procesa distinto que un audio real con
1333
+ ruido ambiente, eco, codec).
1334
+ - **Juicio subjetivo:** "este copy suena natural?", "este
1335
+ layout queda bien?", "este precio te parece razonable?".
1336
+ - **Decisiones comerciales:** $$$, scope, lock-in con un
1337
+ proveedor, comprar credito de EAS / Anthropic / Polar.
1338
+ - **Acceso a infra externa con creds que solo el user tiene:**
1339
+ Polar dashboard manual, panel admin de GoDaddy, AWS root.
1340
+
1341
+ ### 15.3 Cuando NO involucrar al user
1342
+
1343
+ Anti-pattern: pedir al user que reproduzca un bug paso a paso.
1344
+
1345
+ - "Podes abrir el chat, hablar, y pegarme el log?" -> NO.
1346
+ Forge levanta el chat headless, simula audio, captura log.
1347
+ - "Podes correr `yf license sync --verbose`?" -> NO. Forge
1348
+ corre el comando, lee stdout, diagnostica.
1349
+ - "Podes verificar que aparecio `paid`?" -> NO. Forge lee
1350
+ `~/.yujin-forge/license.json` directo y verifica.
1351
+
1352
+ ### 15.4 Cuando el test autonomo NO es suficiente
1353
+
1354
+ Si despues del test autonomo el bug sigue apareciendo solo en
1355
+ la maquina del user (no en la del agente), entonces:
1356
+
1357
+ 1. Capturar **diff de ambiente** primero: node version, OS,
1358
+ shell, vars de env relevantes, contenido de
1359
+ `~/.yujin-forge/*`. El agente puede pedir esto via un
1360
+ comando `yf doctor --detailed` que vuelque todo.
1361
+ 2. Solo entonces pedir al user un paso especifico, con un
1362
+ comando exacto que produce un artifact concreto que el
1363
+ agente despues lee + diagnostica.
1364
+
1365
+ ### 15.5 Como Forge mismo aplica esta regla con sus users
1366
+
1367
+ Cuando un user instala Forge y le pide que diagnostique algo,
1368
+ Forge corre los tests + reporta el diagnostico. No le pide al
1369
+ user "podes correr X y pegarme el output".
1370
+
1371
+ Esto se manifiesta en:
1372
+ - El system prompt del chat shell (`buildSystemPrompt`)
1373
+ incluye la regla "test things yourself" como principio
1374
+ numero 1.
1375
+ - Los tools `forge_*` capturan logs autonomamente sin pedir
1376
+ al user.
1377
+ - Los flows del worker `yujin-hito4` corren los tests +
1378
+ devuelven el reporte; el user solo ve la conclusion.
1379
+
1380
+ ### 15.6 Origen historico
1381
+
1382
+ 2026-05-31: Pablo flageo que Sumi le pedia tests reproducibles
1383
+ (DevTools console, comandos CLI) que Sumi podia correr solo.
1384
+ Pablo nota: "no estare todo el dia. Aprovecha esa facilidad
1385
+ para optimizar mis tiempos."
1386
+
1387
+ Pablo despues extendio: "trasladalo a Forge, dado que es lo
1388
+ que pretendemos, menor friccion y ruido posible." Esta seccion
1389
+ + la actualizacion del system prompt son la respuesta.
1390
+
1391
+ ---
1392
+
1393
+ *Ultima revision: 2026-05-31 (adicion sec 15 -- autonomia).*
1394
+
1395
+ *Actualizar este archivo en el mismo commit que cualquier
1396
+ cambio de norma de calidad o entregable. Cambios sustanciales
1397
+ requieren acuerdo explicito de Pablo (mantenedor).*