Skip to content

feat(cloud-setup): cache-phase 反映確認の決定論化 — stamp 観測機構 + setup script 登録 snippet の fail-open 化 (ADR-060) - #321

Merged
aloekun merged 3 commits into
masterfrom
claude/cache-phase-warmup-check-gtm9rj
Jul 25, 2026
Merged

feat(cloud-setup): cache-phase 反映確認の決定論化 — stamp 観測機構 + setup script 登録 snippet の fail-open 化 (ADR-060)#321
aloekun merged 3 commits into
masterfrom
claude/cache-phase-warmup-check-gtm9rj

Conversation

@aloekun

@aloekun aloekun commented Jul 25, 2026

Copy link
Copy Markdown
Owner

概要

ADR-060 の E2E 検証で cache-phase 暖機が未反映 (セッション開始時に /opt/cargo-target 不存在、pnpm install が reused 0 のフルダウンロード) と判明。調査の結果、根本原因は Web UI セットアップスクリプトの相対パス起動が exit 127 (repo clone 前/外の cwd で scripts/cloud-setup.sh を解決できない) となり、cache-phase が一度も完走していなかったことと確定した。本 PR は再発防止の観測機構と登録手順の修正を行う。

変更内容

1. cache-phase 反映の観測機構 (C-3 stamp)

  • run_cache_phase 完了時に stamp (~/.cache/cloud-setup/cache-phase-stamp$CARGO_TARGET_DIR/.cache-phase-stamp の 2 箇所、completed_at / commit / cargo_warmup 結果を記録) を書き込む
  • run_session_phase 冒頭で stamp の有無と CARGO_TARGET_DIR の設定状況を SessionStart ログに決定論的に報告する (ADR-042: 繰り返す手動確認は仕組みへ)
  • 2 箇所に書くのは snapshot の部分欠落 (「cache-phase 未実行」vs「実行したが残らない」) を切り分けるため。stamp は観測専用の best-effort で、書き込み/読み出し失敗で setup を止めない
  • warmup_cargo は結果 (done / failed / skipped-*) を stamp に記録するよう変更し、timeout 有無で重複していた 2 分岐をコマンド配列 + 単一 if/else に集約

2. ADR-060 の更新

  • E2E 検証記録を追加: session-phase は動作確認 (hooks 発火 / バイナリ配置 / jj 初期化)、cache-phase は exit 127 で未完走 (ユーザー報告により根本原因確定)
  • セットアップスクリプト欄の登録 snippet を「repo 探索 + fallback shallow clone + 常に exit 0 (fail-open)」版へ更新。公式ドキュメントは setup script 実行時の cwd / repo 存在を保証せず、非ゼロ exit はセッション開始をブロックするため

検証

  • bash -n 構文チェック
  • cache-phase 実行で stamp 2 箇所の書き込みと内容 (cargo_warmup=done を含む) を実機確認
  • session-phase の報告分岐 3 種 (stamp あり / stamp なし / CARGO_TARGET_DIR 未設定) を実機確認
  • 新 snippet を cwd = repo 外で実行し「repo 探索」「fallback shallow clone」両経路とも exit 0 で cache-phase 完走を確認
  • push-runner quality gate (lint / test / e2e / clippy / cargo test) 全 PASS、takt pre-push レビュー approved (警告 2 件は修正済み)

マージ後のユーザー側手順

  1. Web UI のセットアップスクリプト欄を ADR-060「ユーザー側の環境設定」の fail-open 版 snippet に差し替え (欄の変更がキャッシュ再構築のトリガー)
  2. 次の新規セッションで SessionStart ログ冒頭の「cache-phase 反映」行を確認

🤖 Generated with Claude Code

https://claude.ai/code/session_014XWoGTBZ2ShrpVeDaCxVZ8


Generated by Claude Code

Summary by CodeRabbit

  • 改善

    • キャッシュ処理の完了状況を終了時のスタンプとログで確認できるようになりました。
    • 次回セッション開始時に、キャッシュが正しく反映されたかを明確に判定できます。
    • セットアップスクリプトが実行場所やリポジトリ状態に左右されにくくなり、準備処理の失敗でセッション開始が妨げられにくくなりました。
  • ドキュメント

    • キャッシュ反映状況の確認手順と、セットアップスクリプトに関する注意事項を更新しました。

