e2er 0.3.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 (135) hide show
  1. e2er-0.3.0.dist-info/METADATA +502 -0
  2. e2er-0.3.0.dist-info/RECORD +135 -0
  3. e2er-0.3.0.dist-info/WHEEL +5 -0
  4. e2er-0.3.0.dist-info/entry_points.txt +2 -0
  5. e2er-0.3.0.dist-info/licenses/LICENSE +21 -0
  6. e2er-0.3.0.dist-info/top_level.txt +2 -0
  7. skills/__init__.py +0 -0
  8. skills/files/__init__.py +0 -0
  9. skills/files/base/__init__.py +0 -0
  10. skills/files/base/economist.md +22 -0
  11. skills/files/base/researcher.md +23 -0
  12. skills/files/causal-inference/__init__.py +0 -0
  13. skills/files/causal-inference/judge-designs.md +189 -0
  14. skills/files/causal-inference/natural-experiments.md +42 -0
  15. skills/files/causal-inference/sensitivity.md +200 -0
  16. skills/files/causal-inference/shift-share.md +143 -0
  17. skills/files/causal-inference/weak-instruments.md +162 -0
  18. skills/files/data/__init__.py +0 -0
  19. skills/files/data/allium-cli.md +143 -0
  20. skills/files/data/allium-developer-api.md +149 -0
  21. skills/files/data/blockchain.md +45 -0
  22. skills/files/data/byod.md +45 -0
  23. skills/files/data/cleaning.md +263 -0
  24. skills/files/data/crypto-defi.md +173 -0
  25. skills/files/data/figure-spec.md +121 -0
  26. skills/files/data/visualization.md +254 -0
  27. skills/files/econometrics/__init__.py +0 -0
  28. skills/files/econometrics/did.md +40 -0
  29. skills/files/econometrics/event-study.md +239 -0
  30. skills/files/econometrics/iv-estimation.md +121 -0
  31. skills/files/econometrics/panel-data.md +158 -0
  32. skills/files/econometrics/rdd.md +146 -0
  33. skills/files/econometrics/time-series.md +307 -0
  34. skills/files/latex/__init__.py +0 -0
  35. skills/files/latex/bibtex.md +502 -0
  36. skills/files/latex/econ-model.md +341 -0
  37. skills/files/latex/tables.md +368 -0
  38. skills/files/math/__init__.py +0 -0
  39. skills/files/math/optimization-verification.md +310 -0
  40. skills/files/math/proof-strategies.md +224 -0
  41. skills/files/modeling/__init__.py +0 -0
  42. skills/files/modeling/asset-pricing.md +274 -0
  43. skills/files/modeling/game-theory.md +103 -0
  44. skills/files/modeling/market-microstructure.md +239 -0
  45. skills/files/reasoning/__init__.py +0 -0
  46. skills/files/reasoning/anti-slop.md +37 -0
  47. skills/files/reasoning/argument-audit.md +161 -0
  48. skills/files/reasoning/creative-ideation.md +95 -0
  49. skills/files/reasoning/identification.md +36 -0
  50. skills/files/reasoning/novelty.md +147 -0
  51. skills/files/review/__init__.py +0 -0
  52. skills/files/review/consistency-check.md +169 -0
  53. skills/files/review/constructive-feedback.md +166 -0
  54. skills/files/review/data-quality.md +178 -0
  55. skills/files/review/referee-simulation.md +77 -0
  56. skills/files/review/reference-check.md +65 -0
  57. skills/files/review/technical-review.md +177 -0
  58. skills/files/review/writing-quality.md +181 -0
  59. skills/files/synthesis/__init__.py +0 -0
  60. skills/files/synthesis/context-builder.md +45 -0
  61. skills/files/synthesis/deliverables.md +71 -0
  62. skills/files/synthesis/replication-package.md +89 -0
  63. skills/files/writing/__init__.py +0 -0
  64. skills/files/writing/abstract.md +113 -0
  65. skills/files/writing/discussion.md +100 -0
  66. skills/files/writing/paper-structure.md +49 -0
  67. skills/files/writing/personal-style.md +149 -0
  68. skills/files/writing/revision.md +132 -0
  69. src/__init__.py +6 -0
  70. src/__main__.py +69 -0
  71. src/api/__init__.py +0 -0
  72. src/api/app.py +1036 -0
  73. src/cli_install_skills.py +107 -0
  74. src/config.py +144 -0
  75. src/core/__init__.py +0 -0
  76. src/core/pipeline/__init__.py +0 -0
  77. src/core/pipeline/state.py +59 -0
  78. src/core/renderer/__init__.py +0 -0
  79. src/core/renderer/compiler.py +74 -0
  80. src/core/renderer/prose.py +44 -0
  81. src/core/renderer/templates.py +148 -0
  82. src/core/specialists/__init__.py +0 -0
  83. src/core/specialists/base.py +385 -0
  84. src/core/specialists/contracts.py +45 -0
  85. src/core/specialists/dispatcher.py +229 -0
  86. src/core/specialists/registry.py +118 -0
  87. src/core/strategist/__init__.py +0 -0
  88. src/core/strategist/actions.py +72 -0
  89. src/core/strategist/context.py +187 -0
  90. src/core/strategist/engine.py +357 -0
  91. src/core/strategist/review_aggregator.py +203 -0
  92. src/core/strategist/runner.py +761 -0
  93. src/core/strategist/state.py +164 -0
  94. src/db/__init__.py +0 -0
  95. src/db/client.py +62 -0
  96. src/db/events.py +74 -0
  97. src/logging_config.py +23 -0
  98. src/modules/__init__.py +0 -0
  99. src/modules/data/__init__.py +1 -0
  100. src/modules/data/allium.py +379 -0
  101. src/modules/data/allium_developer.py +336 -0
  102. src/modules/data/audit.py +186 -0
  103. src/modules/data/cli.py +516 -0
  104. src/modules/data/dictionary.py +42 -0
  105. src/modules/data/guardrails.py +159 -0
  106. src/modules/data/tools.py +275 -0
  107. src/modules/fetch/__init__.py +1 -0
  108. src/modules/fetch/http.py +78 -0
  109. src/modules/github/__init__.py +1 -0
  110. src/modules/github/client.py +177 -0
  111. src/modules/github/push.py +82 -0
  112. src/modules/github/templates.py +85 -0
  113. src/modules/literature/__init__.py +1 -0
  114. src/modules/literature/arxiv.py +72 -0
  115. src/modules/literature/bibtex.py +81 -0
  116. src/modules/literature/models.py +54 -0
  117. src/modules/literature/openalex.py +98 -0
  118. src/modules/literature/semantic_scholar.py +68 -0
  119. src/modules/literature/storage.py +124 -0
  120. src/modules/literature/tools.py +276 -0
  121. src/modules/llm/__init__.py +1 -0
  122. src/modules/llm/anthropic.py +168 -0
  123. src/modules/llm/base.py +124 -0
  124. src/modules/llm/claude_code.py +407 -0
  125. src/modules/llm/codex.py +211 -0
  126. src/modules/llm/gemini.py +225 -0
  127. src/modules/llm/openrouter.py +198 -0
  128. src/modules/llm/registry.py +31 -0
  129. src/modules/llm/tools.py +123 -0
  130. src/modules/security.py +41 -0
  131. src/modules/tracking/__init__.py +1 -0
  132. src/modules/tracking/costs.py +44 -0
  133. src/modules/tracking/usage.py +172 -0
  134. src/skills/__init__.py +0 -0
  135. src/skills/loader.py +81 -0
