ADR-001: Committee Retains Skill + Web/Cron Dual Execution Paths
- Status: ✅ Accepted
- Date: 2026-05-06
- Decision Makers: longsizhuo + Claude
← Back to ADR Index · Full Dual Paths Document
Context
openInvest's "4-role committee" (Macro / Quant / Risk / CIO) has two execution paths:
| Path | Coordinator | Worker Implementation | Model |
|---|---|---|---|
| Skill | User's Claude as coordinator | Agent({subagent_type}) truly spawns 4 subprocess subagents | Claude 4 |
| Web/Cron | core/committee.py (now core/committee/ package) | 4 SDKAgent + ThreadPoolExecutor same-process multi-threading | DeepSeek-Chat |
Two sets of the same prompt but different implementations, results may differ (different models + different isolation granularity).
Merging directions considered:
- A. Full switch to Skill: Zero API cost for the project, but cron cannot run (user must be in Claude Code)
- B. Full switch to Web/Cron: Clean single path, but loses "zero cost + Claude model capability ceiling"
- C. Full switch to Claude Agent SDK: Let Web also use real subagents + Claude model—see ADR-002
Decision
Retain dual paths. Each path serves different scenarios; do not merge.
Consequences
Positive
- Zero-cost main path: The Skill path runs on the user's Claude; the project pays zero API fees
- Controllable cost automation: Web/Cron uses DeepSeek (¥0.01-0.03/run); cron monthly cost is manageable
- True parallel Web GUI: DeepSeek responds quickly (2-3s/run); multi-asset ThreadPool measured ~16s convergence
- Validation mechanism: When the two verdicts for the same question do not converge, it's a signal worth manual review
- Disaster recovery: DeepSeek goes down / raises prices → Skill path unaffected; vice versa
Negative
- 1.3× maintenance cost: Adding a new role (e.g., ESG) requires registration on both sides; prompt changes must be synchronized
- ~70% code sharing rate: Prompts + REGIME + sanity checks are shared; orchestrator + LLM client are written separately
- Model differences are hard to explain: Marketing "we have a Skill path" invites criticism from Claude fans: "But isn't the Web path just DeepSeek?"
Alternatives Considered
A. Single Web/Cron + Switch to Claude
Let all paths use the Claude API (OpenAI Agents SDK or Claude Agent SDK).
Rejected: Cron costs ~¥1/day, ~¥30/month. Unacceptable. See ADR-002.
B. Single Skill, Remove Web/Cron
Keep only the Claude Code Skill path.
Rejected:
- Loses the "Trigger Committee" button in the Web GUI—users must open Claude Code
- Loses the cron 03:00 automatic daily_report
- Loses SSE live streaming
C. Dual Paths but Merge Implementation
Let Web/Cron also be wrapped as a Skill call.
Rejected:
- Requires the server to install the
claudeCLI binary (Claude Agent SDK is a subprocess wrapper) - Cron invoking Claude CLI once = one full Claude subscription consumption
- No savings compared to the current architecture
Reference
- Full dual paths explanation: 04-execution-paths.md
- Details on not upgrading to Claude Agent SDK: ADR-002
- Skill implementation:
skills/invest/scripts/run.sh prepare_committee+skills/invest/SKILL.md - Web/Cron implementation:
core/committee.py:run_committee(nowcore/committee/debate.py:run_committee) +connectors/web_api.py:committee_run
Review Trigger Conditions
This ADR should be re-evaluated if any of the following occur in the future:
- DeepSeek price increases ≥ 5× (cost structure changes)
- Claude Agent SDK supports non-Claude models (e.g., can run DeepSeek as a subagent)
- User base grows and cron run frequency demand increases (hourly vs daily)
- OpenAI Agents SDK popularity / protocol standardization pressure