Skip to content

fix(build-gate): pnpm build の形骸化を修正 (push パイプライン改善 T3) - #285

Merged
aloekun merged 1 commit into
masterfrom
fix/build-gate-tsc-materialize
Jul 17, 2026
Merged

fix(build-gate): pnpm build の形骸化を修正 (push パイプライン改善 T3)#285
aloekun merged 1 commit into
masterfrom
fix/build-gate-tsc-materialize

Conversation

@aloekun

@aloekun aloekun commented Jul 17, 2026

Copy link
Copy Markdown
Owner

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:

  • 計画が併記した (b)「TS 資産が実質サンプルのみなので build step を削除」は前提が成り立たないため却下した。scripts/deploy-hooks.ts (190 行) は pnpm deploy:hooks の実運用ツール、scripts/e2e.tspnpm test:e2e の入口で、型チェックの価値が実在する。実体化は ADR-043 (fail-closed) とも整合する
  • 回帰テストは「ゲートの構成」を seal し、「tsc が型エラーを検出すること」は TypeScript の責務として対象外にした。|| true 除去後は劣化経路がすべて loud に落ちる実測が根拠
  • vitest の devDep 化 (backlog 12) と保護ファイル guard の抜け道 (backlog 13) は別問題として分離した (§2 原則 4: 1 PR 1 変更)

Validation

  • pre-push review (pre-push-review-refute): verdict=APPROVE (simplicity / security とも、1 iteration / 4m13s、fix なし)
  • quality_gate 全グループ PASS: lint 1.8s / test 3.2s / build 1.1s / rust-lint-test 50.4s
  • cargo test -p hooks-stop-quality: 37 pass (33 → 37)。cargo test --workspace も全 pass
  • ゲートが実際に落ちることを実機確認: clean tree で pnpm build = exit 0 / src/logger.ts に型エラーを注入すると exit 1 (TS2322)
  • fail-closed の実測 (ADR-043): typescript を devDeps から削除 → exit 1 / tsconfig の include 空マッチ → TS18003 exit 2
  • 回帰テストが incident 状態で実際に落ちる: build script に || true を戻し typescript を削除すると 4 本中 2 本が FAIL (推測ではなく実行確認)
  • PR size 440 行 (warning 閾値 800 内)

References

  • docs/push-pipeline-fix-plan.md §4 T3 (実施結果) / §8 判定記録 / §6 backlog 12・13
  • ADR-043 (Security/Quality Gate での Fail-Closed 原則) — 実体化方針の根拠
  • ADR-049 (incident→eval 回帰スイート) — 回帰テストの流儀
  • ADR-042 (ルール vs 仕組み化の境界基準) — backlog 13 の判断軸
  • ADR-017 (takt バージョン固定) — backlog 12 の問題意識と同型
  • PR fix(hooks-stop-quality): 品質ゲートの cwd 依存を修正 (push パイプライン改善 T7) #284 (T7 / 直前タスク)

補足: レビュー warning への対応

  • simplicity-review が pnpm-lock.yaml の無関係 churn を指摘。確認の結果、236 行の大半は TypeScript 7 がネイティブ実装でプラットフォーム別バイナリを optional dep として配るための @typescript/typescript-<platform> エントリで T3 由来 (指摘は誤認)。一方 @img/sharp-libvips-* への libc: 追記 (約 10 行) は指摘どおり無関係で、packageManager pin 不在による pnpm バージョン drift。いずれも機能的に無害のため本 PR では触れない (再発するなら backlog 12 に統合)
  • security-review の warning (保護ファイル guard の bypass) は backlog 13 として自己申告済み

Summary by CodeRabbit

  • 改善

    • ビルド時にTypeScriptの型チェックを確実に実行するよう改善しました。
    • 型チェックの失敗を無視せず、問題を検出した場合にビルドが失敗するようになりました。
    • 必要なTypeScript設定と型定義を追加しました。
  • テスト

    • ビルド設定や型チェックが欠落・無効化されていないことを検証する回帰テストを追加しました。

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>
@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: c582dd91-b719-4299-aae3-a7d817c83d2c

📥 Commits

