Skip to content

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:

PathCoordinatorWorker ImplementationModel
SkillUser's Claude as coordinatorAgent({subagent_type}) truly spawns 4 subprocess subagentsClaude 4
Web/Croncore/committee.py (now core/committee/ package)4 SDKAgent + ThreadPoolExecutor same-process multi-threadingDeepSeek-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 ​

  1. Zero-cost main path: The Skill path runs on the user's Claude; the project pays zero API fees
  2. Controllable cost automation: Web/Cron uses DeepSeek (¥0.01-0.03/run); cron monthly cost is manageable
  3. True parallel Web GUI: DeepSeek responds quickly (2-3s/run); multi-asset ThreadPool measured ~16s convergence
  4. Validation mechanism: When the two verdicts for the same question do not converge, it's a signal worth manual review
  5. Disaster recovery: DeepSeek goes down / raises prices → Skill path unaffected; vice versa

Negative ​

  1. 1.3× maintenance cost: Adding a new role (e.g., ESG) requires registration on both sides; prompt changes must be synchronized
  2. ~70% code sharing rate: Prompts + REGIME + sanity checks are shared; orchestrator + LLM client are written separately
  3. 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 claude CLI 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 (now core/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:

  1. DeepSeek price increases ≥ 5× (cost structure changes)
  2. Claude Agent SDK supports non-Claude models (e.g., can run DeepSeek as a subagent)
  3. User base grows and cron run frequency demand increases (hourly vs daily)
  4. OpenAI Agents SDK popularity / protocol standardization pressure