DESIGN · 2026-05-24 · LOCKED

Slack駆動 サイト管理アーキテクチャ — 設計確定版

11論点の意思決定を踏まえた実装着手版。前段の引き継ぎHTML(2026-05-24-slack-bot-architecture.html)の上に、Otakeさんとの対話で確定した内容を反映している。

1. 全体像(一目)

1 Slackチャンネル #yamato-site-管理@yamato-site管理 をメンション
2 Slack App → Cloudflare Worker(受け口)→ GSheetキューに行追加
3 Bot が即「📥 受け付けました」とスレッドへ返信
4 Claude Code scheduled-task(5分ポーリング)が新規行を拾う
5 依頼者が Otake以外かつ 内容が曖昧なら、確認返しを投稿("〜で合ってますか?")
6 私(Claude)が哲学チェック → 該当ファイル編集 → 再ビルド → wrangler deploy
7 完了したら依頼スレッドへ「✅完了 + 変更要約 + 更新URL + before/afterサムネ」を返信
8 GSheet行を status="完了" に更新

2. 確定した11論点

#論点決定
1Claudeの振る舞いC型ハイブリッド:デフォルト実行、禁則に触れたら止める/私が哲学・SoT判断層を持つ
2禁則の定義粗2+細2:削除・リネーム・構造変更で止まる + Otake/それ以外の2層(将来の権限拡張枠を先に作る)
2.5他メンバー依頼の判定明らかOK=即実行/明らかNG=差戻し(理由つき)/曖昧=Otakeへ通知
3アーキテクチャ案④:scheduled-task + GSheetキュー + 即「受け付けました」返信 + 完了リプライ(URL付)
4-Aチャンネル単一 #yamato-site-管理1依頼=1スレッド運用
4-B依頼フォーマット完全自然言語 + 私の確認返し。Otakeは明確時スキップ
5キューDBGSheet YAMATO_Slack依頼ログ.gsheet(Notion不使用)/status 7値
6失敗時挙動自己修復2回まで。修復で内容変わる場合は依頼者確認。それ以上は要対応+Otakeメンション
7進捗通知開始+完了の2点のみ(途中通知なし)
8他経路併用Slack + 既存Claude Code対話(CLI)併用
9完了通知テキスト + 変更要約 + before/afterサムネ + 更新URL
10Slack App新規Appを作る(既存review_monitor用とは分離)。ヤマト本体ワークスペース、本番直で開始
11実装フェーズP0・P1・P2 を本日中/P3以降は別日

3. C型ハイブリッドの判定ロジック

依頼受信時のフローチャート

受信
  ├─ 依頼者 == Otake?
  │   ├─ YES → アクション種別チェック
  │   │   ├─ 追加・差替 → 即実行
  │   │   └─ 削除・リネーム・構造変更 → スレッドで「実行していい?」確認
  │   │
  │   └─ NO(他メンバー)→ 私が内容を判定
  │       ├─ 明らかにOK(哲学・SoT・運営情報と整合)
  │       │   └─ アクション種別チェック
  │       │       ├─ 追加・差替 → 即実行
  │       │       └─ 削除・リネーム・構造変更 → Otakeへエスカレ
  │       ├─ 明らかにNG(哲学違反・施設情報の誤りなど)
  │       │   └─ 差戻し(理由つきで丁寧にスレッド返信)
  │       └─ 曖昧(判断つかない)
  │           └─ Otakeへ通知+判断仰ぐ

判定材料: その場で関連する哲学MD・SoT・memory feedback だけを引く(重い全件Readはしない)。
例: 画像差替なら design_refs/member_guide_photos.mdscripts/build_member_guides.py の該当施設エントリだけ。

4. GSheetキューの設計

ファイル

YAMATO_Slack依頼ログ.gsheet(My Drive直下/タイトル要相談)

列スキーマ

名前
A受信時刻2026-05-24 15:23:10
B依頼者Otake / 森下 / 他
CSlack URLhttps://yamato.slack.com/archives/.../p...
D本文館山ガイドの到着の章の写真を添付のに差し替えて
E対象サイトtateyama-guide
Fアクション種別差替 / 追加 / 削除 / リネーム / 構造変更 / 文言修正
G関連ファイルarrival_v2.jpg(Slack添付URL)
Hstatus新規→確認待ち→承認済→処理中→完了/差戻し/要対応
I完了時刻2026-05-24 15:27:48
J結果URLhttps://yamato-tateyama-guide.pages.dev/arrival/
Kbefore=IMAGE(...)
Lafter=IMAGE(...)
M備考自己修復1回(リサイズ)等

status 7値の遷移

新規        ← Worker が行追加した直後
  ↓
確認待ち    ← 他メンバー依頼で曖昧→Otake通知中/確認返し中
  ↓
承認済      ← Otake判断 or 確認返しに対する依頼者OK
  ↓
処理中      ← 私がファイル編集・ビルド・デプロイ実行中
  ↓
完了        ← Slackに完了報告済み

別系列:
差戻し      ← 明らかNGで差し戻したケース(理由は備考列)
要対応      ← 自己修復2回失敗 or 構造変更系で停止中

競合対策

scheduled-task は「status=新規 の行を取得 → 最初に status=処理中(or 確認待ち)に書き換え → 処理開始」の順で動かす。書き換えがアトミックなら二重処理を回避できる。

5. 完了通知のフォーマット

Slackスレッドへの完了報告は下記テンプレート。

✅ 完了しました

【変更要約】
館山ガイド > 到着の章 > メイン写真
旧: arrival_old.jpg
新: arrival_v2.jpg(添付いただいたもの)

【確認URL】
https://yamato-tateyama-guide.pages.dev/arrival/

【before / after】
(画像2枚をSlackに直接アップロード)

: 文言修正など画像差分が成立しない依頼の場合は before/after を省略し、変更要約だけリッチに書く。

6. Slack App の作成と権限

新規App名(案)

必要スコープ(OAuth & Permissions → Bot Token Scopes)

スコープ用途
app_mentions:read@yamato-site メンションを拾う
chat:writeスレッドへ返信投稿
files:read依頼者がアップロードした画像・ファイルをダウンロード
files:writebefore/afterサムネをSlackにアップロード
channels:historyスレッド内の前後文脈を読む(追加情報の解釈用)
reactions:read👍リアクションでの承認検知(将来用)

Event Subscriptions

インストール

7. 実装フェーズ — 本日のスコープ

P0 · 土台

本日の前半

  1. Slack App 作成(Otakeさん作業 / 私が manifest.json と手順メモ提供)
  2. GSheet YAMATO_Slack依頼ログ.gsheet 作成(私が gspread で生成)
  3. Cloudflare Worker 受け口の作成(pages-functions or 専用Worker)
  4. scheduled-task 登録:ClaudeAuto_site_slack_poll(5分おき)
  5. SCHEDULED_TASKS.md 更新
P1 · 受信→記録のみ

本日の中盤

  1. Worker が Slack app_mention イベントを受信
  2. イベントペイロードを GSheet に行追加(status=新規)
  3. 「📥 受け付けました」をスレッドに即返信
  4. 添付ファイルがあれば GDrive の作業フォルダにダウンロード保存し、パスを G列に記録

この時点でまだ実処理はしない。GSheetが正しく埋まり、Slack返信が出ることだけ確認する。

P2 · 手動処理ループ

本日の後半〜数日運用

  1. 私が GSheet を眺めて、status=新規 の行を手で処理(編集・ビルド・デプロイ)
  2. 処理ごとに status を順次更新(処理中→完了)
  3. 完了したら手動で Slack スレッドに完了報告(テンプレ通り)
  4. 1週間ほど運用して「実際にどんな依頼が飛んでくるか」を観察

P2運用ログから「依頼の8割パターン」を抽出して、P3の自動化設計に活かす。

P3 · 自動処理(別セッション)

P2で得たパターンを元に

P4 · 完成形(さらに先)

8. 未確定・保留事項

9. 関連資産(実装時に参照)

種類パス/URL用途
既存Slack push実装scripts/review_monitor/slack_notifier.pychat.postMessage 呼び出しの実装例
環境変数.envSLACK_BOT_TOKEN既存(review_monitor用)。新Appのトークンは SLACK_SITE_BOT_TOKEN として別途追加
SoT(施設定義)scripts/build_member_guides.py FACILITIES dict11施設のフィールド・theme・photo_picks
写真選定哲学design_refs/member_guide_photos.md5スロット・ステータス4段階
デプロイ先マップDEPLOY_TARGETS.mdCloudflare/Netlify使い分け
スケジューラ規約SCHEDULED_TASKS.mdClaudeAuto_<cat>_<slug> 命名
前段の引き継ぎ2026-05-24-slack-bot-architecture.html論点提示の元資料

10. 着手チェックリスト

Otakeさん側
  1. Slack App 新規作成(manifest は私が用意)
  2. ヤマト本体ワークスペースへインストール
  3. プライベートチャンネル #yamato-site-管理 作成・bot招待
  4. Bot Token を私に共有(.env へ追加)
私(Claude)側
  1. GSheet YAMATO_Slack依頼ログ.gsheet 作成(gspread)
  2. Cloudflare Worker / yamato-admin Functions に受け口実装
  3. scheduled-task ClaudeAuto_site_slack_poll を登録
  4. SCHEDULED_TASKS.md 更新
  5. Slack App manifest.json と手順書を Otake さんに渡す