docs(PLAN54): base イメージに bao を入れ、コンテナから機密を読み書きする要求仕様と設計 (#169) - #175
Conversation
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S9okWVz1S7VGUsCQWVMhb3
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | kiro | REQUEST_CHANGES
設計 PR として決定の記録と処理の流れは整合しているが、要求仕様 PLAN54_bao-in-container.md の一部が「決定 1(token は環境変数 BAO_TOKEN ではなくファイル ~/.vault-token に置く)」の反映漏れで、BAO_TOKEN を環境変数で渡す旧方式のまま残っている。同一 PR 内の設計文書と矛盾し、実装者を旧方式へ誘導しうるので直したい。個別はインライン参照。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | agy | REQUEST_CHANGES
PLAN54 の要求仕様書(issues/PLAN54_bao-in-container.md)および基本設計書(issues/PLAN54_bao-in-container-design.md)を精読しました。
決定 1(token の環境変数渡し廃止と ~/.vault-token 配置への変更)に伴う仕様書側の更新漏れ、クラス図・シーケンス図における ContainerTokenPusher の責務と呼び出しの不整合、既存 CLI 体系との不整合(env コマンドの -p オプション)、および既存テスト要件(cli.py の SUBCMD_MAP)への考慮漏れについて、計 7 点のインラインコメントで修正提案を記載しています。
- 仕様: 前提 7・対象範囲・受け入れ条件 6・影響・用語に残っていた環境変数 `BAO_TOKEN` の記述を、決定 1(token は `~/.vault-token` に置く)に揃える - 設計: token の取得(`issue_token()`)と backend の判定を呼び出し側 (`_push_bao_token` / `cmd_env_token`)に置き、`ContainerTokenPusher` は `docker` だけを知る形にする。クラス図・構成要素の図・シーケンス図を揃える - 設計: `env token` の `-p PROJECT` を落とし、他の `env` サブコマンドと同じく 現在地のディレクトリで対象を決める。`--print` はコンテナを見ない - 設計: `cli.py` の `SUBCMD_MAP` / `_NO_SECRET_INJECTION` への登録を明記 - 設計: `~/.vault-token` は一時ファイルへ書いて `mv -f` で置き換える Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S9okWVz1S7VGUsCQWVMhb3
🔧 /ndf:fix サマリ (round 1)対応件数: critical=0 / major=5 / minor=5 (合計 10 件。うち 2 件は同一箇所への重複指摘) 詳細
決定の記録(決定 1〜6)の見出しは変えていない。設計文書は 304 行(上限 500)。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | kiro | COMMENT
設計・要求とも根拠の提示が丁寧で、参照している既存コード(_ensure_token/_token_expires_at @ lib/devbase/env/openbao.py、_apply_window_titles の付随処理パターン、_generate_compose_for の dev_environment、_NO_SECRET_INJECTION/SUBCMD_MAP @ cli.py、-p が store_true の真偽フラグである点、window_title.py の cp -p/_write_command/umask 077)は worktree で確認でき整合しています。実装は含まない設計 PR のため issue_token/_push_bao_token/container_token.py が未存在なのは前提どおり。
修正提案は 1 点のみ(インライン参照):
issues/PLAN54_bao-in-container-design.md:305—containers/*/Dockerfileの本数と末尾 USER の記述が実態(10 本、うち snapshot は root で USER 行なし)と食い違う。$HOME前提の根拠なので数と対象範囲を実態に合わせて修正。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | REQUEST_CHANGES
修正が必要な指摘は 2 件です。
…ntext 解決、Dockerfile の本数) - `docker exec` の形を固定名の一時ファイルから `mktemp` へ変える。固定名だと既存の 0644 のファイルへ書いて `umask 077` が効かず、`~/.vault-token` が 0644 になる - `env token` が `cmd_env_exec` と同じ形で docker context を解決する手順を足す。 `up` が当てた `DOCKER_CONTEXT` は別 process の `env token` に残らない。 `--context NAME` を `env exec` と同じ `_add_context_arg` で足す - `containers/*/Dockerfile` の本数(10 本、dev イメージ 9 本、snapshot は対象外)を 実態に合わせる Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S9okWVz1S7VGUsCQWVMhb3
🔧 /ndf:fix サマリ (round 2)対応件数: critical=0 / major=2 / minor=1 (合計 3 件) 詳細
決定の記録(決定 1〜6)の見出しは変えていない。設計文書は 327 行(上限 500)。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | codex | APPROVE
指定コミットの要求仕様・設計と既存実装を照合し、修正を要する指摘はありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | agy | REQUEST_CHANGES
全体として round 1・round 2 のレビュー指摘が正確に反映され、設計の具体性と堅牢性が大幅に向上しています。
通常実行時における env token の不要なトークン発行・エラー順序の逆転防止(処理順序)と、対象コンテナ解決時の dev サービス絞り込み条件について、2点インラインで指摘しました。ご確認・反映をご検討ください。
- `env token` のログイン(issue_token)を対象の解決の後へ移し、プロジェクトの外や 起動中の dev コンテナが無いときにサーバへ token を発行させない。状況表を処理の順に並べ直す - 対象の解決を `docker ps --filter label=com.docker.compose.project=<project>` と `com.docker.compose.service` が `<dev>-<n>` のものだけに限定し、DB・snapshot など 同じプロジェクトの他サービスへ書かないことを明記。`up` 側は resolve_container_name で組む - 構成要素表・シーケンス図・テスト設計 6 を同じ順に揃える Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S9okWVz1S7VGUsCQWVMhb3
🔧 /ndf:fix サマリ (round 3)対応件数: critical=0 / major=1 / minor=1 (合計 2 件) 詳細
決定の記録(決定 1〜6)の見出しは変えていない。設計文書は 346 行(上限 500)。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 4 | kiro | REQUEST_CHANGES
要求仕様(PLAN54_bao-in-container.md:73)が対象範囲に含める docs/specifications/secret-backend.md への確定仕様追記が、設計の構成要素表・テスト設計表のどちらにも成果物として現れていない。設計を成果物リストとして辿ると実装で抜けるため、構成要素表に spec 追記の行を足すか、要求仕様の対象範囲から外す旨を明記してほしい(インライン参照)。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 4 | agy | APPROVE
設計・要求仕様ともに既存コードベース(compose 生成、docker context 解決、コンテナ名の解決、cli サブコマンド定義)と整合しており、round 1〜3 のレビュー指摘(トークン書き込みの原子的実行、env token の処理順序と dev サービス絞り込み)も適切に反映されています。修正が必要なアクションはありません。
…として載せる 要求仕様の対象範囲が含む「確定仕様の追記(plan-to-spec)」が設計の 構成要素表に無く、実装で抜ける形だった。行を足し、spec のどの節へ何を 足すか(構成要素・OpenBao との契約・env token の節・セキュリティ・運用・ テスト観点)を書いた。テスト設計にも受け入れ条件を持たない成果物として plan-to-spec 時の照合を記した。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S9okWVz1S7VGUsCQWVMhb3
🔧 /ndf:fix サマリ (round 4)対応件数: critical=0 / major=1 / minor=0 (合計 1 件) 詳細
決定の記録(決定 1〜6)の見出しは変えていない。設計文書は 349 行(上限 500)。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 5 | kiro | COMMENT
設計文書として要求仕様・既存コード(_apply_window_titles / _write_command / _NO_SECRET_INJECTION / SUBCMD_MAP / choose_context / Dockerfile の USER 構成)との整合はよく取れています。1 点、_run_deploy_pipeline の SecretStore 再利用の記述が現状のコードと現在形で食い違う箇所を inline に残しました(実装で加える変更として書き分ける提案)。ブロッカーではありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 5 | codex | REQUEST_CHANGES
修正指摘1件(minor)。
…下の env から dev サービス名を取る) - `_run_deploy_pipeline` の `SecretStore` は現行コードが保持していないことを明記し、 注入と `_push_bao_token` へ同じ store を渡す「変更」として書き直す - `devbase env token` が下位ディレクトリから打たれても `DEV_SERVICE_NAME` を拾えるよう、 対象の解決の前に解決済みプロジェクト直下の `env` から dev サービス名を取る手順を足し、 処理の順・構成要素表・シーケンス図・テスト設計 6 を揃える Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S9okWVz1S7VGUsCQWVMhb3
Summary
#169 の設計 Pull Request。実装は含まない(設計 PR のマージ後に実装用の作業ツリーで行う)。
issues/PLAN54_bao-in-container.md(受け入れ条件 10 件、非機能 3 項目、未決 1 件は設計で決定)issues/PLAN54_bao-in-container-design.md(機能 4 件、構成要素 12 件、決定 6 件、テスト設計 10 行、未確認 3 件)standard(base イメージと起動経路の 2 領域にまたがる本番の振る舞いの追加)決めたこと
issues/PLAN54_bao-in-container-design.md~/.vault-tokenに置くdevbase env tokenが行い、コンテナには資格情報を置かないBAO_ADDRは環境変数で渡し、docker execで書かないupの [5/6] の後に置き、失敗してもupを倒さないbaoは tar.gz をchecksums.txtで検証して入れ、.debは使わないbaoを入れ、backend で入れ分けないTest plan
設計の段階で確かめたこと:
openbao_2.6.2_linux_{amd64,arm64}.tar.gzとchecksums.txtがあり、tar.gz の中身はbao/CHANGELOG.md/LICENSE/README.mdの 4 つ(gh api+tar -tzf、exit=0)bao2.6.2 のバイナリに~/.vault-tokenとBAO_TOKEN_PATHの文字列がある(strings)。実サーバでの確認はリリース後テストcontainers/*/Dockerfileは 10 本。dev イメージ 9 本(base と派生 8 本)のうちUSERを書く 8 本の最後がubuntu、generalは base を継ぐ。snapshotは root だが token の届け先ではない(grep -n ^USER、round 2 で数え直し)🤖 Generated with Claude Code
https://claude.ai/code/session_01S9okWVz1S7VGUsCQWVMhb3