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.
- package/.claude-plugin/marketplace.json +16 -0
- package/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.es.md +2021 -0
- package/README.md +1999 -0
- package/benchmarks/committee/README.md +39 -0
- package/benchmarks/committee/metrics.py +51 -0
- package/benchmarks/committee/run.py +64 -0
- package/benchmarks/committee/traces/01-single.json +8 -0
- package/benchmarks/committee/traces/02-mesh.json +16 -0
- package/benchmarks/committee/traces/03-chair.json +15 -0
- package/benchmarks/latency/README.md +35 -0
- package/benchmarks/latency/fake-claude-cli.mjs +119 -0
- package/benchmarks/latency/fake-native-server.mjs +340 -0
- package/benchmarks/latency/fake-tui.py +91 -0
- package/benchmarks/latency/live.py +380 -0
- package/benchmarks/stress/README.md +20 -0
- package/benchmarks/stress/run.py +487 -0
- package/bin/agents +4 -0
- package/bin/agents-city.js +116 -0
- package/bin/benchmark +17 -0
- package/bin/bus +6 -0
- package/bin/cities +3 -0
- package/bin/city +86 -0
- package/bin/committee +6 -0
- package/bin/demo +200 -0
- package/bin/exit +5 -0
- package/bin/hall +73 -0
- package/bin/hall.html +426 -0
- package/bin/logs +3 -0
- package/bin/report.py +14 -0
- package/bin/reset +3 -0
- package/bin/road +3 -0
- package/bin/seat +10 -0
- package/bin/serve.py +1428 -0
- package/bin/setup.py +753 -0
- package/bin/skills +3 -0
- package/bin/test +131 -0
- package/bin/test-adapter.py +183 -0
- package/bin/test-admision.py +99 -0
- package/bin/test-avatar.py +58 -0
- package/bin/test-benchmark.py +40 -0
- package/bin/test-broker.py +334 -0
- package/bin/test-cage.py +206 -0
- package/bin/test-card.py +402 -0
- package/bin/test-channel.py +379 -0
- package/bin/test-cities.py +453 -0
- package/bin/test-claude-runtime.py +252 -0
- package/bin/test-committee.py +340 -0
- package/bin/test-contracts.py +544 -0
- package/bin/test-crecimiento.py +164 -0
- package/bin/test-demo.py +308 -0
- package/bin/test-doctor.py +106 -0
- package/bin/test-domains.py +151 -0
- package/bin/test-evidencia.py +50 -0
- package/bin/test-exit.py +128 -0
- package/bin/test-hall-protocol.py +93 -0
- package/bin/test-launch.py +169 -0
- package/bin/test-live-feed.py +508 -0
- package/bin/test-pairing.py +99 -0
- package/bin/test-parcels.py +283 -0
- package/bin/test-runtime-failures.py +252 -0
- package/bin/test-runtime-ui.py +488 -0
- package/bin/test-runtime.py +268 -0
- package/bin/test-rutas.py +80 -0
- package/bin/test-seat.py +1386 -0
- package/bin/test-security.py +150 -0
- package/bin/test-serve.py +1057 -0
- package/bin/test-stress.py +64 -0
- package/bin/test-widgets.py +143 -0
- package/bin/test-workspace.py +188 -0
- package/bin/testlib.py +95 -0
- package/bin/tokens.py +14 -0
- package/bus/scripts/deploy.sh +60 -0
- package/bus/scripts/mint-token.sh +68 -0
- package/bus/scripts/setup-dev.sh +79 -0
- package/bus/scripts/test-channel.ts +8 -0
- package/bus/scripts/test-hub.ts +266 -0
- package/bus/scripts/test-local.sh +40 -0
- package/bus/scripts/test-queue.ts +132 -0
- package/bus/worker/package-lock.json +1971 -0
- package/bus/worker/package.json +17 -0
- package/bus/worker/src/index.ts +485 -0
- package/bus/worker/tsconfig.json +13 -0
- package/bus/worker/wrangler.toml +32 -0
- package/city/oven/README.md +59 -0
- package/city/oven/collect.py +43 -0
- package/city/oven/oven.html +4 -0
- package/city/scripts/history.py +120 -0
- package/city/scripts/seed.py +442 -0
- package/city/web/assets/modelos/License.txt +28 -0
- package/city/web/assets/modelos/PROCEDENCIA.txt +3 -0
- package/city/web/assets/modelos/building-a.glb +0 -0
- package/city/web/assets/modelos/building-b.glb +0 -0
- package/city/web/assets/modelos/building-c.glb +0 -0
- package/city/web/assets/modelos/building-d.glb +0 -0
- package/city/web/assets/modelos/building-e.glb +0 -0
- package/city/web/assets/modelos/building-f.glb +0 -0
- package/city/web/assets/modelos/building-g.glb +0 -0
- package/city/web/assets/modelos/building-h.glb +0 -0
- package/city/web/assets/sprites/building-a.png +0 -0
- package/city/web/assets/sprites/building-b.png +0 -0
- package/city/web/assets/sprites/building-c.png +0 -0
- package/city/web/assets/sprites/building-d.png +0 -0
- package/city/web/assets/sprites/building-e.png +0 -0
- package/city/web/assets/sprites/building-f.png +0 -0
- package/city/web/assets/sprites/building-g.png +0 -0
- package/city/web/assets/sprites/building-h.png +0 -0
- package/city/web/assets/sprites/building-i.png +0 -0
- package/city/web/assets/sprites/building-j.png +0 -0
- package/city/web/assets/sprites/building-k.png +0 -0
- package/city/web/assets/sprites/building-l.png +0 -0
- package/city/web/assets/sprites/building-m.png +0 -0
- package/city/web/assets/sprites/building-n.png +0 -0
- package/city/web/assets/sprites/building-skyscraper-a.png +0 -0
- package/city/web/assets/sprites/building-skyscraper-b.png +0 -0
- package/city/web/assets/sprites/building-skyscraper-c.png +0 -0
- package/city/web/assets/sprites/building-skyscraper-d.png +0 -0
- package/city/web/assets/sprites/building-skyscraper-e.png +0 -0
- package/city/web/assets/sprites/catalogo.json +47 -0
- package/city/web/assets/sprites/detail-awning-wide.png +0 -0
- package/city/web/assets/sprites/detail-awning.png +0 -0
- package/city/web/assets/sprites/detail-overhang-wide.png +0 -0
- package/city/web/assets/sprites/detail-overhang.png +0 -0
- package/city/web/assets/sprites/detail-parasol-a.png +0 -0
- package/city/web/assets/sprites/detail-parasol-b.png +0 -0
- package/city/web/assets/sprites/low-detail-building-a.png +0 -0
- package/city/web/assets/sprites/low-detail-building-b.png +0 -0
- package/city/web/assets/sprites/low-detail-building-c.png +0 -0
- package/city/web/assets/sprites/low-detail-building-d.png +0 -0
- package/city/web/assets/sprites/low-detail-building-e.png +0 -0
- package/city/web/assets/sprites/low-detail-building-f.png +0 -0
- package/city/web/assets/sprites/low-detail-building-g.png +0 -0
- package/city/web/assets/sprites/low-detail-building-h.png +0 -0
- package/city/web/assets/sprites/low-detail-building-i.png +0 -0
- package/city/web/assets/sprites/low-detail-building-j.png +0 -0
- package/city/web/assets/sprites/low-detail-building-k.png +0 -0
- package/city/web/assets/sprites/low-detail-building-l.png +0 -0
- package/city/web/assets/sprites/low-detail-building-m.png +0 -0
- package/city/web/assets/sprites/low-detail-building-n.png +0 -0
- package/city/web/assets/sprites/low-detail-building-wide-a.png +0 -0
- package/city/web/assets/sprites/low-detail-building-wide-b.png +0 -0
- package/city/web/assets/sprites/medidas.json +248 -0
- package/city/web/dist/city.js +939 -0
- package/city/web/dist/index.html +294 -0
- package/city/web/dist/modelos/License.txt +28 -0
- package/city/web/dist/modelos/PROCEDENCIA.txt +3 -0
- package/city/web/dist/modelos/building-a.glb +0 -0
- package/city/web/dist/modelos/building-b.glb +0 -0
- package/city/web/dist/modelos/building-c.glb +0 -0
- package/city/web/dist/modelos/building-d.glb +0 -0
- package/city/web/dist/modelos/building-e.glb +0 -0
- package/city/web/dist/modelos/building-f.glb +0 -0
- package/city/web/dist/modelos/building-g.glb +0 -0
- package/city/web/dist/modelos/building-h.glb +0 -0
- package/city/web/dist/sprites/building-a.png +0 -0
- package/city/web/dist/sprites/building-b.png +0 -0
- package/city/web/dist/sprites/building-c.png +0 -0
- package/city/web/dist/sprites/building-d.png +0 -0
- package/city/web/dist/sprites/building-e.png +0 -0
- package/city/web/dist/sprites/building-f.png +0 -0
- package/city/web/dist/sprites/building-g.png +0 -0
- package/city/web/dist/sprites/building-h.png +0 -0
- package/city/web/dist/sprites/building-i.png +0 -0
- package/city/web/dist/sprites/building-j.png +0 -0
- package/city/web/dist/sprites/building-k.png +0 -0
- package/city/web/dist/sprites/building-l.png +0 -0
- package/city/web/dist/sprites/building-m.png +0 -0
- package/city/web/dist/sprites/building-n.png +0 -0
- package/city/web/dist/sprites/building-skyscraper-a.png +0 -0
- package/city/web/dist/sprites/building-skyscraper-b.png +0 -0
- package/city/web/dist/sprites/building-skyscraper-c.png +0 -0
- package/city/web/dist/sprites/building-skyscraper-d.png +0 -0
- package/city/web/dist/sprites/building-skyscraper-e.png +0 -0
- package/city/web/dist/sprites/catalogo.json +47 -0
- package/city/web/dist/sprites/detail-awning-wide.png +0 -0
- package/city/web/dist/sprites/detail-awning.png +0 -0
- package/city/web/dist/sprites/detail-overhang-wide.png +0 -0
- package/city/web/dist/sprites/detail-overhang.png +0 -0
- package/city/web/dist/sprites/detail-parasol-a.png +0 -0
- package/city/web/dist/sprites/detail-parasol-b.png +0 -0
- package/city/web/dist/sprites/low-detail-building-a.png +0 -0
- package/city/web/dist/sprites/low-detail-building-b.png +0 -0
- package/city/web/dist/sprites/low-detail-building-c.png +0 -0
- package/city/web/dist/sprites/low-detail-building-d.png +0 -0
- package/city/web/dist/sprites/low-detail-building-e.png +0 -0
- package/city/web/dist/sprites/low-detail-building-f.png +0 -0
- package/city/web/dist/sprites/low-detail-building-g.png +0 -0
- package/city/web/dist/sprites/low-detail-building-h.png +0 -0
- package/city/web/dist/sprites/low-detail-building-i.png +0 -0
- package/city/web/dist/sprites/low-detail-building-j.png +0 -0
- package/city/web/dist/sprites/low-detail-building-k.png +0 -0
- package/city/web/dist/sprites/low-detail-building-l.png +0 -0
- package/city/web/dist/sprites/low-detail-building-m.png +0 -0
- package/city/web/dist/sprites/low-detail-building-n.png +0 -0
- package/city/web/dist/sprites/low-detail-building-wide-a.png +0 -0
- package/city/web/dist/sprites/low-detail-building-wide-b.png +0 -0
- package/city/web/dist/sprites/medidas.json +248 -0
- package/city/web/dist-hall/hall.js +264 -0
- package/city/web/index.html +294 -0
- package/city/web/package.json +18 -0
- package/city/web/sella.py +21 -0
- package/city/web/src/activity-actors.ts +47 -0
- package/city/web/src/activity.ts +172 -0
- package/city/web/src/ayuntamiento.ts +580 -0
- package/city/web/src/draw.ts +640 -0
- package/city/web/src/game-speech.ts +79 -0
- package/city/web/src/hall.ts +1867 -0
- package/city/web/src/main.ts +2225 -0
- package/city/web/src/oven.ts +124 -0
- package/city/web/src/people.ts +244 -0
- package/city/web/src/presencia.ts +193 -0
- package/city/web/src/puertas.ts +180 -0
- package/city/web/src/repo-roles.ts +59 -0
- package/city/worker/package.json +16 -0
- package/city/worker/schema.sql +117 -0
- package/city/worker/src/index.ts +702 -0
- package/city/worker/src/square.ts +218 -0
- package/city/worker/wrangler.toml +58 -0
- package/demo/ada.md +50 -0
- package/demo/bruno.md +62 -0
- package/demo/camila.md +56 -0
- package/demo/city/ada.md +40 -0
- package/demo/city/city.yml +8 -0
- package/demo/city/parcels.yml +15 -0
- package/demo/city/roads.json +4 -0
- package/demo/city/units.yml +10 -0
- package/demo/clinica/city.yml +8 -0
- package/demo/clinica/parcels.yml +15 -0
- package/demo/clinica/roads.json +4 -0
- package/demo/clinica/units.yml +9 -0
- package/demo/clinica/vera.md +46 -0
- package/demo/dante.md +54 -0
- package/demo/despacho/city.yml +8 -0
- package/demo/despacho/marta.md +46 -0
- package/demo/despacho/parcels.yml +15 -0
- package/demo/despacho/roads.json +4 -0
- package/demo/despacho/units.yml +9 -0
- package/demo/elsa.md +50 -0
- package/demo/farid.md +52 -0
- package/demo/greta.md +50 -0
- package/demo/hugo.md +49 -0
- package/demo/iris.md +49 -0
- package/demo/jonas.md +51 -0
- package/demo/kira.md +51 -0
- package/demo/luca.md +49 -0
- package/demo/parcels.yml +92 -0
- package/demo/seed.py +20 -0
- package/demo/show.py +161 -0
- package/demo/stories.py +824 -0
- package/demo/units.yml +33 -0
- package/docs/agents-first.md +99 -0
- package/docs/glossary.md +55 -0
- package/docs/map-live-layers.md +73 -0
- package/docs/security.md +231 -0
- package/docs/self-host.md +151 -0
- package/docs/testing.md +205 -0
- package/package.json +73 -0
- package/plugin/.claude-plugin/plugin.json +62 -0
- package/plugin/.mcp.json +15 -0
- package/plugin/channel/activity-cli.ts +16 -0
- package/plugin/channel/adapter-prompts.ts +113 -0
- package/plugin/channel/adapter.js +4292 -0
- package/plugin/channel/adapter.ts +133 -0
- package/plugin/channel/bus.js +20188 -0
- package/plugin/channel/bus.ts +131 -0
- package/plugin/channel/city-config.ts +125 -0
- package/plugin/channel/claude-channel.ts +58 -0
- package/plugin/channel/cli-args.ts +75 -0
- package/plugin/channel/client.js +4200 -0
- package/plugin/channel/client.ts +38 -0
- package/plugin/channel/committee/activity.ts +256 -0
- package/plugin/channel/committee/collection.ts +154 -0
- package/plugin/channel/committee/decision.ts +175 -0
- package/plugin/channel/committee/floor.ts +135 -0
- package/plugin/channel/committee/guards.ts +30 -0
- package/plugin/channel/committee/history.ts +38 -0
- package/plugin/channel/committee/render.ts +102 -0
- package/plugin/channel/committee/service.ts +72 -0
- package/plugin/channel/committee/storage.ts +92 -0
- package/plugin/channel/committee/types.ts +163 -0
- package/plugin/channel/committee/view.ts +63 -0
- package/plugin/channel/committee-cli.ts +109 -0
- package/plugin/channel/delivery-metrics.ts +61 -0
- package/plugin/channel/delivery-queue.ts +118 -0
- package/plugin/channel/hub/activity-controller.ts +72 -0
- package/plugin/channel/hub/activity-feed.ts +169 -0
- package/plugin/channel/hub/committee-controller.ts +60 -0
- package/plugin/channel/hub/connections.ts +48 -0
- package/plugin/channel/hub/diagnostics.ts +67 -0
- package/plugin/channel/hub/envelope-validity.ts +109 -0
- package/plugin/channel/hub/envelopes.ts +66 -0
- package/plugin/channel/hub/lifecycle.ts +91 -0
- package/plugin/channel/hub/local-roads.ts +89 -0
- package/plugin/channel/hub/remote-roads.ts +165 -0
- package/plugin/channel/hub/road-controller.ts +99 -0
- package/plugin/channel/hub-client.ts +149 -0
- package/plugin/channel/local-hub.js +5995 -0
- package/plugin/channel/local-hub.ts +349 -0
- package/plugin/channel/map-reporter.ts +48 -0
- package/plugin/channel/package-lock.json +1731 -0
- package/plugin/channel/package.json +19 -0
- package/plugin/channel/protocol.ts +98 -0
- package/plugin/channel/road-cli.ts +18 -0
- package/plugin/channel/run.sh +15 -0
- package/plugin/channel/runtime/claude.ts +458 -0
- package/plugin/channel/runtime/codex-config.ts +77 -0
- package/plugin/channel/runtime/codex.ts +669 -0
- package/plugin/channel/runtime/command.ts +62 -0
- package/plugin/channel/runtime/factory.ts +15 -0
- package/plugin/channel/runtime/json-rpc.ts +154 -0
- package/plugin/channel/runtime/kimi.ts +277 -0
- package/plugin/channel/runtime/opencode.ts +248 -0
- package/plugin/channel/runtime/process.ts +84 -0
- package/plugin/channel/runtime/types.ts +45 -0
- package/plugin/channel/runtime-files.ts +73 -0
- package/plugin/channel/runtime-gateway.js +6396 -0
- package/plugin/channel/runtime-gateway.ts +358 -0
- package/plugin/channel/runtime-metrics.ts +52 -0
- package/plugin/channel/runtime-subscription.ts +180 -0
- package/plugin/channel/terminal-delivery.ts +131 -0
- package/plugin/channel/untrusted.ts +60 -0
- package/plugin/commands/committee.md +31 -0
- package/plugin/commands/exit.md +32 -0
- package/plugin/commands/goals.md +20 -0
- package/plugin/commands/join.md +18 -0
- package/plugin/commands/notice.md +20 -0
- package/plugin/commands/propose.md +19 -0
- package/plugin/commands/round.md +17 -0
- package/plugin/commands/session.md +22 -0
- package/plugin/commands/settings.md +25 -0
- package/plugin/commands/setup.md +21 -0
- package/plugin/commands/team.md +23 -0
- package/plugin/domains/custom.md +27 -0
- package/plugin/domains/finance.md +31 -0
- package/plugin/domains/healthcare.md +34 -0
- package/plugin/domains/legal.md +31 -0
- package/plugin/domains/marketing.md +33 -0
- package/plugin/domains/operations.md +31 -0
- package/plugin/domains/research.md +32 -0
- package/plugin/domains/sales.md +30 -0
- package/plugin/domains/software.md +37 -0
- package/plugin/hooks/activity.sh +6 -0
- package/plugin/hooks/digging.sh +68 -0
- package/plugin/hooks/growth.sh +42 -0
- package/plugin/hooks/hooks.json +106 -0
- package/plugin/hooks/notice-on-pr.sh +35 -0
- package/plugin/hooks/notice-on-stop.sh +80 -0
- package/plugin/hooks/notice-pending.sh +58 -0
- package/plugin/hooks/solo-en-ciudad.sh +23 -0
- package/plugin/hooks/tokens.sh +47 -0
- package/plugin/roles/examples/account-executive.md +25 -0
- package/plugin/roles/examples/ai-manager.md +34 -0
- package/plugin/roles/examples/associate.md +24 -0
- package/plugin/roles/examples/brand-lead.md +20 -0
- package/plugin/roles/examples/cfo.md +20 -0
- package/plugin/roles/examples/city-lead.md +25 -0
- package/plugin/roles/examples/clinical-director.md +26 -0
- package/plugin/roles/examples/clinical-ops.md +25 -0
- package/plugin/roles/examples/clinician.md +25 -0
- package/plugin/roles/examples/compliance.md +27 -0
- package/plugin/roles/examples/content.md +24 -0
- package/plugin/roles/examples/controller.md +27 -0
- package/plugin/roles/examples/cpto.md +41 -0
- package/plugin/roles/examples/customer-success.md +25 -0
- package/plugin/roles/examples/data-engineer.md +37 -0
- package/plugin/roles/examples/data.md +60 -0
- package/plugin/roles/examples/dev.md +37 -0
- package/plugin/roles/examples/devops.md +39 -0
- package/plugin/roles/examples/enablement.md +24 -0
- package/plugin/roles/examples/ethics.md +24 -0
- package/plugin/roles/examples/fin-analytics.md +27 -0
- package/plugin/roles/examples/health-compliance.md +25 -0
- package/plugin/roles/examples/health-data.md +26 -0
- package/plugin/roles/examples/knowledge.md +25 -0
- package/plugin/roles/examples/lifecycle.md +26 -0
- package/plugin/roles/examples/llm-engineer.md +34 -0
- package/plugin/roles/examples/managing-partner.md +20 -0
- package/plugin/roles/examples/methods.md +23 -0
- package/plugin/roles/examples/operations-lead.md +23 -0
- package/plugin/roles/examples/ops.md +24 -0
- package/plugin/roles/examples/patient-safety.md +26 -0
- package/plugin/roles/examples/performance.md +27 -0
- package/plugin/roles/examples/po.md +36 -0
- package/plugin/roles/examples/process-owner.md +23 -0
- package/plugin/roles/examples/product-design.md +39 -0
- package/plugin/roles/examples/program-manager.md +24 -0
- package/plugin/roles/examples/quality.md +25 -0
- package/plugin/roles/examples/research-director.md +24 -0
- package/plugin/roles/examples/research-ops.md +25 -0
- package/plugin/roles/examples/researcher.md +25 -0
- package/plugin/roles/examples/revenue-lead.md +25 -0
- package/plugin/roles/examples/revops.md +26 -0
- package/plugin/roles/examples/seo.md +27 -0
- package/plugin/roles/examples/specialist.md +24 -0
- package/plugin/scripts/admision.py +165 -0
- package/plugin/scripts/apaga.py +232 -0
- package/plugin/scripts/avatar.py +211 -0
- package/plugin/scripts/broker.py +531 -0
- package/plugin/scripts/cage.py +252 -0
- package/plugin/scripts/capabilities.py +197 -0
- package/plugin/scripts/card.py +312 -0
- package/plugin/scripts/cities.py +520 -0
- package/plugin/scripts/city-env.sh +90 -0
- package/plugin/scripts/city-runtime.sh +87 -0
- package/plugin/scripts/city-session.sh +526 -0
- package/plugin/scripts/city_env.py +67 -0
- package/plugin/scripts/crecimiento.py +140 -0
- package/plugin/scripts/deliberations.py +48 -0
- package/plugin/scripts/doctor.py +172 -0
- package/plugin/scripts/domains.py +201 -0
- package/plugin/scripts/evidencia.py +64 -0
- package/plugin/scripts/find-repos.sh +111 -0
- package/plugin/scripts/gh.py +159 -0
- package/plugin/scripts/hall_protocol.py +147 -0
- package/plugin/scripts/hook_activity.py +139 -0
- package/plugin/scripts/launch.py +94 -0
- package/plugin/scripts/logs.py +98 -0
- package/plugin/scripts/pairing.py +185 -0
- package/plugin/scripts/parcels.py +132 -0
- package/plugin/scripts/read-card.py +51 -0
- package/plugin/scripts/report.py +201 -0
- package/plugin/scripts/reset.py +180 -0
- package/plugin/scripts/roads.py +230 -0
- package/plugin/scripts/roles.py +274 -0
- package/plugin/scripts/runtime_log.py +69 -0
- package/plugin/scripts/runtime_processes.py +132 -0
- package/plugin/scripts/rutas.py +83 -0
- package/plugin/scripts/seat.py +1349 -0
- package/plugin/scripts/tokens.py +194 -0
- package/plugin/scripts/trust-repos.py +59 -0
- package/plugin/scripts/ui.py +280 -0
- package/plugin/scripts/units.py +80 -0
- package/plugin/scripts/workspace.py +364 -0
- package/plugin/skills/city/SKILL.md +191 -0
- package/templates/blank.md +39 -0
- package/templates/finance.md +44 -0
- package/templates/legal.md +45 -0
- package/templates/marketing.md +48 -0
- package/templates/product.md +45 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Committee governance benchmark
|
|
2
|
+
|
|
3
|
+
This benchmark measures protocol structure: information leakage before independent
|
|
4
|
+
positions, lateral repo-to-repo edges, ungranted interruptions, unresolved floor
|
|
5
|
+
requests, and closure without independent verification. It deliberately does not
|
|
6
|
+
turn those properties into an answer-quality score.
|
|
7
|
+
|
|
8
|
+
The design choices follow primary findings rather than “more agents is better”:
|
|
9
|
+
|
|
10
|
+
- sparse communication can match or outperform fully connected debate at lower
|
|
11
|
+
cost: [Li et al., 2024](https://arxiv.org/abs/2406.11776);
|
|
12
|
+
- collaboration topology materially affects scaling: [Qian et al.,
|
|
13
|
+
2024](https://arxiv.org/abs/2406.07155);
|
|
14
|
+
- majority pressure can suppress independent correction: [Wu et al.,
|
|
15
|
+
2025](https://arxiv.org/abs/2511.07784);
|
|
16
|
+
- the best decision protocol is task-dependent, and extra rounds can hurt:
|
|
17
|
+
[Kaesberg et al., 2025](https://arxiv.org/abs/2502.19130);
|
|
18
|
+
- independent, non-communicating copies make cross-examination meaningful:
|
|
19
|
+
[Brown-Cohen et al., 2023](https://arxiv.org/abs/2311.14125).
|
|
20
|
+
- unguided homogeneous debate can cost more while degrading accuracy through
|
|
21
|
+
conformity, contextual fragility and plurality collapse:
|
|
22
|
+
[Bertalanič and Fortuna, 2026](https://arxiv.org/abs/2605.00914);
|
|
23
|
+
- executive-style integration fails through single-advisor capture and
|
|
24
|
+
historical amnesia even when plans are structurally valid:
|
|
25
|
+
[Dai et al., 2026](https://arxiv.org/abs/2606.17459);
|
|
26
|
+
- not every changed stance is conformity, so influence history is a review
|
|
27
|
+
signal rather than an automatic rejection rule:
|
|
28
|
+
[Hao et al., 2026](https://arxiv.org/abs/2606.00820).
|
|
29
|
+
|
|
30
|
+
Run:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
python3 benchmarks/committee/run.py
|
|
34
|
+
python3 benchmarks/committee/run.py --json
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
The checked-in traces make metric changes reviewable. The real state machine is
|
|
38
|
+
tested separately by `bin/test-committee.py`; a claim about task quality still
|
|
39
|
+
requires a preregistered live benchmark across tasks, models and costs.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Auditable governance metrics for coordination traces."""
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def evaluate(trace):
|
|
6
|
+
events = trace.get('events', [])
|
|
7
|
+
lateral = sum(
|
|
8
|
+
event.get('type') == 'message'
|
|
9
|
+
and event.get('from') != 'seat'
|
|
10
|
+
and event.get('to') != 'seat'
|
|
11
|
+
for event in events)
|
|
12
|
+
isolation = sum(
|
|
13
|
+
event.get('type') == 'position' and bool(event.get('saw_peer'))
|
|
14
|
+
for event in events)
|
|
15
|
+
ungranted = sum(
|
|
16
|
+
event.get('type') == 'floor_reply' and not event.get('granted')
|
|
17
|
+
for event in events)
|
|
18
|
+
pending = sum(
|
|
19
|
+
event.get('type') == 'decision'
|
|
20
|
+
and int(event.get('pending_floor', 0)) > 0
|
|
21
|
+
for event in events)
|
|
22
|
+
unattributed = sum(
|
|
23
|
+
event.get('type') == 'decision'
|
|
24
|
+
and not event.get('decisive_contributors')
|
|
25
|
+
for event in events)
|
|
26
|
+
unverified = sum(
|
|
27
|
+
event.get('type') == 'close' and event.get('verification') != 'pass'
|
|
28
|
+
for event in events)
|
|
29
|
+
self_verified = sum(
|
|
30
|
+
event.get('type') == 'close'
|
|
31
|
+
and event.get('verifier') == event.get('executor')
|
|
32
|
+
for event in events)
|
|
33
|
+
evidence = set()
|
|
34
|
+
for event in events:
|
|
35
|
+
for item in event.get('evidence', []):
|
|
36
|
+
evidence.add(str(item).split(':', 1)[0])
|
|
37
|
+
violations = (lateral + isolation + ungranted + pending + unattributed
|
|
38
|
+
+ unverified + self_verified)
|
|
39
|
+
return {
|
|
40
|
+
'strategy': trace.get('strategy', 'unknown'),
|
|
41
|
+
'coordination_events': len(events),
|
|
42
|
+
'evidence_sources': len(evidence),
|
|
43
|
+
'lateral_member_edges': lateral,
|
|
44
|
+
'pre_barrier_leaks': isolation,
|
|
45
|
+
'ungranted_replies': ungranted,
|
|
46
|
+
'decisions_with_pending_floor': pending,
|
|
47
|
+
'unattributed_decisions': unattributed,
|
|
48
|
+
'closures_without_pass': unverified,
|
|
49
|
+
'self_verified_closures': self_verified,
|
|
50
|
+
'protocol_violations': violations,
|
|
51
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Compare coordination traces without pretending to measure model quality."""
|
|
3
|
+
import argparse
|
|
4
|
+
import json
|
|
5
|
+
import os
|
|
6
|
+
|
|
7
|
+
from metrics import evaluate
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def load_all():
|
|
11
|
+
root = os.path.join(os.path.dirname(__file__), 'traces')
|
|
12
|
+
rows = []
|
|
13
|
+
for name in sorted(os.listdir(root)):
|
|
14
|
+
if name.endswith('.json'):
|
|
15
|
+
rows.append(evaluate(json.load(open(os.path.join(root, name),
|
|
16
|
+
encoding='utf-8'))))
|
|
17
|
+
return rows
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def table(rows):
|
|
21
|
+
columns = [
|
|
22
|
+
('strategy', 'strategy'),
|
|
23
|
+
('events', 'coordination_events'),
|
|
24
|
+
('evidence', 'evidence_sources'),
|
|
25
|
+
('lateral', 'lateral_member_edges'),
|
|
26
|
+
('leaks', 'pre_barrier_leaks'),
|
|
27
|
+
('ungranted', 'ungranted_replies'),
|
|
28
|
+
('pending', 'decisions_with_pending_floor'),
|
|
29
|
+
('unattributed', 'unattributed_decisions'),
|
|
30
|
+
('unverified', 'closures_without_pass'),
|
|
31
|
+
('self-check', 'self_verified_closures'),
|
|
32
|
+
('violations', 'protocol_violations'),
|
|
33
|
+
]
|
|
34
|
+
widths = [max(len(label), *(len(str(row[key])) for row in rows))
|
|
35
|
+
for label, key in columns]
|
|
36
|
+
lines = [
|
|
37
|
+
' '.join(label.ljust(width) for (label, _), width in zip(columns, widths)),
|
|
38
|
+
' '.join('-' * width for width in widths),
|
|
39
|
+
]
|
|
40
|
+
for row in rows:
|
|
41
|
+
lines.append(' '.join(str(row[key]).ljust(width)
|
|
42
|
+
for (_, key), width in zip(columns, widths)))
|
|
43
|
+
return '\n'.join(lines)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def main():
|
|
47
|
+
parser = argparse.ArgumentParser(
|
|
48
|
+
description='Structural benchmark; it does not claim answer-quality SOTA')
|
|
49
|
+
parser.add_argument('--json', action='store_true')
|
|
50
|
+
args = parser.parse_args()
|
|
51
|
+
rows = load_all()
|
|
52
|
+
if args.json:
|
|
53
|
+
print(json.dumps({
|
|
54
|
+
'benchmark': 'agents-city/committee-governance@1',
|
|
55
|
+
'scope': 'protocol structure, not task-answer quality',
|
|
56
|
+
'results': rows,
|
|
57
|
+
}, indent=2))
|
|
58
|
+
else:
|
|
59
|
+
print(table(rows))
|
|
60
|
+
print('\nStructural only: run live task datasets before any model-quality claim.')
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
if __name__ == '__main__':
|
|
64
|
+
main()
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"strategy": "single-agent",
|
|
3
|
+
"events": [
|
|
4
|
+
{"type": "position", "actor": "seat", "saw_peer": false, "evidence": ["seat:inspection"]},
|
|
5
|
+
{"type": "decision", "pending_floor": 0},
|
|
6
|
+
{"type": "close", "verification": "none", "executor": "seat", "verifier": "seat"}
|
|
7
|
+
]
|
|
8
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"strategy": "free-mesh",
|
|
3
|
+
"events": [
|
|
4
|
+
{"type": "position", "actor": "api", "saw_peer": false, "evidence": ["api:test"]},
|
|
5
|
+
{"type": "message", "from": "api", "to": "web"},
|
|
6
|
+
{"type": "position", "actor": "web", "saw_peer": true, "evidence": ["web:e2e"]},
|
|
7
|
+
{"type": "message", "from": "web", "to": "api"},
|
|
8
|
+
{"type": "message", "from": "api", "to": "web"},
|
|
9
|
+
{"type": "message", "from": "web", "to": "ops"},
|
|
10
|
+
{"type": "message", "from": "ops", "to": "api"},
|
|
11
|
+
{"type": "floor_reply", "actor": "ops", "granted": false, "evidence": ["ops:log"]},
|
|
12
|
+
{"type": "decision", "pending_floor": 1},
|
|
13
|
+
{"type": "verification", "actor": "api", "executor": "api", "result": "pass", "evidence": ["api:self-check"]},
|
|
14
|
+
{"type": "close", "verification": "pass", "executor": "api", "verifier": "api"}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"strategy": "chair-mediated",
|
|
3
|
+
"events": [
|
|
4
|
+
{"type": "assignment", "from": "seat", "to": "api"},
|
|
5
|
+
{"type": "assignment", "from": "seat", "to": "web"},
|
|
6
|
+
{"type": "position", "actor": "api", "saw_peer": false, "evidence": ["api:test"]},
|
|
7
|
+
{"type": "position", "actor": "web", "saw_peer": false, "evidence": ["web:e2e"]},
|
|
8
|
+
{"type": "synthesis", "actor": "seat"},
|
|
9
|
+
{"type": "floor_request", "actor": "api", "evidence": ["api:replay"]},
|
|
10
|
+
{"type": "floor_reply", "actor": "api", "granted": true, "evidence": ["api:replay"]},
|
|
11
|
+
{"type": "decision", "actor": "seat", "pending_floor": 0, "decisive_contributors": ["api", "web"]},
|
|
12
|
+
{"type": "verification", "actor": "ops", "executor": "seat", "result": "pass", "evidence": ["ops:clean-check"]},
|
|
13
|
+
{"type": "close", "verification": "pass", "executor": "seat", "verifier": "ops"}
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Native runtime latency
|
|
2
|
+
|
|
3
|
+
The offline `runtime` test proves the transport contracts deterministically:
|
|
4
|
+
one authenticated city WebSocket fans out to Claude stream-json, Codex
|
|
5
|
+
app-server WebSocket, OpenCode HTTP/SSE and Kimi REST/WebSocket doubles, with no
|
|
6
|
+
tmux or clipboard.
|
|
7
|
+
|
|
8
|
+
The live benchmark deliberately makes real model calls and may consume account
|
|
9
|
+
quota or paid tokens:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
agents-city benchmark live
|
|
13
|
+
agents-city benchmark live --runtime claude --runtime codex
|
|
14
|
+
agents-city benchmark live --command opencode='opencode --model provider/model --auto'
|
|
15
|
+
agents-city benchmark live --json
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Each runtime receives the same read-only marker task. A run is successful only
|
|
19
|
+
when the model submits an evidence-backed committee position. Two clocks are
|
|
20
|
+
reported separately:
|
|
21
|
+
|
|
22
|
+
- `busToNativeAcceptMs`: the native provider protocol accepted the assignment;
|
|
23
|
+
- `endToEndPositionMs`: the agent returned its position through the committee.
|
|
24
|
+
|
|
25
|
+
This distinction prevents a fast HTTP response or stdin acknowledgement from being
|
|
26
|
+
misreported as completed work. By default, metadata-only reports are appended
|
|
27
|
+
to `~/.agents-city/.benchmarks/native-e2e.jsonl` and compared with the previous
|
|
28
|
+
successful run of the same command. Prompts, repo contents and model output are
|
|
29
|
+
not stored in that ledger. Use `--no-save` for an ephemeral run.
|
|
30
|
+
|
|
31
|
+
Claude runs through one persistent official `claude -p` process with streaming
|
|
32
|
+
JSON input/output, exactly like the normal city launcher. It needs no custom
|
|
33
|
+
Channel, development consent, Team policy or terminal keystroke. Codex, OpenCode
|
|
34
|
+
and Kimi use their native server protocols directly. A missing login, such as an
|
|
35
|
+
unconfigured Kimi provider, is reported as a failed runtime.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/** Deterministic Claude Code stream-json double. No account or network needed. */
|
|
3
|
+
import { appendFileSync, readFileSync } from 'fs';
|
|
4
|
+
import { createInterface } from 'readline';
|
|
5
|
+
|
|
6
|
+
const capture = process.env.CITY_CLAUDE_FAKE_CAPTURE || '';
|
|
7
|
+
const behaviorPath = process.env.CITY_CLAUDE_FAKE_BEHAVIOR || '';
|
|
8
|
+
const actor = process.env.CITY_BUS_ACTOR || 'claude-agent';
|
|
9
|
+
const queue = [];
|
|
10
|
+
let working = false;
|
|
11
|
+
|
|
12
|
+
if (!capture) throw new Error('CITY_CLAUDE_FAKE_CAPTURE is required');
|
|
13
|
+
if (behavior() === 'exit-before-ready') process.exit(23);
|
|
14
|
+
|
|
15
|
+
emit({
|
|
16
|
+
type: 'system',
|
|
17
|
+
subtype: 'init',
|
|
18
|
+
session_id: `fake-${actor}`,
|
|
19
|
+
claude_code_version: 'fake',
|
|
20
|
+
cwd: process.cwd(),
|
|
21
|
+
model: 'fake-claude',
|
|
22
|
+
tools: [],
|
|
23
|
+
mcp_servers: [],
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const input = createInterface({ input: process.stdin, terminal: false });
|
|
27
|
+
input.on('line', (line) => {
|
|
28
|
+
let message;
|
|
29
|
+
try {
|
|
30
|
+
message = JSON.parse(line);
|
|
31
|
+
} catch {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (message.shouldQuery === false) {
|
|
35
|
+
emit({ ...message, session_id: `fake-${actor}`, isReplay: true });
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const mode = behavior();
|
|
39
|
+
appendFileSync(
|
|
40
|
+
capture,
|
|
41
|
+
JSON.stringify({
|
|
42
|
+
provider: 'claude',
|
|
43
|
+
actor,
|
|
44
|
+
behavior: mode,
|
|
45
|
+
receivedAt: new Date().toISOString(),
|
|
46
|
+
request: message,
|
|
47
|
+
args: process.argv.slice(2),
|
|
48
|
+
channelEnabled: process.env.CITY_CLAUDE_CHANNEL || '',
|
|
49
|
+
streamGateway: process.env.CITY_CLAUDE_STREAM_GATEWAY || '',
|
|
50
|
+
}) + '\n',
|
|
51
|
+
);
|
|
52
|
+
if (mode === 'exit-on-prompt') process.exit(24);
|
|
53
|
+
if (mode === 'reject-prompt') {
|
|
54
|
+
emit({
|
|
55
|
+
type: 'result',
|
|
56
|
+
subtype: 'error_during_execution',
|
|
57
|
+
is_error: true,
|
|
58
|
+
session_id: `fake-${actor}`,
|
|
59
|
+
errors: ['fake Claude rejected the prompt'],
|
|
60
|
+
});
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (mode === 'no-ack') return;
|
|
64
|
+
if (mode === 'malformed-output') process.stdout.write('not-json\n');
|
|
65
|
+
emit({ ...message, session_id: `fake-${actor}`, isReplay: true });
|
|
66
|
+
queue.push(message);
|
|
67
|
+
runNext();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
function runNext() {
|
|
71
|
+
if (working || !queue.length) return;
|
|
72
|
+
working = true;
|
|
73
|
+
const message = queue.shift();
|
|
74
|
+
const text = userText(message);
|
|
75
|
+
setTimeout(() => {
|
|
76
|
+
emit({
|
|
77
|
+
type: 'assistant',
|
|
78
|
+
uuid: `assistant-${message.uuid}`,
|
|
79
|
+
session_id: `fake-${actor}`,
|
|
80
|
+
parent_tool_use_id: null,
|
|
81
|
+
message: {
|
|
82
|
+
role: 'assistant',
|
|
83
|
+
content: [{ type: 'text', text: `Fake Claude answer for ${actor}: ${text.slice(0, 80)}` }],
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
setTimeout(() => {
|
|
87
|
+
emit({
|
|
88
|
+
type: 'result',
|
|
89
|
+
subtype: 'success',
|
|
90
|
+
is_error: false,
|
|
91
|
+
session_id: `fake-${actor}`,
|
|
92
|
+
result: `Fake Claude answer for ${actor}: ${text.slice(0, 80)}`,
|
|
93
|
+
errors: [],
|
|
94
|
+
});
|
|
95
|
+
working = false;
|
|
96
|
+
runNext();
|
|
97
|
+
}, 5);
|
|
98
|
+
}, 5);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function userText(message) {
|
|
102
|
+
const content = message?.message?.content;
|
|
103
|
+
if (typeof content === 'string') return content;
|
|
104
|
+
if (!Array.isArray(content)) return '';
|
|
105
|
+
return content.map((block) => block?.type === 'text' ? String(block.text || '') : '').join('');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function emit(value) {
|
|
109
|
+
process.stdout.write(JSON.stringify(value) + '\n');
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function behavior() {
|
|
113
|
+
if (!behaviorPath) return 'healthy';
|
|
114
|
+
try {
|
|
115
|
+
return readFileSync(behaviorPath, 'utf8').trim() || 'healthy';
|
|
116
|
+
} catch {
|
|
117
|
+
return 'healthy';
|
|
118
|
+
}
|
|
119
|
+
}
|