レビュー用 v1まだ実装しないELI5:5分で読める

Fast Select各ショップのThreads投稿を
「作る → 選ぶ → 毎日出す」に分ける

結論:Fast Select共通の小さな専用システムとして作り、ANON.vintageを最初の適用ショップにする。各ショップの担当者はスマホで画像を並べて承認するだけ。承認されていない画像は絶対に投稿しない。

1最初に、誤解を修正

nook-webへ組み込む

これは今回の要件ではない。公開中のnook本体と、Fast Selectの社内運用を混ぜない。

独立した専用プロジェクト

専用Cloudflare Worker・専用ストレージ・限定確認URL。障害や変更がnook本体に波及しない。

2全体の流れ|4つの駅を通るだけ

💬

① Slack

若尾さんの入口

  • リファレンス10枚
  • 修正番号を返信
  • 初稿10枚を全件確認
🐾

② Claw / Codex

制作工場

  • プロンプト化
  • Higgsfield生成
  • Codexで画像修正
  • 番号を保持
📱

③ 専用確認画面

若尾さんの編集机

  • 5〜6枚を選ぶ
  • ドラッグで並べ替え
  • 削除・差し替え
  • 最後に「承認」
🧵

④ Threads

毎日20:13に投稿

  • 承認済みだけ
  • 5〜6枚カルーセル
  • 失敗時は再試行
  • 状態を履歴化
超重要: ③で「承認」が押されるまで、④へ進む道は閉じている。AIが勝手に投稿する経路は作らない。

A採用アーキテクチャ|Cloudflareへ寄せる

👤 人の入口若尾さん・管理者 → Cloudflare Access(メールOTP)→ スマホ確認画面。Slackは素材・修正番号・通知の入口。
🐾 既存office-worker上のClaw / Codexリファレンス取得 → Higgsfield生成 → Codex修正 → 署名済みジョブとして実行し、Access Service Tokenで専用APIへ画像と商品IDをアップロード。
☁️ 1つのWorker:fast-select-threads確認画面・API・20:13 Cron・Threads投稿を1つに集約。別Worker、Queue、Azure、nook-web連携は作らない。
🗄️ R2 + D1R2は画像本体。D1は商品・画像・生成系譜・承認・再利用・投稿履歴。Threads Tokenは暗号化してD1へ保存。
🧵 Threads Graph APICronが毎日11:13 UTC(20:13 JST)に承認済み1件だけを投稿。R2画像は一覧非公開・UUID URLでMetaが取得。
📒 結果をD1へ戻すpublished / failed / needs_check、投稿ID、使用画像、使用日を記録。通信結果不明時は自動再投稿しない。
状態遷移: draft → in_review → approved → publishing → published / failed / needs_check。画像・順番・本文が変わると承認を自動解除。

B認証とSecretの置き場所

👤人 → 確認画面: Cloudflare AccessのメールOTP。許可メールだけ。独自ユーザーDBやパスワードは作らない。
🐾Claw → 専用API: Cloudflare Access Service Token。Claw端末のmacOS Keychain / Hermes Secret環境へ保存し、Slack・GitHubへ置かない。
🧵Worker → Threads: App IDは通常変数、App SecretはWorker Secret。長期Access TokenはAES-GCMで暗号化してD1へ保存する。
🔐Token暗号化鍵: TOKEN_ENCRYPTION_KEYをWorker Secretへ保存。D1には暗号文・nonce・更新時刻だけを持たせる。
🔁OAuth再連携: stateはD1へ一度だけ・短時間保存。照合後に消費し、更新Tokenも暗号化してD1へ書き戻す。
💬失敗通知: Slack Webhook / Bot Tokenを使う場合はWorker Secret。Secret値や機械ログは通知本文へ入れない。
置かない場所: Slack本文、URL、R2、GitHub、HTML、localStorage、ログ。Cloudflare Secrets StoreはOpen Betaのため初期版では使わない。

C画像を後から探せる目録

🏷️

catalog_items

商品ID、店舗キー、元システム、商品URLを保持。商品情報の正本が外部にある場合はIDとURLだけ参照する。

🖼️

assets / item_assets

R2のUUIDキーと商品を紐付ける。実物・reference・generated・revision・publishedの役割を記録する。

🌳

asset_inputs

元画像 → 初稿 → 修正版 → Threads公開画像の系譜を保存。画像だけ先に登録し、商品は後から紐付け可能。

参照方法: 画像本体はR2、画像が何の商品か・何から作られたか・いつ使ったかはD1。GET /api/items/{id}/assetsGET /api/assets/{id} で確認する。

3ELI5|裏側の道具はこう考える

🗄️

R2 = 画像ロッカー

生成画像を一時保管する場所。不採用画像は30日で掃除。Threadsが画像を取りに来る時だけ、短時間開くURLを発行する。

📒

D1 = 台帳ノート

何番の画像か、承認済みか、何日に使ったか、再利用まで3日空いたか、投稿に成功したかを記録する。

