# llms.sgit.ai

Large language models, and the parts of working with them worth writing down.

Live site: https://llms.sgit.ai (GitHub Pages, deployed from `dev`).

> **Status: scaffold.** This repository currently holds the release pipeline and the
> pages that describe it. The brief that sets the site's thesis has not arrived, so the
> front page says so rather than filling the space with material that would have to be
> deleted. The open request is [`admin/comms.html`](admin/comms.html) → N1.

## Structure

- `index.html` — the front page, and `index.md` its markdown twin
- `network/` — where this site sits in the sgit.ai network, and the proposed boundaries
- `about/participant.html` — the participant disclosure and where this site loses
- `admin/` — the working channel (`comms.html`), the release history (`versions.html`),
  and how the site is built (`index.html`)
- `admin/build/version.txt` — **the version, owned here**, bumped exactly once per release
- `admin/build/chrome.py` — the single definition of nav and footer, applied across every page
- `admin/build/validate.js` — the pre-release gate
- `assets/site.css` — the shared stylesheet (sgit.ai design language)
- `llms.txt`, `sitemap.xml`, `robots.txt` — the machine surfaces

## The release pipeline

`.github/workflows/deploy-pages.yml` runs three jobs in one order, ported from
[pki.sgit.ai](https://github.com/SGit-AI/SGit-AI__Website__PKI) with the merge-commit
anchoring and remote-aware tag backfill from
[graphs.sgit.ai](https://github.com/SGit-AI/SGit-AI__Website__Graphs):

1. **validate** — `node admin/build/validate.js`. Version agreement across every page
   badge, the history table, `llms.txt` and `index.md`; internal links resolve (fragments
   and query strings stripped); every page declares a canonical URL on the host in
   `CNAME`; every sitemap `<loc>` is on that host and has a file behind it; and a
   key-leak tripwire bans both a vault-key-shaped string and key material following the
   `sgit_vk1_` write prefix. Runs on pull requests too. A failure stops the release: no
   tag, no publish.
2. **tag-release** — every push to `dev` is a minor release, tagged
   `v{release}.{major}.{minor}`. The version in `admin/build/version.txt` must agree with
   the release commit's subject (`site vX.Y.Z: ...`) and must be the next minor. Tags the
   release commit — `HEAD` on a direct push, `HEAD`'s parent when a PR lands as a merge —
   and backfills any missing historical tag from the commit subjects.
3. **deploy** — publishes the validated, tagged tree to GitHub Pages.

## Releasing a change

```bash
echo "v0.1.1" > admin/build/version.txt   # bump exactly once per release
# add a row to admin/versions.html, update admin/comms.html
python3 admin/build/chrome.py             # propagate the badge, nav and footer
node admin/build/validate.js              # the same gate CI runs
git commit -am "site v0.1.1: what changed"
git push origin dev
```

## A note on `.gitignore`

These repositories start from the standard Python `.gitignore`, which ignores `build/` —
and that matches `admin/build/`, silently leaving the gate and chrome scripts uncommitted.
This repository carries the one-line negation (`!admin/build/`) that fixes it, as pki and
graphs do. `standards.sgit.ai`'s repository does not, and its CI gate runs against a file
that is not in the checkout.

## Licence

Content CC BY 4.0. Code in this repository under the licence in [`LICENSE`](LICENSE).
