Introduction
Reusable engineering-discipline toolkit: documentation anti-drift checks, pre-commit hooks, reusable CI workflows, and agent skills. Extracted from poly and designed to be adopted by arbitrary projects with a few lines of configuration.
The current shipment: 7 static and diff-scoped checks, 3 agent skills, one reusable CI workflow, and a set of pre-commit hooks that wrap each doc-facing check.
Well-run projects accumulate discipline mechanisms — doc-drift gates, sanitizer matrices, escape hatches that demand written reasons — but they stay trapped in the repo that invented them. This repo extracts those mechanisms into a versioned, consumable standard so every project (mine or yours) can exhibit the same discipline without re-deriving it.
The design principle throughout: every check is simple (regex/diff-level), every escape hatch is in-band, greppable, and carries a written reason. Sophistication lives in the system design, not the analysis techniques — which is what makes the whole thing portable.
What lives here
Section titled “What lives here”Doc anti-drift checks (7 in the registry). Each check enforces one invariant of the documentation lifecycle — lifecycle classes, drift-map coupling, generated-doc freshness, dated status claims, symbol-based references, cited behavioral claims, interpolated inventory counts. See Checks reference for the full list.
Pre-commit hooks wrap the doc-facing checks so they run on every commit in a consuming repo. See Adopt in a repo.
Reusable CI workflow (doc-discipline.yml) gates PRs with the full
check suite plus doc-drift (which needs a merge base). One uses: line
in a consuming workflow file, pinned to a release tag.
Agent skills (3 shipped). Authoring-time discipline for AI coding agents — the conventions the checks enforce, taught at write time. See Skills.
What it isn’t
Section titled “What it isn’t”- Not a linter framework. The checks are single-purpose scripts, each one regex/diff/AST-simple. There’s no plugin system; there’s a registry.
- Not a doc generator. The
generated-freshnesscheck enforces that YOUR generator’s output is committed and current, but jk-standards does not ship one. - Not a competitor to nfr-review. nfr-review detects whether a repo has this discipline wired up; jk-standards enforces it. Producer/ consumer split, versioned independently.
When to reach for it
Section titled “When to reach for it”- Docs in your repo describe behavior that changes faster than the docs
themselves — you need
doc-driftandgenerated-freshness. - Prose in your repo cites test outcomes or inventory counts that quietly
fall out of sync — you need
behavioral-claimsandcount-drift. - Comments and enduring docs reference
foo.cpp:429and rot every time someone reformats — you needfile-line-refs. - You want AI coding agents in your repo to write within these conventions rather than fight them — you want the skills.
If none of that resonates, this probably isn’t the toolkit you’re looking for. It’s opinionated by design.
- Quickstart — wire it into a fresh repo in ten minutes.
- Checks reference — every check, its rule, and its escape hatch.
- Configuration reference — every
jk-standards.yamlfield with its default.