Skip to content

fix(sync): #861 safety guard の fail-closed 化と DELETE 正常系テスト(#875 敵対的レビュー残件) #877

Description

@s977043

背景 / Why

PR #875#861 是正)の merge 前敵対的レビューで検出された major 2 件 + minor 2 件 + 既知課題 1 件のうち、TC-05 sandbox 化・safety guard 本体のみが merge され、以下が未反映のまま残っている。全指摘は sandbox 実験で実測 CONFIRMED 済み。

What(Scope)

F1 [major] guard 発火が silent(exit 0)で恒久 drift を生む

  • 現状: sync_dir の guard 発火は WARN ログ + return 0 のみ。copy で changed=1 になるため CI 自動 PR は新旧混在の plugin 状態のまま生成され、以後毎 run guard が発火し続けて削除が永久スキップされる(fix(tests): ta-26 TC-05 が実リポジトリの plugin/plangate/ を rm -rf している(データ損失リスク) #861 の一回性データ損失を検知手段のない恒久不整合に置き換えるリスク)
  • 対応案: guard 発火時に script 終端で exit 3(fail-closed)。意図的な大量削除用に PLANGATE_ALLOW_MASS_DELETE=1 override を用意

F4 [major] DELETE 正常系の負側テストが皆無

  • TC-08 は guard「発火する側」のみ。guard が常時発火する回帰(不等号逆転等)でも TA-26 は全 PASS する
  • 対応案: TC-09 追加 — guard 不発条件(src=2 / stale=1)で stale が削除され WARN が出ないことを assert

F2 [minor] dst カウントが copy 後で dry-run と実行が乖離

  • カウントを「stale 数(src に存在しない dst ファイル数)」に変更すると dry-run/実行が一致しコメントと実効条件も揃う

F3 [minor] 単体実行判定が汎用変数 FIXTURES_DIR 依存

  • 環境に FIXTURES_DIR が export されていると standalone 判定が壊れ全 FAIL でも exit 0。専用フラグ(例 PG_HARNESS_SOURCED=1)へ変更

F5 [既知課題] references 系 2 経路に #861 同型の無ガード大量削除が残存

  • skills references 同期(src 空で dst 全削除)/ ai-loop-cycle references(正本 docs 不在で全削除)。guard 適用範囲は sync_dir(agents/rules/commands)のみ

受入基準

  1. guard 発火時に sync が非 0 exit し、CI sync job が fail する(実測)
  2. PLANGATE_ALLOW_MASS_DELETE=1 で意図的大量削除が実行できる
  3. TC-09(DELETE 正常系)が追加され、guard 常時発火の回帰を検出できる
  4. F2/F3 の是正または明示的な見送り記録
  5. F5 の references 経路 guard(または別 issue 分離の判断記録)

参照

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions