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:
@@ -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("")
|
||||
|
||||
Reference in New Issue
Block a user