fix(build-gate): pnpm build の形骸化を修正 (push パイプライン改善 T3) - #285
Conversation
package.json の build script は `npx tsc --noEmit --pretty || true` だった。typescript が
devDependencies に無いため `npx tsc` は npm 上の同名 stub package ("This is not the tsc
command you are looking for" を出すだけ) を掴んで常に exit 1 になり、それを `|| true` が
握りつぶして exit 0 を返していた。型チェックは一度も機能しておらず、push の quality_gate
(push-runner-config.toml の build group) と Stop 品質ゲート (.claude/hooks-config.toml の
build step) は時間だけ消費する見せかけゲートだった。
方針は計画の推奨どおり (a) 実体化を採用した。(b)「TS 資産が実質サンプルのみなので build
step を削除」の前提は成り立たない: scripts/deploy-hooks.ts (190 行) は pnpm deploy:hooks
の実運用ツールで JSON parse と settings 生成を行い、scripts/e2e.ts は pnpm test:e2e の
入口。サンプルは src/sample.ts (linter hook の意図的違反 fixture) のみで、型チェックの
価値は実在する。
変更:
- typescript ^7.0.2 + @types/node ^26.1.1 を devDependencies に追加。
- tsconfig.json を新規作成 (strict / target es2022 / module esnext /
moduleResolution bundler / types node)。module: nodenext を採らないのは package.json に
"type": "module" が無く .ts が CJS 判定になり、deploy-hooks.ts の import.meta.url が
TS1470 になるため。実行系が tsx (extensionless import 可) であることに合わせた。
- build script を `npx --no-install tsc --noEmit --pretty` に変更。--no-install は既存の
lint:md (`npx --no-install markdownlint-cli2`) と同じ規約。
- 型チェック範囲は src/__tests__/ を exclude。vitest が devDependencies に無く
(pnpm test は `npx vitest run` = 実行時自動 DL) 含めると TS2307 で落ちるため。npx 自動
DL のバージョン非固定は T3 と別問題なので計画の backlog 12 に分離した。
既存 ts の型エラーは 0 だったため、コード側の修正は不要だった (計画の方針欄「型エラーなら
先に修正」は空振り)。ゲート実行コストは 0.6s (TypeScript 7 の native 実装)。Rust runtime の
変更は無いため exe の再ビルドは不要。
回帰テスト (src/hooks-stop-quality/tests/t3_build_gate_seal.rs、4 本 / 33 → 37 passed):
`|| true` 除去後は劣化経路がすべて fail-closed で落ちることを実測した (ADR-043) — 型エラー
→ exit 1 / typescript 欠落で npx が stub を掴む → exit 1 / tsconfig の include 空マッチ →
TS18003 exit 2。よってゲートが黙って green に戻る経路は「exit code の握りつぶしを build
script に足し直す」「build script を tsc 以外に差し替える」の 2 つだけに絞られるため、
テストはこの 2 経路の封鎖に専念する。tsc が型エラーを検出すること自体は TypeScript の
責務なので対象外にした。incident 状態 (build script に `|| true` を戻し typescript を
devDeps から削除) で 4 本中 2 本が逐語のメッセージで実際に FAIL することを確認済み
(推測ではない)。scripts.build 欠落時は panic させる false-green guard を入れている。
配置理由: seal 対象の package.json は push / Stop 両ゲートが共有する repo root の artifact
で単独の owner crate を持たない。build step を実行する側で、かつゲート健全性の回帰テスト
(t7_cwd_independence.rs) が既にある本 crate に置いた。
補足 (ユーザー承認済みの逸脱): tsconfig.json は hooks-pre-tool-validate の
PROTECTED_CONFIG_FILES にハードコードされており Write/Edit が exit 2 で拒否される。guard の
意図は「リンター設定を弱めてエラーを消す」抑止で、本件の「ゲートを有効化するための新規
作成」と区別できず、config 側の除外機構も無い (extra_protected_files は追加専用)。guard
自身のメッセージが指示する「ユーザーに確認を取る」を実施し、承認を得たうえで Bash 経由で
作成した。恒久対処は計画の backlog 13 に分離。
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (4)
📝 WalkthroughWalkthroughTypeScript を devDependency に追加し、 ChangesTypeScript ビルドゲート
Estimated code review effort: 3 (Moderate) | ~20 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🤖 PR Monitor 分析 (GitHub Actions バックストップ)
Applicable Findings (Critical / High / Major)(該当なし — レビュー指摘そのものが未着) Applicable Findings (Medium 以下)(該当なし) Filtered (not applicable)(該当なし) diff 概要 (軽量サマリー)
PR 本文 ( 次のアクション
|
Summary
package.jsonの build script から|| trueを除去しnpx --no-install tsc --noEmit --prettyに変更。型チェックゲートを実体化したtypescript^7.0.2+@types/node^26.1.1を devDependencies に追加し、tsconfig.jsonを新規作成 (strict / target es2022 / module esnext / moduleResolution bundler)src/hooks-stop-quality/tests/t3_build_gate_seal.rs(4 本) を追加。ゲートが silent-pass に戻る 2 経路 (exit code の握りつぶし / tsc 以外への差し替え) を封じるsrc/__tests__/を除外 (vitest が devDependency でないため)。npx 自動 DL の非決定性は計画の backlog 12 に分離docs/push-pipeline-fix-plan.mdに §4 T3 実施結果 / §8 判定記録 / backlog 12・13 を追記Context
Why: build script が
npx tsc --noEmit --pretty || trueで、typescript が devDependencies に無いためnpx tscは npm 上の同名 stub package を掴んで常に exit 1 になり、|| trueがそれを握りつぶして exit 0 を返していた。型チェックは一度も機能しておらず、push の quality_gate (push-runner-config.tomlの build group) と Stop 品質ゲート (.claude/hooks-config.tomlの build step) は時間だけ消費する見せかけゲートだった。Trigger:
docs/push-pipeline-fix-plan.md§4 T3 (2026-07-16 の push パイプライン調査で発見)。直前の T7 は PR #284。Scope decision:
scripts/deploy-hooks.ts(190 行) はpnpm deploy:hooksの実運用ツール、scripts/e2e.tsはpnpm test:e2eの入口で、型チェックの価値が実在する。実体化は ADR-043 (fail-closed) とも整合する|| true除去後は劣化経路がすべて loud に落ちる実測が根拠Validation
pre-push-review-refute): verdict=APPROVE (simplicity / security とも、1 iteration / 4m13s、fix なし)cargo test -p hooks-stop-quality: 37 pass (33 → 37)。cargo test --workspaceも全 passpnpm build= exit 0 /src/logger.tsに型エラーを注入すると exit 1 (TS2322)|| trueを戻し typescript を削除すると 4 本中 2 本が FAIL (推測ではなく実行確認)References
docs/push-pipeline-fix-plan.md§4 T3 (実施結果) / §8 判定記録 / §6 backlog 12・13補足: レビュー warning への対応
pnpm-lock.yamlの無関係 churn を指摘。確認の結果、236 行の大半は TypeScript 7 がネイティブ実装でプラットフォーム別バイナリを optional dep として配るための@typescript/typescript-<platform>エントリで T3 由来 (指摘は誤認)。一方@img/sharp-libvips-*へのlibc:追記 (約 10 行) は指摘どおり無関係で、packageManagerpin 不在による pnpm バージョン drift。いずれも機能的に無害のため本 PR では触れない (再発するなら backlog 12 に統合)Summary by CodeRabbit
改善
テスト