One line per thing. Paths are from the repository root; site pages are also live at https://riskmandate.ai/<file> with a markdown twin at <file>.md.
Documents in the repository (docs/)
| File | What it is | Read when |
|---|---|---|
docs/how-the-website-works.md | How a page is put together, the shared modules, generated files, the pipeline, the tests. Written at v1.0.0 with an addendum for what came after | touching chrome, modules, menu, CI |
docs/briefs/direction__abp-at-the-centre.md | 11 Sept. The ABP becomes the primitive the site sells; the label/record/prescription stack; naming rules; what is honest to say | any ABP work; the naming rules live here |
docs/briefs/direction__abp-as-a-graph-and-stakeholder-views.md | 15 Sept. Behaviours are addressable nodes; barrier per path; views per audience; projections regenerable from a shipped prompt. The build order | building the graph, views, projections |
docs/briefs/review__ten-hard-questions-and-what-the-site-should-say.md | 9 Oct. The interview on sgit.ai checked against the site: the home page says we enforce, the insurance page states design as shipped, level 1 is £5 in three places; the proposed home page at /home-next.html and nine other proposals | the home page, insurance, pricing, positioning |
docs/briefs/direction__one-rule-a-stranger-can-paste-is-the-way-in.md | 7 Oct. The path from unknown to customer breaks before anyone tries anything; a page per rule (do you want your agent to do this?), one line and a paragraph, before and after on our own deployment, never or ask first, a versioned rule base under site/rules/; tasks T15–T17 | onboarding, Try it, anything aimed at a stranger |
docs/briefs/architecture__the-stories-vault-and-the-three-way-workflow.md | 26 Sept. The stories vault: the lead, the studio model and this site's agent as publisher, one sgit vault in the Email-FS-lite protocol, the seed under stories-vault/seed/, the board derived from issues and mailrooms, the birth in commands, the scheduled check-in and what it may not decide | the stories, the vault, a check-in, the board |
docs/briefs/direction__owasp-agent-behaviour-policies.md | 8 Oct. The ABP goes to OWASP with RiskMandate as sponsor: what was decided, what was built, what the research changed (leadership is personal; the material is abp.sgit.ai v0.12.1; no CC BY file; ACS), and the decisions for the leads | the OWASP section, the move, the record |
docs/briefs/merch__funny-designs-for-people-who-hold-the-risk.md | 25 Sept. A brief for an image model: shirts a stranger buys; the brand kit, the print rules, forty-two taglines in six families with the joke explained, twelve concepts, the prompt to paste; handed over by its console twin's link | making merchandise, or any use of the mark off the site |
docs/briefs/architecture__vaults-in-vaults-for-behaviour-policies.md | 15 Sept. The renderer lives once in an app vault; every application vault carries a loader; the sub-vault link format | touching the vault app, the loader, or _app/ |
docs/briefs/review__first-measured-abp-n8n-owner-key.md | 15 Sept. The first measured grant read against the model; where the write-up and the vocabulary disagree; two asks for the model site | writing a measured vault; understanding evidence tiers |
docs/briefs/research__connector-grants-open-questions.md | 15 Sept. Five connector vaults at the documented tier; the brief for the research agent; the queue of five more | researching a vault; adding a connector vault |
docs/briefs/vaults__what-to-add-to-the-site.md | 9 Sept. Which of the 26 public sgit vaults belong on the site and why the rest do not | adding a demo |
docs/briefs/review__design-studio-mvps-vs-the-selling-workflow.md | 14 Sept. The storefront concepts read against the selling workflow | storefront, checkout, pricing |
docs/briefs/summit__lisbon-2026-strategy.md | 9 Sept, partly superseded. Event logistics, the graph vault, the two days | summit pages |
docs/briefs/summit__lisbon-2026-messaging.md | 11 Sept. What to say in the room now there is something to sell | summit pages, booth materials |
docs/briefs/architecture__structure-content-decoupling.md | July. Structure in the repo, content in vaults, decrypted in the browser | /scenarios/, content vaults |
docs/briefs/implementation__scenarios-pilot.md | July. The pilot as built at site/scenarios/ | /scenarios/ |
docs/briefs/process__agent-onboarding-and-parallel-work.md | 15 Sept. Why this folder exists and the rules for agents working in parallel | you are reading its product |
docs/briefs/direction__use-case-driven-policies-and-the-prompt-workflow.md | 15 Sept. A policy per use case (Voice Debrief first); the £500 level is a prompt the customer runs, in seven steps; what the store and the site must both say | pricing, the store, use-case vaults |
docs/briefs/review__vault-pages-vs-the-vault.md | 15 Sept. The vault pages read against the vault: the two host frames, and why the site should stop deploying the vault (T09) | touching the vault pages or site/vaults/ |
docs/briefs/workflow__buying-a-policy-for-claude-on-gmail.md | 16 Sept. The purchase workflow made concrete for one customer: the steps, the vault mapped, the settings, the prompts, what a measured run taught | delivering a level-3 or level-4 policy; any connector vault |
docs/briefs/workflow__abp-vaults-for-people-we-know.md | 24 Sept. A vault for everybody the lead talks to, made by a new agent from a zip: three vaults (app, keys, one per person), the leak gate, the feedback loop. The pack is packs/dist/abp-for-people-pack.zip | changing the pack, the person-vault format, or anything the pack copies from the site |
docs/briefs/direction__mvp-vault-and-the-reading-app.md | 16 Sept. oc433z3m as the first MVP vault: the store's mock-up read for the vault's left navigation and positioning; the feature list per level; the dual licence as LICENCE.md + a licence block; the reading app redrawn; four decisions for the lead | the renderer, the vault page, the licence |
docs/briefs/direction__consequences-assets-and-the-vault-as-a-website.md | 16 Sept. A grant is a union of capabilities; the reader needs consequences, explicit, each with the asset that makes it real; routes out counted; standards as mini-graphs in the vault; Who are you? in the app (T11, T12; amends T04) | the grant, the consequence layer, the audiences |
docs/briefs/direction__the-grant-has-storeys-and-the-vault-opens-on-the-audience.md | 16 Sept. The grant has storeys: what the credential permits, what the client exposes, what practice allows, then the consequences; latent capability is the gap between the first two; every barrier gains who holds it and whether it moves without you; the vault opens on Executive · Operator · Risk | the grant model, the reading app, any connector vault |
docs/marketing/linkedin-company-page.md | Every field of the company page, ready to paste |
Brief naming: <kind>__<slug>.md with kind one of direction, architecture, implementation, review, research, summit, vaults, process. Header block: date, author @website-agent, trigger, what it reads against. Numbered sections. End with what it does not settle, or decisions needed.
The site (site/), by family
| Family | Files | Source of truth |
|---|---|---|
| Rules | site/rules/ (unlisted, linked first from try-it.html): index.html, method.html, one page per rule, sets/<agent>.md, and the data <slug>.json | generated by build-rules.mjs from the JSON, the vocabulary and the vault grants; edit the JSON, never the pages |
| Review pages | home-diff.html (private): the home page now and proposed, side by side, slider and four steps, with A/B/C/D questions and feedback sent encrypted to the review vault ao0lynta (lane file assets/review/lane.json, read with scripts/review/read-feedback.mjs and REVIEW_KEY); screenshots and marks in assets/review/home-diff/, generated by scripts/review/capture-home-diff.mjs (run with a local server). The page's code is assets/review/{envelope,identity,review}.js and review.css; its body is scripts/review/home-diff/body.html, built with python3 scripts/review/flat-page.py scripts/review/home-diff/page.json. Each browser signs its sends with its own key; scripts/review/reply.mjs publishes a note only that browser can read (assets/review/replies/). The drain rebuilds the vault's dashboard, a vault app (scripts/review/build-dashboard.mjs, sources in scripts/review/dashboard/). engagements.html (private): the proposed £5,000 and £25,000 engagements | hand-assembled from the pricing page's chrome; recapture after either home page changes |
| LinkedIn and the newsroom | linkedin.html (private): the LinkedIn desk, every item in order, copied as LinkedIn takes it; source scripts/linkedin/items.mjs, pictures scripts/linkedin/capture.mjs into assets/linkedin/, page scripts/linkedin/build.mjs (--check, --todo). newsroom.html: the newsroom's articles on the ABP retold, from scripts/site/newsroom/items.mjs | 05-workflows.md, Publish on LinkedIn |
| SHarness, the film and the demo | secure-harness.html: the open-source secure harness that holds an ABP's rules in the customer's environment, built by scripts/review/flat-page.py scripts/site/secure-harness/page.json. The film Reach, Mandate, Gap (Silvio Switha) in assets/media/film/ (MP4 + WebM + poster), on the home page at #film. walkthrough.html (private): the twenty-minute demo, from scripts/site/walkthrough/. The deck: assets/deck/positioning/index.html, hand-written, N for notes | brief handover__the-customers-site-sharness-the-film-and-web-summit.md |
| Home | index.html | hand-authored. Leads with the ABP; the ladder says we are on the first step |
| The problem | plug, acceptable, acceptance, grant-gap | hand-authored, older voice |
| Insurance, the answer page | insure-a-program.html | hand-authored, 18 Sept 2026; every claim dated and linked to its source; the AIUC blueprint (July 2026) and RAND RR-A5130-1 (16 Sept 2026) are the two anchors |
| The model | abp.html (the ABP page), how-it-works, agents (llms.txt etc.), ramm, scenarios, statics | hand-authored |
| Behaviour policies | agent-behaviour-policy.html (the library, top-level), agent-behaviour-policy-next.html (asked for, vote, suggest), abp-vault-<slug>.html ×15 | generated by build-abp-pages.mjs from site/vaults/index.json and each vault's data. abp-vaults.html and abp/ redirect |
| Vaults | site/vaults/<slug>/ ×15 pushed + claude-gmail-connector built and unpushed, _template/, _app/; instances (a customer's copy, anonymised) under vaults-instances/, built with ABP_VAULT_DIR=… and never deployed | inputs: vault.json, data/grant.json, data/mandate.json, data/scenarios.json, data/vocabulary/. Everything else generated by build-abp-vault.mjs |
| Live demos | demos.html, demo-*.html ×6 | hand-authored; each embeds an sgit vault with a public read key |
| Lab | lab.html (in More), lab-*.html ×7 (unlisted, linked from lab.html) | hand-authored; every meaningful state cut as a dated PDF in assets/lab/, registered in lab-editions.json |
| The team | site/team/ (in Behaviour policies): index.html, publisher.html, studio.html, their twins, and the data team.json, publisher.json, studio.json | generated by build-team.mjs. Our own agents' ABPs, the three tiers (public, private, secret), the surfaces, the workflow from private to public, the controls and tooling in place and not. The publisher's role for a clean session is .claude/agents/publisher.md; the check-in prompt is .claude/commands/publisher-check-in.md |
| Stories | site/stories/ (in Reading, with Articles): index.html, <slug>.html, their twins, images/, and the data cast.json, <slug>.json, board.json | generated by build-stories.mjs from the JSON; the old flat addresses (stories.html, story-*.html) are redirect stubs. Brief D29; architecture__the-stories-vault-… |
| OWASP (superseded) | site/owasp/ (off the menu since v1.40.1, every page carries a superseded banner from project.json → superseded; the proposal moved to the Open Security Summit, open-security-summit.html): index.html, charter, riskmandate, contributions, ecosystem, lessons, application, tracker, their twins; the record project.json; contribution-inventory.csv | generated by build-owasp.mjs from docs/owasp/pages/<slug>.html (bodies with <!--owasp:name--> placeholders) and project.json. Briefs D30, D31; direction__owasp-agent-behaviour-policies.md |
| Try it | try-it.html (top-level, between Pricing and Articles) | hand-authored. The free step below the store's ladder: the four-step, thirteen-prompt workflow a person runs in their own assistant, hosted at abp.sgit.ai/gmail. Says before the reader finds out that the result is a self report. direction__the-next-phase-is-users.md |
| Articles | articles.html (top-level), article-<slug>.html (unlisted, group Articles) | hand-authored, scaffolded with new-page.mjs from insure-a-program.html. One argument per page, built on one deployment shape's behaviour policy and linking to it; every claim sourced and dated; the queue of unwritten ones is listed on the index, marked not written; article-abp-for-chatgpt-dots.html (30 Sept: OpenAI's dots as the case for an ABP, documented from eight vendor pages) |
| Summit | summit.html, summit-booth.html (private) | hand-authored |
| More | lab (the Lab moved here from the top level in v1.19.0), questions, briefs (the register page), work, work-abp-power-user, library, partners, business-cases and owasp-graph (Insurance group; cases are business-case-<slug>, commercial drafts private; the OWASP graph is site/business-case/owasp/graph.json), uk-support (the UK support register, rendered from uk-support.json), feedback, brand, admin/ (a link entry: a folder, not a page) | hand-authored |
| Pricing | pricing.html | hand-authored; the store's four levels, each linked to store.sgit.ai/d/t<n>/; the level-3 prompt workflow; the plus-one-thing rule and a definition of done per level (v1.19.1) |
| After payment | paid-t1.html … paid-t4.html (unlisted, noindex) | hand-authored (scaffolded with new-page.mjs); one per level, the payment link's success address: what arrives and when, what you do next, how the key reaches you, the definition of done, who to write to. paid-t1.html is the download: its zip manifest (/*__DIST__*/) is stamped by build-abp-pages.mjs from site/vaults/*/dist/. after-payment.html (in More) is the debrief for the store team: the link contract and what the store has to do. Brief D9 |
| Home | index.html: hand-authored since v1.36.0 from a React mock the lead sent, ported to plain HTML/CSS/script under .rmx, in the shared chrome; the model section carries the previous home page's blocks; home-next.html is a redirect stub | the four counts and the template count are held true by the tests; the pitch-deck renderer reads the gap figure from it |
| About, the deck | about.html (in More, hand-assembled from the early-access donor): the company, the two founders as the investor deck states them, the deck read slide by slide; site/assets/deck/riskmandate-investor-deck-v3.pdf (the file; only its footers changed, Confidential to CC BY 4.0) and site/assets/deck/investor-v3/slide-NN.webp (18 slides, 1600×900) | the bios are quoted from the deck, dated; the fourteen-slide deck rendered from the site is a different file, riskmandate-deck.pdf |
| Agents, contact, early access | agents/index.html (generated by build-agents.mjs from .well-known/sgit-agents.json), contact.html, early-access.html (hand-authored, forms over the comms vault's site lane), scripts/intake/ (drain, configure, README) | the contact file is the source; the vault key is never in a file |
| Records | versions.html + versions/index.json + versions/<v>.md; briefs.html + briefs-register.json + assets/briefs/; lab-editions.json; vaults/index.json | append-only. Never rewrite an entry |
| Machine-readable | llms.txt, llms-full.txt, .well-known/agent-content.json, sitemap.xml, robots.txt, 404.html, every <page>.md | generated by generate.mjs (the manifest and full text are partly hand-written and restamped) |
| Scenarios pilot | site/scenarios/ | reads vault dm42qcaw in the browser; needs localhost |
| Admin console | site/admin/** (53 pages + twins) and site/admin/console.css | generated by build-admin.mjs from docs/, .claude/, the brief register, the state file, the catalogue and each vault's data; public, noindex, not in pages.json, its own rail. admin.html is a redirect stub. Adopted from store.sgit.ai/admin/ |
site/pages.json lists every page with its menu group and section. unlisted = real page, not in the menu. private = also out of the sitemap, llms.txt and the twins, and noindex. The header is three entries and one button (Product · How it works · Open source; Try it free), since v1.40.3 and a partner's review: a new page goes into a section of one of the three, never a fourth entry, and a test fails if it does. Desk pages (walkthrough, LinkedIn desk, home drafts, engagements) and Admin are off the menu; Admin is in every footer.
Scripts (scripts/site/)
| Script | Does | Idempotent | In CI |
|---|---|---|---|
generate.mjs [--check] | twins, sitemap, llms.txt, robots, 404, versions.md, menu injection | yes | yes |
release.mjs <v> "<title>" | notes stub, index.json entry, restamp every page, riskmandate_ai/version, pyproject.toml | no — once per version | no |
new-page.mjs <name> --title --desc [--css] [--body] [--donor] | scaffold a page with the current chrome | once | no |
build-abp-vault.mjs <slug> [--check] | derive one vault from its inputs; deterministic zip; refuses if it cannot reproduce an upstream delta | yes | yes, every vault |
build-abp-pages.mjs [--check] | the library page and one page per vault from the catalogue | yes | yes |
render-abp-vault-pdf.mjs | the PDF in a vault's dist/ (Playwright) | yes | no |
add-licence-chrome.mjs [--check] | GitHub link in the header, licence line in the footer, every page | yes | yes |
sync-modules.mjs [--check] | push scripts/site/modules/*.js into every page that inlines it | yes | yes |
build-uk-support.mjs [--check] | render site/uk-support.json into uk-support.html; refuses a row without an official URL, and a closure without the phrase that says so | yes | yes |
build-business-cases.mjs [--check] | the business-cases section and one page per case, computed from site/business-case/ (the RiskGraph model copy, cases/*.json, categories.json); refuses a change without a basis, a vendor basis without quote, URL and date, an expectation that claims to retire anything, and a model file that no longer matches its digest | yes | yes |
build-interview-pages.mjs [--check] | interview pages from site/interviews/<slug>.json (files starting _ are templates): six parts in a fixed order, a prompt that copies exactly, nothing loaded or sent | yes | yes |
scripts/site/build-stories.mjs [--check] | the stories: site/stories/cast.json, one JSON per story and board.json → site/stories/index.html and site/stories/<slug>.html, root-absolute links, RM.data.base="/"; refuses an unknown cast member or the ladder word this site never uses | yes | yes |
scripts/site/build-owasp.mjs [--check] | the OWASP section: site/owasp/project.json, contribution-inventory.csv and docs/owasp/pages/*.html → site/owasp/<slug>.html, root-absolute links; refuses ADP, rung, conformity words, score language, and a claim of OWASP approval before the record says accepted | yes | yes |
scripts/site/build-rules.mjs [--check] [--candidates] | the rules: site/rules/<slug>.json → site/rules/index.html, method.html, <slug>.html, and rules/sets/<agent>.md; reads the vocabulary and each vault's grant at build time; refuses a rule without a worry, what you get, a barrier statement, or a stronger barrier without a source and the date read; refuses scores, rung, ADP and the policy; --candidates lists the rows with nothing in the way and no undo | yes | yes |
scripts/site/build-team.mjs [--check] | the team: site/team/team.json (people, tiers, surfaces, workflow, tooling) and site/team/<agent>.json (an Agent Behaviour Policy each, in the vault grammar) → site/team/index.html and site/team/<agent>.html; derives each delta as the vaults do; refuses a row without barrier, evidence, undo and note, a mandate that wants and refuses the same row, the two banned words and anything credential-shaped | yes | yes |
scripts/stories/mail.mjs <command> --vault <clone> | Email-FS-lite for the stories vault, no dependencies: init, send, deliver, done, issue open|block|unblock|close, board (derives board/board.json, re-inlines it in board/index.html, --site writes site/stories/board.json), status. Nothing in it touches the network | yes | no |
scripts/packs/build-abp-people-pack.mjs [--check] [--out DIR] | the zip a new agent is given to make ABP vaults for people the lead meets: packs/abp-for-people/ plus this repo's builder, template, loader and every catalogue deployment's inputs, deterministic; refuses anything write-shaped | yes | yes |
render-lab-pdfs.mjs [slug] [--all] [--check] | cut a dated PDF edition of a Lab page when its content hash moved; register it | yes | yes (check) |
render-booth-panel.mjs, render-business-card.mjs, render-brand-exports.mjs | print assets | yes | no |
scripts/site/abp/ | the library page's CSS and JS, and the product marks; live once, injected at build | — | — |
scripts/site/modules/ | the shared page modules, one source each | — | — |
scripts/run-locally__riskmandate_ai.sh [PORT] | serve site/ on localhost after regenerating | — | no |
scripts/migrate/ | the one-off that made v1.0.0 from the vault. History | — | no |
npm run check runs everything CI runs. npm run editions cuts editions then regenerates.
Tests (tests/site/)
node --test tests/site/*.mjs. test_pages.mjs: whole documents, one close, no host frame, every internal link and anchor resolves, canonical + twin, private pages hidden, one version everywhere, one menu everywhere, version record shape, sitemap = published pages, pages.json = site/, Lab editions match digests and are linked, brief register matches digests and archive, no read key on a Lab mockup, no write credential anywhere, Admin beside Versions in every footer. test_admin.mjs: the console exists, every docs/**/*.md has a console page, every console page is noindex with a twin and a rail, every console link resolves, the console is in no sitemap or llms file, no write credential there either, admin.html redirects to admin/. test_scenarios_schema.mjs: the scenarios content contract.
CI (.github/workflows/ci-pipeline.yml)
On push to qa, dev, main: check (tests + every --check) → tag v<latest> if untagged → upload site/ → deploy to Pages. Any of the three branches deploys the one live site.
Outside the repository
| Thing | Where | Ours to write? |
|---|---|---|
| The ABP model, vocabulary, five worked examples | https://abp.sgit.ai/ (v0.3.0 pinned in every vault) | no; Lab 03 is our request list against it |
The store: four levels, /policies/ by application, /p/<slug>/ (our slugs), /d/t1..t4/ per level | https://store.sgit.ai/ (v0.1.7, live 15 Sept) | no; a separate agent maintains it |
| The research home | https://risks.sgit.ai/ | no |
The 15 application vaults + the app vault fl3i7lu4 | sgit, endpoint in site/vaults/index.json | yes, with write keys the lead holds |
The scenarios content vault dm42qcaw | sgit | content agents |
The stories vault: the lead, studio.chatgpt, publisher.claude (us), Email-FS-lite; not born as at 26 Sept; its seed is stories-vault/seed/ | sgit, key and token from the lead in a session | yes, our own folder and the mirrored stories/ |
| The demo vaults | sgit, public read keys on the demo pages | no |
| The vault host the buyer opens a vault in | dev.vault.sgraph.ai | no |
| Design canvases (brand, concepts) | .design-work/ | yes |