[release-notes] Scaffold mandatory sections + harden inline attribution#4378
[release-notes] Scaffold mandatory sections + harden inline attribution#4378mattleibow wants to merge 3 commits into
Conversation
…tion The first fully-automated CI run (28926522429) opened the bot PR cleanly — the banner scaffold and floor-baseline fixes held — but its polish (claude-opus-4.7) regressed two prose rules that the committed pages (sonnet-polished) got right, so the bot PR was not mergeable. Both are the same class of problem the banner had: rules enforced only in prose are unreliable across models. Harden them structurally. ~~ Mandatory section scaffold (the dropped Breaking heading) ~~ Every "None in this release." page had its entire `## Breaking Changes` section silently dropped (3.116.1, 3.118.0, 3.119.0/1/2/4, 3.119.5) — the AI omitted the section precisely when there was nothing to say. That case is fully deterministic: the script already knows whether a line has a breaking/notes companion. format_pr_list now scaffolds the two always-present sections into the skeleton the AI fills — `## Highlights` and `## Breaking Changes` — the same principle as the banner scaffold. When there is no breaking/notes companion the script emits the whole "None in this release."/"None in this preview line." body verbatim (the AI keeps it, never decides whether the section exists); when a companion is present it emits a `TODO(polish)` marker to summarize. A leftover `TODO(polish)` is a greppable review failure, like a stray `<THEME>`. ~~ Harden inline attribution (the bare handles) ~~ ~37 bullets across 3.0.0, 3.116.0, 3.119.4, and 4.148.0 read `contributed by @maxkatz6 ❤️` — a bare, unlinked handle with the heart in the wrong place — instead of `❤️ [@maxkatz6](https://github.com/maxkatz6)`. Attribution is woven into prose bullets so it can't be fully scaffolded, but the skeleton's AI comment now states the exact allowed form and bans the wrong ones inline (highest- signal location), and the skill rule 5, TEMPLATE, self-review, and review-checklist grow an explicit `contributed by @` / `@user ❤️` ban with a grep. Bumped the raw-data format version to 3 so a single run re-polishes every page with the new scaffold and instructions, then settles back to idempotent. Spec §4.4 division-of-responsibility gives Scripts the section scaffold and the AI the filled bodies. Validated the generator parses and both the no-breaking (deterministic "None") and with-breaking (TODO) scaffolds render correctly. Co-authored-by: Matthew Leibowitz <mattleibow@live.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
📦 Try the packages from this PRWarning Do not run these scripts without first reviewing the code in this PR. Step 1 — Download the packages bash / macOS / Linux: curl -fsSL https://raw.githubusercontent.com/mono/SkiaSharp/main/scripts/get-skiasharp-pr.sh | bash -s -- 4378PowerShell / Windows: iex "& { $(irm https://raw.githubusercontent.com/mono/SkiaSharp/main/scripts/get-skiasharp-pr.ps1) } 4378"Step 2 — Add the local NuGet source dotnet nuget add source ~/.skiasharp/hives/pr-4378/packages --name skiasharp-pr-4378More options
Or download manually from Azure Pipelines — look for the Remove the source when you're done: dotnet nuget remove source skiasharp-pr-4378 |
|
📖 Documentation Preview The documentation for this PR has been deployed and is available at: 🔗 View Staging Site This preview will be updated automatically when you push new commits to this PR. This comment is automatically updated by the documentation staging workflow. |
…ctural set) The first strict audit of the hardened pipeline (run 28963510987) came back 25/26 clean — the section scaffold and attribution hardening worked — but one page (harfbuzzsharp/8.3.1.6-unreleased) dropped its entire Community Contributors table despite a non-empty roster. That is the exact "silently lose a contributor" failure the roster was introduced to prevent, so it should not be left to prose either. Scaffold the table like the other sections: when the roster is non-empty, the script emits the `## Community Contributors ❤️` heading, the column header, and one row per roster entry already filled with the correct `[@user](url)` handle and PR links, leaving only each row's one-line "what they did" prose as a TODO(polish) marker. A dropped row or table is now impossible, mis-linked/bare handles in the table are impossible, and the maintainer/bots are excluded at the source. When the roster is empty the section is omitted entirely (rule 6). Rule 6, the skeleton instructions, and the format-3 note updated to match. Co-authored-by: Matthew Leibowitz <mattleibow@live.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…limit Strict audit of the first hardened run (28979807718) was 26/26 clean on structure — the section, table, and attribution scaffolds all held — but a content review against the sonnet-polished baseline in main found a real Highlights regression on the biggest pages. Under the pinned claude-opus-4.7, Highlights packed a laundry-list enumeration right up to the 100-word cap: 3.116.0 became a 97-word, 12-comma paragraph re-listing Metal, WinUI, MAUI, WPF, Blazor, Skottie, SKBlender, SKImage.ToRawShader, interop, WebAssembly, Span overloads … where main's sonnet output was a tight 39-word, 2-comma hook. The word cap alone does not stop this; "no enumeration" was prose-only and the model games it. Give the ban a concrete, checkable limit: no sentence in Highlights may list more than ~4 items — a sentence with 6+ commas is a laundry list and fails. Rule 2, the self-review, TEMPLATE, and the review-checklist state the comma-run limit and show the fix (name the 3-4 biggest THEMES, not every feature). The local auditor (files/audit_release_notes.py) enforces the same check so a run only counts as "great" when it is both structurally clean and free of Highlights enumeration. Co-authored-by: Matthew Leibowitz <mattleibow@live.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
Superseded by the v2 three-script pipeline redesign (#4389). Mandatory-section scaffolding and inline-attribution hardening now live in the release-notes skill on dev/release-notes-v2. |
Hardens the two prose rules that regressed on the first fully-automated CI run (bot PR #4373, polished by claude-opus-4.7), using the same structural approach that fixed the banner.
1. Scaffold the mandatory sections (fixes the dropped
## Breaking Changesheading)On that run, every "None in this release." page silently dropped its entire
## Breaking Changessection (3.116.1, 3.118.0, 3.119.0/1/2/4, 3.119.5) — the AI omitted the section exactly when there was nothing to say. That case is fully deterministic: the script already knows whether a line has a breaking/notes companion.format_pr_listnow scaffolds## Highlightsand## Breaking Changesinto the skeleton the AI fills. With no companion it emits the wholeNone in this release./None in this preview line.body verbatim (kept, never dropped); with a companion it emits aTODO(polish)marker to summarize. A leftoverTODO(polish)is a greppable review failure, like a stray<THEME>.2. Harden inline attribution (fixes the bare handles)
~37 bullets read
contributed by @maxkatz6 ❤️(bare, unlinked, heart misplaced) instead of❤️ [@maxkatz6](https://github.com/maxkatz6). Attribution is woven into prose so it can't be fully scaffolded, but the skeleton's AI comment now states the exact allowed form and bans the wrong ones inline, and rule 5 / TEMPLATE / self-review / review-checklist grow an explicitcontributed by @ban with a grep.Rollout
Bumps the raw-data format version to 3, so a single run re-polishes every page with the new scaffold + instructions, then settles back to idempotent. Spec §4.4 updated. No generated content in this PR — it is source-only, so the next scheduled CI run produces the corrected pages content-only and opens the
[docs]bot PR automatically.