ADR 0006: 単一 Worker + HTTP Events API に統合する (Container / Queue 廃止)
Context
旧計画(ADR 0001 / 0003)は「Slack 連携は Socket Mode 統一」という当時の社内規約に合わせ、Bolt Socket Mode の Bun コンテナ + 分析系の Cloudflare Queue + Consumer という 2〜3 デプロイ構成を採っていた。その後、前提が変わった。
noisy-crow-appが Bot Container + Consumer Worker + Queue を廃止し、HTTP Events API を受ける単一 Worker に移行・安定稼働した(noisy-crow-web)。「Socket Mode 統一」規約は事実上撤廃されている。- 移行元の
tied-botはもともと HTTP Events API(/api/slack/events)+ 非同期処理(Inngest)の設計であり、HTTP 受けの方が元の構造に近い。 - コンテナ構成は Dockerfile・DO shim・keepalive cron・
max_instances=1運用・KV/D1 REST クライアントなど付帯物が多く、常駐課金も発生する。
技術的な裏付け(2026-06 時点で確認済み):
- Workers の CPU 制限(有料プラン既定 30 秒、
limits.cpu_msで最大 5 分)は LLM API の応答待ち(I/O 待ち)にカウントされない。 ctx.waitUntilはレスポンス返却後 30 秒で打ち切られるため、長くなり得る AI 応答には使えない → Durable Object 側で自走させる(ADR 0007)。- cron(
scheduledハンドラ)は最大 15 分実行でき、weekly-report / master-data 同期に十分。
Decision
apps/tied-ai-botは 単一の Cloudflare Worker とし、デプロイ単位・wrangler 設定・CI を 1 つに集約する。- Slack 連携は HTTP Events API。
POST /slack/events//slack/commands//slack/interactionsを受け、署名検証(SLACK_SIGNING_SECRET)後 3 秒以内に 200 を返す。実装はnoisy-crow-appのapp/routes/slack-events.tsパターンを踏襲する。 - Inngest は廃止(ADR 0001 から引き継ぎ)。処理の振り分けは:
- AI 応答系 → BotAgent(Agents SDK / DO)に委譲し、DO の
scheduleで自走(呼び出し元の 30 秒制限と切り離す)。 - 保存・分析系(D1 / Vectorize / R2 への書き込み) →
ctx.waitUntil。 - 定期ジョブ → 同一 wrangler の
[triggers] crons+scheduledハンドラ。
- AI 応答系 → BotAgent(Agents SDK / DO)に委譲し、DO の
- Cloudflare Queue・Consumer・コンテナ・Dockerfile・keepalive cron は作らない。Worker から KV / D1 / R2 / Vectorize へバインディング直結とし、REST クライアント(
D1RestClient等)の新規開発も不要とする。 - イベント重複排除は KV(TTL 60 秒)を一次とし、AI 応答系は BotAgent (DO) 内の処理済みチェックで強整合に補完する。
Consequences
- 良い点: デプロイ単位が 3 → 1。Dockerfile・DO shim・keepalive・Queue の配管・REST クライアントが全廃され、scale-to-zero で常駐コストもなくなる。tied-bot の元設計(HTTP + 非同期)に近く、移植が素直。
- 悪い点 / 注意:
- 公開 HTTP エンドポイントが増える。署名検証必須(noisy-crow で許容済みのトレードオフ)。
ctx.waitUntilの 30 秒制限を超える処理を誤って waitUntil に置かないよう、処理時間の見積もりをレビュー観点にする。- Slack App 設定で Events API の Request URL / slash command / interactivity の URL 登録が必要(
SLACK_APP_TOKENは不要になる)。
- フォローアップ: KV の結果整合による重複排除すり抜けの実測。万一問題になれば D1
INSERT OR IGNOREか DO 一元化に寄せる。
Alternatives
- Socket Mode コンテナ維持(旧 ADR 0001/0003 構成): 公開エンドポイント不要だが、3 デプロイ単位 + コンテナ付帯物 + 常駐課金が残る。規約前提も消失した。却下。
- Cloudflare Workflows で非同期処理: Inngest に最も近い durable execution(ステップ毎リトライ)だが、AI 応答は Agent (DO) の
scheduleで足り、保存系は waitUntil で十分なため当面不採用。リトライ要件が強まったら再検討。 - Queue + Consumer のみ廃止しコンテナは残す: 中途半端に付帯物が残るため却下。