Skip to content

スプリント m8e - #495

Merged
takemi-ohama merged 14 commits into
mainfrom
sprint/m8e
Oct 15, 2026
Merged

takemi-ohama merged 14 commits into
mainfrom
sprint/m8e

Conversation

@takemi-ohama

@takemi-ohama takemi-ohama commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

スプリント m8e の課題を main へ取り込む。

利用者向けの変化

  • 無し

移行の手順

  • 無し

課題と設計

コミット

変更の統計

 tests/containers/docker_images.py                  |  36 ++
 tests/containers/dockerfile_parse.py               |  24 +
 tests/containers/test_base_dockerfile_fonts.py     |  26 +-
 .../containers/test_base_dockerfile_shellcheck.py  |  23 +-
 tests/containers/test_base_image_font_matching.py  |  19 +-
 tests/containers/test_base_image_link_stage.py     |  17 +-
 .../containers/test_base_image_without_browser.py  |  20 +-
 tests/containers/test_browser_image.py             |  20 +-
 tests/editor/test_opener.py                        |   4 +-
 tests/volume/conftest.py                           |  13 +-
 tests/volume/test_compose_dev_environment.py       |  15 +-
 tests/volume/test_compose_secret_env.py            |  11 +-
 tests/volume/test_manager_ensure_volumes.py        |  14 +-
 tests/volume/test_manager_vscode.py                |  14 +-
 26 files changed, 715 insertions(+), 525 deletions(-)

テスト(supervise.py の run のステップ)

ステップ exit 最後の行
collect 0

集めた実装の PR

閉じる課題

Closes #365
Closes #452
Closes #490

検査の結果(conductor が足した)

モード: standard / 通した工程: 実装 → Pull Request

🤖 Generated with Claude Code

配布の記録

