diff --git a/docs/claude-code-web-tasks.md b/docs/claude-code-web-tasks.md index 0d1759bf..62c8ffab 100644 --- a/docs/claude-code-web-tasks.md +++ b/docs/claude-code-web-tasks.md @@ -47,7 +47,6 @@ | 順位 | Tier | 内容 | 対象ファイル (実パス) | 工数 | 注意 | |---|---|---|---|---|---| -| 284 | T2 | `stale_check_enabled` (Option\) の TOML パーステスト追加(未テストのパース経路を補完) | `src/hooks-session-start/src/hooks_config.rs`(`mod tests`、既存 `hooks_config_parses_session_start_staleness_section` 拡張) | XS | 純 deserialize。`temp_dir()` fixture で Linux CI pass 済みパターン、最もクリーン | | 203 | T2 | GitHub token `ghu_` / `ghr_` の secret 検出ブロックテスト 2 件追加 | `src/hooks-pre-tool-validate/src/presets/safety/secret.rs` | XS | todo 記載の `main.rs` は module split でパスドリフト、実体は `secret.rs`。純 regex 判定 | | 240 | T2 | `takt.rs` の spawn/try_wait `Err(_)` → `Err(e)` + `eprintln!`(原因握り潰し解消、`.failed` marker debug 改善) | `src/cli-merge-pipeline/src/feedback/takt.rs`(60・68 行) | XS | pnpm/takt の実実行は成功条件外。compile + clippy 通過で足りる | | 180 | T2 | `escape_markdown_pipe(&str)` を pub 追加 + `format_table` の user field に適用 + 5 variant test(markdown table 破壊の防止 / prompt injection の緩和 = defense-in-depth の一層) | `src/lib-report-formatter/src/lib.rs` | XS-S | 外部依存ゼロの純 lib。既存 private `truncate()` と escape ロジック重複、DRY 整理(共通化 or 役割分担)を検討 | diff --git a/docs/todo-summary2.md b/docs/todo-summary2.md index 42e5dca6..9c51dd5f 100644 --- a/docs/todo-summary2.md +++ b/docs/todo-summary2.md @@ -47,7 +47,6 @@ | 281 | 🚀 Tier 1 | **config-reading hook の current_dir() 解決を検出する lint rule (PR #267 post-merge-feedback T1-1 採用)** | todo15.md | S | なし (新規 hook が cwd 基準 config 解決を実装し pre-push REJECT → fix 修正の実例。cwd drift による silent fail-open は新規 hook のたびに再発しうる。Severity High。順位 287 と同一 PR bundle 推奨) | | 282 | 🚀 Tier 1 | **jj-op-verify の変更系 verb 網羅拡大 — undo/restore/split/bookmark move 等 (PR #267 post-merge-feedback T1-2 採用)** | todo15.md | M | なし (特に `jj undo` の検出漏れは lost-update 再発リスク高。拡張時は expected_op_keyword を jj 0.42 実機の op log 出力と要照合) | | 283 | 🚀 Tier 1 | **jj-op-verify の verb 検出を command-boundary に anchor (PR #267 post-merge-feedback T1-3 採用)** | todo15.md | S | なし (commit message 引用符内の "jj new" 等での false positive 防止。実装時に accepted risk で一度見送った経緯あり = 着手時に実観測 0 件のままか再確認。順位 285 と表裏) | -| 284 | 🔧 Tier 2 | **stale_check_enabled の TOML パーステスト追加 (PR #267 post-merge-feedback T2-1 採用)** | todo15.md | XS | なし (新フィールドのパース経路が未テスト = silent degrade リスク。既存テストへの数行追加で完備) | | 285 | 🔧 Tier 2 | **jj keyword を含む commit message の tokenization edge-case テスト (PR #267 post-merge-feedback T2-2 採用)** | todo15.md | S | なし (順位 283 と表裏。283 の着手有無に関わらず現行挙動を regression test で固定する価値が独立して残る。283 と同一 PR 消化が効率的) | | 286 | 🔧 Tier 2 | **config path 解決の cwd 跨ぎ integration test (PR #267 post-merge-feedback T2-3 採用)** | todo15.md | M | なし (FIXED 済 cwd-config bug の regression guard。既存テストは pure parser のみで file-lookup 経路未カバー。Severity High、Adoption Risk = OS 依存) | | 287 | 💎 Tier 3 | **「config 読み hook は exe-relative 解決必須」convention の明文化 (PR #267 post-merge-feedback T3-1 採用)** | todo15.md | XS | なし (順位 281 の文書層補完。**281 と同一 PR bundle 推奨**、別作業に切り出す価値は低い) | diff --git a/docs/todo15.md b/docs/todo15.md index 11926481..f296991b 100644 --- a/docs/todo15.md +++ b/docs/todo15.md @@ -362,25 +362,6 @@ --- -### stale_check_enabled の TOML パーステスト追加 (PR #267 post-merge-feedback T2-1 採用) - -> **動機**: PR #267 で追加した `StalenessConfig.stale_check_enabled` のパース経路にテストがなく、silent degrade (機能が黙って無効化) のリスク。既存テストへの数行追加で完備できる。 -> -> **参照**: `.claude/feedback-reports/267.md` Tier 2 #1、`src/hooks-session-start/src/hooks_config.rs` の既存パーステスト -> -> **実行優先度**: 🔧 Tier 2 — Effort XS。 - -#### 作業計画 - -- [ ] 既存 fixture に `stale_check_enabled = true` + assert を追加 -- [ ] 本エントリ削除 + todo-summary2.md 行削除 - -#### 完了基準 - -- 新フィールドのパースが regression test で固定されていること。 - ---- - ### jj keyword を含む commit message の tokenization edge-case テスト (PR #267 post-merge-feedback T2-2 採用) > **動機**: 順位 283 (anchor 修正) と表裏。283 の着手有無に関わらず、現行挙動 (既知の限界) を regression test で明示的に固定する価値が独立して残る。 diff --git a/src/hooks-session-start/src/hooks_config.rs b/src/hooks-session-start/src/hooks_config.rs index e2ce34c5..8678b433 100644 --- a/src/hooks-session-start/src/hooks_config.rs +++ b/src/hooks-session-start/src/hooks_config.rs @@ -105,6 +105,7 @@ mod tests { enabled = true fetch_timeout_secs = 5 default_branch = "main" +stale_check_enabled = true "#; let mut f = std::fs::File::create(claude_dir.join("hooks-config.toml")).unwrap(); f.write_all(toml_str.as_bytes()).unwrap(); @@ -118,6 +119,33 @@ default_branch = "main" assert_eq!(staleness.enabled, Some(true)); assert_eq!(staleness.fetch_timeout_secs, Some(5)); assert_eq!(staleness.default_branch.as_deref(), Some("main")); + assert_eq!(staleness.stale_check_enabled, Some(true)); + let _ = std::fs::remove_dir_all(&root); + } + + #[test] + fn staleness_stale_check_enabled_defaults_to_none_when_omitted() { + use std::io::Write; + let root = unique_temp_root("staleness-no-stale-check"); + let claude_dir = root.join(".claude"); + std::fs::create_dir_all(&claude_dir).unwrap(); + let toml_str = r#" +[session_start.staleness] +enabled = true +"#; + let mut f = std::fs::File::create(claude_dir.join("hooks-config.toml")).unwrap(); + f.write_all(toml_str.as_bytes()).unwrap(); + drop(f); + let config = read_hooks_config(&root); + let staleness = config + .session_start + .as_ref() + .and_then(|s| s.staleness.as_ref()) + .expect("staleness section should parse"); + assert_eq!( + staleness.stale_check_enabled, None, + "stale_check_enabled 未設定は None (default-OFF、ADR-039)" + ); let _ = std::fs::remove_dir_all(&root); }