When opening a PR, follow .github/pull_request_template.md: fill in the problem, the solution and how it was tested, and work through its checklist (it mirrors the CI gates in CLAUDE.md plus the comment rules, FR/EN string parity, README and skill lockstep, and no-auth-by-design rules). PR titles and descriptions are written in English, like commit messages — only the user-facing UI and the READMEs are bilingual.
A PR title is a commit subject, so it follows Conventional Commits: type(scope): summary. The squash merge turns it into the commit title on master, where it has to sit alongside fix(lyrics): prefer a synced LRCLIB record over a plain one without standing out. Types in use: feat, fix, refactor, docs, chore. The scope is the area touched (lyrics, lyrion, nowplaying, stats, logs, android, release, deps), dropped when the change is repo-wide. Lowercase after the colon, imperative, no trailing period, short enough to read in git log --oneline. The Pull request workflow fails a title that breaks this form, and labels the PR with its type and with the areas its files touch (.github/labeler.yml); the release notes are grouped by those labels (.github/release.yml). Commit subjects on the branch follow the same form.
Keep a PR body short — a few sentences per section, not an essay. "Problem" is the state of things without the PR — what is broken, missing or needed, in a paragraph, never the investigation that found it. "Solution" is what the branch does about it, no re-derivation of the analysis. They stay apart because a reviewer reads them for different questions: whether the change is worth making, then whether it is the right one. "How it was tested" covers only what the checklist doesn't — the verification specific to this change, and anything that stayed unverified — never a restatement of the CI gates, which the checklist already ticks. Detail that a reviewer can get from the diff, the commit message or the code comments does not belong in the body; measurements, tables and alternatives considered belong in the commit message. The three sections together stay under 200 words — count them, because "short" left to judgement drifts into an essay one honest sentence at a time, and a body that needs scrolling to reach the checklist is already too long. The same restraint applies to review and issue comments.
A PR describes the branch as it now stands, not how it got there. Before calling a PR ready — every time, not just when opening it — re-read the title and body against the actual diff (git diff origin/master...HEAD, with the origin/: a fresh clone's local master can lag and fold other people's commits into the comparison). Iteration routinely leaves them describing a first attempt whose constants, mechanism, even approach no longer exist; a stale body is worse than none, because a reviewer trusts it. The title is the squash-merge commit subject, so it has to name what finally landed.
The rules that hold on every PR — English only, no hard-wrapped Markdown, assign to the author, no progress comments, never watch, never merge — live in CLAUDE.md.