le-app-design v1.2.0:确认环节与一致性修复(冷读评审驱动)。①盲盒阀门:S4 拆 a/b,新增停点 1.5 首屏确认(截图必发,豁免停顿不豁免发图),停点 2 附修复前后截图;②修复三处自相矛盾:轻量路由 vs 验收门硬冲突(evidence_report 新增 --require 支持子集门与履职前缀,四象限回归通过)、S3 降级 vs S7 必验 MASTER(改条件 artifact)、截图档位两口径(统一 390 主档+375 兼容,移动 Web 免桌面);③补占位符定义:项目代号进 BRIEF、slug 来源、S5 双 sub-agent 派发模板要点、note 命名规范表、回弹降级三条操作化判据、轻量路由 S2快速版/S4′/S5′ 定义、保持现状=跳 S6 直 S7

This commit is contained in:
leroy
2026-11-07 17:15:33 +08:00
parent 9ec5bf1c52
commit bc66afda33
3 changed files with 87 additions and 45 deletions
+41 -10
View File
@@ -3,15 +3,21 @@
用法:
python3 evidence_report.py --run-dir <RUN> [--out <RUN>/INTEGRATION-REPORT.md] \
[--artifact <路径>]... [--title "任务名"]
[--artifact <路径>]... [--title "任务名"] \
[--require "dep[:note前缀],..."]
验收规则(硬门):
三个上游 ui-ux-pro-max / frontend-design / impeccable 各需 ≥1 条成功调用
默认要求三个上游 ui-ux-pro-max / frontend-design / impeccable 各 ≥1 条成功调用
(exec 且 exit_code==0,或 load 且 exit_code==0)。
轻量路由用 --require 指定参与该路由的上游子集,如仅审查任务:
--require "impeccable"
每项可带 note 前缀限定履职阶段,防止非履职调用(如 S2-research 调研检索)
混过门,如完整流程的严格口径:
--require "ui-ux-pro-max:S3-,frontend-design:S2-,impeccable"
--artifact 指定的每个文件必须存在。
任一不满足 → 报告标 FAIL,exit 1;全满足 → PASS,exit 0。
报告内容: 判定横幅、三方调用统计表、逐条调用清单(时间/依赖/命令/退出码)、
报告内容: 判定横幅、调用统计表、逐条调用清单(时间/依赖/命令/退出码)、
产物核验清单、失败与缺口说明。这份报告就是「真实集成」的可检查证据。
仅 python3 标准库。
"""
@@ -64,19 +70,42 @@ def main() -> int:
ap.add_argument("--out", default=None, help="报告写入路径,缺省 <run-dir>/INTEGRATION-REPORT.md")
ap.add_argument("--artifact", action="append", default=[], help="须存在的交付物路径(可多次)")
ap.add_argument("--title", default="le-app-design 集成证据报告")
ap.add_argument("--require", default=None,
help='门规格 "dep[:note前缀],...";缺省=三个上游全部、不限前缀。轻量路由传子集')
args = ap.parse_args()
# 解析门规格:dep[:note-prefix]
gate: dict[str, str | None] = {}
if args.require:
for item in args.require.split(","):
item = item.strip()
if not item:
continue
dep, _, prefix = item.partition(":")
gate[dep] = prefix or None
else:
gate = {dep: None for dep in GATE_DEPS}
run_dir = Path(args.run_dir).expanduser()
records = load_records(run_dir / "calls.jsonl")
out_path = Path(args.out).expanduser() if args.out else run_dir / "INTEGRATION-REPORT.md"
stats = {dep: {"ok": 0, "fail": 0} for dep in GATE_DEPS}
stats = {dep: {"ok": 0, "fail": 0} for dep in gate}
for rec in records:
dep = rec.get("dep")
if dep in stats:
stats[dep]["ok" if is_success(rec) else "fail"] += 1
gate_pass = all(stats[d]["ok"] >= 1 for d in GATE_DEPS)
def gate_ok(dep: str) -> bool:
prefix = gate[dep]
if prefix is None:
return stats[dep]["ok"] >= 1
return any(
is_success(rec) and str(rec.get("note", "")).startswith(prefix)
for rec in records if rec.get("dep") == dep
)
gate_pass = all(gate_ok(dep) for dep in gate)
artifacts_missing = [a for a in args.artifact if not Path(a).expanduser().exists()]
overall = gate_pass and not artifacts_missing
@@ -91,9 +120,10 @@ def main() -> int:
lines.append("")
lines.append("| 上游 | 成功调用 | 失败调用 | 门(≥1 成功) |")
lines.append("|---|---|---|---|")
for dep in GATE_DEPS:
for dep in gate:
s = stats[dep]
lines.append(f"| {dep} | {s['ok']} | {s['fail']} | {'✅' if s['ok'] >= 1 else '❌ 未被真实调用'} |")
req = f"(限 note={gate[dep]}*)" if gate[dep] else ""
lines.append(f"| {dep}{req} | {s['ok']} | {s['fail']} | {'✅' if gate_ok(dep) else '❌ 未被真实调用'} |")
lines.append("")
if artifacts_missing:
@@ -121,9 +151,10 @@ def main() -> int:
if not overall:
lines.append("## 缺口说明")
lines.append("")
for dep in GATE_DEPS:
if stats[dep]["ok"] < 1:
lines.append(f"- `{dep}` 无成功调用记录——该上游未被真实使用,本次流程**不得标记为成功**。")
for dep in gate:
if not gate_ok(dep):
prefix = f"(履职阶段 note={gate[dep]}*)" if gate[dep] else ""
lines.append(f"- `{dep}` 无成功调用记录{prefix}——该上游未被真实使用,本次流程**不得标记为成功**。")
for a in artifacts_missing:
lines.append(f"- 产物缺失: `{a}`")
lines.append("")