Skip to content

[release-notes] Scaffold mandatory sections + harden inline attribution#4378

Closed
mattleibow wants to merge 3 commits into
mainfrom
dev/release-notes-harden-polish
Closed

[release-notes] Scaffold mandatory sections + harden inline attribution#4378
mattleibow wants to merge 3 commits into
mainfrom
dev/release-notes-harden-polish

Conversation

@mattleibow

Copy link
Copy Markdown
Collaborator

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 Changes heading)

On that run, every "None in this release." page silently dropped its entire ## Breaking Changes section (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_list now scaffolds ## Highlights and ## Breaking Changes into the skeleton the AI fills. With no companion it emits the whole None in this release. / None in this preview line. body verbatim (kept, never dropped); with a companion it emits a TODO(polish) marker to summarize. A leftover TODO(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 explicit contributed 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.

…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>
@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

📦 Try the packages from this PR

Warning

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 -- 4378

PowerShell / 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-4378
More options
Option Description
--successful-only / -SuccessfulOnly Only use successful builds
--force / -Force Overwrite previously downloaded packages
--list / -List List available artifacts without downloading
--build-id ID / -BuildId ID Download from a specific build

Or download manually from Azure Pipelines — look for the nuget artifact on the build for this PR.

Remove the source when you're done:

dotnet nuget remove source skiasharp-pr-4378

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

📖 Documentation Preview

The documentation for this PR has been deployed and is available at:

🔗 View Staging Site
🔗 View Staging Docs
🔗 View Staging Gallery (Blazor)
🔗 View Staging Gallery (Uno Platform)
🔗 View Staging SkiaFiddle

This preview will be updated automatically when you push new commits to this PR.


This comment is automatically updated by the documentation staging workflow.

mattleibow and others added 2 commits July 9, 2026 00:20
…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>
@mattleibow

Copy link
Copy Markdown
Collaborator Author

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.

@mattleibow mattleibow closed this Jul 10, 2026
@mattleibow
mattleibow deleted the dev/release-notes-harden-polish branch July 10, 2026 10:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant