agents-city 0.3.0-beta.21

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 (440) hide show
  1. package/.claude-plugin/marketplace.json +16 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +5 -0
  4. package/README.es.md +2021 -0
  5. package/README.md +1999 -0
  6. package/benchmarks/committee/README.md +39 -0
  7. package/benchmarks/committee/metrics.py +51 -0
  8. package/benchmarks/committee/run.py +64 -0
  9. package/benchmarks/committee/traces/01-single.json +8 -0
  10. package/benchmarks/committee/traces/02-mesh.json +16 -0
  11. package/benchmarks/committee/traces/03-chair.json +15 -0
  12. package/benchmarks/latency/README.md +35 -0
  13. package/benchmarks/latency/fake-claude-cli.mjs +119 -0
  14. package/benchmarks/latency/fake-native-server.mjs +340 -0
  15. package/benchmarks/latency/fake-tui.py +91 -0
  16. package/benchmarks/latency/live.py +380 -0
  17. package/benchmarks/stress/README.md +20 -0
  18. package/benchmarks/stress/run.py +487 -0
  19. package/bin/agents +4 -0
  20. package/bin/agents-city.js +116 -0
  21. package/bin/benchmark +17 -0
  22. package/bin/bus +6 -0
  23. package/bin/cities +3 -0
  24. package/bin/city +86 -0
  25. package/bin/committee +6 -0
  26. package/bin/demo +200 -0
  27. package/bin/exit +5 -0
  28. package/bin/hall +73 -0
  29. package/bin/hall.html +426 -0
  30. package/bin/logs +3 -0
  31. package/bin/report.py +14 -0
  32. package/bin/reset +3 -0
  33. package/bin/road +3 -0
  34. package/bin/seat +10 -0
  35. package/bin/serve.py +1428 -0
  36. package/bin/setup.py +753 -0
  37. package/bin/skills +3 -0
  38. package/bin/test +131 -0
  39. package/bin/test-adapter.py +183 -0
  40. package/bin/test-admision.py +99 -0
  41. package/bin/test-avatar.py +58 -0
  42. package/bin/test-benchmark.py +40 -0
  43. package/bin/test-broker.py +334 -0
  44. package/bin/test-cage.py +206 -0
  45. package/bin/test-card.py +402 -0
  46. package/bin/test-channel.py +379 -0
  47. package/bin/test-cities.py +453 -0
  48. package/bin/test-claude-runtime.py +252 -0
  49. package/bin/test-committee.py +340 -0
  50. package/bin/test-contracts.py +544 -0
  51. package/bin/test-crecimiento.py +164 -0
  52. package/bin/test-demo.py +308 -0
  53. package/bin/test-doctor.py +106 -0
  54. package/bin/test-domains.py +151 -0
  55. package/bin/test-evidencia.py +50 -0
  56. package/bin/test-exit.py +128 -0
  57. package/bin/test-hall-protocol.py +93 -0
  58. package/bin/test-launch.py +169 -0
  59. package/bin/test-live-feed.py +508 -0
  60. package/bin/test-pairing.py +99 -0
  61. package/bin/test-parcels.py +283 -0
  62. package/bin/test-runtime-failures.py +252 -0
  63. package/bin/test-runtime-ui.py +488 -0
  64. package/bin/test-runtime.py +268 -0
  65. package/bin/test-rutas.py +80 -0
  66. package/bin/test-seat.py +1386 -0
  67. package/bin/test-security.py +150 -0
  68. package/bin/test-serve.py +1057 -0
  69. package/bin/test-stress.py +64 -0
  70. package/bin/test-widgets.py +143 -0
  71. package/bin/test-workspace.py +188 -0
  72. package/bin/testlib.py +95 -0
  73. package/bin/tokens.py +14 -0
  74. package/bus/scripts/deploy.sh +60 -0
  75. package/bus/scripts/mint-token.sh +68 -0
  76. package/bus/scripts/setup-dev.sh +79 -0
  77. package/bus/scripts/test-channel.ts +8 -0
  78. package/bus/scripts/test-hub.ts +266 -0
  79. package/bus/scripts/test-local.sh +40 -0
  80. package/bus/scripts/test-queue.ts +132 -0
  81. package/bus/worker/package-lock.json +1971 -0
  82. package/bus/worker/package.json +17 -0
  83. package/bus/worker/src/index.ts +485 -0
  84. package/bus/worker/tsconfig.json +13 -0
  85. package/bus/worker/wrangler.toml +32 -0
  86. package/city/oven/README.md +59 -0
  87. package/city/oven/collect.py +43 -0
  88. package/city/oven/oven.html +4 -0
  89. package/city/scripts/history.py +120 -0
  90. package/city/scripts/seed.py +442 -0
  91. package/city/web/assets/modelos/License.txt +28 -0
  92. package/city/web/assets/modelos/PROCEDENCIA.txt +3 -0
  93. package/city/web/assets/modelos/building-a.glb +0 -0
  94. package/city/web/assets/modelos/building-b.glb +0 -0
  95. package/city/web/assets/modelos/building-c.glb +0 -0
  96. package/city/web/assets/modelos/building-d.glb +0 -0
  97. package/city/web/assets/modelos/building-e.glb +0 -0
  98. package/city/web/assets/modelos/building-f.glb +0 -0
  99. package/city/web/assets/modelos/building-g.glb +0 -0
  100. package/city/web/assets/modelos/building-h.glb +0 -0
  101. package/city/web/assets/sprites/building-a.png +0 -0
  102. package/city/web/assets/sprites/building-b.png +0 -0
  103. package/city/web/assets/sprites/building-c.png +0 -0
  104. package/city/web/assets/sprites/building-d.png +0 -0
  105. package/city/web/assets/sprites/building-e.png +0 -0
  106. package/city/web/assets/sprites/building-f.png +0 -0
  107. package/city/web/assets/sprites/building-g.png +0 -0
  108. package/city/web/assets/sprites/building-h.png +0 -0
  109. package/city/web/assets/sprites/building-i.png +0 -0
  110. package/city/web/assets/sprites/building-j.png +0 -0
  111. package/city/web/assets/sprites/building-k.png +0 -0
  112. package/city/web/assets/sprites/building-l.png +0 -0
  113. package/city/web/assets/sprites/building-m.png +0 -0
  114. package/city/web/assets/sprites/building-n.png +0 -0
  115. package/city/web/assets/sprites/building-skyscraper-a.png +0 -0
  116. package/city/web/assets/sprites/building-skyscraper-b.png +0 -0
  117. package/city/web/assets/sprites/building-skyscraper-c.png +0 -0
  118. package/city/web/assets/sprites/building-skyscraper-d.png +0 -0
  119. package/city/web/assets/sprites/building-skyscraper-e.png +0 -0
  120. package/city/web/assets/sprites/catalogo.json +47 -0
  121. package/city/web/assets/sprites/detail-awning-wide.png +0 -0
  122. package/city/web/assets/sprites/detail-awning.png +0 -0
  123. package/city/web/assets/sprites/detail-overhang-wide.png +0 -0
  124. package/city/web/assets/sprites/detail-overhang.png +0 -0
  125. package/city/web/assets/sprites/detail-parasol-a.png +0 -0
  126. package/city/web/assets/sprites/detail-parasol-b.png +0 -0
  127. package/city/web/assets/sprites/low-detail-building-a.png +0 -0
  128. package/city/web/assets/sprites/low-detail-building-b.png +0 -0
  129. package/city/web/assets/sprites/low-detail-building-c.png +0 -0
  130. package/city/web/assets/sprites/low-detail-building-d.png +0 -0
  131. package/city/web/assets/sprites/low-detail-building-e.png +0 -0
  132. package/city/web/assets/sprites/low-detail-building-f.png +0 -0
  133. package/city/web/assets/sprites/low-detail-building-g.png +0 -0
  134. package/city/web/assets/sprites/low-detail-building-h.png +0 -0
  135. package/city/web/assets/sprites/low-detail-building-i.png +0 -0
  136. package/city/web/assets/sprites/low-detail-building-j.png +0 -0
  137. package/city/web/assets/sprites/low-detail-building-k.png +0 -0
  138. package/city/web/assets/sprites/low-detail-building-l.png +0 -0
  139. package/city/web/assets/sprites/low-detail-building-m.png +0 -0
  140. package/city/web/assets/sprites/low-detail-building-n.png +0 -0
  141. package/city/web/assets/sprites/low-detail-building-wide-a.png +0 -0
  142. package/city/web/assets/sprites/low-detail-building-wide-b.png +0 -0
  143. package/city/web/assets/sprites/medidas.json +248 -0
  144. package/city/web/dist/city.js +939 -0
  145. package/city/web/dist/index.html +294 -0
  146. package/city/web/dist/modelos/License.txt +28 -0
  147. package/city/web/dist/modelos/PROCEDENCIA.txt +3 -0
  148. package/city/web/dist/modelos/building-a.glb +0 -0
  149. package/city/web/dist/modelos/building-b.glb +0 -0
  150. package/city/web/dist/modelos/building-c.glb +0 -0
  151. package/city/web/dist/modelos/building-d.glb +0 -0
  152. package/city/web/dist/modelos/building-e.glb +0 -0
  153. package/city/web/dist/modelos/building-f.glb +0 -0
  154. package/city/web/dist/modelos/building-g.glb +0 -0
  155. package/city/web/dist/modelos/building-h.glb +0 -0
  156. package/city/web/dist/sprites/building-a.png +0 -0
  157. package/city/web/dist/sprites/building-b.png +0 -0
  158. package/city/web/dist/sprites/building-c.png +0 -0
  159. package/city/web/dist/sprites/building-d.png +0 -0
  160. package/city/web/dist/sprites/building-e.png +0 -0
  161. package/city/web/dist/sprites/building-f.png +0 -0
  162. package/city/web/dist/sprites/building-g.png +0 -0
  163. package/city/web/dist/sprites/building-h.png +0 -0
  164. package/city/web/dist/sprites/building-i.png +0 -0
  165. package/city/web/dist/sprites/building-j.png +0 -0
  166. package/city/web/dist/sprites/building-k.png +0 -0
  167. package/city/web/dist/sprites/building-l.png +0 -0
  168. package/city/web/dist/sprites/building-m.png +0 -0
  169. package/city/web/dist/sprites/building-n.png +0 -0
  170. package/city/web/dist/sprites/building-skyscraper-a.png +0 -0
  171. package/city/web/dist/sprites/building-skyscraper-b.png +0 -0
  172. package/city/web/dist/sprites/building-skyscraper-c.png +0 -0
  173. package/city/web/dist/sprites/building-skyscraper-d.png +0 -0
  174. package/city/web/dist/sprites/building-skyscraper-e.png +0 -0
  175. package/city/web/dist/sprites/catalogo.json +47 -0
  176. package/city/web/dist/sprites/detail-awning-wide.png +0 -0
  177. package/city/web/dist/sprites/detail-awning.png +0 -0
  178. package/city/web/dist/sprites/detail-overhang-wide.png +0 -0
  179. package/city/web/dist/sprites/detail-overhang.png +0 -0
  180. package/city/web/dist/sprites/detail-parasol-a.png +0 -0
  181. package/city/web/dist/sprites/detail-parasol-b.png +0 -0
  182. package/city/web/dist/sprites/low-detail-building-a.png +0 -0
  183. package/city/web/dist/sprites/low-detail-building-b.png +0 -0
  184. package/city/web/dist/sprites/low-detail-building-c.png +0 -0
  185. package/city/web/dist/sprites/low-detail-building-d.png +0 -0
  186. package/city/web/dist/sprites/low-detail-building-e.png +0 -0
  187. package/city/web/dist/sprites/low-detail-building-f.png +0 -0
  188. package/city/web/dist/sprites/low-detail-building-g.png +0 -0
  189. package/city/web/dist/sprites/low-detail-building-h.png +0 -0
  190. package/city/web/dist/sprites/low-detail-building-i.png +0 -0
  191. package/city/web/dist/sprites/low-detail-building-j.png +0 -0
  192. package/city/web/dist/sprites/low-detail-building-k.png +0 -0
  193. package/city/web/dist/sprites/low-detail-building-l.png +0 -0
  194. package/city/web/dist/sprites/low-detail-building-m.png +0 -0
  195. package/city/web/dist/sprites/low-detail-building-n.png +0 -0
  196. package/city/web/dist/sprites/low-detail-building-wide-a.png +0 -0
  197. package/city/web/dist/sprites/low-detail-building-wide-b.png +0 -0
  198. package/city/web/dist/sprites/medidas.json +248 -0
  199. package/city/web/dist-hall/hall.js +264 -0
  200. package/city/web/index.html +294 -0
  201. package/city/web/package.json +18 -0
  202. package/city/web/sella.py +21 -0
  203. package/city/web/src/activity-actors.ts +47 -0
  204. package/city/web/src/activity.ts +172 -0
  205. package/city/web/src/ayuntamiento.ts +580 -0
  206. package/city/web/src/draw.ts +640 -0
  207. package/city/web/src/game-speech.ts +79 -0
  208. package/city/web/src/hall.ts +1867 -0
  209. package/city/web/src/main.ts +2225 -0
  210. package/city/web/src/oven.ts +124 -0
  211. package/city/web/src/people.ts +244 -0
  212. package/city/web/src/presencia.ts +193 -0
  213. package/city/web/src/puertas.ts +180 -0
  214. package/city/web/src/repo-roles.ts +59 -0
  215. package/city/worker/package.json +16 -0
  216. package/city/worker/schema.sql +117 -0
  217. package/city/worker/src/index.ts +702 -0
  218. package/city/worker/src/square.ts +218 -0
  219. package/city/worker/wrangler.toml +58 -0
  220. package/demo/ada.md +50 -0
  221. package/demo/bruno.md +62 -0
  222. package/demo/camila.md +56 -0
  223. package/demo/city/ada.md +40 -0
  224. package/demo/city/city.yml +8 -0
  225. package/demo/city/parcels.yml +15 -0
  226. package/demo/city/roads.json +4 -0
  227. package/demo/city/units.yml +10 -0
  228. package/demo/clinica/city.yml +8 -0
  229. package/demo/clinica/parcels.yml +15 -0
  230. package/demo/clinica/roads.json +4 -0
  231. package/demo/clinica/units.yml +9 -0
  232. package/demo/clinica/vera.md +46 -0
  233. package/demo/dante.md +54 -0
  234. package/demo/despacho/city.yml +8 -0
  235. package/demo/despacho/marta.md +46 -0
  236. package/demo/despacho/parcels.yml +15 -0
  237. package/demo/despacho/roads.json +4 -0
  238. package/demo/despacho/units.yml +9 -0
  239. package/demo/elsa.md +50 -0
  240. package/demo/farid.md +52 -0
  241. package/demo/greta.md +50 -0
  242. package/demo/hugo.md +49 -0
  243. package/demo/iris.md +49 -0
  244. package/demo/jonas.md +51 -0
  245. package/demo/kira.md +51 -0
  246. package/demo/luca.md +49 -0
  247. package/demo/parcels.yml +92 -0
  248. package/demo/seed.py +20 -0
  249. package/demo/show.py +161 -0
  250. package/demo/stories.py +824 -0
  251. package/demo/units.yml +33 -0
  252. package/docs/agents-first.md +99 -0
  253. package/docs/glossary.md +55 -0
  254. package/docs/map-live-layers.md +73 -0
  255. package/docs/security.md +231 -0
  256. package/docs/self-host.md +151 -0
  257. package/docs/testing.md +205 -0
  258. package/package.json +73 -0
  259. package/plugin/.claude-plugin/plugin.json +62 -0
  260. package/plugin/.mcp.json +15 -0
  261. package/plugin/channel/activity-cli.ts +16 -0
  262. package/plugin/channel/adapter-prompts.ts +113 -0
  263. package/plugin/channel/adapter.js +4292 -0
  264. package/plugin/channel/adapter.ts +133 -0
  265. package/plugin/channel/bus.js +20188 -0
  266. package/plugin/channel/bus.ts +131 -0
  267. package/plugin/channel/city-config.ts +125 -0
  268. package/plugin/channel/claude-channel.ts +58 -0
  269. package/plugin/channel/cli-args.ts +75 -0
  270. package/plugin/channel/client.js +4200 -0
  271. package/plugin/channel/client.ts +38 -0
  272. package/plugin/channel/committee/activity.ts +256 -0
  273. package/plugin/channel/committee/collection.ts +154 -0
  274. package/plugin/channel/committee/decision.ts +175 -0
  275. package/plugin/channel/committee/floor.ts +135 -0
  276. package/plugin/channel/committee/guards.ts +30 -0
  277. package/plugin/channel/committee/history.ts +38 -0
  278. package/plugin/channel/committee/render.ts +102 -0
  279. package/plugin/channel/committee/service.ts +72 -0
  280. package/plugin/channel/committee/storage.ts +92 -0
  281. package/plugin/channel/committee/types.ts +163 -0
  282. package/plugin/channel/committee/view.ts +63 -0
  283. package/plugin/channel/committee-cli.ts +109 -0
  284. package/plugin/channel/delivery-metrics.ts +61 -0
  285. package/plugin/channel/delivery-queue.ts +118 -0
  286. package/plugin/channel/hub/activity-controller.ts +72 -0
  287. package/plugin/channel/hub/activity-feed.ts +169 -0
  288. package/plugin/channel/hub/committee-controller.ts +60 -0
  289. package/plugin/channel/hub/connections.ts +48 -0
  290. package/plugin/channel/hub/diagnostics.ts +67 -0
  291. package/plugin/channel/hub/envelope-validity.ts +109 -0
  292. package/plugin/channel/hub/envelopes.ts +66 -0
  293. package/plugin/channel/hub/lifecycle.ts +91 -0
  294. package/plugin/channel/hub/local-roads.ts +89 -0
  295. package/plugin/channel/hub/remote-roads.ts +165 -0
  296. package/plugin/channel/hub/road-controller.ts +99 -0
  297. package/plugin/channel/hub-client.ts +149 -0
  298. package/plugin/channel/local-hub.js +5995 -0
  299. package/plugin/channel/local-hub.ts +349 -0
  300. package/plugin/channel/map-reporter.ts +48 -0
  301. package/plugin/channel/package-lock.json +1731 -0
  302. package/plugin/channel/package.json +19 -0
  303. package/plugin/channel/protocol.ts +98 -0
  304. package/plugin/channel/road-cli.ts +18 -0
  305. package/plugin/channel/run.sh +15 -0
  306. package/plugin/channel/runtime/claude.ts +458 -0
  307. package/plugin/channel/runtime/codex-config.ts +77 -0
  308. package/plugin/channel/runtime/codex.ts +669 -0
  309. package/plugin/channel/runtime/command.ts +62 -0
  310. package/plugin/channel/runtime/factory.ts +15 -0
  311. package/plugin/channel/runtime/json-rpc.ts +154 -0
  312. package/plugin/channel/runtime/kimi.ts +277 -0
  313. package/plugin/channel/runtime/opencode.ts +248 -0
  314. package/plugin/channel/runtime/process.ts +84 -0
  315. package/plugin/channel/runtime/types.ts +45 -0
  316. package/plugin/channel/runtime-files.ts +73 -0
  317. package/plugin/channel/runtime-gateway.js +6396 -0
  318. package/plugin/channel/runtime-gateway.ts +358 -0
  319. package/plugin/channel/runtime-metrics.ts +52 -0
  320. package/plugin/channel/runtime-subscription.ts +180 -0
  321. package/plugin/channel/terminal-delivery.ts +131 -0
  322. package/plugin/channel/untrusted.ts +60 -0
  323. package/plugin/commands/committee.md +31 -0
  324. package/plugin/commands/exit.md +32 -0
  325. package/plugin/commands/goals.md +20 -0
  326. package/plugin/commands/join.md +18 -0
  327. package/plugin/commands/notice.md +20 -0
  328. package/plugin/commands/propose.md +19 -0
  329. package/plugin/commands/round.md +17 -0
  330. package/plugin/commands/session.md +22 -0
  331. package/plugin/commands/settings.md +25 -0
  332. package/plugin/commands/setup.md +21 -0
  333. package/plugin/commands/team.md +23 -0
  334. package/plugin/domains/custom.md +27 -0
  335. package/plugin/domains/finance.md +31 -0
  336. package/plugin/domains/healthcare.md +34 -0
  337. package/plugin/domains/legal.md +31 -0
  338. package/plugin/domains/marketing.md +33 -0
  339. package/plugin/domains/operations.md +31 -0
  340. package/plugin/domains/research.md +32 -0
  341. package/plugin/domains/sales.md +30 -0
  342. package/plugin/domains/software.md +37 -0
  343. package/plugin/hooks/activity.sh +6 -0
  344. package/plugin/hooks/digging.sh +68 -0
  345. package/plugin/hooks/growth.sh +42 -0
  346. package/plugin/hooks/hooks.json +106 -0
  347. package/plugin/hooks/notice-on-pr.sh +35 -0
  348. package/plugin/hooks/notice-on-stop.sh +80 -0
  349. package/plugin/hooks/notice-pending.sh +58 -0
  350. package/plugin/hooks/solo-en-ciudad.sh +23 -0
  351. package/plugin/hooks/tokens.sh +47 -0
  352. package/plugin/roles/examples/account-executive.md +25 -0
  353. package/plugin/roles/examples/ai-manager.md +34 -0
  354. package/plugin/roles/examples/associate.md +24 -0
  355. package/plugin/roles/examples/brand-lead.md +20 -0
  356. package/plugin/roles/examples/cfo.md +20 -0
  357. package/plugin/roles/examples/city-lead.md +25 -0
  358. package/plugin/roles/examples/clinical-director.md +26 -0
  359. package/plugin/roles/examples/clinical-ops.md +25 -0
  360. package/plugin/roles/examples/clinician.md +25 -0
  361. package/plugin/roles/examples/compliance.md +27 -0
  362. package/plugin/roles/examples/content.md +24 -0
  363. package/plugin/roles/examples/controller.md +27 -0
  364. package/plugin/roles/examples/cpto.md +41 -0
  365. package/plugin/roles/examples/customer-success.md +25 -0
  366. package/plugin/roles/examples/data-engineer.md +37 -0
  367. package/plugin/roles/examples/data.md +60 -0
  368. package/plugin/roles/examples/dev.md +37 -0
  369. package/plugin/roles/examples/devops.md +39 -0
  370. package/plugin/roles/examples/enablement.md +24 -0
  371. package/plugin/roles/examples/ethics.md +24 -0
  372. package/plugin/roles/examples/fin-analytics.md +27 -0
  373. package/plugin/roles/examples/health-compliance.md +25 -0
  374. package/plugin/roles/examples/health-data.md +26 -0
  375. package/plugin/roles/examples/knowledge.md +25 -0
  376. package/plugin/roles/examples/lifecycle.md +26 -0
  377. package/plugin/roles/examples/llm-engineer.md +34 -0
  378. package/plugin/roles/examples/managing-partner.md +20 -0
  379. package/plugin/roles/examples/methods.md +23 -0
  380. package/plugin/roles/examples/operations-lead.md +23 -0
  381. package/plugin/roles/examples/ops.md +24 -0
  382. package/plugin/roles/examples/patient-safety.md +26 -0
  383. package/plugin/roles/examples/performance.md +27 -0
  384. package/plugin/roles/examples/po.md +36 -0
  385. package/plugin/roles/examples/process-owner.md +23 -0
  386. package/plugin/roles/examples/product-design.md +39 -0
  387. package/plugin/roles/examples/program-manager.md +24 -0
  388. package/plugin/roles/examples/quality.md +25 -0
  389. package/plugin/roles/examples/research-director.md +24 -0
  390. package/plugin/roles/examples/research-ops.md +25 -0
  391. package/plugin/roles/examples/researcher.md +25 -0
  392. package/plugin/roles/examples/revenue-lead.md +25 -0
  393. package/plugin/roles/examples/revops.md +26 -0
  394. package/plugin/roles/examples/seo.md +27 -0
  395. package/plugin/roles/examples/specialist.md +24 -0
  396. package/plugin/scripts/admision.py +165 -0
  397. package/plugin/scripts/apaga.py +232 -0
  398. package/plugin/scripts/avatar.py +211 -0
  399. package/plugin/scripts/broker.py +531 -0
  400. package/plugin/scripts/cage.py +252 -0
  401. package/plugin/scripts/capabilities.py +197 -0
  402. package/plugin/scripts/card.py +312 -0
  403. package/plugin/scripts/cities.py +520 -0
  404. package/plugin/scripts/city-env.sh +90 -0
  405. package/plugin/scripts/city-runtime.sh +87 -0
  406. package/plugin/scripts/city-session.sh +526 -0
  407. package/plugin/scripts/city_env.py +67 -0
  408. package/plugin/scripts/crecimiento.py +140 -0
  409. package/plugin/scripts/deliberations.py +48 -0
  410. package/plugin/scripts/doctor.py +172 -0
  411. package/plugin/scripts/domains.py +201 -0
  412. package/plugin/scripts/evidencia.py +64 -0
  413. package/plugin/scripts/find-repos.sh +111 -0
  414. package/plugin/scripts/gh.py +159 -0
  415. package/plugin/scripts/hall_protocol.py +147 -0
  416. package/plugin/scripts/hook_activity.py +139 -0
  417. package/plugin/scripts/launch.py +94 -0
  418. package/plugin/scripts/logs.py +98 -0
  419. package/plugin/scripts/pairing.py +185 -0
  420. package/plugin/scripts/parcels.py +132 -0
  421. package/plugin/scripts/read-card.py +51 -0
  422. package/plugin/scripts/report.py +201 -0
  423. package/plugin/scripts/reset.py +180 -0
  424. package/plugin/scripts/roads.py +230 -0
  425. package/plugin/scripts/roles.py +274 -0
  426. package/plugin/scripts/runtime_log.py +69 -0
  427. package/plugin/scripts/runtime_processes.py +132 -0
  428. package/plugin/scripts/rutas.py +83 -0
  429. package/plugin/scripts/seat.py +1349 -0
  430. package/plugin/scripts/tokens.py +194 -0
  431. package/plugin/scripts/trust-repos.py +59 -0
  432. package/plugin/scripts/ui.py +280 -0
  433. package/plugin/scripts/units.py +80 -0
  434. package/plugin/scripts/workspace.py +364 -0
  435. package/plugin/skills/city/SKILL.md +191 -0
  436. package/templates/blank.md +39 -0
  437. package/templates/finance.md +44 -0
  438. package/templates/legal.md +45 -0
  439. package/templates/marketing.md +48 -0
  440. package/templates/product.md +45 -0