Reviewing files that changed from the base of the PR and between f228060 and a1f6cc7.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (4)
  • docs/push-pipeline-fix-plan.md
  • package.json
  • src/hooks-stop-quality/tests/t3_build_gate_seal.rs
  • tsconfig.json

📝 Walkthrough

Walkthrough

TypeScript を devDependency に追加し、tsconfig.json と fail-closed な build 型チェックを導入した。build 設定、依存関係、設定ファイルの欠落や exit code 握りつぶしを検証する Rust 回帰テストと、実施計画・バックログの記録も追加した。

Changes

TypeScript ビルドゲート

Layer / File(s) Summary
型チェック設定とビルド実行
package.json, tsconfig.json
buildnpx --no-install tsc --noEmit --pretty に変更し、typescript@types/node を追加した。型チェック対象を scripts/**/*.tssrc/**/*.ts に設定し、src/__tests__ などを除外した。
ビルドゲート回帰テスト
src/hooks-stop-quality/tests/t3_build_gate_seal.rs
build スクリプトが exit code を握りつぶさず、tsc--noEmit を含み、TypeScript の依存関係と tsconfig.json が存在することを fail-closed に検証するテストを追加した。
実施計画とバックログの更新
docs/push-pipeline-fix-plan.md
T3 の実施内容、型チェック範囲、回帰テスト、保護ガード事情、および T13-12/T13-13 の課題を追記した。

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed pnpm build の形骸化修正と push パイプラインの T3 対応を適切に表しており、変更内容と整合しています。
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/build-gate-tsc-materialize

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 PR Monitor 分析 (GitHub Actions バックストップ)

  • トリガー: issue_comment (created) / 実行 run
  • CI: CodeRabbit レビューが PENDING (処理中) のみ検出。他の GitHub Actions check は本 PR に見当たらず。mergeStateStatus: UNSTABLE(未完了 check 起因と推定)、mergeable: MERGEABLE
  • レビュー状況: CodeRabbit — レビュー未着手 (「Currently processing new changes... please wait」のプレースホルダのみ、findings 0 件)。人間レビュー・他 bot レビューなし (pulls/285/reviews 空、inline comments 空)。
  • Verdict: user_decision (レビュー指摘がまだ 0 件で確定判断材料が無く、CodeRabbit 完了待ちのため待機せず現時点情報のみで報告)

Applicable Findings (Critical / High / Major)

(該当なし — レビュー指摘そのものが未着)

Applicable Findings (Medium 以下)

(該当なし)

Filtered (not applicable)

(該当なし)

diff 概要 (軽量サマリー)

ファイル 変更 性質
docs/push-pipeline-fix-plan.md +76/-0 T3 実施結果の記録追記 (計画ドキュメント、実行系ロジック変更なし)
package.json +4/-2 devDependencies に typescript/@types/node 追加、scripts.buildnpx tsc --noEmit --pretty || truenpx --no-install tsc --noEmit --pretty に変更 (fail-closed 化)
pnpm-lock.yaml +236/-0 上記依存追加に伴うロックファイル更新 (CodeRabbit のパスフィルタで審査対象外)
tsconfig.json (新規) +15/-0 strict / noEmit の型チェック設定新規作成
src/hooks-stop-quality/tests/t3_build_gate_seal.rs (新規) +107/-0 build gate 形骸化の回帰テスト4本 (exit code 握りつぶし防止・typescript pin・tsconfig 存在)

PR 本文 (docs/push-pipeline-fix-plan.md 追記) には fail-closed の実測・incident 再現によるテスト検証・保護ファイル guard 抵触時の承認取得手順など、詳細な実施記録が含まれている。

次のアクション

  • CodeRabbit のレビュー完了を待って再監視 (本回は待機せず現時点情報のみで終了)。
  • mergeStateStatus: UNSTABLE の要因 (pending check) が CodeRabbit 完了で解消するか、次回確認する。
  • 特に人間側の対応は不要 — 現時点でブロッキングな指摘なし。

@aloekun
aloekun merged commit dfc894d into master Jul 17, 2026
1 check passed
@aloekun
aloekun deleted the fix/build-gate-tsc-materialize branch July 17, 2026 09:44
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