段階: 本番(2026-10-15 22:21 JST、main へのマージで反映。承認ゲート 2 を同日利用者が承認)
版: 4.1.0 → 版数を上げない(main = 94b5431 を配布、確定仕様化 #496 で 886d552。タグ・GitHub Release は利用者の判断で切らない)
スプリント: PR #492 / #493 / #494 / #495

takemi-ohama and others added 13 commits October 15, 2026 17:52
Remote-SSH で DEVBASE_EDITOR_SSH_HOST を空にしたときのフラット URI のテストで、
project_name・workdir と URI の末尾のアサーションに作成者の個人のプロジェクト名が
残っていた。#294 の置き換えの表に足した myapp-ml へ揃える。確かめる内容は変えない。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#365 を実装する(スプリント m8e)
#463 で VS Code Server のボリュームが共通の 1 本になり、project_name は
どこからも読まれていなかった。呼び出し元とテストの引数の受け渡しの期待を
合わせて直す。ボリュームの名前・作る順・作る数は変わらない。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
devbase_prune_vscode_server_bin にあった 3 つの選別規則(古い版の削除・
入れ子の本体の削除・展開の途中のディレクトリの削除)を、それぞれの関数へ
分ける。devbase_prune_vscode_server_bin の名前・引数・出力・消す対象は
変わらない。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#490 を実装する(スプリント m8e)
R9・R10 で _devbase_completions の分岐を関数へ移す前に、既存のテストが
見ていない分岐(env のフラグ・plugin と snapshot の引数・container scale・
プラグイン名とリポジトリ名など)の候補を、変更の前のコードで通る形で縛る。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- R1: cmd_env_keygen の中の DevbaseError の取り込み直しを消す
- R2: _aws_plan_for_selection の選んだプロファイルの計画を先頭で 1 回だけ組む
- R3: 丸ごとの計画を _aws_whole_plan に置き、_aws_sync_plan と
  _aws_plan_for_unregistered が呼ぶ
- R5: manager.py に CONTAINER_HOME を置き、VS Code Server の 2 つの定数と
  compose.py の _DEPRECATED_TARGET をそれから作る(値は同じ)
- R9: devbase_root の解決を _devbase_resolve_root に置く
- R10: _devbase_completions を語の位置の振り分けにし、位置 2〜4 の分岐を
  グループごとの関数へ移す(候補は同じ)

tests/ は変えていない。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- R11: 補完を実行する補助を tests/cli/conftest.py の run_bash_completion・
  bash_complete に置き、3 つのファイルが使う
- R12: DEVBASE_MANAGED を tests/volume/conftest.py へ移す(値は同じ)
- R13: _Handler.do_GET を拒否と注入の _refuse_read と、応答の組み立ての
  _read_secret に分ける(段の順は同じ)
- R14: RUN ブロックへ分ける手順を dockerfile_parse.run_blocks に置く
- R15: Docker とイメージの有無を調べる手順を docker_images.image_unavailable
  に置き、4 つのファイルが接尾(建て方の案内)だけを渡す(飛ばす理由の文は同じ)

テスト関数の assert は変えていない。補助の中の assert は文字列のまま移した。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#452 を実装する(スプリント m8e)
…_build_scaled_services

dev のインスタンスへ同じ形で当てる group_volume・dev_environment・vscode_volume・
host_gateway_environment を frozen な _DevInstanceSpec にまとめ、
generate_scaled_compose で組んで _build_scaled_services・_build_dev_instance へ
そのまま渡す。振る舞いは変えない。

Item-Id: I-001
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ase_complete_env_args

`-` で始まるときだけフラグを候補にする if を env・snapshot・plugin の 11 か所で
書いていたのを、同じ振る舞いの _devbase_complete_flags "<flags>" "$cur" に
寄せる。plugin list は条件が違うので触らない。振る舞いは変えない。

Item-Id: I-002
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
reset のときの「退避を作り、作れなければ中止、作れたら全キーを消す」を
_reset_env_file に、registry の発見と集め手の順の実行を _run_collectors に
抜き出す。見出しの表示は host_import.resolve のログより前に出す順を保つため
cmd_env_init に残す。振る舞いは変えない。

Item-Id: I-003
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mpletions

進みが止まるまで待つループを _wait_until_stalled に、外側と内側の zsh の子孫を
終える後始末を _reap に、完了の記録から行ごとの結果を並べる部分を
_line_results に抜き出す。後始末は finally に残す。振る舞いは変えない。

Item-Id: I-004
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

改修計画 — devbasex/devbase #495

/ndf:cross-refactoring が提案し、改修計画し、適用した改善項目の記録である。
理由と手順は提案の時点でしか残らないため、公開の直前に書き出している。

  • 件数: 採用 4・未確認 0・取り消し 0・見送り 0(最終ゲート: passed)
  • 公開: 3d82b4d を push した
  • 書き直した時刻: 2026-10-15T18:46:52
  • 対象範囲: containers/base/entrypoint.sh, etc/devbase-completion.bash, lib/devbase/commands/container.py, lib/devbase/commands/env.py, lib/devbase/volume/compose.py, lib/devbase/volume/manager.py, tests
  • テストの戦略: local-full(根拠 test.strategy)
  • 範囲テストの雛形: env -u DEVBASE_ROOT uv run --locked pytest -q -o junit_family=xunit1 --junitxml=build/ndf/junit.xml {paths}
  • 着手前のテスト: env -u DEVBASE_ROOT uv run --locked pytest tests/ -q -o junit_family=xunit1 --junitxml=build/ndf/junit.xml(whole)
  • 着手前のテストの結果: 通過(134.9 秒 / HEAD 51c4ac9)
  • 既存失敗の件数: 0
  • 想定最大時間: 30 分 / 改修計画の時点で使えた時間: 6.2 分
  • 実装担当: claude

改善項目

I-001 — lib/devbase/volume/compose.py#_build_scaled_services

兆候 手法 重要度 等級 提案元 状態 コミット
long_parameter_list introduce_parameter_object major high claude / codex / kiro 採用 1

なぜ: _build_scaled_services は引数が 10、_build_dev_instance は 8 ある。group_volume・vscode_volume・dev_environment・host_gateway_environment は generate_scaled_compose → _build_scaled_services → _build_dev_instance と毎回組で渡り、新しい dev の設定(#295・#463 で 1 つずつ増えた)のたびに 3 つの関数のシグネチャを直している

手順: 1. compose.py に frozen な dataclass _DevInstanceSpec(group_volume, dev_environment, vscode_volume, host_gateway_environment) を置く
2. _build_dev_instance(dev_service, dev_service_name, index, spec, secret_env_names) に変え、本体で spec の各値を読む
3. _build_scaled_services(services, dev_service, dev_service_name, scale, spec, secret_names, secret_services) に変え、_build_dev_instance へ spec をそのまま渡す
4. generate_scaled_compose で spec を組み、_build_scaled_services へ渡す(_build_volumes_section へは spec.group_volume・spec.vscode_volume を渡す)
5. tests/volume の compose 生成のテスト(非公開関数を直に呼ぶテストは無い)を打つ

I-002 — etc/devbase-completion.bash#_devbase_complete_env_args

兆候 手法 重要度 等級 提案元 状態 コミット
duplication consolidate_duplication minor high claude / codex / kiro 採用 1

なぜ: if [[ "$cur" == -* ]]; then COMPREPLY=($(compgen -W "..." -- "$cur")); fi が env(init・list・set|delete|edit・export・import)・snapshot(create・restore・rotate)・plugin(install・install の後・repo add)で 11 回書かれている。第 3 引数なしの _devbase_complete_flags "" "$cur" と同じ振る舞いで、補助があるのに使われていない

手順: 1. _devbase_complete_env_args の 5 か所を _devbase_complete_flags "" "$cur" にする
2. _devbase_complete_snapshot_args の 3 か所を同様にする
3. _devbase_complete_plugin_args の install と _devbase_complete_plugin_after_args の install・repo add を同様にする(plugin list は -* の条件が無いので触らない)
4. tests/cli/test_completion.py(c6ac5fd で各分岐の候補を固定済み)を打つ。ShellCheck を devbase-base:latest で打つ

I-003 — lib/devbase/commands/env.py#cmd_env_init

兆候 手法 重要度 等級 提案元 状態 コミット
long_method extract_method minor medium claude / codex / kiro 採用 1

なぜ: 保存先の解決・既存設定の退避と削除・対話 collector の発見と実行・保存・メタデータ更新が同居している。collector の実行は独立したまとまりで、host_import 属性による呼び分けを含む。test_env_host_import.py と test_env_store_switch.py が入口を通している。

手順: 1. reset のときの「退避を作り、作れなければ中止、作れたら全キーを消す」を _reset_env_file(env_file) -> bool に抽出する(中止のログはそのまま中へ移す)
2. 見出しの表示と registry の発見・集め手の順の実行を _run_collectors(env_file, host) に抽出する
3. cmd_env_init は両者を呼ぶだけにする
4. tests/commands/test_env_user_axis.py(reset の成功・中止)・test_env_host_import.py・test_env_init_group.py を打つ

I-004 — tests/cli/zsh_completion_harness.py#run_completions

兆候 手法 重要度 等級 提案元 状態 コミット
long_method extract_method minor medium claude / codex 採用 1

なぜ: zsh の起動・進捗監視・子孫プロセスの終了・完了行からの結果復元が1関数にある。特に後半の done/ready/pending/stuck 判定と LineResult の構築は、プロセス制御と別の責務である。test_zsh_completion_run.py は正常補完・時間切れ・プロセス後始末を確認している。

手順: 1. 進みが止まるまで待つループを _wait_until_stalled(proc, outdir, timeout) -> bool に抽出する
2. finally の中の後始末(外側の子孫と inner_pid の子孫を終える)を _reap(proc, outdir, pids) -> tuple[bytes, bytes] に抽出する
3. done・ready・stuck から LineResult を並べる部分を _line_results(lines, progress, outdir, timed_out) に抽出する
4. zsh の補完のテスト(tests/cli の zsh を使うもの)を打つ。zsh の無い環境では skip されるので、手元で走ったことを確かめる

レビューで確かめるテストの差分: tests/cli/zsh_completion_harness.py(機械で期待値が変わったか決まらなかった)

指標の測定

  • 状態: written / 言語とツールの対応: 既定(.ndf/code-metrics.json は無い) / 所要: 9.4 秒(使えた時間 90 秒 / 上限 90 秒)
  • 指標のファイル: /var/folders/qz/qxt0p_y15xv5jg4x77zmtxj80000gp/T/ndf-worktrees/devbasex--devbase/rf495/work/.cross_refactoring/code-metrics-rf495.md
言語 ツール 版 ランナー ファイル 秒 結果
python ruff-complexipy ruff 0.16.9 / complexipy 8.0.1 uvx 215 1.0 測った
shell — — — 2 — unsupported_language
重複: python symilar pylint 4.0.9 uvx 215 7.1 測った(1 箇所)
重複: shell jscpd jscpd 4.3.0 npx 2 0.9 測った(0 箇所)

時間の上限

値 中身
提案の枠の終わり(監視の上限 = 残り + 余裕) 2026-10-15T18:36:28+09:00
改修計画の枠の終わり(同上) 2026-10-15T18:39:28+09:00
テストの追加の終わり = 実装の終わり − Σ(採っていて未検証の項目の実装の見積り) 2026-10-15T18:39:27+09:00
実装の終わり = 最終ゲートの修正の打ち切り − バッファ − Σ(採っていて未検証の項目の検証の見積り) 2026-10-15T18:42:37+09:00
直しの試行の打ち切り 2026-10-15T18:50:29+09:00
想定最大時間の終わり H(子プロセスはすべてここまでに止まる) 2026-10-15T18:58:14+09:00
確かめの開始の締め切り = H − 確かめの見込み(最終ゲート修正と打ち切りの後の取り消しもここまで) 2026-10-15T18:55:59+09:00
確かめの見込み(秒。最終ゲートの確かめ 1 回。バッファの最終ゲートの全体テスト) 135
最終ゲート修正 1 回の見込み(秒。バッファの final_fix。起動は今 + この値が確かめの開始の締め切り以前のときだけ) 330
指標の測定の上限(秒。提案の枠の中から割く) 90
着手前のテスト 1 回の上限(秒) 420
範囲テスト 1 回の上限(秒) 405
手元の全体テスト 1 回の上限(秒) 420
CI の待ちの上限(秒) 324
余裕(秒。手順の上限と CLI の上限に足す) 90

入力: 予算 30 分 / 全体テストの所要 w 139.8(ndf-record) / 着手前の実測 x 134.9 / CI の壁時計 c 108.0 / 範囲テストの所要 s None(—) / 戦略 local-full

無音の打ち切りは手順の監視の上限と同じ値である。項目ごとの期限は持たない(実装を止めるのは実装の終わりだけ)。

見送った提案

対象 兆候 理由 根拠(MVV) 補足
lib/devbase/volume/manager.py#get_volume_for_index dead_code budget Vision 見積り 0.8 分が残りに入らない
lib/devbase/commands/container.py#_run_scale_pipeline magic_value budget Vision 見積り 1.1 分が残りに入らない
lib/devbase/volume/manager.py#get_ai_volume_for_index inconsistent_naming budget Vision 見積り 1.1 分が残りに入らない
tests/volume/test_compose_secret_env.py#_clear_devbase_env duplication budget Vision 見積り 1.1 分が残りに入らない
lib/devbase/commands/container.py#_devbase_root duplication budget Vision 見積り 1.2 分が残りに入らない
lib/devbase/commands/container.py#cmd_down duplication budget Vision 見積り 1.2 分が残りに入らない
lib/devbase/volume/manager.py#VolumeManager duplication budget Vision 見積り 1.2 分が残りに入らない
lib/devbase/commands/container.py#cmd_up conditional_chain budget Vision 見積り 1.2 分が残りに入らない
lib/devbase/commands/container.py#_compose_run duplication budget Vision 見積り 1.5 分が残りに入らない
lib/devbase/commands/container.py#cmd_scale duplication budget Vision 見積り 1.5 分が残りに入らない
lib/devbase/volume/compose.py#_build_dev_instance duplication budget Vision 見積り 1.5 分が残りに入らない
lib/devbase/volume/compose.py#generate_scaled_compose scattered_config budget Vision 見積り 2.7 分が残りに入らない
containers/base/entrypoint.sh#devbase_setup_aws_config long_method budget Value 2 / P1 / Vision 見積り 2.2 分が残りに入らない
lib/devbase/volume/compose.py#_drop_missing_env_files_for_all inconsistent_naming budget Value 3 見積り 1.0 分が残りに入らない
tests/volume/test_compose_dev_environment.py#generated duplication budget Vision 見積り 1.1 分が残りに入らない
tests/volume/test_compose_secret_env.py#_without_managed duplication budget 根拠なし 見積り 1.1 分が残りに入らない
etc/devbase-completion.bash#_devbase_complete_plugin_args inconsistent_naming budget 根拠なし 見積り 1.2 分が残りに入らない
lib/devbase/volume/compose.py#_apply_dev_environment duplication budget 根拠なし 見積り 1.2 分が残りに入らない
lib/devbase/volume/manager.py#get_work_volume_for_index dead_code budget Vision 見積り 1.4 分が残りに入らない
lib/devbase/commands/container.py#_run_post_start data_clump budget Mission / Value 2 見積り 1.4 分が残りに入らない
lib/devbase/commands/env.py#_record_aws_source long_method budget Vision 見積り 1.5 分が残りに入らない
tests/containers/test_base_shellcheck_ci.py#_shellcheck_commands deep_nesting budget Vision 見積り 1.5 分が残りに入らない
lib/devbase/volume/manager.py#VolumeManager.get_work_volume_for_index duplication budget Vision / Value 2 見積り 1.9 分が残りに入らない
etc/devbase-completion.bash#_devbase_completions scattered_config budget Vision 見積り 2.7 分が残りに入らない

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | APPROVE

指定範囲の27ファイルを確認し、指摘基準に該当する修正事項はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | kiro | APPROVE

27 ファイルすべてを読んだ。純粋なリファクタリング PR で、公開 API・補完の振る舞い・片付けの規則・退避の安全(PLAN51 設計 2)はいずれも保存されている。ensure_volumes/VolumeManager の project_name 削除は全呼び出し元(本体・テスト)が追従済みで、group を位置引数で渡していた経路は無い。_DevInstanceSpec・CONTAINER_HOME・env.py の抽出・entrypoint.sh の prune 分割・completion.bash の統合は、確認した範囲で等価だった。critical / major に当たる指摘(利用者経路の破壊・秘密/認可/データ/不可逆操作・設計文書との食い違い)は見つからなかった。

@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ | commit (なし)

対応件数: critical=0 / major=0 / minor=0(合計 0 件)
決着: 0 件 / 見送り: 0 件 / 却下: 0 件
CI: NONE

@takemi-ohama
takemi-ohama marked this pull request as ready for review October 15, 2026 09:53

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | claude | APPROVE

範囲の 28 ファイルを確認した。entrypoint.sh の片付けの 3 分割(残した版を標準出力で渡す形を含む)、補完の関数への移し替え、ensure_volumes/VolumeManager からの project_name の削除(呼び出し元はすべて追従済み)、_DevInstanceSpec、env.py の抽出はいずれも元の振る舞いと等価で、critical / major に当たる指摘は無い。

@takemi-ohama
takemi-ohama merged commit 94b5431 into main Oct 15, 2026
10 checks passed
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

リリース後テスト

対象の版: main 94b5431(#495 を 2026-10-15 マージ。タグは切らない。devbase --version は変わらない)
導入経路: 利用者の devbase(bin/devbase → このリポジトリの main)は origin/main と同じ 94b5431。補完はこのリポジトリの etc/ を読む
対象: 本番(main)。base イメージは建て直していない(下の「保留」)

実のイメージで確かめた形(#490)

手元の devbase-base:latest(作成 2026-10-14 03:19:58 UTC)の /entrypoint.sh は md5 5d297a96… で、main の containers/base/entrypoint.sh(50ccf895…、#493 で片付けを 3 つの関数へ分けたもの)と違う。建てたイメージは分割の前の entrypoint を持つ。 建て直しは承認の判断に回し(下の保留)、代わりに次の形で確かめた。

  • 実のイメージ devbase-base:latest を docker run し(devbase up は打たない)、main の entrypoint.sh を読み取り専用で /rv/ep-main.sh に付けた。イメージの中の /entrypoint.sh(分割の前)と main の側を、同じ用意の使い捨てボリューム rv-m8e-vscbin で DEVBASE_ENTRYPOINT_LIB_ONLY=1 で source して devbase_prune_vscode_server_bin を呼び、結果を比べた
  • 用意: 40 桁の版 7 つ(product.json の時刻を段々に)、残る版の下の入れ子の本体(product.json 付き)と普通のディレクトリ、展開の途中のディレクトリ 2 つ(2 時間前・今)、片付けの対象でないファイルとディレクトリ
  • 終わった後にボリュームは消した。利用者のボリュームには書いていない
課題 受け入れ条件 実行したこと 実行時刻(UTC) 結果
— 導入の確認 git rev-parse origin/main・イメージの /entrypoint.sh の md5 2026-10-15 13:05 合格(94b5431)。イメージの entrypoint は分割の前(建て直しは保留)
#365 1. test_opener.py の例が myapp-ml(/work/myapp-ml)に置き換わる main の tests/editor/test_opener.py(29fb0fd) 13:25 合格
#365 2. 置き換えた語が追跡されているファイルに 0 件 04f7228..94b5431 の差分から消えた語を取り出し git grep -il 13:25 合格(0 件。語は記録に書かない)
#365 3. テストの確かめる内容が変わらず通る pytest tests/editor/test_opener.py(main) 13:25 合格
#365 4. #294 の置き換えの表に 1 行 #294 の本文(閉じたまま) 13:26 合格(82 行目「作成者の個人のプロジェクト名(テストの例。#365)→ myapp-ml」)
#365 5. 全体のテスト・lint・固有の語の検査 env -u DEVBASE_ROOT uv run --locked pytest tests/ -q・uvx ruff check --select=E9,F63,F7,F82 lib・main の push の CI の Proper term check(job 116445694124) 13:12・13:21 合格(4472 passed・32 skipped、ruff 合格。固有の語は CI で語 11 語・438 ファイル・当たり 0。手元は語の一覧が無く飛ばしたため数えない)
#365 6. CHANGELOG.md を書かない git diff --stat 04f7228 94b5431 -- CHANGELOG.md 13:26 合格(差分なし)
#490 1. VolumeManager.__init__・ensure_volumes から project_name が外れる main の lib/devbase/volume/manager.py 13:27 合格(ensure_volumes(scale, group=None)。get_volume_for_index などの互換の引数は残る)
#490 2. ボリュームの名前・順・数が変わらない 全体の pytest(test_container_scale_order.py・test_manager_vscode.py・test_manager_ensure_volumes.py を含む) 13:12 合格
#490 3. 片付けが 3 つの規則ごとの関数に分かれ、名前・引数・出力・消す対象は変わらない 上の用意で、実のイメージの中で分割の前と main の entrypoint を比べた。消せないもの(root 所有の中身)を開発ユーザーで片付ける場合も比べた 13:15・13:17 合格(どちらも終了コード 0・出力なし。残ったのは新しい 5 版・入れ子の無い版 7(普通のディレクトリは残る)・今の展開の途中・対象外のもの。古い 2 版・入れ子の本体・2 時間前の展開の途中が消えた。結果の一覧は 2 つの entrypoint で一致。消せない場合は同じ WARNING: VS Code Server の片付けで消せなかった: … の 1 行で、終了コード 0)
#490 4. test_entrypoint_vscode_server.py が手を入れずに通る pytest tests/containers/test_entrypoint_vscode_server.py(main) 13:25 合格
#490 5. 建て直したイメージでの確かめ — — 保留(理由: 手元の base は分割の前の entrypoint で、建て直しは base を替える操作のため承認の判断に回した。分割した関数そのものは上の 3 で実のイメージの中で確かめた。建て直しが承認されたら、同じ用意を /entrypoint.sh に対して流し、上の結果の一覧と比べる)
#490 6. テスト・lint・shellcheck・固有の語 全体の pytest・ruff・devbase-base:latest の shellcheck containers/base/entrypoint.sh・CI の Proper term check 13:12・13:21 合格(shellcheck の指摘 0)
#490 7. CHANGELOG.md を書かない 同上の差分 13:26 合格
#452 1. 15 件が「直す」「直さない」に分かれ、直さない理由がある #494 の本文・設計(#491)。確定仕様化 #496 で R8 の理由を cli-argument-resolution.md へ移した 13:27 合格
#452 2. 直した件が基準を満たす uvx complexipy(main)・関数の行数 13:28 合格(_aws_plan_for_selection 4・_aws_plan_for_unregistered 6・do_GET 1・_refuse_read 8・_read_secret 8。CONTAINER_HOME は manager.py の 1 か所)
#452 3. 抜き出した関数も 50 行・複雑度 15・シェル 60 行以下 同上と etc/devbase-completion.bash の関数の行数 13:28 合格(Python は最長 46 行の cmd_env_keygen、シェルは最長 50 行の _devbase_complete_subcommands)
#452 4. env の各経路・スケールのファイル・snapshot list の振る舞いが変わらない 全体の pytest(main) 13:12 合格
#452 5. bash と zsh の補完の候補が変わらない 実の bash(5.3 と macOS の 3.2)を別ソケットの tmux(env -u TMUX tmux -L rv-m8e)で起動し、04f7228 と main の devbase-completion.bash で同じ行に Tab を打って画面を比べた(devbase ・devbase project ・devbase up ・devbase up proj-a -・devbase env ・devbase ct profile ・devbase pl ・devbase project ps proj-a -・devbase pl uninstall )。zsh は etc/_devbase が #495 で変わっていない(差分なし)ため、test_zsh_completion_run.py の合格で見た 13:30・13:31 合格(全 11 回で画面が一致。zsh の実行テストは飛ばされずに通過)
#452 6. 補助の移動を除き既存のテストを変えない #494 の本文 13:27 合格
#452 7. Docker が無い端末で 4 つのファイルが飛ばされ、理由が変わらない PATH から docker を外して 4 つのファイルを流した 13:29 合格(60 skipped、理由はすべて「docker が PATH に無い」)
#452 8. manager.py の変更が先頭の定数だけ git diff 04f7228 94b5431 -- lib/devbase/volume/manager.py の #452 の側(#490 の __init__・ensure_volumes は別の課題) 13:27 合格
#452 9. 表に無い関数を変えない #494 の本文・レビュー(#495) 13:27 合格
#452 10. 全体のテスト 全体の pytest(main) 13:12 合格(4472 passed)
#452 11. lint と固有の語の検査 ruff・CI の Proper term check 13:12・13:21 合格
#452 12. bash -n・zsh -n・shellcheck の指摘が増えない bash -n・zsh -n・devbase-base:latest の shellcheck -s bash を 04f7228 と main に 13:20 合格(構文 exit 0。指摘は 29 → 18 に減った)
#452 13. 実装の中で devbase up を打たず、base を建て直さない base の作成時刻(2026-10-14 03:19 UTC、m8e の前)・#494 の本文 13:05 合格

合否: 合格(受け入れ条件 26 件のうち 25 件合格。#490 の 5「建て直したイメージでの確かめ」は保留=base の建て直しの承認待ち。分割した関数の振る舞いは実のイメージの中で確かめ済み)
起票したもの: なし

@takemi-ohama

Copy link
Copy Markdown
Contributor Author

振り返り(2026-10-15)

対象: issue #365 / issue #452 / issue #490 / PR #495

スプリント m8e は、テストの例に残っていた作成者の個人のプロジェクト名の置き換え(#365)、PR #450 の構造改善で見送った 15 件の片付け(#452。直す 11・直さない 4)、PR #488 で見送った 2 件(#490。使われない project_name の引数と、VS Code Server の片付けの関数の分割)を、利用者に見える振る舞いを変えずに入れた。設計 PR は #452 だけ(#491)で、#365・#490 は本文の受け入れ条件から実装した。確定仕様化は #496(#452 の決定のうち、bash の補完の組み方と zsh の profile の分岐を関数へ寄せない理由を cli-argument-resolution.md へ移した)。

何が起きたか

観点 事実
受け入れ条件 途中で変えた条件は無い。#452 の R8 は設計で「直す」から「直さない」へ移した(決定 5。一致テストが etc/_devbase の case を字面で辿る)。承認ゲート 1 で承認済み
手戻り 構造改善は採用 4・取り消し 0・見送り 0。レビューは round 1(codex・kiro)で指摘 0 のまま収束し、1 ラウンドの収束は担当の取りこぼしがあり得るため claude だけで round 2 を足した(指摘 0)。修正のコミットは 0
見落とし 実装の PR の本文に担当の下書き(work/pr_body.md)が 3 本とも載らなかった。原因はプランの pr のステップに append が無かったこと(3 本の 5-impl-*.json の pr は diff_section だけ)。prompt には「このファイルの中身が PR の本文へそのまま入る」と書いていたが、それを実現する append を足していなかった。m8b では append を足して 3 本とも載っており、回避の手当てを m8e のプランで落とした。conductor がスプリント PR の承認の前に 3 本の本文へ足して補った(ai-plugins#1742)
見落とし #490 の受け入れ条件 5「建て直したイメージでの確かめ」はリリース後テストへ回したが、手元の devbase-base:latest(2026-10-14 作成)は分割の前の entrypoint のままで、建て直しは承認が要るためリリース後テストでも踏めなかった。代わりに実のイメージの中で main の entrypoint を source して、分割の前と同じ結果になることを確かめた(リリース後テストのコメント)。建てたイメージそのものでの確かめは保留
範囲 広げた判断・外した判断は無い。#493 の残した事項(vscode-server-volume.md のテストの表の 1 行)はスプリント PR で conductor が直した
工程 飛ばした工程は無い。設計は #452 だけ(#365・#490 は承認ゲート 1 で設計なしを承認)

context window の大きさ

層 フェーズ モデル 件数 固定費の中央値 実作業の中央値 実作業 < 固定費 最大充填の最大 目印
conductor - claude-opus-5-5 2 67362 77234 1 200133 割る候補
supervisor 仕上げ claude-opus-5-5 1 42880 92271 0 135151
層 件数 固定費の合計 実作業の合計 総消費
conductor 2 134724 154469 289193
supervisor 1 42880 92271 135151
合計 3 177604 246740 424344
  • conductor の「割る候補」: そのまま。最大充填の 200133 はスプリントの開始から承認ゲート 2 までを 1 つのセッションで通したもので、仕上げは supervisor に割っている。次のスプリントも同じ割り方で足りる

承認ゲートの差し戻し

関門 1 が 0 件・関門 2 が 0 件。

MVV を見直すか

版 1。覆し 0(閾値 3)・判定できない 0(閾値 5、続けて 0)・流出不具合 0(閾値 3)。兆候が無いため問わない(2026-10-13 の利用者の決定)。

次に変えること

変えること 落とし先 状態
ai-plugins#1742 が直るまで、実装のプランを流す前に pr のステップに append: ["{state_dir}/work/pr_body.md"] があることを確かめる(prompt に置き場を書くだけでは載らない) 次の変更で試すこと(引継ぎ文書の運用の知見。上流の直しは ai-plugins#1742) 提案(承認資料で利用者が判断)。ai-plugins#1742 へ m8e の再発の原因を追記した
イメージに入るファイル(containers/base/entrypoint.sh など)を変えるスプリントは、承認ゲート 2 の資料に「base の建て直しの要否」を載せ、リリース後テストで建てたイメージを確かめられるようにする プロジェクトの取り決め(AGENTS.md の落とし穴の行) 提案(承認資料で利用者が判断)

前回(m8d)の振り返りの「次に変えること」(変えない)は、利用者の判断のとおり変えていない。

途中で起票した課題

無し(issue-file.py by-origin で #365・#452・#490 と PR #491〜#495 を由来に検索し、devbasex/devbase に新しい課題は無い。#493 の残した事項はスプリント PR で直した)。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment