TASKS-2 Subagent Orchestration (Container Model):
- ContainerMessage + channel-based escalation tools
- Deliberate (plan-first) and Exploratory preset workflows
- AskConductor/SubmitPlan (subagent) + Answer/Review (conductor)
- SessionRecorder DAG integration (question/plan turns)
- Environment context injection and orchestration guidance
- gci import ordering fix across pkg/{tools,agent,session}
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
6.7 KiB
6.7 KiB
CLAUDE.md
Project: picoclaw
Go-based AI agent with multi-channel messaging (Telegram, Discord, Slack, etc.) and a Telegram Mini App UI.
Build & Test
go build ./...
go test ./...
go vet ./...
Lint: golangci-lint run
Plan Mode
- Interview tool filtering:
interviewAllowedToolsinpkg/agent/loop.gois the single source of truth for tools available during interview/review phases. BothfilterInterviewTools(strips definitions before LLM call) andisToolAllowedDuringInterview(argument-level gating) reference this map. - History clear:
/plan start clearwipes session history and summary on transition to executing. The Mini App review UI offers two sliders: standard approve and approve-with-clear.
Subagent Orchestration (実装済み)
- Startup flag:
--orchestrationで on/off。SubagentsConfig.Enabledで gate。 - Conductor identity: orchestration 有効時に conductor identity + spawn/subagent guidance を system prompt へ注入。
- Sandbox/Spawn:
pkg/tools/sandbox.go,pkg/tools/spawn.go実装済み。 - AgentReporter:
orch.AgentReporter/orch.Noop/orch.Broadcasterで統一。main/heartbeat/subagent 全セッションが同一 Broadcaster に発火。Mini App はagentLoop.GetOrchBroadcaster()→handler.SetOrchBroadcaster()で受信。 - Container Model (Q&A escalation):
ContainerMessage+inCh/outChchannels onSubagentTask— deliberate preset (coder/worker/coordinator) のみask_conductortool — subagent → conductor question (blocking)answer_subagenttool — conductor → subagent answersubmit_plantool — subagent → conductor plan review (blocking)review_subagent_plantool — conductor → subagent approve/rejectPendingQuestions()で conductor LLM loop に question/plan_review を注入
- Deliberate Plan Mode:
SubagentPlanState(Clarifying → Review → Executing → Completed)runDeliberateTask(): clarifying phase (ask_conductor + submit_plan のみ) → executing phase (全ツール)runExploratoryTask(): exploratory preset の single-phase loop
- Environment injection:
extractPlanContext()で MEMORY.md から Context/Commands/Orchestration セクションを抽出 → subagent system prompt に注入 - SessionRecorder 拡張:
RecordQuestion()/RecordPlanSubmit()+TurnQuestion/TurnPlanSubmitTurnKind
Session DAG (Phase 0–3 実装済み)
- SQLite SessionStore:
pkg/session/sqlite.go—modernc.org/sqlite(CGO不要)、WAL モード、sessions+turnsテーブル - SessionStore interface:
pkg/session/store.go— Create/Get/List/Append/Turns/Compact/Fork/Prune 等15メソッド - LegacyAdapter:
pkg/session/legacy_adapter.go— SessionStore をラップし SessionManager と同一 API を提供。Store()/AdvanceStored()で直接 DAG 操作も可能 - CompactOldTurns:
LegacyAdapter.CompactOldTurns(key, keepLast, summary)— flush → turn 単位で cut point 算出 → SQLite Compact → キャッシュ更新。summarizeSession()から呼び出し (fallback 付き) - SessionGraph:
pkg/session/graph.go—SessionGraph+BeginTurn()/TurnWriter。LegacyAdapter.Graph()で取得。将来の段階移行準備 - JSON → SQLite migration:
pkg/session/migrate.go— 起動時にsessions/*.jsonを検出 → SQLite import →.json.migratedにリネーム - 配線:
pkg/agent/instance.goのSessions型が*LegacyAdapterに変更。sessions.dbを workspace 直下に生成 - SessionRecorder:
pkg/tools/session_recorder.go(interface) +pkg/agent/session_recorder.go(impl) — SubagentManager から Fork/Turn/Completion/Report を記録 - Prune: 起動時
store.Prune(7d)+flushLoop内 6h 定期 prune。AgentLoop.gcLoopで 30分毎に idlesessionLocksを GC - CLI
/sessionコマンド:list/graph/fork [label]/resetサブコマンド。default は DAG summary + token stats - Mini App Session Graph:
/miniapp/api/sessions/graphendpoint。SSEsessionevent にgraph含む。フロントエンドで tree rendering
コードの匂い — チェックリスト
新しいコードを書くとき・レビューするときの確認事項:
[]string+strings.Join→strings.Builderに一本化[]byte → string → io.Reader→bytes.NewReader(b)を直接使用- ループ内で静的なものを毎回生成 → ループ外で1回生成してキャッシュ
- 全件コピーが呼び出し側の用途より広い → COW または RWMutex + ポインタ返却を検討
- 同じ content を複数関数が独立して Split → 呼び出し側で1回 Split して渡す
var x []Tから始まる容量なし append → ソース長が既知ならmake([]T, 0, n)[]rune(s)変換前に長さチェックなし →len(s) <= maxで ASCII fast path を先に
未実装タスク
以下の todo/ ファイルに分割。基本は別ブランチで並列実装可能(※ TASKS-2 は TASKS-1 の型変更前提あり)。
| ファイル | 概要 |
|---|---|
todo/TASKS-1.md |
|
todo/TASKS-2.md |
|
todo/TASKS-3.md |
/session CLI コマンド、Mini App グラフ UI) |
todo/TASKS-4.md |
http.FileServer 統合、テンプレート注入、Bun ビルド導線、frontend unit test + CI pnpm test) |
todo/TASKS-5.md |
/plan worktrees の list/inspect/merge/dispose、安全化した PruneOrphaned、Mini App /miniapp/api/worktrees + Git タブ UI) |
todo/TASKS-6.md |
SOUL.md — AI Persona Evolution — 睡眠フェーズで体験を統合・忘却し人格を再構成。TASKS-2 完了後に着手 |
todo/TASKS-7.md |
Provider Wire Compatibility Hardening — openai_compat の provider 別 wire 分岐(OpenAI strict / Gemini)、thought_signature round-trip 保全、互換テスト追加 |