PR Commit Message Skill
Write a historical record, not a diff summary. A future maintainer should be able to
recover what changed, why it mattered, what failed or constrained the design, why this
approach was chosen, and where the supporting evidence lives without reopening the PR.
Optimize for durable understanding, not assistant-response brevity. Remove repetition
and development chronology, but preserve every independently useful root cause, design
decision, compatibility rule, limitation, and proof point.
Non-negotiable evidence contract
PR prose and early commit bodies often preserve useful history, but they can also preserve
stale constraints, mistaken link interpretations, and superseded absolutes. Prevent those
high-cost failures before drafting:
- Count the private ledger's material topics. With two or more topics, the final draft must
have the same number of named topic sections; do not count the overview, and do not let a
continuous narrative or overview stand in for those sections.
- For each candidate reference, privately record the target's actual entity type, title, and
exact relationship after opening it. Omit the reference when that relationship is not
supported, even when the PR description labels or explains it.
- For each candidate universal, bound, count, or inequality, privately record the complete
search universe and check it for counterexamples. Proof over a subset cannot support a
claim about the whole API, repository, platform set, or generated surface. One outlier
means the quantified wording must be narrowed or removed. When that universe is a family
of similar artifacts such as workflows, projects, targets, or packages, list its members
and the dimension being generalized, then read that dimension on each member. Families
that look uniform usually are not, and reading two of five is how a false universal ships.
- Inspect human discussion on the current PR and every related or superseded PR whose work or
feedback is carried forward. Adopted feedback needs source-backed attribution or a required
Missing context: line when the contributor's email cannot be verified.
Workflow
1. Gather first-party evidence
Inspect at least:
- the current PR title, body, URL, closing issues, commits, reviews, inline comments,
complete changed-path list, and every substantive current-head diff hunk
- linked issues, related or superseded PRs, required companion PRs, compare links,
failure logs, repro steps, validation runs, and relevant release or API documentation;
for carried-forward PRs, inspect their issue comments, reviews, and inline comments too
- commit bodies and adopted review feedback that explain non-obvious final code
- recent target-repository merge messages for subject, reference, section, bullet, and
wrapping conventions
Useful commands include:
gh pr view <number> --json number,title,body,url,commits,files,comments,reviews,closingIssuesReferences
gh api repos/<owner>/<repo>/pulls/<number>/comments --paginate
gh api repos/<owner>/<repo>/issues/<number>/comments --paginate
Use the final diff and current head as the strongest evidence for shipped behavior. Use
the PR base or a specific referenced revision for the old side of a before/after claim.
Treat PR prose, commit bodies, review comments, and code comments as leads that still need
verification.
For dependency or submodule pointers, separate the parent PR's intent from the range the
pointer happens to cross. A required companion change or intentionally adopted dependency
behavior can be relevant. Unrelated intervening commits are not parent-PR topics merely
because the new pointer includes them; preserve the range with a compare link instead of
narrating it.
2. Build one private evidence ledger
Use these definitions before classifying the diff:
- Material topic: an independently searchable causal or design unit with both its own
why boundary (motivation, failure, root cause, constraint, compatibility consequence, or
decision) and at least one decisive anchor not derived from another topic.
- Explicit decision: a non-trivial correction, exception, safety rule, or design choice
that shares a material topic's root cause and lacks independent search intent. It remains
a named sub-point under that topic.
- Mechanical derivative: generated output, lock or compiled artifacts, repeated
documentation, ordinary verification, or iterative fixups that only implement or repeat
a parent topic.
Walk every changed path and substantive hunk once. Map each coherent change to exactly one
material topic, explicit decision under a named topic, or mechanical derivative under a
named topic. A hunk is substantive when it changes runtime, build, packaging, test, or
workflow behavior; an API or design decision; an emitted artifact; or rationale needed to
maintain one of those. Build, project, packaging, workflow, and configuration changes are
candidate topics just like source code.
For each material topic, record:
- need or user-visible symptom
- root cause or triggering condition
- chosen correction or design
- important tradeoff, compatibility rule, limitation, or rejected alternative
- verification evidence
- decisive anchors and their exact sources: errors, symbols, predicates, fallback order,
counterexamples, measurements, revisions, or review-found semantic corrections
- related issue, PR, run, compare view, or commit
Then perform one history-only pass over the parent PR's commits, reviews, linked context,
validation notes, and specifically adopted upstream changes. Capture information the final
tree cannot explain by itself: the original failure, a rejected obvious alternative, a
regression that changed the design, a compatibility exception, a review-found correction,
or a measurement that governs how evidence should be read. Do not walk an entire traversed
dependency range. Verify useful historical facts before adding them to the ledger.
Apply these boundary rules:
- Sharing a subsystem, umbrella feature, or final goal does not merge topics with different
why boundaries or corrections.
- Do not split a topic merely because its implementation crosses files, commits, workflow
stages, generated outputs, or tests.
- Multiple manifestations of one root cause remain one topic only when they share the same
correction and compatibility rules.
- A feature's public programming model is a topic when its API, lifetime, interoperability,
or compatibility design itself meets the material-topic definition; when it does, the
overview is not a substitute for its section.
- Tests or benchmarks become a topic when they correct misleading prior evidence,
introduce a distinct validation architecture, or independently establish a performance
or compatibility decision. Ordinary verification stays with its parent.
- Correctness or equivalence evidence and performance evidence are separate topics when
each independently justifies safe adoption.
- Review-found correctness or safety changes remain explicit decisions, or become topics
when they have independent search intent.
- A shared mechanism, guard, or contract that several topics route through is itself a topic
when it carries a guarantee, invariant, or safety rule that none of its consumers own. It
is easy to mistake for plumbing precisely because it appears everywhere; distributing it
as a sentence inside each consumer leaves that guarantee without a home and hides why the
consumers became uniform.
- A removal, replacement, or move belongs to the topic that performs it, but the departing
component still needs its name, the behavior that left with it, and where that
responsibility now lives. This message is the only thing a future search for the deleted
name will find.
Use a counterfactual independence test before collapsing any candidate: if its correction
were reverted while the proposed parent remained, would a distinct failure, constraint, or
maintenance question return? If so, keep it as a material topic. A path is not a derivative
merely because it supports the same feature; it must share the parent's why and correction.
A shared goal or symptom category is not a shared root cause. Do not demote a candidate that
passes the material-topic definition merely to shorten the message. If the returning problem
shares the parent's why and lacks independent search intent, keep it as an explicit decision
rather than promoting it.
After collapsing derivatives, choose the shape:
- Mechanical change: subject only or one short explanatory paragraph.
- One material topic: focused causal narrative; no forced section heading.
- Two or more material topics: overview followed by exactly one named section per
topic. In SkiaSharp, use the established
~~ Topic ~~ syntax.
Every topic, explicit decision, and marked anchor gets one visible home. A section preserves
its causal chain; naming a file or category is not coverage. Collapsing a derivative removes
its separate heading, not useful evidence it contributes to the parent.
Use a counterfactual anchor test: retain the smallest observed fact that shows why the
chosen design is necessary, why an obvious alternative is unsafe, or what made the evidence
credible. Compress repetition, not the condition, counterexample, scope, or measurement
that carries the proof.
3. Draft in the repository's voice
Prefer the repository's established subject form:
[Area] Imperative summary (#PR)
Area: imperative summary (#PR)
Imperative summary (#PR) when no area prefix is established
Use an imperative verb, identify the real subsystem when useful, preserve the established
area spelling, and avoid vague subjects such as Fix review comments or Misc changes.
Start the body with verified references. Use labels only for the relationship they express:
Fixes: for an issue the PR closes
Context: for related issues, PRs, runs, announcements, documentation, URLs, or exact
commit SHAs
Requires: for the immediate companion PR or dependency this change is built on and
cannot merge without. In a stack, that is the parent you actually build on; an earlier
ancestor in the same stack explains context but is not what this change requires, so it
belongs under Context:
Changes: for dependency compare views or upstream ranges
- another label only when recent repository history establishes both its spelling and use
Fetch every target. Do not convert a PR URL to an issue URL, call a related PR an issue,
claim a PR is completed without evidence, or attach a correct URL to the wrong relationship.
Preserve the content expected for the kind of change:
- Bug fix: symptom, investigation evidence, root cause, and correction
- Dependency or submodule bump: repository and revision, compare link, and only the
upstream changes relevant to this repository
- Release or platform update: capability gap or release trigger, compatibility impact,
project response, and authoritative links
- Public API: programming model, ownership or lifetime rules, native dependency, and
platform limitations
- Configuration or policy split: each context, the value it receives, and the reason the
difference is deliberate. An undocumented split reads as an inconsistency, and the next
reader unifies it and reintroduces the failure it was preventing
- Removal or migration: the removed component by name, the behavior that left with it,
and where that responsibility now lives
For multiple topics, use this shape:
<imperative subject>
<verified reference lines>
<overview: what changes, why it matters, and the governing design>
~~ <material topic or failure mode 1> ~~
<symptom/need -> cause/constraint -> chosen change -> evidence>
* <optional explicit decision with cause, consequence, and anchor>
~~ <material topic or failure mode 2> ~~
<symptom/need -> cause/constraint -> chosen change -> evidence>
<trailers>
Name sections after the actual problem or decision, not Changes or Implementation. A
component, file, or artifact category is not the decision either; prefer the boundary,
failure, or rule the section resolves. Lead the overview with the governing design rather
than with provenance or scope bookkeeping — where the work was extracted from is one fact
the message can state, not the reason the change exists.
Use bullets for explicit decisions inside a topic, not as a substitute for topic sections.
Keep exception snippets, logs, reference lists, and bullets in-family for the target
repository.
Hard-wrap ordinary prose with literal newline characters at the width observed in recent
target-repository merge messages; SkiaSharp's established cap is 80 columns. Code fences and
commit-message renderers do not add this formatting, so visual wrapping in a UI is not a
substitute. Preserve constructs that should remain on one line: the subject when reasonable,
reference and compare URLs, section markers, code or log lines, and attribution trailers.
Indivisible tokens may exceed the cap. Reflow bullet continuations using the repository's
established indentation.
4. Run one claim-proof pass
Check the final draft by claim type:
- References and relationships: fetch and read each target, then record its actual entity
type, title, and exact relationship to the PR. A resolving URL or its appearance in PR
prose is not proof. Omit a reference whose relationship is unsupported. For a compare URL,
verify its endpoints; do not walk every commit merely to validate the range.
- Before/after behavior: verify both sides in the artifacts that actually changed. If
code already behaved that way and only guidance or validation changed, attribute the
change to the guidance or validation.
- Quantifiers and bounds: scan for
all, every, only, no, always, never,
exactly, counts, minimums, maximums, and inequality symbols. Record the search universe
and check the complete relevant set, including generated or aggregate surfaces, for an
outlier. Narrow or remove the qualifier when any counterexample exists.
- Precision: verify exception names, predicates, revisions, versions, test counts,
benchmark values, platform claims, and validation results against their exact sources.
Re-read measurements and counts at the current head; a number captured before a later
push was true when observed and is wrong now. Prefer durable validation evidence; omit
transient pending, queued, or action-required status unless it explains a shipped design
decision.
- Coverage and capability claims: describe what tests, validation, or a guard actually
assert, in the terms the assertions use, rather than the capability they gesture at.
"Covers remote branch authority" and "covers guarded pushes and direct-invocation guards"
read as equivalent until someone relies on the first one and finds nothing behind it.
- Safety and non-behavior claims: replace an adjective such as read-only, safe,
isolated, advisory, or deterministic with the specific thing that cannot happen and to
which neighboring system. The adjective is what a later change quietly violates, because
nothing in it says which guarantee was load-bearing.
- Causal rationale: verify reasons copied from PR descriptions, commits, or comments.
Preserve meaningful non-goals and limitations, but label inference as inference or omit
uncertain precision. A non-goal is durable when it states a lasting reason; "deferred",
"excluded by request", or "out of scope for review size" is development chronology and
stops being true the moment the follow-up lands.
- Mixed-truth sentences: split a verified fact from an unsupported qualifier instead of
accepting the whole sentence because half is true. Watch for two distinct things the
evidence calls by the same role word — a control, a baseline, a fixture, a config — and
confirm which one each clause is about before joining them, because merging them yields a
sentence whose halves are both true and whose join is not.
5. Build source-backed attribution
For the current PR and any related or superseded PR whose implementation or adopted human
feedback is carried forward, combine:
- every
.commits[].authors[] entry, including the primary PR author
- every case-insensitive
Co-authored-by: trailer in each commit messageBody
- human reviewers or commenters whose approval or substantive feedback contributed to the
final change
For each current, related, or superseded PR in scope, fetch issue comments, reviews, and
inline review comments rather than checking only the current PR. Deduplicate
case-insensitively by email. If the same display name used two distinct recorded emails,
retain both.
Accept a (name, email) pair only when that exact email appears in a relevant commit author
entry, a co-author trailer, or the non-null email field returned by
gh api users/<login>. Never infer an address from a name or organization, construct a
GitHub noreply address, or mine unrelated commits. A trailer your own environment or house
style would normally append is not evidence either; it belongs here only when this PR's own
commits record it. If a contributing human reviewer has no verified email, omit the trailer
and report:
Missing context: verified email for @login
A dependency author is not a parent-PR co-author merely because a pointer traverses their
commit. Credit copied or cherry-picked work only when authorship is preserved or an allowed
parent-PR source records it. Exclude routine automation identities, including dependency
updaters and automated review accounts; they are not missing human contributors. Include
coding agents when they authored code or appear in a co-author trailer.
Every eligible candidate in the resulting attribution map must appear exactly once in the
trailers, or in Missing context: when a contributing human lacks a verified email. Trailers
are part of the commit message, so place them inside the fenced block at the end after a
blank line, one per line; only Missing context: lines belong outside the fence.
6. Format and check the final output
After drafting and attribution, confirm:
- Every substantive changed path maps to a topic, explicit decision, or derivative, and
section count == material-topic count whenever that count is two or more.
- Every topic explains need or symptom, cause or constraint, chosen change, and evidence;
every explicit decision and decisive anchor has one visible home. Sibling sections carry
comparable evidence; an asymmetry there is usually a dropped anchor rather than a
genuinely unverified topic.
- Every precise, relational, causal, quantified, and validation claim has its completed
proof entry; no proof over a subset is worded as a whole-surface claim.
- Every eligible attribution candidate, including relevant PR and commit authors, appears
exactly once as a source-backed trailer or required missing-context item.
- The message answers what a future maintainer would otherwise have to reopen the PR to
learn, without file-by-file narration or repeated prose.
- Scan the fenced message after all other edits and reflow every ordinary prose line over
the observed cap. Exempt one-line constructs and indivisible tokens only where splitting
would damage them.
- The response contains exactly one fenced
text block with only the polished commit
message; it has no introduction, explanation, summary, or other response prose.
After these checks pass, return the fenced message. Put any required Missing context:
lines after the closing fence so they are not copied into the commit message.
1---2name: pr-commit-message3description: Write or improve high-signal PR merge commit messages and squash commit messages. Use this whenever the user says "create a commit message for this PR", "write a merge commit message", "draft the squash commit body", "improve this commit message", or asks for a message that preserves the why behind a pull request. This skill inspects the PR, linked issues, and code changes so the final commit message is readable and useful from git history alone.4---56# PR Commit Message Skill78Write a historical record, not a diff summary. A future maintainer should be able to9recover what changed, why it mattered, what failed or constrained the design, why this10approach was chosen, and where the supporting evidence lives without reopening the PR.1112Optimize for **durable understanding**, not assistant-response brevity. Remove repetition13and development chronology, but preserve every independently useful root cause, design14decision, compatibility rule, limitation, and proof point.1516## Non-negotiable evidence contract1718PR prose and early commit bodies often preserve useful history, but they can also preserve19stale constraints, mistaken link interpretations, and superseded absolutes. Prevent those20high-cost failures before drafting:2122- Count the private ledger's material topics. With two or more topics, the final draft must23 have the same number of named topic sections; do not count the overview, and do not let a24 continuous narrative or overview stand in for those sections.25- For each candidate reference, privately record the target's actual entity type, title, and26 exact relationship after opening it. Omit the reference when that relationship is not27 supported, even when the PR description labels or explains it.28- For each candidate universal, bound, count, or inequality, privately record the complete29 search universe and check it for counterexamples. Proof over a subset cannot support a30 claim about the whole API, repository, platform set, or generated surface. One outlier31 means the quantified wording must be narrowed or removed. When that universe is a family32 of similar artifacts such as workflows, projects, targets, or packages, list its members33 and the dimension being generalized, then read that dimension on each member. Families34 that look uniform usually are not, and reading two of five is how a false universal ships.35- Inspect human discussion on the current PR and every related or superseded PR whose work or36 feedback is carried forward. Adopted feedback needs source-backed attribution or a required37 `Missing context:` line when the contributor's email cannot be verified.3839## Workflow4041### 1. Gather first-party evidence4243Inspect at least:44451. the current PR title, body, URL, closing issues, commits, reviews, inline comments,46 complete changed-path list, and every substantive current-head diff hunk472. linked issues, related or superseded PRs, required companion PRs, compare links,48 failure logs, repro steps, validation runs, and relevant release or API documentation;49 for carried-forward PRs, inspect their issue comments, reviews, and inline comments too503. commit bodies and adopted review feedback that explain non-obvious final code514. recent target-repository merge messages for subject, reference, section, bullet, and52 wrapping conventions5354Useful commands include:5556```bash57gh pr view <number> --json number,title,body,url,commits,files,comments,reviews,closingIssuesReferences58gh api repos/<owner>/<repo>/pulls/<number>/comments --paginate59gh api repos/<owner>/<repo>/issues/<number>/comments --paginate60```6162Use the final diff and current head as the strongest evidence for shipped behavior. Use63the PR base or a specific referenced revision for the old side of a before/after claim.64Treat PR prose, commit bodies, review comments, and code comments as leads that still need65verification.6667For dependency or submodule pointers, separate the parent PR's intent from the range the68pointer happens to cross. A required companion change or intentionally adopted dependency69behavior can be relevant. Unrelated intervening commits are not parent-PR topics merely70because the new pointer includes them; preserve the range with a compare link instead of71narrating it.7273### 2. Build one private evidence ledger7475Use these definitions before classifying the diff:7677- **Material topic:** an independently searchable causal or design unit with both its own78 why boundary (motivation, failure, root cause, constraint, compatibility consequence, or79 decision) and at least one decisive anchor not derived from another topic.80- **Explicit decision:** a non-trivial correction, exception, safety rule, or design choice81 that shares a material topic's root cause and lacks independent search intent. It remains82 a named sub-point under that topic.83- **Mechanical derivative:** generated output, lock or compiled artifacts, repeated84 documentation, ordinary verification, or iterative fixups that only implement or repeat85 a parent topic.8687Walk every changed path and substantive hunk once. Map each coherent change to exactly one88material topic, explicit decision under a named topic, or mechanical derivative under a89named topic. A hunk is substantive when it changes runtime, build, packaging, test, or90workflow behavior; an API or design decision; an emitted artifact; or rationale needed to91maintain one of those. Build, project, packaging, workflow, and configuration changes are92candidate topics just like source code.9394For each material topic, record:9596- need or user-visible symptom97- root cause or triggering condition98- chosen correction or design99- important tradeoff, compatibility rule, limitation, or rejected alternative100- verification evidence101- decisive anchors and their exact sources: errors, symbols, predicates, fallback order,102 counterexamples, measurements, revisions, or review-found semantic corrections103- related issue, PR, run, compare view, or commit104105Then perform one history-only pass over the parent PR's commits, reviews, linked context,106validation notes, and specifically adopted upstream changes. Capture information the final107tree cannot explain by itself: the original failure, a rejected obvious alternative, a108regression that changed the design, a compatibility exception, a review-found correction,109or a measurement that governs how evidence should be read. Do not walk an entire traversed110dependency range. Verify useful historical facts before adding them to the ledger.111112Apply these boundary rules:113114- Sharing a subsystem, umbrella feature, or final goal does not merge topics with different115 why boundaries or corrections.116- Do not split a topic merely because its implementation crosses files, commits, workflow117 stages, generated outputs, or tests.118- Multiple manifestations of one root cause remain one topic only when they share the same119 correction and compatibility rules.120- A feature's public programming model is a topic when its API, lifetime, interoperability,121 or compatibility design itself meets the material-topic definition; when it does, the122 overview is not a substitute for its section.123- Tests or benchmarks become a topic when they correct misleading prior evidence,124 introduce a distinct validation architecture, or independently establish a performance125 or compatibility decision. Ordinary verification stays with its parent.126- Correctness or equivalence evidence and performance evidence are separate topics when127 each independently justifies safe adoption.128- Review-found correctness or safety changes remain explicit decisions, or become topics129 when they have independent search intent.130- A shared mechanism, guard, or contract that several topics route through is itself a topic131 when it carries a guarantee, invariant, or safety rule that none of its consumers own. It132 is easy to mistake for plumbing precisely because it appears everywhere; distributing it133 as a sentence inside each consumer leaves that guarantee without a home and hides why the134 consumers became uniform.135- A removal, replacement, or move belongs to the topic that performs it, but the departing136 component still needs its name, the behavior that left with it, and where that137 responsibility now lives. This message is the only thing a future search for the deleted138 name will find.139140Use a counterfactual independence test before collapsing any candidate: if its correction141were reverted while the proposed parent remained, would a distinct failure, constraint, or142maintenance question return? If so, keep it as a material topic. A path is not a derivative143merely because it supports the same feature; it must share the parent's why and correction.144A shared goal or symptom category is not a shared root cause. Do not demote a candidate that145passes the material-topic definition merely to shorten the message. If the returning problem146shares the parent's why and lacks independent search intent, keep it as an explicit decision147rather than promoting it.148149After collapsing derivatives, choose the shape:150151- **Mechanical change:** subject only or one short explanatory paragraph.152- **One material topic:** focused causal narrative; no forced section heading.153- **Two or more material topics:** overview followed by exactly one named section per154 topic. In SkiaSharp, use the established `~~ Topic ~~` syntax.155156Every topic, explicit decision, and marked anchor gets one visible home. A section preserves157its causal chain; naming a file or category is not coverage. Collapsing a derivative removes158its separate heading, not useful evidence it contributes to the parent.159160Use a counterfactual anchor test: retain the smallest observed fact that shows why the161chosen design is necessary, why an obvious alternative is unsafe, or what made the evidence162credible. Compress repetition, not the condition, counterexample, scope, or measurement163that carries the proof.164165### 3. Draft in the repository's voice166167Prefer the repository's established subject form:168169- `[Area] Imperative summary (#PR)`170- `Area: imperative summary (#PR)`171- `Imperative summary (#PR)` when no area prefix is established172173Use an imperative verb, identify the real subsystem when useful, preserve the established174area spelling, and avoid vague subjects such as `Fix review comments` or `Misc changes`.175176Start the body with verified references. Use labels only for the relationship they express:177178- `Fixes:` for an issue the PR closes179- `Context:` for related issues, PRs, runs, announcements, documentation, URLs, or exact180 commit SHAs181- `Requires:` for the immediate companion PR or dependency this change is built on and182 cannot merge without. In a stack, that is the parent you actually build on; an earlier183 ancestor in the same stack explains context but is not what this change requires, so it184 belongs under `Context:`185- `Changes:` for dependency compare views or upstream ranges186- another label only when recent repository history establishes both its spelling and use187188Fetch every target. Do not convert a PR URL to an issue URL, call a related PR an issue,189claim a PR is completed without evidence, or attach a correct URL to the wrong relationship.190191Preserve the content expected for the kind of change:192193- **Bug fix:** symptom, investigation evidence, root cause, and correction194- **Dependency or submodule bump:** repository and revision, compare link, and only the195 upstream changes relevant to this repository196- **Release or platform update:** capability gap or release trigger, compatibility impact,197 project response, and authoritative links198- **Public API:** programming model, ownership or lifetime rules, native dependency, and199 platform limitations200- **Configuration or policy split:** each context, the value it receives, and the reason the201 difference is deliberate. An undocumented split reads as an inconsistency, and the next202 reader unifies it and reintroduces the failure it was preventing203- **Removal or migration:** the removed component by name, the behavior that left with it,204 and where that responsibility now lives205206For multiple topics, use this shape:207208```text209<imperative subject>210211<verified reference lines>212213<overview: what changes, why it matters, and the governing design>214215~~ <material topic or failure mode 1> ~~216217<symptom/need -> cause/constraint -> chosen change -> evidence>218219 * <optional explicit decision with cause, consequence, and anchor>220221~~ <material topic or failure mode 2> ~~222223<symptom/need -> cause/constraint -> chosen change -> evidence>224225<trailers>226```227228Name sections after the actual problem or decision, not `Changes` or `Implementation`. A229component, file, or artifact category is not the decision either; prefer the boundary,230failure, or rule the section resolves. Lead the overview with the governing design rather231than with provenance or scope bookkeeping — where the work was extracted from is one fact232the message can state, not the reason the change exists.233Use bullets for explicit decisions inside a topic, not as a substitute for topic sections.234Keep exception snippets, logs, reference lists, and bullets in-family for the target235repository.236237Hard-wrap ordinary prose with literal newline characters at the width observed in recent238target-repository merge messages; SkiaSharp's established cap is 80 columns. Code fences and239commit-message renderers do not add this formatting, so visual wrapping in a UI is not a240substitute. Preserve constructs that should remain on one line: the subject when reasonable,241reference and compare URLs, section markers, code or log lines, and attribution trailers.242Indivisible tokens may exceed the cap. Reflow bullet continuations using the repository's243established indentation.244245### 4. Run one claim-proof pass246247Check the final draft by claim type:248249- **References and relationships:** fetch and read each target, then record its actual entity250 type, title, and exact relationship to the PR. A resolving URL or its appearance in PR251 prose is not proof. Omit a reference whose relationship is unsupported. For a compare URL,252 verify its endpoints; do not walk every commit merely to validate the range.253- **Before/after behavior:** verify both sides in the artifacts that actually changed. If254 code already behaved that way and only guidance or validation changed, attribute the255 change to the guidance or validation.256- **Quantifiers and bounds:** scan for `all`, `every`, `only`, `no`, `always`, `never`,257 `exactly`, counts, minimums, maximums, and inequality symbols. Record the search universe258 and check the complete relevant set, including generated or aggregate surfaces, for an259 outlier. Narrow or remove the qualifier when any counterexample exists.260- **Precision:** verify exception names, predicates, revisions, versions, test counts,261 benchmark values, platform claims, and validation results against their exact sources.262 Re-read measurements and counts at the current head; a number captured before a later263 push was true when observed and is wrong now. Prefer durable validation evidence; omit264 transient pending, queued, or action-required status unless it explains a shipped design265 decision.266- **Coverage and capability claims:** describe what tests, validation, or a guard actually267 assert, in the terms the assertions use, rather than the capability they gesture at.268 "Covers remote branch authority" and "covers guarded pushes and direct-invocation guards"269 read as equivalent until someone relies on the first one and finds nothing behind it.270- **Safety and non-behavior claims:** replace an adjective such as read-only, safe,271 isolated, advisory, or deterministic with the specific thing that cannot happen and to272 which neighboring system. The adjective is what a later change quietly violates, because273 nothing in it says which guarantee was load-bearing.274- **Causal rationale:** verify reasons copied from PR descriptions, commits, or comments.275 Preserve meaningful non-goals and limitations, but label inference as inference or omit276 uncertain precision. A non-goal is durable when it states a lasting reason; "deferred",277 "excluded by request", or "out of scope for review size" is development chronology and278 stops being true the moment the follow-up lands.279- **Mixed-truth sentences:** split a verified fact from an unsupported qualifier instead of280 accepting the whole sentence because half is true. Watch for two distinct things the281 evidence calls by the same role word — a control, a baseline, a fixture, a config — and282 confirm which one each clause is about before joining them, because merging them yields a283 sentence whose halves are both true and whose join is not.284285### 5. Build source-backed attribution286287For the current PR and any related or superseded PR whose implementation or adopted human288feedback is carried forward, combine:2892901. every `.commits[].authors[]` entry, including the primary PR author2912. every case-insensitive `Co-authored-by:` trailer in each commit `messageBody`2923. human reviewers or commenters whose approval or substantive feedback contributed to the293 final change294295For each current, related, or superseded PR in scope, fetch issue comments, reviews, and296inline review comments rather than checking only the current PR. Deduplicate297case-insensitively by email. If the same display name used two distinct recorded emails,298retain both.299300Accept a `(name, email)` pair only when that exact email appears in a relevant commit author301entry, a co-author trailer, or the non-null `email` field returned by302`gh api users/<login>`. Never infer an address from a name or organization, construct a303GitHub noreply address, or mine unrelated commits. A trailer your own environment or house304style would normally append is not evidence either; it belongs here only when this PR's own305commits record it. If a contributing human reviewer has no verified email, omit the trailer306and report:307308```text309Missing context: verified email for @login310```311312A dependency author is not a parent-PR co-author merely because a pointer traverses their313commit. Credit copied or cherry-picked work only when authorship is preserved or an allowed314parent-PR source records it. Exclude routine automation identities, including dependency315updaters and automated review accounts; they are not missing human contributors. Include316coding agents when they authored code or appear in a co-author trailer.317318Every eligible candidate in the resulting attribution map must appear exactly once in the319trailers, or in `Missing context:` when a contributing human lacks a verified email. Trailers320are part of the commit message, so place them inside the fenced block at the end after a321blank line, one per line; only `Missing context:` lines belong outside the fence.322323### 6. Format and check the final output324325After drafting and attribution, confirm:3263271. Every substantive changed path maps to a topic, explicit decision, or derivative, and328 `section count == material-topic count` whenever that count is two or more.3292. Every topic explains need or symptom, cause or constraint, chosen change, and evidence;330 every explicit decision and decisive anchor has one visible home. Sibling sections carry331 comparable evidence; an asymmetry there is usually a dropped anchor rather than a332 genuinely unverified topic.3333. Every precise, relational, causal, quantified, and validation claim has its completed334 proof entry; no proof over a subset is worded as a whole-surface claim.3354. Every eligible attribution candidate, including relevant PR and commit authors, appears336 exactly once as a source-backed trailer or required missing-context item.3375. The message answers what a future maintainer would otherwise have to reopen the PR to338 learn, without file-by-file narration or repeated prose.3396. Scan the fenced message after all other edits and reflow every ordinary prose line over340 the observed cap. Exempt one-line constructs and indivisible tokens only where splitting341 would damage them.3427. The response contains exactly one fenced `text` block with only the polished commit343 message; it has no introduction, explanation, summary, or other response prose.344345After these checks pass, return the fenced message. Put any required `Missing context:`346lines after the closing fence so they are not copied into the commit message.