agentorch 0.1.0__py3-none-any.whl

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 (123) hide show
  1. agentorch-0.1.0.dist-info/METADATA +335 -0
  2. agentorch-0.1.0.dist-info/RECORD +123 -0
  3. agentorch-0.1.0.dist-info/WHEEL +5 -0
  4. agentorch-0.1.0.dist-info/entry_points.txt +2 -0
  5. agentorch-0.1.0.dist-info/top_level.txt +4 -0
  6. benchmarks/hidden_profile/run_baseline.py +139 -0
  7. benchmarks/hidden_profile/run_devtorch.py +153 -0
  8. benchmarks/hidden_profile/score.py +260 -0
  9. benchmarks/swe_bench/compare.py +239 -0
  10. benchmarks/swe_bench/run_baseline.py +187 -0
  11. benchmarks/swe_bench/run_devtorch.py +252 -0
  12. benchmarks/swe_bench/seed_gcc.py +127 -0
  13. devtorch_cli/__init__.py +1 -0
  14. devtorch_cli/main.py +1357 -0
  15. devtorch_core/__init__.py +154 -0
  16. devtorch_core/aggphi_textual.py +275 -0
  17. devtorch_core/alerts/__init__.py +13 -0
  18. devtorch_core/alerts/base.py +46 -0
  19. devtorch_core/alerts/config.py +50 -0
  20. devtorch_core/alerts/dispatcher.py +104 -0
  21. devtorch_core/alerts/jira.py +96 -0
  22. devtorch_core/alerts/pagerduty.py +66 -0
  23. devtorch_core/alerts/slack.py +81 -0
  24. devtorch_core/capability.py +386 -0
  25. devtorch_core/codex/__init__.py +9 -0
  26. devtorch_core/codex/__main__.py +97 -0
  27. devtorch_core/codex/capture.py +208 -0
  28. devtorch_core/codex/proxy.py +412 -0
  29. devtorch_core/dashboard_api.py +1285 -0
  30. devtorch_core/deltaf.py +97 -0
  31. devtorch_core/disclosure.py +50 -0
  32. devtorch_core/gateway/__init__.py +30 -0
  33. devtorch_core/gateway/metrics_webhook.py +176 -0
  34. devtorch_core/gateway/policy.py +198 -0
  35. devtorch_core/gateway/server.py +624 -0
  36. devtorch_core/gateway/sso.py +183 -0
  37. devtorch_core/gcc.py +1173 -0
  38. devtorch_core/github/__init__.py +19 -0
  39. devtorch_core/github/app.py +114 -0
  40. devtorch_core/github/comment_builder.py +113 -0
  41. devtorch_core/github/pr_parser.py +82 -0
  42. devtorch_core/hooks/__init__.py +17 -0
  43. devtorch_core/hooks/claude_code.py +228 -0
  44. devtorch_core/hooks/git_commit.py +182 -0
  45. devtorch_core/hooks/installer.py +313 -0
  46. devtorch_core/hooks/runner.py +172 -0
  47. devtorch_core/invariants.py +182 -0
  48. devtorch_core/mcp/__init__.py +10 -0
  49. devtorch_core/mcp/server.py +365 -0
  50. devtorch_core/metrics/__init__.py +35 -0
  51. devtorch_core/metrics/calibrate.py +185 -0
  52. devtorch_core/metrics/calibration.py +125 -0
  53. devtorch_core/metrics/credibility.py +288 -0
  54. devtorch_core/metrics/dhs.py +126 -0
  55. devtorch_core/metrics/mcs.py +96 -0
  56. devtorch_core/metrics/roi.py +88 -0
  57. devtorch_core/metrics/session_writer.py +69 -0
  58. devtorch_core/metrics/shadow_ai.py +117 -0
  59. devtorch_core/metrics/sprint_writer.py +80 -0
  60. devtorch_core/observability/__init__.py +47 -0
  61. devtorch_core/observability/formatter.py +119 -0
  62. devtorch_core/observability/report.py +264 -0
  63. devtorch_core/observability/webhook.py +227 -0
  64. devtorch_core/parser/__init__.py +30 -0
  65. devtorch_core/parser/blocks.py +188 -0
  66. devtorch_core/parser/inference.py +159 -0
  67. devtorch_core/parser/thinking.py +112 -0
  68. devtorch_core/prompt_artifact.py +61 -0
  69. devtorch_core/proxy/__init__.py +9 -0
  70. devtorch_core/proxy/routes/__init__.py +1 -0
  71. devtorch_core/proxy/routes/anthropic.py +264 -0
  72. devtorch_core/proxy/routes/gemini.py +331 -0
  73. devtorch_core/proxy/routes/openai.py +287 -0
  74. devtorch_core/proxy/server.py +317 -0
  75. devtorch_core/rdp.py +105 -0
  76. devtorch_core/rep.py +134 -0
  77. devtorch_core/rep_network/__init__.py +23 -0
  78. devtorch_core/rep_network/node.py +137 -0
  79. devtorch_core/rep_network/server.py +140 -0
  80. devtorch_core/rep_network/sync.py +207 -0
  81. devtorch_core/sensitivity.py +180 -0
  82. devtorch_core/sis.py +197 -0
  83. devtorch_core/theta.py +221 -0
  84. devtorch_core/theta_synthesis.py +268 -0
  85. devtorch_core/variance.py +219 -0
  86. devtorch_core/wrapper/__init__.py +52 -0
  87. devtorch_core/wrapper/anthropic.py +317 -0
  88. devtorch_core/wrapper/base.py +302 -0
  89. devtorch_core/wrapper/bedrock.py +234 -0
  90. devtorch_core/wrapper/gemini.py +284 -0
  91. devtorch_core/wrapper/ollama.py +419 -0
  92. devtorch_core/wrapper/openai.py +294 -0
  93. tests/test_s0_gcc.py +115 -0
  94. tests/test_s11_codex.py +388 -0
  95. tests/test_s11_hooks_installer.py +350 -0
  96. tests/test_s12_github.py +369 -0
  97. tests/test_s13_dashboard_api.py +395 -0
  98. tests/test_s13_forensic.py +410 -0
  99. tests/test_s14_audit_export.py +292 -0
  100. tests/test_s14_ciso_api.py +326 -0
  101. tests/test_s15_rep_network.py +644 -0
  102. tests/test_s16_alerts.py +382 -0
  103. tests/test_s17a_metrics.py +638 -0
  104. tests/test_s17b_observability.py +447 -0
  105. tests/test_s18_credibility.py +208 -0
  106. tests/test_s1_branch_merge.py +130 -0
  107. tests/test_s2_context.py +77 -0
  108. tests/test_s3_sensitivity.py +1000 -0
  109. tests/test_s4_invariants.py +143 -0
  110. tests/test_s4_variance_lock.py +208 -0
  111. tests/test_s5_privacy_disclosure.py +99 -0
  112. tests/test_s5_rep_sis.py +116 -0
  113. tests/test_s6_debug.py +108 -0
  114. tests/test_s7_mcp_hooks.py +616 -0
  115. tests/test_s7_ollama_wrapper.py +755 -0
  116. tests/test_s7_parser.py +550 -0
  117. tests/test_s7_proxy.py +590 -0
  118. tests/test_s7_wrappers.py +926 -0
  119. tests/test_s7ent_gateway.py +559 -0
  120. tests/test_s8_aggphi.py +213 -0
  121. tests/test_s8_theta_synthesis.py +425 -0
  122. tests/test_s9_gaps.py +161 -0
  123. tests/test_setup_command.py +318 -0
@@ -0,0 +1,335 @@
1
+ Metadata-Version: 2.4
2
+ Name: agentorch
3
+ Version: 0.1.0
4
+ Summary: DevTorch — AI reasoning capture, audit trail, and governance for agent-assisted development
5
+ Author-email: Hemant Joshi <hemant@flotorch.ai>
6
+ License: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/hemantcgi/DevTorch
8
+ Project-URL: Repository, https://github.com/hemantcgi/DevTorch
9
+ Project-URL: Documentation, https://github.com/hemantcgi/DevTorch/blob/main/Implementation/README.md
10
+ Keywords: ai,agents,governance,audit,llm,reasoning,devtorch
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: Apache Software License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown
22
+ Provides-Extra: dev
23
+ Requires-Dist: pytest>=8.0.0; extra == "dev"
24
+ Provides-Extra: wrapper
25
+ Requires-Dist: anthropic>=0.40.0; extra == "wrapper"
26
+ Requires-Dist: openai>=1.50.0; extra == "wrapper"
27
+ Requires-Dist: google-generativeai>=0.8.0; extra == "wrapper"
28
+ Requires-Dist: boto3>=1.35.0; extra == "wrapper"
29
+ Requires-Dist: tiktoken>=0.7.0; extra == "wrapper"
30
+ Provides-Extra: proxy
31
+ Requires-Dist: fastapi>=0.115.0; extra == "proxy"
32
+ Requires-Dist: uvicorn[standard]>=0.32.0; extra == "proxy"
33
+ Requires-Dist: httpx>=0.27.0; extra == "proxy"
34
+ Requires-Dist: pydantic>=2.9.0; extra == "proxy"
35
+ Provides-Extra: mcp
36
+ Requires-Dist: mcp>=1.0.0; extra == "mcp"
37
+ Provides-Extra: all
38
+ Requires-Dist: agentorch[mcp,proxy,wrapper]; extra == "all"
39
+
40
+ # DevTorch
41
+
42
+ **Local-first AI agent governance.** DevTorch gives multi-agent systems a shared on-disk audit trail, coordination vector, privacy controls, and LLM integration layer — all without a remote service.
43
+
44
+ ```
45
+ pip install devtorch
46
+ devtorch init
47
+ devtorch commit -m "Add payments service"
48
+ devtorch debug timeline
49
+ ```
50
+
51
+ ---
52
+
53
+ ## What it does
54
+
55
+ | Concern | DevTorch feature |
56
+ |---------|-----------------|
57
+ | Reasoning audit trail | Append-only `.GCC/events.log.jsonl` with SHA-256 hash chain |
58
+ | Multi-agent coordination | Coordination vector Θ — shared sensitivity map across agents |
59
+ | Privacy compliance | RDP ε-budget tracking; `[PRIVATE]` span suppression; SIS-TC quarantine |
60
+ | LLM integration | SDK wrappers, HTTP proxy, Claude Code MCP server + hooks |
61
+ | Governance observability | Structured reports, browser dashboard, VS Code extension (Antigravity-compatible) |
62
+ | Alerting | Slack, Jira, PagerDuty outbound webhooks |
63
+ | Metrics | MCS, DHS, ROI — all traceable to citations or explicit design choices |
64
+
65
+ Everything lives in `.GCC/` — a local directory in your project. No database, no network service, no telemetry.
66
+
67
+ ---
68
+
69
+ ## Install
70
+
71
+ ```bash
72
+ python3 -m venv .venv && source .venv/bin/activate
73
+
74
+ # Core CLI only
75
+ pip install devtorch
76
+
77
+ # With SDK wrappers (Anthropic, OpenAI, Gemini, Bedrock)
78
+ pip install devtorch[wrapper]
79
+
80
+ # With HTTP proxy + dashboard API (FastAPI)
81
+ pip install devtorch[proxy]
82
+
83
+ # Everything
84
+ pip install devtorch[all]
85
+ ```
86
+
87
+ **Requirements**: Python 3.10+
88
+
89
+ ---
90
+
91
+ ## Quick start
92
+
93
+ ```bash
94
+ cd /path/to/your/project
95
+ devtorch init
96
+
97
+ # Record reasoning commits
98
+ devtorch commit -m "Chose idempotent transfer endpoint design"
99
+
100
+ # Add per-agent branches
101
+ devtorch branch app
102
+ devtorch branch dba
103
+ devtorch branch security-review
104
+
105
+ # Add sensitivity information
106
+ devtorch sensitivity add \
107
+ --source agent-app \
108
+ --concept api_contract \
109
+ --confidence 0.9 \
110
+ --disclosure PUBLIC \
111
+ -m "API shape depends on transaction schema"
112
+
113
+ # Inspect state
114
+ devtorch status
115
+ devtorch debug timeline
116
+ devtorch debug branch-compare app dba
117
+ ```
118
+
119
+ ---
120
+
121
+ ## LLM integration
122
+
123
+ ### Option 1 — SDK wrapper (you own the code)
124
+
125
+ ```python
126
+ # One-line change — same API, governance captured automatically
127
+ from devtorch_core.wrapper.anthropic import DevTorchAnthropic
128
+ client = DevTorchAnthropic() # replaces anthropic.Anthropic()
129
+
130
+ # OpenAI
131
+ from devtorch_core.wrapper.openai import DevTorchOpenAI
132
+ client = DevTorchOpenAI()
133
+
134
+ # Local models via Ollama (no API key required)
135
+ from devtorch_core.wrapper.ollama import DevTorchOllama
136
+ client = DevTorchOllama(model="llama3.2") # any model in `ollama list`
137
+
138
+ # Google Gemini
139
+ from devtorch_core.wrapper.gemini import DevTorchGemini
140
+ client = DevTorchGemini(model_name="gemini-1.5-pro")
141
+
142
+ # AWS Bedrock
143
+ from devtorch_core.wrapper.bedrock import DevTorchBedrock
144
+ client = DevTorchBedrock(region_name="us-east-1")
145
+ ```
146
+
147
+ See `OLLAMA_SETUP.md` for the full Ollama guide.
148
+
149
+ ### Option 2 — HTTP proxy (Cursor, JetBrains, closed-source IDEs)
150
+
151
+ ```bash
152
+ devtorch proxy install # installs as macOS LaunchAgent or Linux systemd service
153
+ devtorch proxy start # runs on localhost:8765
154
+ ```
155
+
156
+ Configure your IDE to use `http://localhost:8765/anthropic` (or `/openai`, `/gemini`). The proxy injects RACP context and captures responses with zero latency penalty.
157
+
158
+ ### Option 3 — MCP server + hooks (Claude Code, Cursor, Kiro, Antigravity)
159
+
160
+ ```bash
161
+ devtorch setup # one command: init + hooks + MCP config + CLAUDE.md + AGENTS.md
162
+ ```
163
+
164
+ Claude Code / Cursor / Kiro / Antigravity then call `devtorch_commit`, `devtorch_sensitivity_add`, `devtorch_context`, and `devtorch_theta_read` as native MCP tools. See `IDE_SETUP.md` for per-IDE instructions.
165
+
166
+ ### Option 4 — OpenAI Codex CLI proxy
167
+
168
+ ```bash
169
+ # Start the Codex-specific proxy on localhost:8766
170
+ python -m devtorch_core.codex start
171
+
172
+ # Point Codex CLI at it
173
+ export OPENAI_BASE_URL=http://localhost:8766/v1
174
+ codex "Add error handling to the payment service"
175
+ ```
176
+
177
+ See `CODEX_SETUP.md` for the full guide.
178
+
179
+ ### Option 5 — Org gateway (enterprise, multi-developer)
180
+
181
+ ```bash
182
+ cd deploy/
183
+ cp .env.example .env # set ANTHROPIC_API_KEY and/or OPENAI_API_KEY
184
+ docker compose up # gateway on :8080, dashboard on :3000
185
+ ```
186
+
187
+ Developers point their IDE proxy URL to the gateway instead of api.openai.com. The gateway handles central API key management, SSO attribution, governance policy enforcement, and metrics aggregation. See `deploy/README.md` for Helm and Docker Compose instructions.
188
+
189
+ ---
190
+
191
+ ## Architecture
192
+
193
+ ```
194
+ devtorch_core/ Pure library — all business logic
195
+ gcc.py GCCRepository: .GCC/ layout, event log, commits, branches
196
+ sensitivity.py Sensitivity events + SensitivityStore
197
+ theta.py Coordination vector Θ + AggPhi
198
+ capability.py OmegaCapability (A1), Lipschitz bound, PST runner
199
+ invariants.py I1 (commit-backed), I3 (semantic grounding)
200
+ variance.py f_max formula, rolling monitor, VARIANCE_ALERT
201
+ rep.py REP ledger — append-only local transport
202
+ sis.py SIS-TC corpus evaluation + quarantine
203
+ rdp.py RDP ε-budget tracking
204
+ disclosure.py [PRIVATE] span suppression
205
+ prompt_artifact.py RACP system prompt artifact store
206
+ deltaf.py Δf estimation
207
+ parser/ XML block extractor, thinking tokens, inference
208
+ wrapper/ SDK drop-in wrappers (Anthropic, OpenAI, Gemini, Bedrock)
209
+ proxy/ HTTP reverse proxy (localhost:8765)
210
+ mcp/ MCP/JSON-RPC server
211
+ hooks/ Claude Code hooks + git commit-msg hook
212
+ metrics/ MCS, DHS, ROI, calibration, citation registry
213
+ observability/ Structured reports + enterprise metrics webhook
214
+ alerts/ Slack, Jira, PagerDuty outbound alerting
215
+ rep_network/ Multi-node REP ledger sync
216
+ github/ GitHub App webhook + PR comment builder
217
+ dashboard_api.py REST API for browser dashboard
218
+
219
+ devtorch_cli/
220
+ main.py Thin argparse wrapper over devtorch_core
221
+
222
+ extensions/vscode/ VS Code extension (read-only sidebar; installs in Antigravity via .vsix)
223
+ dashboard/ React browser dashboard (Developer/Lead/CISO views)
224
+ tests/ 637 tests across all sprints (S0–S18)
225
+ examples/ end-to-end scenario examples
226
+ ```
227
+
228
+ ---
229
+
230
+ ## On-disk layout (`.GCC/`)
231
+
232
+ ```
233
+ .GCC/
234
+ VERSION # format version
235
+ events.log.jsonl # append-only audit stream (hash chain)
236
+ main.md / log.md # reasoning roadmap + chronological log
237
+ refs/HEAD # current branch
238
+ refs/branches/<name> # branch tip commit ID
239
+ commits/<id>.json # commit objects
240
+ sensitivities/events.jsonl # raw sensitivity events
241
+ theta.json # coordination vector Θ
242
+ capabilities/omega.json # A1 capability state
243
+ variance/ # calibration_report.json, live_state.json
244
+ rep/rep_ledger.jsonl # REP transport ledger
245
+ rep/peers.json # peer list for multi-node sync
246
+ sis/ # SIS-TC corpus, reports, quarantine events
247
+ rdp/rdp_state.json # RDP ε-budget
248
+ concepts/<name>.json # I3 concept definitions
249
+ prompts/ # RACP system prompt artifact
250
+ deltaf/ # Δf report
251
+ calibration.json # team-specific metric calibration
252
+ context_bundles/ # MECW-bounded context snapshots
253
+ NODE_STATE # node state machine
254
+ ```
255
+
256
+ ---
257
+
258
+ ## Key safety properties
259
+
260
+ | Property | Mechanism |
261
+ |----------|-----------|
262
+ | Commit-backed decisions (I1) | Merge/unlock blocked unless branch tips exist in commits/ and events log |
263
+ | Semantic grounding (I3) | Operations using concepts_used require matching definitions in concepts/ |
264
+ | Capability gate (A1) | Textual mode requires valid OmegaCapability + passing PST |
265
+ | Variance control (A2) | f_max=0 forces deterministic mode; A1 gate blocks textual_mode |
266
+ | Privacy budget (RDP) | epsilon exhaustion flips read_only=true in rdp_state.json |
267
+ | Proxy trust boundary | Proxy binds to 127.0.0.1 only; API keys pass through, never stored |
268
+
269
+ ---
270
+
271
+ ## Run the tests
272
+
273
+ ```bash
274
+ python3 -m venv .venv && source .venv/bin/activate
275
+ pip install -e .[dev,proxy]
276
+ pytest tests/ # 637 tests
277
+ ```
278
+
279
+ ---
280
+
281
+ ## Configuration reference
282
+
283
+ | Env var | Purpose |
284
+ |---------|---------|
285
+ | `DEVTORCH_DISABLE=1` | Disable all injection and capture (wrapper/proxy become transparent) |
286
+ | `DEVTORCH_SLACK_WEBHOOK_URL` | Slack alert delivery |
287
+ | `DEVTORCH_JIRA_URL` / `_PROJECT_KEY` / `_API_TOKEN` / `_EMAIL` | Jira issue creation |
288
+ | `DEVTORCH_PAGERDUTY_ROUTING_KEY` | PagerDuty event trigger |
289
+ | `DEVTORCH_ALERT_MIN_SEVERITY` | Minimum severity to alert on (`info`/`warning`/`critical`) |
290
+ | `DEVTORCH_METRICS_WEBHOOK_URL` | Enterprise metrics webhook endpoint |
291
+ | `DEVTORCH_ORG_ID` | Org identifier in metrics payloads |
292
+ | `DEVTORCH_METRICS_API_KEY` | Auth for metrics webhook |
293
+ | `DEVTORCH_GITHUB_WEBHOOK_SECRET` | HMAC secret for GitHub App webhook |
294
+
295
+ ---
296
+
297
+ ## Documentation
298
+
299
+ | File | Contents |
300
+ |------|----------|
301
+ | `DOCS.md` | Architecture deep-dive, Sprint 4–6 feature reference, conformance matrix |
302
+ | `OBSERVABILITY.md` | Observability pillars, daily-recall pattern, shell audit script template |
303
+ | `CONTRIBUTING.md` | Dev environment, test commands, sprint structure, PR checklist |
304
+ | `THREAT_MODEL.md` | Trust model, hash chain integrity, proxy trust boundary, known limitations |
305
+ | `DESIGN_THOUGHTS.md` | Design decisions Q1–Q14 with full citation validation |
306
+ | `IDE_SETUP.md` | VS Code, Cursor, Kiro, and Antigravity setup instructions |
307
+ | `ANTIGRAVITY_SETUP.md` | Google Antigravity step-by-step onboarding |
308
+ | `CLAUDE_CODE_QUICKSTART.md` | Claude Code step-by-step onboarding |
309
+ | `OLLAMA_SETUP.md` | Local model setup with Ollama (Llama, Mistral, Gemma, Phi, Qwen) |
310
+ | `CODEX_SETUP.md` | OpenAI Codex CLI proxy setup |
311
+ | `AGENTS.md` | Persistent AI instructions for Antigravity/Kiro |
312
+ | `deploy/README.md` | Enterprise org gateway — Docker Compose and Helm deployment |
313
+ | `devtorch_core/metrics/README.md` | MCS/DHS/ROI formulas and calibration guide |
314
+ | `devtorch_core/proxy/README.md` | HTTP proxy deployment options |
315
+ | `devtorch_core/wrapper/README.md` | SDK wrapper quick-start for all providers |
316
+ | `dashboard/README.md` | Browser dashboard setup and API reference |
317
+
318
+ ---
319
+
320
+ ## Metrics credibility
321
+
322
+ DevTorch is explicit about what every number is based on:
323
+
324
+ - **15 min context switch** — Parnin & Rugaber (2011), *Software Quality Journal*. DOI: [10.1007/s11219-010-9104-9](https://doi.org/10.1007/s11219-010-9104-9). Measured for programming tasks only.
325
+ - **Auditor rate** — BLS SOC 13-2011 (2023): $39–40/hr employed staff. External rates ($75–400/hr) not used as defaults.
326
+ - **MCS/DHS weights** — Design choices. No external benchmark. Calibrate with your team's data.
327
+ - **Developer hourly rate** — No default. You must set it: `devtorch calibrate --set developer_hourly_rate=<value>`
328
+
329
+ See `devtorch_core/metrics/credibility.py` for the full citation registry.
330
+
331
+ ---
332
+
333
+ ## License
334
+
335
+ Apache 2.0
@@ -0,0 +1,123 @@
1
+ benchmarks/hidden_profile/run_baseline.py,sha256=MMzB6iZMTynYWNMESNW22p1jx-sk5qhQGk_SvUKAx1s,5148
2
+ benchmarks/hidden_profile/run_devtorch.py,sha256=zbO7rjmAlkhdr5IM0zjgzhauGtB-izg33OQ0ABGTMiQ,5662
3
+ benchmarks/hidden_profile/score.py,sha256=yP5CKugmc9naEeQAIGA3aRuSEexyA1f4d8zbIKuZcn8,10169
4
+ benchmarks/swe_bench/compare.py,sha256=a8X2DQNXd3DDeR6KlC7tKiF2LKmM9wb4B6E90G6hvCA,9705
5
+ benchmarks/swe_bench/run_baseline.py,sha256=wTRHG_04KMvEF9zCdAl7ysL1Bt4xq7P7nbMMoEe6i0g,6553
6
+ benchmarks/swe_bench/run_devtorch.py,sha256=AmDGq7xfk4g_G0qCu47oc0j-gj2k4puQIyT-OPJqWcY,8897
7
+ benchmarks/swe_bench/seed_gcc.py,sha256=EYNrBYtBMGf_1rOEYyZzmNZHUssR1AqALrg0UFvxiOQ,4558
8
+ devtorch_cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
9
+ devtorch_cli/main.py,sha256=kiwG8MkWoKxEAHv23uD2KLCy2OTH6DtyuRDuIljWNP0,54722
10
+ devtorch_core/__init__.py,sha256=GxNTCYqEEqIHDqqhtNXEkuKejEg3eF4-va61bkWrIRA,3763
11
+ devtorch_core/aggphi_textual.py,sha256=tQP9cRahVPSDDC9ePJVCJCni3PopD2yNL8g4BnGMxEs,9901
12
+ devtorch_core/capability.py,sha256=amv37Sz9-y332D7FXDfphCwiwXnEw0Epz4sAl0B_11A,13888
13
+ devtorch_core/dashboard_api.py,sha256=8c5KLosDKMWKYRfmTLxQwKe15wQt9pjGb1-C4roRLC0,44406
14
+ devtorch_core/deltaf.py,sha256=ggdnES0AoF3YslzmUkVEe9XwaZCiTV_dtLVAlHCNArg,3412
15
+ devtorch_core/disclosure.py,sha256=khLlFw1W-x1zwz8RSi_KcjB6xCmU82KjG44-ovwC0qk,1988
16
+ devtorch_core/gcc.py,sha256=2QpGyuuPaBqLJJxWg6Svs11oBjHMKPXG-5_jcJSFGbE,45858
17
+ devtorch_core/invariants.py,sha256=zx3l1ecghb7lvX_geA9AsJmzgKiCFpTbFB2OSoSdnLI,6573
18
+ devtorch_core/prompt_artifact.py,sha256=EZhPqaiys_7x4emDt4lfDnk8oZq0PXtUz_-G3-9lfcU,2388
19
+ devtorch_core/rdp.py,sha256=NoHoHCwTRkDS82W-DuxzW6APUdEEuFHvjpVd9CvevtM,3693
20
+ devtorch_core/rep.py,sha256=5AmS0rCTZR3R9MBD0Il5Vt-2TImXbX853awr6LtZy7o,4786
21
+ devtorch_core/sensitivity.py,sha256=Iq8207W1-oZ1Ul-q9EGMCnOeA_4z4zF02gdWE9a4ZHk,6346
22
+ devtorch_core/sis.py,sha256=53JSJTXhvpUlqJv1Mxu3zukXPDECYLFP5hfbrNG8o1o,6647
23
+ devtorch_core/theta.py,sha256=g5PkIpiqNDFTwThpX_5cHUMx2lLdhMg6es12hDlLVJw,8060
24
+ devtorch_core/theta_synthesis.py,sha256=lioPG8XXNM5bipA-IFJ5ESSjYUoO4QO9BEXTbTHMweE,8620
25
+ devtorch_core/variance.py,sha256=fiGcXiolt-lxdjGTUngUJvg9IBdjzuNM_MZ2d7wrib0,7142
26
+ devtorch_core/alerts/__init__.py,sha256=RW8uod8RMLpG_nUfI3BzBX9IX4yjokG1_kPawF_dhKE,334
27
+ devtorch_core/alerts/base.py,sha256=PC7eoVFYMCtEJEfCx4S9LHow53Yh5y0BQE7rBPLz82A,1175
28
+ devtorch_core/alerts/config.py,sha256=_ej9j4UBTVeZ5PaLuoqfodhTX6Hf4YQ5wpqPjNkDrm4,2044
29
+ devtorch_core/alerts/dispatcher.py,sha256=zFLDUAYNWxIu-gLVxjgL-EOkceklHyXKcTwYiRuF4Vk,3290
30
+ devtorch_core/alerts/jira.py,sha256=MaWNpFGrtshF7qGE37mH6wBsrCnnH-HhmsuirfjRNpI,3293
31
+ devtorch_core/alerts/pagerduty.py,sha256=92YE9hKp7NCa6XTbX67VhEhZJp_euRT2sSSbHaHgNkw,2268
32
+ devtorch_core/alerts/slack.py,sha256=VFAIseuzjJu20X2n7lee_68Pe7OnvjyTHG09YoFk0aM,2660
33
+ devtorch_core/codex/__init__.py,sha256=KSSehj8ZBr4AAofpImti2yyFExerQ58ZJZb9sroCkdw,267
34
+ devtorch_core/codex/__main__.py,sha256=xNL9X-VvlbU1zNQIWg0Sc8WfUN-XGIZRPUHdxc4GGKA,2533
35
+ devtorch_core/codex/capture.py,sha256=26ZcmDN7UGXZafAljqulS9DLBokGVxbjUeMVf3xWh-8,6834
36
+ devtorch_core/codex/proxy.py,sha256=idueXVtROJIOGU1uFGkh7PENUrWeh7ovtA6KjhDS9AA,13772
37
+ devtorch_core/gateway/__init__.py,sha256=W3cFZlGa5VCi1IP8FV87nZcmAHY9qSn7MsF_puAZ2mU,954
38
+ devtorch_core/gateway/metrics_webhook.py,sha256=5okCHAPR-iWymTB5RkN_VWmjzZ5be70irGFVAW_Ii7w,5833
39
+ devtorch_core/gateway/policy.py,sha256=MqLGKTkZhqN62sk-zlnpGZnDGMwD4jTR7Q-ZLL4lfCc,7278
40
+ devtorch_core/gateway/server.py,sha256=CPCh8gXrux2i7yLiM5n0pqrcVX2ohvaRZY-CCkID3yI,22238
41
+ devtorch_core/gateway/sso.py,sha256=Udpprj8T40in4ppd45_Gh8QYMaUz3KjLWyMjaw74KrM,6408
42
+ devtorch_core/github/__init__.py,sha256=En76DcBl8mV2oB8FA2_jy84W9dPJY2_a7g1GaNhR1UY,606
43
+ devtorch_core/github/app.py,sha256=iuvsrFGzvLCGUsf9nT90t39bC6Sr1OHW-m5ZdHLG1WI,3836
44
+ devtorch_core/github/comment_builder.py,sha256=wHYtN4rsSXsn5SBJeJRpj_ajO_QXBJi0MVBBv68n1qA,4855
45
+ devtorch_core/github/pr_parser.py,sha256=higAWffnKjv0-rMDktab5Xz-lp9kI2VTYwz5FBZfi0w,2473
46
+ devtorch_core/hooks/__init__.py,sha256=NuoQtG9wG8jP3dv4D7EHUTgplSWJJubHhPiVSab__Dg,462
47
+ devtorch_core/hooks/claude_code.py,sha256=OCxbSaUlNnXeWI8r5VwjQpbElm_r4tHFG39v70GkB0w,7056
48
+ devtorch_core/hooks/git_commit.py,sha256=ILHaK5ccKrGuM5Ex6AMUiDZSrV9vFNrQS2P33zE-_Es,5832
49
+ devtorch_core/hooks/installer.py,sha256=FSDQCQPNx5ohl1f0z1n-3nO9QEqxSpgHU5eA9WazH7E,10060
50
+ devtorch_core/hooks/runner.py,sha256=D7Tw2jzkeg8ULqF6mJaz89BqA60gjTFxFL6yTUV2S_8,5114
51
+ devtorch_core/mcp/__init__.py,sha256=cL0Ly1wWYFRknkeS-EnlwbyvmTAhWACVlrVTfIcTfyI,212
52
+ devtorch_core/mcp/server.py,sha256=m9q_IYX43hHJZnPu16mO5hdHss-oUFqH9hlJSI-WRkw,11824
53
+ devtorch_core/metrics/__init__.py,sha256=7H-vWVhlD7E27Ehj7ieIrlDSfT1oqLuq2z-X2c-qmw8,1135
54
+ devtorch_core/metrics/calibrate.py,sha256=qZWMUQhdXUrCpXTjD8j1UTT3cszvgwMP8IXMjZqWIuk,6967
55
+ devtorch_core/metrics/calibration.py,sha256=G0oSkONgEP7o6kl9bnfns4fakCZT3CMVIesWPeLMmHc,4282
56
+ devtorch_core/metrics/credibility.py,sha256=uhD6LEV1LCEq-ZPe_s8BzpyZabUD_Vu1p-xk4K_XnZk,11465
57
+ devtorch_core/metrics/dhs.py,sha256=-HXLNB1-dElw1iid-0IqyUKqtKqfllS4BTGUNP0KpDg,4026
58
+ devtorch_core/metrics/mcs.py,sha256=OE_rsXxgvSa1ERbwgyWapHx0EYLkEgEx_FvWwQZ3Hmg,2777
59
+ devtorch_core/metrics/roi.py,sha256=iQ1OD0iDMx-ScQhKbqlI2UkJb-0HoH2-gpdCGRL21LU,2731
60
+ devtorch_core/metrics/session_writer.py,sha256=NLR1P2fKNNqXSN5GgYrfQm5xJ9UYuEWdkf9A8IL0VnA,2230
61
+ devtorch_core/metrics/shadow_ai.py,sha256=KsZAxtgvFEijhN4MyWvABP0NwgIFZZx9Ts-I5Zl87-0,3810
62
+ devtorch_core/metrics/sprint_writer.py,sha256=jjsdGjZPexevtOefPVPOOpP-1HJkb_2AAnq4XkzmgxQ,2719
63
+ devtorch_core/observability/__init__.py,sha256=EU8IryEfMLpOMGou1jnsUvdwxTtarfXfgbO1veA_ng4,1057
64
+ devtorch_core/observability/formatter.py,sha256=gLjJnLWVJtToKbZcTqIMHCJttI5d9Zgkt7e5XllBwz8,4064
65
+ devtorch_core/observability/report.py,sha256=PFJC9bzI-YajEbg3zvNn7_9YrwEhbGz4P2DWstjWqXA,9862
66
+ devtorch_core/observability/webhook.py,sha256=U_w8nU7h3_VnQfZnTwmpS3QbakuMDYZnmaxidNHci1A,7624
67
+ devtorch_core/parser/__init__.py,sha256=_6KKK43B9jOvKEHwTLbkfH8QHfzorb01-hIg8nu7yLI,973
68
+ devtorch_core/parser/blocks.py,sha256=vHAkwT8PG-MR4TJkgKHGDGzhpNnwuIlE1g74bua21E4,6317
69
+ devtorch_core/parser/inference.py,sha256=m1V3PXjcUTX15v5x0Qxaj4JLG4SUI1cD5Z5CyDBW0XU,5866
70
+ devtorch_core/parser/thinking.py,sha256=Sw5t3gTj5XAGBE7VHfzzteHW9ZE96b1H9AISf0-vqI4,3668
71
+ devtorch_core/proxy/__init__.py,sha256=C1xY53vwYnOQe4D2v6yRMo6womoup8spsC1isz-s7UM,200
72
+ devtorch_core/proxy/server.py,sha256=Eyn7NC6HnMiW73e03mQDYp3M0s9bgaBfMNbkBn4P4HA,10065
73
+ devtorch_core/proxy/routes/__init__.py,sha256=EGhvMcRl676cZPylfRO0i1XvxhWJqFQ-WyuhDBzsdKM,29
74
+ devtorch_core/proxy/routes/anthropic.py,sha256=ahBwQ8xMzfoIK3IA0NrbjNlaBue1Pp00teUsW_Kh1fM,10326
75
+ devtorch_core/proxy/routes/gemini.py,sha256=DofZ_gLazewjHhoFYLBB0bHxHkAoP6lUfIXSOSjQcJM,12473
76
+ devtorch_core/proxy/routes/openai.py,sha256=4MP5hHCLsjLDxOn4ktV7PFXT0ZlFMFMh4iG57y8ro5g,11154
77
+ devtorch_core/rep_network/__init__.py,sha256=kTCYOX5HjSpmBZB9ULbbXtTLpUPdtkI7RQaH3DQKjT4,480
78
+ devtorch_core/rep_network/node.py,sha256=cLzqgEgROl-FkFBF3vURRgMdvsaJhOK0JC8p5Hj2VLU,4509
79
+ devtorch_core/rep_network/server.py,sha256=leGXXngbnvAaXumNRrp3voLv0mHQ7OYI416NuwVYNP8,4336
80
+ devtorch_core/rep_network/sync.py,sha256=wVvkbU-gPngH3q5f0K52ImGfF67EbChkjSc58wt48us,6766
81
+ devtorch_core/wrapper/__init__.py,sha256=5cRLjCd5IN4E9lpDe0qGyQLQ1z-mLh3if5-dMx2okOs,1495
82
+ devtorch_core/wrapper/anthropic.py,sha256=_iH3kUYMD9wPn85vKFpQ_oaspbB5gh73y8I_pjyzzgY,11106
83
+ devtorch_core/wrapper/base.py,sha256=_i2lP4WaX5dbZRt-9Q0nu0RKBM5M0hYYmfypkr6Y8OA,10868
84
+ devtorch_core/wrapper/bedrock.py,sha256=RnI3wfGMavYNSyQbzU1udQUl7olUYJp5mD2PtmYiloA,7953
85
+ devtorch_core/wrapper/gemini.py,sha256=533dlIhk-9bz5eQPIO9hHEtzhZLpnei7pYJQpxKRbv0,9578
86
+ devtorch_core/wrapper/ollama.py,sha256=YHTtaNUlv8lv9v4BInJro6wHu2WMR9gZ6l1KLmcyjCs,14538
87
+ devtorch_core/wrapper/openai.py,sha256=slhi3dx0xgY3gT1yIGEeXDDnjKV8tf7fTlLmBi1MX9o,10170
88
+ tests/test_s0_gcc.py,sha256=KvjLSNLsLcBsUUZ_d_QHM50NpyT_s2JKHAfPqwL7VwM,4259
89
+ tests/test_s11_codex.py,sha256=9sD8O_X5FYPj1cg1KB3tsPr90uIE82RHHuX_zsuVhpY,14312
90
+ tests/test_s11_hooks_installer.py,sha256=vOCfg8W91mXwr-wv7FQTCKd2T35QuwpXCe-RALNyo-U,12608
91
+ tests/test_s12_github.py,sha256=SkZO7l33Rypo10dZBHelZ2vx8w3dBG15ir5XmD44AB4,14397
92
+ tests/test_s13_dashboard_api.py,sha256=nRagQPufqikKxGbAHTrgxW16SqnzhfD_xpPxm3DU3IQ,12789
93
+ tests/test_s13_forensic.py,sha256=DRdycTj6Ak-GgV6TpLuqvTFOmwH5OzuVazRP-XhJfjI,17056
94
+ tests/test_s14_audit_export.py,sha256=h-TTuV-JwYBq_DRO-QF4bB5yS09JIVxqqajbVHFBask,11214
95
+ tests/test_s14_ciso_api.py,sha256=SJZCp5JK275YimLb-xKVyR2KzbkbU9ttrmC8aS9Trf0,11655
96
+ tests/test_s15_rep_network.py,sha256=LHpOhErnWlAgRYgkwy6qBWz77ahad0LZ-QFx0YQn5l0,26358
97
+ tests/test_s16_alerts.py,sha256=rEuk5zUuTAxQJs3nWS0DoupzaRVK8OcjEBYLS3E3BNs,15156
98
+ tests/test_s17a_metrics.py,sha256=30akmyQXOvnZvmzac3klGx3lfkVfPyorHM983cIQmyU,26470
99
+ tests/test_s17b_observability.py,sha256=z7K7D75PnhaLGUpiecgDC4hI_EyOHfYChKow8E_e83o,18608
100
+ tests/test_s18_credibility.py,sha256=c1b8rGzuQVMyBZlN1Z89xqR7eZI_NVORlMsrsBGEnow,7565
101
+ tests/test_s1_branch_merge.py,sha256=rUfXudDy490lunsdHBmKrr1kyVSnsyMklnNLfmUs9Sg,5151
102
+ tests/test_s2_context.py,sha256=0bz1Q7YPyTit1hi1twb0azNt0Sgc9rLJxVWNXmzhJYc,2801
103
+ tests/test_s3_sensitivity.py,sha256=o-9yyeyO7dLa1eK6tJhtowE7GySdSCdo07Qc8xC_S_w,40187
104
+ tests/test_s4_invariants.py,sha256=d4lCH5V_v_8npjoe40-aqTkBV9GAF5g1tVS1M05ssjg,5007
105
+ tests/test_s4_variance_lock.py,sha256=mxvmxXZ-IZHyf-K8Hy-92ZTv5a5iXvJ3Btc7l-Qa9eU,8059
106
+ tests/test_s5_privacy_disclosure.py,sha256=-DniAATKT5rn-3fxlKMbEFfDpdqGXN1Q2pOEPT3578E,3073
107
+ tests/test_s5_rep_sis.py,sha256=PMAoW6VCWFguTBeuTrFslguJUHhcQccLTbtgaZ8gKL8,3585
108
+ tests/test_s6_debug.py,sha256=KlN4VeI6PjHKGm0YRztdM5IWHa8KrrjFQ0kURzroTNA,3568
109
+ tests/test_s7_mcp_hooks.py,sha256=HtjcnaEa5ciMW33L7EuzIJsHO9pDO9FZP-dD7KnBnKc,23591
110
+ tests/test_s7_ollama_wrapper.py,sha256=geurc5c_ISSHY27daDs6H6erdFHpLXgyHPKxYHvcSuU,29101
111
+ tests/test_s7_parser.py,sha256=Ul2lPbmARa2naQ905zHC7ybLf5HToLZllsxxeh2mIpk,20476
112
+ tests/test_s7_proxy.py,sha256=WWoCr3EjU-a6JIh3Pzy567MPufn5U-B4zuU3qqINTJk,23407
113
+ tests/test_s7_wrappers.py,sha256=h5ja3ZFx1xiLNSR9AfOvosEOLfUcenEQn7LzBKAg5IM,34483
114
+ tests/test_s7ent_gateway.py,sha256=RTQ_YgF1aEp_SwX2jXVbJgt-VrU8gc8cJXBLkHJGtvc,21469
115
+ tests/test_s8_aggphi.py,sha256=XOw16guJWQb13ut-4gNQfkii6ABpjYX12uAN5ncRjYA,7774
116
+ tests/test_s8_theta_synthesis.py,sha256=JO6cTL1fVNaK64F6cadygj1xwc-8RSv4QSIZXIdV-wc,17281
117
+ tests/test_s9_gaps.py,sha256=MyckxbCiaUzUpshD4vbUJ5LQ7WMFQz1sBH9N0QBT69Y,5989
118
+ tests/test_setup_command.py,sha256=hM91pEfjesqsitwkjAIKUJ3IwIhJbNgPjovXbR0dMTY,11878
119
+ agentorch-0.1.0.dist-info/METADATA,sha256=zNw_FmNOZI_gTBnLvAi4RINHP9TbVYuhrVmUJycyZIc,12954
120
+ agentorch-0.1.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
121
+ agentorch-0.1.0.dist-info/entry_points.txt,sha256=iimCDbtjqjoEbpySI9sfLJAsZmPkz2_nHtWoHFgMvIk,52
122
+ agentorch-0.1.0.dist-info/top_level.txt,sha256=AxVbm0bWbTEB_zgDJ_saeA_thWDthh7qjaUEu9_pFZU,44
123
+ agentorch-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ devtorch = devtorch_cli.main:main
@@ -0,0 +1,4 @@
1
+ benchmarks
2
+ devtorch_cli
3
+ devtorch_core
4
+ tests
@@ -0,0 +1,139 @@
1
+ """
2
+ Hidden Profile Benchmark — Baseline runner (no DevTorch coordination).
3
+
4
+ Each agent receives only its own private_info. No theta reads, no sensitivity
5
+ sharing. Agents produce decisions in isolation. Results written to
6
+ results/baseline/<scenario_id>/<agent_id>.json.
7
+
8
+ Usage:
9
+ python benchmarks/hidden_profile/run_baseline.py
10
+ python benchmarks/hidden_profile/run_baseline.py --scenario banking_api
11
+ """
12
+ from __future__ import annotations
13
+
14
+ import argparse
15
+ import json
16
+ import sys
17
+ from pathlib import Path
18
+
19
+ import yaml
20
+
21
+ PROBLEMS_DIR = Path(__file__).parent / "problems"
22
+ RESULTS_DIR = Path(__file__).parent / "results" / "baseline"
23
+
24
+
25
+ # ---------------------------------------------------------------------------
26
+ # Deterministic agent — makes decisions from private_info only
27
+ # ---------------------------------------------------------------------------
28
+
29
+ def agent_decide(agent: dict, scenario: dict, shared_theta: dict | None = None) -> dict:
30
+ """
31
+ Deterministic decision function.
32
+
33
+ In the baseline, shared_theta is always None — agents have no visibility
34
+ into what other agents know.
35
+
36
+ Returns a decision dict:
37
+ {
38
+ "agent_id": str,
39
+ "constraints_included": [constraint_id, ...],
40
+ "decision_text": str,
41
+ "used_theta": bool,
42
+ }
43
+ """
44
+ constraints_included = [c["constraint_id"] for c in agent["private_info"]]
45
+
46
+ if shared_theta:
47
+ # DevTorch path: extend decisions based on theta signals
48
+ for concept, data in shared_theta.items():
49
+ if data.get("mean_confidence", 0) >= 0.6:
50
+ # A peer flagged something relevant — include it if it maps
51
+ # to a constraint in the scenario we haven't already covered
52
+ for req in scenario["required_constraints"]:
53
+ if req not in constraints_included:
54
+ # Check if the theta concept overlaps with this constraint's concept
55
+ for a in scenario["agents"]:
56
+ for pi in a["private_info"]:
57
+ if (pi["constraint_id"] == req and
58
+ concept in pi.get("affects", [])):
59
+ constraints_included.append(req)
60
+
61
+ decision_text_parts = [f"Agent: {agent['id']} ({agent['role']})"]
62
+ for c in agent["private_info"]:
63
+ decision_text_parts.append(f" Constraint enforced: {c['constraint_id']}")
64
+ decision_text_parts.append(f" {c['description'][:120]}...")
65
+
66
+ if shared_theta:
67
+ decision_text_parts.append(f" Theta signals read: {list(shared_theta.keys())}")
68
+
69
+ return {
70
+ "agent_id": agent["id"],
71
+ "constraints_included": constraints_included,
72
+ "decision_text": "\n".join(decision_text_parts),
73
+ "used_theta": shared_theta is not None,
74
+ }
75
+
76
+
77
+ # ---------------------------------------------------------------------------
78
+ # Run one scenario
79
+ # ---------------------------------------------------------------------------
80
+
81
+ def run_scenario(scenario_path: Path) -> dict:
82
+ """Run all agents in isolation. Returns per-agent decision dicts."""
83
+ with open(scenario_path) as f:
84
+ scenario = yaml.safe_load(f)
85
+
86
+ scenario_id = scenario["id"]
87
+ out_dir = RESULTS_DIR / scenario_id
88
+ out_dir.mkdir(parents=True, exist_ok=True)
89
+
90
+ decisions = []
91
+ for agent in scenario["agents"]:
92
+ decision = agent_decide(agent, scenario, shared_theta=None)
93
+ decisions.append(decision)
94
+
95
+ out_file = out_dir / f"{agent['id']}.json"
96
+ out_file.write_text(json.dumps(decision, indent=2))
97
+
98
+ # Write scenario manifest
99
+ manifest = {
100
+ "scenario_id": scenario_id,
101
+ "condition": "baseline",
102
+ "agent_ids": [a["id"] for a in scenario["agents"]],
103
+ "required_constraints": scenario["required_constraints"],
104
+ }
105
+ (out_dir / "_manifest.json").write_text(json.dumps(manifest, indent=2))
106
+
107
+ print(f" [baseline] {scenario_id}: {len(decisions)} agents wrote decisions")
108
+ return {"scenario_id": scenario_id, "decisions": decisions, "scenario": scenario}
109
+
110
+
111
+ # ---------------------------------------------------------------------------
112
+ # Main
113
+ # ---------------------------------------------------------------------------
114
+
115
+ def main() -> None:
116
+ parser = argparse.ArgumentParser(description="Hidden Profile baseline runner")
117
+ parser.add_argument("--scenario", help="Run only this scenario ID (default: all)")
118
+ args = parser.parse_args()
119
+
120
+ problem_files = sorted(PROBLEMS_DIR.glob("*.yaml"))
121
+ if not problem_files:
122
+ print(f"No scenario files found in {PROBLEMS_DIR}", file=sys.stderr)
123
+ sys.exit(1)
124
+
125
+ if args.scenario:
126
+ problem_files = [p for p in problem_files if args.scenario in p.stem]
127
+ if not problem_files:
128
+ print(f"No scenario matching '{args.scenario}' found", file=sys.stderr)
129
+ sys.exit(1)
130
+
131
+ print(f"Running baseline (no coordination) — {len(problem_files)} scenario(s)")
132
+ for path in problem_files:
133
+ run_scenario(path)
134
+
135
+ print(f"\nBaseline results written to: {RESULTS_DIR}")
136
+
137
+
138
+ if __name__ == "__main__":
139
+ main()