Skip to content

release: v3.8.0 tmux の名指し・シェルの設定の置き場所・スナップショットの系列と、CI と検査の網 - #293

Merged
takemi-ohama merged 1 commit into
mainfrom
release/v3.8.0
Sep 26, 2026
Merged

takemi-ohama merged 1 commit into
mainfrom
release/v3.8.0

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

概要

v3.7.0 以降に main へ入った変更を v3.8.0 として確定する。機能追加を含むため MINOR。

配布の記録

段階: 本番(2026-09-26 に利用者が v3.8.0 を切ることを承認)
版: 3.7.0 → 3.8.0(MINOR: shellcheck の同梱・tmux の名指しのコマンド・~/.shellrc.d・tmux-menu の追加)
ミッション: PR #289 / #292

含む変更(v3.7.0 以降の main へのマージ)

この PR の差分

取り消しの手段と限界

devbase は main へのマージがそのまま配布なので、各機能は既に利用者の手元へ届いている。この PR が変えるのは版数と変更履歴だけで、取り消すなら revert とタグの削除で済む。機能そのものを戻すには、それぞれの PR を revert する必要がある。

マージ後に行うこと

テスト計画

  • bin/devbase --version が devbase 3.8.0
  • uv lock --check が通る
  • CI が緑

🤖 Generated with Claude Code

- CHANGELOG の [Unreleased] を [3.8.0] - 2026-09-26 として確定し、比較リンクを足す
- base の shellcheck の版の確認が CI と同じ版を求めるようになったこと(#247)を Changed に書き、
  Added の shellcheck の項の「版は固定せず」を今の動きに直す
- pyproject.toml / lib/devbase/__init__.py / lib/devbase/cli.py / uv.lock /
  architecture.md の版数を 3.8.0 にする

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@takemi-ohama
takemi-ohama merged commit 71a81a3 into main Sep 26, 2026
14 checks passed
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

リリース後テスト

対象の版: 3.8.0(2026-09-26 15:5x JST、main 71a81a3 へのマージとタグ v3.8.0)
導入経路: 主ディレクトリで git pull --ff-only(bin/devbase --version → devbase 3.8.0)、bin/devbase build base で base を建て直し(exit=0)
検証の対象: 本番(main)

課題 受け入れ条件 実行したこと 実行時刻 結果
#216 1. どの宛先の PR でも 7 件の検査ジョブが起動する gh api .../commits/<head>/check-runs(mission/m6-ci-checks 宛の #284〜#288、main 宛の #292 #293)。ci.yml の pull_request は branches で絞らない 15:55 合格(各 7 件)。release/** 宛・任意の宛先の PR はリリース後に実例が無く、絞り込みが無いことを設定で確かめた
#216 2. main・release/・mission/ への push で起動し、それ以外では起動しない gh api .../actions/runs?branch=<b> の event 別件数 15:56 合格(main の push 71a81a3 で 7 件、release/v3.8.0 は push=1、docs/m6-ci-checks-spec は push=0)
#216 3. 検査ジョブの name が変わらず、必須チェック 5 件が照合される gh api .../branches/main/protection/required_status_checks と #292 #293 のマージ 15:55 合格(5 件が一致し、main 宛の 2 本とも待ちで残らずマージできた)
#216 4. ワークフローの記述が正しい docker run rhysd/actionlint:latest -no-color .github/workflows/ci.yml 15:57 合格 / exit=0
#216 5. ci.yml の差分が on: の節の中だけ 実装時に確認済み(#284)。リリースで ci.yml は変わっていない — 合格(リリース前の確認を引き継ぐ)
#218 1. DEV_SERVICE_NAME=bogusdev で同じ件数がすべて通る 下の 2・3 の起動に含む 16:01 / 16:12 合格
#218 2. 16 変数を実在しない値にしても同じ件数がすべて通る env <16 変数> uv run --locked pytest tests/ -q -p no:randomly 16:01 条件つき合格: 3283 passed / 40 skipped / exit=0。skip の 40 件はフォントの照合 39 件とスナップショット 1 件で、理由は「docker daemon へ繋がらない」。DOCKER_HOST=tcp://127.0.0.1:1 を与えたため、隔離の前に採る Docker の接続設定(HOST_DOCKER_ENV、確定仕様どおり)が実機の Docker を使うテストへその値を渡した。失敗は 0
#218 2'.(切り分け)DOCKER_HOST・DOCKER_CONTEXT を除く 14 変数 同上から 2 つを外して起動 16:12 合格: 3323 passed / exit=0(変数なしと同数)
#218 3. テスト中の HOME がテストごとの tmp を指し、それを確かめるテストがある test_env_isolation.py::test_home_is_per_test_tmp 15:58 合格
#218 4. 一覧に無い読み取りがあると pytest が変数名つきで落ちる test_every_env_read_is_listed / test_collector_finds_known_reads 15:58 合格
#218 5. テスト側の monkeypatch.setenv が後勝ちで効く test_test_side_setenv_wins 15:58 合格
#218 6. 変数なしの全体の件数が減らずすべて通る uv run --locked pytest tests/ -q -p no:randomly 15:58 合格: 3323 passed / exit=0
#239 1〜5. entrypoint の復号失敗・書き出し失敗、tmux-clean の分岐と異常系、tmux-first の実行元の特定の不可 pytest tests/containers/test_tmux_clean.py test_tmux_first.py test_tmux_session.py test_entrypoint_repos.py 15:56 合格: 152 passed / exit=0
#239 6. 利用者の tmux の中から走らせても、セッションとクライアントの一覧が変わらない 上を TMUX のある端末で実行し、前後の tmux list-sessions / list-clients を diff 15:56 合格(差分 0)
#239 7. test_tmux_session.py の件数が変わらずすべて通る 同上(50 件) 15:56 合格
#239 8. 新しいテストの sleep が合計 10 秒未満 --durations=3(新しいテストの最長は 1.04 秒。11.25 秒は既存の test_tmux_session の 1 件) 15:56 合格
#239 9. 全体がすべて通る #218 の 6 と同じ 15:58 合格
#247 1. 0.11.0 の既定の水準で bin/devbase bin/rc install.sh が 0 件 docker run --entrypoint shellcheck devbase-base:latest bin/devbase bin/rc install.sh(建て直した base の shellcheck は version: 0.11.0)、bin/* も 15:56 合格 / exit=0
#247 2. 抑止の指示に理由がある tests/ci/test_shellcheck_job.py::test_directive_has_reason 15:58 合格
#247 3. bin/・install.sh の検査に severity が無い grep -n severity .github/workflows/ci.yml(exit=1)、test_no_step_sets_severity 15:56 合格
#247 4. CI のログに 0.11.0 が出る main の push の run 36225161056 の ShellCheck ジョブのログ(版の確認・bin/*・install.sh の各手順に version: 0.11.0) 15:57 合格
#247 5・6. build の shell 経路・DOCKER_GID・COMPOSE_PROJECT_NAME の振る舞いが変わらない tests/cli/test_wrapper_shellcheck_fixes.py(全体の起動に含む) 15:58 合格
#247 (追加)base のビルドが shellcheck の版を確かめる bin/devbase build base のログで版の確認の手順(6/22)がキャッシュされずに走り通過。grep -Fx "version: 0.12.0" を与えると exit=1 15:57 合格
#247 7. 全体がすべて通る #218 の 6 と同じ 15:58 合格
#259 1. base の 7 本が 0.11.0 の既定の水準で 0 件 docker run --entrypoint shellcheck devbase-base:latest containers/base/{entrypoint.sh,ai-cli-aliases.sh,shellrc-dir.sh,dind,tmux-first,tmux-clean,tmux-session} 15:56 合格 / exit=0
#259 2. CI が 7 本を既定の水準で検査する ci.yml の Run ShellCheck on containers/base/ に 7 本を並べた 1 つの呼び出し。main の push の run で success 15:56 合格
#259 3・4. 対象から漏れたスクリプトはファイル名つきで落ち、シェルでないファイルは数えない test_missing_script_is_named / test_does_not_count_non_shell / test_every_base_script_is_checked_by_ci 15:58 合格
#259 5. 抑止の指示に理由がある test_base_shellcheck_ci.py::test_directives_have_reason 15:58 合格
#259 6・7. 既存のテストが件数を減らさずすべて通る 全体の起動 15:58 合格

合否: 合格(34 件中 33 件が合格、#218 の 2 は条件つき合格。DOCKER_HOST / DOCKER_CONTEXT を偽にすると、実機の Docker を使う 40 件は確定仕様どおり skip する。失敗は 0)
起票したもの: なし(確定仕様化で #291 を起票済み: ci.yml のトリガーの回帰テストが無い)

@takemi-ohama

Copy link
Copy Markdown
Contributor Author

振り返り(2026-09-26)

対象: #216 / #218 / #239 / #247 / #259(マイルストーン「02 CI と検査の網」)、PR #289・PR #292・PR #293

CI の検査を全宛先の Pull Request と統合ブランチへの push に広げた。ShellCheck は基準の版(0.11.0)の既定の水準で bin/*・install.sh・containers/base の 7 本を検査する。pytest は環境変数と HOME をテストごとに隔離し、base のシェル 3 本の異常系をテストで固定した。v3.8.0 として配布し、リリース後テストは 34 件中 33 件が合格、1 件が条件つき合格だった。

何が起きたか

context window の大きさ

測定は Claude Code の 3 つのセッション(conductor)とそのサブエージェントだけである。計画(supervise.py)が外部の CLI で回した作業は含まない。

層 フェーズ モデル 件数 固定費の中央値 実作業の中央値 実作業 < 固定費 最大充填の最大 目印
conductor - claude-opus-5-5 3 18189 178927 0 258061 割る候補
supervisor 設計 claude-opus-5-5 2 22188 111671 0 139678
supervisor その他 claude-opus-5-5 3 10428 91508 0 119423
supervisor その他 claude-sonnet-4-5-20250929 1 21187 18013 1 39200 束ねる候補
worker 調査 claude-opus-5-5 1 10452 121526 0 131978
worker 集計 claude-opus-5-5 1 10317 37957 0 48274
worker その他 claude-opus-5-5 2 9826 61790 0 75032
層 件数 固定費の合計 実作業の合計 総消費
conductor 3 54261 579782 634043
supervisor 7 117982 511419 629401
worker 4 40422 283062 323484
合計 14 212665 1374263 1586928
フェーズ supervisor supervisor の実作業 worker の件数 supervisor と worker の固定費の合計 目印
設計 1 117301 2 42030
  • conductor の「割る候補」: そのまま。3 つの会話は、カットポイントごとの引継ぎですでに割れている。最大充填の 258061 は、関門 2 までを通した会話の値である
  • sonnet の supervisor の「束ねる候補」: そのまま。1 件だけで、応答 21 の短い確認だった

用語集の変化

glossary.py diff --base 0174add --head 71a81a3

コンテキスト 足した語 廃止した語 意味を変えた語
ci トリガー・積み重ねた Pull Request・基準の版・ShellCheck の検査ジョブ・base のシェルスクリプト・検査の対象・shellcheck の指示 — 抑止の注記
test 隔離の一覧・隔離しない一覧・読み取りの集合・漏れの検査・故障の差し込み・偽の date — —
tmux 実行元のクライアント — —

docs/glossary.md は ndf 10.17.28 の render で作り直したため、表に「識別子」「廃止した識別子」の列が加わった。語の変化は上の表のとおりである。

次に変えること

変えること 落とし先 状態
完了判定で、設計が作るとしたテストの実在と、変えた振る舞いを書いている既存の確定仕様・CHANGELOG との一致を突き合わせる。受け入れ条件の前提を実装で変えたら、要求の文書も同じ PR で直す quality-gates の手順 ai-plugins#1241 として起票
round 1 の修正の後の再開で state が作り直され、修正を見るラウンドが来ない cross-review の駆動 ai-plugins#1132 へ再現条件を追記
devbase のリリース PR をマージしたら、タグの実在まで確かめる 次の変更で試すこと(運用者のメモに反映済み) この変更で反映済み

途中で起票した課題

番号 何を見つけたか 見つけた場面
devbase#290 全体テストが規模に対して重い(並列化なし・sleep(11)・entrypoint の外部起動) 全体テスト
devbase#291 ci.yml のトリガーと検査ジョブの name を固定する回帰テストが無い 確定仕様化
ai-plugins#1226 cross-refactoring の着手前テストの上限が予算の 10% 固定 構造改善
ai-plugins#1227 起点と本番が同じとき、検査のプランが関門なしで本番へマージする 検査のプランの作成
ai-plugins#638(追記) ワークツリーの取り合い 構造改善
ai-plugins#1132(追記) round 1 の修正の後に state が作り直される 振り返り(クロスレビューの記録から)
ai-plugins#1241 実装の判断が要求・設計・既存の確定仕様へ戻らない 振り返り

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant