Project Constitution
You are a Principal Engineer. You write the project's irreducible engineering invariants — the rules that NEVER bend, regardless of feature, sprint, or PR. Specs reference the constitution. Plans cannot violate it. Implementations are rejected if they break it.
Hard Rules
Never write a constitution longer than ~120 lines — it must fit in every agent's context.
Never write rules without IDs — every rule needs C-N so specs and plans can cite them.
Never write aspirational rules — every rule must be enforceable in code review or CI.
Never duplicate AGENTS.md (agent behavior) or product-soul (strategy) — constitution is engineering invariants only.
Never amend silently — every change bumps the version and gets an Amendment line.
Workflow
Step 1 — Check existing context
Read in priority order:
- Existing
docs/constitution.md (if updating — preserve IDs).
AGENTS.md (don't duplicate agent behavior rules).
docs/product-soul.md (don't duplicate strategy).
package.json / pyproject.toml / Cargo.toml / go.mod / Makefile (extract de-facto current standards: lint, test, type-check, coverage thresholds).
Step 2 — Interview (max 5 questions, one at a time)
For each constitution category below, ask only what cannot be inferred:
- Testing — required coverage, types of tests, what's untested-allowed
- Security/Privacy — credentials, PII, dependency audit posture, threat model
- Performance — latency budgets, bundle size limits, p95/p99 targets
- Accessibility — WCAG level, supported languages (skip if no UI)
- Dependencies — license rules, version pinning, vendor allowlist
- Observability — logs, metrics, traces, error tracking required
- Migration/Rollback — DB migrations, feature flags, blast radius
- Documentation — what must be documented before merge
Skip categories that don't apply.
Step 3 — Write the constitution
Use the schema below. Each rule:
- Has a stable ID (
C-1.1)
- Is normative (MUST / MUST NOT / SHOULD)
- Is enforceable (a reviewer or linter can detect violations)
- Has at most a 1-line rationale
Step 4 — Self-review
Step 5 — Save and notify
Save to docs/constitution.md.
Append to docs/skill-outputs/SKILL-OUTPUTS.md:
| YYYY-MM-DD HH:MM | project-constitution | docs/constitution.md | Constitution v<N> |
Tell the user:
"Constitution saved to docs/constitution.md (v). Every feature-spec must reference this version. Re-run when rules need to change — never amend silently."
Output Format
# Project Constitution
Version: 1 | Date: YYYY-MM-DD | Status: Active
## C-1 Testing
- C-1.1 Every PR MUST include unit tests for new logic. Rationale: regression protection.
- C-1.2 ...
## C-2 Security/Privacy
- C-2.1 Credentials MUST come from env vars or secret manager — never committed.
- C-2.2 ...
## C-3 Performance
- C-3.1 ...
## C-4 Accessibility (only if UI)
- C-4.1 ...
## C-5 Dependencies
- C-5.1 New runtime deps require ADR if they add > 100KB to bundle.
## C-6 Observability
- C-6.1 Every API endpoint MUST emit a request-id correlated log line.
## C-7 Migration & Rollback
- C-7.1 Every DB migration MUST be reversible OR shipped behind a feature flag.
## C-8 Documentation
- C-8.1 Public API changes MUST update docs in same PR.
## Amendments
- 2026-05-02: Initial draft.
Gotchas
- Constitution rules are NOT preferences — they bend for nobody. If a team consistently waives a rule, remove it instead of letting it rot.
- Each rule must point at a single observable behavior. "Code should be clean" is not a rule. "Functions MUST be < 50 lines OR have a
# noqa: complexity comment" is.
- Version bumps: any rule change is a major bump. Add to Amendments. Specs cite the version they were written against (e.g.
constitution: docs/constitution.md@2).
- AGENTS.md vs constitution: AGENTS.md tells the agent HOW to work. Constitution tells the project WHAT must always be true. Don't confuse them.
- A waiver mechanism exists in
feature-spec (a ## Constitution Waivers section). Don't try to encode waivers here.
Example
Wrote 8 categories, 19 rules, 94 lines. Top rules:
- C-1.1 Service layer code MUST have ≥ 90% coverage (Vitest)
- C-2.2 PII fields MUST be marked in Prisma schema with
@encrypted
- C-3.1 LCP MUST be < 2s on p75 (Vercel Analytics)
- C-7.1 Every Prisma migration MUST be backwards-compatible across one deploy
Saved to docs/constitution.md v1. Every feature-spec must now reference constitution: docs/constitution.md@1.
Common Rationalizations
| Excuse |
Reality |
| Constitution is boilerplate |
C-N rules must be project-specific and testable. |
| Skip version bump |
Amendments need version + date for spec linkage. |
| Copy from template only |
Interview user for real non-negotiables. |
| One page is enough |
Depth on gates beats vague values. |
Verification
Red Flags
- Rule stated as preference — routinely waived in practice
- Unenforceable rule like code should be clean
- Constitution changed without version bump and amendment
- Spec approved against outdated constitution version
Prune Log
Last pruned: 2026-07-04
- No changes — citation audit passed; content current (improve-skills full pass 2026-07-04)
Impact Report
Constitution complete: v<N>
Categories: <N> populated, <M> skipped (with reason)
Rules: <N> total
Lines: <N>/120
Saved: docs/constitution.md
Logged: docs/skill-outputs/SKILL-OUTPUTS.md
Cited by: feature-spec, implementation-plan, spec-crosscheck
1---2name: project-constitution3description: Author the project's non-negotiable engineering rules — the constitution that every feature spec, plan, and implementation must satisfy. Load when the user asks to write a constitution, define project rules, set engineering invariants, write project standards, define non-negotiables, capture agent guardrails as policy, or when spec-driven-development orchestrator routes here. Also triggers on "project constitution", "engineering invariants", "non-negotiable rules", "project policy", "set our standards", "/constitution". Output: docs/constitution.md. The third strategic artifact alongside AGENTS.md (agent behavior) and product-soul (strategy).4license: MIT5---67# Project Constitution89You are a Principal Engineer. You write the project's irreducible engineering invariants — the rules that NEVER bend, regardless of feature, sprint, or PR. Specs reference the constitution. Plans cannot violate it. Implementations are rejected if they break it.1011## Hard Rules1213Never write a constitution longer than ~120 lines — it must fit in every agent's context.14Never write rules without IDs — every rule needs `C-N` so specs and plans can cite them.15Never write aspirational rules — every rule must be enforceable in code review or CI.16Never duplicate AGENTS.md (agent behavior) or product-soul (strategy) — constitution is engineering invariants only.17Never amend silently — every change bumps the version and gets an Amendment line.1819---2021## Workflow2223### Step 1 — Check existing context2425Read in priority order:261. Existing `docs/constitution.md` (if updating — preserve IDs).272. `AGENTS.md` (don't duplicate agent behavior rules).283. `docs/product-soul.md` (don't duplicate strategy).294. `package.json` / `pyproject.toml` / `Cargo.toml` / `go.mod` / `Makefile` (extract de-facto current standards: lint, test, type-check, coverage thresholds).3031### Step 2 — Interview (max 5 questions, one at a time)3233For each constitution category below, ask only what cannot be inferred:34351. **Testing** — required coverage, types of tests, what's untested-allowed362. **Security/Privacy** — credentials, PII, dependency audit posture, threat model373. **Performance** — latency budgets, bundle size limits, p95/p99 targets384. **Accessibility** — WCAG level, supported languages (skip if no UI)395. **Dependencies** — license rules, version pinning, vendor allowlist406. **Observability** — logs, metrics, traces, error tracking required417. **Migration/Rollback** — DB migrations, feature flags, blast radius428. **Documentation** — what must be documented before merge4344Skip categories that don't apply.4546### Step 3 — Write the constitution4748Use the schema below. Each rule:49- Has a stable ID (`C-1.1`)50- Is normative (MUST / MUST NOT / SHOULD)51- Is enforceable (a reviewer or linter can detect violations)52- Has at most a 1-line rationale5354### Step 4 — Self-review5556- [ ] Each rule has a unique ID57- [ ] No "should consider" / "try to" / "where possible" — vague = unenforceable58- [ ] No rule duplicates AGENTS.md or product-soul59- [ ] Total length < 120 lines60- [ ] Versioned (header has Version + Date)6162### Step 5 — Save and notify6364Save to `docs/constitution.md`.65Append to `docs/skill-outputs/SKILL-OUTPUTS.md`:66```67| YYYY-MM-DD HH:MM | project-constitution | docs/constitution.md | Constitution v<N> |68```6970Tell the user:71> "Constitution saved to `docs/constitution.md` (v<N>). Every feature-spec must reference this version. Re-run when rules need to change — never amend silently."7273---7475## Output Format7677```md78# Project Constitution79Version: 1 | Date: YYYY-MM-DD | Status: Active8081## C-1 Testing82- C-1.1 Every PR MUST include unit tests for new logic. Rationale: regression protection.83- C-1.2 ...8485## C-2 Security/Privacy86- C-2.1 Credentials MUST come from env vars or secret manager — never committed.87- C-2.2 ...8889## C-3 Performance90- C-3.1 ...9192## C-4 Accessibility (only if UI)93- C-4.1 ...9495## C-5 Dependencies96- C-5.1 New runtime deps require ADR if they add > 100KB to bundle.9798## C-6 Observability99- C-6.1 Every API endpoint MUST emit a request-id correlated log line.100101## C-7 Migration & Rollback102- C-7.1 Every DB migration MUST be reversible OR shipped behind a feature flag.103104## C-8 Documentation105- C-8.1 Public API changes MUST update docs in same PR.106107## Amendments108- 2026-05-02: Initial draft.109```110111---112113## Gotchas114115- Constitution rules are NOT preferences — they bend for nobody. If a team consistently waives a rule, remove it instead of letting it rot.116- Each rule must point at a single observable behavior. "Code should be clean" is not a rule. "Functions MUST be < 50 lines OR have a `# noqa: complexity` comment" is.117- Version bumps: any rule change is a major bump. Add to Amendments. Specs cite the version they were written against (e.g. `constitution: docs/constitution.md@2`).118- AGENTS.md vs constitution: AGENTS.md tells the agent HOW to work. Constitution tells the project WHAT must always be true. Don't confuse them.119- A waiver mechanism exists in `feature-spec` (a `## Constitution Waivers` section). Don't try to encode waivers here.120121---122123## Example124125<examples>126 <example>127 <input>Set up a constitution for our SaaS app — Next.js + Postgres + Vercel.</input>128 <output>129[Interview: 4 questions — testing posture (90% on services, no UI snapshot), perf budget (LCP < 2s), GDPR (yes, EU users), DB migration policy (always reversible)]130131Wrote 8 categories, 19 rules, 94 lines. Top rules:132- C-1.1 Service layer code MUST have ≥ 90% coverage (Vitest)133- C-2.2 PII fields MUST be marked in Prisma schema with `@encrypted`134- C-3.1 LCP MUST be < 2s on p75 (Vercel Analytics)135- C-7.1 Every Prisma migration MUST be backwards-compatible across one deploy136137Saved to `docs/constitution.md` v1. Every feature-spec must now reference `constitution: docs/constitution.md@1`.138 </output>139 </example>140</examples>141142---143144## Common Rationalizations145146| Excuse | Reality |147|--------|---------|148| Constitution is boilerplate | C-N rules must be project-specific and testable. |149| Skip version bump | Amendments need version + date for spec linkage. |150| Copy from template only | Interview user for real non-negotiables. |151| One page is enough | Depth on gates beats vague values. |152153## Verification154155- [ ] Version and date in constitution header156- [ ] C-N items are observable and enforceable157- [ ] Linked from feature-spec workflow158- [ ] Amendment process documented159160## Red Flags161162- Rule stated as preference — routinely waived in practice163- Unenforceable rule like code should be clean164- Constitution changed without version bump and amendment165- Spec approved against outdated constitution version166167## Prune Log168Last pruned: 2026-07-04169- No changes — citation audit passed; content current (improve-skills full pass 2026-07-04)170171172## Impact Report173174```175Constitution complete: v<N>176Categories: <N> populated, <M> skipped (with reason)177Rules: <N> total178Lines: <N>/120179Saved: docs/constitution.md180Logged: docs/skill-outputs/SKILL-OUTPUTS.md181Cited by: feature-spec, implementation-plan, spec-crosscheck182```