feat(recipe-report): /recipe-report skill + helper + launcher (default opus); wire into upgrade-all
- recipe-report.py: survey (run + per-recipe PRs + CI verdicts) / render (spec->HTML) / publish (copy to cc-ci:/var/lib/cc-ci-reports + regen index). - skill .claude/skills/recipe-report: review the weekly run, classify needs-attention vs routine, publish one public HTML page per week + index at report.ci.commoninternet.net. Read-only. - launch-report.py: one-shot cc-ci-report agent, REPORT_MODEL default opus (separate from the sonnet upgrader), REPORT_BACKEND default claude. - upgrade-all SKILL: closing step launches the report agent. Serving (nix/modules/reports.nix) already deployed + live. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
73aa20e8ab
commit
c7301a9e39
@@ -0,0 +1,50 @@
|
||||
---
|
||||
name: recipe-report
|
||||
description: Generate the weekly public "Recipe Report" after the cc-ci /upgrade-all run. Reviews how the upgrade went and the state of every recipe + open PR, classifies what needs attention vs routine, and publishes a self-contained HTML page to report.ci.commoninternet.net (one page per week + a home index). Read-only — reports, never merges or edits PRs. Runs as its own agent (model configured separately from the upgrader; default opus). Invoke as /recipe-report [YYYY-MM-DD].
|
||||
---
|
||||
|
||||
# recipe-report
|
||||
|
||||
Produce the weekly **"The Recipe Report"** — a public HTML page reviewing the latest `/upgrade-all` run
|
||||
and the live state of every recipe + open PR. Served at **https://report.ci.commoninternet.net** (one
|
||||
`week-<date>.html` per run + a home-page index). You are **read-only**: you report, you never merge,
|
||||
edit, or comment on PRs. The page is **public + unauthenticated** — include only public-safe data
|
||||
(recipe names, version bumps, PR titles/links, CI verdicts, concise error summaries); **never** secrets,
|
||||
tokens, internal IPs, or raw logs.
|
||||
|
||||
Helper: `python3 /srv/cc-ci/cc-ci-plan/recipe-report.py {survey|render|publish}` (see its header).
|
||||
|
||||
## Procedure
|
||||
|
||||
1. **Pick the date.** `DATE` = the argument, else today (UTC). The `/upgrade-all` summary for that run is
|
||||
`/srv/cc-ci/.cc-ci-logs/upgrades/upgrade-all-<DATE>.md`.
|
||||
|
||||
2. **Survey.** `python3 /srv/cc-ci/cc-ci-plan/recipe-report.py survey <DATE> > /tmp/survey.json`. This
|
||||
gives you the raw `/upgrade-all` summary markdown plus, for every recipe mirror, its open PRs and the
|
||||
`cc-ci/testme` CI verdict on each PR head. Read it all.
|
||||
|
||||
3. **Review & classify.** Judge the run and the recipe/PR state. Sort everything into:
|
||||
- **Needs attention** — PRs that are GREEN and ready to merge, and errors/failures to investigate
|
||||
(RED `!testme`, recipe bugs, anything blocking). Lead with these. Short, specific prose per item.
|
||||
- **Routine** — minor/clean bumps, stale-test PRs (need operator `--with-tests`), up-to-date or
|
||||
skipped-by-design. Brief.
|
||||
Also flag cross-cutting issues (e.g. a recipe ending with two open PRs to reconcile).
|
||||
|
||||
4. **Write the spec** `/tmp/report-spec.json` (shape in the helper header): `date`, `subtitle`
|
||||
("Week of <human date>"), a one-line `headline`, `needs_attention[]`, `routine[]`, and a
|
||||
**comprehensive `table[]`** with EVERY recipe (`recipe`, `change` "a → b", `status`
|
||||
GREEN/STALE/FAILED/SKIPPED/UPTODATE, `ci` as a level/result number+info string e.g. `build 154 ✓`
|
||||
or `RED · restore` with `ci_url`, `pr`/`pr_url`, `notes`). **CI = link + number/info only; no images.**
|
||||
|
||||
5. **Render & publish.**
|
||||
`python3 .../recipe-report.py render /tmp/report-spec.json /tmp/week-<DATE>.html`
|
||||
`python3 .../recipe-report.py publish /tmp/week-<DATE>.html <DATE>`
|
||||
(publish copies the page to `cc-ci:/var/lib/cc-ci-reports/` and regenerates the index.)
|
||||
|
||||
6. **Verify & stop.** `curl -fsS https://report.ci.commoninternet.net/week-<DATE>.html` renders and the
|
||||
index lists it. Print the report URL and `RECIPE REPORT COMPLETE`, then go idle (one-shot — do not loop).
|
||||
|
||||
## Guardrails
|
||||
- **Read-only.** Never merge/edit/comment on PRs or touch recipes/tests. You only describe + link.
|
||||
- **Public-safe.** No secrets/tokens/internal hostnames/raw logs on the page. Summarize errors.
|
||||
- One page per run; always regenerate the index so all weeks are listed (newest first).
|
||||
@@ -115,6 +115,12 @@ PR list** (the actionable output):
|
||||
```
|
||||
End with the report path and a reminder that **nothing was merged**.
|
||||
|
||||
## 6. Launch the public Recipe Report
|
||||
Once the summary is written, kick off the weekly public report (its own agent, separate model — default
|
||||
opus): `python3 /srv/cc-ci/cc-ci-plan/launch-report.py start`. It runs `/recipe-report`, reviews this
|
||||
run + the live recipe/PR state, and publishes to https://report.ci.commoninternet.net. Fire-and-forget
|
||||
— it runs independently; you can then go idle.
|
||||
|
||||
## Safety / coordination (this matters — shared host with the build loops)
|
||||
- **Sequential is the default for a reason.** Recipe deploys are **stateful on the shared Swarm** and
|
||||
parallel deploys can OOM/collide. Between sequential recipes, the per-recipe `recipe-upgrade` tears
|
||||
|
||||
Reference in New Issue
Block a user