What
Two repos have now moved to a convention where the PR body is the spec for a change — there is
no committed change file, no lane to pick, and no planning/ tree:
Both carry an identical-in-shape .github/PULL_REQUEST_TEMPLATE.md, differing only in the package
path and the test command. This repo already hosts the org-default template at
.github/PULL_REQUEST_TEMPLATE.md, so it is the natural home — but the default is currently the
generic Summary / Changes / Checklist form, which does not carry the parts that make the convention
work.
Why the generic template is not enough
The convention's template is not a nicer checklist; four of its prompts are the convention:
- The admission check. Before writing a fact anywhere: derivable from the package → don't write
it; enforceable → a test; a user needs it → docs/; otherwise it does not get written. Without
this prompt at review time, prose accretes and the planning/ tree grows back.
- The invariant pin. If a wrong change could pass silently, pin it with a test whose name is the
claim and whose docstring opens INVARIANT: and says what breaks it.
- ADR routing. A rejected alternative with load-bearing reasoning goes to
docs/adr/, not into
the PR body where it is lost on merge.
- Issue routing. Real work you are not doing now becomes an issue, not a deferred-work file.
The generic template's "Docs updated if behavior or public API changed" asks the old question —
did you update the page? — which is what let the capability pages in both repos ratchet toward
restating code.
Proposed
- Adopt the convention in this repo.
planning/.convention-version is still 2.0.0, and this
repo still carries planning/ and architecture/. Deciding for the org while running the older
convention here is the awkward part; doing it first also proves the migration on a docs-shaped
repo rather than a library.
- Replace the org-default
.github/PULL_REQUEST_TEMPLATE.md with the convention form, written
generically — the two repo-specific bits are the package directory and the test command, which
can be phrased as "the package" and "the repo's full-suite recipe".
- Then the local copies come out. Once the default is in place,
modern-di and
faststream-outbox delete their own .github/PULL_REQUEST_TEMPLATE.md and inherit it. Both are
deliberately keeping theirs until step 2 lands, since a repo-local template silently wins over
the org default and there is no signal when the two drift.
Open question
Whether the generic form loses too much. The value of the checklist is partly that it names the
repo's actual gate (just test at 100% coverage in faststream-outbox, just test-ci in
modern-di). If the generic version reads as boilerplate, the alternative is to keep the template
local per repo and instead put the convention — the admission check and the four routes — in this
repo's CLAUDE.md as an org-wide rule, with each repo's template referencing it.
What
Two repos have now moved to a convention where the PR body is the spec for a change — there is
no committed change file, no lane to pick, and no
planning/tree:modern-di— PRs #424–#450faststream-outbox— chore: adopt the modern-di convention; drop planning/ and architecture/ faststream-outbox#159 (open)Both carry an identical-in-shape
.github/PULL_REQUEST_TEMPLATE.md, differing only in the packagepath and the test command. This repo already hosts the org-default template at
.github/PULL_REQUEST_TEMPLATE.md, so it is the natural home — but the default is currently thegeneric Summary / Changes / Checklist form, which does not carry the parts that make the convention
work.
Why the generic template is not enough
The convention's template is not a nicer checklist; four of its prompts are the convention:
it; enforceable → a test; a user needs it →
docs/; otherwise it does not get written. Withoutthis prompt at review time, prose accretes and the
planning/tree grows back.claim and whose docstring opens
INVARIANT:and says what breaks it.docs/adr/, not intothe PR body where it is lost on merge.
The generic template's "Docs updated if behavior or public API changed" asks the old question —
did you update the page? — which is what let the capability pages in both repos ratchet toward
restating code.
Proposed
planning/.convention-versionis still2.0.0, and thisrepo still carries
planning/andarchitecture/. Deciding for the org while running the olderconvention here is the awkward part; doing it first also proves the migration on a docs-shaped
repo rather than a library.
.github/PULL_REQUEST_TEMPLATE.mdwith the convention form, writtengenerically — the two repo-specific bits are the package directory and the test command, which
can be phrased as "the package" and "the repo's full-suite recipe".
modern-diandfaststream-outboxdelete their own.github/PULL_REQUEST_TEMPLATE.mdand inherit it. Both aredeliberately keeping theirs until step 2 lands, since a repo-local template silently wins over
the org default and there is no signal when the two drift.
Open question
Whether the generic form loses too much. The value of the checklist is partly that it names the
repo's actual gate (
just testat 100% coverage infaststream-outbox,just test-ciinmodern-di). If the generic version reads as boilerplate, the alternative is to keep the templatelocal per repo and instead put the convention — the admission check and the four routes — in this
repo's
CLAUDE.mdas an org-wide rule, with each repo's template referencing it.