claude added 2 commits July 25, 2026 12:49
… 冒頭報告 (ADR-060 C-3)

E2E 検証 1 回目 (2026-07-25) で cache-phase の成果 (pnpm store / cargo target) が
snapshot に未反映と判明したが、「走っていない」のか「走ったが残らない」のかを
判別する材料が無かった。cache-phase 完了時に stamp を HOME と CARGO_TARGET_DIR の
2 箇所へ書き、session-phase 冒頭で反映状況を SessionStart ログへ決定論的に報告する
(ADR-042: 繰り返す手動確認は仕組みへ)。ADR-060 に検証記録を追記。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XWoGTBZ2ShrpVeDaCxVZ8
…本原因記録

E2E 検証 2 回目 (ユーザー報告) で、セットアップスクリプト欄の相対パス起動が
exit 127 (repo clone 前/外の cwd) となり cache-phase が一度も完走していなかった
ことが確定。公式ドキュメントも setup script 実行時の cwd / repo 存在を保証して
いない。登録 snippet を「repo 探索 + fallback shallow clone + 常に exit 0
(fail-open、検出は C-3 stamp 報告)」に更新し、検証記録と学びを追記。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XWoGTBZ2ShrpVeDaCxVZ8
@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 9e0ea106-4c8c-49f2-98ed-4237555af049

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

cache-phase の実行結果をスタンプとして保存し、次回の session-phase でキャッシュ反映状態をログ判定できるようにした。セットアップスクリプトはリポジトリ探索と一時 clone に対応し、失敗時も exit 0 で終了する構成へ更新した。

Changes

キャッシュフェーズ観測とセットアップ運用

Layer / File(s) Summary
キャッシュスタンプ記録と判定
scripts/cloud-setup.sh
cargo warmup の結果を集約し、HOME と設定済みの CARGO_TARGET_DIR 配下へキャッシュスタンプを書き込み、存在状況を判定する関数を追加した。
フェーズ実行への組み込み
scripts/cloud-setup.sh, docs/adr/adr-060-cloud-harness-sessionstart-dispatcher.md
cache-phase 終了時にスタンプを書き込み、session-phase 開始時にキャッシュ反映状態をログ出力する手順と記録を更新した。
fail-open セットアップ手順
scripts/cloud-setup.sh, docs/adr/adr-060-cloud-harness-sessionstart-dispatcher.md
リポジトリ探索、必要時の一時 shallow clone、--cache-phase 実行、常時 exit 0 のセットアップスニペットと E2E 記録を更新した。

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

Sequence Diagram(s)

sequenceDiagram
  participant SetupScript as cloud-setup.sh
  participant CacheStamp as Cache stamp locations
  participant SessionPhase as session-phase
  SetupScript->>CacheStamp: cache-phase 完了時に write_cache_stamp()
  SessionPhase->>CacheStamp: stamp の有無を確認
  CacheStamp-->>SessionPhase: HOME/CARGO_TARGET_DIR の反映状態
  SessionPhase-->>SetupScript: 判定結果を SessionStart ログへ出力
Loading

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 主要変更である cache-phase の決定論的な反映確認と setup snippet の fail-open 化を正確に要約しています。
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 unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/cache-phase-warmup-check-gtm9rj

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: 定義されたワークフローの check なし。CodeRabbit レビューは pending (処理中、未完了)
  • レビュー状況: CodeRabbit — レビュー未着 (in-progress のプレースホルダコメントのみ)。人間レビューアーからの reviews / インラインコメントは 0 件
  • Verdict: user_decision (レビュー指摘がまだ無く CI も未完了のため、承認判断材料が揃っていない)

