docs(PLAN55): devbase up の機密の注入を 1 回にし、サーバ backend の往復を設計の想定へ収める要求仕様と設計 (#168) - #176
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 | APPROVE
設計・要求仕様ともにコードと整合していることを確認した。修正を要する指摘は無い。
検証した主な整合点:
_seenによるexists→loadの 2 度取り防止(lib/devbase/env/openbao.py:347-368のload()/exists())と、docs/specifications/secret-backend.md:164-185「OpenBao との契約」の記述が一致。_dispatch_lifecycleのfinallyにdocker_context.reset()がありrelease_store()を並べられる(lib/devbase/commands/container.py:500-565)。決定 2 の「入口で捨てない」根拠(CLI では_load_secret_envの store を捨て認証が 2 回に戻る)も入口reset()の存在と整合。- 置き換え対象
SecretStore(devbase_root)は_ensure_env_files(container.py:1308)の 1 箇所のみで、設計の構成要素表と一致。 runtime.resolve/inject/child_envは既にstore=Noneの kwarg を持ち、設計の「引数の形は変えない・None 時にstore_forを使う」と矛盾しない(runtime.py:138,255,284)。- 新設予定の
store_for/release_storeは未実装("足す" と整合)。参照テスト(tests/env/test_openbao.py::test_load_is_fetched_once_per_store_instance、tests/cli/・tests/commands/各ファイル)とFakeOpenBao(.logins/requests_of('GET')/Received.kv_path)は実在し、テスト設計が成立する。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | agy | REQUEST_CHANGES
要求仕様書(issues/PLAN55_up-single-injection.md)内の対象範囲の記述に、前提および設計文書(決定 4)での結論と矛盾する箇所が 1 件残存しています。インラインコメントの修正アクションに従い、記述の整合性を取ってください。
対象範囲「含む」の「存在判定を注入済みの結果で行う」は、前提 3 と設計の決定 4 で 棄却した旧案の文言だった。注入と同じ SecretStore(runtime.store_for)で 往復だけを無くし、判定の意味は変えない旨に改める(旧文言は取り消し線で残す)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S9okWVz1S7VGUsCQWVMhb3
🔧 /ndf:fix サマリ (round 1)対象: 未解決 thread 1 件(agy major 1 / kiro 0)。CI(55ec920 時点): 失敗なし。
deferred / rejected: なし。設計の決定( 🤖 Generated with Claude Code |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | REQUEST_CHANGES
初期化による書き込み後のキャッシュ更新について、修正を 1 件お願いします。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | kiro | COMMENT
設計は実装(env/runtime.py の store=None フォールバック、_dispatch_lifecycle の finally の docker_context.reset()、OpenBaoBackend._seen)と整合しており、SecretStore の寿命を延ばす方針・finally での release_store() 配置は既存の docker_context パターンに揃っています。設計判断そのものへの修正提案はありません。現状分析の GET 回数の前提に 1 点だけ精度の指摘をインラインで付けました。
- 設計: 決定 5 を追加。`_ensure_env_files` が子プロセスの `env init` を走らせたら `runtime.release_store()` で控えを捨て、`_run_deploy_pipeline` が現物を読む。 該当参照だけ `fetch` する案は採らない理由も記す。F4・往復表の 4 行目・ テスト設計 8・`pre-up` の未確認事項を足す - 仕様: 前提 1 の例外と前提 5、受け入れ条件 8、影響の行を揃える - 仕様: 現状分析の `_ensure_env_files` の GET を 1〜2(ローカル .env が無ければ 2)に 直し、合計を 11〜14 に改める Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S9okWVz1S7VGUsCQWVMhb3
🔧 /ndf:fix サマリ (round 2)対象: 未解決 thread 2 件(codex major 1 / kiro minor 1)。CI(5d94667 時点): 失敗なし。 対応件数: critical=0 / major=1 / minor=1 (合計 2 件)
設計の決定の見出しを 1 つ足した(決定 5)ため、PR 本文の「決めたこと」を 🤖 Generated with Claude Code |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | codex | REQUEST_CHANGES
TUI 内の機密書き込み後にも共有ストアを無効化する規則を追加してください。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | agy | APPROVE
要求仕様(PLAN55)および設計文書(PLAN55-design)を精査しました。往復回数の数え上げ、runtime.store_for/release_store のライフサイクル、決定 5 による env init 実行後のキャッシュ破棄規則、テスト設計および受け入れ条件の対応関係に不整合や欠落は見当たらず、このまま実装フェーズへ進めて問題ありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | agy | APPROVE
要求仕様書(issues/PLAN55_up-single-injection.md)および設計書(issues/PLAN55_up-single-injection-design.md)の最新コミット(6a69d28)を精査しました。
- 前提 5 および受け入れ条件 8(共通機密未作成時の
env init実行と読み直し)、設計の決定 5(env init実行後のruntime.release_store()呼び出し)の追加により、子プロセス書き込み時の整合性が正確に設計されています。 _ensure_env_filesでのプロジェクト側.env判定ロジック(ローカル.envが存在しない場合のみストアを参照する挙動)と往復数の内訳表(11〜14回、初回 8回以下等)の整合性が確認できました。- TUI 実行時、プロジェクト切替時(
apiからweb等)、ageバックエンド利用時、未作成時など各境界条件の設計が既存コードベース(lib/devbase/cli.py,lib/devbase/commands/container.py,lib/devbase/env/runtime.py等)および仕様書(docs/specifications/secret-backend.md)と矛盾なく整合しています。
修正を要する問題点は認められず、このまま実装に進めて問題ありません。
TUI の env edit / sync / init / project は dispatch_group 経由の別の SecretStore で 書くため、起動時の控えを最初の操作へ引き継ぐ旧決定 3 では edit → up が編集前の 値で起動する(codex round 3)。tui/dispatch.py の _preserve_cwd_env の入口で runtime.release_store() を呼ぶ規則に改め、F5・構成要素・往復の表・テスト設計 9 を 足した。仕様側は前提 6・受け入れ条件 9・対象範囲・影響を揃えた。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S9okWVz1S7VGUsCQWVMhb3
🔧 /ndf:fix サマリ (round 3)対象: 未解決 thread 1 件(codex major 1 / agy 0)。CI(6a69d28 時点): 失敗なし(5 check すべて success)。 対応件数: critical=0 / major=1 / minor=0 (合計 1 件)
設計の決定の見出しを 1 つ変えた(決定 3)ため、PR 本文の「決めたこと」を 🤖 Generated with Claude Code |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 4 | kiro | APPROVE
設計・要求の記述と実コードを突き合わせて検証した(_dispatch_lifecycle の finally の docker_context.reset()、_preserve_cwd_env の contextmanager 構造、OpenBaoBackend._seen/fetch の 404→空記憶、_ensure_env_files の SecretStore(devbase_root)、runtime.resolve/inject/child_env の store=None 既定、_inject_secrets が明示 store を渡さないこと)。決定 1〜5・前提 1〜6・往復回数(認証4/GET 11〜14、各経路の内訳、AC #8 の認証2/GET≤8)はいずれも整合しており、参照先ファイル・テスト名も実在を確認した。修正を要する不整合・誤記・仕様矛盾は見つからなかったため、指摘なしで承認する。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 4 | agy | APPROVE
要求仕様と設計文書の間で前提・受け入れ条件・決定事項(決定 1〜5)およびテスト設計が整合しており、修正が必要な指摘事項はありません。
Summary
#168 の設計 Pull Request。実装は含まない(設計 PR のマージ後に実装用の作業ツリーで行う)。
issues/PLAN55_up-single-injection.md(受け入れ条件 7 件、非機能 2 項目、未決 1 件は設計で決定)issues/PLAN55_up-single-injection-design.md(機能 3 件、構成要素 10 件、決定 4 件、テスト設計 8 行、未確認 2 件)standard(devbase upの起動経路の振る舞い変更。公開インタフェースは変えない)決めたこと
issues/PLAN55_up-single-injection-design.mdSecretStoreの寿命を変えるruntimeモジュールに置き、_dispatch_lifecycleのfinallyで捨てる_ensure_env_filesの存在判定の意味は変えないenv initがストアへ書いたら、控えを捨てて読み直すTest plan
設計の段階で確かめたこと:
up <name>の経路でSecretStoreが作られる 4 か所と、それぞれの認証・GET。lib/devbase/cli.py/commands/container.py/env/openbao.pyを読んだ)OpenBaoBackend._seenが同じインスタンスの中でexists→loadの 2 度取りを防いでいること(env/openbao.pyload()/exists()、tests/env/test_openbao.py::test_load_is_fetched_once_per_store_instance)_dispatch_lifecycleのfinallyにdocker_context.reset()があり、同じ場所へrelease_store()を並べられること🤖 Generated with Claude Code
https://claude.ai/code/session_01S9okWVz1S7VGUsCQWVMhb3