Local smoke command
ORCHESTRATOR_URL=http://localhost:8787 \
MCP_CITE_VERIFY_URL=http://localhost:8788 \
MCP_PDF_PARSE_URL=http://localhost:8789 \
MCP_STRUCTURE_PRED_URL=http://localhost:8790 \
MCP_PDB_FETCH_URL=http://localhost:8791 \
MCP_SCORING_URL=http://localhost:8792 \
RESULTS_DIR=./results \
PROMPTS_DIR=../agents \
bash pilot/run.sh \
--doi 10.48550/arXiv.2509.18480 \
--url https://arxiv.org/pdf/2509.18480 \
--recipe-fixture ../fixtures/simplefold_smoke_recipe_v0.json \
--dry-run
Operational sequence
- Start local Workers for orchestrator and MCP services on ports
8787-8792. - Run the fixture smoke above.
- Inspect the output packet under
pilot/local-runner/results/10.48550_arXiv.2509.18480/. - Inspect audit via
/paper-audit/10.48550%2FarXiv.2509.18480. - Only after the fixture path is healthy, start the M3 Max server and run without
--dry-run.
Cloudflare deployment role
Local Workers prove the runtime shape. Deployed Workers make the same shape public, stable, and inspectable under project routes. The M3 Max stays private behind Cloudflare Tunnel.
No-fixture Reader fallback
When Claude Code access is blocked, the local runner can use a command adapter for the Reader without weakening the Recipe schema.
READER_ADAPTER=command \
READER_COMMAND='node scripts/codex-agent.mjs' \
CODEX_AGENT_FLAGS='--full-auto' \
OPENAI_API_KEY=... \
bun run pilot \
--doi 10.48550/arXiv.2509.18480 \
--url https://arxiv.org/pdf/2509.18480 \
--model simplefold-100m
The adapter receives the Reader system prompt and user JSON on stdin, prints one Recipe JSON object, and the runner still writes reader_raw.txt, recipe.json, and audit records.
Full source runbook
The complete operator manual lives in docs/13_e2e_runbook.md.