scripts/sentence_case_headings.py is currently the only detector ever promoted out of a scratch directory. At least five others were written during the 2026 copyediting passes and then discarded — detect2.py, expand_contractions.py, classify_fences.py, flip_and_tag.py, detect_indented.py — so every session that needs a fence audit or a contraction check rebuilds the same tool from scratch.
Codify the settled conventions as executable checks in scripts/ on main, alongside the existing heading script. Each checkbox below is scoped to a single short session; pick one and close it.
The design point: a clean mkdocs build is not evidence of a healthy branch. Every structural defect listed below passed the build, several of them under --strict.
Structural checks — these matter most
Prose checks — all had working prototypes in past sessions
scripts/sentence_case_headings.pyis currently the only detector ever promoted out of a scratch directory. At least five others were written during the 2026 copyediting passes and then discarded —detect2.py,expand_contractions.py,classify_fences.py,flip_and_tag.py,detect_indented.py— so every session that needs a fence audit or a contraction check rebuilds the same tool from scratch.Codify the settled conventions as executable checks in
scripts/onmain, alongside the existing heading script. Each checkbox below is scoped to a single short session; pick one and close it.The design point: a clean
mkdocs buildis not evidence of a healthy branch. Every structural defect listed below passed the build, several of them under--strict.Structural checks — these matter most
pygments.lexers.get_lexer_by_nameper distinct token. Would have caughtjsonc(5 blocks rendering unhighlighted ontoolkit/v0.4),gradle,yml, andlogmkdocs.ymlparity across branches.toolkit/v0.4was cut after the 2026-07-16 convergence but from a pre-convergence template, so it lackedpygments_lang_classand every code block emitted a bare<div class="highlight">. Found only by diffing rendered HTML against another branch. The check is for branch creation from a stale template, not for sync regressionabbrsnippet target exists.pymdownx.snippetsauto_appendswallows a missing file silently, sotoolkit/v0.4'sabbrconfig was inert for the branch's entire life with no build complaintauto-sync-core.ymlinvariant. The real workflow belongs oncore/v*only; every other live branch carries a byte-identical stub. Onemd5sumcomparison. See AGENTS.md, "Branch mapping". Frozenunity/v4.0still holds the obsolete merge-based copy and should be allowlisted, not flaggeddocs/includeson a branch that is not a sync target. It is a core-owned path, so its presence elsewhere is a silent-overwrite trap waiting to trigger.toolkit/v0.4has one and is safe only because it appears in no core matrixProse checks — all had working prototypes in past sessions
<center>captionsscripts/sentence_case_headings.py; wire it into the same entry point)