Editorial Quality Gates
These checks protect the editorial and information-architecture decisions established by EI-1 through EI-4.
Automated checks
scripts/editorial_quality_gate.py runs on every push to main and every pull request.
It fails when it detects:
- duplicate or malformed explicit post permalinks;
- invalid canonical
content_typeorsubjectvalues when those fields are present; - a PTIR item whose
series: PTIRmetadata is not paired withcontent_type: briefing; - restoration of the retired
categories: PTIRdiscovery model; - removal or retargeting of the protected
/blog/→/writing/compatibility route; - removal or retargeting of the protected
/links/→/contact/compatibility route; - reintroduction of
jekyll-paginate,paginate:, orpaginate_path:in_config.yml.
The controlled vocabulary check applies to normalized posts and pages.
Canonical controlled vocabulary
Content types
writingbriefingcollectionportfolio
Subjects
TechnologyTeachingComputing HistoryJournalism & Media
There is deliberately no miscellaneous Personal subject. Personal voice is a characteristic of the site, not a browsing taxonomy.
PTIR is a series, not a subject:
content_type: briefing
series: PTIR
The Loudmouth is a collection, not a subject. Featured and Archive are editorial/discovery states rather than subjects.
Privacy boundary
The automated gate deliberately does not encode names or titles from EI-1 privacy/DELETE material. Privacy enforcement remains governed by the EI-1 inventory and media manifest rather than placing sensitive identifiers into public production validation code.
No automated rule should create redirects, placeholder pages, media references, or discovery records for privacy/DELETE content.
Running locally
python scripts/editorial_quality_gate.py
A successful run exits with status 0. Any governance violation is printed and exits with status 1.