Repository navigation
fix(phase94): close 5 Open Issues — commit guard hardening, skill budget short-term, i18n docs, reviewer mitigation - #222
Conversation
…on (#218 part-1) harness-review skill の Output Contract 直後と harness-release skill の Review Gate 配下に "Persist Verdict" step を追加。verdict JSON を write-review-result.sh で .claude/state/review-result.json に永続化させる。これにより単独 /harness-review や /harness-release の Review Gate 委譲で出た APPROVE が、PreToolUse commit guard を 通過できるようになる。 Plans.md 94.1.1 [#218 part-1] Changes: - skills/harness-review/SKILL.md: Output Contract 直後に Persist Verdict step (work step 10 と同パターン) - skills/harness-release/SKILL.md: Review Gate 配下に二段防御の persistence check + 補完保存 - tests/test-review-result-persistence.sh: 9 assert (skill 内 step / APPROVE round-trip / REQUEST_CHANGES round-trip) - codex/opencode mirror を sync-skill-mirrors.sh で同期 Verification: - bash tests/test-review-result-persistence.sh: 9/9 PASS - bash tests/validate-plugin.sh: 104/104 PASS (failures 0) - bash scripts/sync-skill-mirrors.sh --check: PASS (no drift) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
SubagentStop hook で reviewer subagent の最終応答から review-result.v1 JSON ブロックを 決定論的に抽出し、.claude/state/review-result.json に永続化する。94.1.1 で追加した SKILL step が踏み忘れられた場合の二段防御 (LLM 協調抜けへの backstop)。 Design: - 既存 SubagentStop matcher "worker|reviewer|video-scene-generator" に 2 つ目の hook を追加 - reviewer ピンポイント検出ではなく、review-result.v1 schema_version の存在で判定 (他 subagent には schema_version=review-result.v1 が出ないため fail-open で安全) - transcript.jsonl の末尾 assistant turn の text content を awk + jq で抽出 - ```json ... ``` fenced block と balanced-brace fallback の 2 ストラテジで JSON 探索 - write-review-result.sh に委譲して既存正規化フローを再利用 (重複実装回避) - .claude/state/subagentstop-persist-audit.jsonl に backstop 発火を append 監査 Plans.md 94.1.2 [#218 part-2] Files: - scripts/hook-handlers/subagentstop-reviewer-persist.sh: 新規 handler (fail-open) - hooks/hooks.json + .claude-plugin/hooks.json: SubagentStop hook 追加 (dual sync) - tests/test-reviewer-stop-persist.sh: 4 シナリオ 7 assert Verification: - bash tests/test-reviewer-stop-persist.sh: 7/7 PASS - (1) APPROVE → review-result.json persisted, verdict=APPROVE, audit appended - (2) REQUEST_CHANGES → persisted, verdict=REQUEST_CHANGES - (3) Non-reviewer subagent → no-op (fail-open) - (4) Malformed JSON → no-op (fail-open) - bash tests/validate-plugin.sh: 104/104 PASS - bash scripts/sync-plugin-cache.sh: synced Hooks SSOT compliance: - dual hooks.json sync 実施 - SessionStart/Setup/SubagentStart は変更なし (type=command 制約と無関係) - timeout 15s (lightweight: transcript scan + JSON extract + 1 jq call) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…umption (#219) PostToolUse commit-cleanup と PreToolUse commit guard の両側で "VERSION / .claude-plugin/plugin.json / harness.toml / CHANGELOG.md" のみを 変更する bookkeeping commit を識別し、レビュー承認状態の削除と承認要求を 免除する。harness-release の bare release (work commit → bump commit) で bump 側がブロックされる問題を解消。 Design: - 両側で同じ taxonomy (4-file allowlist) を使用 — 片側だけだと cleanup 後の 再 commit でブロックされるため (#219 root cause) - merge commit も承認保持 (通常はレビュー対象外) - git unavailable 時は fail-closed (= 従来動作 = 削除) を維持 - 判定根拠は .claude/state/commit-cleanup-audit.jsonl に append-only 記録 Plans.md 94.1.3 [#219 fix] Files: - go/internal/hookhandler/posttooluse_commit_cleanup.go: classifyHeadCommitForCleanup() 追加、git runner 抽象化、audit log - go/internal/hookhandler/posttooluse_commit_cleanup_test.go: 5 ケース追加 (bookkeeping-only / mixed / code-only / merge / git-unavailable) - scripts/pretooluse-guard.sh: PreToolUse 側 commit guard に同じ bookkeeping 例外 - tests/test-release-multi-commit.sh: e2e shell test (4 シナリオ 6 assert) Verification: - go test ./go/internal/hookhandler/: 12/12 PASS (既存 7 + 新規 5、zero regression) - bash tests/test-release-multi-commit.sh: 6/6 PASS - bash tests/validate-plugin.sh: 104/104 PASS Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rt-term) Skill listing budget overflow (#200) の緊急回避として上位 verbose 10 件の description / description-en を ≤200 chars に trim。total を 10619 → 8099 chars (20% 削減) に圧縮。Issue #200 の 6000 chars 厳格達成は別 Phase で残り 28 件まで trim する必要があり、本 Phase は短期対応として完了。 Trimmed (description char 数 before → after): - harness-accept 601 → 195 - cursor-ask 531 → 167 - harness-plan-brief 523 → 196 - harness-progress 489 → 187 - harness-orchestration 446 → 175 - cursor-do 418 → 197 - gogcli-ops 418 → 185 - memory 365 → 175 - cc-cursor-cc 315 → 199 - cursor-setup 311 → 187 各 skill の trigger phrase (auto-loading キーワード) は保持。詳細仕様は SKILL.md body 内に残置。description-ja は本 Phase 対象外 (i18n gate は description / description-en の同期だけを検証)。 Plans.md 94.2.1 [#200 short-term] Files: - scripts/check-skill-description-budget.sh: 新規 budget gate (per-skill + total) - skills/*/SKILL.md × 10: description + description-en trim - codex/.codex/skills/*/SKILL.md × 10: mirror sync - opencode/skills/*/SKILL.md × 10: mirror sync Verification: - bash scripts/check-skill-description-budget.sh --max-per-skill 300 --max-total 8500: PASS (total 8099 chars, 0 violations) - bash scripts/sync-skill-mirrors.sh --check: PASS (no drift) - bash tests/validate-plugin.sh: 104/104 PASS Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…medium-term) Phase 94.2.2 で cognitive-load trio (harness-accept + harness-plan-brief + harness-progress) を 1 skill + サブコマンドに統合する案を検証。**保留**判断 を SSOT doc 化。実装は別 Phase で見直し条件 (Trigger A/B/C) 達成後に再考。 判断理由: 1. budget 達成への単独寄与が小さい (statement: 328 chars 削減のみ) 2. trigger 精度低下リスク (3 surface の自然語 trigger が分散する) 3. breaking change の justification 不足 (Phase 65 の 3 surface 分離設計を 覆すには根拠不足) 推奨次 action: - Phase 95.1: 残り 28 件の description trim (中位 verbose ≤200 chars) - Phase 96+: 統合 case 再検討 (trim だけで budget 達成不可なら) Plans.md 94.2.2 [#200 medium-term] Files: - docs/skill-consolidation-cognitive-load.md: 新規判断 SSOT Verification: - bash tests/validate-plugin.sh: 104/104 PASS Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
) docs/i18n.md を新規作成し、英語/日本語の言語切替手順を SSOT 化。3 経路 (harness.toml / CLAUDE_CODE_HARNESS_LANG env / per-message session 指示) の precedence と「変更されない箇所」(machine-readable JSON, commit prefixes) を明示。README の Documentation 表と CLAUDE.md Language 節からリンク。 Closes #173 Plans.md 94.3.1 [#173] Files: - docs/i18n.md: 新規 SSOT - CLAUDE.md: Language 節に docs/i18n.md ポインタ追加 - README.md: Documentation 表に Language / i18n 行追加 Verification: - bash tests/validate-plugin.sh: 104/104 PASS Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ations.md (#172) reviewer.md の security 問題 section に「中立的事実列挙にとどめる」instruction を 追加 (exploit code / PoC 不可、CVE/CWE ID 引用のみ、mitigation は修正方針のみ)。 これにより Opus 4.7 の cyber-related safeguard が triggered する確率を下げる。 Harness 側で完全消去は不可 (Anthropic 製品仕様の model-side safeguard)。 完全な workaround は Opus 4.8 への切替・security-only PR の人手 escalation。 docs/known-limitations.md を新規作成し、症状・根本原因・mitigation・workaround・ trigger to revisit を SSOT 化。Issue #172 はこの limitation 文書化で close。 Plans.md 94.3.2 [#172] Files: - agents/reviewer.md: Security finding 記述ルール section 追加 - docs/known-limitations.md: 新規 SSOT (cyber-safeguard 限界の正式文書化) Verification: - bash tests/validate-plugin.sh: 104/104 PASS Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ies (Phase 94 closeout part 1) spec.md に Phase 94 で codify した contract を追加 (#218 + #219 が解消する 3 性質: coverage / bookkeeping-only exemption / determinism over coordination)。 CHANGELOG.md [Unreleased] に 5 Issue (#218, #219, #200 short-term, #173, #172) の Before/After を CHANGELOG 規約 (.claude/rules/github-release.md) で追記。 Plans.md 94.4 を cc:wip に更新 (review + Issue close は次段階)。 Plans.md 94.4 [Phase 94 closeout part 1] Phase 94 累積実装: - 94.1.1 [5a2d0df] #218 part-1: harness-review/release SKILL に persist step - 94.1.2 [5249ad7] #218 part-2: SubagentStop hook 決定論的 backstop - 94.1.3 [d4b8573] #219: cleanup + commit guard 両側で bookkeeping commit 免除 - 94.2.1 [46d153c] #200 短期: 上位 10 件 description trim (10619→8099 chars) - 94.2.2 [a7d5ef0] #200 中期: cognitive-load trio 統合判断 doc (保留) - 94.3.1 [a6f58e2] #173: docs/i18n.md SSOT + README/CLAUDE.md ポインタ - 94.3.2 [08fa233] #172: reviewer prompt 中立化 + known-limitations.md - 94.3.3 deferred: awesome-codex-plugins listing は upstream PR で別途 Verification (本 commit 時点): - go test ./go/...: PASS (12 hookhandler + session/state/config) - bash tests/validate-plugin.sh: 104/104 PASS - bash scripts/sync-skill-mirrors.sh --check: PASS (no drift) - bash scripts/ci/check-consistency.sh: ALL PASS (incl. i18n gates) VERSION/.claude-plugin/plugin.json/harness.toml: 不変 (no release) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Codex review が指摘した 3 件の P2 finding に対応する修正。 1. **Bookkeeping bypass を塞ぐ** (#219 後続) `git add ... && git commit` のような chained command では PreToolUse hook 実行時点では新しい staging が反映されていないため、(i) 真の bookkeeping commit が deny される、(ii) `git add src && git commit` で code commit が bypass される、両方のシナリオが起きうる。bookkeeping 免除を「コマンドが pure な git commit (index を mutate しない、&&/||/;/pipe で他コマンドと 連結されていない) AND index がすでに bookkeeping のみ」両方を満たす場合に 限定。 2. **Test env scope を修正** tests/test-reviewer-stop-persist.sh の `CLAUDE_PLUGIN_ROOT="${ROOT_DIR}" printf | bash $HANDLER` は env が printf 側だけに当たり handler に届かない。 `printf | CLAUDE_PLUGIN_ROOT=... bash $HANDLER` に修正。クリーンチェックアウト でも handler が plugin root を解決できるようになる。 3. **i18n docs を実装と整合** 実際の locale resolver は `.claude-code-harness.config.yaml` の `i18n.language` を読み、precedence は config > env > en。docs/i18n.md が 存在しない `harness.toml [i18n]` を推奨していた誤りを訂正。precedence と resolver の実装位置 (config-utils.sh:get_harness_locale, helpers.go) を明示。 Regression test 追加 (tests/test-release-multi-commit.sh): - (5) 'git add VERSION && git commit' chained → deny (bypass 防止) - (6) 'git add src && git commit' (古い bookkeeping staging 残し) → deny Verification: - bash tests/test-release-multi-commit.sh: 8/8 PASS (既存 6 + 新規 2) - bash tests/test-reviewer-stop-persist.sh: 7/7 PASS (env scope 修正後も全 PASS) - bash tests/validate-plugin.sh: 104/104 PASS - go test ./go/internal/hookhandler/: PASS (cached) - bash scripts/ci/check-consistency.sh: ALL PASS Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
サブエージェント並列レビュー (claude-code-harness:reviewer + feature-dev:code-reviewer + plugin-dev:plugin-validator) で検出された 1 件の bug と 3 件の quality finding を本 PR で修正。 1. **[bug] containsErrorIndicator false-positive** (commit guard bypass) `git commit -m "fix nothing to commit edge case"` のように commit message が "nothing to commit" 等の error indicator phrase を含む場合、git の成功 出力 `[main abc1234] fix ...` を cleanup handler が error と誤判定し、 承認状態のクリアを skip。結果として後続 commit が APPROVE 無しで通る bypass が成立していた。 修正: 出力の先頭が git の成功 prefix `[<branch> <hash>]` に一致した場合は `containsErrorIndicator` が早期に false を返すよう改修。regression test を 4 件追加 (success with "nothing to commit"/"error"/"failed" in message + multi-line failure). 2. **[quality] subagentstop-reviewer-persist.sh audit log JSONL injection** `VERDICT` を unsanitized で `printf` に渡しており、特殊文字を含む verdict で audit log が壊れる可能性。Go 側の `appendCleanupAuditLog` (encoding/json) と同じ安全契約に揃え、`jq -cn --arg ...` で JSONL line を 組み立てるよう変更。 3. **[quality] test-release-multi-commit.sh temp dir leak** `SANDBOX_D="$(mktemp -d)"` 直後に make_sandbox が fail すると `set -euo pipefail` で script が exit し、SANDBOX_D の trap update (旧 line 173) に到達しないため /tmp/tmp.XXX が leak していた。SANDBOX_D 作成直後に trap を update するよう変更。 4. **[minor] CHANGELOG.md i18n entry の表記訂正** `harness.toml [i18n] language` という記述が `docs/i18n.md` 修正後の 表記と乖離していた。`.claude-code-harness.config.yaml の i18n.language` に 統一し precedence (config > env > en) を明示。 Plans.md 94.4 [subagent panel findings] Verification: - go test ./go/internal/hookhandler/: PASS (TestContainsErrorIndicator 10/10 + 全 12 PASS) - bash tests/test-reviewer-stop-persist.sh: 7/7 PASS - bash tests/test-release-multi-commit.sh: 8/8 PASS - bash tests/validate-plugin.sh: 104/104 PASS Subagent verdicts before this commit: - claude-code-harness:reviewer: APPROVE (minor 2) - plugin-dev:plugin-validator: PASS (low 2) - feature-dev:code-reviewer: NEEDS_CHANGES (bug 1 + quality 2) 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: Organization UI Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (1)
✅ Files skipped from review due to trivial changes (1)
WalkthroughPhase 94として、レビュー承認の ChangesReview Approval Persistence Contract(#218/#219 コア修正)
スキル説明バジェット削減(#200)
ドキュメント整備(i18n / cyber safeguard)
Sequence Diagram(s)sequenceDiagram
participant Orchestrator as Orchestrator (main agent)
participant ReviewerSubagent as reviewer subagent (read-only)
participant HarnessReview as harness-review SKILL
participant WriteScript as write-review-result.sh
participant StateFile as .claude/state/review-result.json
participant SubagentStop as SubagentStop Hook
participant CommitGuard as pretooluse-guard.sh
rect rgba(100, 149, 237, 0.5)
note over Orchestrator,StateFile: Primary path: SKILL step
Orchestrator->>ReviewerSubagent: レビュー委譲
ReviewerSubagent-->>Orchestrator: review-result.v1 JSON出力
Orchestrator->>HarnessReview: Persist Verdict ステップ実行
HarnessReview->>WriteScript: 一時JSON + commit hash
WriteScript->>StateFile: verdict永続化
end
rect rgba(144, 238, 144, 0.5)
note over SubagentStop,StateFile: Backstop path: SubagentStop hook
SubagentStop->>SubagentStop: transcript最終アシスタントターン抽出
SubagentStop->>SubagentStop: review-result.v1 JSON検出
SubagentStop->>WriteScript: 一時JSON + commit hash
WriteScript->>StateFile: verdict永続化(SKILLステップ失敗時)
end
rect rgba(255, 160, 122, 0.5)
note over CommitGuard,StateFile: Commit guard判定
CommitGuard->>CommitGuard: staged files検査(bookkeeping判定)
CommitGuard->>StateFile: verdict=APPROVE確認
StateFile-->>CommitGuard: APPROVE / なし
CommitGuard-->>Orchestrator: 通過 or deny_git_commit_no_review
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 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 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4b6925c29c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if echo "$COMMAND" | grep -Eq '(^|[[:space:]])git[[:space:]]+(add|restore|reset|rm)([[:space:]]|$)' \ | ||
| || echo "$COMMAND" | grep -Eq '(&&|\|\||\;|^\||[[:space:]]\|[[:space:]])'; then | ||
| BOOKKEEPING_ONLY="false" | ||
| elif command -v git >/dev/null 2>&1; then | ||
| STAGED_FILES=$(git diff --cached --name-only 2>/dev/null || true) |
There was a problem hiding this comment.
Wire bookkeeping exemption into active hook
This bookkeeping exemption is added only to scripts/pretooluse-guard.sh, but the distributed PreToolUse hook I checked runs bin/harness hook pre-tool from hooks/hooks.json:10, and the Go guardrail table has no review-result/bookkeeping rule. In normal plugin installs this block is therefore not on the runtime path, so #219's guard-side behavior is still unimplemented/untested for the actual hook entrypoint; implement the same classifier in the Go pre-tool hook or wire this script into the hook path.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 15
🧹 Nitpick comments (3)
docs/skill-consolidation-cognitive-load.md (1)
1-76: 統合判断と次フェーズアクションが明確に文書化されています。Issue
#200の短期対応(description trim)と中期対応(統合検討)を分離し、本 doc で cognitive-load trio 統合案を検証して「保留」と判断した理由(trigger 精度低下、breaking change 正当化不足、budget 削減寄与度が限定的)が明確です。見直し条件(Trigger A/B/C)も適切に設定されており、Phase 95.1 での残り 28 件 trim を優先するロードマップが実行可能です。記事の質が高いため、この決定ドキュメントを
docs/cognitive-load-surfaces.md(Phase 65 設計判断の SSOT)のリンク先として README.md の "Decision Log" セクションに追加することをお勧めします。これにより、将来のユーザーが Phase 95 で統合判断が再検討された理由を追跡できます。🤖 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/skill-consolidation-cognitive-load.md` around lines 1 - 76, Add a reference to this decision document in the README.md file by creating or updating a "Decision Log" section that links to docs/skill-consolidation-cognitive-load.md with context explaining that this document contains the rationale for keeping the three cognitive-load skills (harness-accept, harness-plan-brief, harness-progress) separate rather than consolidating them, and serves as the reference point for when these decisions might be revisited in future phases based on the defined trigger conditions.codex/.codex/skills/harness-release/SKILL.md (1)
120-120: ⚡ Quick win一時ファイル安全性: mktemp による予測不可能なファイルネーム生成を推奨
行120で削除されている一時ファイル
.claude/state/tmp-review-result.jsonは予測可能な固定パス上にあり、複数の orchestrator インスタンスが同時に実行される場合にファイル衝突のリスクがあります。以下の改善を検討してください:# 改善案: mktemp を使用 TMPFILE=$(mktemp .claude/state/tmp-review-result.XXXXXX) cat > "$TMPFILE" <<'JSON' { ... } JSON bash "${HARNESS_PLUGIN_ROOT:-...}/scripts/write-review-result.sh" "$TMPFILE" ... rm -f "$TMPFILE"または、orchestrator が一時ファイル管理を一元化している場合は、そちらへの委譲も検討してください。
🤖 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 `@codex/.codex/skills/harness-release/SKILL.md` at line 120, The temporary file path `.claude/state/tmp-review-result.json` uses a predictable fixed filename which can cause collisions when multiple orchestrator instances run concurrently. Replace this hardcoded path with a dynamically generated filename using mktemp with a pattern like `.claude/state/tmp-review-result.XXXXXX`, store the result in a variable, and update all references to the temporary file (including the write operation and the rm cleanup command) to use this variable instead of the literal filename to ensure each instance gets a unique temporary file.skills/harness-release/SKILL.md (1)
120-120: ⚡ Quick win一時ファイル安全性: mktemp による予測不可能なファイルネーム生成を推奨
行120で削除されている一時ファイル
.claude/state/tmp-review-result.jsonは予測可能な固定パス上にあり、複数の orchestrator インスタンスが同時に実行される場合にファイル衝突のリスクがあります。以下の改善を検討してください:# 改善案: mktemp を使用 TMPFILE=$(mktemp .claude/state/tmp-review-result.XXXXXX) cat > "$TMPFILE" <<'JSON' { ... } JSON bash "${HARNESS_PLUGIN_ROOT:-...}/scripts/write-review-result.sh" "$TMPFILE" ... rm -f "$TMPFILE"または、orchestrator が一時ファイル管理を一元化している場合は、そちらへの委譲も検討してください。
🤖 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 `@skills/harness-release/SKILL.md` at line 120, The temporary file `.claude/state/tmp-review-result.json` uses a predictable fixed path which risks file collisions when multiple orchestrator instances run concurrently. Replace the hardcoded filename with a dynamically generated filename using mktemp with a template pattern like `.claude/state/tmp-review-result.XXXXXX` to create unique temporary files. Store the generated filename in a variable, use that variable when writing to and reading from the temporary file in the write-review-result.sh script invocation, and update the rm command to remove the dynamically named file instead of the fixed path. This ensures each orchestrator instance gets its own isolated temporary file.
🤖 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 `@CHANGELOG.md`:
- Around line 11-39: The major change entries (issues `#218`, `#219`, `#200`, `#173`,
`#172`) in the CHANGELOG.md file are currently formatted as paragraph sections
with "今まで" (Before) and "今後" (After) text blocks, but they should follow the
Before/After table format per CHANGELOG guidelines. Restructure each major
change section by converting the existing "今まで" paragraph and "今後" paragraph
content into a two-column markdown table with "Before" and "After" headers,
keeping all the existing content but reorganizing it into the table structure.
Apply this table format consistently across all five major change entries (the
`#218` harness-review/harness-release APPROVE issue, the `#219` release bump commit
issue, the `#200` skill listing budget issue, the `#173` i18n documentation issue,
and the `#172` reviewer safeguard issue).
In `@codex/.codex/skills/harness-release/SKILL.md`:
- Around line 114-116: The JSON schema template in the verdict block uses
ellipsis (`...`) which obscures the complete structure and creates ambiguity
about required fields. Replace the ellipsis with either a complete, explicit
minimal JSON example showing just the required fields (schema_version and
verdict), or add a comment that references scripts/write-review-result.sh for
full schema details. Additionally, add a second example explicitly showing the
REQUEST_CHANGES verdict case (referenced in the line 102 context) to clarify
both approval and rejection paths. This ensures the orchestrator has clear
guidance when building JSON structures in-context.
In `@docs/known-limitations.md`:
- Around line 27-29: The documentation file `docs/known-limitations.md` contains
a broken link reference to `fable5-safeguard-model-switch` pointing to
`../.claude/memory/` that doesn't exist in the repository, resulting in a 404
error. Since this documents an important feature limitation regarding
cyber-safeguard interruption, fix the reference by choosing one approach: update
the link to reference an external `harness-mem` companion project URL instead of
the local path, create the missing
`.claude/memory/fable5-safeguard-model-switch.md` file with the required
evidence documentation, or remove the reference entirely and include the
evidence details directly within the `docs/known-limitations.md` file itself.
In `@hooks/hooks.json`:
- Around line 195-197: The valid_root function in the bash command for the
SubagentStop hook is checking only for the existence of script files without
validating the actual plugin entity. Enhance the valid_root function to include
the same plugin verification logic used in existing hooks, which should check
for the presence of bin/harness and verify that the plugin.json name field
matches the expected plugin identifier. This will prevent the hook from
executing scripts from the project directory when same-named files exist there.
In `@opencode/skills/harness-review/SKILL.md`:
- Around line 302-304: The bash command that invokes write-review-result.sh uses
a fallback to $PWD when HARNESS_PLUGIN_ROOT and CLAUDE_PLUGIN_ROOT are not set,
which could execute scripts from an untrusted repository. Remove the $PWD
fallback from the parameter expansion so the command fails safely if neither
environment variable is defined, instead of defaulting to executing scripts from
the current working directory.
In `@Plans.md`:
- Around line 352-356: The tasks in rows 94.1.1 (line 352) and 94.2.1 (line 355)
use the invalid lane tag `[lane:fix]` which does not exist in the Lane Taxonomy
defined in spec.md (valid options are: fast, gate, release). Replace both
instances of `[lane:fix]` with the appropriate valid lane identifier based on
the task characteristics and timing requirements. This ensures the tasks are
properly routed and aggregated by the lane-based automation system.
In `@scripts/hook-handlers/subagentstop-reviewer-persist.sh`:
- Around line 124-137: The PLUGIN_ROOT resolution logic searches through
potentially untrusted directories including CWD and PWD to locate
write-review-result.sh, which creates a code injection vulnerability where a
malicious repository could execute arbitrary scripts. Remove CWD and PWD from
the search path loop that checks for PLUGIN_ROOT, and instead only trust the
CLAUDE_PLUGIN_ROOT environment variable or derive the path from the location of
the currently executing script itself. This ensures that write-review-result.sh
called at line 155 is only executed from trusted locations under the actual
plugin installation directory.
In `@scripts/pretooluse-guard.sh`:
- Around line 1262-1277: The approval guard can be bypassed when using git
commit with flags like -a, --all, or --include, which expand commit targets
beyond the staging area. The current check in the initial conditional (starting
at line 1262) detects dangerous git operations like add, restore, reset, and rm,
but does not account for commit flags that modify behavior. Add a check to the
initial conditional pattern to detect and reject git commit commands with these
expansion flags (git commit -a, git commit --all, git commit --include, etc.),
treating them as non-bookkeeping operations by setting BOOKKEEPING_ONLY to
false, ensuring that only pure git commit with no flags that expand commit scope
passes through to the staged files validation logic.
In `@skills/cc-cursor-cc/SKILL.md`:
- Around line 3-4: The description and description-en fields in the SKILL.md
file exceed the character limit of 150 characters (currently at 209 characters).
Shorten both description fields to be under 150 characters while retaining the
most essential information about the skill's purpose. Focus on keeping the core
functionality (brainstorm validation with Cursor PM and handoff workflow) while
removing or condensing less critical details like the specific trigger
conditions and skip scenarios.
In `@skills/cursor-do/SKILL.md`:
- Around line 3-4: The SKILL.md file for cursor-do is missing the required
`disable-model-invocation: true` field in its frontmatter. Since cursor-do is a
write task delegation skill with dangerous side-effects, add the
`disable-model-invocation: true` field to the frontmatter section (before or
after the existing description and description-en fields) to comply with the
guidelines for skills that perform write operations.
In `@skills/harness-release/SKILL.md`:
- Around line 114-116: The JSON template example in the tmp-review-result.json
section uses abbreviated notation with ellipsis (...) which obscures the
REQUEST_CHANGES case mentioned in line 102. Replace the abbreviated template
with two explicit examples showing the complete JSON structure for both the
APPROVE verdict case and the REQUEST_CHANGES verdict case, removing the ellipsis
and making it clear that both verdict values are valid formats for the
schema_version review-result.v1 structure.
In `@tests/test-release-multi-commit.sh`:
- Around line 87-88: The trap command on line 87 references SANDBOX_B and
SANDBOX_C variables that may not be defined at the time the trap is registered,
which can cause a secondary failure if set -u is enabled and the trap is
triggered before these variables are assigned. Use safe parameter expansion
syntax with default values (empty string defaults) for all three sandbox
variables in the trap statement to prevent undefined variable errors during trap
execution, ensuring stable failure diagnostics.
- Around line 72-74: The CLAUDE_PLUGIN_ROOT environment variable is currently
only applied to the printf command on the left side of the pipe, but not passed
to the bash command executing GUARD_SCRIPT on the right side. In a pipeline,
each command runs in a separate context. To fix this, either export
CLAUDE_PLUGIN_ROOT before the pipeline command or explicitly set it for the bash
command that runs GUARD_SCRIPT, so that the guard script receives the correct
ROOT_DIR value as intended by the test.
In `@tests/test-review-result-persistence.sh`:
- Around line 76-77: The bash invocations of the WRITE_SCRIPT variable on lines
76 and 114 are creating side effects in the repository root (specifically
`.claude/state/review-approved.json`) based on the current working directory,
which pollutes the repository state and affects other tests. To fix this, wrap
the WRITE_SCRIPT bash calls with a change of working directory to the temporary
test directory (the directory containing OUTPUT_JSON) so that all file
operations occur within the test's isolated temporary directory rather than at
the repository root. Use a subshell or cd command to ensure the script executes
with the correct working directory context.
In `@tests/test-reviewer-stop-persist.sh`:
- Line 116: The trap command on line 116 uses unguarded variable expansions for
SANDBOX1 through SANDBOX4, which will cause errors under set -u if any of these
variables are undefined when the trap is triggered. Replace each variable
reference with safe parameter expansion using the ${VAR:-} syntax (which expands
to an empty string if the variable is undefined) for all four SANDBOX variables
in the rm command to prevent secondary errors during cleanup and make debugging
easier.
---
Nitpick comments:
In `@codex/.codex/skills/harness-release/SKILL.md`:
- Line 120: The temporary file path `.claude/state/tmp-review-result.json` uses
a predictable fixed filename which can cause collisions when multiple
orchestrator instances run concurrently. Replace this hardcoded path with a
dynamically generated filename using mktemp with a pattern like
`.claude/state/tmp-review-result.XXXXXX`, store the result in a variable, and
update all references to the temporary file (including the write operation and
the rm cleanup command) to use this variable instead of the literal filename to
ensure each instance gets a unique temporary file.
In `@docs/skill-consolidation-cognitive-load.md`:
- Around line 1-76: Add a reference to this decision document in the README.md
file by creating or updating a "Decision Log" section that links to
docs/skill-consolidation-cognitive-load.md with context explaining that this
document contains the rationale for keeping the three cognitive-load skills
(harness-accept, harness-plan-brief, harness-progress) separate rather than
consolidating them, and serves as the reference point for when these decisions
might be revisited in future phases based on the defined trigger conditions.
In `@skills/harness-release/SKILL.md`:
- Line 120: The temporary file `.claude/state/tmp-review-result.json` uses a
predictable fixed path which risks file collisions when multiple orchestrator
instances run concurrently. Replace the hardcoded filename with a dynamically
generated filename using mktemp with a template pattern like
`.claude/state/tmp-review-result.XXXXXX` to create unique temporary files. Store
the generated filename in a variable, use that variable when writing to and
reading from the temporary file in the write-review-result.sh script invocation,
and update the rm command to remove the dynamically named file instead of the
fixed path. This ensures each orchestrator instance gets its own isolated
temporary file.
🪄 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: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 266c972d-363d-4fb6-a470-bcf80241f11f
📒 Files selected for processing (55)
.claude-plugin/hooks.jsonCHANGELOG.mdCLAUDE.mdPlans.mdREADME.mdagents/reviewer.mdcodex/.codex/skills/cc-cursor-cc/SKILL.mdcodex/.codex/skills/cursor-ask/SKILL.mdcodex/.codex/skills/cursor-do/SKILL.mdcodex/.codex/skills/cursor-setup/SKILL.mdcodex/.codex/skills/gogcli-ops/SKILL.mdcodex/.codex/skills/harness-accept/SKILL.mdcodex/.codex/skills/harness-orchestration/SKILL.mdcodex/.codex/skills/harness-plan-brief/SKILL.mdcodex/.codex/skills/harness-progress/SKILL.mdcodex/.codex/skills/harness-release/SKILL.mdcodex/.codex/skills/harness-review/SKILL.mdcodex/.codex/skills/memory/SKILL.mddocs/i18n.mddocs/known-limitations.mddocs/skill-consolidation-cognitive-load.mdgo/internal/hookhandler/posttooluse_commit_cleanup.gogo/internal/hookhandler/posttooluse_commit_cleanup_test.gohooks/hooks.jsonopencode/skills/cc-cursor-cc/SKILL.mdopencode/skills/cursor-ask/SKILL.mdopencode/skills/cursor-do/SKILL.mdopencode/skills/cursor-setup/SKILL.mdopencode/skills/gogcli-ops/SKILL.mdopencode/skills/harness-accept/SKILL.mdopencode/skills/harness-orchestration/SKILL.mdopencode/skills/harness-plan-brief/SKILL.mdopencode/skills/harness-progress/SKILL.mdopencode/skills/harness-release/SKILL.mdopencode/skills/harness-review/SKILL.mdopencode/skills/memory/SKILL.mdscripts/check-skill-description-budget.shscripts/hook-handlers/subagentstop-reviewer-persist.shscripts/pretooluse-guard.shskills/cc-cursor-cc/SKILL.mdskills/cursor-ask/SKILL.mdskills/cursor-do/SKILL.mdskills/cursor-setup/SKILL.mdskills/gogcli-ops/SKILL.mdskills/harness-accept/SKILL.mdskills/harness-orchestration/SKILL.mdskills/harness-plan-brief/SKILL.mdskills/harness-progress/SKILL.mdskills/harness-release/SKILL.mdskills/harness-review/SKILL.mdskills/memory/SKILL.mdspec.mdtests/test-release-multi-commit.shtests/test-review-result-persistence.shtests/test-reviewer-stop-persist.sh
| #### `harness-review` / `harness-release` で出た APPROVE が commit guard を通らなかった問題(#218) | ||
|
|
||
| **今まで**: `/harness-review` を単独で実行したり、`/harness-release` の Review Gate が委譲したレビューで `APPROVE` が出ても、その verdict は会話に表示されるだけで `.claude/state/review-result.json` には書かれませんでした。PreToolUse commit guard はそのファイルを読むため、続く `git commit` は「Run /harness-review before committing」で弾かれ、release が事実上動かない状態でした。Plans.md の work skill だけが `write-review-result.sh` を呼んでいた歴史的事情が原因です。 | ||
|
|
||
| **今後**: 二段防御で必ず保存されるようになりました。`harness-review` skill には Output Contract 直後に `write-review-result.sh` 呼び出し step を追加(work step 10 と同じパターン)。さらに `SubagentStop` hook で reviewer subagent の最終応答から `review-result.v1` JSON ブロックを抽出して自動保存する backstop を新設したため、SKILL step を踏み忘れても保存されます。reviewer subagent は read-only のまま維持(write は hook 側)。`harness-release` の Review Gate にも二段防御の persist check を入れました。 | ||
|
|
||
| #### release の bump commit が承認消費でブロックされる問題(#219) | ||
|
|
||
| **今まで**: PostToolUse の commit-cleanup は `git commit` が 1 回成功するたびに `.claude/state/review-result.json` を無条件で削除して「次回の commit 前に再レビュー」を要求していました。一方 `harness-release` は bare release で work commit + version bump commit と複数回 commit します。最初の work commit で承認が消費されるため、続く bump commit が APPROVE 無しでブロックされ、release が止まる構造でした。 | ||
|
|
||
| **今後**: cleanup と commit guard の両側で「bookkeeping commit」を識別するようになりました。`VERSION` / `.claude-plugin/plugin.json` / `harness.toml` / `CHANGELOG.md` のみを変更する commit と merge commit はレビュー対象外として、承認削除を skip し、commit guard も承認を要求しません。これにより `harness-release` の自動 commit はそのまま通過します。判定根拠は `.claude/state/commit-cleanup-audit.jsonl` に append-only で記録されます。git unavailable 時は fail-closed(= 従来動作 = 削除)を維持。 | ||
|
|
||
| #### Skill listing budget overflow による auto-loading 信頼性低下の短期対応(#200) | ||
|
|
||
| **今まで**: 28 skills を LLM に送る description の合計が 9,089 chars で、CC の 6,000 chars budget を超えていました。alphabetical 順の終盤スキルが truncate される可能性があり、auto-loading の信頼性が下がっていました。 | ||
|
|
||
| **今後**: 上位 verbose 10 件(`harness-accept` 601 → 195 chars / `cursor-ask` 531 → 167 / `harness-plan-brief` 523 → 196 / `harness-progress` 489 → 187 / `harness-orchestration` 446 → 175 / `cursor-do` 418 → 197 / `gogcli-ops` 418 → 185 / `memory` 365 → 175 / `cc-cursor-cc` 315 → 199 / `cursor-setup` 311 → 187)の description を ≤200 chars に trim し、total を 10,619 → 8,099 chars に 20% 圧縮しました。trigger phrase(auto-loading キーワード)は保持。詳細仕様は SKILL.md body に移動しています。`scripts/check-skill-description-budget.sh` を新規追加して budget gate を機械検証できるようにしました。残り 28 件の trim と 6,000 chars 厳格達成は次フェーズで対応します。 | ||
|
|
||
| #### Language / i18n 設定手順を README からたどれるよう整備(#173) | ||
|
|
||
| **今まで**: 出力言語の切替方法(英語 default / 日本語 opt-in)は CLAUDE.md の Language 節に短く書かれているだけで、README からは直接たどれませんでした。新規ユーザーは英語以外で出力する方法を見つけるのに時間がかかっていました。 | ||
|
|
||
| **今後**: `docs/i18n.md` を新規 SSOT として作成し、3 経路(`.claude-code-harness.config.yaml` の `i18n.language` / `CLAUDE_CODE_HARNESS_LANG=ja` / per-message session 指示)と precedence(config > env > en)、「変更されない箇所」(machine-readable JSON, commit prefixes)を明示。README の Documentation 表と CLAUDE.md Language 節からリンクしています。 | ||
|
|
||
| #### Reviewer の cyber-related safeguard 中断への mitigation(#172) | ||
|
|
||
| **今まで**: `claude-code-harness:reviewer`(Opus 4.7)が security 問題を検出した直後、上流の cyber-related safeguard が triggered して reviewer が途中で停止し、verdict JSON が生成されない事象が観測されていました。Harness 側で完全消去はできない(Anthropic 製品仕様の model-side safeguard)。 | ||
|
|
||
| **今後**: `agents/reviewer.md` に「security finding は中立的事実列挙にとどめる」instruction を追加。exploit code / PoC を本文に展開せず、CVE / CWE / OWASP の識別子のみ引用、mitigation は修正方針だけ記述するルールに narrow しました。完全な workaround として `docs/known-limitations.md` を新規作成し、症状・根本原因・回避策(Opus 4.8 への切替推奨 / security 専門 PR は人手レビューに escalate)を SSOT 化しました。 |
There was a problem hiding this comment.
Major change 記載を Before/After テーブル形式に揃えてください。
Line 11-39 は #218/#219 などの主要変更ですが、現状は「今まで/今後」段落のみです。CHANGELOG ガイドライン準拠のため、Before/After テーブルを併記してください。
As per coding guidelines, CHANGELOG.md の major changes は Before/After テーブル形式が必須です。
🤖 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 `@CHANGELOG.md` around lines 11 - 39, The major change entries (issues `#218`,
`#219`, `#200`, `#173`, `#172`) in the CHANGELOG.md file are currently formatted as
paragraph sections with "今まで" (Before) and "今後" (After) text blocks, but they
should follow the Before/After table format per CHANGELOG guidelines.
Restructure each major change section by converting the existing "今まで" paragraph
and "今後" paragraph content into a two-column markdown table with "Before" and
"After" headers, keeping all the existing content but reorganizing it into the
table structure. Apply this table format consistently across all five major
change entries (the `#218` harness-review/harness-release APPROVE issue, the `#219`
release bump commit issue, the `#200` skill listing budget issue, the `#173` i18n
documentation issue, and the `#172` reviewer safeguard issue).
Source: Coding guidelines
| cat > .claude/state/tmp-review-result.json <<'JSON' | ||
| { "schema_version": "review-result.v1", "verdict": "APPROVE", ... } | ||
| JSON |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# write-review-result.sh の function 署名と入力スキーマを検出
# 1. Script の header コメントか help を確認
head -50 scripts/write-review-result.sh | grep -A 20 "schema\|format\|json\|verdict"
# 2. 関数定義内の jq filter から必須フィールドを逆算
grep -A 30 "jq.*verdict" scripts/write-review-result.sh | head -30Repository: Chachamaru127/claude-code-harness
Length of output: 2143
🏁 Script executed:
# First, check the exact lines in question
cat -n codex/.codex/skills/harness-release/SKILL.md | sed -n '110,120p'Repository: Chachamaru127/claude-code-harness
Length of output: 675
🏁 Script executed:
# Search for complete schema documentation in write-review-result.sh
cat scripts/write-review-result.sh | head -100Repository: Chachamaru127/claude-code-harness
Length of output: 2854
🏁 Script executed:
# Look for example JSON files or test cases showing the complete structure
find . -name "*.json" -path "*review*" -o -name "*review*.json" 2>/dev/null | head -20Repository: Chachamaru127/claude-code-harness
Length of output: 59
🏁 Script executed:
# Get the full write-review-result.sh to see complete jq transformation
wc -l scripts/write-review-result.shRepository: Chachamaru127/claude-code-harness
Length of output: 112
🏁 Script executed:
# Read the complete write-review-result.sh file
cat scripts/write-review-result.shRepository: Chachamaru127/claude-code-harness
Length of output: 9776
🏁 Script executed:
# Search for any documentation about the JSON schema
rg "schema_version|review-result.v1" --type md -B 2 -A 2Repository: Chachamaru127/claude-code-harness
Length of output: 226
🏁 Script executed:
# Search for documentation about review result schema
rg "verdict|schema" --type md -lRepository: Chachamaru127/claude-code-harness
Length of output: 226
🏁 Script executed:
# Look at context around where the template is used in SKILL.md
cat -n codex/.codex/skills/harness-release/SKILL.md | sed -n '100,130p'Repository: Chachamaru127/claude-code-harness
Length of output: 1682
🏁 Script executed:
# Check if there are any example review-result.json files in the repo
find . -name "*review*" -type f | grep -E "\.json|\.jsonl|example"Repository: Chachamaru127/claude-code-harness
Length of output: 59
🏁 Script executed:
# Search entire SKILL.md for any schema or template documentation
cat codex/.codex/skills/harness-release/SKILL.md | grep -i "schema\|template\|required\|REQUEST_CHANGES" | head -20Repository: Chachamaru127/claude-code-harness
Length of output: 521
🏁 Script executed:
# Check if there's any README or documentation about the verdict format
find codex/.codex/skills/harness-release -name "*.md" -o -name "README*" | head -10Repository: Chachamaru127/claude-code-harness
Length of output: 315
🏁 Script executed:
# Look for any test files or examples showing REQUEST_CHANGES structure
find . -type f \( -name "*.md" -o -name "*.sh" \) | xargs grep -l "REQUEST_CHANGES" 2>/dev/null | head -10Repository: Chachamaru127/claude-code-harness
Length of output: 480
JSON スキーマドキュメンテーションの不完全性: ... で省略された必須フィールドを明示すること
行115 の verdict JSON テンプレート { "schema_version": "review-result.v1", "verdict": "APPROVE", ... } は省略記号により実装への指針が不明確です。以下の点を修正してください:
- 最小限の必須フィールド:
schema_versionとverdictのみで十分であることを明記、または省略記号を削除して{"schema_version": "review-result.v1", "verdict": "APPROVE"}と明示 - REQUEST_CHANGES の例を追加: 102行目で言及されている REQUEST_CHANGES シナリオに対応した例
{"schema_version": "review-result.v1", "verdict": "REQUEST_CHANGES"}を記載 write-review-result.shのスキーマ参照: 省略記号の代わりに「詳細はscripts/write-review-result.shの jq フィルタを参照」とコメント追記
orchestrator が in-context で JSON を構築するため、テンプレートの明確性が実装の正確性に直結します。
🧰 Tools
🪛 SkillSpector (2.1.1)
[error] 120: [TM1] Tool Parameter Abuse: Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
Remediation: Validate all tool parameters against an allowlist. Reject dangerous parameter values (shell=True, --force, -rf /) and use safe defaults.
(Tool Misuse (TM1))
🤖 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 `@codex/.codex/skills/harness-release/SKILL.md` around lines 114 - 116, The
JSON schema template in the verdict block uses ellipsis (`...`) which obscures
the complete structure and creates ambiguity about required fields. Replace the
ellipsis with either a complete, explicit minimal JSON example showing just the
required fields (schema_version and verdict), or add a comment that references
scripts/write-review-result.sh for full schema details. Additionally, add a
second example explicitly showing the REQUEST_CHANGES verdict case (referenced
in the line 102 context) to clarify both approval and rejection paths. This
ensures the orchestrator has clear guidance when building JSON structures
in-context.
| For evidence and the operator-side context, see `harness-mem` entry | ||
| [`fable5-safeguard-model-switch`](../.claude/memory/) (security context → | ||
| automatic safeguard fire is a product invariant). |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Verify the memory reference path exists and check linking patterns in docs/
find . -name "*.md" -path "./docs/*" -exec grep -l "\.claude" {} \;
find . -path "./.claude/memory/*" -type f 2>/dev/null | head -20Repository: Chachamaru127/claude-code-harness
Length of output: 3347
🏁 Script executed:
# List .claude/memory root level files and directories
ls -la ./.claude/memory/ 2>/dev/null | head -30
# Search for fable5-safeguard-model-switch references
rg "fable5-safeguard-model-switch" --type md
# Check how other docs link to .claude/memory
rg "\.claude/memory" --type md -B 1 -A 1 | head -50Repository: Chachamaru127/claude-code-harness
Length of output: 558
🏁 Script executed:
# Search without type filter to find fable5-safeguard-model-switch references
rg "fable5-safeguard-model-switch" . --no-type-list
# Check the actual known-limitations.md file around line 28
sed -n '25,30p' ./docs/known-limitations.md
# Search for any .claude/memory references in all text files
rg "\.claude/memory" . --no-type-list -A 1 -B 1Repository: Chachamaru127/claude-code-harness
Length of output: 1231
🏁 Script executed:
# Search for any references to harness-mem or related memory entries
rg "harness-mem" . --no-ignore
# Check the full context around line 28 in known-limitations.md
sed -n '20,35p' ./docs/known-limitations.md
# Search for memory entry patterns - look for any .md files that might match this concept
rg "safeguard.*model.*switch" . --no-ignore
# Check if there are any TODOs or FIXMEs related to this
rg "TODO|FIXME" ./docs/known-limitations.mdRepository: Chachamaru127/claude-code-harness
Length of output: 50389
メモリエントリ参照が存在しません — ドキュメント訂正が必須です
Line 28 のメモリエントリ参照 [fable5-safeguard-model-switch](../.claude/memory/) は、リポジトリ内に存在しないファイルを指しており、404 エラーになります。./.claude/memory/ ディレクトリは空です(archive/ サブディレクトリのみ)。
このドキュメントは cyber-safeguard interruption という重要な機能上の制限を説明しているため、適切な参照またはファイル化が必要です。以下いずれかで対応してください:
- 外部の
harness-memcompanion プロジェクトへの参照に変更するか .claude/memory/fable5-safeguard-model-switch.mdを作成して evidence を記録するか- 参照を削除し、documentation 内に直接 evidence を記載するか
🤖 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/known-limitations.md` around lines 27 - 29, The documentation file
`docs/known-limitations.md` contains a broken link reference to
`fable5-safeguard-model-switch` pointing to `../.claude/memory/` that doesn't
exist in the repository, resulting in a 404 error. Since this documents an
important feature limitation regarding cyber-safeguard interruption, fix the
reference by choosing one approach: update the link to reference an external
`harness-mem` companion project URL instead of the local path, create the
missing `.claude/memory/fable5-safeguard-model-switch.md` file with the required
evidence documentation, or remove the reference entirely and include the
evidence details directly within the `docs/known-limitations.md` file itself.
| "type": "command", | ||
| "command": "/bin/bash -c 'valid_root(){ local r=\"${1:-}\"; [ -n \"$r\" ] && [ -f \"$r/scripts/hook-handlers/subagentstop-reviewer-persist.sh\" ] && [ -f \"$r/scripts/write-review-result.sh\" ]; }; root=\"${CLAUDE_PLUGIN_ROOT:-}\"; if ! valid_root \"$root\"; then root=\"\"; for c in \"${CLAUDE_PROJECT_DIR:-}\" \"$PWD\" \"$HOME/.claude/plugins/marketplaces/claude-code-harness-marketplace\" \"$HOME/.claude/plugins/cache/claude-code-harness-marketplace/claude-code-harness/\"*; do if valid_root \"$c\"; then root=\"$c\"; break; fi; done; fi; if ! valid_root \"$root\"; then exit 0; fi; exec bash \"$root/scripts/hook-handlers/subagentstop-reviewer-persist.sh\"' _", | ||
| "timeout": 15 |
There was a problem hiding this comment.
SubagentStop 追加フックの valid_root 判定が弱すぎます。
Line 196 は「同名スクリプトの存在」だけで root を正当化しており、既存フックで使っている plugin 実体検証(bin/harness + plugin.json の name 一致)がありません。結果として、プロジェクト側に同名ファイルがあるとそのまま実行されます。
🔧 修正例(既存フックと同等の root 検証 + root の引き継ぎ)
- "command": "/bin/bash -c 'valid_root(){ local r=\"${1:-}\"; [ -n \"$r\" ] && [ -f \"$r/scripts/hook-handlers/subagentstop-reviewer-persist.sh\" ] && [ -f \"$r/scripts/write-review-result.sh\" ]; }; root=\"${CLAUDE_PLUGIN_ROOT:-}\"; ... if ! valid_root \"$root\"; then exit 0; fi; exec bash \"$root/scripts/hook-handlers/subagentstop-reviewer-persist.sh\"' _",
+ "command": "/bin/bash -c 'valid_root(){ local r=\"${1:-}\"; [ -n \"$r\" ] && [ -x \"$r/bin/harness\" ] && [ -f \"$r/.claude-plugin/plugin.json\" ] && /usr/bin/grep -q \"\\\"name\\\"[[:space:]]*:[[:space:]]*\\\"claude-code-harness\\\"\" \"$r/.claude-plugin/plugin.json\" && [ -f \"$r/scripts/hook-handlers/subagentstop-reviewer-persist.sh\" ] && [ -f \"$r/scripts/write-review-result.sh\" ]; }; root=\"${CLAUDE_PLUGIN_ROOT:-}\"; ... if ! valid_root \"$root\"; then exit 0; fi; export CLAUDE_PLUGIN_ROOT=\"$root\"; exec bash \"$root/scripts/hook-handlers/subagentstop-reviewer-persist.sh\"' _",🤖 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 `@hooks/hooks.json` around lines 195 - 197, The valid_root function in the bash
command for the SubagentStop hook is checking only for the existence of script
files without validating the actual plugin entity. Enhance the valid_root
function to include the same plugin verification logic used in existing hooks,
which should check for the presence of bin/harness and verify that the
plugin.json name field matches the expected plugin identifier. This will prevent
the hook from executing scripts from the project directory when same-named files
exist there.
| bash "${HARNESS_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-$PWD}}/scripts/write-review-result.sh" \ | ||
| .claude/state/tmp-review-result.json \ | ||
| "$(git rev-parse --short HEAD 2>/dev/null || true)" |
There was a problem hiding this comment.
$PWD フォールバックは信頼境界外スクリプトを実行し得ます
Line 302 の ${...:-$PWD} により、plugin root 未解決時にカレントリポジトリの scripts/write-review-result.sh を実行してしまいます。review verdict 永続化の経路としては fail-closed にすべきです。
🔒 修正案
-bash "${HARNESS_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-$PWD}}/scripts/write-review-result.sh" \
+plugin_root="${HARNESS_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-}}"
+if [ -z "$plugin_root" ] || [ ! -x "$plugin_root/scripts/write-review-result.sh" ]; then
+ echo "write-review-result.sh not found under plugin root" >&2
+ exit 1
+fi
+bash "$plugin_root/scripts/write-review-result.sh" \
.claude/state/tmp-review-result.json \
"$(git rev-parse --short HEAD 2>/dev/null || true)"📝 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.
| bash "${HARNESS_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-$PWD}}/scripts/write-review-result.sh" \ | |
| .claude/state/tmp-review-result.json \ | |
| "$(git rev-parse --short HEAD 2>/dev/null || true)" | |
| plugin_root="${HARNESS_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-}}" | |
| if [ -z "$plugin_root" ] || [ ! -x "$plugin_root/scripts/write-review-result.sh" ]; then | |
| echo "write-review-result.sh not found under plugin root" >&2 | |
| exit 1 | |
| fi | |
| bash "$plugin_root/scripts/write-review-result.sh" \ | |
| .claude/state/tmp-review-result.json \ | |
| "$(git rev-parse --short HEAD 2>/dev/null || true)" |
🧰 Tools
🪛 SkillSpector (2.1.1)
[error] 307: [TM1] Tool Parameter Abuse: Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
Remediation: Validate all tool parameters against an allowlist. Reject dangerous parameter values (shell=True, --force, -rf /) and use safe defaults.
(Tool Misuse (TM1))
🤖 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 `@opencode/skills/harness-review/SKILL.md` around lines 302 - 304, The bash
command that invokes write-review-result.sh uses a fallback to $PWD when
HARNESS_PLUGIN_ROOT and CLAUDE_PLUGIN_ROOT are not set, which could execute
scripts from an untrusted repository. Remove the $PWD fallback from the
parameter expansion so the command fails safely if neither environment variable
is defined, instead of defaulting to executing scripts from the current working
directory.
| cat > .claude/state/tmp-review-result.json <<'JSON' | ||
| { "schema_version": "review-result.v1", "verdict": "APPROVE", ... } | ||
| JSON |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# write-review-result.sh の function 署名と入力スキーマを検出
# 1. Script の header コメントか help を確認
head -50 scripts/write-review-result.sh | grep -A 20 "schema\|format\|json\|verdict"
# 2. 関数定義内の jq filter から必須フィールドを逆算
grep -A 30 "jq.*verdict" scripts/write-review-result.sh | head -30Repository: Chachamaru127/claude-code-harness
Length of output: 2143
🏁 Script executed:
# Check the SKILL.md file content around lines 114-116
sed -n '100,130p' skills/harness-release/SKILL.mdRepository: Chachamaru127/claude-code-harness
Length of output: 1465
🏁 Script executed:
# Get full content of write-review-result.sh to understand schema requirements
wc -l scripts/write-review-result.sh
# Read key sections that process the JSON schema
sed -n '1,100p' scripts/write-review-result.shRepository: Chachamaru127/claude-code-harness
Length of output: 2889
🏁 Script executed:
# Read the rest of write-review-result.sh to see complete output schema
sed -n '100,232p' scripts/write-review-result.shRepository: Chachamaru127/claude-code-harness
Length of output: 7091
🏁 Script executed:
# Search for other examples of review-result or verdict JSON in the codebase
rg "verdict.*APPROVE|verdict.*REQUEST_CHANGES" --type json -A 2 -B 2
# Check if there are comments about input schema requirements
rg -i "input.*schema|required.*field" scripts/ -A 3
# Look for test files or examples
find . -name "*test*" -o -name "*example*" | head -20Repository: Chachamaru127/claude-code-harness
Length of output: 1482
🏁 Script executed:
# Search more broadly for verdict examples or documentation
rg "verdict" skills/harness-release/ -B 3 -A 3
# Look at what fields orchestrator needs to set vs what script sets
rg "schema_version.*review-result" scripts/ -B 5 -A 5Repository: Chachamaru127/claude-code-harness
Length of output: 59
🏁 Script executed:
# Get full SKILL.md content
wc -l skills/harness-release/SKILL.md
# Read the problematic section with more context (lines 100-150)
sed -n '100,150p' skills/harness-release/SKILL.mdRepository: Chachamaru127/claude-code-harness
Length of output: 2027
JSON テンプレートに REQUEST_CHANGES の例を明示する
行114-116 の JSON テンプレートが { "schema_version": "review-result.v1", "verdict": "APPROVE", ... } と省略記号で表記されており、REQUEST_CHANGES ケースが示されていません。行102で「REQUEST_CHANGESでも保存すること」と明記されているため、以下のように修正してください:
# APPROVE の場合
{ "schema_version": "review-result.v1", "verdict": "APPROVE" }
# REQUEST_CHANGES の場合
{ "schema_version": "review-result.v1", "verdict": "REQUEST_CHANGES" }このテンプレートは scripts/write-review-result.sh の入力スキーマであり、スクリプト側で schema_version の presence チェック、verdict の正規化、および追加フィールド(generated_at, checks, gaps など)の生成が行われます。
🧰 Tools
🪛 SkillSpector (2.1.1)
[error] 120: [TM1] Tool Parameter Abuse: Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
Remediation: Validate all tool parameters against an allowlist. Reject dangerous parameter values (shell=True, --force, -rf /) and use safe defaults.
(Tool Misuse (TM1))
🤖 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 `@skills/harness-release/SKILL.md` around lines 114 - 116, The JSON template
example in the tmp-review-result.json section uses abbreviated notation with
ellipsis (...) which obscures the REQUEST_CHANGES case mentioned in line 102.
Replace the abbreviated template with two explicit examples showing the complete
JSON structure for both the APPROVE verdict case and the REQUEST_CHANGES verdict
case, removing the ellipsis and making it clear that both verdict values are
valid formats for the schema_version review-result.v1 structure.
| cd "$sandbox" | ||
| CLAUDE_PLUGIN_ROOT="$ROOT_DIR" printf '%s' "$input" | bash "$GUARD_SCRIPT" 2>/dev/null | ||
| ) |
There was a problem hiding this comment.
CLAUDE_PLUGIN_ROOT が guard 側に渡っていません
Line 73 はパイプ左側 (printf) にだけ環境変数が付いており、bash "$GUARD_SCRIPT" には届きません。テストの前提(root 解決)と実行実態がズレます。
修正案
- CLAUDE_PLUGIN_ROOT="$ROOT_DIR" printf '%s' "$input" | bash "$GUARD_SCRIPT" 2>/dev/null
+ printf '%s' "$input" | CLAUDE_PLUGIN_ROOT="$ROOT_DIR" bash "$GUARD_SCRIPT" 2>/dev/null📝 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.
| cd "$sandbox" | |
| CLAUDE_PLUGIN_ROOT="$ROOT_DIR" printf '%s' "$input" | bash "$GUARD_SCRIPT" 2>/dev/null | |
| ) | |
| cd "$sandbox" | |
| printf '%s' "$input" | CLAUDE_PLUGIN_ROOT="$ROOT_DIR" bash "$GUARD_SCRIPT" 2>/dev/null | |
| ) |
🤖 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 `@tests/test-release-multi-commit.sh` around lines 72 - 74, The
CLAUDE_PLUGIN_ROOT environment variable is currently only applied to the printf
command on the left side of the pipe, but not passed to the bash command
executing GUARD_SCRIPT on the right side. In a pipeline, each command runs in a
separate context. To fix this, either export CLAUDE_PLUGIN_ROOT before the
pipeline command or explicitly set it for the bash command that runs
GUARD_SCRIPT, so that the guard script receives the correct ROOT_DIR value as
intended by the test.
| trap 'rm -rf "$SANDBOX_A" "$SANDBOX_B" "$SANDBOX_C"' EXIT | ||
| make_sandbox "$SANDBOX_A" |
There was a problem hiding this comment.
初回 trap で未定義変数展開のリスクがあります
Line 87 の trap は SANDBOX_B と SANDBOX_C が未代入のまま EXIT すると set -u で二次失敗を起こします。安全展開にしておくと失敗時の診断が安定します。
修正案
-trap 'rm -rf "$SANDBOX_A" "$SANDBOX_B" "$SANDBOX_C"' EXIT
+trap 'rm -rf "${SANDBOX_A:-}" "${SANDBOX_B:-}" "${SANDBOX_C:-}"' EXIT📝 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.
| trap 'rm -rf "$SANDBOX_A" "$SANDBOX_B" "$SANDBOX_C"' EXIT | |
| make_sandbox "$SANDBOX_A" | |
| trap 'rm -rf "${SANDBOX_A:-}" "${SANDBOX_B:-}" "${SANDBOX_C:-}"' EXIT | |
| make_sandbox "$SANDBOX_A" |
🤖 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 `@tests/test-release-multi-commit.sh` around lines 87 - 88, The trap command on
line 87 references SANDBOX_B and SANDBOX_C variables that may not be defined at
the time the trap is registered, which can cause a secondary failure if set -u
is enabled and the trap is triggered before these variables are assigned. Use
safe parameter expansion syntax with default values (empty string defaults) for
all three sandbox variables in the trap statement to prevent undefined variable
errors during trap execution, ensuring stable failure diagnostics.
| bash "${WRITE_SCRIPT}" "${INPUT_JSON}" "deadbeef" "${OUTPUT_JSON}" >/dev/null 2>&1 | ||
| assert "output review-result.json exists" "[ -f '${OUTPUT_JSON}' ]" |
There was a problem hiding this comment.
テスト実行がリポジトリ直下の承認状態ファイルを汚染します
Line 76 と Line 114 の呼び出しは write-review-result.sh の副作用先(.claude/state/review-approved.json)を cwd 基準で作成/削除するため、テスト用一時ディレクトリ外の状態を壊します。結果として他テストやローカル commit guard 判定を汚染します。cwd を一時ディレクトリに固定して実行してください。
修正案
-bash "${WRITE_SCRIPT}" "${INPUT_JSON}" "deadbeef" "${OUTPUT_JSON}" >/dev/null 2>&1
+(cd "${TMPDIR_TEST}" && bash "${WRITE_SCRIPT}" "${INPUT_JSON}" "deadbeef" "${OUTPUT_JSON}" >/dev/null 2>&1)
@@
-bash "${WRITE_SCRIPT}" "${INPUT2}" "" "${OUTPUT2}" >/dev/null 2>&1
+(cd "${TMPDIR_TEST}" && bash "${WRITE_SCRIPT}" "${INPUT2}" "" "${OUTPUT2}" >/dev/null 2>&1)Also applies to: 114-115
🤖 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 `@tests/test-review-result-persistence.sh` around lines 76 - 77, The bash
invocations of the WRITE_SCRIPT variable on lines 76 and 114 are creating side
effects in the repository root (specifically
`.claude/state/review-approved.json`) based on the current working directory,
which pollutes the repository state and affects other tests. To fix this, wrap
the WRITE_SCRIPT bash calls with a change of working directory to the temporary
test directory (the directory containing OUTPUT_JSON) so that all file
operations occur within the test's isolated temporary directory rather than at
the repository root. Use a subshell or cd command to ensure the script executes
with the correct working directory context.
| # (1) APPROVE | ||
| echo "[1] APPROVE reviewer turn → review-result.json persisted with verdict APPROVE" | ||
| SANDBOX1="$(mktemp -d)" | ||
| trap 'rm -rf "$SANDBOX1" "$SANDBOX2" "$SANDBOX3" "$SANDBOX4"' EXIT |
There was a problem hiding this comment.
set -u 下で trap が未定義変数を参照します
Line 116 の trap は、途中失敗時に未代入の SANDBOX2..4 展開で二次エラーを起こし、原因の切り分けを難しくします。${VAR:-} で安全展開にしてください。
修正案
-trap 'rm -rf "$SANDBOX1" "$SANDBOX2" "$SANDBOX3" "$SANDBOX4"' EXIT
+trap 'rm -rf "${SANDBOX1:-}" "${SANDBOX2:-}" "${SANDBOX3:-}" "${SANDBOX4:-}"' EXIT🤖 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 `@tests/test-reviewer-stop-persist.sh` at line 116, The trap command on line
116 uses unguarded variable expansions for SANDBOX1 through SANDBOX4, which will
cause errors under set -u if any of these variables are undefined when the trap
is triggered. Replace each variable reference with safe parameter expansion
using the ${VAR:-} syntax (which expands to an empty string if the variable is
undefined) for all four SANDBOX variables in the rm command to prevent secondary
errors during cleanup and make debugging easier.
CI 上の 'Check opencode mirror sync' で opencode/AGENTS.md が build-opencode.js の生成結果と 2 行差分していたため sync する。 docs/i18n.md ポインタ追加 (CLAUDE.md と同期) の追従。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…I fix) CI 'Audit breezing benchmark dependencies' step (tests/test-breezing-agent-eval-deps.sh) が moderate 以上の脆弱性検出で fail していたため `npm audit fix` を適用。 13 時間前 (main 最新 release) では同 step が success だったので、その間に 新たに登録された npm advisory (undici TLS bypass / protobufjs shadowing 等) が原因。 Phase 94 とは無関係の時間経過依存。 Fix: - protobufjs <=7.6.2 (moderate): GHSA-f38q-mgvj-vph7 - undici 7.0.0 - 7.27.2 (high): GHSA-vmh5-mc38-953g + GHSA-pr7r-676h-xcf6 7 vulnerabilities → 5 low vulnerabilities (moderate / high はすべて解消、 low は audit-level=moderate gate を通過)。 Verification: - bash tests/test-breezing-agent-eval-deps.sh: PASS - npm audit --audit-level=moderate: exit 0 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Summary
Phase 94 で 5 件の Open Issue (#218, #219, #200, #173, #172) を解消。release blocker (#218 + #219) が中核 で、
harness-review/harness-release単独実行と bare release の multi-commit フローが事実上ブロックされていた問題を 2 段防御で解消。harness-reviewandharness-releasedo not persist the review verdict toreview-result.json, so an APPROVE produced outsideharness-workcannot pass the commit guard #218 :/harness-review単独で出した APPROVE が.claude/state/review-result.jsonに書かれず commit guard が止めていた問題を、SKILL step (94.1.1) + SubagentStop hook backstop (94.1.2) の 2 層で解決harness-release's multi-commit flow (work + bump) the later commit is blocked by the commit guard #219 : PostToolUse cleanup が commit ごとに承認を消費して bump commit が弾かれる問題を、cleanup と commit guard の 両側 で bookkeeping commit (VERSION / plugin.json / harness.toml / CHANGELOG.md / merge) を識別して免除docs/i18n.mdを SSOT 化 (precedence: config > env > en)。README + CLAUDE.md からポインタdocs/known-limitations.mdで cyber-safeguard 限界を文書化 (Anthropic 製品仕様起因のため Harness 側で完全消去は不可)#149 (awesome-codex-plugins listing) は upstream リポへの PR のみで本リポ変更なし — 別 PR で対応。
Closes
Closes #218
Closes #219
Closes #200
Closes #173
Closes #172
Design Notes
2 層防御 (#218)
reviewer subagent は read-only (
Read/Grep/Globのみ) を維持。write は hook 側に外出し。両側免除 (#219)
cleanup だけ免除しても guard 側で APPROVE を要求される。guard だけ免除しても cleanup が先に承認を消費する。両側で同一 4-file taxonomy + merge commit を SSOT に書く最小実装で対処。判定根拠は
.claude/state/commit-cleanup-audit.jsonlに append-only 記録。Codex review P2 + Subagent review findings
実装後の 3 周の独立レビュー で以下を順次解消:
git add && git commitの bookkeeping bypass / test env scope / i18n docs が実装と乖離) [commit38932c91]feature-dev:code-reviewerが NEEDS_CHANGES (bug 1 + quality 2):containsErrorIndicatorが commit message に "nothing to commit" を含む成功 commit を error と誤判定して guard bypass / audit log JSONL injection / test temp dir leak。全修正 [commit4b6925c2]Spec / Documentation
spec.mdに## Review Approval Persistence Contract新節 (Coverage / Bookkeeping-only exemption / Determinism over coordination の 3 部構成)CHANGELOG.md[Unreleased]に 5 Issue 分の Before/After (CHANGELOG 規約準拠)docs/i18n.md,docs/known-limitations.md,docs/skill-consolidation-cognitive-load.mdを新規追加Test plan
go test ./go/internal/hookhandler/...PASS (12 既存 + 5 新規 bookkeeping classifier + 4 新規 containsErrorIndicator regression)bash tests/test-review-result-persistence.sh9/9 PASSbash tests/test-reviewer-stop-persist.sh7/7 PASS (4 シナリオ × 7 assert)bash tests/test-release-multi-commit.sh8/8 PASS (既存 6 + 新規 2 for chained-command bypass)bash tests/validate-plugin.sh104/104 PASSbash scripts/sync-skill-mirrors.sh --checkPASS (no drift)bash scripts/ci/check-consistency.shALL PASSclaude-code-harness:reviewer/plugin-dev:plugin-validator/feature-dev:code-reviewer) で 全 APPROVE/PASSVersion / Release
VERSION/.claude-plugin/plugin.json/harness.tomlは 不変 (no release)。次回 release で Phase 95.1 (#200 残り 28 件 trim) とまとめて bump 予定。🤖 Generated with Claude Code
https://claude.ai/code/session_01Go9gd3S6dywY5aEiLji349
Summary by CodeRabbit
リリースノート