Phase 3 = beautiful YunoHost-style results UX (level ladder + image-forward PR comment + summary card w/ app screenshot + polished dashboard + badges). Operator kicked off manually. Starting U0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
54 lines
3.4 KiB
Markdown
54 lines
3.4 KiB
Markdown
# Phase 3 — Beautiful YunoHost-style results — BACKLOG
|
||
|
||
Single source of truth: `/srv/cc-ci/cc-ci-plan/plan-phase3-results-ux.md`.
|
||
Milestones U0–U5 (plan §5); each ends with an Adversary gate. DoD items R1–R8 (plan §2).
|
||
|
||
## Build backlog
|
||
|
||
### U0 — Results schema + level (R1)
|
||
- [ ] U0.1 — Pure `level()` function: map per-tier results (+ deps/SSO/recipe-local signal) → integer
|
||
level L0–L6 with gap-caps-level semantics (§4.1). Unit-tested (pass-through-L4 and fail-at-L2-capped).
|
||
- [ ] U0.2 — Per-tier pytest emits structured per-test results (JUnit XML per tier → parsed) so
|
||
results.json carries per-stage AND per-test ✔/✘ breakdown.
|
||
- [ ] U0.3 — `run_recipe_ci.py` writes `results.json` per run (recipe, version, pr, ref, stages[],
|
||
per-test rows, level, level_cap_reason, invariant flags: clean-teardown, no-secret-leak) to a
|
||
run-scoped artifact dir. Never blocks/fails the test verdict (R7).
|
||
- [ ] U0.4 — Decide & wire the artifact hosting path (run-scoped dir on host + dashboard serves
|
||
`/runs/<id>/...`). Record in DECISIONS.
|
||
- GATE U0: level correct for a recipe through L4 and one capped at L2.
|
||
|
||
### U1 — App screenshot (R4)
|
||
- [ ] U1.1 — Harness captures a real Playwright screenshot of the deployed app while it is up
|
||
(post-login where the landing page needs it), secret-safe (never shoot a credentials page).
|
||
- [ ] U1.2 — Screenshot saved to the run artifact dir; degrades gracefully (no screenshot ≠ run fail).
|
||
- GATE U1: screenshot of a sample recipe shows the working UI, no secrets.
|
||
|
||
### U2 — Summary card + badge (R3, R6)
|
||
- [ ] U2.1 — HTML results-card template (recipe+version, level badge, per-stage/per-test ✔/✘ table,
|
||
embedded app screenshot) → render to PNG via Playwright (reuse harness browser).
|
||
- [ ] U2.2 — Per-run + per-recipe SVG level/status badge endpoint.
|
||
- [ ] U2.3 — Card + badge served at stable URLs (`/runs/<id>/summary.png`, `/badge/<recipe>.svg`).
|
||
- GATE U2: card + badge render correctly for a pass run and a fail run.
|
||
|
||
### U3 — YunoHost-style PR comment (R2)
|
||
- [ ] U3.1 — Bridge posts a placeholder comment on run start (⏳ + live-logs link).
|
||
- [ ] U3.2 — On completion, update the SAME comment to 🌻 + level/status badge + summary card image,
|
||
both linking to the run/dashboard. Re-`!testme` refreshes it. Fallback to text on render failure.
|
||
- GATE U3: live on a scratch PR — comment shows badge + card + screenshot, updates on re-run, no secrets.
|
||
|
||
### U4 — Dashboard polish (R5)
|
||
- [ ] U4.1 — Overview grid like `ci-apps.yunohost.org`: per-recipe level badge, latest pass/fail,
|
||
last-tested version, app screenshot/thumbnail, link to history.
|
||
- [ ] U4.2 — Regenerated on build completion; reads results.json artifacts.
|
||
- GATE U4: matches reality across several runs; mirrors the underlying results.json.
|
||
|
||
### U5 — Badges + docs + hardening (R6, R7, R8)
|
||
- [ ] U5.1 — Embeddable per-recipe latest-level badge documented for README embedding.
|
||
- [ ] U5.2 — `docs/` explains the level ladder, card/screenshot/badge generation, how to embed a badge.
|
||
- [ ] U5.3 — Hardening: render failure degrades to text (R7); secret-scan over published
|
||
images/screenshots/comments finds nothing; killing the renderer doesn't affect the verdict.
|
||
- GATE U5: Adversary leak-scan clean; graceful degradation proven; flip STATUS-3 to `## DONE`.
|
||
|
||
## Adversary findings
|
||
(Adversary owns this section — Builder does not edit.)
|