@@ -0,0 +1,824 @@
1
+ """The guided committees, one per domain — written for people, not programmers.
2
+
3
+ Each story is real chaos anybody recognises: losing what you had saved, a
4
+ waiting room double-booked, a legal deadline at nine tomorrow. The turns cross
5
+ the same authenticated bus and the same committee state machine as a real
6
+ city; only the words are scripted. Every story deliberately walks the WHOLE
7
+ machine, including the part demos usually hide: the first plan FAILS its
8
+ verification, the chair replans, and only the corrected plan closes.
9
+
10
+ Data only. `show.py` interprets it; `serve.py` lists it; the fixtures under
11
+ `demo/` give each story a city whose agents carry its domain's names.
12
+ """
13
+
14
+ STORIES = {
15
+ # ── software: Aurora Games — the night the saved games vanished ─────────
16
+ "software": {
17
+ "city": "city",
18
+ "title": "La noche en que desaparecieron las partidas",
19
+ "turns": [
20
+ {
21
+ "verbo": "open",
22
+ "payload": {
23
+ "question": "¿Qué hacemos con las partidas que desaparecieron el sábado?",
24
+ "desiredOutcome": (
25
+ "Que cada persona afectada recupere lo suyo, y saber qué contamos "
26
+ "públicamente y cuándo."
27
+ ),
28
+ "context": (
29
+ "Desde el sábado por la noche hay jugadores que abren el juego y su "
30
+ "partida no está. Soporte acumula cientos de mensajes y todavía no "
31
+ "sabemos ni cuánta gente es ni por qué pasa."
32
+ ),
33
+ "constraints": [
34
+ "Nadie puede perder lo suyo dos veces",
35
+ "No contar públicamente nada que no sepamos seguro",
36
+ ],
37
+ "definitionOfDone": [
38
+ "Cada cuenta afectada tiene un camino para recuperar su partida",
39
+ "Mensaje público con hora y explicación honesta",
40
+ ],
41
+ "authority": "decide",
42
+ "participants": ["nova", "store-service", "telemetry-collector"],
43
+ "maxRebuttals": 2,
44
+ },
45
+ },
46
+ {
47
+ "verbo": "respond",
48
+ "actor": "nova",
49
+ "payload": {
50
+ "stance": "support",
51
+ "recommendation": (
52
+ "Lo primero es la gente: congelar la actualización del viernes y "
53
+ "decir hoy mismo, en público, que lo sabemos y estamos en ello."
54
+ ),
55
+ "evidence": [
56
+ "412 mensajes en soporte y subiendo",
57
+ "Una madre escribió: su hijo perdió seis meses de partida y no deja "
58
+ "de llorar",
59
+ ],
60
+ "expectedImpact": "La gente aguanta un fallo; no aguanta el silencio",
61
+ "visibleWhen": "En cuanto publiquemos el primer mensaje",
62
+ "withdrawIf": "Aparece una causa distinta a la actualización",
63
+ "risks": ["Prometer una hora y no llegar"],
64
+ },
65
+ },
66
+ {
67
+ "verbo": "respond",
68
+ "actor": "store-service",
69
+ "payload": {
70
+ "stance": "conditional",
71
+ "recommendation": (
72
+ "Nadie ha entrado a robar nada: no es un ataque. El viernes cambiamos "
73
+ "cómo se guardan las partidas sin dejar puerta de vuelta. Propongo "
74
+ "recuperar las copias de la noche del jueves antes de tocar nada más."
75
+ ),
76
+ "evidence": [
77
+ "Las copias del jueves por la noche están completas y verificadas",
78
+ "Ningún acceso extraño en todo el fin de semana",
79
+ ],
80
+ "expectedImpact": "Recuperar lo perdido sin inventar nada",
81
+ "visibleWhen": "Al restaurar la primera tanda",
82
+ "withdrawIf": "Alguna copia del jueves resulta estar dañada",
83
+ "risks": ["Restaurar borra lo que se jugó después del jueves"],
84
+ },
85
+ },
86
+ {
87
+ "verbo": "respond",
88
+ "actor": "telemetry-collector",
89
+ "payload": {
90
+ "stance": "conditional",
91
+ "recommendation": (
92
+ "Antes de decidir, contar bien a cuánta gente le pasa y a quién. No "
93
+ "es todo el mundo: es una franja concreta, y eso dice dónde mirar."
94
+ ),
95
+ "evidence": [
96
+ "3.804 cuentas afectadas por ahora",
97
+ "Casi todas jugaron el sábado entre las 22h y la 1h",
98
+ ],
99
+ "expectedImpact": "Avisar a los afectados directamente, no a bulto",
100
+ "visibleWhen": "Con la lista de cuentas en la mano",
101
+ "withdrawIf": "La franja crece fuera del sábado noche",
102
+ "unknowns": ["Cuántos afectados aún no han abierto el juego y no lo saben"],
103
+ },
104
+ },
105
+ {
106
+ "verbo": "synthesize",
107
+ "payload": {
108
+ "summary": (
109
+ "Los tres coinciden: no es un ataque, viene del cambio del viernes y "
110
+ "hay copias del jueves. La discusión es el orden: ¿avisamos primero "
111
+ "o restauramos primero?"
112
+ ),
113
+ "agreements": [
114
+ "No es un ataque",
115
+ "La causa es el cambio del viernes",
116
+ "Hay copias del jueves por la noche",
117
+ ],
118
+ "conflicts": ["Avisar primero o restaurar primero"],
119
+ "unknowns": ["Afectados que aún no lo saben"],
120
+ },
121
+ },
122
+ {
123
+ "verbo": "palabra",
124
+ "actor": "nova",
125
+ "peticion": {
126
+ "basis": "new_evidence",
127
+ "reason": "Esto acaba de dejar de ser solo un problema técnico.",
128
+ "evidence": [
129
+ "Un streamer con dos millones de seguidores acaba de subir un vídeo "
130
+ "enseñando su partida vacía"
131
+ ],
132
+ },
133
+ "respuesta": {
134
+ "claim": (
135
+ "Si restauramos sin avisar y alguien pierde lo que jugó el domingo, el "
136
+ "enfado será doble. Primero el aviso con hora, después la restauración."
137
+ ),
138
+ "evidence": ["El vídeo lleva 40.000 visitas en una hora"],
139
+ "consequence": "El mensaje público pasa a ser lo más urgente de la lista.",
140
+ },
141
+ },
142
+ {
143
+ "verbo": "palabra",
144
+ "actor": "store-service",
145
+ "peticion": {
146
+ "basis": "risk",
147
+ "reason": "Restaurar tal cual tiene un precio que nadie ha dicho en voz alta.",
148
+ "evidence": [
149
+ "La copia es del jueves; lo jugado el viernes y el sábado no "
150
+ "está en ella"
151
+ ],
152
+ },
153
+ "respuesta": {
154
+ "claim": (
155
+ "Antes de restaurar hay que guardar aparte todo lo del fin de semana, "
156
+ "aunque tardemos dos horas más. Nadie pierde nada dos veces."
157
+ ),
158
+ "evidence": ["Guardar aparte las 3.804 cuentas lleva unas dos horas"],
159
+ "consequence": "La restauración se retrasa dos horas y se vuelve segura.",
160
+ },
161
+ },
162
+ {
163
+ "verbo": "decide",
164
+ "payload": {
165
+ "outcome": (
166
+ "A las 17h, mensaje público contando qué pasó y qué vamos a hacer. A "
167
+ "las 18h, guardar aparte todo lo del fin de semana. A las 20h, "
168
+ "restaurar las copias del jueves. Nadie pierde nada dos veces."
169
+ ),
170
+ "rationale": (
171
+ "Primero la confianza, después la restauración segura: las tres "
172
+ "posiciones caben en ese orden."
173
+ ),
174
+ "owner": "Ada",
175
+ "executor": "store-service",
176
+ "verifier": "telemetry-collector",
177
+ "verificationQuestion": (
178
+ "¿Tiene cada cuenta afectada un camino real para recuperar su partida?"
179
+ ),
180
+ "selectedEvidence": [
181
+ "Copias del jueves verificadas",
182
+ "Lista de 3.804 cuentas afectadas",
183
+ "Vídeo del streamer",
184
+ ],
185
+ "decisiveContributors": ["nova", "store-service", "telemetry-collector"],
186
+ "rejectedOptions": ["Restaurar en silencio y explicar después"],
187
+ "reopenIf": ["Aparecen afectados fuera de la franja del sábado"],
188
+ },
189
+ },
190
+ {
191
+ "verbo": "verify",
192
+ "actor": "telemetry-collector",
193
+ "payload": {
194
+ "result": "fail",
195
+ "evidence": [
196
+ "71 cuentas de la franja empezaron a jugar el viernes: no existen en "
197
+ "la copia del jueves"
198
+ ],
199
+ "checks": [
200
+ "Cruce de la lista de afectados contra las copias del jueves",
201
+ "Para 71 personas el plan no recupera nada",
202
+ ],
203
+ "residualRisks": ["Son precisamente los jugadores más nuevos"],
204
+ },
205
+ },
206
+ {
207
+ "verbo": "replan",
208
+ "payload": {
209
+ "reason": (
210
+ "El plan deja fuera a 71 personas que empezaron después de la copia. "
211
+ "Un plan que recupera a casi todos no es un plan: se replantea."
212
+ )
213
+ },
214
+ },
215
+ {
216
+ "verbo": "synthesize",
217
+ "payload": {
218
+ "summary": (
219
+ "El plan general sigue en pie; las 71 cuentas nuevas necesitan un "
220
+ "trato aparte: contacto directo y reconstrucción con lo que sí tenemos."
221
+ ),
222
+ "agreements": ["Mantener horario de aviso y restauración"],
223
+ "conflicts": [],
224
+ "unknowns": ["Cuánto se puede reconstruir de cada cuenta nueva"],
225
+ },
226
+ },
227
+ {
228
+ "verbo": "decide",
229
+ "payload": {
230
+ "outcome": (
231
+ "El mismo plan, más un equipo dedicado a las 71 cuentas nuevas: "
232
+ "contacto personal, compensación y reconstrucción manual de su "
233
+ "progreso con los registros del fin de semana."
234
+ ),
235
+ "rationale": "Nadie se queda fuera por haber llegado el último.",
236
+ "owner": "Ada",
237
+ "executor": "store-service",
238
+ "verifier": "telemetry-collector",
239
+ "verificationQuestion": (
240
+ "¿Tiene TODO el mundo — incluidas las 71 cuentas nuevas — un camino real?"
241
+ ),
242
+ "selectedEvidence": [
243
+ "Registros del fin de semana disponibles para "
244
+ "reconstrucción"
245
+ ],
246
+ "decisiveContributors": ["telemetry-collector", "store-service"],
247
+ "rejectedOptions": ["Compensar a las 71 cuentas solo con saldo"],
248
+ "reopenIf": ["La reconstrucción manual no llega en 48 horas"],
249
+ },
250
+ },
251
+ {
252
+ "verbo": "verify",
253
+ "actor": "telemetry-collector",
254
+ "payload": {
255
+ "result": "pass",
256
+ "evidence": [
257
+ "Prueba con 50 cuentas piloto: todas recuperan su partida",
258
+ "Las 71 cuentas nuevas contactadas una a una; 68 ya respondieron",
259
+ ],
260
+ "checks": [
261
+ "Restauración probada antes de la hora anunciada",
262
+ "Mensaje público revisado y con hora concreta",
263
+ ],
264
+ "residualRisks": ["Vigilar la franja del sábado durante una semana"],
265
+ },
266
+ },
267
+ {
268
+ "verbo": "close",
269
+ "payload": {
270
+ "summary": (
271
+ "Partidas restauradas, mensaje publicado a su hora y las 71 cuentas "
272
+ "nuevas con seguimiento personal."
273
+ ),
274
+ "learnings": [
275
+ "Nunca más un cambio en el guardado sin puerta de vuelta",
276
+ "El silencio enfada más que el fallo",
277
+ ],
278
+ "followups": ["Revisar en una semana que ninguna cuenta reabrió queja"],
279
+ },
280
+ },
281
+ ],
282
+ },
283
+ # ── medicina: Clínica Alba — the morning the appointments doubled ───────
284
+ "medicina": {
285
+ "city": "clinica",
286
+ "title": "La mañana de las citas duplicadas",
287
+ "turns": [
288
+ {
289
+ "verbo": "open",
290
+ "payload": {
291
+ "question": "¿Cómo atendemos hoy a las 60 personas citadas a la misma hora?",
292
+ "desiredOutcome": (
293
+ "Que nadie con algo urgente se vaya sin ver a un médico, y que "
294
+ "quien deba volver salga con una cita real en la mano."
295
+ ),
296
+ "context": (
297
+ "El sistema de citas duplicó la agenda de esta mañana: hay 60 "
298
+ "personas en una sala de espera de 25, algunas mayores y de pie. "
299
+ "Entre ellas, una paciente crónica que viene solo a por su receta."
300
+ ),
301
+ "constraints": [
302
+ "Nadie urgente se va sin ser visto",
303
+ "A nadie se le dice 'vuelva usted mañana' sin cita concreta",
304
+ ],
305
+ "definitionOfDone": [
306
+ "Sala de espera por debajo del aforo antes de mediodía",
307
+ "Cada persona reprogramada con día y hora, no con promesas",
308
+ ],
309
+ "authority": "decide",
310
+ "participants": ["urgencias", "laboratorio", "farmacia"],
311
+ "maxRebuttals": 2,
312
+ },
313
+ },
314
+ {
315
+ "verbo": "respond",
316
+ "actor": "urgencias",
317
+ "payload": {
318
+ "stance": "support",
319
+ "recommendation": (
320
+ "Triaje en la puerta ahora mismo: una enfermera pregunta a cada "
321
+ "persona qué le pasa y separa lo que no puede esperar de lo que sí."
322
+ ),
323
+ "evidence": [
324
+ "Hay tres personas con más de 80 años de pie en el pasillo",
325
+ "Un niño con fiebre alta lleva 40 minutos esperando",
326
+ ],
327
+ "expectedImpact": "Lo urgente se ve hoy; lo demás se reprograma con respeto",
328
+ "visibleWhen": "En cuanto la enfermera esté en la puerta",
329
+ "withdrawIf": "El volumen desborda también el triaje",
330
+ "risks": ["Alguien urgente que no sabe explicar lo que le pasa"],
331
+ },
332
+ },
333
+ {
334
+ "verbo": "respond",
335
+ "actor": "laboratorio",
336
+ "payload": {
337
+ "stance": "conditional",
338
+ "recommendation": (
339
+ "Que nadie repita pruebas por el caos: los análisis de esta semana "
340
+ "ya están hechos y valen. Puedo imprimir la lista de resultados "
341
+ "pendientes de entregar en diez minutos."
342
+ ),
343
+ "evidence": [
344
+ "34 resultados listos sin entregar",
345
+ "12 de las personas de la sala solo venían a recogerlos",
346
+ ],
347
+ "expectedImpact": "12 personas salen en minutos con lo que venían a buscar",
348
+ "visibleWhen": "Con la lista impresa en recepción",
349
+ "withdrawIf": "El sistema de resultados también está afectado",
350
+ "risks": ["Entregar un resultado a la persona equivocada con las prisas"],
351
+ },
352
+ },
353
+ {
354
+ "verbo": "respond",
355
+ "actor": "farmacia",
356
+ "payload": {
357
+ "stance": "conditional",
358
+ "recommendation": (
359
+ "Las recetas de crónicos no necesitan consulta: renovarlas hoy en "
360
+ "ventanilla con la historia delante. La señora de la medicación "
361
+ "del corazón no debería esperar a un médico para su papel."
362
+ ),
363
+ "evidence": [
364
+ "9 personas de la sala vienen solo a renovar recetas",
365
+ "Todas son medicaciones crónicas ya pautadas",
366
+ ],
367
+ "expectedImpact": "9 personas más salen atendidas sin tocar la agenda médica",
368
+ "visibleWhen": "Al abrir la ventanilla de renovación",
369
+ "withdrawIf": "Alguna renovación exige cambio de dosis",
370
+ "risks": ["Renovar sin mirar una interacción nueva"],
371
+ },
372
+ },
373
+ {
374
+ "verbo": "synthesize",
375
+ "payload": {
376
+ "summary": (
377
+ "Tres movimientos que no se pisan: triaje en la puerta, resultados "
378
+ "en recepción y recetas en ventanilla. La sala baja de 60 a unos 35 "
379
+ "sin cancelar a nadie. Falta decidir qué se hace con esos 35."
380
+ ),
381
+ "agreements": [
382
+ "Triaje inmediato",
383
+ "Entregar los 34 resultados",
384
+ "Renovar las 9 recetas crónicas",
385
+ ],
386
+ "conflicts": ["Qué decir a los ~35 restantes"],
387
+ "unknowns": ["Si la agenda de tarde también está duplicada"],
388
+ },
389
+ },
390
+ {
391
+ "verbo": "palabra",
392
+ "actor": "urgencias",
393
+ "peticion": {
394
+ "basis": "new_evidence",
395
+ "reason": "El triaje de la puerta acaba de encontrar algo.",
396
+ "evidence": [
397
+ "Un señor con dolor en el pecho llevaba 30 minutos callado en "
398
+ "la fila"
399
+ ],
400
+ },
401
+ "respuesta": {
402
+ "claim": (
403
+ "Ya está dentro y atendido. Pero confirma la regla: el triaje va "
404
+ "primero SIEMPRE, antes que cualquier reprogramación."
405
+ ),
406
+ "evidence": ["Atendido a los dos minutos del triaje"],
407
+ "consequence": "El orden del plan no se negocia: puerta primero.",
408
+ },
409
+ },
410
+ {
411
+ "verbo": "palabra",
412
+ "actor": "farmacia",
413
+ "peticion": {
414
+ "basis": "dependency",
415
+ "reason": "La ventanilla de recetas depende de poder ver la historia.",
416
+ "evidence": ["Dos terminales de recepción siguen caídos por lo de las citas"],
417
+ },
418
+ "respuesta": {
419
+ "claim": (
420
+ "Necesito un terminal que funcione en la ventanilla o renovaré a "
421
+ "ciegas, y a ciegas no renuevo."
422
+ ),
423
+ "evidence": ["El terminal de laboratorio está libre y funciona"],
424
+ "consequence": "Laboratorio presta su terminal dos horas y todo cuadra.",
425
+ },
426
+ },
427
+ {
428
+ "verbo": "decide",
429
+ "payload": {
430
+ "outcome": (
431
+ "Ahora mismo: triaje en la puerta. En paralelo, resultados en "
432
+ "recepción y recetas en ventanilla con el terminal del laboratorio. "
433
+ "A los ~35 restantes se les reprograma hoy con día y hora en mano, "
434
+ "empezando por los mayores."
435
+ ),
436
+ "rationale": (
437
+ "Cada persona de la sala cae en uno de los cuatro caminos, y ninguno "
438
+ "depende de arreglar el sistema de citas esta mañana."
439
+ ),
440
+ "owner": "Vera",
441
+ "executor": "urgencias",
442
+ "verifier": "laboratorio",
443
+ "verificationQuestion": (
444
+ "¿Está la sala por debajo del aforo y cada persona con su camino?"
445
+ ),
446
+ "selectedEvidence": [
447
+ "34 resultados listos",
448
+ "9 recetas crónicas renovables",
449
+ "Triaje encontró y atendió al señor del dolor de pecho",
450
+ ],
451
+ "decisiveContributors": ["urgencias", "laboratorio", "farmacia"],
452
+ "rejectedOptions": ["Cerrar la puerta y colgar un cartel"],
453
+ "reopenIf": ["La agenda de tarde también está duplicada"],
454
+ },
455
+ },
456
+ {
457
+ "verbo": "verify",
458
+ "actor": "laboratorio",
459
+ "payload": {
460
+ "result": "fail",
461
+ "evidence": [
462
+ "La agenda de TARDE también está duplicada: 48 citas para 24 huecos",
463
+ "Reprogramar a los 35 de la mañana hacia la tarde los mete en otra "
464
+ "sala llena",
465
+ ],
466
+ "checks": ["Revisión de la agenda de tarde antes de reprogramar hacia ella"],
467
+ "residualRisks": ["Repetir el caos a las 16h con la misma gente"],
468
+ },
469
+ },
470
+ {
471
+ "verbo": "replan",
472
+ "payload": {
473
+ "reason": (
474
+ "Reprogramar hacia una tarde que también está rota es mover el caos "
475
+ "de sitio, no resolverlo. Se replantea con la tarde a la vista."
476
+ )
477
+ },
478
+ },
479
+ {
480
+ "verbo": "synthesize",
481
+ "payload": {
482
+ "summary": (
483
+ "La reprogramación salta la tarde de hoy: va directa a huecos "
484
+ "reales de mañana y pasado, y la agenda de tarde se poda ahora "
485
+ "llamando a quien tenga cita duplicada antes de que venga."
486
+ ),
487
+ "agreements": ["No reprogramar hacia la tarde de hoy"],
488
+ "conflicts": [],
489
+ "unknowns": ["Cuánta gente de la tarde contesta al teléfono a tiempo"],
490
+ },
491
+ },
492
+ {
493
+ "verbo": "decide",
494
+ "payload": {
495
+ "outcome": (
496
+ "Los ~35 de la mañana salen con cita para mañana o pasado, no para "
497
+ "esta tarde. Dos personas de admisión llaman ahora a la lista de la "
498
+ "tarde para deshacer los duplicados antes de que nadie más venga."
499
+ ),
500
+ "rationale": "Se arregla la mañana sin fabricar el mismo problema a las 16h.",
501
+ "owner": "Vera",
502
+ "executor": "urgencias",
503
+ "verifier": "laboratorio",
504
+ "verificationQuestion": (
505
+ "¿Sala bajo aforo, caminos para todos, y la tarde podada a su aforo real?"
506
+ ),
507
+ "selectedEvidence": ["Agenda de tarde revisada: 48 citas para 24 huecos"],
508
+ "decisiveContributors": ["laboratorio", "urgencias"],
509
+ "rejectedOptions": ["Reprogramar hacia la tarde y cruzar los dedos"],
510
+ "reopenIf": ["Menos de la mitad de la lista de tarde contesta"],
511
+ },
512
+ },
513
+ {
514
+ "verbo": "verify",
515
+ "actor": "laboratorio",
516
+ "payload": {
517
+ "result": "pass",
518
+ "evidence": [
519
+ "12:40: sala con 19 personas, por debajo del aforo",
520
+ "Tarde podada a 26 citas; 22 duplicados avisados por teléfono",
521
+ ],
522
+ "checks": [
523
+ "Todos los urgentes vistos",
524
+ "35 reprogramados con día y hora en mano",
525
+ "Recetas crónicas renovadas, incluida la de la señora del corazón",
526
+ ],
527
+ "residualRisks": ["4 duplicados de tarde sin contestar el teléfono"],
528
+ },
529
+ },
530
+ {
531
+ "verbo": "close",
532
+ "payload": {
533
+ "summary": (
534
+ "Mañana resuelta sin cerrar la puerta: urgencias vistas, resultados "
535
+ "entregados, recetas renovadas, reprogramación real y tarde podada."
536
+ ),
537
+ "learnings": [
538
+ "El triaje va antes que la logística, siempre",
539
+ "Nunca reprogramar hacia una agenda sin revisarla primero",
540
+ ],
541
+ "followups": ["Averiguar por qué el sistema duplicó las citas"],
542
+ },
543
+ },
544
+ ],
545
+ },
546
+ # ── legal: Despacho Costa — the deadline at nine tomorrow ───────────────
547
+ "legal": {
548
+ "city": "despacho",
549
+ "title": "El plazo de mañana a las nueve",
550
+ "turns": [
551
+ {
552
+ "verbo": "open",
553
+ "payload": {
554
+ "question": (
555
+ "¿Llegamos al plazo de mañana a las 9 con la reclamación de la "
556
+ "comunidad de vecinos?"
557
+ ),
558
+ "desiredOutcome": (
559
+ "Presentar en plazo algo completo y firmado, o saber HOY que no se "
560
+ "puede y decírselo a la clienta con alternativas, no con excusas."
561
+ ),
562
+ "context": (
563
+ "La reclamación por las goteras del edificio vence mañana a las "
564
+ "9:00. Al revisar el expediente esta tarde faltan dos firmas de "
565
+ "vecinos y el informe del perito tiene la última página en blanco. "
566
+ "La presidenta de la comunidad ha llamado dos veces, la segunda llorando."
567
+ ),
568
+ "constraints": [
569
+ "El plazo no se mueve: mañana a las 9:00",
570
+ "No se presenta nada incompleto que pueda tumbar el caso",
571
+ ],
572
+ "definitionOfDone": [
573
+ "Expediente completo y presentado, o la clienta avisada hoy con plan B",
574
+ "Nada pendiente de 'a ver si hay suerte'",
575
+ ],
576
+ "authority": "decide",
577
+ "participants": ["contratos", "litigios", "archivo"],
578
+ "maxRebuttals": 2,
579
+ },
580
+ },
581
+ {
582
+ "verbo": "respond",
583
+ "actor": "litigios",
584
+ "payload": {
585
+ "stance": "support",
586
+ "recommendation": (
587
+ "Se puede llegar, pero solo si esta tarde es solo para esto: las dos "
588
+ "firmas se consiguen yendo a los domicilios, no esperando emails."
589
+ ),
590
+ "evidence": [
591
+ "Los dos vecinos sin firmar viven en el mismo edificio",
592
+ "Uno ya dijo que sí por teléfono la semana pasada",
593
+ ],
594
+ "expectedImpact": "Las firmas, resueltas esta misma tarde en persona",
595
+ "visibleWhen": "Esta noche, con las firmas en el expediente",
596
+ "withdrawIf": "Alguno de los dos se niega en persona",
597
+ "risks": ["Que uno de los dos no esté en casa"],
598
+ },
599
+ },
600
+ {
601
+ "verbo": "respond",
602
+ "actor": "contratos",
603
+ "payload": {
604
+ "stance": "conditional",
605
+ "recommendation": (
606
+ "La página en blanco del perito es lo grave: sin sus conclusiones "
607
+ "firmadas, la reclamación cojea. Hay que localizarle HOY; su oficina "
608
+ "cierra a las 18h."
609
+ ),
610
+ "evidence": [
611
+ "El informe se corrompió al escanearlo: el original en papel existe",
612
+ "El perito contestó un email esta mañana: está localizable",
613
+ ],
614
+ "expectedImpact": "Informe completo esta tarde si alguien va a su oficina",
615
+ "visibleWhen": "Con la última página escaneada de nuevo",
616
+ "withdrawIf": "El original en papel también estuviera incompleto",
617
+ "risks": ["Quedarse esperando un reenvío que no llega"],
618
+ },
619
+ },
620
+ {
621
+ "verbo": "respond",
622
+ "actor": "archivo",
623
+ "payload": {
624
+ "stance": "conditional",
625
+ "recommendation": (
626
+ "Antes de correr: comprobar QUÉ exige exactamente el juzgado para "
627
+ "tener por presentada la reclamación. Puede que las dos firmas que "
628
+ "faltan ni siquiera sean obligatorias para presentar."
629
+ ),
630
+ "evidence": [
631
+ "En un caso de 2024 se presentó con firmas pendientes y se "
632
+ "subsanaron después",
633
+ "El registro telemático admite hasta las 23:59, no hasta las 9:00",
634
+ ],
635
+ "expectedImpact": "Saber cuánto margen real hay antes de gastar la tarde",
636
+ "visibleWhen": "En una hora, con el requisito confirmado",
637
+ "withdrawIf": "Este juzgado exige el expediente completo sin subsanación",
638
+ "unknowns": ["Si el plazo de las 9:00 es de registro o de reparto"],
639
+ },
640
+ },
641
+ {
642
+ "verbo": "synthesize",
643
+ "payload": {
644
+ "summary": (
645
+ "Nadie propone rendirse. Tres frentes a la vez: firmas en persona "
646
+ "esta tarde, el perito antes de las 18h, y archivo confirmando qué "
647
+ "es imprescindible presentar y hasta qué hora de verdad."
648
+ ),
649
+ "agreements": [
650
+ "Ir a por las firmas en persona",
651
+ "Ir a la oficina del perito hoy",
652
+ "Confirmar el requisito exacto del juzgado",
653
+ ],
654
+ "conflicts": ["Cuánto de esto es imprescindible y cuánto es prudencia"],
655
+ "unknowns": ["Hora real límite: ¿9:00 o 23:59 telemático?"],
656
+ },
657
+ },
658
+ {
659
+ "verbo": "palabra",
660
+ "actor": "archivo",
661
+ "peticion": {
662
+ "basis": "new_evidence",
663
+ "reason": "Ya está confirmado el requisito con el juzgado.",
664
+ "evidence": [
665
+ "Registro telemático hasta las 23:59 de mañana; las firmas son "
666
+ "subsanables en 10 días"
667
+ ],
668
+ },
669
+ "respuesta": {
670
+ "claim": (
671
+ "Tenemos 15 horas más de las que creíamos y las firmas no bloquean "
672
+ "la presentación. Lo ÚNICO imprescindible es el informe del perito."
673
+ ),
674
+ "evidence": ["Diligencia de subsanación admitida en este juzgado, caso 2024"],
675
+ "consequence": "Toda la presión se concentra en el perito antes de las 18h.",
676
+ },
677
+ },
678
+ {
679
+ "verbo": "palabra",
680
+ "actor": "litigios",
681
+ "peticion": {
682
+ "basis": "risk",
683
+ "reason": "Hay una trampa en confiarlo todo al registro telemático.",
684
+ "evidence": ["El registro telemático estuvo caído dos veces este mes"],
685
+ },
686
+ "respuesta": {
687
+ "claim": (
688
+ "Si apuramos a las 23:00 y el registro se cae, no hay plan B. Lo que "
689
+ "esté listo se presenta por la mañana, no por la noche."
690
+ ),
691
+ "evidence": ["Incidencias del registro: días 4 y 19 de este mes"],
692
+ "consequence": "La meta interna pasa a ser mañana a las 10:00, no a las 23:59.",
693
+ },
694
+ },
695
+ {
696
+ "verbo": "decide",
697
+ "payload": {
698
+ "outcome": (
699
+ "Esta tarde: una persona a la oficina del perito antes de las 18h y "
700
+ "otra a por las dos firmas en persona. Se presenta mañana a las "
701
+ "10:00 con lo imprescindible completo; las firmas, si no llegan, se "
702
+ "subsanan en los 10 días. A la presidenta se la llama HOY contando "
703
+ "el plan tal cual."
704
+ ),
705
+ "rationale": (
706
+ "El requisito real deja margen, pero el margen no se gasta: se "
707
+ "presenta por la mañana con el informe completo."
708
+ ),
709
+ "owner": "Marta",
710
+ "executor": "litigios",
711
+ "verifier": "archivo",
712
+ "verificationQuestion": (
713
+ "¿Está el expediente presentable a las 10:00 con el informe completo?"
714
+ ),
715
+ "selectedEvidence": [
716
+ "Requisito confirmado: firmas subsanables",
717
+ "Perito localizable hasta las 18h",
718
+ ],
719
+ "decisiveContributors": ["archivo", "contratos", "litigios"],
720
+ "rejectedOptions": ["Apurar al registro telemático de las 23:59"],
721
+ "reopenIf": ["El perito no aparece antes de las 18h"],
722
+ },
723
+ },
724
+ {
725
+ "verbo": "verify",
726
+ "actor": "archivo",
727
+ "payload": {
728
+ "result": "fail",
729
+ "evidence": [
730
+ "El original del perito tiene las conclusiones, pero firmadas por su "
731
+ "socio, que NO es el perito designado en el expediente"
732
+ ],
733
+ "checks": [
734
+ "Cotejo del original en papel con la designación del expediente",
735
+ "La firma válida tiene que ser del perito designado",
736
+ ],
737
+ "residualRisks": ["El perito designado está de viaje hasta mañana"],
738
+ },
739
+ },
740
+ {
741
+ "verbo": "replan",
742
+ "payload": {
743
+ "reason": (
744
+ "El informe existe pero lo firma quien no debe. Presentarlo así es "
745
+ "regalarle a la otra parte un motivo de impugnación. Se replantea."
746
+ )
747
+ },
748
+ },
749
+ {
750
+ "verbo": "synthesize",
751
+ "payload": {
752
+ "summary": (
753
+ "El perito designado vuelve mañana y puede firmar a primera hora en "
754
+ "el aeropuerto. Plan ajustado: firma a las 8:30, presentación a las "
755
+ "11:00, y la llamada a la clienta se adelanta a esta tarde."
756
+ ),
757
+ "agreements": ["La firma tiene que ser del perito designado, sin atajos"],
758
+ "conflicts": [],
759
+ "unknowns": ["Retraso del vuelo del perito"],
760
+ },
761
+ },
762
+ {
763
+ "verbo": "decide",
764
+ "payload": {
765
+ "outcome": (
766
+ "Mañana 8:30, firma del perito designado a su llegada; 11:00, "
767
+ "presentación telemática con el expediente completo; las dos firmas "
768
+ "de vecinos ya conseguidas esta tarde se incorporan. Si el vuelo se "
769
+ "retrasa, se presenta a las 16:00 — todavía siete horas dentro de plazo."
770
+ ),
771
+ "rationale": (
772
+ "Un expediente impecable a las 11:00 vale más que uno impugnable a "
773
+ "las 9:00."
774
+ ),
775
+ "owner": "Marta",
776
+ "executor": "litigios",
777
+ "verifier": "archivo",
778
+ "verificationQuestion": (
779
+ "¿Presentado dentro de plazo, completo y con la firma del perito designado?"
780
+ ),
781
+ "selectedEvidence": [
782
+ "Vuelo del perito aterriza a las 8:05",
783
+ "Margen hasta las 23:59",
784
+ ],
785
+ "decisiveContributors": ["archivo", "litigios"],
786
+ "rejectedOptions": ["Presentar con la firma del socio y rezar"],
787
+ "reopenIf": ["El vuelo se cancela"],
788
+ },
789
+ },
790
+ {
791
+ "verbo": "verify",
792
+ "actor": "archivo",
793
+ "payload": {
794
+ "result": "pass",
795
+ "evidence": [
796
+ "Firmas de los dos vecinos conseguidas esta tarde en persona",
797
+ "Perito designado confirmado en el vuelo de las 8:05; firma a las 8:30",
798
+ ],
799
+ "checks": [
800
+ "Expediente montado y revisado dos veces esta noche",
801
+ "Presentación ensayada en el registro telemático con un borrador",
802
+ "La presidenta avisada: dejó de llorar cuando oyó el plan con horas",
803
+ ],
804
+ "residualRisks": ["Retraso del vuelo — cubierto por el margen de la tarde"],
805
+ },
806
+ },
807
+ {
808
+ "verbo": "close",
809
+ "payload": {
810
+ "summary": (
811
+ "Reclamación presentada dentro de plazo, completa y sin flancos: "
812
+ "firmas conseguidas en persona, informe firmado por quien debía, y "
813
+ "la clienta informada con horas, no con promesas."
814
+ ),
815
+ "learnings": [
816
+ "Confirmar el requisito real antes de correr: cambió toda la tarde",
817
+ "Un expediente impecable tarde vale más que uno impugnable pronto",
818
+ ],
819
+ "followups": ["Revisar cómo se corrompió el escaneo del informe"],
820
+ },
821
+ },
822
+ ],
823
+ },
824
+ }