Every workspace member
pnpm validate (tools/scripts/validate-repository.mjs) enforces these on every member:
README.md,AGENTS.md(with a## PIIsection, even if it says “none”),CHANGELOG.mdandLICENSEare present.- The package is named
@stackra/*, uses onlycatalog:orworkspace:versions, depends on none of the forbidden packages (eslint, prettier, jest, Nest, Prisma, Drizzle and so on), and extends one@stackra/typescript-configpreset. turbo.jsoncextends the root and declares exactly one tier tag that matches the directory.- The task vocabulary scripts exist (
build,typecheck,lint,test,format,format:check,clean): target check, not built yet. See Tooling.
A change is done when
1
The gate is green, reported as what it checked
pnpm verify passes: format, lint, typecheck, test, build, validate, boundaries and knip.
State what you ran. A green gate does not mean a service runs or that CI’s runner agrees; see
CI.2
3
A decision that changed is an ADR, not a comment
If the change reverses or extends an accepted decision, the new or superseding ADR in
apps/docs/src/adr/ lands in the same change as the code. A change that quietly re-decides
something is exactly what the architecture guardian blocks.4
Docs are current, not merely present
The member’s
README.md and AGENTS.md, and any page that states the rule you changed, are
true after your change. A required file existing is enforced; its content staying true is a
review responsibility.5
A changeset records the change
Every changed member has one (
pnpm changeset). pnpm changeset:status checks it; chaining it
into pnpm verify is a target. See Release.6
No secret, no literal version, no new dependency by accident
gitleaks stays clean, versions come from catalogs, and a new dependency was added to a catalog
first with its licence checked (Dependencies).
7
Review matched the change, and findings are closed
Use the reviewers that fit what changed. A finding is closed by fixing it or by recording why it
does not apply, never by restating the code that produced it. Conventional commit messages,
scoped by member (Commits and releases).
8
No gate was weakened to get green
Classify a failure first: implementation bug, wrong test, wrong requirement, wrong design,
environment problem or flake. Then fix what the classification names. A failing test is not a
licence to loosen the assertion, a type error is not a licence for
any, and a lint failure is
not a licence for an unexplained disable. A gate changes only through the record that created
it, never in the same commit as the code that was failing it.