Uh oh!
There was an error while loading. Please reload this page.
feat: PLAN32-config-loader project.yml ローダと wire format - #104
Conversation
PLAN32 Task 1。projects/<name>/project.yml を読み、defaults 継承・既定値 補完・検証を経て正規化した ProjectConfig を返すライブラリを追加した。 コンテナへは base64 TSV の clone プランとして渡す契約 (encode/decode) も ここで確定させる。呼び出し元の差し替えは後続 PR で行うため、この PR 単体 では挙動は変わらない。 未知キー・dir 重複・primary 複数・空白混入は黙って通さずエラーにする。 project.yml が無い場合も旧 env 形式へフォールバックせず、移行コマンドを 案内するエラーにした (PLAN32 は後方互換を持たないため、移行漏れを検出 できる必要がある)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | REQUEST_CHANGES
YAML の型検証で無効値を受理する 2 箇所を修正してください。
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | gemini | REQUEST_CHANGES
ファイル読み書きの際にプラットフォーム依存のエンコーディング (Windows の CP932 など) が使われる箇所があります。UTF-8 を明示的に指定して動作を安定させてください。
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
- version: YAML の `true` が Python では `1` と等価なため bool を明示的に拒否
- defaults: `or {}` をやめ、null/未指定のみ空マッピングへ正規化
(`defaults: []` / `false` が黙って受理され型検証が素通りするのを防ぐ)
- project.yml の読み込みに encoding="utf-8" を明示し、UnicodeDecodeError は
「UTF-8 で保存してください」と案内する ConfigError に変換
- テストの write_text にも encoding="utf-8" を明示 + 上記の回帰テストを追加
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>takemi-ohama
commented
Aug 22, 2026
🔧 /ndf:fix サマリ (round 1)対応件数: critical=0 / major=1 / minor=3 (合計 4 件)
詳細
補足
再レビューをお願いします。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | REQUEST_CHANGES
スキーマ版と wire format の不正値を黙って正規化せず、境界で拒否するよう修正してください。
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | gemini | APPROVE
PR の変更は的確であり、YAML のエッジケース(true の評価や falsy 値の扱い)が正しく修正されていることを確認しました。
一点、今回追加されたエラーハンドリング(UnicodeDecodeError)について、その振る舞いを保証するテストの追加をご検討ください。
Uh oh!
There was an error while loading. Please reload this page.
- version は `type(...) is int` で判定。YAML の `1.0` は float だが `1.0 == 1` を満たすため、これまで schema version 1 として受理されていた - decode_repo_plan で init 列が `1`/`0` 以外なら ConfigError。壊れた値や将来の 未知値を「init しない」として黙って通さない - 非 UTF-8 (cp932) の project.yml が UTF-8 保存の案内を出すことをテストで固定 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
takemi-ohama
commented
Aug 22, 2026
🔧 /ndf:fix サマリ (round 2)対応件数: critical=0 / major=0 / minor=3 (合計 3 件)
詳細
補足
deferred / rejected はありません。再レビューをお願いします。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | codex | REQUEST_CHANGES
wire format を Bash の想定 consumer で欠損なく読み取れるよう修正してください。
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | gemini | APPROVE
設計意図(ホスト側での YAML 解析による依存排除や設定の集約)と、パス・機密情報等のセキュリティ要件が適切に実装されています。テストも境界値・失敗系が網羅されており高い品質です。
YAML の値の型に関するエラーメッセージの正確性について 1 点だけマイナーな提案を残しました。
Uh oh!
There was an error while loading. Please reload this page.
タブ区切りは bash の既定 IFS と同じ空白類のため、`IFS=$'\t' read -r url dir branch init` では連続区切りが 1 つに畳まれ、branch 未指定 (空フィールド) の行で init の値が branch にずれ込んでいた。区切りを US (\x1f) に変えると空白類ではない ため空フィールドが保持され、bash 側の素直な読み方がそのまま正しく動く。 あわせて符号化結果に末尾 LF を付ける。`while read` は EOF 直前の改行なし行を 読み捨てるため、末尾 LF が無いと repo 1 件構成で唯一の行が丸ごと落ちていた。 契約 (区切りは \x1f / 行区切りは LF で末尾にもあり / 各フィールドは検証済みで 空白・制御文字を含まない) を docstring と PLAN32 の wire format 節に明記し、 実際の bash を `bash -c` で起動して読ませる回帰テストを追加した (Docker 不要)。 また YAML が int として読む `repo: 123` に「必須です」と出て紛らわしかったため、 未指定と型不一致でエラーメッセージを分けた。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
takemi-ohama
commented
Aug 22, 2026
🔧 /ndf:fix サマリ (round 3)対応件数: critical=0 / major=2 / minor=1 (合計 3 件)
詳細
補足いずれも codex の指摘どおりで、手元の bash 3.2 で再現を取ってから直しました。
deferred / rejected はありません。再レビューをお願いします。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 4 | codex | APPROVE
修正が必要な事項はありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 4 | gemini | APPROVE
全体として、yaml パーサーへの依存をホスト側に留め、bash との契約に \x1f 区切りを採用した設計は堅牢です。テストも十分でよく構成されています。数点の細かいエッジケースについてのみインラインでコメントしました。
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
- 省略可能な branch に `branch: ""` を書くと「必須です」と返り矛盾していたため、 未指定 (None) / 型不一致 / 空文字 の 3 つをそれぞれのメッセージで書き分ける - `isspace()` だけでは NUL・BEL・DEL やゼロ幅空白がすり抜け、encode_repo_plan の 「制御文字を一切含まない」という契約を満たせていなかったので、印字できない文字も まとめて弾くようにした Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
takemi-ohama
commented
Aug 22, 2026
🔧 最終スイープ (/ndf:fix 104)cross-review round 4 は両 AI APPROVE で収束しましたが、その最終ラウンドで gemini が付けた minor インラインコメント 2 件はループ内 fix を通っていないため、本スイープで拾いました。 対応件数: critical=0 / major=0 / minor=2 (合計 2 件、いずれも修正) 詳細
判断メモ
追加テスト
|
# Conflicts: # issues/PLAN32_multi-repo-project.md
Summary
PLAN32 の土台となる プロジェクト設定
projects/<name>/project.ymlのローダを追加します。lib/devbase/project/config.pyload_project_config(project_dir)/parse_project_config(data, source): YAML を読み、defaultsの継承・既定値の補完・検証を経て正規化したProjectConfig/RepoSpecを返すencode_repo_plan()/decode_repo_plan(): コンテナへ渡す clone プランの wire format(base64 / US 区切り)。entrypoint との契約をこの PR で確定させる設計上の判断
未知キーはエラーにする(
brunch: mainのような typo が「設定したのに効かない」形で表れないように)project.ymlが無い場合も旧env(GIT_USER/GIT_REPO)へフォールバックしない。PLAN32 は後方互換を持たない方針であり、移行漏れを黙って動かすと検出できないため、移行コマンドを案内するエラーにするclone プランは base64 の US (
\x1f) 区切りテキスト(1 行 1 repo、末尾 LF あり)。区切りにタブを使うと bash の既定IFSと同じ空白類のため空フィールドが畳まれ、branch 未指定の行で init がずれる。entrypoint 側がbase64 -dとwhile readだけで解釈でき、コンテナイメージに YAML/JSON パーサ依存を増やさない。base64 化により compose の変数展開($)や改行で構成ファイルが壊れることも防ぐdirは/work直下の 1 階層に限定し、空白・/の混入を弾く(clone 先が/workの外へ抜けない、wire format が壊れない)plan:
issues/PLAN32_multi-repo-project.mdの Task 1release PR: release: PLAN32 1 プロジェクト = 複数リポジトリ構成への変更 (v3.0.0) #103
Test plan
uv run pytest tests/project/— 55 件(正常系: 既定値 / defaults 継承 / host 混在 / primary 明示、異常系: 必須欠落 / 型不一致 (数値のみの repo 名) / dir 重複 / primary 複数 / 未知キー / version 不一致 / dir の階層逸脱 / 空白混入 / 壊れた YAML、version が非整数 (真偽値 / float / 文字列) / defaults が非マッピング / 非 UTF-8 保存、wire format: 符号化結果・往復・末尾 LF・base64 の健全性・init 列の値検証、実 bash consumer での契約テスト:IFS=$'\x1f' readで branch 未指定行の init がずれないこと / 1 repo 構成で最後の行が落ちないこと)uv run pytest— 全 1299 件 green(既存への影響なし)