Skip to content

feat(ガード): 出荷される振る舞いに触れていない差分に出口を作る - #4

Merged
taniguchi-kyoichi merged 2 commits into
mainfrom
feat/inert-paths
Aug 22, 2026
Merged

taniguchi-kyoichi merged 2 commits into
mainfrom
feat/inert-paths

Conversation

@taniguchi-kyoichi

Copy link
Copy Markdown
Contributor

踏んだこと

stock-radar で README だけを直した PR を gh pr ready しようとして、ガードに止められた:

ブランチ「docs/readme-released」の先端(b5db178)に一致する提出済みの報告が無い
— judge で合格させ、submit で提出を記録してから gh pr ready を実行する

この PR には judge を通す道が無い。 証拠の語彙(compile / screenshot / interaction_log …)にも change_kind の語彙にも文書の居場所が無く、何を宣言しても judge は「確認できず」しか返せない。

回避策は「人間に Ready を押させる」しかないが、それを常用すると**ゲートは「守ると仕事が進まないもの」**になる。そうやって外される。穴は塞ぐべきところに塞ぐ。

直したもの

gate.yamlinert動かしても出荷物の振る舞いが変わらない道筋(glob)を宣言できるようにした。

inert:
  - "README.md"
  - "docs/*"

取り込みガードは gh pr ready のとき、デフォルトブランチとの分岐点から先端までの差分を数える。全部が inert の中なら提出の記録が無くても通し、1つでも外に出ていれば通常の照合に落ちて、そのファイル名を遮断の文言で名指しする

宣言を信じているのではない

通す/通さないを決めるのは宣言ではなく実際の差分で、判定はゲートがする。inert は「証拠が要らない」の申告ではなく、数える対象の宣言。ゲートの既存の姿勢(動かしたエージェント自身は判定しない)と同じ形。

保っているもの

  • merge・非ドラフト PR の作成・デフォルトブランチ直 push は inert があっても遮断のまま
  • 差分やベースを計算できないときは何もしない(遮断側に倒す)
  • inert を書いていないリポジトリの挙動は 1 ビットも変わらない

落とし穴を1つ潰した

gate.yaml の zod schema は .strict()inert を schema に足さずに hook だけ直すと、inert: を書いた瞬間にデーモンが gate.yaml ごと拒否するcheckspassline も全部効かなくなる)。schema 側にも足して、書いていなければ空になることをテストで固定した。

テスト

npx vitest run — 192 passed(guard に 7 件・schema に 1 件追加)。* がディレクトリ区切りを跨ぐこと、外に出たファイルが名指しされること、merge/直 push が遮断のままであることを含む。

版は 0.9.0 → 0.10.0

🤖 Generated with Claude Code

https://claude.ai/code/session_01J1GurcAZBrMGrG8TmALBwf

taniguchi-kyoichi and others added 2 commits August 22, 2026 10:52
README だけの変更が、レビュー可能化を永久に通れなかった。証拠の語彙(コンパイル・
スクショ・操作記録…)に文書の居場所が無いので judge は「確認できず」しか返せず、
かといって人間に押させて回避すると、ゲートは「守ると仕事が進まないもの」になる。

gate.yaml に inert(動かしても出荷物の振る舞いが変わらない道筋の glob)を宣言できる
ようにし、取り込みガードが gh pr ready のときに分岐点からの差分を数える。全部が
inert の中なら提出の記録が無くても通し、1つでも外に出ていれば通常の照合に落として
そのファイル名を名指しする。

**宣言を信じているのではない。** 通す/通さないを決めるのは実際の差分で、判定はゲートが
する。inert は「証拠が要らない」の申告ではなく、数える対象の宣言。

- gate.yaml の schema は .strict() なので、inert を知らない版は gate.yaml ごと拒否する。
  schema 側にも足した(書いていなければ空で、既存のリポジトリは何も変わらない)
- merge・非ドラフト PR の作成・デフォルトブランチ直 push は inert があっても遮断のまま
- 差分やベースを計算できないときは何もしない(遮断側に倒す)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J1GurcAZBrMGrG8TmALBwf
追加したテストのうち照会に到達する2件が、手元でゲートのデーモンが動いているかで
結果を変えていた。動いていれば「提出済みの報告が無い」まで進んで塞いだファイル名を
名指しするが、居なければ手前の「照会できない」で落ちる。ローカル緑・CI 赤になった。

他の ready テストと同じくスタブサーバー(GATE_PORT 注入)を立てる形に揃える。
inert で通る経路は照会の手前で exit 0 するので、スタブが無くても決定論的に通る。

GATE_PORT=1(照会先が居ない = CI と同じ条件)で全件 192 passed を確認。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J1GurcAZBrMGrG8TmALBwf
@taniguchi-kyoichi
taniguchi-kyoichi merged commit c302422 into main Aug 22, 2026
1 check passed
@no-problem-kyoichi

Copy link
Copy Markdown
Contributor

誤検知の修正をこの PR に混ぜた(別 PR にする案は採らない判断)。

コメント行を命令として読まない。 ゲート自身を文書化するとき、コミットメッセージや heredoc の中に語彙が出てくる。その文字列を実コマンドと誤認して遮断していた(この PR の作業中に実際に踏んだ — gate.yaml に「ガードはレビュー可能化のときに差分を数える」と書こうとして止められた)。

行頭(空白を除く先頭)が # の行はシェルが実行しないので、照合と抽出の対象から外す。

行の途中の # から先は落とさない。 落とすと git commit -m "fix #1" && gh pr merge 5 の後半が消え、遮断すべきものが素通りする。減らすのは誤検知だけで、見逃しを増やさない — テストで固定した。

あわせて、最初に CI を落とした件も直っている: 追加したテストのうち照会に到達する 2 件が手元のデーモンの有無で結果を変えていた(あれば最後の deny まで進んで塞いだファイル名が出る、なければ手前の「照会できない」で落ちる)。他の ready テストと同じスタブサーバー方式に揃えた。

GATE_PORT=1(照会先が居ない = CI と同じ条件)で 196 passed

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.

2 participants