Skip to content

Commit e5e1891

Browse files
authored
Merge pull request #55 from majiayu000/feat/track-platform-bugs-issue-26
docs(known-issues): track #23478 #17204 #34600 and add Layer 7 YAML syntax check
2 parents 16e693f + 897a639 commit e5e1891

2 files changed

Lines changed: 114 additions & 1 deletion

File tree

docs/reference/claude-code-known-issues.md

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Claude Code 已知问题与 VibeGuard 应对
22

33
> 影响 VibeGuard 规则/hooks/skills 加载的 Claude Code 平台级 bug。
4-
> 最后更新:2026-03-02
4+
> 最后更新:2026-03-28
55
66
## 规则系统 (Rules)
77

@@ -80,6 +80,45 @@ paths: **/*.ts,**/*.tsx,**/*.js,**/*.jsx
8080

8181
---
8282

83+
### 8. paths 规则在 Write/Edit 时不触发
84+
85+
| 字段 ||
86+
|------|------|
87+
| Issue | [#23478](https://github.com/anthropics/claude-code/issues/23478) |
88+
| 状态 | OPEN(未修复) |
89+
| 严重度 | **** |
90+
| 影响 | `paths:` 过滤仅在 Claude 读取文件时生效,Write/Edit 操作不触发路径作用域规则 |
91+
92+
**问题说明**:路径作用域规则只在 Read 工具调用时加载并评估,而非在 Write/Edit 时。这意味着路径限定的规则在最关键的操作(写入代码)时可能不生效。
93+
94+
**VibeGuard 影响**:中。语言特定规则(如 `typescript/*.md`)期望在 TS 文件被修改时生效,但 Write/Edit 会绕过路径过滤。
95+
96+
**VibeGuard 应对**:PreToolUse hook 在 Write/Edit 前强制执行 Read,间接触发规则加载。在 `scripts/compliance_check.sh` Layer 7 中检测此问题的根因(YAML array 和 quoted paths 语法)。
97+
98+
---
99+
100+
### 9. 带引号的 paths 值被原样保留
101+
102+
| 字段 ||
103+
|------|------|
104+
| Issue | [#17204](https://github.com/anthropics/claude-code/issues/17204) |
105+
| 状态 | OPEN(未修复) |
106+
| 严重度 ||
107+
| 影响 | `paths: "**/*.ts"` 中的引号被保留到 glob 字符串中,导致匹配失败 |
108+
109+
**触发条件**
110+
111+
```yaml
112+
# ❌ 不生效 — 引号被保留,glob 无法匹配
113+
---
114+
paths: "**/*.ts,**/*.tsx"
115+
---
116+
```
117+
118+
**VibeGuard 应对**:同 #1,CSV 格式不加任何引号。`compliance_check.sh` Layer 7 自动检测此问题。
119+
120+
---
121+
83122
## Hooks 系统
84123

85124
### 7. Stop Hook exit 2 导致无限循环
@@ -119,6 +158,29 @@ Claude 回复完成
119158

120159
---
121160

161+
### 10. exit 2 在 UI 中显示为"Error"而非阻断提示
162+
163+
| 字段 ||
164+
|------|------|
165+
| Issue | [#34600](https://github.com/anthropics/claude-code/issues/34600) |
166+
| 状态 | OPEN(未修复) |
167+
| 严重度 ||
168+
| 影响 | Hook 返回 `exit 2` 时,Claude Code UI 将其显示为红色"Error",而非预期的阻断反馈提示 |
169+
170+
**问题说明**`exit 2` 的设计意图是将 stderr 作为反馈注入给 Claude 并阻断当前操作。但在 UI 层,这被渲染为错误状态,可能让用户误以为 hook 本身出错。
171+
172+
**VibeGuard 应对**:在 hook stderr 中添加 `[BLOCKED]` 前缀,让 UI 显示更清晰:
173+
174+
```bash
175+
# 在 hook 脚本中
176+
echo "[BLOCKED] 检测到危险操作: ${tool_name}" >&2
177+
exit 2
178+
```
179+
180+
**VibeGuard 影响**:低。功能正常,仅影响 UI 展示。PreToolUse hooks 已统一使用 `[BLOCKED]` 前缀。
181+
182+
---
183+
122184
## Skills 系统
123185

124186
### 5. SKILL.md 验证器拒绝扩展字段
@@ -154,13 +216,28 @@ Claude 回复完成
154216
| #16299 项目级 paths 全局加载 || — 不影响用户级 |
155217
| #13905 YAML 语法无效 || ✅ CSV 格式 workaround |
156218
| #23569 Worktree paths 忽略 || — 不依赖此机制 |
219+
| #23478 paths 在 Write/Edit 不触发 | **** | ✅ PreToolUse hook 强制 Read 前置 |
220+
| #17204 带引号 paths 匹配失败 || ✅ CSV 不加引号 + Layer 7 检测 |
157221
| #7 Stop hook exit 2 无限循环 | **** | ✅ 改为 exit 0 仅记录 |
222+
| #34600 exit 2 UI 显示为 Error ||[BLOCKED] 前缀 workaround |
158223
| #25380 SKILL.md 验证器 || — 仅 VS Code 警告 |
159224
| #17688 插件 hooks 不触发 || — 不使用此机制 |
160225

161226
## 监控建议
162227

163228
定期检查以下 issue 的修复状态:
164229
- **#21858** — 修复后可改回 YAML 数组格式(更易读)
230+
- **#23478** — 修复后 paths 规则将在 Write/Edit 时正确触发
165231
- **#16299** — 修复后项目级规则的上下文开销会降低
166232
- **#17688** — 若 VibeGuard 计划做插件分发需关注
233+
234+
## 自动化监控
235+
236+
`scripts/compliance_check.sh` Layer 7 自动检测常见的规则语法问题:
237+
238+
```bash
239+
bash scripts/compliance_check.sh
240+
# 输出:--- Layer 7: Rule YAML Syntax ---
241+
# [PASS] No YAML array syntax in paths frontmatter
242+
# [PASS] No quoted paths in rules frontmatter
243+
```

scripts/compliance_check.sh

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,42 @@ else
125125
check_fail "Global CLAUDE.md not found"
126126
fi
127127

128+
# --- Layer 7: Rule YAML Syntax ---
129+
echo "--- Layer 7: Rule YAML Syntax ---"
130+
131+
RULES_DIR="${HOME}/.claude/rules/vibeguard"
132+
if [[ -d "${RULES_DIR}" ]]; then
133+
check_pass "VibeGuard rules directory exists: ${RULES_DIR}"
134+
135+
# Check for broken YAML array syntax (bug #21858: paths: array breaks rule loading)
136+
if command -v rg >/dev/null 2>&1; then
137+
yaml_array_files=$(rg -l --multiline 'paths:\s*\n\s+-' "${RULES_DIR}" 2>/dev/null || true)
138+
else
139+
yaml_array_files=$(find "${RULES_DIR}" -name "*.md" -exec \
140+
awk '/^paths:/{p=1;next} p && /^[[:space:]]+-/{print FILENAME; exit} {p=0}' {} \; \
141+
2>/dev/null || true)
142+
fi
143+
if [[ -n "${yaml_array_files}" ]]; then
144+
check_fail "YAML array syntax in paths: (breaks rule loading, use CSV format) — ${yaml_array_files}"
145+
else
146+
check_pass "No YAML array syntax in paths frontmatter"
147+
fi
148+
149+
# Check for quoted paths (bug #17204: quoted values preserved verbatim in glob)
150+
if command -v rg >/dev/null 2>&1; then
151+
quoted_files=$(rg -l "^paths:\\s+[\"']" "${RULES_DIR}" 2>/dev/null || true)
152+
else
153+
quoted_files=$(grep -rlE "^paths:[[:space:]]+[\"']" "${RULES_DIR}" 2>/dev/null || true)
154+
fi
155+
if [[ -n "${quoted_files}" ]]; then
156+
check_fail "Quoted paths detected (breaks glob matching, remove quotes) — ${quoted_files}"
157+
else
158+
check_pass "No quoted paths in rules frontmatter"
159+
fi
160+
else
161+
check_warn "VibeGuard rules directory not found: ${RULES_DIR} (run setup.sh to install)"
162+
fi
163+
128164
# --- Summary ---
129165
echo
130166
echo "======================================"

0 commit comments

Comments
 (0)