Definition of Done

Copy the section below into every Pull Request description. Tick what applies or leave unchecked if it doesnt apply.


Type of PR — pick one:

  • [ ] Functional — adds or changes user-visible behavior

  • [ ] Non-functional — improves a measurable property (perf, security, a11y …)

  • [ ] Mixed — both

  • [ ] Internal — refactor / docs / tests only


1 Process baseline — every box must be ticked, on every PR

  • [ ] All acceptance criteria in the linked issue are met

  • [ ] 1 review approval from a non-author

  • [ ] CI green: lint, type-check, unit tests, build, secret-scan

  • [ ] No secrets / tokens / credentials in the diff

  • [ ] No new TODO / FIXME without a follow-up issue

  • [ ] Docs updated if behavior, API, config, or architecture changed

  • [ ] No regression of other NFR baselines (a11y / perf / security)


2 Outcome proof — fill the bullets that match your PR type

Functional / Mixed PR:

  • [ ] ≥ 1 black-box test that exercises the acceptance criteria e.g. upload a markdown file, then assert the chat answer cites it

Non-functional / Mixed PR:

  • [ ] Measurement that proves the acceptance criteria, attached to the PR e.g. benchmark output for chat p95 < 2 s, axe audit for a11y 90, scan report for 0 critical CVEs


3 Cross-cutting impact — tick the areas this PR touches

For each area below, ask: “does my PR touch this?”

-> If yes → tick the area and complete its sub-checks (they become mandatory).
-> If no → skip it.
-> If nothing applies → tick “None of the above”.

  • [ ] UI touched

    • [ ] Responsive on desktop and mobile

    • [ ] Contrast + visible focus state, no color-only signals e.g. new button has a focus ring and is readable on a 360 px screen

  • [ ] Backend endpoint added or changed

    • [ ] Behind authentication — not accidentally public

    • [ ] Input validation (size / type / allowed values)

    • [ ] OpenAPI spec updated e.g. /upload rejects files > 10 MB with a clear error

  • [ ] Stores user data, ingested content, or LLM output

    • [ ] Logged with the standard fields (request id, source, latency)

    • [ ] No PII / credentials in log output

  • [ ] New env var or config

    • [ ] Added to .env.example and mentioned in README.md

    • [ ] No real value committed e.g. LLM_API_KEY=... — only the key name lives in .env.example

  • [ ] Deployment / build changed

    • [ ] Deployable via the standard pipeline (no undocumented manual steps)

    • [ ] Local dev setup still works

  • [ ] None of the above — purely internal change