Skip to main content

ADR-019: Documentation, CI Gates, and Governance

  • Status: Accepted
  • Date: 2026-02-04

Context

This project must avoid "black box" architecture. Documentation is a first-class deliverable.

We want:

  • clear decision records (ADRs)
  • auto-generated API/tool docs
  • consistent commit history and changelog
  • CI gates that enforce the above

Decision

Documentation system

Architecture decisions:

  • ADRs in docs/docs/adrs/*
  • Use existing ADR files as template for new ADRs
  • Link new ADRs in ADR index

API documentation:

  • OpenAPI spec generated from source using @hono/zod-openapi
  • Zod schemas are source of truth
  • Generated at build time

TypeScript reference:

  • Typedoc generates API reference
  • Published with docs site

MCP tool documentation:

  • Generated from tool schema files (TypeScript)
  • Included in docs site
  • Versioned with releases

User-facing docs:

  • Hosted on Cloudflare Pages
  • Built with Docusaurus
  • Source in docs/ directory

Commit conventions

Format: Conventional Commits

<type>(<scope>): <description>

[optional body]

[optional footer]

Types:

TypeDescription
featNew feature
fixBug fix
docsDocumentation changes
styleCode style (formatting, no logic)
refactorCode restructuring (no features or fixes)
perfPerformance improvements
testAdding or modifying tests
choreBuild, CI, tooling
revertReverting a commit
breakingBreaking change (use in footer: BREAKING CHANGE: ...)

Scopes:

ScopeDescription
apiWorkers API changes
mcpMCP server changes
cliCLI tool changes
webFrontend webapp changes
adapterAdapter changes
docsDocumentation changes
infraInfrastructure, CI, deployment
dbDatabase schema or migrations

Examples:

feat(api): add tn_transfer_resolve tool
fix(mcp): handle missing course references
docs(adr): update ADR-012 with error conventions
refactor(cli): simplify REPL input handling
chore(infra): add pnpm workspace configuration
BREAKING CHANGE: rename tn_user_byok_list to tn_user_credentials

Changelog generation

Tool: git-cliff

Configuration: cliff.toml in repo root

Output: CHANGELOG.md

Categories aligned with commit types:

Commit TypeChangelog Section
featFeatures
fixBug Fixes
perfPerformance
docsDocumentation
refactorOther Changes
styleOther Changes
testOther Changes
choreOther Changes

Breaking changes appear at the top of each version section.

CI gates

Required checks:

CheckToolFails CI If...
LintingESLint + markdownlintAny lint errors
Type checkingTypeScript compilerType errors
TestsVitest + Go testsAny test failures
OpenAPI generationCustom scriptSchema doesn't match
Docs generationTypedoc + customDocs fail to generate
Commit messagescommitlintNon-conventional commit
Broken linksDocusaurusBroken internal links

Workflow:

on: [push, pull_request]

jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout
- run: pnpm install
- run: pnpm lint
- run: pnpm lint:markdown

typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout
- run: pnpm install
- run: pnpm typecheck

test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout
- run: pnpm install
- run: pnpm test

docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout
- run: pnpm install
- run: pnpm docs:build # Docusaurus

commitlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout
- run: npx commitlint --from=main --to=HEAD

Review process

CODEOWNERS:

/apps/web/        @rey-hanah @LMSAIH
/apps/api/ @team/docs-reviewers
/services/mcp/ @eschmechel
/services/adapters/ @team/docs-reviewers
/tools/cli/ @eschmechel @LMSAIH
/docs/ @team/docs-reviewers

Approval requirements:

ContributorApprovals Required
Core team member1 approval
Outside contributor2 approvals (at least 1 core)

Doc reviewers:

  • Rotating assignment (weekly)
  • Separate from code reviewers
  • Focus on clarity, completeness, consistency

Monthly doc sprints:

  • 1 day per month dedicated to documentation improvements
  • Review and update stale docs
  • Add missing documentation
  • Improve cross-references

Docs hosting

Platform: Cloudflare Pages

Build: Docusaurus

URL structure:

  • docs.tutor-nexus.com (production)
  • docs.staging.tutor-nexus.com (preview deployments)

Deployment:

  • Auto-deploy on push to main
  • Preview deployments for PRs

Package manager

Tool: pnpm

Workspace structure:

tutornexus/
├── pnpm-workspace.yaml
├── apps/
│ ├── web/ (React frontend)
│ └── api/ (Workers backend)
├── services/
│ ├── mcp/ (Go MCP - separate go.mod)
│ └── adapters/ (TypeScript adapter Workers)
├── tools/
│ └── cli/ (Rust CLI - separate Cargo.toml)
├── packages/ (Shared TypeScript packages)
└── docs/ (Docusaurus docs)

pnpm configuration:

packages:
- 'apps/*'
- 'services/adapters'
- 'packages/*'

Notes:

  • Go MCP and Rust CLI manage their own dependencies
  • pnpm only manages TypeScript workspaces

Consequences

  • More up-front setup work.
  • Higher quality and easier onboarding.
  • Documentation stays close to code and is enforced.
  • Clear contribution guidelines reduce friction.

Alternatives considered

  • Manual docs without CI gates: quickly drifts.
  • npm instead of pnpm: less mature workspace support.
  • Starlight instead of Docusaurus: Docusaurus provides more customization.

Implementation notes

  • Set up commitlint hook on commit.
  • Configure git-cliff to generate meaningful changelogs.
  • Budget time for monthly doc sprints.
  • Configure Docusaurus with strict link checking (onBrokenLinks: 'throw').