How this documentation is generated
A worked example of one merge to master travelling through the Continuous Docs pipeline and arriving as a reviewable pull request against this site.
Every page on this site is a Markdown file in git. Most pages were written by people. Some were drafted by the pipeline after a merge to master changed something a customer can observe, then reviewed and approved by a human before they appeared here.
This page follows one real-shaped merge through that pipeline, end to end, and shows exactly what the machine produces at each step and what it leaves alone.
The merge we will follow
A release of the Admin service lands on master in id-verification-service. The squash commit touches 41 files. Three of the changes matter for this story:
| Change in the merge | Kind | Customer-visible? |
|---|---|---|
New optional field livenessCheck on POST /v1/workflows/{id}/steps | Public API surface | Yes |
| Upgrade of the Microblink BlinkID SDK from 6.x to 7.x | Vendor dependency | Yes, but the vendor must not be named |
Repository layer refactor: WorkflowRepo split into three classes | Internal refactor | No |
The pipeline's job is to produce documentation for the first two and stay silent about the third.
Step by step
1Trigger: merge to master
A GitHub Action fires on every push to master. It checks out the merge commit and its parent, and collects three inputs:
- The pull request title, body and file list
- The committed
openapi-external.jsonat both commits - The repository's disclosure policy file
# .github/workflows/continuous-docs.yml
on:
push:
branches: [master]
jobs:
docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 2 }
- run: npx continuous-docs run --base HEAD~1 --head HEADNothing has been judged yet. This step only gathers evidence.
2Relevance filter: did anything observable change?
This is the component that makes the pipeline trustworthy. It answers one question per surface.
For the API surface the answer is deterministic. The external spec is generated from code and CI fails if it drifts, so a structural diff of the two committed versions is the customer-visible API changelog.
"paths": {
"/v1/workflows/{id}/steps": {
"post": {
"requestBody": { "schema": { "properties": {
"type": { "type": "string", "enum": ["document", "selfie", "aml"] },
+ "livenessCheck": { "type": "boolean", "default": false,
+ "description": "Require an active liveness check on the selfie step." },One added property. Nothing removed, nothing renamed. Classified as additive, non-breaking.
For everything else the answer is a judgment call, so an LLM reads the PR and the file list with the disclosure policy in its context, and returns a structured verdict rather than prose:
{
"observable": true,
"reasons": [
"New public request field `livenessCheck` on workflow steps",
"Document recognition coverage expanded (vendor SDK upgrade)"
],
"ignored": [
"src/repositories/** refactor: no behavioural change, no public surface"
],
"affectedPages": ["knowledge-base/workflows/configuring-steps.md"],
"confidence": 0.86
}3Tier 1: API reference, generated from a template
The API reference page for this endpoint is regenerated directly from the external spec. No language model is involved, so this tier is safe to auto-merge.
The page carries front matter that records its provenance, so the site can show a "generated from spec" badge and a reviewer can trace it back to a commit:
---
title: Create a workflow step
generated_by: continuous-docs
tier: 1
source: id-verification-service/openapi-external.json
source_commit: 9f3c1a7
---4Tier 2: changelog entry, LLM prose over a structured diff
The same spec diff, plus the filter's structured verdict, is handed to a model with one instruction: write a customer-facing changelog entry. The disclosure policy is applied before the text is written, not scrubbed afterwards.
# .continuous-docs/policy.yml (id-verification-service)
disclosure:
never_name:
- Microblink
- BlinkID
- Regula
- Hopae
- IDRnD
- EyeDP
internal_only_concepts:
- "fraud score thresholds"
- "internal queue names"Notice the second bullet. The merge upgraded a named vendor SDK; the entry says what the customer gains and names nobody. The same redaction already holds on the API surface, where the external spec contains zero mentions of any vendor. This tier gets a light review because the facts came from the diff and only the wording came from the model.
5Tier 3: knowledge-base draft, mandatory human review
The filter identified one conceptual page that now describes the product incompletely. The model is given the current page, the diff, the verdict and the policy, and asked to propose the smallest edit that makes the page true again.
6Output: one pull request against this docs repository
All three tiers land in a single pull request against the docs site. Its body is generated too, and it is written for the reviewer rather than the customer.
## Docs update for id-verification-service#1284 — "Admin release 2026.09"
**Detected (customer-visible)**
- Additive API change: `livenessCheck` on POST /v1/workflows/{id}/steps
- Expanded document recognition coverage (vendor name redacted per policy)
**Ignored (not customer-visible)**
- Repository layer refactor under src/repositories/** — no public surface
**Changes in this PR**
| File | Tier | Gate | Confidence |
|---|---|---|---|
| api-reference/workflows/create-step.md | 1 | auto | — |
| changelog/2026-09.md | 2 | light review | 0.91 |
| knowledge-base/workflows/configuring-steps.md | 3 | **required** | 0.86 |
Source commit: id-verification-service@9f3c1a7The reviewer approves. The site rebuilds. The page you are reading renders the updated Markdown, and the raw .md file is served at a predictable URL so the next coding agent that integrates SEON reads the truth as of the last merge.
The merge that produces nothing
The day before, a different merge landed: the same repository refactor, on its own, with no spec change. The pipeline ran and produced this:
{
"observable": false,
"reasons": [],
"ignored": ["src/repositories/** refactor: no behavioural change, no public surface"],
"affectedPages": [],
"confidence": 0.97
}No pull request was opened. No one was notified. That silence is the feature: a pipeline that opens a PR on every merge gets muted inside a week, and muted pipelines do not come back.
What each tier trusts
| Tier | Surface | Detection | Drafting | Gate |
|---|---|---|---|---|
| 1 | API reference | Structural diff of openapi-external.json | Template | Auto-merge |
| 2 | Changelog | Same diff plus externally tagged releases | LLM prose over a structured diff | Light review |
| 3 | Knowledge base | LLM judgment over the pull request | LLM | Mandatory human review |