「AI 機能付き CRM」ではない
エージェントは画面横のチャットではない。独立したデプロイで、キューから仕事を取り、ブラウザを閉じても調査を続ける。
API は判断しない。スレッド取込や未知の参加者を AgentTask として記録し、意味づけは agent 側へ渡す。
人物情報に confidence score を付けない。観測した evidence と、人が判断すべき suggestion を分ける。
イベントを置く API と、意味を読む agent
API と agent の境界は「HTTP の中で同期的に enrich しない」。キューの行は agent が停止していても残り、lease が切れれば再実行できる。
仕事を自分で取り、予算が尽きたら止まる
Durable work queue
claimDue は FOR UPDATE SKIP LOCKED で期限の来たタスクを lease。複数 dispatcher が同じ仕事を取らず、死んだ run は lease expiry で戻る。
Evidence-aware tools
read_crm_history、search_crm、identify_contact、research_person、record_fact など、観測・照合・記録を分離した tool 群。
Schedule is a decision
cron は「毎 N 分」ではなく、タスクの dueAt。再確認には理由を残す schedule_recheck を使う。
agent → lease task → inspect evidence
→ strong evidence: write fact
→ weak evidence: human suggestion
→ schedule next look with reason確信度ではなく、証拠の価格
モデル自身に確信度を採点させると、便利そうに見える方向へ誤る。CRM は crm.signature-block や github.account-identity のような provenance を保存し、evidence ledger が強さを評価する。
| 入力 | 扱い | 書き込み |
|---|---|---|
| 署名ブロック、直接の履歴 | 強い観測 | record に反映 |
| 外部プロフィールの候補 | 弱い / 衝突の可能性 | suggestion として人へ |
| モデルの「たぶん」 | 証拠ではない | 人物情報に書かない |
「空欄」は「自信満々に間違っている」より安全。誰も誤りに気づけないデータを作らない。
画面は作業のために薄く保つ

Overview — closed-won、open pipeline、stage 別の案件を一画面で把握。

Deals — filter・sort・pagination を URL に保持し、ビューをリンクとして共有。
Sheets, not nested pages
行をクリックすると URL param で detail sheet を開く。戻るボタンで閉じ、深い route tree を作らない。全リストは同じ server-side paginated DataTable を使う。
境界を説明できるモノレポ
| 層 | 役割 | 代表パス |
|---|---|---|
| apps/app | RSC prefetch、画面、URL state | components/crm |
| apps/api | auth、health、tRPC routers、sync | src/* |
| apps/agent | durable session、tools、skills、schedule | agent/ |
| packages/db | Prisma schema と safe client | packages/db |
| packages/ui | 共有 UI primitives / DataTable | packages/ui |
外部 API の vendor client は apps/agent に置く。Nest service が enrichment を呼び出したら、境界違反として扱う。
ローカルで動かす
cp .env.example .env
bun install
bun run devGoogle sign-in、Postgres、必要に応じて Gmail / Calendar の credentials を設定する。詳細は source repository の docs/environment.md と README.md を参照。