調査基準は 2026-10-01 16:33 JST、main の 30b101f70ea31c11706ea148f7272fbc29053a69 です。開始時の作業ツリーはcleanでした。本資料と図は、このコミットのリポジトリ内容を読み取った結果であり、クラウド管理画面、稼働ホスト、実データ、ログ、資格情報には接続していません。DB旧方式の履歴基準だけはtag v2026.09.29です。
主図は「production用設定に基づく論理構成」です。コードや設定の存在と実稼働を区別し、全ての外部資源と本番プロセスは実稼働未確認として扱います。
先に押さえる結論#
- 通常のWeb/API通信も Cloudflare Edge と Tunnel を通ります。Cloudflare Accessによるスタッフ認証は
adminhostだけで、一般利用者はアプリのopaque CookieとPostgreSQLセッションで認証されます。 - 一般利用者のブラウザはAuth WorkerやOpenAIを直接呼びません。same-originのNext.js APIがAuth Workerへ、productionのAI WorkerがOpenAIへサーバー側から接続します。
- 業務データと認証秘密は別保存先です。目標・成果物・相談・アプリセッション・AIジョブは自社管理PostgreSQL、パスワードハッシュ・OTPハッシュ・同意記録はCloudflare D1です。
- productionのAI要求はPostgreSQLの永続command/jobへ入り、AI WorkerがOpenAIを呼び、結果をPostgreSQLへ反映します。送信前に氏名alias化とメール・学生ID・電話・secretの置換を行い、Responses APIには
store: falseを指定します。 - ファイルupload/object storage実装は確認できません。タスクは外部HTTPS URLを保存し、利用者がそのリンクをブラウザから直接開きます。
- blue/green、監視契約、バックアップ入力例は存在しますが、実ホスト上の稼働、Cloudflareポリシー、OpenAIアカウント設定、定常バックアップは未確認です。
- 業務PostgreSQLの主要経路は、9月29日時点の組織全体snapshotと組織共通lockから、対象別queryとentity transactionへ移行しています。通常production APIの旧snapshot mutationは遮断されています。
利用者と権限#
| 役割 | 主な用途 | サーバー側の認証・認可 | 確認範囲 |
|---|---|---|---|
member | 自分または明示的に所属するチームの目標・成果物・相談を作成・更新 | PostgreSQLのsession/user/org/membershipを照合。viewer拒否、owner/team membership、組織、cycle、編集状態をAPI側で検査 | R001、R002、R003、R015、R016 |
viewer | 許可されたチーム、提出済み成果物、handoff済みprojectを閲覧 | canWriteOwner は常に拒否。team accessと提出状態/handoffをAPI側で検査 | R001、R002、R003 |
mentor | 管理hostから支援・運用機能を利用 | Cloudflare Access assertionをproxyとroute helperで再検証し、PostgreSQLのstaff identityへ結合。一般の管理操作を許可 | R004、R008、R009、R010 |
admin | mentor機能に加え、admin-only管理操作 | 通常の有効なAccess assertionを再検証し、requireAdminOnlyStaff でroleを再検査 | R004、R008、R009 |
画面の表示制御だけを権限根拠にはしていません。上表は proxy.ts、route helper、membership check、PostgreSQL session queryで確認できたサーバー側制御です。
実行単位と責任境界#
| ID | 実行単位/サービス | 配置・技術 | 役割 | 稼働確認 | 主な根拠 |
|---|---|---|---|---|---|
| N01 | 一般利用者ブラウザ | 利用者端末 | app hostの画面・same-origin API | 役割・route実装のみ確認 | R001–R003、R015 |
| N02 | スタッフブラウザ | 利用者端末 | admin hostの管理画面 | 役割・route実装のみ確認 | R001、R004、R008 |
| N03 | Cloudflare Edge / Tunnel | Cloudflare | app/admin公開HTTPSとTunnel中継 | 設定例のみ、実resource未確認 | R005–R007 |
| N04 | Cloudflare Access | Cloudflare | admin hostのスタッフ認証 | SaaS側検証実装のみ、policy未確認 | R008–R010 |
| N05 | cloudflared | 自社ホスト上のsystemd process | 外向きTunnel接続と固定originへの中継 | unit/orchestrator実装のみ | R006、R011 |
| N06 | HAProxy | 自社ホスト上のsystemd process | loopback固定portとactive Web slot切替 | unit/config生成実装のみ | R005、R012、R013 |
| N07 | かけあい Web | Next.js/Node.js Docker container | UI、API、session、Access再検証、認可、DB更新、job投入 | blue/green設定のみ、active slot未確認 | R014–R017 |
| N08 | かけあい AI Worker | 同じNext.js imageのworker role container | durable job claim、OpenAI呼出、結果反映 | blue/green設定のみ、live worker未確認 | R017–R020 |
| N09 | 業務PostgreSQL | PostgreSQL 17 container/internal network | 業務、session、監査、AI queue/resultの正本 | compose/migrationsのみ、live DB未確認 | R021–R024 |
| N10 | 一般利用者Auth Worker | Cloudflare Workers/Hono | domain、OTP、password、reset、短命JWT | production configのみ、deployed version未確認 | R025–R027 |
| N11 | 認証D1 | Cloudflare D1 | credential/OTP/reset hash、同意、rate limit | binding/migrationsのみ、live DB未確認 | R025、R028、R029 |
| N12 | 認証メール配信 | Cloudflare Email Sending binding | OTPとreset通知 | binding/codeのみ、配信設定未確認 | R025、R030 |
| N13 | OpenAI API | 外部サービス | Responses、Embeddings、Responses web search | integrationのみ、account設定/実呼出未確認 | R031–R034 |
| N14 | 外部ファイル保管先 | 利用者指定の任意HTTPS service | ファイル本体を保持 | URL fieldのみ確認、provider未特定 | R035、R036 |
同じNext.js imageをWeb roleとWorker roleに分けています。独立したコードベースのマイクロサービスではなく、OKR_CAI_RUNTIME_ROLE と個別containerで実行責務を分離したものです。
通信と認証#
実線矢印は要求・主要データの論理方向で、応答は同じ接続を戻ります。E05だけは要求方向ではなく、cloudflared が外向きにTunnel接続を確立する方向です。E15はアプリ通信ではなく、利用者による任意のリンク遷移です。
| ID | 通信元 → 通信先 | 目的・主要データ | 通信・認証 | 状態 | 主な根拠 |
|---|---|---|---|---|---|
| E01 | N01 → N03 | 公開ページ、ログイン後画面、same-origin API。Cookie、入力、目標、成果物、相談 | HTTPS | config+実装、live未確認 | R006、R015、R037 |
| E02 | N02 → N04 | admin hostアクセス | HTTPS / Access | SaaS側実装、Access policy未確認 | R008、R010 |
| E03 | N04 → N03 | 認証済み管理要求 | Access assertion付きHTTP | 論理経路 | R008、R009 |
| E04 | N03 → N05 | 通常Web/APIを含むTunnel内の要求 | Cloudflare Tunnel | config、live未確認 | R005、R006 |
| E05 | N05 → N03 | connectorによる外向き接続確立 | Tunnel connection | 実装、live未確認 | R011 |
| E06 | N05 → N06 | public hostを固定originへ転送 | loopback HTTP :3001、Host保持 | production config、live未確認 | R005、R012、R013 |
| E07 | N06 → N07 | active Webへ転送、旧Webはdrain | loopback HTTP :3002/:3003 | production config、active slot未確認 | R012、R013 |
| E08 | N07 → N09 | session照合、業務読書き、監査、AI command/job投入 | PostgreSQL protocol。production例はTLS require | 実装+設定、live未確認 | R016、R021、R022、R038 |
| E09 | N07 → N10 | 登録OTP、登録、login、reset | HTTPS POST、service client ID/secret。productionは非loopback HTTP拒否 | 実装、live未確認 | R026、R039、R040 |
| E10 | N10 → N11 | 認証データの保存・照合、期限切れrecordの日次clean | D1 binding / Cron | 実装+設定、live未確認 | R025–R029 |
| E11 | N10 → N12 | OTPとreset通知 | Email binding | 実装+設定、live未確認 | R030 |
| E12 | N07 → N04 | Access JWTの再検証 | HTTPS JWKS、RS256、issuer/audience | 実装、実endpoint未確認 | R009、R010 |
| E13 | N08 → N09 | job claim、lease、attempt、結果materialize | PostgreSQL protocol/TLS | 実装、live未確認 | R018–R020 |
| E14 | N08 → N13 | 生成、feedback、embedding、調査 | HTTPS POST、API key、最小化済み入力、Responsesはstore:false | 実装、account設定/実呼出未確認 | R031–R034 |
| E15 | N01 → N14 | 保存済みHTTPS URLを利用者が任意に開く | Browser direct HTTPS | URL fieldのみ | R035、R036 |
公開ページ(login/register/reset/terms/privacy/health等)も保護ページ/APIも、同じapp hostの公開入口・Tunnel・HAProxy・Webを通ります。違いは、公開routeではアプリsessionの解決を省略し、保護routeではPostgreSQL sessionを要求することです。一般利用者のapp hostではCloudflare Access assertion/cookieを削除し、クライアントが偽装した x-okr-* headerも削除します(R015、R037)。
データの流れと保存#
補助図Eでは、認証・セッション、画面・業務データ、AI処理、外部ファイルの4経路を横方向に分け、どこを通り、どこへ保存されるかを示します。詳細は データの流れと保存先 にあります。
| データの種類 | 発生元 | 送信先・経由先 | 処理主体 | 永続保存先 | 一時保存・ログ・バックアップ | 削除・保持の確認範囲 | 根拠 |
|---|---|---|---|---|---|---|---|
| app session bearer | N07がlogin完了時に発行、N01がCookie保持 | N01 ↔ N03→N05→N06→N07 | Webがraw tokenをSHA-256化して照合 | N09にtoken hash、user/org/role、失効・期限。raw bearerはDB保存しない | BrowserはHttpOnly/SameSite=Lax/Secure production cookie。通常8時間。DB backup実装は未確認 | 期限・logout/reset失効は実装。backup保持は未確認 | okr-cai-saas/src/lib/session.ts:43-46,86-104,232-242,250-317、R016、R023 |
| 一般認証情報 | N01の登録/login/reset入力 | N01→N07→N10→N11、OTPはN12 | Auth Workerがdomain、OTP、PBKDF2 passwordを検証 | N11にemail、password salt/hash、credential version。OTP/reset tokenもhash。N09はauth subjectとcredential floorのみ | Worker structured logは有効、invocation log/tracesは無効設定。raw password/OTPの永続保存は実装上なし | 短命recordの日次clean実装。provider log/Time Travel/本番保持は管理画面未確認 | R025–R030、R039、R040 |
| 規約・プライバシー同意 | N01の登録 | N07→N10→N11 | Auth Workerが登録と同一atomic write | N11のdocument type/version/accepted_at | D1復旧履歴はprovider機能。実設定未確認 | policyは通常環境終了後1年以内。実運用・削除jobは未確認 | R027、R029、docs/legal/terms/02_かけあい_プライバシーポリシー_v1.6.md:147-157 |
| profile・組織・team・role | 登録、招待、管理操作 | N01/N02→N07→N09 | Web/APIとPostgreSQL repository | N09 | JSON logはbody/PIIを保存しない契約。DB backupは未確認 | policy上、目標等以外は終了後1年以内。実削除運用は未確認 | R001–R004、R022、.github/release/production-observability.v1.json:10-38 |
| 目標・成果物・提出版 | N01、N02 | N01/N02→N07→N09 | Webがrole/owner/team/org/cycleを検査 | N09のartifacts/version/submission等 | app processの一時object、Docker json-file log。binary fileは含まない | policy上は固定年数なしで必要性を定期見直し。実削除/返却運用は未確認 | R002、R003、R022、docs/legal/terms/02_かけあい_プライバシーポリシー_v1.6.md:147-157 |
| 活動記録・task進捗 | N01/N02 | N07→N09 | Web/API | N09 | log本文は監視契約上禁止 | DB schemaに保持。個別retention jobは未確認 | okr-cai-saas/db/postgres/migrations/0001_initial.sql:610-706、R024 |
| 相談本文・会話 | N01 | N07→N09(永続command)→N08→N13→N08→N09 | Webが権限・rate limit・idempotencyを検査、WorkerがAI処理 | N09のworkflow messages、command/job、生成されたassistant内容 | OpenAI送信前にalias/redaction。Web非production経路にはprocess memory response cacheがあるがproduction durable経路はPostgreSQL | OpenAI requestのstore:falseは実装確認。providerのabuse log/契約保持はrepoだけでは保証不可。policy記載は最長30日等 | R031、R032、R034、R038、okr-cai-saas/db/postgres/migrations/0001_initial.sql:472-563 |
| feedback・AI生成物 | 成果物/提出版とAI応答 | N07→N09→N08→N13→N08→N09 | Workerがfenceを再検査し業務entityへmaterialize | N09のfeedback/artifact versions等。AI runはhash、token count、provider IDs等 | provider responseは処理中memory。監査telemetryは本文ではなくhash/count中心 | app側結果は業務データと同方針。provider側保持は別確認 | R020、R022、R031、R032 |
| matching用embedding | N09のmember profile/回答等 | N08→N13 | Workerが正規化・重複排除・氏名等を最小化 | vectorは呼出結果として処理。永続vector storeは確認できず、matching結果はN09 | process内Map cache。provider側ログは未確認 | cache TTL/生存期間はprocess依存。provider保持は別確認 | R031、R033、okr-cai-saas/src/lib/admin-matching-openai.ts:23-62 |
| 企画調査 | 企画の相談・既存文脈 | N08→N13。OpenAIのweb_search toolが外部情報を検索 | OpenAI Responses API | source metadataと生成内容をN09の会話/結果へ反映 | store:false。検索先の選択・外部処理地域はアプリから制御・確認できない | provider側保持・search先はrepoから未確認 | R031、R034 |
| 外部ファイル | N01が既存ファイルのURLを登録 | URLはN07→N09。ファイル閲覧はN01→N14 direct | WebはHTTPS URL形式だけ検査 | N09にURLとfilename。ファイル本体はN14 | N14側のcache/log/backupはprovider依存 | 外部providerと利用者契約に依存し未確認 | R035、R036 |
| スタッフAccess identity | N02/Cloudflare Access | N02→N04→N03→N07、N07→N04 JWKS | Accessがedge認証、WebがJWTを再検証しN09 staff identityへ結合 | N09のstaff identity。Access側ログの有無・保持は管理画面依存 | policyは標準Access log 24時間と記載するが現契約/設定は未照会 | 実保持は未確認 | R008–R010、docs/legal/terms/02_かけあい_プライバシーポリシー_v1.6.md:103-113 |
| application/DB log | N05–N10 | container stdout/json-file、Worker observability | Docker/Cloudflare | host logまたはprovider log | app containerは10MB×5、DBは10MB×3のrotation設定。監視契約はPII/body/query禁止・30日 | blue/green container log rotationは実装。集中log sink/30日運用は未確認 | deploy/local-bluegreen/local-bluegreen.mjs:232-287、R021、R025、.github/release/production-observability.v1.json:10-38 |
| backup/recovery | N09/N11 | 想定backup repository、D1 Time Travel | 運用者/provider | 定常backup先は未確定 | policyは復旧backup 3暦月、production入力例は30日。定常pg backup jobは見つからない | 実行schedule、暗号化、offsite、復元試験、D1復旧点は未確認 | docs/legal/terms/02_かけあい_プライバシーポリシー_v1.6.md:147-157、config/pc-deploy.inputs.example.env:62-73、docs/operations/backup/backup-capacity-estimate_okr-cai-saas_2026-08-27.md:1-25 |
「国内サーバーに保存」はプライバシーポリシーの記載であり、N09の実所在地をリポジトリだけで実証したものではありません。また、N03/N04/N10/N11/N12/N13では通信処理・ログ・復旧履歴等が生じ得るため、「業務DBが国内なら全処理が国内」とは扱っていません。
環境と運用差#
| 項目 | production用設定(主図) | staging | development/local | standalone demo |
|---|---|---|---|---|
| app runtime | blue/green Web + Worker、bridge network | blue/green Web + Worker、host network | next dev/standalone、通常SaaSはPostgreSQL | 別workspace/build、sample data |
| 公開origin | loopback :3001 → HAProxy | loopback :3200 → HAProxy | localhost。公開Tunnelは必須でない | profile demo / port 3100例 |
| Web slot | :3002 / :3003 | :3201 / :3202 | 単一process | 単一demo process |
| Worker slot | :3012 / :3013 | :3211 / :3212 | role未指定ならcombined | scripted/sample AIを許可 |
| PostgreSQL | internal Docker network、TLS require例 | host公開local Docker DB、PITR代替ではない | .env.local.exampleのDB | sample store(demo限定) |
| 一般利用者認証 | Auth Worker production env + D1 | Auth Worker staging env +別D1設定 | optional dev authは非productionだけ | demo auth |
| スタッフ認証 | Cloudflare Access | Cloudflare Access | optional dev staff session | demo role |
| OpenAI key | Responses/Embeddingsを分離 | 共有を許可 | developer設定 | scripted demo可 |
| 実稼働確認 | 未確認 | 未確認 | この調査では起動せず | この調査では起動せず |
根拠: config/local-bluegreen.production.example.json:1-52、config/local-bluegreen.staging.example.json:1-48、docs/operations/bluegreen/local-bluegreen-deployment.md:3-56、okr-cai-saas/package.json:6-10、okr-cai-saas/.env.local.example:1-21,49-83,112-153、compose.yaml:1-121。
compose.yaml には単一のcombined runtimeも残ります。主図は2026-10-01時点で別途実装されているproduction用blue/green構成を選びましたが、実ホストがどちらを採用したかは確認できません。CIはbuild/test/sign/approval evidenceを作りますが、production deployment自体は外部実行が必要です(.github/workflows/promote-release.yml:420-587)。
Blue-Green Deployment構成と旧構成#
補助図C/Dは、production runtime方式の違いだけを同じ粒度で比較します。実ホスト上の採用方式を断定するものではありません。
| 観点 | Blue-Green Deployment構成 | 旧・単一runtime構成 | 根拠 |
|---|---|---|---|
| 入口 | cloudflared → 固定HAProxy :3001 | cloudflared → 単一container :3000 | R041、R042、R045 |
| 実行単位 | active slotにWeb ×1 + AI Worker ×1 | 1 combined container内にWeb/API + Worker | R043、R046–R048 |
| AI Worker container数 | 平常時1、更新中のみ新旧2 | 平常時1。更新時は旧を停止後に新を起動 | R043、R044、R045 |
| Worker内processor | feedback、generation、command materializerの3系統 | 同じ3系統がcombined process内で動作 | R046、R047 |
| 更新順序 | 空slot起動 → readiness → HAProxy切替 | 旧container停止・削除 → 新container起動 → readiness後Tunnel開始 | R044、R045 |
| 旧Web | 新規流入を止め、接続数0までdrain | container停止で終了 | R041、R044、R045 |
| AI処理中の更新 | 旧Workerが旧release処理を継続。job・attempt・command・provider leaseが全て0で停止 | combined process停止時に終了。shutdown drain既定OFF | R041、R043、R044、R049–R052 |
| DB | 新旧slotで共有するPostgreSQL | container外のPostgreSQL | R041、R042、R045、R048 |
| 更新制約 | 同じmigrationVersionの通常更新。初回移行・非互換DB変更は計画停止 | blue/greenのmigration gateと同時稼働はない | R041、R045 |
停止時間を生じさせない切替は、repositoryが定義するBlue-Green Deploymentの通常リリース手順です。可用性SLA、drain timeout超過時の継続性、強制killやhost停止、実環境での成功実績は確認していません。詳細説明は Blue-Green Deployment構成と旧・単一runtime構成の比較 にあります。
DB操作・処理の新旧方式#
補助図F/Gは業務PostgreSQLだけを対象に、read、write、AI Workerの同じ3経路で比較します。旧方式はtag v2026.09.29へ固定し、現在方式は上記の調査基準commitで確認しました。
| 観点 | 2026-09-29時点 | 現在 | 根拠 |
|---|---|---|---|
| Read | revision別cache。miss時は組織内41業務表を全量read・decode | route、actor、team、artifact等の必要行を限定SQL・cursor/LIMITで取得 | R053、R055 |
| 画面用data | 組織全AppDataからhandlerが配列検索 | 取得行だけのDTOまたはAppData互換projection | R053、R055 |
| Write lock | organization共通pg_advisory_xact_lock | 対象行lockまたはentity revision/lease CAS | R053、R056、R058 |
| Write処理 | 全量read・structuredClone後、変更aggregateを書き、組織revision更新・全量再検証 | live認可後、対象行・必要な履歴/監査/outboxだけを短いtransactionで更新 | R053、R054、R056、R058 |
| 独立write | 同じ組織なら共通lockで直列化 | 異なるentityは原則として独立。同一entityの競合だけを検出 | R053、R054 |
| AI queue | 永続job、claim、leaseは存在 | 永続構造を維持し、release条件とSKIP LOCKED claimを使用 | R019、R054、R059 |
| AI文脈 | 組織全snapshotから対象を解決 | 対象workflow graph、参照元、直近messageへ限定 | R054、R060 |
| Provider待機 | 前後のDB処理がsnapshot依存 | provider I/OをDB transaction外で実行 | R054、R060 |
| Pool保護 | lock待ちがconnectionを保持し、pool枯渇が他処理へ波及 | checkout前のbounded admission、critical予約枠、期限超過を503 + Retry-Afterへ変換 | R053、R057、R061 |
| 旧repository | 通常read/writeの中心 | import・保守・bootstrap・非本番fallback用。通常production mutationは遮断 | R054、R062 |
「対象別query」は1 SQLを意味しません。対象の認可、依存関係、最近の履歴を、複数の限定SQLで組み立てます。また、advisory lockを全廃したわけではなく、AI enqueueのsingle-flight等は対象を狭めたlockを使います。詳しい処理順と履歴ソースの再現方法は DB操作・処理の新旧比較 にあります。
主要ノード・接続の追跡方法#
主図のN01–N14・E01–E15と、補助図のZ01–Z08・ZE01–ZE10・L01–L06・LE01–LE06・F01–F21・FE01–FE17・O01–O17・OE01–OE13・C01–C17・CE01–CE13は architecture-model.json の evidenceRefs から次の根拠台帳へ追跡できます。状態の意味は次の通りです。
repository-confirmed: 実装またはschemaを確認した。実稼働を意味しない。repository-confirmed-live-unverified: production向け設定・unit・連携実装を確認したが、外部resourceやprocessの稼働は未確認。repository-confirmed-historical: Git履歴と後続の障害調査資料で旧時点の実装を確認した。repository-confirmed-staging: 実装に加えてStaging検証記録を確認した。本番稼働を意味しない。documentation: 資料上の記述。実装根拠とは区別する。
根拠台帳#
| Ref | 相対パス:行 | 種類 | 確認内容 |
|---|---|---|---|
| R001 | okr-cai-saas/src/lib/types.ts:3-13,120-143,183-196 | 実装 | member/viewer、mentor/adminの型 |
| R002 | okr-cai-saas/src/lib/route-helpers.ts:67-195 | 実装 | owner/team/org/cycle/提出状態を考慮した読書き認可 |
| R003 | okr-cai-saas/src/lib/team-membership.ts:3-21 | 実装 | 更新は明示team membershipを要求 |
| R004 | okr-cai-saas/src/lib/route-helpers.ts:198-258 | 実装 | staff/admin-only認可 |
| R005 | docs/operations/bluegreen/local-bluegreen-deployment.md:3-56 | 設定資料 | Tunnel→HAProxy→blue/green Web/Worker/PostgreSQL |
| R006 | okr-cai-saas/deploy/cloudflared-config.example.yml:1-15 | 設定例 | app/admin hostを同じloopback originへ中継 |
| R007 | okr-cai-saas/.env.local.example:49-83 | 設定例 | public host、Auth Worker、Access設定名 |
| R008 | okr-cai-saas/src/proxy.ts:68-99,101-215,268-312 | 実装 | host分離、admin hostの通常Access認証、内部rewriteでの再検証。追加のsensitive audienceは使用しない |
| R009 | okr-cai-saas/src/lib/cloudflare-access.ts:21-42,44-90 | 実装 | 単一のissuer/audience/JWKSでAccess assertionを検証 |
| R010 | okr-cai-saas/src/lib/verified-staff.ts:20-54,56-88 | 実装 | assertionの独立再検証とstaff解決 |
| R011 | deploy/local-bluegreen/local-bluegreen.mjs:1257-1284 | 実装 | readiness後のcloudflared外向き接続 |
| R012 | deploy/local-bluegreen/local-bluegreen.mjs:202-230 | 実装 | HAProxy loopback frontendとWeb slots |
| R013 | config/local-bluegreen.production.example.json:1-52 | 設定例 | production origin :3001、Web :3002/:3003、Worker :3012/:3013、network/drain/key分離 |
| R014 | Dockerfile:72-118 | 設定 | Next.js/Node.js 22 runner-saas image |
| R015 | okr-cai-saas/src/proxy.ts:385-467,469-554,721-737 | 実装 | public path、一般session、protected path |
| R016 | okr-cai-saas/src/lib/db/postgres/session-auth.ts:59-149 | 実装 | token hash indexとuser/org/membership検査 |
| R017 | deploy/local-bluegreen/local-bluegreen.mjs:232-294 | 実装 | Web/Worker container role、network、log rotation |
| R018 | okr-cai-saas/src/instrumentation.ts:9-44 | 実装 | Worker起動時のdurable processors |
| R019 | okr-cai-saas/src/lib/ai/generation-job.ts:558-725 | 実装 | 永続job、lease、claim |
| R020 | okr-cai-saas/src/lib/ai/feedback-job.ts:907-950,1123-1165 | 実装 | 結果materializeとsanitized telemetry |
| R021 | compose.production-db.yaml:1-46 | 設定 | PostgreSQL 17、volume、internal network、log rotation |
| R022 | okr-cai-saas/db/postgres/migrations/0001_initial.sql:3-67,96-159,375-595 | schema | organization/user/session/artifact/workflow/AI/feedback |
| R023 | okr-cai-saas/db/postgres/migrations/0032_password_auth_sessions.sql:20-69 | schema | password sessionとcredential floor、secret分離 |
| R024 | okr-cai-saas/.env.local.example:7-38 | 設定例 | production業務storeはPostgreSQLのみ |
| R025 | okr-cai-auth-worker/wrangler.jsonc:1-46,95-157 | 設定 | Worker/Cron/Email/D1/production env。実識別値は転載しない |
| R026 | okr-cai-auth-worker/src/index.ts:17-58,96-102 | 実装 | auth endpoints、JWKS、health、daily clean |
| R027 | okr-cai-auth-worker/src/password.ts:62-136,139-305,394-468 | 実装 | domain、OTP、register、password、login/reset |
| R028 | okr-cai-auth-worker/migrations/0003_password_credentials.sql:1-69 | schema | password/OTP/reset grant hashes |
| R029 | okr-cai-auth-worker/migrations/0004_legal_document_acceptances.sql:1-10 | schema | legal acceptance version/time |
| R030 | okr-cai-auth-worker/src/password.ts:558-584 | 実装 | Email binding送信 |
| R031 | okr-cai-saas/src/lib/ai/data-minimization.ts:18-115,117-237 | 実装 | alias/redaction/response reference validation |
| R032 | okr-cai-saas/src/lib/ai/openai-responses.ts:399-410,758-792,825-853,1286-1294 | 実装 | Responses送信、store:false、prompt hash |
| R033 | okr-cai-saas/src/lib/ai/openai-embeddings.ts:107-124,296-324 | 実装 | 最小化済みEmbedding送信 |
| R034 | okr-cai-saas/src/lib/ai/proposal-research.ts:276-309,312-319 | 実装 | Responses web searchとstore:false |
| R035 | okr-cai-saas/db/postgres/migrations/0030_project_task_output_file_url.sql:1-13 | schema | HTTPS URLだけを保存 |
| R036 | docs/operations/backup/backup-capacity-estimate_okr-cai-saas_2026-08-27.md:55-60 | 資料 | 外部ファイル本体をbackup対象に含めない |
| R037 | okr-cai-saas/src/proxy.ts:625-633 | 実装 | spoofable auth header除去 |
| R038 | okr-cai-saas/src/app/api/workflows/[sessionId]/messages/route.ts:67-168 | 実装 | production相談をpersistent commandへenqueue |
| R039 | okr-cai-saas/src/app/api/auth/login/route.ts:27-58 | 実装 | same-origin login→Auth Worker→app session |
| R040 | okr-cai-saas/src/lib/auth-worker.ts:104-192,238-324,393-399 | 実装 | service-authenticated HTTPS POST |
| R041 | docs/operations/bluegreen/local-bluegreen-deployment.md:3-38,40-47 | 設定資料 | 固定origin、blue/green Web/Worker、readiness、切替、drain、初回計画停止 |
| R042 | config/local-bluegreen.production.example.json:1-52 | 設定例 | production origin、blue/green Web/Worker ports、network、drain設定 |
| R043 | deploy/local-bluegreen/local-bluegreen.mjs:26,232-294 | 実装 | 各slotのWeb/Worker 2 role、container identity、release label、Worker drain設定 |
| R044 | deploy/local-bluegreen/local-bluegreen.mjs:583-688,985-1050,1177-1236 | 実装 | candidate Worker/Web起動とreadiness、HAProxy切替、旧slot回収、rollback |
| R045 | deploy/production/host-runtime.mjs:29-45,65-72,98-140 | 実装 | combinedの単一containerをstop/remove/create/startし、readiness後にcloudflaredを起動 |
| R046 | okr-cai-saas/src/lib/runtime-role.ts:1-33 | 実装 | role未指定時はcombined。Worker shutdown drainは未指定時false |
| R047 | okr-cai-saas/src/instrumentation.ts:9-44 | 実装 | worker/combined roleの1 process内でfeedback、generation、command materializerを起動 |
| R048 | compose.yaml:1-121 | 設定 | 単一okr-cai-saas service、loopback :3000、PostgreSQL利用、restart: no |
| R049 | okr-cai-saas/src/lib/db/postgres/runtime-control.ts:170-240 | 実装 | release別job・attempt・command・provider leaseが全て0のときdrained |
| R050 | okr-cai-saas/src/lib/ai/generation-job.ts:540-555,1979-2011 | 実装 | generation workerのrelease fenceとdrain modeでの完了待ち |
| R051 | okr-cai-saas/src/lib/ai/feedback-job.ts:235-332,950-971 | 実装 | feedback workerのrelease別claimとdrain modeでの完了待ち |
| R052 | okr-cai-saas/src/lib/ai/production-command-job.ts:557-593,869-900 | 実装 | command materializerのrelease別claimと実行中promise完了待ち |
| R053 | docs/engineering/history/100-concurrent-db-remediation-plan-2026-09-30.md:84-128 | 履歴調査 | 9月29日方式の組織共通lock、全AppData読込・clone・差分書込と、lock待ちからpool枯渇への障害連鎖 |
| R054 | docs/engineering/history/100-concurrent-db-remediation-plan-2026-09-30.md:28-38,200-239,241-330,418-438 | 実装・検証記録 | 対象別read/write/AI、CAS、通常snapshot mutation遮断、admission controlと学生側Staging結果 |
| R055 | okr-cai-saas/src/lib/db/postgres/dashboard-reader.ts:18-90,120-170 | 実装 | 主要画面を本人・担当team・対象artifact・bounded historyへ限定し、互換projectionへdecode |
| R056 | okr-cai-saas/src/lib/db/postgres/profile.ts:13-62 | 実装 | 本人プロフィールのlive認可、対象行lock、revision CAS |
| R057 | okr-cai-saas/src/lib/postgres-entity-api.ts:13-68 | 実装 | actor解決、repository側live DB認可、admission/runtime失敗とRetry-After |
| R058 | okr-cai-saas/src/lib/db/postgres/workflow-collaboration.ts:32-72,101-177,188-228 | 実装 | session/artifact/lease対象行、row lock、条件付きUPDATE。snapshot load・organization revision writeなし |
| R059 | okr-cai-saas/src/lib/db/postgres/ai-generation-jobs.ts:187-288,364-430 | 実装 | 永続AI job enqueue、release条件、FOR UPDATE SKIP LOCKED claim、lease |
| R060 | okr-cai-saas/src/lib/db/postgres/ai-workflow.ts:16-137 | 実装 | provider入力を1 workflowとsource graph・直近messageへ限定し、provider I/Oをtransaction外で実行 |
| R061 | okr-cai-saas/src/lib/db/postgres/pool-admission.ts:19-51,57-143,166-184 | 実装 | checkout前のbounded queue、期限、normal/critical予約枠、admission観測 |
| R062 | okr-cai-saas/src/lib/postgres-request-store.ts:174-217 | 実装 | 通常production HTTPのsnapshot mutationを遮断し、全量writerを保守/import・非本番へ限定 |