Introduce a "minor" tag for low-risk PRs that don't need a Trac ticket

Hello everyone,

I’d like to suggest allowing low-risk pull requests — such as typo fixes, small documentation changes, and test additions — to proceed without a Trac ticket.

Django’s workflow expects a ticket reference for every PR, which makes sense for features and bug fixes. But in practice, people often use “no ticket” to indicate that a PR doesn’t require one.

Looking at merged PRs, this isn’t rare — it’s a consistent pattern. Most of these cases involve documentation changes, tests, typo fixes, or small cleanups. In these situations, creating a ticket tends to add more overhead than value.

Rather than relying on the implicit convention of “no ticket”, it might make sense to acknowledge this more explicitly.

The types of changes I have in mind are:

  • documentation-only changes
  • typo or wording fixes
  • test additions or fixes without behavior changes
  • small cleanups or refactors
  • CI or build configuration updates
  • localization updates

This isn’t about bypassing review, but making it easier for maintainers to quickly understand and distinguish these changes.

For consistency, we could also define a simple PR title convention in the contribution guidelines (e.g. “Fix typo”, “Update docs”, “Add test”), and validate it via CI with automatic labeling. (This is also quite relevant in the context of LLM usage.)

For reference, I also put together a repository with the related data and analysis:

The statistics above are based on collecting and analyzing all relevant merged PRs.

Happy to hear thoughts.

1 Like

So, is the idea to distinguish “no ticket, and that’s okay” from “no ticket, please fix”? In my experience the “please fix” comes from a human noticing that something is wrong, either the author fixing a ticket realizing they haven’t mentioned the ticket anywhere, or a reviewer telling the author to open a ticket.

1 Like

Thank you for your feedback :slight_smile:

I realize my explanation above was quite lacking.

This also connects pretty directly to what’s being built in pr-playground. As you mentioned in the other thread, it’s still in a “trial in a separate repo” stage, and the current check_pr.py setup requires a ticket reference for every PR and auto-closes anything without one. Right now the only exception is docs-only changes.

I took a look at the data, and that docs exception only covers about 31.7% of historically ticketless PRs. The remaining ~68% (over 2,100 PRs) were all merged without tickets, but would’ve been auto-closed under the current logic. (ref. django-minor-tag-proposal/reports/ticketless-summary.md at main · JaeHyuckSa/django-minor-tag-proposal · GitHub)

You could try to add path-based exemptions for each category, but that seems like it would get messy pretty quickly. Docs are easy since they live under a clear directory, but things like tests, typo fixes in code, or CI changes don’t really have that kind of structure. At some point the automation is just guessing intent from file paths.

And that’s kind of the core issue — “no ticket” is ambiguous. It can mean “this doesn’t need a ticket” or “I forgot to reference one,” and automation can’t reliably tell the difference.

I definitely agree that human review is still where the actual decision should happen. This isn’t about replacing that, just about making the author’s intent clearer before it gets there, so both automation and reviewers have a bit more context.

Since the workflow is still in a trial phase, it felt like a reasonable time to explore something like:

  • has a ticket reference → normal flow
  • has a minor tag → intentionally ticketless, reviewer decides
  • neither → safe to auto-close

That way we don’t need to keep adding more and more heuristics, and the overall logic stays pretty simple.

cc. @frankwiles

The vast majority of these ticketless merges are from prolific Django contributors. I think it would make more sense to just exempt a certain set of users from the PR auto-close flow entirely as they will VERY likely either 1) Have a ticket and well written PR description when appropriate 2) know when it’s fine to just have a low effort PR

1 Like

Thank you for responding to the tag :slightly_smiling_face:

That’s a fair point — the top 10 authors alone account for about 53% of ticketless PRs, so exempting them would cover a lot.
(Ref. django-minor-tag-proposal/reports/author-analysis.md at main · JaeHyuckSa/django-minor-tag-proposal · GitHub)

The thing is, there are 721 unique authors in the dataset, and 624 of them only have 1–2 ticketless PRs each — that’s 715 PRs, about 23% of the total.

Most of these are first-time contributors making small changes like fixing typos or cleaning up docs, so they’d never be on an exemption list.

These are usually the easiest PRs to review, and also where a good first experience matters most.
Auto-closing them just because the author isn’t recognized yet feels like it’d do more harm than good.

User-based exemptions make sense for known contributors.
A minor tag can cover everyone else.

These two approaches could work well together.

It looks like the PR validator you have built does allow PRs to pass without a Trac ticket mentioned, provided the rest of the PR checklist was filled out. If that’s the case, I’m not sure we need another label here to avoid something being autoclosed.

Does GitHub support allowing a PR to be created by the public with a subset of labels? For some reason I thought we had to make all labels available and/or the user needs triage permissions on the repo.

If not, we could potentially have them write in the ticket area “N/A - typo”

Or create a separate list for no Trac tickets.

:+1: That’s an explicit “intentionally ticketless” without requiring tagging.

Writing “N/A - {reason}” in the PR ticket number section is usable by all contributors: first-time or prolific, whether or not they have GitHub triager permission. (I suppose it might get misused, but it seems like slop PRs tend to ignore the instructions entirely, not try to find loopholes in them.)

Then the validator can check there’s either a ticket number or declared reason a ticket isn’t needed. (There might eventually be additional validation for certain reasons: e.g., “N/A - docs” changes should be entirely in the docs dir. “N/A - typo” should be a line or two max, modulo reformatting. But that could come later, only if needed.)

I’d prefer this over using GitHub labels, especially bot-automated labels on valid PRs. (The CPython repo is a cacophony of jabbering bots constantly adding and removing labels and chiming in with comments. Action-required updates get lost among informational and automation-support ones. As an only-occasional contributor there I find the whole thing noisy and difficult to follow. I wouldn’t want Django to become that.)

That’s a really great suggestion, thank you!

I hadn’t considered that approach, but it makes a lot of sense. I also agree that increasing the number of bots could make the review process more noisy and harder to follow, which is something I’d prefer to avoid.

Standardizing the use of the ticket field (e.g. “N/A - {reason}”) seems like a simple and effective solution.

Thanks again for sharing this idea — I really appreciate it.

I’ve created a ticket to move this forward :slight_smile:

1 Like