Cron + Queue = 目覚ましと待ち列

毎日20:13に起きて投稿する。失敗しても即連打せず、待ち列に戻して安全に再試行する。

4Cloudflare内の担当分け

☁️ Worker確認画面、API、20:13 Cron、Threads投稿を担当。nook-webとは別。
🗄️ R2画像本体。UUIDキー、一覧非公開、不採用30日削除、採用画像は再利用用に保持。
📒 D1商品・画像の関係、生成系譜、承認、使用日、投稿結果、暗号化Tokenを管理。
次の投稿|20:13
長押しして並べ替え
1A
2B
3C
4D
5E
6F
この順番で承認
承認後も投稿前なら取消可能

5投稿の組み方は、台帳が自動チェック

11枚目は未投稿かつクセが強い画像。最終判断は若尾さん。
22枚目以降は過去画像の再利用OK。
3再利用は3日空ける。台帳が使用日を見て候補から外す。
4同じ並びを隣接させない。直前投稿と比較して警告する。
55〜6枚だけ。不足・超過なら承認ボタンを押せない。
6承認済みだけ投稿。生成完了は投稿許可を意味しない。

6セキュリティ|合鍵を見せない

🚪確認画面: Cloudflare Accessで許可したメールだけログイン。URLを知るだけでは開けない。
🔑Threads Token: Azure Key Vault。Slack・GitHub・ブラウザURL・ログへ出さない。
🖼️Threads向け画像URL: 投稿処理の間だけ有効な期限付きURL。常設公開しない。
🧯失敗時: 投稿を止めて再試行。機械ログは流さず、人の対応が必要な時だけSlack通知。

D検討した代替案と不採用理由

Azure Key Vault

金庫としては堅牢だが、Entra App・Client Secret・権限・クロスクラウド通信が増える。

不採用:複雑さが費用を上回る

Cloudflare Secrets Store

集中管理できるが現時点でOpen Beta。初期版の基幹Token保存には採用しない。

将来再検討

Worker SecretだけでToken管理

安全だが、実行中WorkerからToken更新を書き戻しにくく、定期的な手動交換が必要。

不採用:更新運用が残る

Queue・投稿専用Worker

大量投稿には有効だが、1日1投稿では構成・監視・障害点が増える。失敗は人が再実行する。

不採用:Cronで十分

nook-webへ統合

公開サービスと社内ANON運用が結合し、デプロイ事故や権限範囲が広がる。

不採用:完全分離

生成APIをアプリへ統合

Higgsfield/OpenAIのSDK・Token・ジョブ監視・従量課金が増える。生成はClawに任せる。

不採用:制作と投稿を分離

Eコスト見積もりと増える条件

0初期の追加月額: ほぼ0円。Workers・D1・R2・Accessは現規模なら無料枠内、Threads APIは無料。
生成Higgsfield / Codex: 既存個人サブスク内。ただし無限枠・フェアユース・自動化規約の変更は容量リスク。
R2最大の将来費用: 1日23枚・2〜5MB・30日保持で約1.4〜3.5GB。無料10GB内だが、無期限保存すると超える。
対策保持ルール: 不採用30日削除、採用画像のみ保持、アップロード時にWebP/JPEG最適化。
D1台帳費用: 1日1投稿と数十画像では無料枠内。大量店舗・大量履歴検索へ拡張した時だけ再評価。
注意無料枠は変更され得る: 月次でR2容量・Worker requests・D1 rowsを確認し、閾値80%で通知する。
費用ガード: API版の画像生成へ自動フォールバックしない。サブスク枠が止まったら処理を止め、人が再開方法を選ぶ。

7現在の一時配置と移行

⚠️ コード実装は未着手、Secretだけ一時配置中

App Secretは誤ってnook-webへ、Access TokenはAzureへ保管されている。本番前に値をログへ出さず専用Cloudflareへ移す。

現在(一時)
App Secret: nook-web
Token: kv-nook-web-prod
採用構成
App Secret: Worker Secret
Token: 暗号化D1

移行時はメモリ上で復号→AES-GCM暗号化→D1読戻し一致→Threadsプロフィール確認後に旧Secretを削除する。

8レビューで決めたい5点

① 専用プロジェクト名

fast-select-threadsでよいか。

推奨:このまま

② 確認画面の入口

Cloudflare AccessのメールOTPで限定するか。

推奨:若尾さん+管理者のみ

③ 最初の投稿

初回から自動投稿か、最初の1回だけ直前確認するか。

推奨:初回だけ手動Go

④ 画像の保存期間

不採用30日、採用・投稿済みは履歴として長期保存でよいか。

推奨:このまま

⑤ 失敗通知先

投稿失敗・Token期限・承認待ちを誰へ通知するか。

推奨:若尾さん+津覇さん

費用

Higgsfield・Codexは既存サブスク。Cloudflareは現規模なら無料枠内。画像の無期限保存だけ監視する。

追加月額:ほぼ0円