iter(g163): 留痕校验补编号与时间线约束

This commit is contained in:
HIsheR
2026-10-26 16:08:22 +08:00
parent eea5074edf
commit 6febeba211
2 changed files with 22 additions and 3 deletions
+21 -2
View File
@@ -1030,12 +1030,31 @@ function checkIterations() {
const items = JSON.parse(fs.readFileSync(backlogPath, 'utf8')).items ?? [];
const ids = new Set(items.map((i) => i.id));
const done = new Set(); // 有 done 留痕的条目 id
const seen = new Set(); // 条目 id 去重集合:复制粘贴条目忘了改 id 时会撞上
for (const item of items) {
if (seen.has(item.id)) issues.push(`backlog: id ${item.id} 重复(多半是复制条目时忘了改 id)`);
seen.add(item.id);
}
const seq = items.map((i) => (typeof i.id === 'string' && /^g\d+$/.test(i.id) ? Number(i.id.slice(1)) : NaN)); // g 编号序列
for (let k = 1; k < seq.length; k++) {
if (Number.isNaN(seq[k]) || Number.isNaN(seq[k - 1])) continue; // 非 g 编号的条目不参与顺序校验
if (seq[k] <= seq[k - 1]) issues.push(`backlog: ${items[k].id} 排在 ${items[k - 1].id} 后面(编号必须严格递增,逆序一般是插错了位置)`);
}
let prevTs = ''; // 上一条留痕时间,用于单调性比对
for (const line of fs.readFileSync(logPath, 'utf8').split(/\r?\n/)) {
if (!line.trim()) continue; // 空行跳过
let row;
try { row = JSON.parse(line); } catch { continue; } // 行格式归 lint-iterations 管,这里不重复报
if (!ids.has(row.id)) issues.push(`iterations.log: 留痕 id ${row.id} 在 backlog 中不存在`);
if (row.result === 'done') done.add(row.id);
if (row.result === 'done') {
if (done.has(row.id)) issues.push(`iterations.log: ${row.id} 有两条 done 留痕(一条迭代只该留一次痕迹)`);
done.add(row.id);
}
const ts = String(row.ts ?? '');
if (!/\+08:00$/.test(ts)) issues.push(`iterations.log: ${row.id} 的 ts 缺少 +08:00 偏移(必须取 date 实测的本地时间)`);
else if (prevTs && ts < prevTs) issues.push(`iterations.log: ${row.id} 的 ts 早于上一条(时间倒流,多半是手写或按 UTC 换算)`);
else if (Date.parse(ts) > Date.now() + 300000) issues.push(`iterations.log: ${row.id} 的 ts 落在未来(超出 5 分钟容差)`);
prevTs = ts;
}
for (const item of items) {
if (item.status === 'done' && !done.has(item.id)) issues.push(`backlog: ${item.id} 已置 done 但 iterations.log 无 done 留痕`);
@@ -1219,7 +1238,7 @@ function cmdVerify() {
console.error(`${issues.length} violation(s)`);
process.exit(1);
}
console.log('verify OK (manifest ↔ docs ↔ demo 一致,文档 props ↔ 入参接口双向一致,皮肤无硬编码颜色与未定义令牌、暗色令牌齐全,README 组件清单与分组同步,backlog ↔ 留痕一致,组合配方结构完整,MCP 工具清单三处一致)');
console.log('verify OK (manifest ↔ docs ↔ demo 一致,文档 props ↔ 入参接口双向一致,皮肤无硬编码颜色与未定义令牌、暗色令牌齐全,README 组件清单与分组同步,backlog ↔ 留痕一致(编号严格递增、无重复 id、留痕时间线单调且带 +08:00),组合配方结构完整,MCP 工具清单三处一致)');
}
/*** 校验 git 提交信息是否符合 COMMITTING.md 规范(参数为 message 文件路径或直接 message 文本),违规退出码 1 ***/