docs(contributing): add PR description template and convention #123
No Reviewers
Labels
Clear labels
Area/CI
Area/Completions
Area/Components
Area/Config
Area/Docs
Area/Functions
Area/Integrations
Area/Prompt & Theme
Area/Scripts
Area/Tests
Compat/Breaking
Kind/Bug
Kind/Chore
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Performance
Kind/Refactor
Kind/Security
Kind/Testing
good first issue
help wanted
.github/workflows and repository automation
completions/ - tab-completion scripts
The opinionated-component system (C1-C6)
config.fish and conf.d/ - startup and environment
docs/manual/ and the generated manual, man page, and site
functions/ - user-facing functions and helpers
integrations/ - third-party tool wiring
themes/ and prompt appearance
scripts/ - standalone helper scripts
tests/ - the syntax lint and functional suite
Breaking change that won't be backward compatible
Something is not working
Tooling, dependencies, and housekeeping
Documentation changes
Improve existing functionality
New functionality
Makes existing behavior faster or lighter
Restructures code without changing behavior
This is security issue
Issue or pull request related to testing
Priority
Critical
1
The priority is critical
Priority
High
2
The priority is high
Priority
Low
4
The priority is low
Priority
Medium
3
The priority is medium
Reviewed
Confirmed
1
Issue has been confirmed
Reviewed
Duplicate
2
This issue or pull request already exists
Reviewed
Invalid
3
Invalid issue
Reviewed
Won't Fix
3
This issue won't be fixed
Status
Abandoned
3
Somebody has started to work on this but abandoned work
Status
Blocked
1
Something is blocking this issue or pull request
Status
Need More Info
2
Feedback is required to reproduce issue or to continue work
Well-scoped and self-contained; a good place to start
Maintainer is looking for someone to pick this up
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Assignees
rootiest (Rootiest)
Clear assignees
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: rootiest/fish-config#123
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
An agent working in this repo recently went looking for a PR template
(
.github/pull_request_template.md,.github/PULL_REQUEST_TEMPLATE.md,PULL_REQUEST_TEMPLATE.md,docs/PULL_REQUEST_TEMPLATE.md) and foundnothing. The format was real but implicit — every contributor and agent had
to reverse-engineer it from prior PRs, which is exactly how the drift
described below crept in. This codifies it.
.github/PULL_REQUEST_TEMPLATE.md—## Summary, optional##sections, then
## Verificationlast. The guidance lives in HTMLcomments, so it vanishes on render and leaves no boilerplate residue in
the posted body. Gitea falls back to
.github/when.gitea/is absentand the GitHub mirror reads the same path, so one file covers both
remotes — and it's a path the agent above was already checking.
CONTRIBUTING.md— new### Pull request descriptionssubsectionunder Branching & Pull Requests documenting the same structure, plus two
new merge rules: the verification gate and the
WIP:prefix.Documentation only. No fish, Python, or workflow files are touched.
How the convention was derived
Pulled all 122 prior PRs from the Gitea API
(
/repos/rootiest/fish-config/pulls,state=all) and tallied the##headings across every body rather than sampling recent ones:
## Summary## Manual Verification## Manual Verification Checklist## Test plan## VerificationCheckbox items across all merged bodies run 585
- [x]to 12- [ ],confirming that verification is genuinely performed rather than aspirational.
Optional middle sections were taken from what actually recurs:
Root cause,Why,How it works,Behavior,Changes,Docs,Notes,Scope note,Opinionated guard (C1-C6), and## ⚠️ Breaking Change(paired with the
!title marker, as in #89). TheWhy not <alternative>?heading pattern is called out too, since it shows up whenever a reviewer
would reasonably ask why the obvious approach was rejected.
Why the recent variants are mostly drift
The
## Summary+ verification-section shape is stable across the wholehistory; what moved around was the second heading's name, in three
different directions — which is what marks most of it as drift rather than
deliberate evolution:
## Manual Verification Checklist.## Test plan, the PR 8-9 form that had alreadybeen abandoned once.
## Verification— and that one wasright, for the reason below. Those same PRs also dropped
## Summaryentirely in favor of freeform openers (
## Why the plural failed); thatpart is not carried forward.
Why
## Verification, not## Manual Verification"Manual" understated what the list actually holds. In practice most entries
are programmatic —
fish tests/run-tests.fish,fish_indent,docs/verify-manual.py, CI — and the old name left no clean home for them.Dropping the word lets one list carry both kinds and gives the checkbox
state real meaning:
performed it by hand.
perform. Left visible rather than quietly dropped.
checked.
A direct consequence, also documented: only resolvable checks belong in
this section, since one nobody can run would block the PR indefinitely.
Genuinely unverifiable caveats go in
## Notes— which is how this PR'sown body is organized.
The
WIP:prefix, and how it differs from the merge gateA branch that still has code coming opens as
WIP: type(scope): description.Gitea recognizes the prefix, flags the PR as a draft, and refuses to merge
until it's removed.
The distinction from the verification gate is the whole point of
documenting it, so both files state it outright:
WIP:means morechanges are coming — not "done but unverified." A finished branch waiting
on manual checks is an ordinary PR whose
## Verificationboxes aren't allticked yet, and that case is already covered by the merge gate. The two
signals are independent and can occur in any combination:
WIP:Verified against this instance rather than assumed from Gitea's defaults —
see the checklist below.
Issue linking (
Closes #N)Not derived from precedent — a grep across all 122 prior PRs found zero
Closes/Fixes/Resolvesreferences, since the repo hasn't used issuetracking yet. Established deliberately so the first PR that does close an
issue has a rule to follow rather than inventing one.
## Summary, not the bottomof the body, because
## Verificationis always last.Fixes #NandResolves #Nare equivalent;Refs #Nreferences arelated issue without closing it.
Closes #42, closes #43closesboth, while
Closes #42, #43closes only the first and leaves the secondas a plain link.
placeholder, so the common case (no associated issue) leaves no stray
Closes #in the rendered body.Notes
Three things that cannot be verified from this branch and so are
deliberately not in the checklist below, per the rule this PR adds:
resolves the PR template from the base branch, so the description box
on this branch's compare page is still empty — confirmed by parsing the
page, where both
<textarea>elements render with no content. Once thislands on
main, the next PR opened will pre-fill.are opened on Gitea, so it's cosmetic. An earlier draft of
CONTRIBUTING.mdclaimed the mirror pre-loads the template; that claimwas removed rather than left unverified.
Closes #Nauto-closing is assumed, not observed. Standard Giteabehavior, but there are no issues in this repo to test it against. Worth
confirming the first time it's used for real.
Verification
fish tests/run-tests.fishpasses — 220/220 syntax lint, 10/10functional checks
python3 docs/verify-manual.pypasses — 74/74git statusclean; no generated docs artifacts disturbedWIP:behavior confirmed empirically on this instance, notinferred from Gitea's defaults: retitling this PR to
WIP: docs(...)flipped the API's
drafttotrueandmergeabletofalse;removing the prefix restored
draft: false/mergeable: trueCONTRIBUTING.md§Testinggives the entry point as
fish tests/run-tests.fish, and§Opinionated Components defines the tiers as C1-C6. Both were
wrong in the first draft of the template
over-length lines remaining in
CONTRIBUTING.mdare pre-existingURLs and code blocks
Manual Verificationreference renamed —grep -n 'Manual Verification'returns no hits in either filemoving unverifiable items out of this section and into
## Notesconfirm the HTML-comment guidance reads clearly and matches how you
actually want PRs written
the sole merger — it means no PR merges with an open box
WIP:/ unchecked-box split matches your intent: theprefix for incoming code, unticked boxes for pending verification,
never one standing in for the other