sg-compute.sgit.ai / admin

How this site is built

Static HTML in the sgit.ai design language, released the same way as the main site and pki.sgit.ai: every push to dev is validated, auto-tagged and deployed to GitHub Pages. This site adds two checks, and both exist because of something specific about its subject.

The release pipeline

  1. validate — two steps. First the generators re-run in --check mode: every page under specs/ and documents/ must still match the data it was generated from. Then node admin/build/validate.js: internal links resolve, the version agrees everywhere, every page declares a canonical URL on the host named in CNAME, the catalogue carries its survey date, and the leak tripwire passes. A failure stops the release: no tag, no publish. It also runs on pull requests, so branch work is gated before it reaches dev.
  2. tag-release — every push to dev ends tagged v{release}.{major}.{minor}. The version is owned by admin/build/version.txt, bumped exactly once per release, and must agree with the release commit's subject (site vX.Y.Z: …). CI verifies the two agree and that the bump is the next minor (or a deliberate major), then tags the release commit — which is HEAD on a direct push and HEAD's parent when a pull request lands as a merge commit. The first run backfills tags for historical releases from commit subjects.
  3. deploy — publishes the tagged working tree to GitHub Pages. Runs on manual dispatch even without a tag, never when validation failed, never from a pull request.

The rule no sibling site needs

Generate every page that describes the code, from the code, at build time.

Four artefacts in the platform's own repository are knowingly stale — capabilities.json 42 minor versions behind, the reality document 41, a README describing a package directory that does not exist, and a version file nothing reads. Every one of them went stale for the same reason: it was written once, by hand.

Sixteen hand-written spec pages would be the fifth. So:

The honest limit of this. The site repository does not contain the platform's source, so “generated from the code” means generated from a machine-readable survey of the code, carrying the date and repo version it was taken at — 24 August 2026, v0.2.71. That is a weaker guarantee than reading manifest.py directly, and it is stated here rather than implied away. Wiring the generator to the platform repository is the version of this that would close the gap.

The leak tripwire

The sibling sites ban vault-key-shaped strings from the tree. This site bans considerably more, because the platform it documents is live infrastructure and publishing a hostname here would publish an attack surface.

admin/build/validate.js fails the release if any file in the tree contains:

The editorial rule it encodes is shapes, not addresses: <stack-name>.sg-compute.<zone> is documentation, a live FQDN is a target.

One deliberate exception, and it is the reason the exception mechanism exists. The bare zone sg-compute.sgraph.ai is published — on the front page and in /network/ — because this site's label collides with it and the stated decision is to claim the distinction rather than move 128 references. The zone name is the subject of that decision. Per-node FQDNs under it are not, and the slug patterns still catch them: the check blanks the allowed zone before scanning, so <a-stack-slug>.sg-compute.sgraph.ai still fails.

Releasing a change

# 1. bump the version — exactly once per release
echo "v0.1.1" > admin/build/version.txt
# 2. add a row to admin/versions.html, update admin/comms.html
# 3. regenerate the pages
python3 admin/build/gen_specs.py
python3 admin/build/gen_documents.py
# 4. propagate the badge and any nav/footer change to every page,
#    generated ones included — and stamp llms.txt and index.md
python3 admin/build/chrome.py
# 5. AFTER chrome: the files that read the tree and the stamped twins,
#    or they assemble a stale version line
python3 admin/build/gen_llms_full.py
python3 admin/build/gen_sitemap.py
# 6. validate locally — exactly what CI runs
python3 admin/build/gen_specs.py     --check
python3 admin/build/gen_documents.py --check
python3 admin/build/gen_llms_full.py --check
python3 admin/build/gen_sitemap.py   --check
node admin/build/validate.js
# 7. commit with the version in the subject, push to dev
git commit -am "site v0.1.1: what changed"
git push -u origin dev

The build tooling

FileWhat it owns
admin/build/version.txtThe version. Single source of truth; everything else reads it
admin/build/chrome.pyThe single definition of the nav and footer, rewritten in place across every page — hand-written and generated alike. Also stamps the version into llms.txt, llms-full.txt and index.md, which on the sibling sites was hand-edited and silently missed twice
admin/build/pagelib.pyThe shared page shell and the write-or-check writer both generators use
admin/build/gen_specs.pyGenerates specs/ from data/specs.json, and cross-checks every derived total
admin/build/gen_documents.pyGenerates the documents/ readers from data/documents.json
admin/build/gen_llms_full.pyAssembles llms-full.txt from llms.txt, index.md and briefs/ — the thing pki.sgit.ai lacks
admin/build/gen_sitemap.pyWalks the tree for sitemap.xml, dated from the release row
admin/build/validate.jsThe release gate: version, links, canonical, provenance, leak tripwire
data/specs.jsonThe spec catalogue, with its survey date and repo version
briefs/*.mdThe source documents, verbatim — two of them redacted under their own rule

Conventions carried from the sibling sites