vercel-no-workers-sia.md
# Vercel でワーカーを動かさない — SIA(Layer 2)
> 作成: 2026-01-29
> 目的: BullMQ ワーカー・常駐プロセスを Vercel 上で動かさないことを、SIA Layer 2(デプロイによる不可能性)として文書化し、mirror サイト・GitHub で実現する。
---
## 1. ルール(構造的不可能性)
**Vercel にデプロイするアプリでは、BullMQ ワーカーや常駐プロセスを起動してはいけない。**
- **理由**: Vercel はリクエストごとにプロセスが起動・終了するモデル。常駐ワーカーが動くと Fluid Provisioned Memory / Fluid Active CPU が枯渇し、チーム全体が Paused になる(VERCEL_TEAM_PAUSED_RESOLUTION.md および one-portal の `docs/RENEW_VERCEL_RISK_ANALYSIS.md` 参照)。
- **SIA の位置づけ**: **Layer 2(デプロイによる不可能性)** — CI で「エントリポイントからワーカー起動を呼ばない」ことを検証し、違反するとデプロイを止める。
---
## 2. 禁止パターン
| 禁止 | 説明 |
| -------------------------------------------------------------------------- | -------------------------------------------- |
| `createAllWorkers()` を API ルート・instrumentation・Next エントリから呼ぶ | 常駐ワーカーが Vercel 上で動く |
| API ルート・instrumentation で BullMQ の `Worker` を new して起動する | 同上 |
| 「Vercel のときだけワーカーをスキップする」分岐に頼る | 漏れが起きる。**そもそも呼ばない**設計にする |
---
## 3. 許可パターン
| 許可 | 説明 |
| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------- |
| ワーカーは **定義・export のみ**。アプリのエントリからは **一切呼ばない** | one-portal の現状。ワーカーは別プロセス(Container PaaS)で起動する |
| パイプライン実行は **RENEW_API_URL 経由の外部 API 呼び出し**に限定する | Harvest/Capture API はプロキシまたはデモデータ返却のみ |
| ワーカーを動かす場合は **Vercel 外**(Railway / Render / Fly.io 等)で別サービスとして稼働させる | ATLAS 推奨環境に準拠 |
---
## 4. mirror サイトでの実現
- **文書化**: 本ガイド(`docs/guides/vercel-no-workers-sia.md`)でルールと理由を明示。
- **参照**: SIA、Quality Standards から「Vercel 制約」として参照。 VERCEL_TEAM_PAUSED_RESOLUTION.md から本ガイドへリンク。
- **運用**: 実装フェーズでは CLAUDE.md / レビューで「Vercel にデプロイするコードパスで createAllWorkers を呼んでいないか」を確認する。CI は対象リポジトリ(one-portal 等)で実行する。
---
## 5. GitHub での実現(CI)
Vercel にデプロイするリポジトリ(例: one-portal)で、**CI ジョブ**を追加する。
### 5.1 チェック内容
次のいずれかのファイルに `createAllWorkers(` または `createWorker(` の**呼び出し**が含まれていたら **失敗**とする。
- `src/app/**/*.ts`
- `src/app/**/*.tsx`
- `instrumentation.ts`
- `middleware.ts`
- `next.config.js` / `next.config.ts` / `next.config.mjs`
(定義のみが書かれている `src/lib/portal/queue/**` は対象外。)
### 5.2 実装
- **スクリプト**: 対象リポジトリに `scripts/check-vercel-no-workers.sh` を置き、上記パターンで grep し、マッチしたら exit 1 する。
- **ワークフロー**: `.github/workflows/ci.yml`(または `vercel-no-workers.yml`)で、PR / push 時にこのスクリプトを実行する。失敗したらデプロイ前にブロックする。
これにより、**「Vercel に載るコードパスからワーカーを起動しない」**が Layer 2(デプロイによる不可能性)として保証される。
---
## 6. 参照
- **mirror**: Vercel 課金制御の体系 — 最大公約数 — 「気づいたら課金される」を防ぐ防止・検知・上限の共通枠組み。
- **mirror**: STRUCTURAL_IMPOSSIBILITY_ARCHITECTURE.md — SIA 5 層、Layer 2 の説明。
- **mirror**: SIA_MANAGEMENT_CAPABILITIES.md — SIA の管理機能(本ルールは Layer 2 の例として追加可能)。
- **mirror**: VERCEL_TEAM_PAUSED_RESOLUTION.md — Paused の原因と解消・再発防止。
- **one-portal**: `CLAUDE.md` — 制約(Vercel・ワーカー)。
- **one-portal**: `docs/RENEW_VERCEL_RISK_ANALYSIS.md` — 設計制約・禁止事項 C-1〜C-4。