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
package/README.es.md ADDED
@@ -0,0 +1,2021 @@
1
+ # Agents City
2
+
3
+ [Español](README.es.md) · [English](README.md)
4
+
5
+ **Ejecuta varias ciudades autónomas de agentes en una máquina y conecta sólo
6
+ las que deban hablar.**
7
+
8
+ Agents City es un orquestador local y multimodelo para trabajo con repositorios.
9
+ Cada ciudad tiene una identidad, un dominio, un asiento principal, un objetivo,
10
+ agentes de apoyo por repo, conocimiento editable, skills reconocidas en vivo y
11
+ carreteras explícitas hacia otras ciudades. No convierte todos los agentes en un
12
+ chat grupal: el asiento preside, selecciona a los especialistas y controla los
13
+ turnos.
14
+
15
+ Esta es la guía completa. Si sólo quieres probarlo, ve a [Inicio rápido](#inicio-rápido).
16
+
17
+ ## Índice
18
+
19
+ - [Modelo mental](#modelo-mental)
20
+ - [Inicio rápido](#inicio-rápido)
21
+ - [Requisitos e instalación](#requisitos-e-instalación)
22
+ - [Primer arranque, paso a paso](#primer-arranque-paso-a-paso)
23
+ - [Trabajar dentro de tmux](#trabajar-dentro-de-tmux)
24
+ - [Motores y transportes](#motores-y-transportes)
25
+ - [Dominios, roles y conocimiento](#dominios-roles-y-conocimiento)
26
+ - [Referencia completa de comandos](#referencia-completa-de-comandos)
27
+ - [Comité: flujo completo](#comité-flujo-completo)
28
+ - [Comandos `/city:` de Claude](#comandos-city-de-claude)
29
+ - [Recetario de casos de uso](#recetario-de-casos-de-uso)
30
+ - [Ficheros y variables de entorno](#ficheros-y-variables-de-entorno)
31
+ - [Seguridad y límites de confianza](#seguridad-y-límites-de-confianza)
32
+ - [Resolución de problemas](#resolución-de-problemas)
33
+ - [Desarrollo y pruebas](#desarrollo-y-pruebas)
34
+
35
+ ## Modelo mental
36
+
37
+ Una ciudad no es una cuenta, una persona remota ni un conjunto libre de bots. Es
38
+ un ámbito de trabajo autónomo propiedad de una persona local:
39
+
40
+ ```text
41
+ usuario local
42
+ ├── ciudad home
43
+ │ ├── identidad estable: propietario/home
44
+ │ ├── dominio + rol del asiento + objetivo
45
+ │ ├── asiento: presidente y única frontera pública
46
+ │ ├── agente A: workspace + montajes → un repo git (tipo: code)
47
+ │ ├── agente B: workspace + montajes → una carpeta de documentos (tipo: knowledge)
48
+ │ ├── agente C: workspace + montajes → varios repos y un worktree
49
+ │ ├── conocimiento de dominio/rol editable
50
+ │ ├── skills que ya existen dentro del trabajo montado
51
+ │ └── carreteras explícitas hacia otros asientos
52
+ ├── ciudad producto
53
+ └── ciudad cliente-a
54
+ ```
55
+
56
+ **Primero vienen los agentes.** La unidad es el agente, y un repo es solo una de
57
+ las cosas que puede montar. Cada agente tiene una **carpeta de trabajo** con un
58
+ directorio `mounts/` de symlinks a donde vive el trabajo real — un repo git, un
59
+ worktree enlazado o una simple carpeta de documentos — así que una persona cuyo
60
+ trabajo es conocimiento en documentos, sin git alguno, es un agente de primera
61
+ clase. «Un repo es un agente» es solo el caso particular de un agente cuyo único
62
+ montaje es ese repo, por lo que **las ciudades de solo-repos siguen funcionando
63
+ igual**. Modelo completo: [docs/agents-first.md](docs/agents-first.md).
64
+
65
+ Las fronteras importantes son:
66
+
67
+ - **Usuario:** puede poseer varias ciudades locales.
68
+ - **Ciudad:** tiene identidad, dominio, objetivo, configuración y estado propios.
69
+ - **Asiento (`seat`):** es el presidente del comité y el único actor que puede
70
+ cruzar carreteras.
71
+ - **Agente:** la unidad miembro. Posee una carpeta de trabajo y opera sobre sus
72
+ montajes, aporta evidencia y siempre tiene autoridad de miembro — sea su
73
+ especialidad `dev`, `seo` o `cfo`, y sea su **tipo** `code`, `knowledge` o
74
+ `coordinator`.
75
+ - **Montaje:** un symlink dentro de la carpeta de un agente hacia trabajo real en
76
+ disco (un repo, un worktree, una carpeta de documentos). Un agente puede tener
77
+ varios, o ninguno.
78
+ - **Rol:** perspectiva y responsabilidad profesional; no concede permisos del bus.
79
+ - **Skill:** capacidad instalada por el usuario o el propio repo. El
80
+ reconocimiento es en vivo y de solo lectura; la única escritura deliberada es
81
+ el Hall instalando un zip de skill que el dueño sube explícitamente, en el
82
+ hogar de ese agente — nunca por su cuenta, nunca en otro sitio. Las skills
83
+ son el formato del runtime de Claude; los demás motores las ignoran.
84
+ - **Carretera:** allowlist entre dos asientos. Da alcance, no autoridad.
85
+ - **Comité:** proceso acotado de posiciones aisladas, síntesis, palabra, decisión
86
+ y verificación. No es una conversación lateral entre todos.
87
+
88
+ ## Inicio rápido
89
+
90
+ ### Ahora mismo: experiencia npm real sin publicar
91
+
92
+ Empaquetar primero es importante: prueba exactamente la lista de ficheros que
93
+ recibiría una persona desde npm, no el checkout completo.
94
+
95
+ ```bash
96
+ cd /ruta/al/checkout/agents-city
97
+ npm pack
98
+ npm install -g ./agents-city-0.3.0-beta.21.tgz
99
+ agents-city --version
100
+ agents-city seat
101
+ ```
102
+
103
+ No hace falta ejecutar `npm publish`. La instalación anterior es global sólo en
104
+ tu versión activa de Node.
105
+
106
+ ### Instalación desde el registro cuando esté disponible
107
+
108
+ Comprueba primero la disponibilidad y los dist-tags:
109
+
110
+ ```bash
111
+ npm view agents-city dist-tags --json
112
+ ```
113
+
114
+ Si devuelve `E404`, usa el tarball local de la sección anterior. Cuando el
115
+ registro muestre un dist-tag `beta`, la instalación será:
116
+
117
+ ```bash
118
+ npm install -g agents-city@beta
119
+ agents-city --version
120
+ agents-city seat
121
+ ```
122
+
123
+ Usa `@beta` mientras sea prerelease. `npm install -g agents-city` sin tag debe
124
+ reservarse para el futuro release estable marcado como `latest`.
125
+
126
+ ### Abrir el Hall en vez del terminal
127
+
128
+ ```bash
129
+ agents-city
130
+ # equivalente a:
131
+ agents-city hall
132
+ ```
133
+
134
+ El Hall se sirve en `127.0.0.1`, usa un puerto libre y abre el navegador. Desde
135
+ allí puedes crear o seleccionar una ciudad y editar su configuración usando los
136
+ mismos módulos que usa el CLI.
137
+
138
+ ## Requisitos e instalación
139
+
140
+ ### Requisitos base
141
+
142
+ | Requisito | Para qué se usa |
143
+ |---|---|
144
+ | Node.js 22 o posterior | paquete npm, bus WebSocket y frontends |
145
+ | npm | instalación y empaquetado |
146
+ | Python 3 | Hall, onboarding, ciudades, mapas y utilidades |
147
+ | bash | sesiones y launchers |
148
+ | tmux | una ventana por asiento/repo; `seat` intenta instalarlo si falta |
149
+ | macOS o Linux | plataformas nativas soportadas |
150
+ | WSL | necesario en Windows porque Windows no incluye bash/tmux nativos |
151
+
152
+ Cada motor necesita además su propio CLI instalado y autenticado. Agents City no
153
+ incluye ni suplanta las cuentas de Claude, Codex, OpenCode o Kimi.
154
+
155
+ ```bash
156
+ command -v claude
157
+ command -v codex
158
+ command -v opencode
159
+ command -v kimi
160
+ ```
161
+
162
+ No necesitas tenerlos todos. Puedes usar sólo Claude, sólo Codex o una mezcla.
163
+
164
+ ### GitHub es opcional
165
+
166
+ Elegir repos locales no necesita cuenta. Si durante el onboarding eliges GitHub,
167
+ Agents City usa el CLI independiente `gh`:
168
+
169
+ 1. lo detecta;
170
+ 2. intenta instalarlo con el gestor del sistema si falta;
171
+ 3. ejecuta `gh auth login --web` si no está autenticado;
172
+ 4. muestra el código de dispositivo si no puede abrir el navegador;
173
+ 5. ofrece clonar los repos seleccionados que aún no estén en el disco.
174
+
175
+ `gh` no va dentro del paquete npm de Agents City.
176
+
177
+ ### Actualizar una instalación local
178
+
179
+ ```bash
180
+ cd /ruta/al/checkout/agents-city
181
+ npm pack
182
+ npm install -g ./agents-city-0.3.0-beta.21.tgz
183
+ agents-city --version
184
+ ```
185
+
186
+ Las sesiones ya abiertas conservan el código cargado en memoria. Para aplicar la
187
+ nueva versión a una ciudad:
188
+
189
+ ```bash
190
+ agents-city exit home --dry-run
191
+ agents-city exit home
192
+ agents-city seat --city home
193
+ ```
194
+
195
+ Guarda primero cualquier trabajo activo: `exit` cierra todas las ventanas de esa
196
+ ciudad.
197
+
198
+ ### Desinstalar
199
+
200
+ ```bash
201
+ npm uninstall -g agents-city
202
+ ```
203
+
204
+ Esto elimina el programa instalado, pero **no** borra `~/.agents-city`, tus
205
+ ciudades, backups ni repos. Usa `agents-city reset` sólo cuando quieras reiniciar
206
+ una ciudad concreta.
207
+
208
+ ## Primer arranque, paso a paso
209
+
210
+ `agents-city seat` crea `home` si todavía no existe y hace cinco decisiones.
211
+
212
+ ### 1. Dominio de trabajo
213
+
214
+ El dominio determina vocabulario, criterios de evidencia y roles sugeridos. Las
215
+ opciones incorporadas son:
216
+
217
+ | ID | Dominio |
218
+ |---|---|
219
+ | `software` | Desarrollo de software |
220
+ | `healthcare` | Salud y medicina |
221
+ | `legal` | Servicios legales |
222
+ | `finance` | Finanzas y operaciones |
223
+ | `marketing` | Marketing y crecimiento |
224
+ | `sales` | Ventas y customer success |
225
+ | `research` | Investigación y educación |
226
+ | `operations` | Operaciones y delivery |
227
+ | `custom` | Otro dominio, sin suponer una industria |
228
+
229
+ ### 2. Rol del asiento
230
+
231
+ Es la responsabilidad del jefe de esa ciudad, no el nombre de la ciudad ni el
232
+ motor. El asiento sigue siendo presidente aunque elijas `blank`.
233
+
234
+ ### 3. Repos y rol de cada agente
235
+
236
+ Puedes leer repos del disco, de tu cuenta GitHub o de una organización. Cada repo
237
+ seleccionado recibe:
238
+
239
+ - una ventana tmux;
240
+ - un actor privado del bus;
241
+ - un directorio de trabajo dentro del repo;
242
+ - un rol operativo explícito;
243
+ - las skills que su runtime ya sea capaz de descubrir allí.
244
+
245
+ El rol del repo puede pertenecer a otro dominio. Ejemplo: una ciudad de software
246
+ puede asignar `po` a un repo de producto, `seo` al portfolio y `data-engineer` a
247
+ un pipeline. Ninguno se convierte en presidente.
248
+
249
+ Elegir cero repos también es válido: abre una ciudad con sólo su asiento.
250
+
251
+ ### 4. Objetivo
252
+
253
+ Un objetivo puede ser cuantitativo o cualitativo. Guarda:
254
+
255
+ - título;
256
+ - señal observada;
257
+ - comando que devuelve la medida, si existe;
258
+ - persona y frecuencia de juicio, si es cualitativo;
259
+ - baseline;
260
+ - target;
261
+ - fecha objetivo.
262
+
263
+ Puedes omitirlo y configurarlo después con `agents-city seat --goal`.
264
+
265
+ ### 5. Motor de cada ventana
266
+
267
+ Enter conserva Claude en todas. También puedes elegir por ventana:
268
+
269
+ - Claude y, opcionalmente, modelo/esfuerzo;
270
+ - Codex;
271
+ - OpenCode;
272
+ - Kimi;
273
+ - un comando desconocido mediante el fallback explícito de terminal.
274
+
275
+ La configuración persistente queda en la ficha del propietario. Los flags
276
+ `--model` y `--effort` de `seat` son overrides sólo para ese arranque.
277
+
278
+ ### Qué se crea
279
+
280
+ ```text
281
+ ~/.agents-city/
282
+ ├── .runtime/ # endpoints, colas y estado efímero del bus
283
+ ├── state/ # estado local del mapa, separado por ciudad
284
+ ├── .backups/ # migraciones antiguas
285
+ └── <propietario>/
286
+ ├── .current # ciudad seleccionada
287
+ ├── .backups/ # resets recuperables del propietario
288
+ └── <ciudad>/
289
+ ├── city.yml # id, nombre, slug, owner, dominio
290
+ ├── roads.json # carreteras permitidas
291
+ ├── <propietario>.md # rol, repos, roles, objetivo, motores
292
+ ├── AGENTS.md # cómo leer esta ciudad
293
+ ├── domains/ # conocimiento de dominio editable
294
+ ├── roles/ # conocimiento de roles editable
295
+ ├── deliberations/ # estados, eventos y actas del comité
296
+ ├── units.yml # barrios del mapa, si se usa
297
+ └── parcels.yml # casas/parcelas del mapa, si se usa
298
+ ```
299
+
300
+ El root `~/.agents-city` es un contenedor, nunca una ciudad. `home` es sólo la
301
+ primera ciudad y se aísla igual que `producto` o `cliente-a`.
302
+
303
+ ## Trabajar dentro de tmux
304
+
305
+ Una sesión se llama `<propietario>-<ciudad>` y contiene:
306
+
307
+ - ventana `seat`: asiento principal, situado en la carpeta de la ciudad;
308
+ - una ventana por repo encontrado localmente;
309
+ - el runtime configurado ya iniciado en cada ventana.
310
+
311
+ Atajos instalados sólo en el servidor tmux actual:
312
+
313
+ | Acción | Atajo |
314
+ |---|---|
315
+ | Cambiar a las ventanas 1–9 | `Alt+1` … `Alt+9` |
316
+ | Ventana anterior/siguiente | `Alt+←` / `Alt+→` |
317
+ | Seleccionar con ratón | clic en la barra inferior |
318
+ | Scroll | rueda del ratón |
319
+ | Separarse sin cerrar | `Ctrl-b`, después `d` |
320
+ | Volver a la ciudad | `agents-city seat --city <nombre>` |
321
+
322
+ Si la sesión ya existe, `seat` se vuelve a adjuntar: no crea otra ni duplica los
323
+ agentes. Una pestaña con campana o color de actividad indica que merece atención.
324
+
325
+ Claude se inicia de forma escalonada porque varias instancias comparten su token
326
+ OAuth. Codex, OpenCode y Kimi no esperan ese escalonado. Usa `CITY_SETTLE=0
327
+ CITY_STAGGER=0` sólo si quieres desactivarlo conscientemente.
328
+
329
+ No cierres una ciudad matando procesos genéricos. Usa:
330
+
331
+ ```bash
332
+ agents-city exit <ciudad> --dry-run
333
+ agents-city exit <ciudad>
334
+ ```
335
+
336
+ ## Motores y transportes
337
+
338
+ Todos reciben sobres del mismo bus WebSocket local, pero la última milla es
339
+ nativa para cada proveedor:
340
+
341
+ | Runtime | Entrega de tareas del bus | Interfaz visible | Requisito |
342
+ |---|---|---|---|
343
+ | Claude | `stream-json` persistente por stdin/stdout | gateway interactivo `city>` y transcripción visible de Claude | CLI `claude` autenticado; sin Team ni política admin |
344
+ | Codex | `app-server` WebSocket | TUI oficial conectada con `codex --remote` | CLI `codex` autenticado |
345
+ | OpenCode | API HTTP/SSE | consola interactiva `city>` del gateway | CLI `opencode` configurado |
346
+ | Kimi | REST + WebSocket | consola interactiva `city>` del gateway | CLI `kimi` o `kimi-code` configurado |
347
+ | CLI desconocida | adapter de compatibilidad | TUI/comando propio dentro de tmux | configuración `terminal:<comando>` |
348
+
349
+ Las tareas de Claude, Codex, OpenCode y Kimi **no** se pegan en tmux ni pasan por
350
+ el portapapeles. El fallback de terminal existe sólo para un comando desconocido
351
+ elegido explícitamente.
352
+
353
+ Agents City **no** usa Channels personalizados en el arranque normal de Claude.
354
+ El mismo proceso oficial de Claude Code permanece abierto en modo
355
+ print/streaming y recibe turnos JSONL directamente desde el gateway de la ciudad.
356
+ Por tanto, una cuenta personal Pro/Max no necesita `sudo`,
357
+ `managed-settings.json`, consola Team, allowlist de Channels, bypass de desarrollo
358
+ ni confirmaciones por ventana. El plugin instalado sigue aportando normalmente
359
+ sus herramientas MCP, skills y hooks. Los Channels personalizados quedan como un
360
+ mecanismo preview opcional de Anthropic, no como requisito de Agents City.
361
+
362
+ Ejemplo conceptual de una ficha multimodelo:
363
+
364
+ ```yaml
365
+ runs.seat: codex
366
+ runs.api: codex --model gpt-5
367
+ runs.analytics: opencode -m lmstudio/qwen3-coder
368
+ runs.research: kimi
369
+ runs.legacy: terminal:gemini
370
+ model.docs: sonnet
371
+ effort.docs: high
372
+ ```
373
+
374
+ Si el asiento no usa Claude, no tendrá comandos `/city:`. Todo lo fundamental
375
+ sigue disponible mediante `agents-city committee`, `road`, `bus`, `skills`,
376
+ `seat`, `reset` y `exit`.
377
+
378
+ ## Dominios, roles y conocimiento
379
+
380
+ ### Roles incorporados por dominio
381
+
382
+ | Dominio | IDs de rol disponibles |
383
+ |---|---|
384
+ | `software` | `cpto`, `dev`, `data-engineer`, `devops`, `data`, `product-design`, `po`, `llm-engineer`, `ai-manager`, `blank` |
385
+ | `healthcare` | `clinical-director`, `clinician`, `patient-safety`, `clinical-ops`, `health-data`, `health-compliance`, `blank` |
386
+ | `legal` | `managing-partner`, `associate`, `compliance`, `knowledge`, `ops`, `blank` |
387
+ | `finance` | `cfo`, `controller`, `fin-analytics`, `ops`, `compliance`, `blank` |
388
+ | `marketing` | `brand-lead`, `content`, `performance`, `seo`, `lifecycle`, `data`, `product-design`, `blank` |
389
+ | `sales` | `revenue-lead`, `account-executive`, `revops`, `customer-success`, `enablement`, `blank` |
390
+ | `research` | `research-director`, `researcher`, `methods`, `research-ops`, `ethics`, `knowledge`, `blank` |
391
+ | `operations` | `operations-lead`, `program-manager`, `process-owner`, `quality`, `knowledge`, `blank` |
392
+ | `custom` | `city-lead`, `specialist`, `quality`, `knowledge`, `blank` |
393
+
394
+ `blank` es una decisión completa: no crea fichero de rol, no aplica un perfil
395
+ oculto y no infiere una responsabilidad. Puede asignarse al asiento o a cualquier
396
+ repo y cambiarse más tarde.
397
+
398
+ Al seleccionar un dominio/rol, Agents City copia los packs iniciales a la ciudad:
399
+
400
+ ```text
401
+ domains/<dominio>.md
402
+ roles/<rol>.md
403
+ ```
404
+
405
+ Son Markdown normal. Puedes editar, quitar o ampliar su contenido. Un cambio de
406
+ rol posterior no sobrescribe un fichero existente, por lo que tus adaptaciones se
407
+ conservan. Este conocimiento no es una skill.
408
+
409
+ ## Referencia completa de comandos
410
+
411
+ ### Vista general
412
+
413
+ ```text
414
+ agents-city [hall]
415
+ agents-city setup
416
+ agents-city seat
417
+ agents-city cities
418
+ agents-city road
419
+ agents-city bus
420
+ agents-city committee
421
+ agents-city skills
422
+ agents-city city
423
+ agents-city demo
424
+ agents-city report
425
+ agents-city tokens
426
+ agents-city logs
427
+ agents-city benchmark
428
+ agents-city reset
429
+ agents-city exit
430
+ agents-city test
431
+ ```
432
+
433
+ Comandos globales:
434
+
435
+ ```bash
436
+ agents-city --help
437
+ agents-city --version
438
+ ```
439
+
440
+ ### `agents-city` y `agents-city hall`
441
+
442
+ Abren el Hall local de la ciudad seleccionada.
443
+
444
+ ```bash
445
+ agents-city
446
+ agents-city hall
447
+ agents-city hall --city producto
448
+ agents-city hall --no-browser
449
+ ```
450
+
451
+ | Opción | Efecto |
452
+ |---|---|
453
+ | `--city NAME|ID|PATH` | selecciona una ciudad conocida y abre esa |
454
+ | `--no-browser` | no abre navegador; imprime la URL local con su token temporal |
455
+
456
+ El servidor enlaza sólo `127.0.0.1` y exige un token por ejecución para cada
457
+ escritura. La columna **City live**, a la derecha, se conecta como observador al
458
+ mismo bus WebSocket local que usan los agentes. Muestra los mensajes visibles
459
+ normales de usuario/agente, fallos de runtime y todo el flujo moderado como una
460
+ conversación: un avatar por repo, el asiento marcado como presidente y un turno
461
+ visible por posición revelada o réplica concedida. Los comandos y el ruido de
462
+ ciclo de vida quedan ocultos tras **show work**; se abre por defecto la
463
+ conversación seleccionada.
464
+
465
+ El Hall abre directamente en **The map**. La ciudad ocupa todo el lienzo central: estado, controles e
466
+ historial permanecen en las barras laterales, nunca encima o debajo del mapa.
467
+ Cada turno semántico que entra por ese mismo WebSocket produce además un
468
+ bocadillo breve, anclado al personaje que habla y encabezado por su destino
469
+ (`Para seat:`, `Para committee:`, etc.). El bocadillo es sólo el resumen fugaz;
470
+ el mensaje completo y su evidencia siguen en **City live**. No se generan
471
+ diálogos de atrezo ni se muestran comandos, razonamiento privado o sobres crudos.
472
+
473
+ Codex usa los items visibles completados de app-server;
474
+ Claude, sus hooks documentados de prompt y stop. Los items de razonamiento,
475
+ chain-of-thought, credenciales y frames crudos de transporte no se muestran ni
476
+ se escriben en el registro de actividad. El token de observador rota con el hub,
477
+ sólo acepta un origen de este ordenador y es de sólo lectura: el navegador no
478
+ puede dirigir el comité. `Ctrl-c` detiene el Hall.
479
+
480
+ ### `agents-city setup`
481
+
482
+ Crea o selecciona una ciudad y abre el Hall; con `--tui` entrega el flujo a
483
+ `seat`.
484
+
485
+ ```bash
486
+ agents-city setup
487
+ agents-city setup --city producto
488
+ agents-city setup --city producto --tui
489
+ agents-city setup --out /ruta/a/una/ciudad
490
+ agents-city setup --demo
491
+ agents-city setup --no-browser
492
+ ```
493
+
494
+ | Opción | Efecto |
495
+ |---|---|
496
+ | `--city NOMBRE` | crea la ciudad gestionada si no existe o selecciona la existente |
497
+ | `--out RUTA` | registra/importa una carpeta explícita compatible; uso avanzado |
498
+ | `--demo` | abre la demo guiada completa de Aurora Games |
499
+ | `--tui` | usa onboarding de terminal y abre la sesión |
500
+ | `--no-browser` | mantiene el Hall en terminal e imprime su URL |
501
+
502
+ ### `agents-city seat`
503
+
504
+ Configura lo solicitado, garantiza tmux/plugin y abre o reanuda la sesión de la
505
+ ciudad.
506
+
507
+ ```bash
508
+ agents-city seat
509
+ agents-city seat --city producto
510
+ agents-city seat --repos
511
+ agents-city seat --agent-roles
512
+ agents-city seat --goal
513
+ agents-city seat --engines
514
+ agents-city seat --domain marketing
515
+ agents-city seat --domain marketing --role brand-lead
516
+ agents-city seat --role blank
517
+ agents-city seat --only api,web
518
+ agents-city seat --model sonnet --effort high
519
+ agents-city seat --seat-yolo on
520
+ agents-city seat --no-yolo --no-sync
521
+ ```
522
+
523
+ | Opción | Persistencia y efecto |
524
+ |---|---|
525
+ | `--city NAME|PATH` | selecciona esta ciudad y abre su sesión |
526
+ | `--repos` | vuelve a elegir repos y luego roles de esos agentes; persiste |
527
+ | `--agent-roles`, `--agents` | vuelve a elegir sólo el rol de cada repo; persiste |
528
+ | `--goal` | vuelve a definir el objetivo; persiste |
529
+ | `--engines` | elige runtime/modelo por ventana; persiste |
530
+ | `--domain DOMINIO` | cambia dominio; persiste y pide un rol compatible si no das `--role` |
531
+ | `--role ROL` | cambia el rol del asiento sin picker; persiste |
532
+ | `--only a,b` | abre sólo esos repos en esta sesión; no cambia la ficha |
533
+ | `--model ALIAS` | override de modelo para todas las ventanas de este arranque |
534
+ | `--effort LEVEL` | override `low`, `medium`, `high`, `xhigh` o `max` para este arranque |
535
+ | `--seat-yolo on\|off` | si el propio asiento corre sin preguntar permisos; persiste por ciudad (`seat_yolo` en `city.yml`, también la sexta pregunta del asistente). En local el asiento son las manos del dueño; las ventanas de repo conservan su propia historia de yolo/jaula |
536
+ | `--no-yolo` | desactiva autoaprobación en este arranque — asiento incluido, diga lo que diga `seat_yolo` |
537
+ | `--no-sync` | no hace `git fetch/pull` inicial en repos de este arranque |
538
+
539
+ `seat` acepta un usuario posicional por compatibilidad, pero sólo si coincide con
540
+ el propietario local resuelto. Para otra ciudad del mismo usuario usa `--city`.
541
+
542
+ ### `agents-city cities`
543
+
544
+ Gestiona el catálogo local. Crear o seleccionar no inicia tmux.
545
+
546
+ ```bash
547
+ agents-city cities list
548
+ agents-city cities current
549
+ agents-city cities create producto
550
+ agents-city cities use producto
551
+ agents-city cities use /ruta/a/ciudad
552
+ ```
553
+
554
+ | Subcomando | Salida/efecto |
555
+ |---|---|
556
+ | `list` | ciudades conocidas; `*` marca la seleccionada |
557
+ | `current` | ruta absoluta de la seleccionada |
558
+ | `create NOMBRE` | crea `~/.agents-city/<owner>/<slug>/` y la selecciona |
559
+ | `use NAME|PATH` | selecciona una ciudad existente sin arrancarla |
560
+
561
+ ### `agents-city road`
562
+
563
+ Abre y cierra la allowlist de conexiones entre asientos.
564
+
565
+ ```bash
566
+ agents-city road list producto
567
+ agents-city road connect producto cliente-a
568
+ agents-city road invite producto
569
+ agents-city road invite producto > producto.invitation.json
570
+ agents-city road connect producto research.invitation.json
571
+ agents-city road disconnect producto cliente-a
572
+ agents-city road disconnect producto <city-id-remoto>
573
+ ```
574
+
575
+ | Subcomando | Efecto |
576
+ |---|---|
577
+ | `list CIUDAD` | muestra destino, dirección y si es local/remoto |
578
+ | `connect A B` | si B es local, escribe ambos extremos simétricamente |
579
+ | `connect A invitation.json` | añade sólo el extremo local de una carretera remota |
580
+ | `invite CIUDAD` | imprime JSON público sin token |
581
+ | `disconnect A B|ID` | elimina ambos extremos locales o el id remoto indicado |
582
+
583
+ No se puede conectar una ciudad consigo misma. Una invitación remota debe
584
+ aceptarse de forma independiente en cada máquina.
585
+
586
+ ### `agents-city bus`
587
+
588
+ Opera mensajes entre asientos sobre carreteras ya declaradas.
589
+
590
+ ```bash
591
+ agents-city bus roster
592
+ agents-city bus inbox
593
+ agents-city bus send alice/research "Necesito confirmar el contrato del evento X"
594
+ agents-city bus send '*' "Aviso para todas mis carreteras"
595
+ ```
596
+
597
+ | Subcomando | Efecto |
598
+ |---|---|
599
+ | `roster` | devuelve carreteras y presencia online conocida |
600
+ | `inbox` | devuelve y consume el inbox pendiente; el historial append-only permanece |
601
+ | `send owner/city TEXTO` | envía a un destino permitido |
602
+ | `send '*' TEXTO` | envía a todas las carreteras; exige al menos una |
603
+
604
+ Sólo `seat` puede ejecutar estos comandos. Un actor de repo es rechazado por la
605
+ ACL aunque conozca la dirección.
606
+
607
+ ### `agents-city committee`
608
+
609
+ Gestiona deliberaciones estructuradas dentro de una ciudad. Todos los comandos
610
+ aceptan campos como flags o un objeto JSON con `--input`.
611
+
612
+ ```bash
613
+ agents-city committee list
614
+ agents-city committee history
615
+ agents-city committee show <deliberation-id>
616
+ agents-city committee status <deliberation-id> # alias de show
617
+ agents-city committee schema open
618
+ agents-city committee open --input proposal.json
619
+ agents-city committee open --input - < proposal.json
620
+ ```
621
+
622
+ | Subcomando | Actor permitido | Finalidad |
623
+ |---|---|---|
624
+ | `list` | cualquiera de la ciudad | deliberaciones abiertas |
625
+ | `history` | asiento | decisiones terminadas y recuento de contribuciones |
626
+ | `show ID`, `status ID` | actor implicado | estado y eventos visibles para esa identidad |
627
+ | `schema VERBO` | cualquiera | contrato JSON de un verbo de mutación |
628
+ | `open` | asiento | formula pregunta, resultado buscado, miembros y límites |
629
+ | `respond` | miembro invitado | registra una primera posición independiente |
630
+ | `synthesize` | asiento | publica acuerdos, conflictos e incógnitas |
631
+ | `floor-request` | miembro | pide turno por evidencia, contradicción, riesgo o dependencia |
632
+ | `floor-grant` | asiento | concede una petición de palabra |
633
+ | `floor-deny` | asiento | deniega una petición con motivo |
634
+ | `reply` | miembro con turno | hace una réplica acotada y basada en evidencia |
635
+ | `decide` | asiento | fija resultado, responsables, verificador y reapertura |
636
+ | `verify` | verificador asignado | devuelve `pass` o `fail` con pruebas |
637
+ | `replan` | asiento | reabre una verificación fallida con un plan nuevo |
638
+ | `close` | asiento | cierra un resultado ya verificado |
639
+ | `cancel` | asiento | cancela una deliberación explicando el motivo |
640
+
641
+ Ejemplo de apertura mediante flags:
642
+
643
+ ```bash
644
+ agents-city committee open \
645
+ --question "¿Debemos lanzar hoy?" \
646
+ --outcome-wanted "Una decisión reversible con dueño y verificación" \
647
+ --context "El release candidate ha pasado las pruebas locales" \
648
+ --constraint "No perder datos" \
649
+ --constraint "Poder volver atrás en diez minutos" \
650
+ --done "La decisión nombra ejecutor y verificador" \
651
+ --authority execute \
652
+ --member api \
653
+ --member web \
654
+ --member qa \
655
+ --max-rebuttals 1
656
+ ```
657
+
658
+ El resultado imprime un `deliberationId`. Guárdalo para los pasos siguientes.
659
+ Para payloads grandes es preferible JSON:
660
+
661
+ ```json
662
+ {
663
+ "question": "¿Debemos lanzar hoy?",
664
+ "desiredOutcome": "Una decisión reversible con dueño y verificación",
665
+ "context": "El release candidate ha pasado las pruebas locales",
666
+ "constraints": ["No perder datos", "Rollback en diez minutos"],
667
+ "definitionOfDone": ["Ejecutor y verificador asignados"],
668
+ "authority": "execute",
669
+ "participants": ["api", "web", "qa"],
670
+ "maxRebuttals": 1
671
+ }
672
+ ```
673
+
674
+ ```bash
675
+ agents-city committee open --input proposal.json
676
+ ```
677
+
678
+ `--input -` lee stdin. Si se mezclan JSON y flags, los flags explícitos
679
+ sobrescriben el campo equivalente. Los campos repetibles son `--member`,
680
+ `--constraint`, `--done`, `--evidence`, `--risk`, `--unknown`, `--agreement`,
681
+ `--conflict`, `--check`, `--residual-risk`, `--selected-evidence`,
682
+ `--rejected-option`, `--dissent`, `--reopen-if`, `--learning` y `--followup`.
683
+
684
+ Consulta siempre el contrato exacto disponible en la versión instalada:
685
+
686
+ ```bash
687
+ agents-city committee schema respond
688
+ agents-city committee schema decide
689
+ agents-city committee schema verify
690
+ ```
691
+
692
+ Los comandos de miembro (`respond`, `floor-request` y `reply`) se ejecutan
693
+ normalmente por el agente autenticado de ese repo cuando recibe el sobre. Si los
694
+ ejecutas desde el asiento, el rechazo de ACL es correcto: el bus no finge otra
695
+ identidad por aceptar un nombre como argumento.
696
+
697
+ ### `agents-city skills`
698
+
699
+ Muestra las skills que ya existen en los repos de una ciudad. Es una operación
700
+ sólo de lectura: no instala, copia, activa ni elimina nada.
701
+
702
+ ```bash
703
+ agents-city skills
704
+ agents-city skills producto
705
+ ```
706
+
707
+ Se reconocen estos layouts por repo:
708
+
709
+ ```text
710
+ SKILL.md
711
+ .claude/skills/*/SKILL.md
712
+ .codex/skills/*/SKILL.md
713
+ .agents/skills/*/SKILL.md
714
+ skills/*/SKILL.md
715
+ ```
716
+
717
+ La capacidad real de invocar una skill depende del runtime. Agents City la
718
+ anuncia como capacidad del miembro y deja al proveedor aplicar sus propias reglas
719
+ de descubrimiento y uso.
720
+
721
+ ### `agents-city city`
722
+
723
+ Abre el mapa local de una ciudad, sin arrancar una sesión de agentes.
724
+
725
+ ```bash
726
+ agents-city city
727
+ agents-city city ~/.agents-city/alice/producto
728
+ ```
729
+
730
+ Usa el puerto `8787` o el siguiente libre, enlaza en loopback y abre el
731
+ navegador. `Ctrl-c` detiene el servidor. `units.yml`, `parcels.yml`, la ficha y
732
+ el estado del bus alimentan la visualización.
733
+
734
+ El mapa está vivo, no es una postal. Tres capas escenifican lo que pasa AHORA,
735
+ todas derivadas de datos que el producto ya emite: la presencia (una casa en
736
+ mitad de un turno brilla y respira; una recién parada se enfría), el
737
+ ayuntamiento (las sesiones del comité se representan en escena — las posiciones
738
+ selladas llegan volando boca abajo, la palabra es una mano alzada, la
739
+ verificación estampa la puerta y el cierre archiva el acta — con la cámara
740
+ volando a la sesión y los miembros caminando hasta ella), y una puerta por
741
+ carretera, por la que salen las cartas hacia otras ciudades. Los agentes tienen
742
+ caras identicón deterministas, las parcelas `knowledge`/`coordinator` visten
743
+ una familia de edificios distinta de `code`, el ayuntamiento y las puertas son
744
+ clicables, `P` (o el control ⛶) alterna pantalla completa, y el rail en vivo
745
+ del Hall se redimensiona arrastrando su borde. El contrato completo está en
746
+ [docs/map-live-layers.md](docs/map-live-layers.md).
747
+
748
+ ### `agents-city demo`
749
+
750
+ Abre una ciudad ficticia y desechable en el Hall completo. El centro contiene
751
+ el mapa; el lateral derecho reproduce una deliberación guiada y los mismos
752
+ turnos aparecen como bocadillos `Para …:` sobre sus agentes. Hay una demo por
753
+ dominio — caos real contado en palabras llanas, no en frases de programadores:
754
+
755
+ ```bash
756
+ agents-city demo # software · Aurora Games — la noche en que desaparecieron las partidas
757
+ agents-city demo --domain medicina # Clínica Alba — la mañana de las citas duplicadas
758
+ agents-city demo --domain legal # Costa & Ley — el plazo de mañana a las nueve
759
+ agents-city demo --no-browser
760
+ ```
761
+
762
+ No arranca modelos ni necesita cuentas de Claude, Codex, OpenCode o Kimi. Las
763
+ historias son presentación declarada, pero su ingeniería no es una animación:
764
+ los 22 eventos recorren el WebSocket autenticado, la máquina de estados del
765
+ comité, el registro durable y el feed de espectador reales. Cada historia
766
+ recorre la máquina ENTERA, incluida la parte que las demos suelen esconder:
767
+ tres posiciones aisladas, dos palabras concedidas por el asiento, una decisión,
768
+ una verificación que FALLA, un replanteo, y solo entonces un cierre verificado.
769
+ La clínica y el despacho son ciudades agents-first — agentes knowledge y
770
+ coordinator, sin repositorios — así que ejercitan además el roster y las
771
+ familias de edificios del mapa.
772
+
773
+ En las ciudades demo, el rail en vivo del Hall muestra el control enmarcado
774
+ **guided committee**: `⟳ replay` repite la historia del dominio, y `⏸ pause` /
775
+ `▶ resume` detienen y reanudan el propio proceso narrador (`SIGSTOP`, una
776
+ pausa de verdad). `/api/demo` rechaza cualquier ciudad que no sea una demo
777
+ empaquetada: el comité de una ciudad real es real, y repetirlo sería publicar
778
+ ficción en un bus real.
779
+
780
+ La demo copia su ciudad y su runtime a una carpeta temporal. `Ctrl-c` cierra su
781
+ Hall, mapa y hub y elimina esa copia; no selecciona, reescribe ni arranca tus
782
+ ciudades. Si ya hay otro mapa en `8787`, usa otro puerto y el Hall comprueba la
783
+ identidad para no incrustar accidentalmente la ciudad equivocada.
784
+
785
+ ### `agents-city report`
786
+
787
+ Calcula el crecimiento que puede representarse en el mapa y, opcionalmente, lo
788
+ envía al servicio de ciudad configurado.
789
+
790
+ ```bash
791
+ agents-city report
792
+ agents-city report --data ~/.agents-city/alice/producto
793
+ agents-city report --url https://city.example.com --token "$CITY_TOKEN"
794
+ agents-city report --push --quiet
795
+ ```
796
+
797
+ | Opción | Efecto |
798
+ |---|---|
799
+ | `--data RUTA` | usa otra carpeta de datos de ciudad |
800
+ | `--url URL` | sustituye la URL del servicio |
801
+ | `--token TOKEN` | sustituye el token de autenticación |
802
+ | `--push` | envía el informe; sin este flag sólo lo calcula/muestra |
803
+ | `--quiet` | reduce la salida humana |
804
+
805
+ ### `agents-city tokens`
806
+
807
+ Agrega consumo de transcripciones locales de Claude y puede enviar sólo los
808
+ totales. No envía prompts, respuestas ni rutas de ficheros.
809
+
810
+ ```bash
811
+ agents-city tokens
812
+ agents-city tokens --days 7
813
+ agents-city tokens --all
814
+ agents-city tokens --push --quiet
815
+ agents-city tokens --url https://city.example.com --token "$CITY_TOKEN"
816
+ ```
817
+
818
+ | Opción | Efecto |
819
+ |---|---|
820
+ | `--days N` | ventana temporal; por defecto 30 días |
821
+ | `--all` | relee las transcripciones dentro de `--days`, ignorando la caché incremental |
822
+ | `--url URL` | sustituye la URL del servicio |
823
+ | `--token TOKEN` | sustituye el token de autenticación |
824
+ | `--push` | envía agregados; sin este flag sólo los muestra |
825
+ | `--quiet` | reduce la salida humana |
826
+
827
+ `tokens` no estima automáticamente el consumo de Codex, OpenCode o Kimi.
828
+
829
+ ### `agents-city logs`
830
+
831
+ Lee los dos flujos locales persistentes de la ciudad seleccionada: actividad
832
+ semántica visible y diagnósticos operativos con secretos eliminados. No lee el
833
+ razonamiento del proveedor.
834
+
835
+ ```bash
836
+ agents-city logs
837
+ agents-city logs --activity --lines 50
838
+ agents-city logs --diagnostics --lines 200
839
+ agents-city logs --follow
840
+ agents-city logs --json --follow
841
+ ```
842
+
843
+ | Opción | Efecto |
844
+ |---|---|
845
+ | `--activity` | sólo prompts, respuestas, trabajo y actos de comité visibles |
846
+ | `--diagnostics` | sólo diagnósticos de hub, sockets, gateways, hooks y launchers |
847
+ | `-n, --lines N` | registros iniciales; por defecto 100 |
848
+ | `-f, --follow` | sigue mostrando registros nuevos hasta `Ctrl-c` |
849
+ | `--json` | emite los registros JSONL almacenados sin transformarlos |
850
+
851
+ Los ficheros están en el runtime privado de la ciudad como `activity.jsonl` y
852
+ `diagnostics.jsonl`. Sobreviven a recargar el Hall y reiniciar el bus, tienen
853
+ modo `0600` y se pueden inspeccionar directamente. Los IDs de origen hacen
854
+ idempotentes las notificaciones o hooks repetidos del proveedor.
855
+
856
+ ### `agents-city benchmark`
857
+
858
+ Mide transporte, runtimes reales o la estructura del protocolo de comité.
859
+
860
+ #### Stress local, sin gastar cuota de modelos
861
+
862
+ ```bash
863
+ agents-city benchmark stress
864
+ agents-city benchmark stress --agents 40 --rounds 2 --timeout 20
865
+ agents-city benchmark stress --agents 80 --rounds 5 --json
866
+ agents-city benchmark stress --keep
867
+ ```
868
+
869
+ | Opción | Efecto |
870
+ |---|---|
871
+ | `--agents N` | actores simulados; debe ser par, por defecto 40 |
872
+ | `--rounds N` | rondas por actor; por defecto 2 |
873
+ | `--timeout SEG` | límite del benchmark; por defecto 20 |
874
+ | `--json` | salida legible por máquina |
875
+ | `--keep` | conserva el workspace temporal para inspección |
876
+
877
+ #### Runtimes reales, con consumo de cuota
878
+
879
+ ```bash
880
+ agents-city benchmark live --runtime claude --runtime codex
881
+ agents-city benchmark live \
882
+ --runtime codex \
883
+ --runtime kimi \
884
+ --timeout 180 \
885
+ --json
886
+ agents-city benchmark live \
887
+ --command codex="codex --model gpt-5" \
888
+ --command opencode="opencode -m lmstudio/qwen3-coder" \
889
+ --keep
890
+ ```
891
+
892
+ | Opción | Efecto |
893
+ |---|---|
894
+ | `--runtime RUNTIME` | runtime a medir; repetible: `claude`, `codex`, `kimi`, `opencode` |
895
+ | `--command RUNTIME=COMANDO` | comando concreto para ese runtime; repetible |
896
+ | `--timeout SEG` | límite de cada caso; por defecto 180 |
897
+ | `--json` | salida legible por máquina |
898
+ | `--no-save` | no guarda el resultado en el historial local |
899
+ | `--keep` | conserva los workspaces temporales |
900
+
901
+ `live` hace llamadas reales a los proveedores instalados y puede consumir cuota
902
+ o dinero. Comprueba autenticación y límites antes de lanzarlo.
903
+
904
+ #### Protocolo de comité
905
+
906
+ ```bash
907
+ agents-city benchmark committee
908
+ agents-city benchmark committee --json
909
+ ```
910
+
911
+ Compara el flujo estructurado con un chat no acotado: barrera de respuestas,
912
+ turnos, decisión y verificación. Es un benchmark estructural determinista; no
913
+ demuestra por sí solo mayor calidad de respuesta ni una afirmación SOTA.
914
+
915
+ ### `agents-city reset`
916
+
917
+ Reinicia **una** ciudad gestionada conservando su identidad estable y sus repos.
918
+
919
+ ```bash
920
+ agents-city reset producto --dry-run
921
+ agents-city reset producto
922
+ ```
923
+
924
+ El plan de reset:
925
+
926
+ 1. valida que el destino sea una ciudad gestionada, no una ruta arbitraria;
927
+ 2. muestra y detiene sólo su sesión/runtime;
928
+ 3. crea un backup recuperable bajo el propietario;
929
+ 4. conserva `id`, propietario, nombre y slug;
930
+ 5. elimina configuración, deliberaciones y estado generado de esa ciudad;
931
+ 6. no toca los repos de código;
932
+ 7. elimina simétricamente las carreteras locales incidentes;
933
+ 8. deja la ciudad lista para repetir onboarding.
934
+
935
+ No existe todavía un comando automático `restore`; la ruta exacta del backup
936
+ se imprime para una recuperación manual. Ejecuta siempre primero `--dry-run`.
937
+
938
+ ### `agents-city exit`
939
+
940
+ Detiene sesiones y procesos de Agents City; no borra configuración.
941
+
942
+ ```bash
943
+ agents-city exit producto --dry-run
944
+ agents-city exit producto
945
+ agents-city exit --dry-run
946
+ agents-city exit
947
+ ```
948
+
949
+ Con una ciudad, cierra sólo su tmux, gateway y procesos auxiliares; el Hall puede
950
+ seguir activo. Sin ciudad, muestra o cierra todo lo gestionado por Agents City.
951
+ Una sesión tmux puede contener trabajo sin guardar, por lo que el dry-run es la
952
+ forma segura de comprobar el alcance.
953
+
954
+ ### `agents-city test`
955
+
956
+ Ejecuta la suite del checkout. Sin argumentos ejecuta todas las suites; con
957
+ nombres ejecuta sólo las indicadas.
958
+
959
+ ```bash
960
+ agents-city test
961
+ agents-city test seat runtime-ui
962
+ agents-city test committee stress benchmark
963
+ ```
964
+
965
+ Suites disponibles:
966
+
967
+ ```text
968
+ widgets card parcels domains serve seat cities channel committee live-feed
969
+ runtime runtime-ui runtime-failures stress adapter benchmark contracts exit
970
+ cage broker launch
971
+ ```
972
+
973
+ Este comando está pensado para contribuidores o para validar un tarball local;
974
+ una instalación de uso normal no necesita ejecutar los tests en cada arranque.
975
+
976
+ ## Comité: flujo completo
977
+
978
+ El comité está diseñado como un comité de dirección: el asiento formula la
979
+ decisión y preside; los especialistas aportan evidencia desde sus repos; nadie
980
+ abre una conversación lateral; el asiento integra y otra identidad verifica.
981
+
982
+ ```text
983
+ open
984
+ └─ collecting: posiciones independientes y ocultas
985
+ ├─ faltan respuestas + proceedWithout ─┐
986
+ └─ responden todos -> review │
987
+ v
988
+ synthesize
989
+
990
+ v
991
+ deliberating
992
+ ┌─ palabra acotada ─┐
993
+ └─ floor request/reply ┘
994
+
995
+ decide
996
+
997
+ v
998
+ verifying
999
+ ┌─ fail ─└─ pass
1000
+ v v
1001
+ verification_failed verified
1002
+ │ │
1003
+ replan close
1004
+ │ │
1005
+ └─> review closed
1006
+ ```
1007
+
1008
+ ### 1. Preparar el brief
1009
+
1010
+ Una buena pregunta nombra una decisión, no un tema. El resultado deseado explica
1011
+ qué debe salir del comité; `definitionOfDone` contiene condiciones observables.
1012
+ Selecciona sólo repos capaces de aportar evidencia relevante.
1013
+
1014
+ | Campo de `open` | Obligatorio | Valores/semántica |
1015
+ |---|---|---|
1016
+ | `question` | sí | la decisión exacta |
1017
+ | `desiredOutcome` | sí | resultado concreto esperado |
1018
+ | `context` | no | hechos mínimos necesarios |
1019
+ | `constraints` | no | tiempo, coste, seguridad o política |
1020
+ | `definitionOfDone` | sí, lista | criterios observables de aceptación |
1021
+ | `authority` | no | `recommend`, `decide` o `execute`; por defecto `recommend` |
1022
+ | `participants` | sí, lista | nombres de actores repo de esa ciudad |
1023
+ | `maxRebuttals` | no | entero de 0 a 5; por defecto 2 por miembro |
1024
+
1025
+ `authority` documenta el mandato de la decisión; no cambia las ACL técnicas.
1026
+
1027
+ ### 2. Recoger posiciones aisladas
1028
+
1029
+ Cada participante recibe el mismo brief y responde una sola vez:
1030
+
1031
+ ```bash
1032
+ agents-city committee respond "$DELIBERATION_ID" \
1033
+ --stance conditional \
1034
+ --recommendation "Lanzar primero al 10 %" \
1035
+ --evidence "npm test: 844 comprobaciones correctas" \
1036
+ --expected-impact "Detectar regresiones antes del despliegue total" \
1037
+ --visible-when "Tras 30 minutos de telemetría" \
1038
+ --withdraw-if "La migración no es reversible" \
1039
+ --risk "Capacidad insuficiente durante el canary" \
1040
+ --unknown "Carga real de la primera hora"
1041
+ ```
1042
+
1043
+ `stance` debe ser `support`, `oppose`, `conditional` o `abstain`. `evidence` es
1044
+ obligatorio y repetible. La respuesta la ejecuta el runtime dentro de la ventana
1045
+ del repo, con su identidad real. Hasta alcanzar la barrera, el asiento ve el
1046
+ progreso, no el contenido de las primeras posiciones; esto reduce el anclaje.
1047
+
1048
+ ### 3. Sintetizar sin votar
1049
+
1050
+ Cuando todas las posiciones están listas, el asiento integra evidencia:
1051
+
1052
+ ```bash
1053
+ agents-city committee synthesize "$DELIBERATION_ID" \
1054
+ --summary "Existe acuerdo sobre un canary reversible" \
1055
+ --agreement "La migración debe tener rollback probado" \
1056
+ --conflict "10 % frente a 25 % de tráfico inicial" \
1057
+ --unknown "Capacidad bajo el pico previsto"
1058
+ ```
1059
+
1060
+ Si falta un miembro, no basta con ignorarlo:
1061
+
1062
+ ```bash
1063
+ agents-city committee synthesize "$DELIBERATION_ID" \
1064
+ --summary "Síntesis provisional" \
1065
+ --proceed-without "QA está offline; el límite vence hoy y conservamos rollback"
1066
+ ```
1067
+
1068
+ La decisión se basa en evidencia, impacto y condiciones de retirada, no en contar
1069
+ votos.
1070
+
1071
+ ### 4. Pedir y conceder la palabra
1072
+
1073
+ Después de la síntesis un miembro sólo puede replicar si presenta una base
1074
+ admitida:
1075
+
1076
+ ```bash
1077
+ agents-city committee floor-request "$DELIBERATION_ID" \
1078
+ --basis new_evidence \
1079
+ --reason "El canary falló en el test de rollback" \
1080
+ --evidence "artifacts/rollback.log: exit 1"
1081
+ ```
1082
+
1083
+ `basis` admite `new_evidence`, `contradiction`, `risk` o `dependency`. El asiento
1084
+ resuelve la petición usando el `requestId` devuelto:
1085
+
1086
+ ```bash
1087
+ agents-city committee floor-grant "$DELIBERATION_ID" --request-id "$REQUEST_ID"
1088
+ # o bien:
1089
+ agents-city committee floor-deny "$DELIBERATION_ID" \
1090
+ --request-id "$REQUEST_ID" \
1091
+ --reason "La evidencia ya forma parte de la síntesis"
1092
+ ```
1093
+
1094
+ Al concederse, ese miembro tiene exactamente una réplica y libera el turno al
1095
+ usarla:
1096
+
1097
+ ```bash
1098
+ agents-city committee reply "$DELIBERATION_ID" \
1099
+ --claim "No es seguro lanzar con el script actual" \
1100
+ --evidence "artifacts/rollback.log: exit 1" \
1101
+ --consequence "Bloquear hasta corregir y repetir rollback"
1102
+ ```
1103
+
1104
+ La réplica llega al asiento **y se oye en todo el comité**. Los demás miembros no
1105
+ contestan directamente: si uno detecta evidencia nueva, contradicción, riesgo o
1106
+ dependencia, pide otra vez la palabra al asiento. Éste concede o deniega y sólo
1107
+ entonces habla ese agente. Así hay conversación real entre especialistas, pero
1108
+ mediada como un comité de dirección, no un chat todos-contra-todos. No pueden
1109
+ coexistir dos turnos activos; cada concesión permite una sola intervención;
1110
+ `maxRebuttals` limita la cascada por miembro; y el asiento debe resolver todas las
1111
+ peticiones pendientes antes de decidir.
1112
+
1113
+ ### 5. Decidir y atribuir
1114
+
1115
+ ```bash
1116
+ agents-city committee decide "$DELIBERATION_ID" \
1117
+ --outcome "Corregir rollback y lanzar canary al 10 %" \
1118
+ --rationale "Reduce el radio de impacto y satisface el criterio reversible" \
1119
+ --owner "Responsable de release" \
1120
+ --executor api \
1121
+ --verifier qa \
1122
+ --verification-question "¿Rollback y canary pasan de extremo a extremo?" \
1123
+ --selected-evidence "suite completa verde" \
1124
+ --selected-evidence "fallo reproducible de rollback" \
1125
+ --decisive-contributors qa \
1126
+ --rejected-option "Lanzamiento total inmediato" \
1127
+ --dissent "web prefiere un canary del 25 %" \
1128
+ --reopen-if "errores 5xx > 1 % durante cinco minutos"
1129
+ ```
1130
+
1131
+ `selectedEvidence`, `decisiveContributors` y `reopenIf` son obligatorios. Si hay
1132
+ otra identidad disponible, `verifier` no puede ser el mismo actor que `executor`.
1133
+ La disensión se conserva en el acta aunque no cambie la decisión. Usa input JSON
1134
+ cuando debas registrar más de un contribuidor decisivo.
1135
+
1136
+ ### 6. Verificar, replanificar o cerrar
1137
+
1138
+ Sólo el verificador asignado puede ejecutar:
1139
+
1140
+ ```bash
1141
+ agents-city committee verify "$DELIBERATION_ID" \
1142
+ --result pass \
1143
+ --evidence "artifacts/e2e-rollback.txt" \
1144
+ --check "canary responde 200" \
1145
+ --check "rollback restaura la versión anterior" \
1146
+ --residual-risk "La primera hora a plena carga aún no está observada"
1147
+ ```
1148
+
1149
+ Con `fail`, el asiento debe replanificar y volver a sintetizar/decidir:
1150
+
1151
+ ```bash
1152
+ agents-city committee replan "$DELIBERATION_ID" \
1153
+ --reason "El rollback sigue dejando el esquema incompatible"
1154
+ ```
1155
+
1156
+ Con `pass`, el asiento puede cerrar:
1157
+
1158
+ ```bash
1159
+ agents-city committee close "$DELIBERATION_ID" \
1160
+ --summary "Canary verificado; despliegue autorizado" \
1161
+ --learning "Probar rollback antes de fijar la ventana de release" \
1162
+ --followup "Observar 5xx durante la primera hora"
1163
+ ```
1164
+
1165
+ Una deliberación no se puede cerrar sin verificación reproducible aprobada. Si
1166
+ deja de ser relevante, el asiento puede usar:
1167
+
1168
+ ```bash
1169
+ agents-city committee cancel "$DELIBERATION_ID" \
1170
+ --reason "El release fue sustituido por otro candidato"
1171
+ ```
1172
+
1173
+ Estados, eventos y acta legible quedan en `deliberations/`; `history` resume
1174
+ decisiones recientes y contribuciones decisivas para ayudar a detectar influencia
1175
+ repetida. Ese recuento es una señal de revisión, no una prueba automática de sesgo.
1176
+
1177
+ ## Comandos `/city:` de Claude
1178
+
1179
+ Estos comandos los aporta el plugin de Claude. No existen dentro de las TUI de
1180
+ Codex, OpenCode o Kimi; en ellas se usan los comandos `agents-city` equivalentes.
1181
+
1182
+ | Comando | Caso de uso |
1183
+ |---|---|
1184
+ | `/city:setup [--city N] [--tui] [--demo]` | crear/abrir una ciudad mediante el flujo compartido |
1185
+ | `/city:join [--domain D\|--role R\|--repos\|--agent-roles\|--goal\|--engines]` | nombre compatible para configurar el asiento; no añade otra persona |
1186
+ | `/city:session [--no-yolo] [--only a,b]` | abrir o reanudar el tmux de esta ciudad |
1187
+ | `/city:settings [domain\|role\|repos\|agent-roles\|goal\|engines\|roads\|skills]` | leer o cambiar una parte de la configuración |
1188
+ | `/city:goals` | mostrar o editar el objetivo actual |
1189
+ | `/city:committee PREGUNTA` | preparar y abrir una deliberación presidida |
1190
+ | `/city:committee status ID` | inspeccionar el siguiente paso legal de una deliberación |
1191
+ | `/city:round [--to owner/city] [--since FECHA]` | contrastar objetivo y evidencia local; consultar carreteras relevantes |
1192
+ | `/city:notice [--pr N\|--since REF] [--dry]` | avisar de un cambio verificado sólo a ciudades afectadas |
1193
+ | `/city:propose owner/city [ASUNTO]` | enviar una propuesta respaldada por evidencia |
1194
+ | `/city:team` | alias histórico: lista ciudades, ciudad activa, repos y carreteras; no personas |
1195
+ | `/city:exit [CIUDAD] [--dry-run]` | mostrar o cerrar procesos gestionados |
1196
+
1197
+ `/city:notice --dry` no envía nada. `/city:round` y `/city:propose` sólo pueden
1198
+ usar destinos presentes en `road list`. Una respuesta de otra ciudad informa al
1199
+ asiento; nunca adquiere autoridad para ordenar directamente a un repo local.
1200
+
1201
+ ## Recetario de casos de uso
1202
+
1203
+ ### Caso 1: empezar de cero con una ciudad y Claude
1204
+
1205
+ ```bash
1206
+ cd /ruta/al/checkout/agents-city
1207
+ npm pack
1208
+ npm install -g ./agents-city-0.3.0-beta.21.tgz
1209
+ agents-city seat
1210
+ ```
1211
+
1212
+ 1. Elige el dominio.
1213
+ 2. Elige el rol del asiento.
1214
+ 3. Selecciona repos o continúa sin ninguno.
1215
+ 4. Define u omite el objetivo.
1216
+ 5. Pulsa Enter en motores para conservar Claude.
1217
+
1218
+ Resultado: ciudad `home`, sesión `<owner>-home`, una ventana `seat` y una por repo
1219
+ local seleccionado. Agents City mantiene un proceso oficial de Claude Code por
1220
+ ventana y lo alimenta mediante `stream-json` persistente; no solicita un Channel
1221
+ personalizado ni requiere aprobación admin o por ventana.
1222
+
1223
+ ### Caso 2: usar Codex como asiento principal
1224
+
1225
+ ```bash
1226
+ agents-city seat --engines
1227
+ ```
1228
+
1229
+ En la fila `seat`, elige Codex; confirma el resto y abre la ciudad. Agents City
1230
+ arranca `codex app-server` en loopback y abre la TUI oficial con
1231
+ `codex --remote`. La TUI crea su thread persistido; el gateway detecta sólo el
1232
+ thread nuevo de esa carpeta y se une mediante `thread/resume`. Debes poder
1233
+ escribir directamente en Codex. Un prompt `city>` en la ventana del asiento
1234
+ Codex indica una versión antigua o un arranque fallido; no es la interfaz
1235
+ prevista para Codex.
1236
+
1237
+ ### Caso 3: mezclar motores por repo
1238
+
1239
+ ```bash
1240
+ agents-city seat --city producto --engines
1241
+ ```
1242
+
1243
+ Ejemplo de selección:
1244
+
1245
+ ```text
1246
+ seat Codex
1247
+ api Claude / modelo opus / esfuerzo high
1248
+ web Codex
1249
+ analytics OpenCode
1250
+ research Kimi
1251
+ ```
1252
+
1253
+ Cada elección persiste en la ficha. La siguiente ejecución de `seat` reutiliza
1254
+ la configuración. Para probar otros motores sin mezclar procesos antiguos:
1255
+
1256
+ ```bash
1257
+ agents-city exit producto --dry-run
1258
+ agents-city exit producto
1259
+ agents-city seat --city producto --engines
1260
+ ```
1261
+
1262
+ ### Caso 4: usar un modelo local mediante OpenCode
1263
+
1264
+ Agents City no decide el proveedor de OpenCode. En el picker de motores, elige
1265
+ OpenCode e introduce el comando/modelo aceptado por tu instalación, por ejemplo:
1266
+
1267
+ ```text
1268
+ opencode -m lmstudio/qwen3-coder
1269
+ ```
1270
+
1271
+ Valida primero que el comando funciona solo:
1272
+
1273
+ ```bash
1274
+ opencode -m lmstudio/qwen3-coder
1275
+ ```
1276
+
1277
+ Después usa `agents-city seat --engines`. La entrega del bus llega por HTTP/SSE;
1278
+ el modelo puede ser local aunque Agents City siga usando el mismo sobre tipado.
1279
+
1280
+ ### Caso 5: usar una CLI todavía no integrada
1281
+
1282
+ Elige «otro comando (fallback de terminal)» en `--engines` e introduce, por
1283
+ ejemplo, `gemini`. Agents City lo guarda como:
1284
+
1285
+ ```yaml
1286
+ runs.api: terminal:gemini
1287
+ ```
1288
+
1289
+ El prefijo hace explícito que esa ventana puede necesitar inyección visible en
1290
+ tmux. Un comando desconocido sin `terminal:` se rechaza al leer una ficha editada
1291
+ a mano; no degrada silenciosamente el transporte de los runtimes conocidos.
1292
+
1293
+ ### Caso 6: crear varias ciudades del mismo usuario
1294
+
1295
+ ```bash
1296
+ agents-city cities create producto
1297
+ agents-city seat --city producto
1298
+
1299
+ agents-city cities create cliente-a
1300
+ agents-city seat --city cliente-a
1301
+
1302
+ agents-city cities list
1303
+ ```
1304
+
1305
+ Resultado esperado:
1306
+
1307
+ ```text
1308
+ ~/.agents-city/<owner>/producto/
1309
+ ~/.agents-city/<owner>/cliente-a/
1310
+ ```
1311
+
1312
+ Cada una tiene dominio, rol, objetivo, repos, skills reconocidas, deliberaciones,
1313
+ roads, runtime y sesión tmux propios. `home` no tiene ningún privilegio especial.
1314
+
1315
+ ### Caso 7: asignar a cada repo una especialidad distinta
1316
+
1317
+ ```bash
1318
+ agents-city seat --city producto --agent-roles
1319
+ ```
1320
+
1321
+ Puedes asignar `po` al repo principal, `seo` al portfolio y `data-engineer` al
1322
+ pipeline aunque el dominio del asiento sea `software`. El picker permite buscar
1323
+ roles de otros dominios. La especialidad modifica la perspectiva y el contexto
1324
+ editable; la autoridad técnica sigue siendo `member` para todos esos repos.
1325
+
1326
+ ### Caso 8: trabajar sin un perfil precargado
1327
+
1328
+ ```bash
1329
+ agents-city seat --city laboratorio --role blank
1330
+ agents-city seat --city laboratorio --agent-roles
1331
+ ```
1332
+
1333
+ Selecciona también `blank` en los repos que no deban recibir un perfil. No se crea
1334
+ un fichero de conocimiento de rol ni se infiere uno oculto. Las instrucciones del
1335
+ repo y sus skills siguen funcionando normalmente.
1336
+
1337
+ ### Caso 9: conectar dos ciudades locales
1338
+
1339
+ ```bash
1340
+ agents-city road connect producto cliente-a
1341
+ agents-city road list producto
1342
+ agents-city road list cliente-a
1343
+ ```
1344
+
1345
+ La carretera se escribe en ambos extremos. Arranca ambas ciudades y desde el
1346
+ asiento de una:
1347
+
1348
+ ```bash
1349
+ CITY_OWNER=alice
1350
+ AGENTS_CITY_DATA="$HOME/.agents-city/$CITY_OWNER/producto" \
1351
+ agents-city bus send "$CITY_OWNER/cliente-a" "¿Afecta este cambio a vuestro contrato?"
1352
+ ```
1353
+
1354
+ En una sesión normal no hace falta establecer `AGENTS_CITY_DATA`: ya está
1355
+ inyectado en cada ventana. El ejemplo lo hace explícito para una terminal externa.
1356
+
1357
+ ### Caso 10: conectar ciudades de dos máquinas o personas
1358
+
1359
+ En la máquina A:
1360
+
1361
+ ```bash
1362
+ agents-city road invite producto > producto.invitation.json
1363
+ ```
1364
+
1365
+ Transfiere ese JSON por un canal apropiado. No contiene el token del bus. En la
1366
+ máquina B:
1367
+
1368
+ ```bash
1369
+ agents-city road connect research producto.invitation.json
1370
+ agents-city road invite research > research.invitation.json
1371
+ ```
1372
+
1373
+ Devuelve la invitación de B y acéptala en A:
1374
+
1375
+ ```bash
1376
+ agents-city road connect producto research.invitation.json
1377
+ ```
1378
+
1379
+ Ambas máquinas necesitan el mismo transporte remoto compatible y credenciales
1380
+ válidas mediante `CITY_BUS_URL`/`CITY_BUS_TOKEN`. La invitación sólo declara la
1381
+ allowlist; no despliega infraestructura ni comparte secretos. Consulta
1382
+ [docs/self-host.md](docs/self-host.md) para el Worker remoto.
1383
+
1384
+ ### Caso 11: pedir una decisión a varios repos sin chat grupal
1385
+
1386
+ Desde el asiento Claude:
1387
+
1388
+ ```text
1389
+ /city:committee ¿Podemos activar la nueva migración en producción?
1390
+ ```
1391
+
1392
+ Desde cualquier otro runtime, prepara el brief y usa:
1393
+
1394
+ ```bash
1395
+ agents-city committee open --input migration-decision.json
1396
+ ```
1397
+
1398
+ El asiento selecciona sólo los repos relevantes. Cada primera respuesta queda
1399
+ aislada; después hay síntesis, peticiones de palabra, decisión atribuida y
1400
+ verificación. Usa `agents-city committee show ID` para ver el estado, no para
1401
+ saltarse el siguiente actor legal.
1402
+
1403
+ ### Caso 12: arrancar sólo uno o varios repos de una ciudad grande
1404
+
1405
+ ```bash
1406
+ agents-city seat --city producto --only api
1407
+ agents-city seat --city producto --only api,web
1408
+ ```
1409
+
1410
+ `--only` filtra ventanas para ese arranque; no elimina repos ni roles de la ficha.
1411
+ Si ya existe una sesión con otra composición, ciérrala de forma acotada antes:
1412
+
1413
+ ```bash
1414
+ agents-city exit producto --dry-run
1415
+ agents-city exit producto
1416
+ ```
1417
+
1418
+ ### Caso 13: seleccionar o clonar repos privados desde GitHub
1419
+
1420
+ ```bash
1421
+ agents-city seat --repos
1422
+ ```
1423
+
1424
+ Elige «mi cuenta GitHub» u «organización GitHub». Si `gh` falta, el asistente
1425
+ intenta instalarlo; si no hay sesión, abre `gh auth login --web`. El navegador o
1426
+ el código de dispositivo autentican `gh`, no Agents City. Los repos privados sólo
1427
+ aparecen si ese token tiene alcance. Un repo seleccionado pero no clonado puede
1428
+ quedar en la ficha sin ventana o clonarse, previa confirmación, bajo
1429
+ `CITY_CODE_DIR` (por defecto `~/codigo`).
1430
+
1431
+ ### Caso 14: inspeccionar skills sin instalarlas
1432
+
1433
+ ```bash
1434
+ agents-city skills producto
1435
+ ```
1436
+
1437
+ Si `api/.codex/skills/migraciones/SKILL.md` aparece, significa que el repo ya
1438
+ posee esa skill. Agents City no la copia a la ciudad ni la impone al agente. Al
1439
+ añadir, editar o quitar el `SKILL.md`, la siguiente lectura refleja el cambio sin
1440
+ reinstalar Agents City.
1441
+
1442
+ ### Caso 15: abrir sólo el mapa o la demo guiada
1443
+
1444
+ ```bash
1445
+ agents-city city ~/.agents-city/<owner>/producto
1446
+ agents-city demo
1447
+ ```
1448
+
1449
+ `city` representa datos reales de esa ciudad. `demo` abre el Hall completo de
1450
+ Aurora Games y reproduce agentes de presentación sobre la infraestructura real,
1451
+ sin invocar modelos. Si quieres administrar tus ciudades, usa `agents-city hall`.
1452
+
1453
+ ### Caso 16: medir rendimiento y detectar regresiones
1454
+
1455
+ Primero mide el bus de forma determinista y sin modelos:
1456
+
1457
+ ```bash
1458
+ agents-city benchmark stress --agents 40 --rounds 2 --json
1459
+ ```
1460
+
1461
+ Guarda el JSON como baseline. Después, si aceptas consumo de cuota, mide el camino
1462
+ real:
1463
+
1464
+ ```bash
1465
+ agents-city benchmark live \
1466
+ --runtime claude \
1467
+ --runtime codex \
1468
+ --runtime kimi \
1469
+ --timeout 180 \
1470
+ --json
1471
+ ```
1472
+
1473
+ Compara por separado aceptación bus→runtime y tiempo extremo a extremo. Una
1474
+ respuesta correcta del modelo no convierte una demora de transporte en «tiempo
1475
+ de razonamiento»; una autenticación fallida tampoco se cuenta como muestra rápida.
1476
+
1477
+ ### Caso 17: actualizar sin dejar sesiones con código antiguo
1478
+
1479
+ ```bash
1480
+ cd /ruta/al/checkout/agents-city
1481
+ npm pack
1482
+ npm install -g ./agents-city-0.3.0-beta.21.tgz
1483
+ agents-city --version
1484
+ agents-city exit producto --dry-run
1485
+ agents-city exit producto
1486
+ agents-city seat --city producto
1487
+ ```
1488
+
1489
+ Instalar un tarball no reescribe procesos ya vivos. Reiniciar sólo la ciudad evita
1490
+ cerrar otra ciudad o un tmux ajeno.
1491
+
1492
+ ### Caso 18: borrar la configuración de una ciudad y repetir onboarding
1493
+
1494
+ ```bash
1495
+ agents-city reset laboratorio --dry-run
1496
+ agents-city reset laboratorio
1497
+ agents-city seat --city laboratorio
1498
+ ```
1499
+
1500
+ El reset mantiene la identidad de `laboratorio`, crea backup y no toca sus repos.
1501
+ Para borrar solamente procesos, usa `exit`, no `reset`.
1502
+
1503
+ ## Ficheros y variables de entorno
1504
+
1505
+ ### `city.yml`: identidad de la ciudad
1506
+
1507
+ Este fichero contiene la identidad estable y el dominio. No reutilices un `id`
1508
+ copiando la carpeta para crear otra ciudad; usa `cities create`.
1509
+
1510
+ ```yaml
1511
+ id: city_a1b2c3d4
1512
+ name: producto
1513
+ slug: producto
1514
+ owner: alice
1515
+ domain: software
1516
+ seat_yolo: 1
1517
+ ```
1518
+
1519
+ El address público se deriva como `owner/slug`; no se guarda como una identidad
1520
+ global del plugin porque varias ciudades pueden ejecutarse a la vez.
1521
+ `seat_yolo: 1` lanza el propio asiento sin preguntar permisos — se elige en la
1522
+ sexta pregunta del asistente o con `agents-city seat --seat-yolo on|off`;
1523
+ `--no-yolo` sigue frenando la sesión entera.
1524
+
1525
+ ### `<owner>.md`: ficha del asiento
1526
+
1527
+ Es Markdown con frontmatter. Contiene el rol del asiento, repos, rol de cada repo,
1528
+ objetivo y motor por ventana. Ejemplo reducido:
1529
+
1530
+ ```yaml
1531
+ ---
1532
+ user: alice
1533
+ name: alice
1534
+ role: cpto
1535
+ agent: alice-producto-cpto
1536
+ repos: [api, web, portfolio]
1537
+ role.api: data-engineer
1538
+ role.web: dev
1539
+ role.portfolio: seo
1540
+ goals_defined: true
1541
+ runs.seat: codex
1542
+ runs.api: claude
1543
+ model.api: opus
1544
+ effort.api: high
1545
+ runs.web: codex
1546
+ runs.portfolio: terminal:gemini
1547
+ ---
1548
+ ```
1549
+
1550
+ Los nombres tras el punto usan el actor normalizado de la ventana: minúsculas,
1551
+ números y guiones. Usa `seat --repos`, `--agent-roles`, `--goal` y `--engines`
1552
+ para mantener la ficha de forma segura. Una edición manual mal formada degrada el
1553
+ rol operativo a `blank` o puede impedir el arranque; no se evalúa como código.
1554
+
1555
+ El cuerpo de la ficha conserva el objetivo y el historial de rondas. Cambiar el
1556
+ objetivo reescribe sólo su sección, no ese historial.
1557
+
1558
+ ### Conocimiento editable
1559
+
1560
+ ```text
1561
+ domains/<domain>.md
1562
+ roles/<role>.md
1563
+ AGENTS.md
1564
+ ```
1565
+
1566
+ Los dos primeros nacen como perfiles iniciales y pasan a pertenecer a la ciudad.
1567
+ Puedes editarlos, reemplazarlos o quitarlos. Agents City no vuelve a sobrescribir
1568
+ un fichero existente durante un cambio de configuración. `AGENTS.md` explica a
1569
+ los runtimes cómo interpretar la ciudad; revísalo si haces una personalización
1570
+ profunda.
1571
+
1572
+ Las skills permanecen en los repos y son independientes de estos ficheros.
1573
+
1574
+ ### Estado de runtime
1575
+
1576
+ El hub local no mezcla datos efímeros con la configuración legible:
1577
+
1578
+ ```text
1579
+ ~/.agents-city/.runtime/bus/<city-id>/
1580
+ ├── endpoint.json
1581
+ ├── hub.lock
1582
+ ├── road-token
1583
+ ├── actors/*.json
1584
+ ├── outbox/<actor>/*.json
1585
+ ├── road-queue/*.json
1586
+ ├── road-inbox/*.json
1587
+ └── road-history.jsonl
1588
+ ```
1589
+
1590
+ Las credenciales y ficheros de runtime se crean con permisos privados. Los
1591
+ outboxes permiten que un actor se reconecte sin perder tareas ya aceptadas; el
1592
+ ACK elimina el pendiente. El límite actual es 200 pendientes por cola y 72 horas
1593
+ de vida por mensaje. `bus inbox` consume `road-inbox`, no el historial append-only.
1594
+
1595
+ ### Variables configurables
1596
+
1597
+ | Variable | Por defecto | Uso |
1598
+ |---|---|---|
1599
+ | `AGENTS_CITY_HOME` | `~/.agents-city` | raíz completa de datos y runtimes |
1600
+ | `AGENTS_CITY_USER` | identidad local resuelta | fuerza el propietario para pruebas/migraciones |
1601
+ | `AGENTS_CITY_DATA` | ciudad seleccionada | fuerza una carpeta de ciudad en una terminal externa |
1602
+ | `CITY_CODE_DIR` | `~/codigo` | destino de clones aceptados desde GitHub |
1603
+ | `CITY_SEARCH_IN` | raíces habituales del home | lista separada por `:` donde buscar repos locales |
1604
+ | `CITY_SEARCH_DEPTH` | `4` | profundidad máxima de esa búsqueda |
1605
+ | `AGENTS_CITY_ORG` | vacía | filtra repos por organización; vacía significa todos |
1606
+ | `CITY_SETTLE` | `8` | espera inicial, en segundos, para arrancar Claude |
1607
+ | `CITY_STAGGER` | `1` | separación adicional por ventana Claude |
1608
+ | `CITY_BUS_URL` | vacía | endpoint del bus remoto opcional |
1609
+ | `CITY_BUS_TOKEN` | vacía | credencial para ese transporte remoto/mapa |
1610
+ | `AGENTS_CITY_URL` | `CITY_BUS_URL` | endpoint de reporting/mapa si está separado |
1611
+ | `CITY_DIR` | `~/.claude/channels/city-bus` | carpeta de compatibilidad para `.env` y hooks |
1612
+ | `CITY_HOOKS` | `city` | `everywhere` ejecuta los hooks de conciencia en todas las sesiones de Claude, no solo en runtimes de ciudad |
1613
+
1614
+ Ejemplos:
1615
+
1616
+ ```bash
1617
+ CITY_SEARCH_IN="$HOME/clientes:$HOME/codigo" \
1618
+ CITY_SEARCH_DEPTH=6 \
1619
+ agents-city seat --repos
1620
+
1621
+ AGENTS_CITY_HOME="$(mktemp -d)" \
1622
+ AGENTS_CITY_USER=tester \
1623
+ agents-city cities create laboratorio
1624
+
1625
+ CITY_SETTLE=0 CITY_STAGGER=0 agents-city seat --city producto
1626
+ ```
1627
+
1628
+ El índice de repos locales se cachea un día en
1629
+ `$XDG_CACHE_HOME/agents-city/repos.tsv` o `~/.cache/agents-city/repos.tsv`. El Hall
1630
+ ofrece refrescarlo. Desde terminal, si cambias `CITY_SEARCH_IN` y la caché aún es
1631
+ válida, elimina **sólo ese fichero de índice** y repite `seat --repos`.
1632
+
1633
+ Para ajustes de transporte, el orden es:
1634
+
1635
+ 1. variable de entorno ya presente;
1636
+ 2. clave reconocida de `~/.claude/channels/city-bus/.env`;
1637
+ 3. sólo para el token en macOS, Keychain service `city@agents-city`.
1638
+
1639
+ La carga de `.env` admite únicamente claves conocidas y no puede redefinir
1640
+ `PATH`. Variables como `CITY_ADDRESS`, `CITY_BUS_ACTOR`, `CITY_RUNTIME_KIND` y
1641
+ `CITY_AGENT_ROLE` las inyecta la sesión para autenticar cada ventana; no deberías
1642
+ guardarlas como configuración global.
1643
+
1644
+ ## Seguridad y límites de confianza
1645
+
1646
+ - La conciencia del plugin se queda dentro de la ciudad: cada hook comprueba
1647
+ primero la identidad de ciudad (`CITY_BUS_ACTOR`) y calla en las sesiones
1648
+ normales de Claude — instalar el plugin no alista todas las conversaciones de
1649
+ la máquina. `CITY_HOOKS=everywhere` es el opt-in explícito a toda la máquina.
1650
+ - El hub de cada ciudad enlaza un puerto aleatorio en `127.0.0.1`; no se publica
1651
+ en la LAN.
1652
+ - Cada actor tiene token y rol propios. El asiento es `chair`; cada repo es
1653
+ `member`.
1654
+ - Los miembros no reciben credenciales de carretera, no pueden llamar a
1655
+ `road.send` y no tienen ruta miembro→miembro.
1656
+ - Sólo un sobre `seat -> seat` hacia una carretera declarada puede salir de una
1657
+ ciudad.
1658
+ - Una invitación contiene identidad/dirección, nunca el token remoto.
1659
+ - Los payloads de protocolo están limitados a 64 000 caracteres por campo de
1660
+ texto y los IDs/rutas se normalizan antes de usarse.
1661
+ - Los runtimes conocidos usan APIs nativas. Sólo `terminal:<command>` permite el
1662
+ fallback visible de tmux.
1663
+ - `report` y `tokens` son dry-run por defecto; enviar requiere `--push`.
1664
+ - `reset` y `exit` tienen `--dry-run`; el primero crea backup y ninguno debe
1665
+ tocar tmux ajenos.
1666
+
1667
+ ### La jaula, el broker y la cadena de auditoría
1668
+
1669
+ El modo yolo se queda — un comité no funciona si cada comando del bus necesita
1670
+ un humano — pero «no me preguntes» y «puedes tocarlo todo» son ejes distintos,
1671
+ y sólo el primero es yolo. En macOS las ventanas de repo de Claude, OpenCode y
1672
+ Kimi arrancan dentro de un perfil seatbelt generado: las escrituras caen sólo en su propio repo y su
1673
+ estado de runtime, y los ficheros que convierten una inyección de prompt en un
1674
+ robo de credenciales (`~/.ssh`, `~/.git-credentials`, `~/.aws`, configs de gh
1675
+ y de nube, tokens de carretera remota) quedan sellados en el kernel — lecturas
1676
+ y escrituras, hijos y nietos incluidos. Al agente no se le pregunta nada: las
1677
+ rutas prohibidas sencillamente no existen para él. Codex usa en cambio su
1678
+ sandbox nativa `workspace-write` y no se envuelve en seatbelt: workers MCP como
1679
+ `node_repl` aplican su propia sandbox y macOS rechaza esa operación dentro de un
1680
+ proceso ya enjaulado. `CITY_CAGE=0` desactiva de forma deliberada la capa de
1681
+ confinamiento aplicable.
1682
+
1683
+ Como una ventana enjaulada no puede leer el token de `gh`, los PRs y pushes
1684
+ pasan por un broker de credenciales opcional (`CITY_BROKER=1`): un proceso
1685
+ pequeño del lado del dueño que guarda las credenciales, acepta tokens por
1686
+ ventana atados a un único repo, rechaza cualquier acción sobre la rama por
1687
+ defecto y apunta cada petición — servida o rechazada — en un registro de
1688
+ auditoría encadenado por hashes que las ventanas no pueden tocar. Un byte
1689
+ reescrito rompe la cadena y `broker.py verify` lo dice. Las comprobaciones
1690
+ vivas contra el kernel y ambos caminos del broker, el feliz y el rechazado,
1691
+ corren en `bin/test-cage.py` y `bin/test-broker.py`. El modelo completo, sus
1692
+ diales y sus límites honestos están en [docs/security.md](docs/security.md).
1693
+
1694
+ Agents City aísla responsabilidades del protocolo, no crea una sandbox contra el
1695
+ propietario del sistema operativo. Otro proceso con tu mismo usuario puede leer
1696
+ tus repos, adjuntarse a tu tmux o leer ficheros privados de tu home. Para código
1697
+ no confiable usa cuentas/VMs/contenedores separados y aplica también los permisos
1698
+ del CLI de cada proveedor.
1699
+
1700
+ El bus remoto amplía la superficie de confianza. Despliega HTTPS/WSS, rota
1701
+ tokens, limita los scopes y revisa [docs/self-host.md](docs/self-host.md). Una
1702
+ carretera autoriza intercambio de mensajes entre asientos; no implica confianza
1703
+ para ejecutar comandos recibidos ni acceso al filesystem remoto.
1704
+
1705
+ ## Resolución de problemas
1706
+
1707
+ ### `agents-city seat` vuelve a una sesión que ya estaba abierta
1708
+
1709
+ Es el comportamiento normal. El nombre tmux es estable por propietario/ciudad.
1710
+ Separa la interfaz con `Ctrl-b d` o inspecciona antes de cerrarla:
1711
+
1712
+ ```bash
1713
+ agents-city exit <ciudad> --dry-run
1714
+ ```
1715
+
1716
+ ### He actualizado el paquete pero sigo viendo el comportamiento anterior
1717
+
1718
+ Un npm global nuevo no sustituye procesos vivos ni sesiones tmux. Comprueba qué
1719
+ binario ejecutas y reinicia sólo la ciudad:
1720
+
1721
+ ```bash
1722
+ type -a agents-city
1723
+ agents-city --version
1724
+ npm root -g
1725
+ agents-city exit <ciudad> --dry-run
1726
+ agents-city exit <ciudad>
1727
+ agents-city seat --city <ciudad>
1728
+ ```
1729
+
1730
+ Con `fnm`, `nvm` o `asdf`, cada versión de Node puede tener sus propios paquetes
1731
+ globales. Instala el tarball con la misma versión de Node desde la que ejecutarás
1732
+ `agents-city`.
1733
+
1734
+ ### Codex muestra `city>` en vez de su TUI
1735
+
1736
+ Codex debe mostrar su TUI oficial. Verifica una versión que soporte
1737
+ `app-server`/`--remote`, actualiza Agents City y reinicia la ciudad. Los logs
1738
+ previos al arranque deben incluir el endpoint WebSocket, la espera del thread de
1739
+ la TUI, `Codex TUI thread ... adopted over WebSocket` y la autenticación en el
1740
+ bus. Tras el primer turno aparecerá también `joined over WebSocket`. `city>` sí
1741
+ es actualmente la consola esperada para OpenCode y Kimi.
1742
+
1743
+ Si aparece `Failed to resume session ... no rollout found`, estás ejecutando la
1744
+ ruta defectuosa de `0.3.0-beta.10`, que intentaba abrir un thread recién creado
1745
+ con `codex resume --remote`. `0.3.0-beta.11` ya abría la TUI correcta, pero podía
1746
+ esperar indefinidamente a que un thread vacío materializara su primer rollout.
1747
+ Instala `0.3.0-beta.21` o posterior y reinicia sólo
1748
+ esa ciudad con `agents-city exit <ciudad>` seguido de `agents-city seat --city
1749
+ <ciudad>`.
1750
+
1751
+ ### Aparece `fatal: not a git repository` en la ventana `seat`
1752
+
1753
+ La ventana `seat` vive en la carpeta de datos de la ciudad, que no tiene por qué
1754
+ ser un repo. Las versiones actuales omiten el sync allí. Ese error antes de abrir
1755
+ Codex suele significar que la sesión sigue ejecutando un launcher antiguo:
1756
+ actualiza, usa `exit <ciudad>` y vuelve a abrirla. Un repo real sin `.git` sí debe
1757
+ revisarse por separado.
1758
+
1759
+ ### Claude dice que el plugin no está en la allowlist de Channels
1760
+
1761
+ Agents City `0.3.0-beta.21` y posteriores no arrancan Claude con `--channels`.
1762
+ Ese mensaje identifica una sesión viva antigua o un Channel lanzado manualmente,
1763
+ no una configuración ausente de la cuenta personal. **No** crees un fichero de
1764
+ managed settings de máquina ni uses `sudo`. Actualiza Agents City, comprueba la
1765
+ versión y reinicia sólo la ciudad afectada con `agents-city exit <ciudad>` y
1766
+ `agents-city seat --city <ciudad>`. El log normal debe mostrar
1767
+ `Claude Code ready over persistent stream-json` y `claude-stream-json ready`.
1768
+
1769
+ ### Claude muestra `Claude API` o pide usage credits con una cuenta Team/Max
1770
+
1771
+ Un `CLAUDE_CODE_OAUTH_TOKEN`, API key, gateway URL o selector de Bedrock,
1772
+ Vertex o Foundry heredado puede tener prioridad sobre el login sano de
1773
+ Claude.ai guardado por el CLI. Inspecciona sólo los nombres; nunca imprimas los
1774
+ valores de las credenciales:
1775
+
1776
+ ```bash
1777
+ claude auth status
1778
+ tmux show-environment -g | cut -d= -f1 | \
1779
+ grep -E 'CLAUDE_CODE_OAUTH_TOKEN|ANTHROPIC_(API_KEY|AUTH_TOKEN|BASE_URL)|CLAUDE_CODE_USE_'
1780
+ env -u CLAUDE_CODE_OAUTH_TOKEN \
1781
+ -u ANTHROPIC_API_KEY -u ANTHROPIC_AUTH_TOKEN -u ANTHROPIC_BASE_URL \
1782
+ -u CLAUDE_CODE_USE_BEDROCK -u CLAUDE_CODE_USE_VERTEX \
1783
+ -u CLAUDE_CODE_USE_FOUNDRY claude auth status
1784
+ ```
1785
+
1786
+ Si el último comando devuelve `authMethod: claude.ai`, Agents City usa ese
1787
+ login y quita únicamente esos overrides de cada proceso hijo nuevo. Nunca borra
1788
+ un token, hace logout ni reescribe el almacén de credenciales. Tras actualizar,
1789
+ reinicia sólo esa ciudad. Para usar intencionadamente autenticación por entorno/API:
1790
+
1791
+ ```bash
1792
+ CITY_CLAUDE_AUTH=environment agents-city seat --city <ciudad>
1793
+ ```
1794
+
1795
+ ### Las herramientas de Codex fallan con `sandbox_apply: Operation not permitted`
1796
+
1797
+ Es el fallo de sandbox anidada de macOS: un launcher antiguo metía la sandbox de
1798
+ Codex (o la de un worker MCP) dentro de la jaula seatbelt de la ciudad. Instala
1799
+ la beta actual y reinicia sólo la ciudad afectada. Codex arranca ahora sin la
1800
+ jaula exterior y mantiene su confinamiento nativo `workspace-write`, así puede
1801
+ leer el repo y usar herramientas sin un `sandbox_apply` anidado.
1802
+
1803
+ ### Codex avisa de que falta el ejecutable de un MCP
1804
+
1805
+ Codex hereda tu registro MCP global. Agents City lo comprueba sin imprimir los
1806
+ valores de su entorno. Si un MCP stdio habilitado apunta a un ejecutable que se
1807
+ puede demostrar que no existe, se deshabilita sólo para ese proceso de ciudad;
1808
+ no se modifica `~/.codex/config.toml` y los MCP sanos siguen activos. Puedes ver
1809
+ la decisión acotada con:
1810
+
1811
+ ```bash
1812
+ agents-city logs --diagnostics | grep codex.mcp.unavailable.disabled
1813
+ ```
1814
+
1815
+ Después puedes reparar o borrar la entrada global original con `codex mcp`. Un
1816
+ fallo de URL u otro error de arranque incierto se deja visible en vez de
1817
+ ocultarlo por conjetura.
1818
+
1819
+ ### Parece que se pega texto o un JSON en una ventana
1820
+
1821
+ Claude, Codex, OpenCode y Kimi no usan portapapeles ni `tmux paste`. Comprueba la
1822
+ ficha:
1823
+
1824
+ ```bash
1825
+ agents-city seat --engines
1826
+ ```
1827
+
1828
+ Si la fila está configurada como `terminal:<command>`, has elegido el adapter de
1829
+ compatibilidad y la inyección visible es esperada. Si un runtime conocido aparece
1830
+ así, vuelve a seleccionarlo por su nombre nativo.
1831
+
1832
+ ### Una ventana Claude muestra un comando acabado en `--da`, `--dangerously` o `-`
1833
+
1834
+ Es un comando de arranque antiguo truncado, no un mensaje de Claude ni del
1835
+ WebSocket. Las versiones actuales guardan el comando completo en un launcher
1836
+ privado y auditado, y escriben en tmux únicamente su ruta corta. Actualiza el
1837
+ paquete y reinicia sólo esa ciudad:
1838
+
1839
+ ```bash
1840
+ agents-city --version
1841
+ agents-city exit <ciudad> --dry-run
1842
+ agents-city exit <ciudad>
1843
+ agents-city seat --city <ciudad>
1844
+ agents-city logs --diagnostics --follow
1845
+ ```
1846
+
1847
+ Si el launcher falla registra `launch.failed`, imprime en el panel el código de
1848
+ salida y la ruta del log, y envía `runtime.launch.failed` a City live. Nunca
1849
+ guarda el comando completo ni las credenciales.
1850
+
1851
+ ### No aparecen mis repos
1852
+
1853
+ ```bash
1854
+ command -v git
1855
+ git -C /ruta/al/repo remote get-url origin
1856
+ CITY_SEARCH_IN="/ruta/raiz1:/ruta/raiz2" \
1857
+ CITY_SEARCH_DEPTH=6 \
1858
+ agents-city seat --repos
1859
+ ```
1860
+
1861
+ La detección exige `.git` (directorio o fichero de worktree) y un remote `origin`.
1862
+ Si acabas de cambiar las raíces, refresca desde el Hall o elimina exclusivamente
1863
+ `~/.cache/agents-city/repos.tsv`. `AGENTS_CITY_ORG` puede estar filtrando el repo;
1864
+ déjala vacía para indexar todos los remotes.
1865
+
1866
+ ### GitHub no muestra repos privados u organizaciones
1867
+
1868
+ ```bash
1869
+ gh auth status
1870
+ gh api user --jq .login
1871
+ gh auth refresh -s read:org
1872
+ ```
1873
+
1874
+ Comprueba primero el acceso directamente con `gh`; Agents City sólo consume esa
1875
+ sesión. Para una organización con SSO puede ser necesario autorizar el token en
1876
+ GitHub. Siempre puedes elegir repos del disco sin OAuth.
1877
+
1878
+ ### Un repo de la ficha no abre ventana
1879
+
1880
+ La ficha puede referenciar un repo que no está clonado. Ejecuta `seat --repos` y
1881
+ acepta clonarlo o clónalo manualmente dentro de una raíz indexada. Si dos nombres
1882
+ se normalizan al mismo actor (por ejemplo, diferencias sólo en símbolos), Agents
1883
+ City rechaza la colisión en vez de mezclar credenciales.
1884
+
1885
+ ### El bus dice que ya está arrancando o ejecutándose
1886
+
1887
+ No borres locks mientras el proceso esté vivo. Inspecciona el alcance:
1888
+
1889
+ ```bash
1890
+ agents-city exit <ciudad> --dry-run
1891
+ ```
1892
+
1893
+ Si la sesión esperada existe, vuelve con `seat`. Si es un proceso huérfano
1894
+ gestionado, `exit <ciudad>` lo cierra. El hub recupera por sí solo un lock cuyo PID
1895
+ ya no existe; un lock recién creado se conserva para evitar dos hubs simultáneos.
1896
+
1897
+ ### Un agente estaba offline cuando llegó una tarea
1898
+
1899
+ Los sobres internos aceptados quedan en su outbox hasta ACK, con TTL de 72 horas.
1900
+ Reabre la misma ciudad/runtime para drenar la cola. Si el proveedor rechazó la
1901
+ tarea, la entrega queda como fallo y no se inventa un ACK. Usa los logs y el
1902
+ benchmark de runtime para separar rechazo nativo, autenticación y latencia.
1903
+
1904
+ ### Una carretera local existe pero el destino aparece offline
1905
+
1906
+ `road connect` configura alcance; no arranca la otra ciudad. Abre ambas sesiones:
1907
+
1908
+ ```bash
1909
+ agents-city seat --city origen
1910
+ agents-city seat --city destino
1911
+ ```
1912
+
1913
+ Una carretera remota necesita además `CITY_BUS_URL` y `CITY_BUS_TOKEN` válidos en
1914
+ los dos extremos. Que el mensaje quede en cola no significa que el destino lo
1915
+ haya aceptado ni que esté de acuerdo.
1916
+
1917
+ ### El comité rechaza mi comando
1918
+
1919
+ Primero mira el estado y el schema:
1920
+
1921
+ ```bash
1922
+ agents-city committee show <id>
1923
+ agents-city committee schema <verbo>
1924
+ ```
1925
+
1926
+ Los rechazos más comunes son correctos por diseño: el asiento intenta responder
1927
+ como miembro, un miembro intenta decidir, falta una posición sin
1928
+ `--proceed-without`, queda una petición de palabra pendiente, el verificador es el
1929
+ ejecutor pudiendo elegir otro, o se intenta cerrar antes de `pass`.
1930
+
1931
+ ### Quiero empezar de cero
1932
+
1933
+ No borres `~/.agents-city` entero si sólo falla una ciudad:
1934
+
1935
+ ```bash
1936
+ agents-city reset <ciudad> --dry-run
1937
+ agents-city reset <ciudad>
1938
+ agents-city seat --city <ciudad>
1939
+ ```
1940
+
1941
+ La salida indica el backup. Si sólo quieres reiniciar procesos, usa `exit`.
1942
+
1943
+ ## Desarrollo y pruebas
1944
+
1945
+ ### Validación completa
1946
+
1947
+ ```bash
1948
+ git clone https://github.com/jlcases/agents-city.git
1949
+ cd agents-city
1950
+ npm install
1951
+ npm test
1952
+ ```
1953
+
1954
+ `npm test` ejecuta `./bin/test`: suites Python/shell, buses y runtimes nativos con
1955
+ dobles deterministas, un tmux desechable sólo para el fallback desconocido,
1956
+ stress de 40 actores, contratos cruzados y la allowlist del tarball. La ejecución
1957
+ por defecto es offline y usa homes/repos temporales.
1958
+
1959
+ Pruebas enfocadas:
1960
+
1961
+ ```bash
1962
+ ./bin/test seat runtime-ui
1963
+ ./bin/test channel committee runtime runtime-failures
1964
+ ./bin/test stress benchmark contracts exit
1965
+ ```
1966
+
1967
+ ### Typecheck y bundles
1968
+
1969
+ ```bash
1970
+ cd city/web
1971
+ npm run typecheck
1972
+ npm run build
1973
+
1974
+ cd ../../plugin/channel
1975
+ npm run typecheck
1976
+ npm run build
1977
+ ```
1978
+
1979
+ El JavaScript generado de `plugin/channel` sí se publica. Cambiar TypeScript sin
1980
+ reconstruir deja el tarball ejecutando código anterior.
1981
+
1982
+ ### Validar el paquete exacto sin publicarlo
1983
+
1984
+ ```bash
1985
+ npm pack --dry-run
1986
+ npm pack
1987
+
1988
+ CITY_TEST_PREFIX="$(mktemp -d)"
1989
+ npm install -g --prefix "$CITY_TEST_PREFIX" ./agents-city-0.3.0-beta.21.tgz
1990
+ "$CITY_TEST_PREFIX/bin/agents-city" --version
1991
+ "$CITY_TEST_PREFIX/bin/agents-city" --help
1992
+ ```
1993
+
1994
+ Para pruebas de onboarding, añade un `HOME`, `AGENTS_CITY_HOME` y
1995
+ `AGENTS_CITY_USER` temporales. No apuntes una suite a tus ciudades reales.
1996
+
1997
+ La matriz y los invariantes completos están en [docs/testing.md](docs/testing.md).
1998
+ Los benchmarks tienen guías propias en
1999
+ [benchmarks/stress/README.md](benchmarks/stress/README.md),
2000
+ [benchmarks/latency/README.md](benchmarks/latency/README.md) y
2001
+ [benchmarks/committee/README.md](benchmarks/committee/README.md).
2002
+
2003
+ ## Ediciones, licencia y confianza
2004
+
2005
+ Este repositorio es la **Community Edition**, con licencia
2006
+ [Apache-2.0](LICENSE): libre de usar, modificar, self-hostear y construir
2007
+ encima, con concesión explícita de patentes. La licencia no concede derechos
2008
+ sobre el nombre *Agents City* — el código viaja, el nombre se queda.
2009
+
2010
+ Existe una **Enterprise Edition** sobre este mismo core: memoria semántica de
2011
+ la ciudad (búsqueda vectorial sobre actas, avisos y deliberaciones), SSO,
2012
+ auditoría entre ciudades y gestión de flota. No está en este repositorio.
2013
+ Agents City lo construye [Arkatai](https://arkatai.com), estudio de
2014
+ desarrollos agénticos — para la Enterprise Edition escribe a
2015
+ <hello@arkatai.com> o abre un issue con la etiqueta `enterprise`.
2016
+
2017
+ **Sin telemetría.** El producto no llama a casa de nadie: todo corre en
2018
+ loopback y ficheros locales, y nada de tu trabajo sale de tu máquina salvo lo
2019
+ que tú configures — una carretera remota o un `--push` a tu propio worker. La
2020
+ única petición a terceros de las páginas web es la carga de sus tipografías
2021
+ desde Google Fonts.