@cyning/harness 2.1.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,18 @@
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [2.1.1] - 2026-06-30
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **task 人工闸解析**:`lib/task-meta.js` 与 `wizard/gate-check.sh` 现在会去除 Markdown 反引号,避免将 `` `approved` `` 误判为 pending。
|
|
12
|
+
- 影响命令:`verify`、`gate-check`。
|
|
13
|
+
|
|
14
|
+
### Notes
|
|
15
|
+
|
|
16
|
+
- **HG-RELEASE**:待维护者 publish `@cyning/harness@2.1.1` · tag `v2.1.1`
|
|
17
|
+
- patch · 无 CLI breaking · `npm test` 预期通过
|
|
18
|
+
|
|
7
19
|
## [2.1.0] - 2026-06-30
|
|
8
20
|
|
|
9
21
|
### Added
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Postmortem · 人工闸 status 反引号解析事故
|
|
2
|
+
|
|
3
|
+
| 项 | 内容 |
|
|
4
|
+
| --- | --- |
|
|
5
|
+
| 日期 | 2026-06-30 |
|
|
6
|
+
| 产品包 | `@cyning/harness` |
|
|
7
|
+
| 版本 | 2.1.0 → 2.1.1 |
|
|
8
|
+
| 类型 | bugfix / 回归风险 |
|
|
9
|
+
| 触发任务 | `task_fix_harness_verify_status_parsing_v1` |
|
|
10
|
+
|
|
11
|
+
## 现象
|
|
12
|
+
|
|
13
|
+
`npx @cyning/harness verify` 在 task 表的 `### 人工闸` 中,将 status 字段的 Markdown 反引号一并解析,导致:
|
|
14
|
+
|
|
15
|
+
- task 表写 `HG-AUDIT-R1 | approved` 时,内部状态为 `` `approved` ``
|
|
16
|
+
- `evaluateMayStart30` 判断 `audit?.status !== 'approved'`,返回阻塞
|
|
17
|
+
- CLI 输出「HG-AUDIT-R1 非 approved(须维护者签 task 表)」,即使 task 表已明确 approved
|
|
18
|
+
|
|
19
|
+
## 根因
|
|
20
|
+
|
|
21
|
+
### 1. `lib/task-meta.js` 的 `normalizeCell` 只去星号没去反引号
|
|
22
|
+
|
|
23
|
+
```javascript
|
|
24
|
+
// 修复前
|
|
25
|
+
function normalizeCell(cell) {
|
|
26
|
+
return cell.replace(/\*/g, '').trim();
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 2. `wizard/gate-check.sh` 的 `gate_status` / `gate_blocks` 同样只去星号
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# 修复前
|
|
34
|
+
awk -F'|' -v g="$gate" '
|
|
35
|
+
...
|
|
36
|
+
gsub(/\*/, "", $3)
|
|
37
|
+
...
|
|
38
|
+
'
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 3. 测试用例未覆盖带反引号的 status
|
|
42
|
+
|
|
43
|
+
现有 `test/verify.test.js` 的 `writeTaskWithGate` 直接写 `approved`(无反引号),未模拟真实 task 表中 `` `approved` `` 的格式。
|
|
44
|
+
|
|
45
|
+
## 修复
|
|
46
|
+
|
|
47
|
+
### `lib/task-meta.js`
|
|
48
|
+
|
|
49
|
+
```javascript
|
|
50
|
+
function normalizeCell(cell) {
|
|
51
|
+
return cell.replace(/[`\*]/g, '').trim();
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### `wizard/gate-check.sh`
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
awk -F'|' -v g="$gate" '
|
|
59
|
+
...
|
|
60
|
+
gsub(/[`*]/, "", $3)
|
|
61
|
+
...
|
|
62
|
+
'
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
> **注意**:awk 字符类中写 `` [`\*] `` 会导致正则语法错误(`illegal primary in regular expression`),因为 awk 中反斜杠在字符类内有特殊处理。应使用 `` [`*] ``。
|
|
66
|
+
|
|
67
|
+
## 教训
|
|
68
|
+
|
|
69
|
+
1. **Markdown 表格的格式化符号必须被 normalize**
|
|
70
|
+
- status 字段常见写法:`` `approved` ``、`*approved*`、`` **`approved`** ``
|
|
71
|
+
- 解析时必须统一去除:反引号、星号、首尾空白
|
|
72
|
+
|
|
73
|
+
2. **测试用例必须覆盖真实 task 表格式**
|
|
74
|
+
- 不要只测裸字符串 `approved`
|
|
75
|
+
- 必须测 `` `approved` ``、`` **`approved`** ``、`*approved*` 等变体
|
|
76
|
+
|
|
77
|
+
3. **awk 与 JavaScript 正则差异**
|
|
78
|
+
- JS:`/[`\\*]/g` 正确
|
|
79
|
+
- awk:`` [`\*] `` 报错,应写 `` [`*] ``
|
|
80
|
+
- 修改 shell 脚本后必须用 `bash -n` 或实际运行验证
|
|
81
|
+
|
|
82
|
+
4. **发布前必须跑完整测试**
|
|
83
|
+
- `npm test` 在修复前是 62/72 失败,修复后是 72/72 通过
|
|
84
|
+
- 若发布前未跑测试,此 bug 会进入 2.1.0
|
|
85
|
+
|
|
86
|
+
## 预防措施
|
|
87
|
+
|
|
88
|
+
- [ ] 在 `test/verify.test.js` 中增加带反引号的 gate 状态测试
|
|
89
|
+
- [ ] 在 `test/audit.test.js` 中同样增加反引号覆盖
|
|
90
|
+
- [ ] 将 `normalizeCell` 的测试独立为一个单元测试
|
|
91
|
+
- [ ] 后续修改 `wizard/*.sh` 时,先用 `bash -n` 检查语法
|
|
92
|
+
|
|
93
|
+
## 关联提交
|
|
94
|
+
|
|
95
|
+
- `9f5761c` fix(verify): strip backticks from gate status cells
|
|
96
|
+
- tag: `v2.1.1`
|
package/lib/task-meta.js
CHANGED
package/package.json
CHANGED
package/wizard/gate-check.sh
CHANGED
|
@@ -30,7 +30,7 @@ gate_status() {
|
|
|
30
30
|
awk -F'|' -v g="$gate" '
|
|
31
31
|
$0 ~ /^[[:space:]]*\|/ && index($0, g) > 0 {
|
|
32
32
|
gsub(/^[[:space:]]+|[[:space:]]+$/, "", $3)
|
|
33
|
-
gsub(
|
|
33
|
+
gsub(/[`*]/, "", $3)
|
|
34
34
|
print $3
|
|
35
35
|
exit
|
|
36
36
|
}
|
|
@@ -42,7 +42,7 @@ gate_blocks() {
|
|
|
42
42
|
awk -F'|' -v g="$gate" '
|
|
43
43
|
$0 ~ /^[[:space:]]*\|/ && index($0, g) > 0 {
|
|
44
44
|
gsub(/^[[:space:]]+|[[:space:]]+$/, "", $4)
|
|
45
|
-
gsub(
|
|
45
|
+
gsub(/[`*]/, "", $4)
|
|
46
46
|
print $4
|
|
47
47
|
exit
|
|
48
48
|
}
|