How this site is built
Hand-written static HTML, one generated chrome definition, and a pre-release gate that has to pass before anything is tagged or published. Same pipeline as every other *.sgit.ai site: validate → tag → deploy.
The pipeline
validate
node admin/build/validate.js. Structure, links, version agreement, canonical/CNAME agreement, the agent surface, block balance, the agent-block rule, the provenance contract, and the redaction watch-list. A failure stops the release: no tag, no publish.
tag-release
Every push to dev is a release and ends tagged v{release}.{major}.{minor}. The version is owned by admin/build/version.txt and must agree with the release commit's subject.
deploy
Publishes the tagged commit to GitHub Pages. Never runs when validation failed, never from a pull request.
What the gate checks
| # | Check | Why it is here, specifically for this site |
|---|---|---|
| 1–7 | Version agreement, links, canonical, agent surface, key-leak, block balance, agent block | The shared core, inherited from every sibling site |
| 8 | The provenance contract — every block marked class="provenance" must state a first-published date and link to the original | This site's central argument is that most articles do not provide evidence and the link is never followed. A page here that failed its own contract would have refuted the site on page one |
| 9 | The redaction watch-list — a fixed list of Tier 3 strings (a named VC, an infra account number, live product pricing) may never appear anywhere in the published tree | The source material contains real commercial and safety-sensitive detail. The gate makes the exclusion structural rather than a habit somebody could forget |
The chrome
Every page is hand-written static HTML. The nav row and footer columns are defined once in admin/build/chrome.py and rewritten in place across the tree on every run.
python3 admin/build/chrome.py # rewrites nav + footer everywhere, stamps the version
node admin/build/validate.js # the gate
Making a release
1. bump admin/build/version.txt (vX.Y.Z, exactly once)
add a row to admin/versions.html
update admin/comms.html
2. python3 admin/build/chrome.py
3. node admin/build/validate.js
4. git commit -am "site vX.Y.Z: ..." && git push origin dev
The repository
.github/workflows/deploy-pages.yml validate → tag → deploy
admin/build/validate.js the gate
admin/build/chrome.py the single definition of nav and footer
admin/build/version.txt the version, owned here
admin/comms.html tasks and requests, in public
admin/versions.html release history
assets/site.css assets/nav.js the sgit.ai design language
thesis/ corrections/ provenance/ economics/ rights/ newsroom/ library/
shipped/ network/ documents/ about/
briefs/ the source pack, verbatim, CC BY 4.0
CNAME robots.txt sitemap.xml llms.txt index.md
LICENSE LICENSES.md code Apache 2.0, content CC BY 4.0
v0.2.0's scope decision, stated rather than hidden
The site architecture in briefs/05 specifies several sections — rights, the newsroom, the thesis — as multi-page trees. v0.2.0 ships each of those as one comprehensive hub page rather than the full subpage tree, to get the whole architecture live and gated in one release instead of shipping half of it. That is a real de-scoping, tracked as open work on comms, not a silent shortcut.