Files
cc-ci/machine-docs/BACKLOG-3.md
autonomic-bot 805fbba2ad chore(3): bootstrap Phase-3 loop state (STATUS/BACKLOG/JOURNAL-3); seed U0-U5 backlog
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>
2026-05-31 05:43:27 +00:00

54 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Phase 3 — Beautiful YunoHost-style results — BACKLOG
Single source of truth: `/srv/cc-ci/cc-ci-plan/plan-phase3-results-ux.md`.
Milestones U0U5 (plan §5); each ends with an Adversary gate. DoD items R1R8 (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 L0L6 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.)