@@ -0,0 +1,502 @@
1
+ Metadata-Version: 2.4
2
+ Name: e2er
3
+ Version: 0.3.0
4
+ Summary: End-to-End Researcher — automated research pipeline for economics, finance, and IS
5
+ License: MIT
6
+ Requires-Python: >=3.11
7
+ Description-Content-Type: text/markdown
8
+ License-File: LICENSE
9
+ Requires-Dist: anthropic>=0.40.0
10
+ Requires-Dist: openai>=1.50.0
11
+ Requires-Dist: httpx>=0.27.0
12
+ Requires-Dist: fastapi>=0.115.0
13
+ Requires-Dist: uvicorn[standard]>=0.30.0
14
+ Requires-Dist: pydantic>=2.9.0
15
+ Requires-Dist: pydantic-settings>=2.6.0
16
+ Requires-Dist: psycopg[binary,pool]>=3.2.0
17
+ Requires-Dist: PyGithub>=2.4.0
18
+ Requires-Dist: gitpython>=3.1.0
19
+ Requires-Dist: pyalex>=0.14
20
+ Requires-Dist: arxiv>=2.1.0
21
+ Requires-Dist: bibtexparser>=2.0.0b7
22
+ Requires-Dist: pandas>=2.0
23
+ Requires-Dist: numpy>=1.26
24
+ Requires-Dist: matplotlib>=3.8
25
+ Requires-Dist: python-dotenv>=1.0
26
+ Requires-Dist: python-multipart>=0.0.12
27
+ Requires-Dist: jinja2>=3.1.0
28
+ Provides-Extra: pgvector
29
+ Requires-Dist: pgvector>=0.3.0; extra == "pgvector"
30
+ Requires-Dist: sentence-transformers>=3.3.0; extra == "pgvector"
31
+ Provides-Extra: dev
32
+ Requires-Dist: pytest>=8.0; extra == "dev"
33
+ Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
34
+ Requires-Dist: pytest-cov>=5.0; extra == "dev"
35
+ Requires-Dist: ruff>=0.6; extra == "dev"
36
+ Requires-Dist: mypy>=1.11; extra == "dev"
37
+ Requires-Dist: respx>=0.21; extra == "dev"
38
+ Dynamic: license-file
39
+
40
+ # E2ER v3: End-to-End Researcher
41
+
42
+ [![Status](https://img.shields.io/badge/status-active%20development-blue)]()
43
+ [![License](https://img.shields.io/badge/license-MIT-green)](LICENSE)
44
+ [![Python](https://img.shields.io/badge/python-3.11%2B-blue)]()
45
+ [![Tests](https://github.com/bhanneke/E2ER-project/actions/workflows/tests.yml/badge.svg)](https://github.com/bhanneke/E2ER-project/actions/workflows/tests.yml)
46
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.20187239.svg)](https://doi.org/10.5281/zenodo.20187239)
47
+
48
+ **E2ER** is an open-source pipeline for producing peer-review-quality empirical research papers in information systems, economics, and finance. The researcher provides a research question and data access; the pipeline handles the rest: study design, data acquisition, econometric estimation, writing, review, and replication packaging.
49
+
50
+ > **Scope**: E2ER supports three methodologies, selectable per paper at creation time:
51
+ > - **`empirical`** (default) — data-driven, runs identification + econometrics specialists
52
+ > - **`theoretical`** — formal model + hypotheses, no data specialists
53
+ > - **`mixed`** — formal model AND empirical test
54
+ >
55
+ > Pick the methodology that matches your paper's argument structure. Most users want `empirical`; theoretical mode is for pure-model papers (no data, just propositions and proofs).
56
+
57
+ ---
58
+
59
+ ## What the system produces
60
+
61
+ For each paper, E2ER produces:
62
+
63
+ | Artifact | Description |
64
+ |----------|-------------|
65
+ | `paper_plan.md` | Research design, propositions, identification strategy |
66
+ | `literature_review.md` | Related work synthesis with citations |
67
+ | `identification_strategy.md` | Causal identification argument and threats |
68
+ | `econometric_spec.md` | Econometric specification with equations |
69
+ | `data_dictionary.json` | Pre-specified minimal data footprint (fields, time filter, granularity) |
70
+ | `paper_draft.tex` | Full LaTeX manuscript |
71
+ | `abstract.tex` | Standalone abstract |
72
+ | `self_attack_report.json` | Adversarial flaw-finding report with severity scores |
73
+ | `review_*.md` | Structured reviews from 6 specialist reviewers |
74
+ | `review_aggregation.json` | Mechanical aggregation verdict and scores |
75
+ | `replication/estimation.py` | Main econometric estimation code |
76
+ | `replication/data_queries.sql` | All data queries used in the paper |
77
+ | `replication/audit_log.csv` | Complete data access audit trail |
78
+
79
+ All artifacts are committed to a dedicated GitHub repository for the paper, structured for direct import into Overleaf.
80
+
81
+ ---
82
+
83
+ ## Pipeline stages
84
+
85
+ ```
86
+ [Researcher input: RQ + optional BibTeX + optional data]
87
+ |
88
+ v
89
+ 1. Study Design idea_developer, literature_scanner, identification_strategist
90
+ 2. Data data_architect -> Allium queries -> human approval -> data_analyst
91
+ 3. Estimation econometrics_specialist
92
+ 4. Writing section_writer, abstract_writer, latex_formatter
93
+ |
94
+ v (iterative mode only)
95
+ 5. Ceiling Check Strategist assesses whether further iteration adds value
96
+ 6. Self-Attack Adversarial specialist finds critical flaws (severity 1-10)
97
+ 7. Polish 5 parallel specialists: formula, numerics, institutions, bibliography, equilibria
98
+ |
99
+ v
100
+ 8. Review 6 parallel reviewers: mechanism, technical, identification,
101
+ literature, data, writing
102
+ 9. Aggregation 3-rule mechanical verdict (see below)
103
+ 10. Revision Revisor specialist addresses feedback (if MAJOR_REVISION verdict)
104
+ 11. Replication Packages all queries, code, and audit trail
105
+ 12. GitHub Push LaTeX + replication package committed to paper repo
106
+ ```
107
+
108
+ ---
109
+
110
+ ## Review aggregation
111
+
112
+ Reviews are aggregated by three deterministic rules applied in order:
113
+
114
+ | Rule | Condition | Verdict |
115
+ |------|-----------|---------|
116
+ | 1 | Mechanism reviewer score < 5 | `MECHANISM_FAIL`: fundamental revision required |
117
+ | 2 | Any reviewer score < 4 | `HARD_REJECT`: floor violation |
118
+ | 3 | Weighted average (technical x 1.5, identification x 1.5, data x 1.25) | `ACCEPT` / `MINOR_REVISION` / `MAJOR_REVISION` / `HARD_REJECT` |
119
+
120
+ ---
121
+
122
+ ## Data access: Allium
123
+
124
+ > **The data module is optional.** Most users won't have an Allium key, and that's fine. Set `DATA_MODULE_ENABLED=false` in `.env` to run literature-only papers, or supply your own data files in the workspace. Allium is only required for blockchain/DeFi empirical work.
125
+
126
+ The data module uses [Allium](https://allium.so) for indexed blockchain data. Set `ALLIUM_API_KEY` in `.env` to enable it.
127
+
128
+ Every query passes through 5 guardrails before execution:
129
+
130
+ 1. No `SELECT *`: all fields must be listed explicitly
131
+ 2. All requested fields must be declared in the paper's `data_dictionary.json`
132
+ 3. A time-bound `WHERE` clause is required on every query
133
+ 4. Transaction-level granularity requires written justification
134
+ 5. Production queries require a prior approved feasibility run on the same table
135
+
136
+ **Two-phase workflow:**
137
+ - **Feasibility** (1000-row sample): auto-approved, executes immediately
138
+ - **Production** (full dataset): queued for researcher approval at `GET /api/papers/{id}/pending-queries`
139
+
140
+ We gratefully acknowledge **[Allium](https://allium.so)** for supporting this research through data access and technical collaboration.
141
+
142
+ ---
143
+
144
+ ## Literature: bring your own BibTeX
145
+
146
+ E2ER does **not** automatically retrieve papers from the internet. The recommended approach is to supply a `.bib` file of your own curated references.
147
+
148
+ Set `LITERATURE_BIBTEX_FILE=/path/to/refs.bib` in your `.env`. When set, the pipeline:
149
+
150
+ 1. Parses all entries at startup (requires `bibtexparser` — included in `pip install -e .`)
151
+ 2. Injects a compact reference list into the prompts of: `literature_scanner`, `paper_drafter`, `section_writer`, `abstract_writer`, and `revisor`
152
+ 3. Copies the `.bib` file into the workspace so LaTeX can compile with `\bibliography{refs}`
153
+
154
+ A typical BibTeX workflow:
155
+
156
+ ```bash
157
+ # Export your references from Zotero / Mendeley as refs.bib
158
+ # Add to .env:
159
+ LITERATURE_BIBTEX_FILE=/home/researcher/my-project/refs.bib
160
+ ```
161
+
162
+ The `literature_scanner` specialist will synthesise the provided references and flag gaps where additional literature search is needed. The `paper_drafter` will use `\cite{}` commands aligned with the BibTeX keys in your file.
163
+
164
+ > **Planned extension**: Open-access paper fetching via OpenAlex, Semantic Scholar, and arXiv is implemented in `src/modules/literature/` but not yet wired into the pipeline. Contributions welcome — see `skills/CONTRIBUTING_SKILLS.md` for the extension pattern.
165
+
166
+ ---
167
+
168
+ ## Quick start
169
+
170
+ ```bash
171
+ git clone https://github.com/bhanneke/E2ER-project.git
172
+ cd E2ER-project
173
+ ./scripts/quickstart.sh # prompts for ANTHROPIC_API_KEY, builds + starts everything
174
+ ```
175
+
176
+ The script copies `.env.example` to `.env`, prompts once for your Anthropic API key, runs `docker compose up --build`, and opens the dashboard at <http://localhost:8280/>. Migrations run automatically on first start. Total time-to-first-paper: typically under 5 minutes for the build step plus your run time.
177
+
178
+ > **Costs:** a typical `single_pass` paper runs ~$0.50 on Haiku or $3–8 on Sonnet; `iterative` runs $15–25 on Sonnet and is hard-capped at $25 by default. See [Expected cost per paper](#expected-cost-per-paper) below.
179
+
180
+ ### Verify your install
181
+
182
+ Before configuring an API key, confirm the pipeline runs end-to-end with mocks:
183
+
184
+ ```bash
185
+ make install # pip install -e ".[dev]"
186
+ make smoke # full mocked test suite — no API key needed, ~15s
187
+ ```
188
+
189
+ If `make smoke` reports `176 passed`, your install is good and the orchestration works.
190
+
191
+ **Want to see what the pipeline actually produces?** The repo ships with worked examples — real artifacts from real runs:
192
+
193
+ - [`examples/e2er_v3_haiku_smoke/`](examples/e2er_v3_haiku_smoke/) — single-pass paper run on Haiku 4.5 (~$1.50, ~11 minutes), data module disabled
194
+ - [`examples/starter_theoretical/`](examples/starter_theoretical/) — minimal theoretical paper template you can copy as a starting point
195
+ - [`examples/e2er_v1_nft_seasonality/`](examples/e2er_v1_nft_seasonality/) and [`e2er_v1_bitcoin_institutionalization/`](examples/e2er_v1_bitcoin_institutionalization/) — full v1 papers, including final PDFs
196
+
197
+ To run a real $0.50 end-to-end test on Claude Haiku (requires `ANTHROPIC_API_KEY`):
198
+
199
+ ```bash
200
+ ANTHROPIC_API_KEY=sk-ant-... make smoke-paid
201
+ ```
202
+
203
+ ### Dashboard
204
+
205
+ Once running, the dashboard at `http://localhost:8280/` lets you:
206
+
207
+ - **Start a paper** — title, research question, mode (single_pass / iterative), per-paper cost cap.
208
+ - **Watch progress live** — status badge, cost meter (spent / cap), event log polled every 3 seconds.
209
+ - **Cancel** — one click during any phase; the runner saves state and marks the paper `cancelled`.
210
+ - **Download artifacts** — every workspace file and a one-click **audit bundle** (`.tar.gz` containing `replication/`, `audit_log.csv`, `data_queries.sql`, `manifest.json`, `contributions.json`, `events.json`, `usage.json`).
211
+
212
+ ### Expected cost per paper
213
+
214
+ Costs vary with research-question complexity, mode, and model. Rough order of magnitude on current Anthropic pricing:
215
+
216
+ | Mode | Model | Typical cost | Notes |
217
+ |------|-------|-------------|-------|
218
+ | `single_pass` | Claude Haiku 4.5 | **~$0.50** | Fast draft. Used by `make smoke-paid`. |
219
+ | `single_pass` | Claude Sonnet 4.6 | **$3 – $8** | Better depth, still one shot. |
220
+ | `iterative` | Claude Sonnet 4.6 | **$15 – $25** | Full loop with ceiling check, self-attack, polish stack, review, revision. Hits the default $25 cap on complex RQs. |
221
+
222
+ Iterative on Opus or with the data module enabled (Allium production queries cost extra) can run higher.
223
+
224
+ ### Cost safety
225
+
226
+ Every paper has a hard cost cap (default $25; configurable per paper at creation time, or via `DEFAULT_MAX_COST_USD` in `.env`). The pipeline checks cumulative cost at every phase boundary; when the cap is reached the run aborts with `last_error = "Budget exceeded after $X.XX"` and the paper is marked `failed`. The cap protects you from runaway costs even if a specialist enters a tool-call loop.
227
+
228
+ ### Programmatic API
229
+
230
+ If you prefer the HTTP API to the dashboard:
231
+
232
+ ```bash
233
+ # Create a paper
234
+ curl -X POST http://localhost:8280/api/papers \
235
+ -H "Content-Type: application/json" \
236
+ -d '{
237
+ "title": "DeFi Liquidity Provision and Market Quality",
238
+ "research_question": "How does concentrated liquidity in Uniswap v3 affect price discovery?",
239
+ "mode": "iterative",
240
+ "methodology": "empirical",
241
+ "max_cost_usd": 30.0
242
+ }'
243
+ # Returns: {"paper_id": "<uuid>", "status": "idea", ...}
244
+
245
+ # Cancel
246
+ curl -X POST http://localhost:8280/api/papers/<paper_id>/cancel
247
+
248
+ # Download audit bundle
249
+ curl -O -J http://localhost:8280/api/papers/<paper_id>/audit-bundle
250
+
251
+ # Approve pending data queries (when the data module submits production queries)
252
+ curl http://localhost:8280/api/papers/<paper_id>/pending-queries
253
+ curl -X POST http://localhost:8280/api/queries/<query_id>/approve \
254
+ -H "Content-Type: application/json" \
255
+ -d '{"approved": true, "note": "Looks good"}'
256
+ ```
257
+
258
+ ### Manual install (without Docker)
259
+
260
+ ```bash
261
+ pip install -e ".[pgvector]"
262
+ docker compose -f docker/docker-compose.yml up -d db # just the DB
263
+ python scripts/migrate.py
264
+ bash scripts/vendor_htmx.sh # one-time, fetches htmx
265
+ uvicorn src.api.app:app --reload --port 8280
266
+ ```
267
+
268
+ ---
269
+
270
+ ## Supported LLM providers
271
+
272
+ | Provider | Setting | Notes |
273
+ |----------|---------|-------|
274
+ | Anthropic | `LLM_BACKEND=anthropic` | Supports prompt caching (recommended) |
275
+ | OpenRouter | `LLM_BACKEND=openrouter` | 200+ models via OpenAI-compatible format |
276
+ | **Claude Code CLI** | `LLM_BACKEND=claude_code` | **$0/token under your Max plan.** Requires `npm i -g @anthropic-ai/claude-code` and an active Max subscription. The pipeline shells out to the `claude` CLI per specialist; no API key needed. Allium guardrails work in this mode via the `e2er-allium-query` bash wrapper — same 5 rules, same audit log, same approval flow. |
277
+
278
+ > Need a key? Anthropic: <https://console.anthropic.com/> (new accounts get a small free credit). OpenRouter: <https://openrouter.ai/keys> (pay-as-you-go).
279
+
280
+ ---
281
+
282
+ ## Troubleshooting
283
+
284
+ **`make smoke` fails with `ModuleNotFoundError`** — you skipped `make install`. Run `make install` (which is `pip install -e ".[dev]"`) first.
285
+
286
+ **`./scripts/quickstart.sh` fails on `docker compose up`** — Docker isn't installed or isn't running. Either start Docker Desktop, or follow the [Manual install](#manual-install-without-docker) section to run with Postgres + uvicorn directly.
287
+
288
+ **`pytest` errors with `ImportError: cannot import name 'UTC' from 'datetime'`** — your local Python is < 3.11. The project requires Python 3.11+. Use `pyenv install 3.11` or `brew install python@3.12`.
289
+
290
+ **Paper stuck in `in_progress` forever** — check `workspaces/<paper_id>/.pipeline_state.json`: the last completed phase is recorded. Then check `~/your-log-path` for the failure. To resume, hit the dashboard (the runner reads state.json and skips completed phases) or `POST /api/papers/{id}/cancel` and start fresh.
291
+
292
+ **Cost runaway concerns** — every paper has a hard `max_cost_usd` cap (default $25). The pipeline checks the cap before each phase AND before each parallel batch, then halts with `BudgetExceededError`. If a run cost more than expected, the audit bundle (`/api/papers/{id}/audit-bundle`) has the per-call breakdown.
293
+
294
+ **`Authorization` header missing on JSON POSTs** — you set `API_AUTH_TOKEN` in `.env` but didn't include `-H "Authorization: Bearer <token>"` on your curl. The HTML dashboard form is exempt — see `.env.example` for why.
295
+
296
+ **Allium API key error / data module crashes** — set `DATA_MODULE_ENABLED=false` in `.env`. The pipeline runs literature-only (or with manually uploaded data files) without Allium. See [Data access: Allium](#data-access-allium).
297
+
298
+ **Hit the OpenRouter "402 Payment Required" wall** — your OpenRouter balance hit zero. The pipeline correctly bails on this rather than looping, but you'll see the failed paper. Top up at <https://openrouter.ai/credits>.
299
+
300
+ ---
301
+
302
+ ## Architecture diagrams
303
+
304
+ An [interactive system architecture diagram](docs/architecture.html) (open in browser) is available in `docs/`.
305
+
306
+ Individual Mermaid diagrams in [`docs/diagrams/`](docs/diagrams/), rendered natively on GitHub:
307
+
308
+ | Diagram | Description |
309
+ |---------|-------------|
310
+ | [`pipeline_overview.md`](docs/diagrams/pipeline_overview.md) | Full pipeline from idea to completion |
311
+ | [`specialist_dag.md`](docs/diagrams/specialist_dag.md) | Specialist execution dependencies and parallel groups |
312
+ | [`data_module.md`](docs/diagrams/data_module.md) | Allium query flow through guardrails and approval |
313
+ | [`llm_tool_loop.md`](docs/diagrams/llm_tool_loop.md) | LLM API loop and tool call interception |
314
+ | [`system_architecture.md`](docs/diagrams/system_architecture.md) | Component overview |
315
+ | [`review_aggregation.md`](docs/diagrams/review_aggregation.md) | 3-rule mechanical review aggregation |
316
+
317
+ ---
318
+
319
+ ## Example outputs
320
+
321
+ The following papers were produced by earlier versions of the E2ER pipeline. In each case the researcher selected the research question and participated in the review stage; all other steps (literature search, data acquisition, estimation, writing) were handled autonomously by the pipeline.
322
+
323
+ > Results have not been submitted to a journal and should not be cited as peer-reviewed findings.
324
+
325
+ ### v3 smoke test (Haiku 4.5, no data)
326
+
327
+ A full v3 single-pass run against `claude-haiku-4.5` via OpenRouter, with the data module disabled, in ~11 minutes for ~$1.50. Numbers in the paper draft are model-imagined since no real data was queried — the run validates pipeline plumbing, not findings. See [`examples/e2er_v3_haiku_smoke/`](examples/e2er_v3_haiku_smoke/) for the full artifact set and a candid quality assessment.
328
+
329
+ ### NFT Market Seasonality
330
+
331
+ Tests whether the Halloween effect (systematically higher winter returns) extends to NFT markets. The pipeline acquired 35.8 million Ethereum-based NFT trades across eight platforms, specified econometric models, and ran robustness checks including bootstrap inference, permutation tests, and jackknife analysis.
332
+
333
+ **Key result (null finding):** No statistically significant Halloween effect. Two-thirds of the raw seasonal differential in USD returns reflects ETH price seasonality rather than NFT-specific patterns.
334
+
335
+ [Paper PDF](examples/e2er_v1_nft_seasonality/paper.pdf) · [LaTeX source](examples/e2er_v1_nft_seasonality/main.tex) · [Replication package](examples/e2er_v1_nft_seasonality/replication/)
336
+
337
+ <p align="center">
338
+ <img src="examples/e2er_v1_nft_seasonality/figures/fig1_monthly_returns.png" alt="Monthly NFT Returns" width="680">
339
+ </p>
340
+ <p align="center"><em>Monthly return distribution by platform — pipeline-generated</em></p>
341
+
342
+ ### Institutionalisation of Bitcoin
343
+
344
+ Examines whether Bitcoin's volatility converged toward traditional asset levels following the January 2024 spot ETF approval. The pipeline estimated GARCH and Markov-switching regime models, ran a difference-in-differences design around the ETF date, and executed robustness checks (Mann-Kendall trend tests, Rambachan-Roth sensitivity, leave-one-out analysis).
345
+
346
+ **Key result (null finding):** Bitcoin's GARCH volatility fell from 89% to 50% after ETF approval, reaching a low-volatility regime at 32% (within commodity range). But Bitcoin sustains this regime for only 6 days on average versus 82 days for equities; convergence is gradual, not structural.
347
+
348
+ [Paper PDF](examples/e2er_v1_bitcoin_institutionalization/paper.pdf) · [LaTeX source](examples/e2er_v1_bitcoin_institutionalization/main.tex) · [Replication package](examples/e2er_v1_bitcoin_institutionalization/replication/)
349
+
350
+ <p align="center">
351
+ <img src="examples/e2er_v1_bitcoin_institutionalization/figures/figure_2_event_study.png" alt="Event Study: ETF Approval" width="680">
352
+ </p>
353
+ <p align="center"><em>Event study around ETF approval date — pipeline-generated</em></p>
354
+
355
+ ---
356
+
357
+ ## Related projects
358
+
359
+ The automated research space is developing quickly. Two projects most relevant to E2ER:
360
+
361
+ **[Project APE](https://ape.socialcatalystlab.org/)** (Social Catalyst Lab, University of Zurich, Prof. David Yanagizawa-Drott) is the closest in spirit to E2ER. APE agents identify policy questions with credible causal identification strategies, fetch real data from public APIs (Census, BLS, FRED), run econometric analysis, and produce complete research papers. The project has generated approximately 1,000 papers and is now entering systematic evaluation, where AI-generated papers compete in a tournament against peer-reviewed research from leading economics journals. All papers, code, data, and failures are publicly available. E2ER differs in scope: it targets a broader range of empirical domains and data sources, prioritises researcher direction over full autonomy, and integrates data governance (guardrails, audit trail) as a first-class concern.
362
+
363
+ **[ZeroPaper](https://github.com/alejandroll10/zeropaper)** (Institute for Automated Research) coordinates approximately 30 specialised agents across 10 stages with a focus on theory-first finance and macroeconomics research. E2ER draws on four quality-control ideas from ZeroPaper: ceiling detection, adversarial self-attack, a parallel polish stack, and mechanical review aggregation.
364
+
365
+ ---
366
+
367
+ ## Development roadmap
368
+
369
+ ### Data sources for integration
370
+
371
+ The data module is designed to be extended beyond Allium. Planned and candidate integrations:
372
+
373
+ | Source | Domain | Access |
374
+ |--------|--------|--------|
375
+ | [FRED](https://fred.stlouisfed.org/) | Macroeconomics (750+ series) | Free API key |
376
+ | [WRDS](https://wrds-www.wharton.upenn.edu/) | Finance (CRSP, Compustat, OptionMetrics) | Institutional subscription |
377
+ | [OpenBB](https://openbb.co/) | Finance, macro, crypto | Open source |
378
+ | [Census Bureau API](https://api.census.gov/) | Demographics, economic surveys | Free |
379
+ | [BLS API](https://www.bls.gov/developers/) | Labour market data | Free |
380
+ | [ECB Data Portal](https://data.ecb.europa.eu/) | European monetary and financial data | Free |
381
+ | [World Bank API](https://datahelpdesk.worldbank.org/knowledgebase/articles/889392) | Development economics | Free |
382
+ | [Dune Analytics](https://dune.com/) | Blockchain analytics (SQL interface) | API key |
383
+ | [Flipside Crypto](https://flipsidecrypto.xyz/) | Blockchain data (alternative to Allium) | API key |
384
+
385
+ If you have access to a data source you would like to integrate, open an issue or contact hanneke@wiwi.uni-frankfurt.de.
386
+
387
+ ### Instrumental variables and natural experiments database
388
+
389
+ A curated database of potential identification strategies in the blockchain economy is maintained in [`docs/iv_database.md`](docs/iv_database.md). It documents protocol upgrades, regulatory events, and algorithmic changes that can serve as instruments or treatment discontinuities for causal research. Contributions are welcome.
390
+
391
+ ### Evaluation
392
+
393
+ A quality evaluation framework for pipeline runs is defined in [`docs/evaluation_framework.md`](docs/evaluation_framework.md), covering six scored dimensions (identification validity, empirical execution, writing quality, literature grounding, replication integrity, novelty) and all automated pipeline metrics. Evaluated runs are logged in [`docs/evaluation_log.csv`](docs/evaluation_log.csv).
394
+
395
+ ---
396
+
397
+ ## Version history
398
+
399
+ ### v1: Linear Pipeline
400
+
401
+ A sequential pipeline of 14 specialised agents processing a research question through 16 fixed stages. Each agent handles one task (literature search, data acquisition, theory development, estimation, drafting, review) and passes artifacts forward. Quality gates between stages enforce minimum standards before downstream agents proceed.
402
+
403
+ ```
404
+ idea -> research design -> [literature | data | theory] -> merge -> estimation
405
+ -> analysis -> draft -> [consistency | review | technical | visual] -> revision
406
+ ```
407
+
408
+ 24 workers, 118 skill files, 40+ skills across 9 domains. Fixed stage ordering with no editorial intelligence at runtime. Produced 133 paper drafts across 157 runs.
409
+
410
+ ### v2: Strategist-Controlled Architecture
411
+
412
+ A central Strategist agent (acting as first author) orchestrates 12 specialist agents (co-authors) through a work-order pattern. The Strategist operates in two modes: Mode 1 (lean orchestration with structured JSON decisions at pipeline checkpoints) and Mode 2 (full editorial control with access to the complete paper).
413
+
414
+ Key advances over v1:
415
+ - Strategist makes tactical decisions at checkpoints rather than following a fixed sequence
416
+ - Tiered context management: Tier 0 (paper identity), Tier 1 (decision-specific), Tier 2 (full artifacts)
417
+ - Data pipeline isolation: only the Data specialist queries databases; all others work from exports
418
+ - Human review gates at research design and post-draft stages
419
+
420
+ ### v3: Open-Source Release (this repo)
421
+
422
+ A ground-up redesign for open-source use. Retains the Strategist architecture from v2 and adds four extensions adapted from [ZeroPaper](https://github.com/alejandroll10/zeropaper):
423
+
424
+ - **Ceiling detection**: Strategist assesses diminishing returns after each iteration and decides whether to continue, pivot (max once), or proceed to review
425
+ - **Self-attack phase**: an adversarial specialist scores the draft's flaws by severity (1-10) before external review
426
+ - **Parallel polish stack**: five specialists run concurrently targeting specific weaknesses (formula errors, numeric consistency, institutional context, bibliography, equilibrium conditions)
427
+ - **Mechanical review aggregation**: three deterministic rules replace subjective editorial judgement
428
+
429
+ Additional v3 changes: BYOK (Anthropic and OpenRouter), built-in Allium data guardrails, token/cost tracking per specialist call, GitHub integration with Overleaf-compatible repo structure, **per-paper cost cap with hard abort**, **mid-run cancellation**, **server-rendered dashboard (Jinja2 + HTMX)** with live event log and cost meter, and a **downloadable audit bundle** (replication package + contributions + events + usage) for journal-ready provenance.
430
+
431
+ ---
432
+
433
+ ## How to cite
434
+
435
+ If you use E2ER in your research, please cite it as:
436
+
437
+ ```bibtex
438
+ @software{hanneke2026e2er,
439
+ author = {Hanneke, Bj{\"o}rn},
440
+ title = {{E2ER: End-to-End Researcher, An Open-Source Pipeline
441
+ for Automated Empirical Research}},
442
+ year = {2026},
443
+ version = {0.2.0},
444
+ url = {https://github.com/bhanneke/E2ER-project},
445
+ doi = {10.5281/zenodo.20187239},
446
+ license = {MIT},
447
+ institution = {Goethe University Frankfurt},
448
+ }
449
+ ```
450
+
451
+ *Cite the concept DOI `10.5281/zenodo.20187239` for any version of E2ER, or [browse Zenodo](https://zenodo.org/records/20187239) for version-specific DOIs. A companion paper describing the system architecture and methodology is in preparation.*
452
+
453
+ ---
454
+
455
+ ## Running tests
456
+
457
+ ```bash
458
+ pytest tests/ -v
459
+ ```
460
+
461
+ 75+ tests covering guardrails, review aggregation, cost tracking, pipeline orchestration, dashboard rendering, audit bundle creation, and resilience (retries, cancellation, partial failures). No network or LLM calls required.
462
+
463
+ ---
464
+
465
+ ## Get involved: call for testers
466
+
467
+ E2ER v3 is in active development and we are looking for researchers who want to test the pipeline on their own questions and domains. If you are working on an empirical question in IS, economics, finance, or adjacent fields and are interested in running the pipeline, please get in touch.
468
+
469
+ We are particularly interested in:
470
+
471
+ - **New empirical domains**: the pipeline has been tested on blockchain/DeFi data; we want to know how it performs on different research contexts (fintech, platform economics, digital markets, public finance, and more)
472
+ - **New data sources**: if you have access to a structured dataset and want to explore adding it as a data module alongside Allium, we would like to collaborate
473
+ - **Systematic evaluation**: we are building a quality evaluation framework (see [`docs/evaluation_framework.md`](docs/evaluation_framework.md)) and need runs across domains to establish baselines; testers who complete the human evaluation rubric contribute directly to the companion paper
474
+ - **Edge cases and failure modes**: if the pipeline produces something clearly wrong or breaks in an interesting way, that feedback is valuable
475
+
476
+ Contact: **hanneke@wiwi.uni-frankfurt.de** or open an issue on this repository.
477
+
478
+ ---
479
+
480
+ ## Contributing
481
+
482
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, the contribution paths (skills, specialists, data sources, LLM backends), and the PR process. Highlights:
483
+
484
+ - **Skill files** (no code changes): add domain expertise as markdown in `skills/files/`; loaded automatically into specialist prompts. Detailed guide: [`skills/CONTRIBUTING_SKILLS.md`](skills/CONTRIBUTING_SKILLS.md).
485
+ - **Data providers**: the data module is designed to be extended; Allium and the literature stack are the current examples.
486
+ - **IV database**: add natural experiments and instrumental variables to [`docs/iv_database.md`](docs/iv_database.md).
487
+ - **Research questions**: open an issue with a question you think could be tested.
488
+
489
+ ---
490
+
491
+ ## Contact
492
+
493
+ **Björn Hanneke** · [bjornhanneke.com](https://www.bjornhanneke.com) · hanneke@wiwi.uni-frankfurt.de
494
+
495
+ PhD Candidate, Goethe University Frankfurt
496
+ Chair of Information Systems and Information Management (Prof. Dr. Oliver Hinz)
497
+
498
+ [ORCID](https://orcid.org/0009-0000-7466-9581) · [Google Scholar](https://scholar.google.com/citations?user=N5fbuZIAAAAJ) · [LinkedIn](https://linkedin.com/in/bhanneke)
499
+
500
+ ---
501
+
502
+ *MIT License: see [LICENSE](LICENSE).*
@@ -0,0 +1,135 @@
1
+ e2er-0.3.0.dist-info/licenses/LICENSE,sha256=rf3pCreaELpMS60py_qNtLrO9Q3rKRze_hrMzek7ux0,1071
2
+ skills/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ skills/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ skills/files/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ skills/files/base/economist.md,sha256=lRNjfamyMP6q0qdUy8aDWlvlrfecN2Iq8VdnGlp8q0M,1192
6
+ skills/files/base/researcher.md,sha256=nF7awWkOpIfJvrBVKwZIzo_jXFD5rGxRoSQp3Pks1QM,1163
7
+ skills/files/causal-inference/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ skills/files/causal-inference/judge-designs.md,sha256=KS6Avnl7nqi7WDSTT9H1byu16fZmMOcCL4kfw_wxYUM,11135
9
+ skills/files/causal-inference/natural-experiments.md,sha256=WXBdlrOraAG9Lk7OERk2DzpJH3p43gAlgYYU__8MnSU,2034
10
+ skills/files/causal-inference/sensitivity.md,sha256=mO9oy-B7bavh7uiaJ1pKUJOqLGTUoxfnoWNxLTjtEFc,11898
11
+ skills/files/causal-inference/shift-share.md,sha256=Kdb0duaq1lyCD4FV-5SPDT_R2M-NsEcF7YrsmKfMVdI,9956
12
+ skills/files/causal-inference/weak-instruments.md,sha256=rCWW5bbwm7j9J5G1DS4IyEZSnRzChTR0-7qzFJINeVA,10520
13
+ skills/files/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ skills/files/data/allium-cli.md,sha256=NLIMrO9yZmV4p_fnL1uCqSXoy-6Jp4u1j1osrVCm1lc,5852
15
+ skills/files/data/allium-developer-api.md,sha256=F5SHvPtZe0eYXtb344agINnuncpd0umk0CmcLmrRyYc,6207
16
+ skills/files/data/blockchain.md,sha256=-Mr37_0ins0vEme4Jd7BHzbtdPjmmJVCFlLojQssQvE,2029
17
+ skills/files/data/byod.md,sha256=HlEKNpGsLzz6ilEIM_NW7CMbkjr3JLjMvScscR3kxSs,1808
18
+ skills/files/data/cleaning.md,sha256=6S8PiwIE3sQjeAmolNbUn7hUU97XDDKK3c2YOLGxXts,9196
19
+ skills/files/data/crypto-defi.md,sha256=NlMbU4LytY5cBU-Ivaz6W1_OY5YN0SsQdM4fFAnjd4A,5831
20
+ skills/files/data/figure-spec.md,sha256=IDNtlncTuf1S8dOFe5bupUjIB6Tbt_AJD9JTQ1SpO2o,3314
21
+ skills/files/data/visualization.md,sha256=nda0Jih3yhf5_19hVLkIz8w2Pc_SOv5DBNBHRkU8Ojc,8378
22
+ skills/files/econometrics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ skills/files/econometrics/did.md,sha256=rY9njXvQiYX4on8BjMilIEQZBaWLCxsoIPGdELw7a0E,1501
24
+ skills/files/econometrics/event-study.md,sha256=MvoT44xDY_mgS_wGzKQAQJjLH-JID9CkuHBF3a9bFQM,10525
25
+ skills/files/econometrics/iv-estimation.md,sha256=C_2VYhUrkkW-u5FpNTWjdXYj9Jcg9szjYXWNJ0BBcrY,4927
26
+ skills/files/econometrics/panel-data.md,sha256=HamhkiW3BfLC5SXjK1g6PwBJ4-vUVlweu0j627HPZCw,9833
27
+ skills/files/econometrics/rdd.md,sha256=apb18mx-z78r1s5xg0syOrDgHOxYqSyyMYSmTyuRFFw,9103
28
+ skills/files/econometrics/time-series.md,sha256=mK6viGJRu1KmEhmVbC3XrN9_VGVx3FJA0n7Vn4LO94Q,12536
29
+ skills/files/latex/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ skills/files/latex/bibtex.md,sha256=qhSibxUf8ilmL7UYSLKBTsirfp6725TRvuWaMhBrICU,16237
31
+ skills/files/latex/econ-model.md,sha256=YuADU4UggN437ct4krMcebAHzjIlC4GZkWxEpyrlS_E,10729
32
+ skills/files/latex/tables.md,sha256=n3Hk_IEZDpkyILOxQzZkqszmKwWqRxlh0brskt7vEsA,13458
33
+ skills/files/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
+ skills/files/math/optimization-verification.md,sha256=B0mJ6Y5ogxfstKC4QbXtgOew-JA-6iAfVtn62qEhmh8,8795
35
+ skills/files/math/proof-strategies.md,sha256=sGvqN3rxY2lCkKjPeq23GJ0gXxBUh16Dd_nli_q4354,7330
36
+ skills/files/modeling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ skills/files/modeling/asset-pricing.md,sha256=6_iXSXDc_JQv7DL2-blp_VhN8BXP4SCsArvNI55MfFA,11817
38
+ skills/files/modeling/game-theory.md,sha256=eXK8g5_ymJpaPkwCvysdu9liBGdVrjTv_omlesoHWPo,3901
39
+ skills/files/modeling/market-microstructure.md,sha256=sunTzIJy_vmLbgG85xMNW8yX6ol-RP7jtrMjk9I4N70,10431
40
+ skills/files/reasoning/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
+ skills/files/reasoning/anti-slop.md,sha256=t9TlMyUWc1-8t8VkzkCNDo_1s8hXtE79FtdX78ScpI0,1269
42
+ skills/files/reasoning/argument-audit.md,sha256=UyWxZuIzCmOROok1l8vgmFbEtQ1x7T3nvRtICRfyNA0,9234
43
+ skills/files/reasoning/creative-ideation.md,sha256=12tFdD7Miu78MPDLmS4Vzodd55D2XNStc4D9hzqh0E0,4911
44
+ skills/files/reasoning/identification.md,sha256=z-V_96YFDZj7mOLjylnxJxsXycWEGGK0rxr7YefHVD4,1301
45
+ skills/files/reasoning/novelty.md,sha256=vLk-rx_zeu0rOowDKndqYLTmZrMQQ2uOuqgQL1W8bBg,9675
46
+ skills/files/review/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
+ skills/files/review/consistency-check.md,sha256=SGadcyDxzvzddAPawg4AMju-XDdrDcp0JY8XCCLs78s,5696
48
+ skills/files/review/constructive-feedback.md,sha256=k3xIxVIhhACsYsOsBJZn6r6rS1Crik6F2q1Oo8doI_I,10142
49
+ skills/files/review/data-quality.md,sha256=Ie3ghF0mefT4QQSuV7WWL6GS47BpML2yAZ5OfCpEjaE,11628
50
+ skills/files/review/referee-simulation.md,sha256=HydSznA5qfIv1GeV9xalqf1ogF6QMGLu-a6XGdoVPNI,2342
51
+ skills/files/review/reference-check.md,sha256=H-CjJw7JN3xJILguOmHYHkzmw07CXTgA6NZIBjLrgII,2561
52
+ skills/files/review/technical-review.md,sha256=KaIcIZTJ57kPAdxJk8XXScAqKip_e_xI5m4lq3dDWm0,6402
53
+ skills/files/review/writing-quality.md,sha256=yvsqBaxx7JY-GQQpWxfWKyFfcnklddHOUiGPCv1eqy4,12064
54
+ skills/files/synthesis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
+ skills/files/synthesis/context-builder.md,sha256=kGSZbXudekT_GEA2bLRoKUnblfWdIXuGS2-kAJaZOng,1820
56
+ skills/files/synthesis/deliverables.md,sha256=V953Q5_CDZ3k6-3kWU2digtw42PXnVcjyoey_WVbJFA,3479
57
+ skills/files/synthesis/replication-package.md,sha256=HYZIRtDKBQP_jOm-CwL9zeUkgmbntI9C9GViL0jhncs,4210
58
+ skills/files/writing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
+ skills/files/writing/abstract.md,sha256=hWWT_uBHeh808LhEx5Vg6doI8PUr1tBpCXZcmMkkdBs,7434
60
+ skills/files/writing/discussion.md,sha256=F4XCHGPC96jENHJ0Ql9oFEGoIoQoDGRK35LoFiniSeI,5290
61
+ skills/files/writing/paper-structure.md,sha256=_LVgnrg8fg5HqxBCih8isNwX1RCo3t2VK50dTLSF8bA,1741
62
+ skills/files/writing/personal-style.md,sha256=7hqlFKqvfkr9syv0dvJnORmKH1bC6xaF7Jf3SfxuFUk,12931
63
+ skills/files/writing/revision.md,sha256=_SjVZgt-jX6kg8OPE3laH-yvDp8ltBkzZ-9bm0D1Buw,6158
64
+ src/__init__.py,sha256=F_ILtKh4KBvQ9YSzv1fXP10ZpX_uZviveQc0fmMv8eU,263
65
+ src/__main__.py,sha256=QktnQ2sye88ydE9R00KSzmeGw6HDeBZlAEcqeNHgB_c,2476
66
+ src/cli_install_skills.py,sha256=tdmnYbWVSkuX-BLBSSO_oQvbaphgk5MnTxVDKSIsUXg,3638
67
+ src/config.py,sha256=6DUOvcdhoKoS797537GHKir9hYYVHy3PFNQyJIFBa94,7378
68
+ src/logging_config.py,sha256=J1OVypcM47p8W54Zhy1uwUwBHADpdHQnEPf43yijVmA,609
69
+ src/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
+ src/api/app.py,sha256=Aq-LuCW2D23CHFRnIU7CVRLZMZCl6UIK0FgPsx64mkg,39986
71
+ src/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
+ src/core/pipeline/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
+ src/core/pipeline/state.py,sha256=HSsOn2S3tv57vQfDTq3RyIB7wI8Db9yiPra2OK4gkGA,2003
74
+ src/core/renderer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
+ src/core/renderer/compiler.py,sha256=u8D7brJVyEyI1zrGXAQr5Oej3sQyy2ADGadoBvUkWIc,2920
76
+ src/core/renderer/prose.py,sha256=jzN7Efc1VN0gRQQdmixwhIA080x7GSF7NEt2y05g_T0,1356
77
+ src/core/renderer/templates.py,sha256=3Lwh2uwStsZZujo1QWJQyuXfl00XuK6Vas5d5U7IXZ0,4379
78
+ src/core/specialists/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
+ src/core/specialists/base.py,sha256=eO0y_ZndCz32ai-0jrY8xgvXWNab0rnN2rWCyE0xWPQ,15991
80
+ src/core/specialists/contracts.py,sha256=WN1BY0r8STL9wuoBuLYGjskNzwjgZESDLYzPCm9rVWM,1212
81
+ src/core/specialists/dispatcher.py,sha256=QH9jSrsNX3qtBVMGdxfvjAJ-l8We0UBskGdA-2w4w7A,8395
82
+ src/core/specialists/registry.py,sha256=mrep_m3I7NXxZJGCtYZwPirhzcb9b1P5sHXIwoOAsdY,4537
83
+ src/core/strategist/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
+ src/core/strategist/actions.py,sha256=uQKZP0CY9p-qvo-w9v4572jaU8O6VKbKwuIxdOYLk7o,1815
85
+ src/core/strategist/context.py,sha256=hYcnuNC_H61zgIUQYlebu0CfG32mHqiXMj2NWE1WMgs,7282
86
+ src/core/strategist/engine.py,sha256=MHEMhnnx1dRMbRyacwPvcXnz6zkrrmszwjemaAJnyBM,14396
87
+ src/core/strategist/review_aggregator.py,sha256=0d9PMzxLnCOndqMC2Xo6QkLiFajR0Osf7Gx9aE_b_vI,7190
88
+ src/core/strategist/runner.py,sha256=o6aMoZE8NIof051Cw1Bi0YApcvzn2x4_66zCsrlDaAo,33580
89
+ src/core/strategist/state.py,sha256=poAIgxOBW68c_2olZP05ZM2uOWuAS4xCJtZw9L6xqx8,5629
90
+ src/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
+ src/db/client.py,sha256=q4BRsrNaxWkNvXH8Us2_FGwZiXGzsQ42VxbG3W7XelE,1614
92
+ src/db/events.py,sha256=bSx04xG4sgMgpKG1Rc-U6NWSKwEnz4yD_2Bbe6xmNfY,2263
93
+ src/modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
+ src/modules/security.py,sha256=wLFBqA9xeZ2N5T7tOMcS6uIqYzBYJHeJ9DPiPQLXeHk,1755
95
+ src/modules/data/__init__.py,sha256=tXDrCHFYAqMA8X5kq87C_Y30ux4lVyGnDaHy__Jtxxk,81
96
+ src/modules/data/allium.py,sha256=FNzddCu-kHtrNpb-ESxWU1TwjiFuXivIFMoTp0LYfhU,16579
97
+ src/modules/data/allium_developer.py,sha256=8MxcvZmEsfWCvrjx2eoxbEhoAfYbVzXCLj4z_cYBBoE,13244
98
+ src/modules/data/audit.py,sha256=DXsQ2OvJyephWt7Kb5gBOGlB0FKu9xj1rUU0t78gbWc,6002
99
+ src/modules/data/cli.py,sha256=d903FSfsaPU0Y7DUOwJBilbZEzhSVjjdeqEb14uoWlQ,19979
100
+ src/modules/data/dictionary.py,sha256=d2cpwm7BlrJ6034CdXJTE-UphyGYevRxqfwEeTB_jlE,1466
101
+ src/modules/data/guardrails.py,sha256=vP9xuaCFXpIqTSokOiyJ4YBsf-mRN9KiUWRL3NkwMl4,6814
102
+ src/modules/data/tools.py,sha256=4wrgL4ISP2FEuS7coQoQvrzzajPSf2cTihxH0l3OEp0,11744
103
+ src/modules/fetch/__init__.py,sha256=OT0ux-6gMcx-hwsdfNSKY8Lj2Y7gjeBZSihVtZyYZeg,62
104
+ src/modules/fetch/http.py,sha256=ADZD5j9XCk_YSNBpcYPMB_kKmipFX4BUHhdb7Iy2jYo,2655
105
+ src/modules/github/__init__.py,sha256=6n1wPjGgIdZ_b4Xr_RvqA02807Z6zIBSXmLeTXbzrnA,80
106
+ src/modules/github/client.py,sha256=2kzPLYdSIQWuL07rwvH5JdWGXnAWqy3dlLLf7hWa3fc,6156
107
+ src/modules/github/push.py,sha256=P6BnGa8HVt5AaBfM8pYc4rXU_pr91oF8vuoUNRqslHI,2597
108
+ src/modules/github/templates.py,sha256=sf3QStUvWyCvd9iQi3NmTTVW2oc_7ez1BjKOMwsklRU,2203
109
+ src/modules/literature/__init__.py,sha256=uuRcQaTnPgN5gHaOQ1NBN54cgbS_PIa9nMHe0L8I_DE,69
110
+ src/modules/literature/arxiv.py,sha256=6vCDX71tssBL9h7Df4NuqTvqQc-csIV2SmqfHPWk-Zs,2362
111
+ src/modules/literature/bibtex.py,sha256=iREXRdK0cKXbpqySV9TOkYnAl3kTMcSLY7891ZDlJTw,2556
112
+ src/modules/literature/models.py,sha256=iMjyHnqnwKyMww85ITpcBPmp4XmK5ZDEH1mWE3VoO7U,1575
113
+ src/modules/literature/openalex.py,sha256=bSYOsG-z5wTMHoXZJT0LIdQ8HQb1R0sQ3Z-rRuHW0J8,2939
114
+ src/modules/literature/semantic_scholar.py,sha256=ja9j05JRFj5ZZiDqLSWmkR-wTk3PlFwh3yGetHrVewo,2260
115
+ src/modules/literature/storage.py,sha256=vNp3PqKV2YfhbYTcf47afHWnktv7DMwfVaXb7sPnsjE,3929
116
+ src/modules/literature/tools.py,sha256=h046n25upTzwme7Zc6G9IFgflVWl19aUKn5BvhQAkLE,10338
117
+ src/modules/llm/__init__.py,sha256=exlSeaQGbJ32nR5Az6hQFCRTMT2AUJ3f4Kj1uW0cznU,68
118
+ src/modules/llm/anthropic.py,sha256=46-FOTrtPVUqBO7dqnf5APCF4kywCEcmCifYXWW2M7o,6319
119
+ src/modules/llm/base.py,sha256=1S4ZEzCXtcHCOYrg9BXPqHe8CVI_Jtyma7_nWSJ_548,4054
120
+ src/modules/llm/claude_code.py,sha256=rqvZpY-_oMPplekFC8BYUr-lBXHDOr_TjgivwLrIpYY,16375
121
+ src/modules/llm/codex.py,sha256=-NRXV2y73ayRKKx5r_LFLC1RdrtuhBF43nk51sbFFqk,7362
122
+ src/modules/llm/gemini.py,sha256=FhH9bZS7LiYQ8S211cQDIvRLUe0JfeUWXdKbjju3FmY,7489
123
+ src/modules/llm/openrouter.py,sha256=f0mbU8I_JGeBkFejrVeWwyxvWlpMDfchs4Vd7l-7WvI,7630
124
+ src/modules/llm/registry.py,sha256=mLcljdRbH3rgF6MT7VrZNhjXHsjT4lHKVfnIp7lhHHo,939
125
+ src/modules/llm/tools.py,sha256=6G5MQ_CjHfHGSiHLCkyT2nR83S8M6GvL-HD5YqPCC1Y,4574
126
+ src/modules/tracking/__init__.py,sha256=hVvN8kLrs1KiOfSIIMVK5y3sy3yPiRZgwhuEFaoCj_A,38
127
+ src/modules/tracking/costs.py,sha256=bIEbNmldWueRJCpBkN70h57zJiOxorQ521xAfPPwc20,1768
128
+ src/modules/tracking/usage.py,sha256=XRN3Jv9MtDc9gKIQE-IaNmOXDuIzN7ER3YgpZZL8Ok4,5723
129
+ src/skills/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
130
+ src/skills/loader.py,sha256=BUDDSNKSGfmQmPU4Bmy8xCzrbKjGx6cMdAV4T0aUOX0,3093
131
+ e2er-0.3.0.dist-info/METADATA,sha256=VK8KGQxA7Oe_qf3RUOJN9EjRZmojTp6FimZSj4tkxdo,28945
132
+ e2er-0.3.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
133
+ e2er-0.3.0.dist-info/entry_points.txt,sha256=excs3go1bHE9cV07-mNVLwKKh2U8cMMd-4-6WHtTn10,43
134
+ e2er-0.3.0.dist-info/top_level.txt,sha256=s4cxvjbXPAZnYV8lDIzlbv-eF3RVgOtMsHYUcXB4gpY,11
135
+ e2er-0.3.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
+ e2er = src.__main__:main