Skip to content

fix: 既定の --install で、この実行が入れた版が --age を満たさなければ実行前へ戻す - #56

Merged
owayo merged 1 commit into
mainfrom
fix/issue-54-age-violation-restores-pre-update
Oct 20, 2026
Merged

owayo merged 1 commit into
mainfrom
fix/issue-54-age-violation-restores-pre-update

Conversation

@owayo

@owayo owayo commented Oct 20, 2026

Copy link
Copy Markdown
Owner

概要

既定の depup --install で、この実行が lock に持ち込んだ版が --age を満たさない・確かめられないまま残ったら、その install 単位のマニフェストと lockfile を実行前の状態へ戻します。#54 の期待のうち、PR #55 で残した「経過日数を満たす lock にできないなら、更新前のマニフェストと lock へ戻す」に当たります。

これまでの既定の --install は、install に失敗した単位だけを戻し、age 監査の結果ではファイルを戻しませんでした。差し戻せない若い版 (更新したマニフェストが要求する推移依存など) は終了コード 2 の報告だけで lock に残り、次のビルドで使われていました。

変更内容

  • 既定の install の処理を lib の install::ordinary に移し、復元用の transaction を監査の後まで開いたままにします。順序は「install 前に Node の lock の版を読む → install → install に失敗した単位を除いて Rust と Node の監査 → 条件に当たった単位を戻す → 結果の表示」です。main.rs は refresh と同じ形で呼ぶだけになりました。
  • 戻す条件 (どれも age が有効なときだけ):
    • 最終の lock に、実行前の lock に無かった版が残り、公開日が条件より新しいか、確かめられない。Rust は監査が記録する最終 lock の証拠 (LockAgeAuditResult::remaining。差し戻した先の版を含む) で判定し、調整の記録の元の版では判定しません
    • lock を確かめられない (Cargo の監査が終わらない、実行前の Cargo.lock を読めない、install 後の Cargo.lock が無い、npm/pnpm の lock を読めない・一覧できない)
    • Cargo の差し戻しの後に、監査の外で Cargo.lock が変わった (監査が証明した内容を採用できない)
  • 戻さないもの: 実行前から lock にあった版 (報告して終了コード 2)、私設レジストリ・Git・ローカルなど監査しない取得元、監査に対応していない lock (Yarn・Bun・npm の形式 1。型で分け、エラー文で判定しない)、pnpm の更新先の不一致 (fix: pnpm の override と解決版を確認して誤った更新報告を防ぐ #53 の方針どおりファイルを残す)。
  • Node は install の前に、npm の lock か pnpm list --lockfile-only から実行前の版を読みます。manifest は更新済みなので照合せず、pnpm の警告も無視します。lock が無ければ空、読めなければ「既存の版と区別できない」扱いにし、その旨を理由に書きます。
  • 戻す単位は、その lock (または Cargo.toml) を持つ単位だけです。Tauri や共有の lock は一緒に戻り、同じディレクトリにある独立した install (Cargo の隣の Gemfile など) は残ります。
  • 外部で変わったファイルは上書きせず、復旧用コピーを残します。復元の報告は「The project files are back to their state before this run.」か「Recovery is incomplete: ...」で結果を示し、JSON の失敗理由にも recovery incomplete を付けます。復元の報告を書けなかった場合は、最終出力の後に終了コード 1 にします。
  • 終了コード: install の失敗は 1、age による復元は一部未復元を含めて 2。
  • docs/usage.md・usage.ja.md・cli-reference.*・README.*・AGENTS.md を更新しました。

設計判断

codex (gpt-6.1-sol) と設計を相談し、「修正して採用」の指摘をすべて反映しました。主なものは次の 4 点です。Rust は調整の記録ではなく最終 lock で判定すること。Node のエラーは意味で分けること。実行前の版を読めないときは空ではなく不明として扱うこと。戻した結果を完全と一部未復元に分けて示すこと。--install --refresh-lock は従来どおり独自の検証を使い、変えていません。

検証

  • make ci: pass (fmt・clippy・全テスト)
  • 偽 crates.io と実物の cargo による通しのテスト: 持ち込んだ若い推移依存が残ると Cargo.toml と Cargo.lock が実行前のバイト列に戻る (Rust age audit が cargo_toml の external change で中断し、条件外の lockfile が残る #54 の状況) / 監査で期間内に直せた lock は残す / 実行前から lock にあった若い版だけなら戻さない (終了コード 2) / 同じディレクトリの Gemfile の更新は戻さない / 監査の後に lock が外で変わったら manifest だけ戻し、lock は残して一部未復元と表示する
  • Node の通しのテスト (偽の監査): 持ち込んだ版の違反で package.json と pnpm-lock.yaml が戻り、実行前からの版の違反なら残る
  • 単体テスト: 戻す理由の分類 (Rust・Node)、Node の実行前の版の読み取り (npm・pnpm の警告・失敗・読み取り中の変化)、remaining が差し戻し先の版を判定すること、Tauri の組は一緒に戻り隣の独立した単位は残ること、npm の形式 1 を未対応として報告だけにすること
  • 同じディレクトリの独立した install の回帰テストは、ディレクトリ単位で戻す実装に戻すと失敗することを確かめました
  • codex の差分レビュー: 中 2 件 (同じディレクトリの独立した単位まで戻す / npm の形式 1 を戻してしまう)、低 2 件 (報告の書き込みエラーを捨てる / 終了コードの説明) を修正しました

Closes #54

🤖 Generated with Claude Code

既定の --install は install に失敗した単位だけを実行前へ戻し、age 監査の結果では
ファイルを戻さなかった。差し戻せない若い版 (更新したマニフェストが要求する推移依存
など) が lock に残り、次のビルドで使われていた。

復元用の transaction を監査の後まで開いたままにし、この実行で入った版が age を
満たさない・確かめられないまま最終の lock に残った単位を、マニフェストと lock ごと
実行前へ戻す。Rust は差し戻した先の版を含む最終 lock の証拠を install 前の lock と
比べ、Node は install 前に読んだ lock の版と比べる。実行前からあった版、監査しない
取得元、監査に対応していない lock (yarn・bun・npm の形式 1) は戻す理由にしない。
戻すのはその lock を持つ単位だけで、同じディレクトリの独立した install は残す。
外部で変わったファイルは上書きせず、復元が終わらなかったことを表示と JSON の理由で
知らせる。既定の install の処理は lib の install::ordinary に移し、実物の cargo で
通しのテストをする。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@owayo owayo self-assigned this Oct 20, 2026
@coderabbitai

coderabbitai Bot commented Oct 20, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 82edadd8-b43c-44fc-89ea-21835fc3ae91
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

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.

Rust age audit が cargo_toml の external change で中断し、条件外の lockfile が残る

1 participant