Everything that's actually built
Sourced from each session's DONE-VALIDATED status report. No invention.
Session A — Scaffolding
▶
- pyproject.toml, .gitignore, .env.example, venv
- CLAUDE.md + AGENTS.md (shared agent context)
- memory/avenue-framework.json (28 avenues, 7 categories)
- memory/scoring-rubric.json (9 dimensions)
- orchestrator/schemas.py (Pydantic v2)
- orchestrator/validators.py (gate enforcement)
- orchestrator/ids.py + config.py
- orchestrator/codex_runner.py
- orchestrator/main.py (Typer CLI — 5 subcommands)
- .claude/commands/*.md slash commands
- README.md + tests/test_e2e.py scaffold
- 65 orchestrator/skill tests passing
Session B — MCP Servers
▶
- mcp-servers/_shared/ utilities
- etcos-publisher (B2) — 20 tests
- cross-lab-reviewer (B3) — 25 tests (was 22; +3 from DEC-009 regression coverage)
- cross-lab-reviewer v0.3.0 supports 4 providers: claude_cli, codex_cli, anthropic_api, openai (DEC-008)
- gemini-deep-research (B3.5) — upstream registered
- evidence-validator (B4) — 17 tests
- etcos-reader (B5) — 14 tests
- etc-memory (B6) — 18 tests
- citation-validator (B7) — 19 tests
- exa (B8) — upstream registered
- MCP registry (.claude/settings.json + .codex/config.toml)
- mcp-servers/README.md catalog
- 113/113 MCP tests passing (was 110)
Session C — Skills
▶
- REUSE_AUDIT.md (0 adoptions, 1 fork, 7 fresh)
- opportunity-brief v0.1.0 (generic — KEY)
- livestock-tech-opportunity-brief v0.2.0 (specialization)
- avenue-researcher v0.2.0 (gemini-first, exa fallback)
- scoring-rubric-applier v0.1.0
- cycle-planner v0.1.0
- evidence-validator skill v0.1.0
- backlog-intake v0.1.0
- pipeline-review-prep v0.1.0
- skills/README.md catalog
- 16 symlinks (.claude/skills + .codex/skills)
Workbench UI + Runtime Selector
Shipped on top of the v0 structural cut. Both fully tested; merged to main.
- FastAPI BFF + SSE live refresh (
apollo/web/server.py) - Per-thread runner spawning Codex/Claude in isolated worktrees
- Static workbench HTML in
prototypes/ui/ - Auto-discovers Node ≥18 for Claude CLI (works around system Node v14)
- Phase 1 — Claude CLI runner (
orchestrator/claude_runner.py, 17 tests) - Phase 2 — Dispatcher branches on
APOLLO_ORCHESTRATOR_RUNTIME(15 tests) - Phase 3 — cross-lab-reviewer 4 providers +
autoresolution (22 tests) - Phase 4 — BFF endpoints + workbench dropdowns +
.apollo/runtime.jsonpersistence (16 tests) - Bug-fix DEC-009 —
subscription-defaultsentinel +is_errorsurfacing (3 tests)
Commits: 45ed820 · 89b4bec · 36a2a01 · 5f2ac61 · 5cd0e75 · 602c9e1
· Test count: 175 → 254 unit + 1 deferred e2e (+79 new)
Running your own research cycle
The cloud site, SSO, opportunity publishing (user-identity Cloud Function) and CI/CD are live — no secrets needed to view opportunities. To run a real research cycle on the local agent, you supply your own API keys. Click each card for concrete steps.
○
Drop research keys in place
For local research runs. Publishing is keyless — no service-account file needed.
▶
For local research runs. Publishing is keyless — no service-account file needed.
ANTHROPIC_API_KEYfrom console.anthropic.com (or use Claude CLI subscription auth)OPENAI_API_KEYfrom platform.openai.com (or Codex CLI subscription auth)GEMINI_API_KEYfrom aistudio.google.com — paid tier required (Deep Research is not on free)- Optional:
EXA_API_KEY(free tier 1k searches/mo) - No Firebase key needed — publishing runs under your own @etcorp.ca identity via the
publishOpportunityCloud Function (keyless ADC fallback locally)
○
Run the §9 end-to-end test
One real cycle on one real avenue/vertical pair.
▶
One real cycle on one real avenue/vertical pair.
pytest tests/test_e2e.py::test_full_cycle -v- Verify
cycles/2026-Q2-test/AR-001-*/findings.mdexists and is non-empty - Verify
opportunities/OPP-001/backlog-row.jsonis schema-valid - Verify
opportunities/OPP-001/reviews/anthropic-review.mdhas structured output - Verify Firestore test collection has OPP-001 doc after publish
- Negative test: remove APPROVED → publish exits non-zero
○
Confirm Gemini Deep Research package resolves
Session B locked @alexcong/gemini-deepsearch-mcp in the registry. If npm can't find it, registry needs a one-line edit.
▶
Session B locked @alexcong/gemini-deepsearch-mcp in the registry. If npm can't find it, registry needs a one-line edit.
- Try:
npx -y @alexcong/gemini-deepsearch-mcp --help - If unresolved: try
gemini-deepsearch-mcp(no scope) - Or fallback to
bharatvansh/gemini-deep-research-mcp - Or clone & node-run as last resort
- Update
mcp-servers/GEMINI_DEEP_RESEARCH_DECISION.mdwith working invocation
○
Wire telemetry to real data
Telemetry page currently shows demo data. Build the generator script when ready.
▶
Telemetry page currently shows demo data. Build the generator script when ready.
- Create
orchestrator/scripts/build_telemetry.py - Walk
cycles/*/research-log.json→ counts & costs - Walk
opportunities/OPP-*/backlog-row.json→ tier/status/quadrant aggregations - Parse
coordination/HANDOFFS.mdfor run timestamps - Write to
apollo-cloud/data/telemetry.json
Public Data Tier — 6 free MCPs
All upstream, all free, all stdio-installable — registered alongside Exa (B8) and gemini-deep-research (B3.5). Now live and operational, bringing the total to 14 MCPs. Original handover at coordination/WAVE_1_HANDOFF.md.
Search hedge (1k free queries/mo) — fallback when exa rate-limits.
arXiv + PubMed + OpenAlex + Semantic Scholar + bioRxiv. Free.
EPO + USPTO landscape. Free open beta.
SEC EDGAR (13 tools, no API key). Free.
Agentic SEC analysis (8000+ companies, no rate limits). Free.
Open Government Canada (250k+ datasets). Free.
- ✓ All six MCP packages smoke-tested and registered in both CLIs
- ✓ CLAUDE.md Tool Dispatch table maps each need → the right MCP
- ✓ avenue-researcher Step 3.5 encodes the specialized-MCP cascade
Other v1 questions — resolved & open
Wave 1 is integrated, and the production cutover (Q5) and CI (Q8) are now done — both marked ✓ below. The remaining questions still await your direction; each answered one becomes a roadmap item.
The Public Data Tier (incl. EdgarTools) is already live — see Gap Analysis. Remaining candidates: etc-sharepoint, etc-crm, regulatory wrappers (you pick the 1-2 agencies).
v0 stops at "published to ETCOS." When an opportunity enters Phase 1, what does Apollo's role become? Hands off entirely? Generates a Phase 1 briefing pack? Something else?
Today only you run it. Should the GM read briefs directly through Apollo's UI? Should other ETC functions (sales, engineering) submit candidates? Or is ETCOS itself the read-side UI?
WI says monthly review with 6–10 cycles per quarter. Should Apollo auto-trigger plan-cycle quarterly? Or always Rafael-initiated? Are there event-triggered runs (e.g., regulatory mandate hits)?
Now live on the real etc-pinnacle-os project (shared with etcos.ca). Opportunities publish under each user's @etcorp.ca identity via the publishOpportunity Cloud Function, with shared-backend safety guards in place.
Should Apollo proactively alert you / GM / others when something important lands (Tier 1 found, gate blocked, cycle completed)? Or stay manual-only for v1?
Livestock is the seed. The Avenue Framework lists three adjacent verticals (Precision Ag, Critical Minerals & Mining, Renewable Energy). Which should be specialized next? Defence & Public Safety (separate set of considerations)?
GitHub Actions runs 254 tests on every push (py3.11 + py3.12), and merges to main auto-deploy the website via keyless Workload Identity Federation.
What's actually been discussed for "later"
Only items grounded in our actual conversations. Nothing invented.
Managed Agents migration
Move orchestrator from local Codex CLI to Anthropic Managed Agents — durable async, sandboxed execution, dreaming.
▶
Move orchestrator from local Codex CLI to Anthropic Managed Agents — durable async, sandboxed execution, dreaming.
Source: our "Managed Agents vs Agent SDK" discussion turn.
Why later: v0 architecture explicitly designed so this is a swap, not a rewrite. Every MCP supports --transport stdio|http; orchestrator binding is one file.
Cost shift: $0.08/hr session runtime + token costs no longer covered by your Codex subscription.
Decision needed: when do you want to migrate? Today's local setup is fine for solo use.
Deferred MCPs (per plan §6)
etc-sharepoint, etc-crm, regulatory wrappers — the plan put these in Phase 2 explicitly.
▶
etc-sharepoint, etc-crm, regulatory wrappers — the plan put these in Phase 2 explicitly.
Source: IMPLEMENTATION_PLAN.md §6 task list — "Phase 2 — Out of v0 scope" row.
Detail: see the Gap Analysis page.
Decision needed: Q1 on the v1 questions list above will likely move some/all of these into v1 if you choose. Otherwise they stay in Phase 2.
Additional vertical specializations
Livestock pattern → applied to other ETC strategic verticals.
▶
Livestock pattern → applied to other ETC strategic verticals.
Source: noted in the original architecture design as the natural extension pattern.
Detail: each new vertical = a new specialization skill that inherits from opportunity-brief and adds vertical-specific guidance (subsystems, source priorities, regulatory checklist). Roughly 1 day per vertical.
Decision needed: Q7 above — which vertical(s) next, in what order?
The previous version of this page had several speculative items (notifications, observability tooling, dreaming, Genie Spaces, multi-tenant). I removed them — they were extrapolation, not your direction.
If any of those ideas resonate, tell me and I'll add them back with real scoping.
⚠️ Known issues & tech debt
From the actual session status files. Not invented.
DEC-001 superseded — clean up references
▶
- DEC-005 supersedes DEC-001 (Anthropic now the cross-lab default, not gpt-5)
- Audit cross-lab-reviewer/server.py for gpt-5-specific defaults
- Lead with Anthropic in README and CLAUDE.md; mention OpenAI as fallback
- Reference: Session B status open question #1
Gemini Deep Research npm package name not verified
▶
@alexcong/gemini-deepsearch-mcplocked in settings — may not resolve on npm- Try
npx -y @alexcong/gemini-deepsearch-mcp --helpat integration time - Fallbacks: drop scope, or use
bharatvansh/gemini-deep-research-mcp - Reference: Session B status open question #2
pytest importmode decision
▶
- Session B initially filed a MERGE_REQUEST to add
importmode = "importlib"to pyproject - Withdrew after fixing tests in-file
- Worth confirming the in-file fix is the long-term solution
- Reference: Session B handoff 2026-05-08T20:50
✓ CI — resolved
▶
GitHub Actions now runs 254 tests on every push (py3.11 + py3.12); merges to main auto-deploy the website via keyless Workload Identity Federation. (Was v1 Q8.)