差分概要 (軽量サマリー)

  • docs/adr/adr-060-cloud-harness-sessionstart-dispatcher.md: ADR-060 に「反映確認の決定論化 (C-3)」の設計根拠を追記し、Web UI セットアップスクリプト欄の登録内容を単純な bash scripts/cloud-setup.sh --cache-phase から repo 探索 + fallback shallow clone + fail-open (常に exit 0) の snippet に置き換え。さらに 2026-07-25 の E2E 検証記録 (1回目: cache-phase 未反映の観測、追記: 相対パス起動が exit 127 でセットアップスクリプト自体が一度も完走していなかったという根本原因の確定) を追加
  • scripts/cloud-setup.sh: cache-phase 完了時に ~/.cache/cloud-setup/cache-phase-stamp$CARGO_TARGET_DIR/.cache-phase-stamp の2箇所へ stamp (completed_at/commit/cargo_warmup 結果/CARGO_TARGET_DIR) を書く write_cache_stamp() を追加し、session-phase 冒頭でその有無を SessionStart ログに報告する report_cache_phase_status() を追加。warmup_cargo() は結果を CARGO_WARMUP_RESULT に記録するようリファクタ。stamp 書き込み・読み出しはいずれも best-effort (失敗しても setup を止めない fail-open)

Applicable Findings (Critical / High / Major)

(該当なし — レビュー指摘 0 件)

Applicable Findings (Medium 以下)

(該当なし)

Filtered (not applicable)

(該当なし)

次のアクション

  • CodeRabbit のレビュー完了を待ち、findings が投稿された時点で改めて本 backstop または人間による確認を行う
  • CI check が現状定義されていないため、マージ前に pnpm build:all 等のローカル検証が済んでいるか (特に scripts/cloud-setup.sh の shellcheck / 実行可能性) を人手で確認することを推奨

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/adr/adr-060-cloud-harness-sessionstart-dispatcher.md`:
- Around line 182-185: CLONED の一時ディレクトリ作成に成功した場合だけ git clone を実行するよう、CLONED
の代入と既存の git clone 処理を同じ条件分岐にまとめてください。mktemp -d が失敗した場合は clone を行わず、/repo が clone
先にならないようにします。

In `@scripts/cloud-setup.sh`:
- Around line 459-472: Update the cache-status reporting around the HOME and
CARGO_TARGET_DIR stamp checks so stamp presence is reported only as “あり,” not as
evidence of a warm cache. Read the recorded cargo_warmup value from the stamp
and report warmup completion only when it is done; preserve distinct messaging
for failed, skipped, missing, or unreadable stamp states without claiming
lint:rust starts with a warm cache.
- Around line 407-409: Update the warmup command setup around warmup_cmd so
cargo warmup is never run without a timeout. Require the timeout utility and
fail through the Web UI, or skip warmup while setting CARGO_WARMUP_RESULT to
“skipped-no-timeout”; do not execute the unrestricted warmup command when
timeout is unavailable.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: be94ebfb-9347-4972-ba76-84d37ab88c18

📥 Commits

Reviewing files that changed from the base of the PR and between 1f79e61 and fd808c4.

📒 Files selected for processing (2)
  • docs/adr/adr-060-cloud-harness-sessionstart-dispatcher.md
  • scripts/cloud-setup.sh

Comment on lines +182 to +185
CLONED="$(mktemp -d)"
if git clone --depth 1 https://github.com/aloekun/claude-code-hook-test "${CLONED}/repo"; then
REPO_DIR="${CLONED}/repo"
fi

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

mktemp 失敗時に /repo へ clone しないでください。

set -e がないため、mktemp -d 失敗後も CLONED="" のまま進み、clone 先が /repo になります。作成成功を条件に clone を実行してください。

修正例
 if [ -z "${REPO_DIR}" ]; then
-  CLONED="$(mktemp -d)"
-  if git clone --depth 1 https://github.com/aloekun/claude-code-hook-test "${CLONED}/repo"; then
-    REPO_DIR="${CLONED}/repo"
+  if CLONED="$(mktemp -d)"; then
+    if git clone --depth 1 https://github.com/aloekun/claude-code-hook-test "${CLONED}/repo"; then
+      REPO_DIR="${CLONED}/repo"
+    fi
+  else
+    echo "[setup-script] 一時ディレクトリを作成できず cache-phase を skip (fail-open)"
   fi
 fi
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
CLONED="$(mktemp -d)"
if git clone --depth 1 https://github.com/aloekun/claude-code-hook-test "${CLONED}/repo"; then
REPO_DIR="${CLONED}/repo"
fi
if CLONED="$(mktemp -d)"; then
if git clone --depth 1 https://github.com/aloekun/claude-code-hook-test "${CLONED}/repo"; then
REPO_DIR="${CLONED}/repo"
fi
else
echo "[setup-script] 一時ディレクトリを作成できず cache-phase を skip (fail-open)"
fi
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/adr/adr-060-cloud-harness-sessionstart-dispatcher.md` around lines 182 -
185, CLONED の一時ディレクトリ作成に成功した場合だけ git clone を実行するよう、CLONED の代入と既存の git clone
処理を同じ条件分岐にまとめてください。mktemp -d が失敗した場合は clone を行わず、/repo が clone 先にならないようにします。

Comment thread scripts/cloud-setup.sh Outdated
Comment on lines +407 to +409
if command -v timeout >/dev/null 2>&1; then
( cd "${REPO_ROOT}" && timeout "${timeout_secs}" cargo clippy --workspace --all-targets --all-features ) \
|| warn "cargo warmup 未完了 (timeout/失敗)。初回 Stop の lint:rust は cold compile になります。"
warmup_cmd=(timeout "${timeout_secs}" "${warmup_cmd[@]}")
fi

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu
command -v timeout
timeout 1 true

Repository: aloekun/claude-code-hook-test

Length of output: 167


🏁 Script executed:

#!/bin/bash
set -eu

printf 'tracked script exists: '
git ls-files 'scripts/cloud-setup.sh' || true

printf '\nRelevant sections:\n'
sed -n '360,495p' scripts/cloud-setup.sh | cat -n

printf '\nReferences to CARGO_WARMUP_RESULT and timeout_secs:\n'
rg -n 'CARGO_WARMUP_RESULT|timeout_secs|warmup_cmd|cargo (clippy|check)|cargo-warmup|webui|Web UI' scripts/cloud-setup.sh

Repository: aloekun/claude-code-hook-test

Length of output: 8240


timeout 非搭載時にも cargo warmup を未制限実行させないでください。

timeout がない場合、ログは「最大 ${timeout_secs}s」となりますが実際は制限されず、重い crate/cache で warmup が長時間実行するかセットアップが止まります。timeout を必須にして未搭載時は Web UI で失敗するか CARGO_WARMUP_RESULT="skipped-no-timeout" としてスキップしてください。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/cloud-setup.sh` around lines 407 - 409, Update the warmup command
setup around warmup_cmd so cargo warmup is never run without a timeout. Require
the timeout utility and fail through the Web UI, or skip warmup while setting
CARGO_WARMUP_RESULT to “skipped-no-timeout”; do not execute the unrestricted
warmup command when timeout is unavailable.

Comment thread scripts/cloud-setup.sh Outdated
Comment on lines +459 to +472
if [ -f "${CACHE_STAMP_HOME}" ]; then
log "cache-phase 反映 (HOME): あり — pnpm store 暖機が snapshot に残存"
# set -e 下でも読み出し失敗 (権限/race) で setup を止めない (上記コメントの fail-open を実装で担保)
sed 's/^/ /' "${CACHE_STAMP_HOME}" 2>/dev/null \
|| warn "stamp の内容を読み出せませんでした (表示のみ skip)"
else
log "cache-phase 反映 (HOME): なし — pnpm install はフルダウンロードになります (セットアップスクリプト欄の --cache-phase 登録とキャッシュ再構築を確認)"
fi
if [ -z "${CARGO_TARGET_DIR:-}" ]; then
log "CARGO_TARGET_DIR: 未設定 — cargo 暖機はセッションに反映されません (Web UI の環境変数欄で /opt/cargo-target 等を設定)"
elif [ -f "${CARGO_TARGET_DIR}/.cache-phase-stamp" ]; then
log "cache-phase 反映 (CARGO_TARGET_DIR=${CARGO_TARGET_DIR}): あり — lint:rust は warm cache で開始"
else
( cd "${REPO_ROOT}" && cargo clippy --workspace --all-targets --all-features ) \
|| warn "cargo warmup 未完了。初回 Stop の lint:rust は cold compile になります。"
log "cache-phase 反映 (CARGO_TARGET_DIR=${CARGO_TARGET_DIR}): なし — 初回 Stop の lint:rust は cold compile"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

stamp の存在を warm cache の証拠として表示しないでください。

write_cache_stamp()cargo_warmup=failedskipped-envskipped-no-cargo でも target 側 stamp を書きます。そのため次セッションで「lint:rust は warm cache」と表示されます。HOME 側も stamp の残存しか示せません。表示を「stamp あり」に留め、cargo_warmup を読み取って done の場合だけ warmup 完了を報告してください。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/cloud-setup.sh` around lines 459 - 472, Update the cache-status
reporting around the HOME and CARGO_TARGET_DIR stamp checks so stamp presence is
reported only as “あり,” not as evidence of a warm cache. Read the recorded
cargo_warmup value from the stamp and report warmup completion only when it is
done; preserve distinct messaging for failed, skipped, missing, or unreadable
stamp states without claiming lint:rust starts with a warm cache.

