newsroom.sgit.ai / admin

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

1

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.

2

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.

3

deploy

Publishes the tagged commit to GitHub Pages. Never runs when validation failed, never from a pull request.

What the gate checks

#CheckWhy it is here, specifically for this site
1–7Version agreement, links, canonical, agent surface, key-leak, block balance, agent blockThe shared core, inherited from every sibling site
8The provenance contract — every block marked class="provenance" must state a first-published date and link to the originalThis 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
9The 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 treeThe 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.