Agent surfaces
The always-on machine-readable layer. A view that renders a query emits its machine surfaces unconditionally — inline JSON-LD, a copy-as-API affordance, and a shareable deep link — the same way a human sees the chart. There is no operator toggle.
Copy as API
Every query is liftable as runnable client code — curl, Python, TypeScript — plus a shareable deep link and a citation. Keys are referenced as environment variables, never emitted literally.
Deep links are the state machine
Application state is addressable from the URL, validated by a total function — a malformed link degrades to the default instead of throwing. This site's own router dogfoods it.
import { enumParam } from '@shuttering/agent'
// an unknown slug resolves to the default page, never an error:
const page = enumParam(slug, PAGE_SLUGS, 'introduction')
/introduction /theming /charts /agentenumParam, stringParam, numberParam, and boolParam are total: they always return a valid value, so shared links are correct by construction.
Discovery — generated from one registry
A build step writes the machine-facing docs from the same page registry the site is built from, so they can't drift. This site serves them now:
- /.well-known/shuttering.json — deep-link grammar + principles, as JSON
- /llms.txt — the same, as Markdown for LLMs
- /robots.txt — agent crawlers explicitly welcomed
The @shuttering/agent/manifest entry is React-free, so a bare-Node build script can import it without pulling React into a server process. CI gates it with git diff --exit-code so the discovery docs can never fall out of sync with the registry.