@github-actions

Copy link
Copy Markdown
Contributor

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

  • トリガー: pull_request_review (submitted) / 実行 run
  • CI: analyze (本 backstop 自身) は実行中 (pending)、CodeRabbit は pass (Review completed)。他に定義された CI check なし
  • レビュー状況: CodeRabbit — レビュー完了・COMMENTED (2026-07-25T13:17:44Z、actionable comments 3件)。人間レビュアーからの新規レビュー / インラインコメントは 0 件
  • Verdict: needs_fix (applicable Major 2件)

Applicable Findings (Critical / High / Major)

# File (Line) Reviewer Issue Recommended Action
1 scripts/cloud-setup.sh (407-409) CodeRabbit timeout コマンド未検出時、ログは「最大 ${timeout_secs}s」と表示するが実際には無制限実行される (warmup_cmd に timeout が付与されない) timeout を必須化し、未検出時は CARGO_WARMUP_RESULT="skipped-no-timeout" で skip するか Web UI 側で失敗させる
2 scripts/cloud-setup.sh (459-472) CodeRabbit write_cache_stamp()cargo_warmup が failed/skipped-* でも target 側 stamp を書くため、report_cache_phase_status() が stamp の存在だけで「lint:rust は warm cache」と誤報告する。C-3 の目的 (cache-phase 反映の決定論的観測) と矛盾 stamp 内容から cargo_warmup の値を読み取り、done の場合のみ warm cache 報告に留める (failed/skipped/不在/読み出し不能を区別)

Applicable Findings (Medium 以下)

(該当なし)

Filtered (not applicable)

# File (Line) Issue Filter Reason
1 docs/adr/adr-060-cloud-harness-sessionstart-dispatcher.md (182-185) mktemp -d 失敗時に CLONED="" のまま git clone が実行され、clone 先が /repo になり得る Scope mismatch: docs/adr/ は read-only ゾーン (analyze-coderabbit.md Step 2)。ただし当該箇所は Web UI セットアップスクリプト欄へ人手で転記される運用 snippet であり、内容自体の正しさは人間による確認を推奨

次のアクション

  • Major 2件 (timeout 未検出時の無制限実行、stamp の warm cache 誤報告) は ADR-060 の目的 (cache-phase 反映の決定論的観測) と直接矛盾するため、マージ前の修正を推奨
  • Filtered とした mktemp ガードの指摘も、Web UI に手動転記される実運用スクリプトの内容である以上、レビュー対象外として無視せず人手で反映要否を判断すること
  • analyze check (本 backstop) の完了と、Major 2件への対応状況を確認してからマージ判断を行う

…告の正確化 / snippet の mktemp ガード

- warmup_cargo: timeout 未検出時は無制限実行せず skipped-no-timeout として skip
  (ログの「最大 Ns」と実挙動の乖離を解消)
- report_cache_phase_status: stamp の存在だけで warm cache と断定せず、記録された
  cargo_warmup=done の場合のみ warm 開始を報告。HOME 側の文言も stamp 残存の
  事実に限定
- ADR-060 snippet: mktemp -d 失敗時に clone 先が /repo になる経路を成功条件付き
  分岐で排除

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014XWoGTBZ2ShrpVeDaCxVZ8
@aloekun
aloekun merged commit 932fcb1 into master Jul 25, 2026
1 check passed
@aloekun
aloekun deleted the claude/cache-phase-warmup-check-gtm9rj branch July 25, 2026 23:39
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