RED 33d789c4f3 (test) → GREEN
b43bd70f43 (fix). CI:
https://github.com/Kpa-clawbot/CoreScope/actions/workflows/deploy.yml?query=branch%3Afix%2Fe2e-badge-aggregateFixes#1296
## Problem
`.github/workflows/deploy.yml` was computing the e2e-tests badge with:
```
E2E_PASS=$(grep -oP '[0-9]+(?=/)' e2e-output.txt | tail -1 || echo "0")
```
This regex matched any digit-run immediately followed by `/` anywhere in
the combined output of 45+ Playwright suites, then took the **last**
match. The result was usually a small number scraped out of intermediate
per-suite progress text (often `2` from something like `2/3 …`), so the
badge perpetually showed `{"label":"e2e tests","message":"2
passed","color":"brightgreen"}` regardless of how many tests actually
ran.
## Fix
- New `scripts/aggregate-e2e-pass.sh` parses every per-suite summary
shape emitted by `test-*-e2e.js` (`N passed, M failed` / `passed N
failed M` / `N/T tests passed` / `N/T PASS` / `<file>.js: PASS|FAIL`)
and sums them. Per-test progress lines (`✓`, `PASS:`) are skipped so
they can't double-count.
- `deploy.yml` sources the aggregator, sets the badge to `"X passed"`
(brightgreen) when `FAIL=0` and `"X passed, Y failed"` (red) otherwise.
Badge schema (`schemaVersion / label / message / color`) unchanged.
## TDD
- **RED** 33d789c4f3: adds
`test-e2e-badge-aggregate.sh` + vendored fixture
`test-fixtures/e2e-output-sample.txt` (45 suites of realistic output).
Aggregator stub returns zeros → test fails on assertion (`PASS=108
FAIL=0` expected, `PASS=0 FAIL=0` got).
- **GREEN** b43bd70f43: real aggregator
implementation → all five sub-tests pass (fixture aggregate,
broken-regex sanity, synthetic mixed pass/fail, per-test-progress-line
guard, missing-file fallback).
No force-push. PII preflight clean.
---------
Co-authored-by: openclaw-bot <bot@openclaw.local>