{self.cfg['title']}
"] + o.append("{self.cfg['header']}
") + o.append("{self.sec()} {esc(L['progress'])}
") + o.append(bar([(by_status.get(s, 0), self.color[s], s) for s in self.status], + f"{esc(L['status'])} — {pct(done_n, n):.0f}% {'/'.join(done)} ({done_n}/{n}) · " + + " · ".join( + f"" + f"{esc(self.status[s]['icon'])} {esc(s)}: {by_status.get(s, 0)}" + for s in self.status))) + o.append(bar([(shown, STATUS_HUE["good"], "SHOWN"), + (partial, STATUS_HUE["warning"], "SHOWN-PARTIAL"), + (n - shown - partial, "", L["no_evidence_bucket"])], + f"{esc(L['evidence'])} — {pct(shown, n):.0f}% " + f"({shown}/{n} {esc(L['evidence_unit'])}" + + (f", {partial} {esc(L['evidence_partial'])}" if partial else "") + + f") · {len(ev_caption)} {esc(L['evidence_images'])}" + + (f" · ⚠ {sum(len(v) for v in ev_findings.values())} {esc(L['evidence_findings'])}" + if ev_findings else ""))) + if e2e: + o.append(f"{esc(L['e2e_ran'])} {len(e2e)} reqs: " + + " · ".join(f"{E2E_MARK.get(k, '?')} {k}: {v}" + for k, v in sorted(e2e_count.items())) + ".
") + o.append(f"{esc(L['built_at'])} {datetime.now():%Y-%m-%d %H:%M}.
") + o.append("{esc(L['baseline'])} {esc(base['label'])}
") + cards.append(f"| {esc(L['status'])} | " + f"{esc(L['baseline_before_after'])} |
|---|---|
| {esc(L['total_reqs'])} | {delta(n, base.get('total', 0))} |
| {esc(self.status[s]['icon'])} {esc(s)} | " + f"{delta(by_status.get(s, 0), base.get('status', {}).get(s, 0))} |
| E2E {E2E_MARK.get(k, '?')} {k} | " + f"{delta(e2e_count.get(k, 0), base.get('e2e', {}).get(k, 0))} |
{esc(L['by_group'])}
"] + g.append(f"| {esc(L['group'])} | {esc(L['total'])} | " + + "".join("%s%s | " + % (esc(s), esc(self.status[s]["icon"]), esc(self.short_label(s))) + for s in self.status) + + "
|---|---|---|
| {esc(name)} | {sum(c.values())} | " + + "".join(f"{c.get(s, 0)} | " for s in self.status) + "
| {esc(L['total'])} | {n} | " + + "".join(f"{by_status.get(s, 0)} | " for s in self.status) + "
" + esc(L["findings"]) + "
- "
+ + "".join(f"
- {f} " for f in self.cfg["findings"]) + "
{self.sec()} {esc(L['summary'])}
") + o.append("{self.sec()} {esc(L['attention'])}
" + "| Req ID | " + f"{esc(L['status'])} | {esc(L['req'])} | " + "".join(f"{esc(c['label'])} | " for c in extra) + "
|---|---|---|---|
| {esc(r['id'])} | " + f"{esc(self.status[r['status']]['icon'])} {esc(r['status'])} | " + f"{esc(r.get('req'))} | " + + "".join(f"{esc(r.get(c['key']))} | " for c in extra) + "