AIVEST 開発ハーネス|現状システム俯瞰
LINE から CEO が指示を投げる → AI エージェント群が役割分担して用件定義 / 設計 / 実装 / レビューを進める → 成果物が出る、までを自動化するハーネスの現状をまとめたもの。
1. ひとことで
AIVEST 開発ハーネスは LINE を窓口に、Claude Max と ChatGPT サブスクの 2 モデルをクロスチェックさせる開発ワークフロー。
- Claude(Max20x サブスク)= 実装担当(coder)
- Codex(ChatGPT サブスク)= 上流(COO / CTO)+ レビュー(reviewer)
- 状態は
tasks/<id>/state.jsonをファイルベースで管理、エージェント間は直接対話せずファイル経由でやりとり。
2. 全体図
CEO の iPhone (LINE App)
│ 平文メッセージ / スラッシュコマンド
▼ HTTPS POST (webhook + X-Line-Signature)
Cloudflare Quick Tunnel
└ https://cartoon-russia-aspect-comprehensive.trycloudflare.com → localhost:3000
▼
codex-line-bot (Mac host, Hono + tsx watch)
├ server.ts … 署名検証 + allowlist
├ orchestrator.ts … 分類 + フェーズ駆動
├ tasks.ts … TaskStore (SQLite + state.json 同期)
├ agents.ts … claude / codex / grok 抽象化
├ usage.ts … トークン/コスト計測
├ hooks.ts … harness/hooks/*.sh 発火
├ line.ts … Reply / Push / Loading
├ sessions.ts … debug 用 resume 補助
└ env.ts / logger.ts
▼ docker compose run --rm (毎回新規 container)
┌─────────────────────────┐ ┌─────────────────────────┐
│ claude-sandbox (4.44GB) │ │ codex-sandbox (4.43GB) │
│ Playwright + Claude │ │ Playwright + Codex │
│ + Vercel CLI │ │ + Vercel CLI │
│ ブラウザ /ms-playwright │ │ ブラウザ /ms-playwright │
│ auth volume │ │ auth volume │
└────────────┬────────────┘ └────────────┬────────────┘
│ │
└──── 同じ /workspace ───────┘
▼
claude-sandbox/shared/ ← ハーネス本体(資産)
├ profiles/ ── 役割定義・テンプレ・規約
├ tasks/<id>/ ── 案件1個 = 1ディレクトリ
├ tools/ ── bash 補助
├ hooks/ ── 8 種のライフサイクルフック
├ memory/ ── index / decisions / lessons
└ monitor/ ── 監視アラート
3. コンポーネント
LINE Messaging API
CEO の唯一の入口。Bot 名 AIV_CTO。
Channel ID: 2006423193
許可ユーザー: 1名のみ
認証: dotenvx 暗号化済
許可ユーザー: 1名のみ
認証: dotenvx 暗号化済
Cloudflare Quick Tunnel
無料 quick tunnel で webhook を Mac に転送。
現 URL: cartoon-russia-aspect-...
安定 URL 化: named tunnel 移行可
安定 URL 化: named tunnel 移行可
codex-line-bot
Mac で動く Hono サーバ。フェーズ駆動の中核。
Port: 127.0.0.1:3000
起動: ./start.sh
11 ファイル / TypeScript / tsx watch
起動: ./start.sh
11 ファイル / TypeScript / tsx watch
claude-sandbox
Claude Code を非対話で動かす隔離環境。
Size: 4.44 GB
Base: Playwright v1.60.0-jammy
役割: coder(実装担当)
Base: Playwright v1.60.0-jammy
役割: coder(実装担当)
codex-sandbox
Codex CLI を非対話で動かす隔離環境。
Size: 4.43 GB
Base: Playwright v1.60.0-jammy
役割: COO / CTO / reviewer
Base: Playwright v1.60.0-jammy
役割: COO / CTO / reviewer
ハーネス(claude-sandbox/shared/)
両 container が /workspace として bind mount。
36 ファイル
profiles + tools + hooks + memory + tasks
profiles + tools + hooks + memory + tasks
4. データの流れ(典型 1 ターン)
- CEO が LINE で「x バズらせるウェブアプリ作りたい」と送信
- LINE Platform が webhook を Cloudflare Tunnel に POST
codex-line-bot/server.tsが受信、署名と allowlist を検証orchestrator.classify(text, openTaskId)で分類- 平文 + open task 無 →
new_task - 平文 + open task 有 →
continue_task /...→ 対応コマンド
- 平文 + open task 無 →
handleNewTaskorhandleContinueTasktools/task-new.shでtasks/<id>/生成discussion.mdに CEO 発話を append- 即時 reply「📨 task ... 着任…」
- 進捗タイマー(90s / 240s に「思考中」push)
- Loading indicator を 25 秒毎にリフレッシュ
runCOOConversation- プロンプト構築(タスクID + 原文 + 既存 discussion + 役割定義)
docker compose run --rm codex codex exec --json -で spawn
- Codex container 内で agent が動く
AGENTS.md自動読込profiles/general/roles/coo.md読み込み- モード判定(壁打ち vs spec 確定)
- モード1:
discussion.mdに追記 →DISCUSSING - モード2:
coo-spec.md/jsonを書く →SPEC_READY
- orchestrator が stream-json を parse、usage 記録、state.json を SQLite に同期
- CEO に push 返信
5. タスクのライフサイクル
/spec で強制
┌────────────────────────────────────┐
│ ▼
[NEW] ─→ [DISCUSSING] ─COO judge─→ [SPEC_READY] ─/approve→ [CONTRACT_READY] ─→ [SUBTASKS_READY]
↑ ↑ ↑ │
└─continue─┘ └──/reject── │
▼
[IMPLEMENTING] ⇄ [UNDER_REVIEW]
│ 3回 fail
▼
[WAITING_HUMAN]
│ CEO 介入
▼
[SUBTASK_DONE]
│ 全 subtask 完了
▼
[DONE]
Phase 1(実装済)
NEW → DISCUSSING → SPEC_READY → CONTRACT_READY → SUBTASKS_READY
Phase 2(未実装)
IMPLEMENTING / UNDER_REVIEW / SUBTASK_DONE / DONE のループ
6. 役割と担当モデル
| Role | モデル | 入力 | 出力 |
|---|---|---|---|
| COO | Codex | LINE原文 + discussion.md + memory | discussion.md or coo-spec.md+.json |
| CTO | Codex | coo-spec.* + tech-stack.md | cto-contract.md+.json, subtasks.md+.json, acceptance.tests.json |
| Splitter | Codex(CTO兼任) | cto-contract | subtasks.json |
| Coder | Claude | spec + contract + subtask | impl/<S>.md + 実コード変更 |
| Reviewer | Codex | spec + contract + impl + acceptance.tests | reviews/<n>.md(pass/fail + Bash で verify) |
| Researcher | Codex | クエリ | tasks/<id>/research/<topic>.md |
| Monitor | スクリプト | プロセス状態 | monitor/alerts/*.json |
| Learner | Codex | 過去 reviews | memory/lessons.md |
クロスチェック原則
書いたモデルが読まない。Claude が実装、Codex がレビュー。同一モデルの盲点を異モデルで補う。
7. LINE コマンド一覧
主要操作
| コマンド | 動作 |
|---|---|
| (平文メッセージ) | open task があれば壁打ち継続、無ければ新規 task |
/new <内容> | 明示的に新規 task |
/progress [id] | 状態 + 直近の壁打ち末尾 |
/spec [id] | COO に spec 確定を強制 |
/approve [id] | 次フェーズへ進行 |
/reject id 理由 | spec 修正リクエスト |
/escalate [id] | 人間判断待ち |
/status | 直近 10 task の一覧 |
/budget | 当月のトークン/コスト試算 |
/whoami | userId + provider 構成 + 最新 task |
/help | ヘルプ |
デバッグ
| コマンド | 動作 |
|---|---|
/codex msg | codex 直叩き(state を変えない) |
/claude msg | claude 直叩き |
/grok msg | grok 直叩き(要 GROK_API_KEY) |
/use codex|claude|grok | provider 永続切替 |
/reset, /resetall | session 破棄 |
8. 中間進捗・監視
- ローディングインジケータ:LINE 標準のタイピング表示。25 秒毎にリフレッシュして agent 走行中ずっと点灯
- 生存 push:90 秒経過で「🤔 COO 思考中... 1.5m 経過」、240 秒で「⏳ 引き続き走行中... 4m 経過」を自動 push(最大 2 回)
- タイムアウト:agent 走行 15 分(AGENT_TIMEOUT_MS)で SIGTERM
- 沈黙検知:
hooks/on_silence.sh雛形あり watchdog 発火元 未実装
9. 認証情報の所在
| トークン | 保管場所 | 状態 |
|---|---|---|
| LINE channel secret + access token | .env(dotenvx 暗号化) | 設定済 |
| dotenvx 秘密鍵 | macOS Keychain codex-line-bot-dotenv-key | 設定済 |
| Claude Max OAuth | claude-sandbox_auth Docker volume | 設定済 |
| ChatGPT サブスク OAuth | codex-sandbox_auth Docker volume | 設定済 |
VERCEL_TOKEN | .env(dotenvx 暗号化予定) | 未設定 |
GROK_API_KEY | .env(dotenvx 暗号化予定) | 未設定(保留) |
10. データベース
/Users/ren/AI/01_APP/codex-line-bot/data/ 配下に 3 つの SQLite DB:
sessions.db—/codex/claude直叩きの session_id resume 用sessions.tasks.db— TaskStore(task_id → state, line_user_id, title, timestamps)usage.db— 全 agent 呼び出しのトークン/コスト記録(/budgetの元データ)
正本の状態は tasks/<id>/state.json(ディスク)。SQLite は高速検索用のキャッシュ。
11. 現状の制約
| # | 制約 | インパクト | 状態 |
|---|---|---|---|
| 1 | Phase 2 未実装(SUBTASKS_READY 以降の coder / reviewer ループ無し) | 仕様までは書けるが、実装は手動 | 最優先 |
| 2 | /workspace が claude-sandbox/shared/ 固定 | 他の repo(例: 01_APP/youtube-analyzer)に agent が触れない | 次 |
| 3 | VERCEL_TOKEN 未配線 | container 内で vercel コマンドが認証失敗 | 準備中 |
| 4 | 沈黙検知 watchdog 未稼働 | 60 秒以上 stdout なしを検知できない | 未実装 |
| 5 | Quick Tunnel の URL 不安定 | cloudflared 再起動で URL 変わる、LINE Console 更新必要 | named tunnel 検討 |
| 6 | Claude Max 課金分離 2026-06-15 | Agent SDK credit が独立化、現状の claude -p 多用は枠を食う | 27 日後 |
| 7 | JSON 出力検証なし | codex が coo-spec.json を不正 JSON で書いても検知できない | 小修正 |
| 8 | shared.old/ がまだ残ってる | 旧 harness のバックアップ | 削除可 |
12. 次のステップ
- A. Phase 2 実装 — coder / reviewer ループ、最大の機能空白
- B. 動的 workspace 切替 —
/project switch <path>で bind mount を変える - C. VERCEL_TOKEN セット + vercel build / preview deploy 動作確認
- D. Cloudflare Tunnel を named tunnel に(URL 安定化)
- E. JSON 出力の機械検証(spec の生成失敗を自動検知)
推奨順序
A → C → B → D → E。A が最大の機能空白(書いた仕様で実装が走らないと harness の意味が半減)。続いて C を入れれば「実装したら preview URL が LINE に返る」までいく。
13. 主要ファイル
/Users/ren/AI/01_APP/
├── codex-line-bot/ ← Mac で動く Hono サーバ
│ ├── src/
│ │ ├── orchestrator.ts ← フェーズ駆動の中核
│ │ ├── agents.ts ← claude/codex/grok 抽象化
│ │ ├── tasks.ts ← TaskStore
│ │ ├── usage.ts ← コスト計測
│ │ ├── server.ts ← webhook
│ │ └── ... (他 6 ファイル)
│ ├── data/ ← SQLite × 3
│ ├── .env ← dotenvx 暗号化済
│ └── start.sh
│
├── claude-sandbox/
│ ├── Dockerfile ← Playwright base + Claude Code + Vercel CLI
│ ├── docker-compose.yml
│ ├── start.sh
│ └── shared/ ← ★ ハーネス本体(/workspace)
│ ├── OVERVIEW.md ← この内容の md 版
│ ├── ARCHITECTURE.md
│ ├── EXECUTION.md
│ ├── CLAUDE.md / AGENTS.md
│ ├── profiles/general/{roles,templates}/
│ ├── profiles/domains/coding/
│ ├── tasks/<id>/
│ ├── tools/
│ ├── hooks/
│ ├── memory/
│ └── monitor/
│
└── codex-sandbox/
├── Dockerfile ← Playwright base + Codex CLI + Vercel CLI
├── docker-compose.yml
└── start.sh