01
Agent contracts
A manifest, a set of roles, and one file per task define who does what, where they may write, and when they must stop.
- The manifest lists the stack, the source ownership, the roles, the tasks, and the gates in one place.
- Each task names its allowed paths, its commands, and the conditions that stop the run.
- A check validates the manifest, the roles, the tasks, and the brand rules before any work begins.
npm run agent:checknpm run agent:context
Agent contracts architecture diagram. Nodes: site.manifest.json, roles/*.md, tasks/*.json, agent:context, agent:check. Flow: site.manifest.json to roles/*.md (primary); roles/*.md to tasks/*.json (primary); tasks/*.json to agent:context (primary); site.manifest.json to agent:check (supporting); agent:check to tasks/*.json (feedback, correction path).02
Copy and tone of voice
Deterministic linting keeps the writing in my voice; an optional model pass humanizes drafts, and the gates decide what stays.
- The copy check runs one-pattern rules plus a density-weighted anti-slop audit across English and Italian.
- A fix step applies the safe, deterministic replacements without touching meaning.
- An AI review lets a model propose rewrites; copy-lint, frontmatter, and parity choose whether to keep them.
npm run copy:checknpm run copy:ai-review -- --changed --write
Copy and tone of voice architecture diagram. Nodes: copy:audit, copy:fix, OpenAI, copy:ai-review, copy:check, needs-human, PR. Flow: copy:audit to copy:fix (primary); copy:fix to copy:ai-review (primary); OpenAI to copy:ai-review (supporting); copy:ai-review to copy:check (primary); copy:ai-review to needs-human (feedback, correction path); copy:check to PR (primary).03
Full automation loops
Scheduled GitHub Actions jobs refresh content, draft articles, and propose SEO changes. They open pull requests — never direct commits to main.
- The weekly refresh translates missing articles, fills Italian UI keys, generates grounded FAQ and takeaways, humanizes drafts, rebuilds feeds, and runs content health on the built site.
- Monthly loops draft one grounded article behind originality gates and an advisory judge, and turn Search Console demand into SEO meta proposals plus topic-gap briefs.
- A showcase loop proposes case studies from public repositories, and merges one only with every gate green; CI rescue attempts fixes on ci-failure issues with Codex and never merges its own work.
- Automation pushes through a GitHub App token so Flash CI runs on the PR; dirty runs get needs-human, and every automation PR carries needs-translation-review.
npm run content:mapnpm run copy:ai-review:full -- --writenpm run article:judge
Full automation loops architecture diagram. Nodes: cron, App token, generators, gates, PR, Flash CI, needs-human, auto-merge. Flow: cron to App token (primary); App token to generators (primary); generators to gates (primary); gates to PR (primary); PR to Flash CI (primary); Flash CI to auto-merge (primary); PR to needs-human (supporting, correction path).04
Publication pipeline
Archived software releases live in a separate repository. The site consumes Zenodo concept DOIs through a registry, sync script, and drift gate — never auto-updated in build.
- The software repo publishes a GitHub release, reserves a new Zenodo version DOI, and syncs CITATION.cff from release.toml.
- publications.json is the site registry: concept DOI for public copy, version DOI and publishedVersion for drift checks.
- publication:sync refreshes the registry from Zenodo and GitHub, propagates concept DOIs into catalog and project copy, and regenerates landing JSON-LD.
- publication:check fails CI when github-stats, consumer files, or Zenodo metadata drift; a human reviews the PR before merge.
npm run publication:syncnpm run publication:check
Publication pipeline architecture diagram. Nodes: publication:sync, Zenodo, GitHub, publications.json, catalog + llms.txt, landing shell, publication:check, PR. Flow: publication:sync to Zenodo (primary); Zenodo to publications.json (primary); publication:sync to GitHub (supporting); GitHub to publications.json (supporting); publications.json to catalog + llms.txt (primary); publications.json to landing shell (supporting); catalog + llms.txt to publication:check (primary); landing shell to PR (supporting); publication:check to PR (primary).05
SEO and GEO
The sitemap and llms.txt index derive from the route registry. Structured data combines those canonical paths with the identity, publication, and project registries, and deterministic checks keep the surfaces aligned.
- Static routes live in a single shared list that feeds both the sitemap and the llms.txt index.
- Every page carries JSON-LD: a person, the breadcrumb trail, and a type that fits the page.
- A Search Console loop and a topic-gap report point me at what to write next; a manual GEO baseline tracks mentions and citations in AI answers.
npm run seo:checknpm run topic:gap
SEO and GEO architecture diagram. Nodes: site-routes, sitemap + llms.txt, JSON-LD, seo:check, GSC, seo:ledger, seo:optimize. Flow: site-routes to sitemap + llms.txt (primary); sitemap + llms.txt to seo:check (primary); site-routes to JSON-LD (supporting); JSON-LD to seo:check (supporting); GSC to seo:ledger (supporting); seo:ledger to seo:optimize (supporting); seo:optimize to sitemap + llms.txt (supporting); seo:optimize to GSC (loop).06
Quality gates
One command runs the full pre-merge gate: types, lint, format, tests, content health, parity, and generated-output drift.
- The quality check is the local equivalent of the gate that CI runs on every change.
- Generated files are regenerated and compared, so stale output fails the build instead of slipping through.
- A governance check guards the public docs against claims I no longer make.
npm run quality:check
Quality gates architecture diagram. Nodes: validate, generated:check, typecheck + lint, layout · i18n · copy, audit:coherence, test:run. Flow: validate to generated:check (primary); generated:check to typecheck + lint (primary); typecheck + lint to layout · i18n · copy (primary); layout · i18n · copy to audit:coherence (primary); audit:coherence to test:run (primary).07
Deterministic build
The production build is pure: it prerenders every route, writes markdown mirrors for readers and models, and calls no external model.
- Vite builds the app, then a prerender step writes static HTML for each localized route.
- Markdown mirrors of each article ship next to the HTML for machine readers.
- The container serves the result; nothing on this path depends on an API key.
npm run build
Deterministic build architecture diagram. Nodes: validate, generators, vite build, SSR build, prerender, md mirrors, version.json, cv:check. Flow: validate to generators (primary); generators to vite build (primary); vite build to SSR build (primary); SSR build to prerender (primary); prerender to md mirrors (primary); prerender to version.json (supporting); md mirrors to cv:check (primary).08
CI and deploy
Flash CI builds the site, scans rendered pages, and runs browser checks; a green main run triggers a supersede-safe deploy to production.
- After the pre-merge gates pass, CI runs a production build, content:scan on dist/, and a bundle-size budget check.
- A separate browser job downloads that build and runs contrast and visual-regression checks before merge is allowed.
- Deploy follows a successful Flash CI run on main, pushes arm64 images to GHCR, and verifies production serves the new commit.
npm run buildnpm run content:scannpm run perf:budget
CI and deploy architecture diagram. Nodes: quality, browser, deploy:manual, GHCR :sha, promote :latest, odroid timer, version.json, verify-live. Flow: quality to browser (primary); browser to GHCR :sha (primary); deploy:manual to GHCR :sha (supporting, correction path); GHCR :sha to promote :latest (primary); promote :latest to odroid timer (primary); odroid timer to version.json (primary); version.json to verify-live (primary).