Pull Request Guide
Pull requests are the primary way Plumego changes.
They are also the primary mechanism
by which long-term risk enters the codebase.
This guide explains how to prepare a PR
that is likely to be reviewed constructively,
understood clearly,
and evaluated fairly.
Before You Open a Pull Request
Most unsuccessful PRs fail before any code is written.
Before opening a PR, you should be able to answer:
- What concrete problem does this solve?
- Where is the problem documented or observable?
- Why does this belong in Plumego?
- Why can this not live outside the core?
- What long-term cost does this introduce?
If any of these answers are unclear,
do not open a PR yet.
Start With an Issue (Usually)
For anything beyond trivial changes,
start with an issue or discussion.
Issues are appropriate for:
- Behavior clarification
- Design questions
- Proposal discussion
- Ambiguity in documentation
- Architectural concerns
PRs without prior discussion
are often closed or asked to reframe.
What Makes a Good Pull Request
A good PR is:
- Small in scope
- Focused on one concern
- Easy to reason about
- Explicit in intent
- Conservative in impact
If a PR feels “ambitious”,
it is probably too large.
Scope Control (Critical)
Each PR should:
- Solve one problem
- Change one conceptual area
- Avoid unrelated refactors
- Avoid formatting-only churn
Large PRs are difficult to review
and often hide unintended consequences.
Prefer multiple small PRs over one large one.
What a PR Should Contain
A well-formed PR includes:
1. Clear Description
Explain:
- The problem being solved
- Why it matters
- How the change works
- What is intentionally not changed
Avoid marketing language.
Be precise and concrete.
2. Explicit Trade-Offs
If the change introduces:
- More code
- Less convenience
- New constraints
- New maintenance cost
Say so explicitly.
Plumego values honesty over persuasion.
3. Documentation Updates (When Applicable)
If behavior changes or is clarified:
- Update Reference docs
- Update Concepts or Architecture if needed
- Update FAQ if misunderstandings are addressed
PRs that change behavior without documentation
are incomplete.
4. Tests (When Applicable)
Tests should:
- Demonstrate the intended behavior
- Protect against regressions
- Avoid relying on internal details
Tests are not required for every change,
but absence of tests must be justified.
What a PR Should Not Contain
PRs should not include:
- New features “while we’re here”
- Broad refactors for style
- Speculative abstractions
- Convenience APIs without strong justification
- Changes that violate non-goals
Bundling unrelated changes
reduces the chance of acceptance.
Commit Guidelines
While Plumego does not enforce a strict commit style,
good commits are:
- Logically grouped
- Self-contained
- Meaningfully named
Avoid:
- “fix stuff”
- “cleanup”
- “WIP” in final commits
Reviewers read commits to understand intent.
Review Expectations
Reviews focus on:
- Explicitness
- Boundary preservation
- Dependency direction
- Long-term clarity
- Alignment with design principles
Reviews may feel strict.
This is intentional.
Reviewers are protecting:
- Users
- Future maintainers
- The framework’s guarantees
Common Review Outcomes
1. Accepted As-Is
Rare, but possible for:
- Documentation improvements
- Clear bug fixes
- Very small changes
2. Requested Changes
Most PRs fall here.
This usually means:
- Scope adjustment
- Clearer documentation
- Reduced abstraction
- Explicit trade-off discussion
This is normal, not a rejection.
3. Reframed or Deferred
Sometimes the idea is valid,
but the timing or scope is not.
In this case:
- The PR may be closed
- The idea may be recorded elsewhere
- Future work may be suggested
4. Rejected
Rejection usually happens because:
- The change violates principles
- The change expands the core unnecessarily
- The long-term cost is too high
- The problem is better solved elsewhere
Rejection is about fit, not competence.
Responding to Review Feedback
When responding to reviews:
- Address comments explicitly
- Ask clarifying questions if needed
- Avoid defensive language
- Be willing to simplify or remove code
Plumego values collaboration,
but not endless negotiation.
Updating or Closing a PR
It is acceptable to:
- Reduce scope
- Split a PR
- Close a PR voluntarily
- Turn a PR into documentation only
Not every idea needs to become code.
Responsibility After Merge
Merging a PR does not end responsibility.
Contributors are expected to:
- Answer follow-up questions
- Help with clarification
- Assist with future refactors if needed
- Own the intent of the change
Every merged PR becomes part of Plumego’s history.
A Mental Model to Keep in Mind
When opening a PR, imagine this question:
“If this code still exists in five years,
will future engineers thank me for it?”
If the answer is uncertain,
reconsider the change.
Summary
Pull requests in Plumego are not transactions.
They are commitments.
- Keep them small
- Keep them explicit
- Keep them honest
- Keep them defensible over time
Plumego grows through careful changes,
not momentum.
Related Contributing Pages
- Contribution Philosophy — why restraint matters
- Decision Process — how PRs are evaluated
- Code Structure — where changes are allowed
- Documentation Guide — how intent is recorded
A good PR makes Plumego smaller in risk,
even if it makes the codebase slightly larger.