# sgit.ai, complete documentation, single file > Every page of https://sgit.ai concatenated into one document, generated at build time > (v0.6.8). Nothing here needs a second request. Individual pages live at the paths > shown below, as markdown (`.md`) and as HTML (`.html`); the annotated map is /llms.txt. > > sgit is git for encrypted vaults: clone, commit, branch and merge files that are encrypted > client-side (AES-256-GCM) before they leave your machine. The server stores ciphertext under > opaque IDs, it never sees filenames, contents, or commit messages. ============================================================================== # sgit (the encrypted git for humans and AI agents) > sgit is git for encrypted vaults) and a vault is a unit of work: data, app, history and sources, versioned like git and handed over with a single read key. No account, no hosting, nothing to install for the reader; the server stores ciphertext it cannot read. Twenty-five real vaults you can open. > > Page: https://sgit.ai/index.html Git for encrypted vaults, for humans and AI agents # A vault is a unit of work: data, app, history and sources, shipped as one string Version it like git. Hand it over with a single read key, no account, no hosting, no install for the reader. And the server that stores it cannot read it. [**Open a real vault →**](demos/vaults/index.md) [5-minute quickstart →](docs/quickstart.md) Pure Python · two runtime dependencies · Apache-2.0 · [or try it in your browser](try/index.md) [Reference, **AIUC-1 conformance layer**, The AIUC-1 standard as a graph, plus a conformance layer that computes insurability, Open it →](demos/vaults/aiuc-1-conformance/index.md) [Application, **Agent permission games**, Two games about grants and mandates, the first vault here that phones home, Open it →](demos/vaults/agent-permission-games/index.md) [Presentation, **AI vs. AI, Black Hat EU 2025**, The Black Hat EU 2025 keynote, with its PDF exports and eight research papers, Open it →](demos/vaults/blackhat-eu-2025/index.md) [Report, **Penetration Test Report**, A penetration test report (fictional) with a re-test script per finding, Open it →](demos/vaults/pentest-report/index.md) Four of **36 published vaults**. Each opens with a read key printed on its page, no account, nothing to install, and the server that stores it cannot read it. [See all 36 →](demos/vaults/index.md) ## What people actually ship Not categories, things. Each one is a real vault you can open, and each is hard to make any other way, for a reason that has little to do with encryption. [Hand over a report, **Penetration Test Report**, Findings, evidence and a retest script per finding travel as one unit. The client opens it with one string and can re-run the tests themselves., vault `o4lrwx02` · open it →](demos/vaults/pentest-report/index.md) [Publish a standard as data, **AIUC-1 conformance layer**, 53 controls as a graph you can cite, 82 hashed source snapshots, and a fork that added a conformance layer without changing a byte of the original., vault `2wzct4k7` · open it →](demos/vaults/aiuc-1-conformance/index.md) [Give a talk, **AI vs. AI, Black Hat EU 2025**, 26 slides, six PDF exports and the eight papers the talk cites, in the vault it was presented from. The deck and its sources never separate., vault `k1izvg7e` · open it →](demos/vaults/blackhat-eu-2025/index.md) [Pitch an investor, **VoiceDebrief pitch (FI)**, A presenter app with timings and speaker notes, shipped with the script, the research and the exports it was built from., vault `95i2xqrd` · open it →](demos/vaults/voicedebrief-pitch/index.md) [Ship a game that reports back, **Agent permission games**, Anonymous telemetry over a write-only lane, the one credential shape that survives being published with a read key., vault `4evnlwrj` · open it →](demos/vaults/agent-permission-games/index.md) [Give an agent a workspace, **Risk Mandate**, 124 files, 98 commits, eight entry points: a software project delivered as a vault, that calls an LLM without ever holding the API key., vault `4zf6pf2z` · open it →](demos/vaults/risk-mandate/index.md) [All published vaults, sortable →](demos/vaults/index.md) ## Nine of these vaults are the same graph, at different altitudes A **Fractal Semantic Graph** is one where every node opens into a graph with *its own* ontology. A regulation, then its articles, then the words they define: each world using vocabulary the one above never agreed to. What stays constant is the grammar, never the schema, and that is what lets everything connect to everything without anyone being forced to conform. For years we called it graphs of graphs of graphs. [**The idea, and the evidence**the jump test · a ladder of twelve rungs from the text of a law down to one compute instance · nine published vaults you can open with a read key](demos/fractal-graphs/index.md) [**What it costs, measured**no live database · a 1,051-node graph opens in 94 KB and three requests · 11.2 MB of source down to a 4 KB ontology with nothing discarded](demos/fractal-graphs/performance.md) [Fractal Semantic Graphs →](demos/fractal-graphs/index.md) ## One human, a team of agents This site, and every vault on it, is built by one person working with several AI agents, and the agents build for each other. The state that makes that possible is a vault: versioned, shareable, and readable by whoever holds the key. 166site releases, each verified live before it was called done 36vaults published with a deliberately public read key 27sibling sites on `*.sgit.ai`, one question each 12cross-team briefs filed or received, in the open 1A [build brief](docs/briefs/vault-telemetry-append-lanes.md) was published here on a Saturday. Another agent read it and shipped [a vault from it](demos/vaults/agent-permission-games/index.md) the same day. 2The team that owns the API reviewed that vault against the brief, found the brief wrong in two places, and [the correction now sits above the mistake](docs/briefs/index.md). 3One agent [forked another agent's vault](demos/vaults/aiuc-1-conformance/index.md), kept every byte, added a layer, and the original's tests still pass inside the fork. →The record is the site itself: [the briefs](docs/briefs/index.md), [the case studies](case-studies/index.md), [every release](admin/versions.md). And the diagnosis that produced this homepage is [an article, with the before pictures](articles/proof-behind-the-claim.md). ## Under the hood, it is git Same muscle memory. Files are encrypted before they leave your machine; the server stores ciphertext and hashes, nothing else. $sgit create my-vault ✓ Vault created and registered ✓ Initial commit pushed Vault key: <24-char-passphrase>: Keep this safe. It is the address, the auth, and the encryption key in one string. Without it, nobody, including the server, can read this vault. $vim notes/positioning.md $sgit status On clone branch branch-clone-3f9c → named branch main modified: notes/positioning.md added: drafts/hero-copy.md $sgit commit -m "first draft of hero copy" ✓ Committed 2 files (no staging area, commit snapshots the folder) $sgit history log --oneline c4e81a first draft of hero copy b2d70f initial commit $sgit history diff --- a/notes/positioning.md +++ b/notes/positioning.md - sgit is a CLI for encrypted sync + sgit is git for encrypted vaults $sgit push ✓ Pushed 2 objects (delta push, only changed, only ciphertext) # on another machine (or another agent) $sgit clone ✓ Cloned and decrypted 12 files $sgit pull ✓ Up to date # one call: encrypt, commit, push, machine-readable result # no working-directory scan, no full clone needed $sgit write notes/finding.md --file result.md \ --message "agent A: analysis" --push --json { "status": "pushed", "path": "notes/finding.md", "blob_id": "obj-cas-imm-9c2e41ab77d0" } The vault key is the address, the auth, and the encryption key, one high-entropy string. Keep it safe. **Git-like version control**commit, branch, merge, diff, log, stash, revert your encrypted files **Client-side encryption**AES-256-GCM before upload; keys derived from your vault key, never sent to the server **Real three-way merge**conflict files plus a base/ours/theirs `resolve --show` view **The two-branch model**a private clone branch per machine or agent; shared named branches for collaboration **Apps live inside the data**a vault can carry its own sandboxed app, with the permissions it asks for declared in a file **Browser interop**open the same vault in SG/Vault on the web, CLI and browser speak one wire format ## What the server sees ### Your machine - filenames & folder structure - file contents - commit messages - branch names - the vault key & derived keys *[diagram]* ### The server - obj-cas-imm-3f9c41ab77d0 - ref-pid-muw-8e02cc194b3a - ciphertext blobs (AES-256-GCM) - object sizes · timestamps - the vault id That's the whole list, and we publish the threat model, including what the server *can* see (sizes, timing, vault ID). [Read the security model →](security/index.md) ## Built for agents Agents need shared state. Shared state needs versioning, and privacy. sgit is the encrypted, versioned workspace for humans and AI agents. Persistent memory ### A vault is just a folder An agent clones it, reads and writes files normally, commits, pushes. The next session pulls and continues. State survives the context window. Multi-agent, human-merged ### A branch per agent Each agent gets its own private clone branch; work meets on named branches; a human reviews the merge, in the terminal or in the SG/Vault browser. Agent-grade plumbing ### Machine-readable everything `sgit write` for surgical single-call commits, `--json` on every read path, `cat --id` with zero network calls, sparse clones for fast cold starts. [What that costs, measured](demos/fractal-graphs/performance.md). [Read the agent guide →](docs/agents.md) · [Performance & cost →](demos/fractal-graphs/performance.md) · [Install the skills →](skills/index.md) · [Use cases →](use-cases/index.md) · [llms.txt](llms.txt) ## In production, and honest about it sgit is in beta, powering production workflows daily. No superlatives, just the evidence, and a page that tells you when *not* to use it. **~4,000** tests**mutation testing** in CI**integration tests** against a real server**2** runtime dependencies**Apache-2.0** [**security model** published](security/index.md) [**when NOT** to use sgit](docs/limitations.md) [**why** does this exist?](why/index.md) [**sgit · SG/Vault · SG/Send**: the three doors](docs/what-is-sgit.md) ## Nineteen sites, one question each Most of the thinking behind sgit no longer lives on this site. It moved out to **`*.sgit.ai`**: a family of focused sites, each taking one question further than a section here could, each with its own version history and repository. This site stayed about sgit. [**Agents & AI**identity for agents · calling an LLM with no API key · how the code is written](network/index.md#agents-ai) [**Risk & governance**you cannot deny a risk · cite the provision · the requirements nobody writes down](network/index.md#risk-governance) [**Graphs & method**meaning lives in the edges · issues as files · maps are claims](network/index.md#graphs-method) [**Security & infrastructure**a key registry for agents · an edge guard · ephemeral environments](network/index.md#security-infrastructure) [**Business & publishing**open source is a strategy · subscriptions are not rent · provenance as the product](network/index.md#business-publishing) [Find the one that answers your question →](network/index.md) ## Start with an argument, not a menu The articles are the readable way in: one page, one argument, with the screenshots and the links to check it. If you only read one thing here, read one of these. [2026-09-24**Before you give an agent a connector, give the connector a twin**When an AI agent is given a Gmail or Google Calendar connector, it can read, send, move, decline and permanently delete on somebody's behalf, and for several of those actions the platform itself documents that there is no way back. This article argues that a twin of the connector is the minimum requirement for deploying an agent with confidence. The twin is a journal of every request and response the agent makes, appended as it happens to a write-only lane, processed later, and replayed into the inbox and calendar as the agent saw them, with a before and after for every change and a revert plan for each one. It gives provenance, explanation and a named list of what can and cannot be undone, and it changes the agent's behaviour policy from a hope into a list. Every claim about Gmail and Calendar is taken from Google's own documentation and linked. A working replay of an invented session, and a business plan for the service, are published alongside it as a vault.Read it →](articles/connector-twin-before-you-deploy-an-agent.md) [2026-09-24**Every risk is already accepted. The only question is by whom, and for how long.**A foundation article on risk acceptance, for readers who have never met the idea. A risk exists the moment the exposure does, so an organisation is always carrying it; the only open questions are who has accepted it, and until when. There is no deny button, only three doors (accept for a stated interval, fund the work, or fix it), and silence escalates. The interval is the decision, from four hours, which is an incident, to six months, which is a named decision to wait. Accepted is not the same as acceptable, which matters because the EU AI Act requires providers of high-risk AI systems to have residual risk judged acceptable, and never defines the word. Every risk has a holder, every holder has a boss, and every path ends at the board. Every risk is established by facts and ended by facts, from the board down to the configuration file, which is what closes the gap between a register and reality. The article walks one invented risk through six weeks, argues that each material risk deserves a vault of its own as its evidence pack, explains why executives resist the model, and shows why it fits alongside every GRC platform rather than replacing one. A business plan for a company that runs this loop is published with it.Read it →](articles/every-risk-is-already-accepted.md) [2026-09-22**The future of news is the story vault, not the paywall**The news industry runs on two commercial models, advertising and subscriptions, and both are bad for the reader. One sells the reader to somebody else. The other charges rent on something most people have stopped using. Both are now being dismantled from outside, by a search layer that has stopped sending traffic and by consumer law that arrives in January 2027. This article is about what to build instead, in practical terms. The objective is a commercial model that rewards investigative journalism, so that the expensive, evidenced kind of reporting drives usage, usage drives revenue that depends on neither search nor renewals, and that revenue funds more of the same. The mechanism is to stop selling the article and start selling what the article was made from. The story is a graph, a fractal semantic graph in which meaning comes from connectivity and every claim walks down to hashed evidence, so that trust comes through provenance and provenance comes via evidence. The article is one projection of it. From that one graph a newsroom can sell five things, on demand and in pence, to readers, to firms and to agents, and every payment walks back to the people who made the facts. It is built, in parts, on things we have already published.Read it →](articles/future-of-news-story-vault-not-paywall.md) [All articles →](articles/index.md) Encrypted vaults. **Git workflows.** Zero knowledge. [5-minute quickstart →](docs/quickstart.md) [Star on GitHub →](https://github.com/SGit-AI/SGit-AI__CLI) ============================================================================== # The vault catalogue, sgit.ai > An index of published vaults rendered live from a vault that indexes vaults, including itself. Each entry: a deliberately published read key, shape, evidence status, copy-or-reference semantics, and write-key status (known-and-escrowed or lost, a frozen vault can never be corrected). Submitting a vault costs a read key and one line; the rest is derived. > > Page: https://sgit.ai/catalogue/index.html [Home](../index.md) / Catalogue # The vault catalogue An index of published vaults, rendered live from a vault that indexes vaults, including itself. Every entry carries a deliberately published read key, an honest evidence status, and its write-key status, because a vault whose write key is lost can never be corrected and a reader deserves to know. **The design constraint, stated openly:** the bottleneck is one person with a backlog of vaults, so an entry costs **a read key and one line**: everything else (listing, sizes, commit count, whether an app is present) is derived by an agent opening the vault with the key it was just given. The two to-do queues are published in the catalogue itself: a named gap gets filled, an unnamed one does not. This page renders vault `kc67yhgw` directly, a push to it updates this page with no site deploy. The human companion is [the published-vaults gallery](../demos/vaults/index.md): one page per vault, with the vault running live in it. **Where it stands, checked 19 September 2026.** The catalogue vault holds **nine** entries and was last pushed when the site had nine published vaults; the gallery now has **thirty**. The twenty-one missing rows are not a queue problem (those vaults are published, audited and live on their own pages) they are a write-key problem: the catalogue can only be updated by whoever holds its key, and that is not the site's build. Until it catches up, [the gallery](../demos/vaults/index.md) and [its machine-readable twin](../demos/vaults/llms.txt) are the complete list, generated from one file on every release. What this page adds is the shape taxonomy, the evidence and write-key status per entry, and the proof that an index of vaults can itself be a vault. opening the catalogue… Fetching the encrypted index… ### Vault debug [how this works →](../case-studies/live-vault-docs.md) not open yet what you are looking at Every row above is an encrypted object pulled from the SG/Send API and decrypted locally: click one: click one to see what it actually contains. Objects whose id contains **-imm-** are content-addressed and therefore immutable, so they are cached permanently; the mutable **ref** is the one mutable object, so it is checked at most once per freshness window (120s) rather than once per page, inside the window, reading the docs makes no requests at all, and **check for new commit** forces one whenever you want it. The **tree** objects are the reason a first visit reads more than one file: filenames are encrypted inside them, so building the navigation means reading every directory. That index is a pure function of the commit id, so it is memoised, after the first visit, an unchanged commit reads no tree objects at all. Nothing here is stored on sgit.ai. [How this page works →](../case-studies/live-vault-docs.md) Architecture diagrams, the object model, the cache tiers, and how a page like this one reads a vault it holds only the read key to. ============================================================================== # Comparisons, as tests you can re-run, sgit.ai > What a task costs with vaults and without, published by a participant and built to be challenged: every entry states the steps, the date, the result and how to re-run it. Includes a privilege vocabulary, and one comparison vaults lose. > > Page: https://sgit.ai/compare/index.html [Home](../index.md) / Comparisons # Comparisons, as tests you can re-run What a task costs with vaults, and without them. This page is not unbiased. It is published by a participant, and nobody should read it as neutral. It is built to be **challengeable** instead: every entry states the exact steps attempted, the date, what happened, and how to run it yourself. **Why not "unbiased".** A comparison published by one of the parties is not a neutral instrument, and claiming otherwise would be the least credible thing on this site. The achievable and stronger property is reproducibility: **an assertion that is wrong gets screenshotted; an experiment that is wrong gets corrected.** If an entry here is out of date or simply mistaken, the fix is a re-run, and the correction improves the page rather than discrediting it. [Tell us](mailto:) or open an issue on [GitHub](https://github.com/SGit-AI/SGit-AI__CLI). ## The asymmetry, stated up front Our rows can be **executed**. A script opens a published vault, tries the operation and records what happened, it runs on demand and fails loudly when reality moves. Rows about anybody else's product cannot work that way: there is no API for "how many steps does this take in a desktop app", and automating someone's product against their terms is not something we will do. Those rows are **checked by hand, by a person, on a stated date**. So the two kinds of row carry different badges, and you should trust them differently: | Badge | Means | Ages | |---|---|---| | **machine-verified** | An automated check against the live service, in `admin/build/compare_tests.py`. The evidence below each claim is its actual output | Re-run any time; the date is the last run | | **hand-checked** | A person performed the steps on the date shown and wrote down what happened | Decays. Past the expiry it renders as **unverified**, not as fact | Loading verification status… ## The entry format Every entry answers the same eight things. Anything that cannot be filled in honestly does not get published. | Field | Why it is there | |---|---| | **Task** | Stated concretely enough that somebody can attempt it | | **Steps** | Countable and disputable on facts. The number is a *summary*; the transcript below it is the evidence, because step counts are gamed by where you start counting | | **Prerequisites** | Accounts, subscriptions, installs. This is where cost actually lands | | **Privileges granted** | What the counterparty can now reach. The column that usually decides the answer, see the vocabulary below | | **Where it runs** | Your machine, or theirs | | **Survives the vendor** | Whether the artefact still works if the service stops | | **Verified** | The date, and whether by machine or by hand | | **Re-run it** | The command or the steps, so the claim is auditable rather than trusted | ## The privilege vocabulary "Share it with them" hides the entire question. These seven properties make two grants comparable, and each is a fact rather than a judgement. This vocabulary is the part of this page most likely to be wrong at first. It is offered to be argued with. | Property | Values | What it answers | |---|---|---| | **scope** | file · folder · vault · account · all-vaults | How much does the grant reach? | | **operations** | read · write · delete · administer | What can be done with it? | | **bearer** | person · program-on-their-machine · vendor-server · any-holder | Who actually holds it? "any-holder" means the grant is a string: whoever has it, has it | | **mediation** | server-enforced · key-enforced | Who says no? A server can refuse and can log. A key cannot refuse, possession *is* access | | **duration** | session · until-withdrawn · forever | When does it lapse on its own? | | **withdrawal** | effective · future-only · none | Can you take it back, and does taking it back reach what they already have? | | **observability** | per-reader-log · aggregate · none | Can you see who read what? | Written compactly, a published read key is: `scope:vault · ops:read · bearer:any-holder · mediation:key · duration:forever · withdrawal:future-only · observability:none`. Three of those seven are **worse** than a mainstream sharing link, and saying so is the point of having a vocabulary. **One shape the vocabulary above could not express, until a vault demonstrated it.** An app can be granted the *use* of a credential without being given the credential: the [Risk Mandate vault](../demos/vaults/risk-mandate/index.md) seals its OpenRouter key under the vault key, and the host makes the call on the app's behalf. So `ops` and `bearer` come apart, `ops:llm-chat` is granted while `bearer` of the key is not, and a read-key holder auditing the vault (as we did) finds ciphertext where the secret would be. Most sharing models cannot say this, because handing over the capability and handing over the credential are the same act. **The performance comparison lives on its own page.** "How does this compare to a graph database?" is asked often enough, and needs enough measurement behind it, that it is not an entry here. [Performance, cost, and running everywhere](../demos/fractal-graphs/performance.md) is the answer: what a read actually costs with no live database, the cost model line by line, and the six places this is slower, all with the commands to repeat every figure. ## The entries Three to start with, chosen to be different: one small and verifiable in seconds, one we lose, one that is the actual differentiator. More arrive as they are tested, not as they are thought of. ### 1 · Print a markdown file that somebody sent you Small, universally understood, checkable in under a minute, the kind of entry that earns the credibility the larger claims spend. | | A markdown file in a vault | A markdown file on your disk | |---|---|---| | **Steps** | **2**: open the file in the vault UI (it renders), press **Print** | **3–5**, depending on what you already have: many editors render markdown but print the *source*; the common workarounds are convert-to-HTML, paste into a browser, or install something | | **Prerequisites** | A browser | An editor that both renders *and* prints, or a converter, or an online tool | | **Privileges granted** | None beyond the key you already hold | None, *unless* you use an online converter, which is `scope:file · ops:read · bearer:vendor-server · withdrawal:none`. Uploading a document to a stranger to reformat it is a privilege grant that does not feel like one | | **Where it runs** | Your browser; the print component renders locally | Your machine, or a stranger's | | **Verified** | **hand-checked, 2026-08-16**: the vault UI exposes a **Print** control on an open markdown file, backed by `SgPrint.printMarkdown`; confirmed present and reachable in a browser driven with a published read key | | **Re-run it** | Open `https://dev.vault.sgraph.ai/#sgit_public_read_0a0f34839d737eef0f8f66e5236990b1f397af064763e3f71dca2717015f9d15:3d04e6b9ca98`, go to the vault browser, click `README.md`, look for **Print**. For the other column, take any `.md` file and try to produce a formatted page with whatever you already have installed, count what it takes | **What would change this entry:** an editor that renders and prints markdown in one action, which several are close to. If you know one, that column's step count should drop and this entry should say so. ### 2 · Take access back after you have shared something we lose this one A comparison where our column always wins is discounted on sight, so here is one where the mainstream answer is straightforwardly better. | | A vault, shared by read key | A hosted document, shared by link | |---|---|---| | **Steps to withdraw** | **Rotate the key and re-publish.** Future commits are protected | **1–2**: remove the share; the next request is refused | | **Does it reach what they already have?** | **No.** Anything already fetched stays readable forever, with no way to reach it | **Largely yes**: unless they exported or screenshotted, the server stops serving it | | **privileges** | `withdrawal:future-only · mediation:key · observability:none` | `withdrawal:effective · mediation:server-enforced · observability:per-reader-log` | | **Why** | Possession of a key *is* access, so there is no server in the loop to refuse a later request. The objects are content-addressed and immutable, the same id returns the same bytes forever, which is exactly what makes an already-taken copy permanent | | **Verified** | **machine-verified**: the immutability that causes this is checked automatically (`objects-immutable` below). The hosted-side behaviour is **hand-checked, 2026-08-16**, and is the ordinary documented behaviour of mainstream sharing | | **Re-run it** | `python3 admin/build/compare_tests.py`, the immutability check fetches one object twice and compares bytes | **The honest summary:** if the ability to revoke access after the fact matters more to you than the host being unable to read your content, a server-mediated platform is the better tool and you should use one. Vaults trade revocation for the host knowing nothing. That is a real trade, not a free win. ### 3 · Let a program record data for you without letting it change your records The differentiator. Note that the step counts are similar. It is the privileges column that separates these, which is why it is the column to lead with. | | A vault app | An assistant with folder access | |---|---|---| | **Steps** | Declare the grant in `app.json` and open the vault | Grant access to the folder, then run it | | **Privileges granted** | `scope:folder(adherence/) · ops:write,mkdir · mediation:key+host`, read broadly, but write to **one folder**. The app cannot alter the records it reports on | Typically `scope:folder · ops:read,write · bearer:vendor-server` for the whole shared folder, the granularity available is the folder you shared | | **Where it runs** | Your browser, in a sandboxed frame with an opaque origin | Usually the vendor's infrastructure, with your files sent to it | | **Survives the vendor** | The data is files with a documented layout; the reader is replaceable (we wrote a ~170-line one to prove it) | The conversation and any generated artefacts live where the vendor put them | | **Verified** | **machine-verified**: `scoped-write-declared` below reads the live vault's `app.json` and asserts the write scope is exactly `["adherence/"]`. The comparison column is **hand-checked, 2026-08-16** and describes the general shape of folder-level sharing, which varies by product, corrections welcome, per-product rows to follow | | **Re-run it** | Open the [Supplement Stack vault](../demos/vaults/supplement-stack/index.md) and read its `app.json`, or run `python3 admin/build/compare_tests.py` | **The caveat that keeps this honest:** read granularity is coarser than write granularity here. A read key opens the *whole vault*, not one file. Finer read boundaries mean separate vaults with separate keys, decided in advance, granularity costs structure. If you need per-file read control without pre-planning the shape, this is not yet the tool. ## The checks behind the machine-verified rows These run against the live service using only published read keys, and each states what would make it fail, a test that cannot fail is not evidence. Loading results… ## What is deliberately not here | Not here | Why | |---|---| | Anything we plan to ship | A comparison page is exactly where planned capability must not sit beside shipped capability. One unshipped row and a reader re-reads every other row as marketing | | Ease-of-use scores | A judgement published by a participant is the thing this page cannot defend. Steps, prerequisites and privileges are facts | | A deployment-features comparison | It would be the most linked and the fastest to rot, and our own story has a caveat worth resolving first: a vault's files are portable, but the polished viewer is currently one hosted implementation | | A maturity model | Those score an organisation's practice over time. This scores a task against a tool stack on a date, a different instrument | ============================================================================== # Published vaults, sgit.ai > Thirty-one vaults you can open in your browser right now, every read key published on purpose. A read key is the whole credential: no account, nothing to install, no write capability in it. Each row opens a page with what the vault does and the vault running live inside it. > > Page: https://sgit.ai/demos/vaults/index.html [Home](../../index.md) / Vaults # Published vaults Open any of these in your browser right now. Every read key here was published on purpose, and a read key is the whole credential: no account, nothing to install, no write capability in it. Each row opens a page with what the vault does and the vault itself running live inside it. **Nine are semantic graphs**, each in its own ontology, from a regulation down to a compute instance. · [The ladder, walked →](../fractal-graphs/index.md) · [What reading one costs →](../fractal-graphs/performance.md) **36 published vaults**: 10 briefing, 7 analysis, 5 application, 5 reference, 4 record, 3 presentation, 1 gallery, 1 report. Newest first; **click any heading to sort**. Every read key and the live link are on the vault's own page. | # | Vault | What it is | Category | Files | Size | Published | |---|---|---|---|---|---|---| | 36 | [Company X-Ray](company-xray/index.md)`ukpqjkly` | A business plan for reading a company's own documents together, with one invented company X-rayed and every finding tied to its evidence | Briefing | 60 | 710 KB | 2026-09-24 | | 35 | [Lesson Loop](lesson-loop/index.md)`3s9q7zl7` | A business plan for coaches: the coach's knowledge captured at the end of every lesson, in a record the player holds | Briefing | 27 | 407 KB | 2026-09-24 | | 34 | [Risk Acceptance Office](risk-acceptance/index.md)`odn10gfp` | A business plan with one risk replayed: established on facts, accepted for an interval, escalated, funded and ended on facts | Briefing | 32 | 673 KB | 2026-09-24 | | 33 | [Connector Twin](connector-twin/index.md)`7tkvspwp` | A business plan with a working replay: what an agent did through Gmail and Calendar, what it saw, and what can be undone | Briefing | 31 | 515 KB | 2026-09-24 | | 32 | [Agent as Webmaster](agent-webmaster/index.md)`ikrqeu5t` | A complete business plan, with mock-ups and prototypes, written for somebody else to run | Briefing | 32 | 666 KB | 2026-09-23 | | 31 | [DSIT AI Risk Toolkit](dsit-ai-risk-toolkit/index.md)`0q4sfr57` | Start with an AI decision and trace it back to UK DSIT guidance; an eight-slide walkthrough plays from the vault | Reference | 155 | 12.1 MB | 2026-09-20 | | 30 | [Fractional CISO application pack](fractional-ciso-pack/index.md)`eaba68j5` | The sibling of #29, written for an archetype instead of a company, so there is nothing to redact. Two days a month, a twelve-month map, and a section that says what the role is not | Briefing | 72 | 19 MB | 2026-09-18 | | 29 | [Interim CISO application pack](interim-ciso-pack/index.md)`8brojsem` | A job application as a vault, three routes for three readers, four documents in four formats each, and the client named nowhere | Briefing | 56 | 17 MB | 2026-09-17 | | 28 | [Synthetic users · riskmandate.ai](synthetic-users-riskmandate/index.md)`o3q6zhtr` | The same method as #27 pointed at a second product, and it measured rather than narrated, catching a shipped bug every existing test had passed over | Analysis | 53 | 3.5 MB | 2026-09-16 | | 27 | [Synthetic users](synthetic-users/index.md)`g2hei4u6` | Five invented buyers walked through store.sgit.ai one screenshot at a time, 43 steps, 15 unanswered questions, 18 findings, three costing a sale | Analysis | 67 | 6.4 MB | 2026-09-15 | | 26 | [The sgit.ai board](board/index.md)`pdulwi6i` | The site's own task board as a vault, cards as files, five columns as an app, the source of truth the site renders from | Record | 21 | 40 KB | 2026-09-07 | | 25 | [Agent permission games](agent-permission-games/index.md)`4evnlwrj` | Two games about grants and mandates, the first vault here that phones home | Application | 68 | 2.6 MB | 2026-09-06 | | 24 | [AIUC-1 conformance layer](aiuc-1-conformance/index.md)`2wzct4k7` | The AIUC-1 standard as a graph, plus a conformance layer that computes insurability | Reference | 649 | 43 MB | 2026-09-05 | | 23 | [Licence to Operate](licence-to-operate/index.md)`posrhzp3` | An insurance policy for an agent, simulated: grant, mandate, and the delta nothing covers | Analysis | 121 | 13 MB | 2026-09-04 | | 22 | [VoiceDebrief pitch (FI)](voicedebrief-pitch/index.md)`95i2xqrd` | A three-minute investor pitch as a presenter app, with script, timings and sources | Presentation | 48 | 17 MB | 2026-09-02 | | 21 | [Scaling Threat Modeling](threatmodcon-2025/index.md)`0ict6flm` | ThreatModCon 2025: eleven linked threat models across 51 nodes and 179 threats | Presentation | 53 | 4.1 MB | 2026-08-27 | | 20 | [AI vs. AI, Black Hat EU 2025](blackhat-eu-2025/index.md)`k1izvg7e` | The Black Hat EU 2025 keynote, with its PDF exports and eight research papers | Presentation | 87 | 20 MB | 2026-08-27 | | 19 | [Standards Atlas, GDPR](standards-atlas-gdpr/index.md)`4zv4bvmu` | GDPR as a semantic graph, with writes scoped to a feedback folder | Reference | 116 | 6.3 MB | 2026-08-25 | | 18 | [RiskMandate · File security](riskmandate-file-security/index.md)`wu365g94` | An eleven-step risk-acceptance walk, running SQLite in the browser | Analysis | 71 | 2.7 MB | 2026-08-25 | | 17 | [Penetration Test Report](pentest-report/index.md)`o4lrwx02` | A penetration test report (fictional) with a re-test script per finding | Report | 93 | 6.4 MB | 2026-08-25 | | 16 | [SG/Payments Brief Pack](payments-brief-pack/index.md)`o3m0sz3q` | A payments briefing pack, marked PROPOSED rather than dressed as decided | Briefing | 18 | 224 KB | 2026-08-25 | | 15 | [Content-Transformation Proxy](content-transformation-proxy/index.md)`3c90c2bff2b1` | An as-built engineering brief, shipped with its slides, diagrams and source PDFs | Briefing | 140 | 63 MB | 2026-08-25 | | 14 | [SG Commercialisation](commercialisation/index.md)`haeu7p1e` | A commercial operating model, with its customer register deliberately left empty | Briefing | 78 | 536 KB | 2026-08-25 | | 13 | [Vault App Mode](vault-app-pocs/index.md)`xth1xt78` | Nine proofs of concept for vault app mode, with a hub that runs them | Reference | 57 | 251 KB | 2026-08-23 | | 12 | [Private Health Score](health-score/index.md)`zc6abngv` | A clinical questionnaire scored by a versioned framework, with a clinician review screen | Application | 35 | 1.2 MB | 2026-08-23 | | 11 | [VoiceDebrief](voice-debrief/index.md)`k6xy9z4d` | Four apps in one vault, from raw recording to structured debrief | Analysis | 92 | 1.2 MB | 2026-08-22 | | 10 | [Regulation Graph](regulation-graph/index.md)`73heuprz` | The EU AI Act parsed from Formex into an evidence graph, article by article | Reference | 207 | 14.9 MB | 2026-08-20 | | 9 | [Risk Mandate](risk-mandate/index.md)`4zf6pf2z` | A working software project delivered as a vault, and it calls an LLM holding no API key | Application | 124 | 1.9 MB | 2026-08-17 | | 8 | [Risk Graph Explorer](risk-graph-explorer/index.md)`3simlnqe` | A fact-to-risk graph explorer, built to be public: its app.json requests nothing | Application | 33 | 428 KB | 2026-08-17 | | 7 | [Agentic Browser Isolation](agentic-browser-isolation/index.md)`0610gsp9` | Should an agent browse with your logged-in sessions? A living risk graph, per stakeholder | Analysis | 104 | 2.4 MB | 2026-08-17 | | 6 | [Supplement Stack](supplement-stack/index.md)`r7zes477` | A patient-held health record: a real regimen, label photos, totals against UK RNIs | Record | 23 | 2.3 MB | 2026-08-16 | | 5 | [Strategy Maps](strategy-maps/index.md)`ookq4mn4` | The SG/Send strategy in seven Wardley maps, plus the sgit positioning analysis | Analysis | 33 | 830 KB | 2026-08-16 | | 4 | [Field Notes](field-notes/index.md)`4bshby5n` | Six studies with generative SVG art, the smallest complete vault app | Application | 4 | 11 KB | 2026-08-16 | | 3 | [Deploy Docs](deploy-docs/index.md)`fyofmkvr` | Living deployment documentation, updated by an sgit push with no site deploy | Record | 17 | 25 KB | 2026-08-16 | | 2 | [The Vault Catalogue](catalogue/index.md)`kc67yhgw` | An index of published vaults that is itself a vault, and lists itself | Record | 9 | 11 KB | 2026-08-16 | | 1 | [Algarve · May 2026](algarve-may-2026/index.md)`3d04e6b9ca98` | A travel diary: twenty photographs in three sizes and an eight-chapter narrative | Gallery | 71 | 29 MB | 2026-08-16 | Publishing one of your own? [**The method is written down**](publishing.md): the seven steps behind every row above, the tools that do each one, and the mistakes that produced each rule. The rules themselves, with the incident behind each, are on [**Lessons learned**](../../lessons/index.md), including why a read key may be published and a vault key never may. This table is the complete list, and [its machine-readable twin](llms.txt) is generated from the same file. [The catalogue](../../catalogue/index.md) (an index of vaults that is itself a vault, updated by an sgit push with no site deploy) carries a shape taxonomy and per-entry evidence status for the first nine; it is waiting on its key holder for the rest. The original worked example of creating, auditing and embedding one is on [the embed demo page](../vault-app-embed.md). Agents: this catalogue is also published as [/demos/vaults/llms.txt](llms.txt), every vault above with its id, category, size and published read key, generated from the same file this table is, so the two cannot drift. The whole-site map is [/llms.txt](../../llms.txt). ============================================================================== # Start with an AI decision, then trace it back to the guidance: the DSIT AI Risk Toolkit vault > An independent, experimental journey through the UK DSIT AI Risk Management Toolkit, published as a vault: describe a use case, review the risk prompts that apply, record evidence and owners, propose controls and reassessment, and follow each step back to its source. An eight-slide walkthrough plays on the page from the encrypted vault, with the PDF as a download. Underneath: separate worlds with named bridges, every edge labelled curated or lexical, hashed source snapshots, 13 passing checks and 6 published gaps. Not an official DSIT service or certification. > > Page: https://sgit.ai/demos/vaults/dsit-ai-risk-toolkit/index.html [Home](../../../index.md) / [Vaults](../index.md) / DSIT AI Risk Toolkit An independent, experimental journey through the UK DSIT AI Risk Management Toolkit # Start with an AI decision, then trace it back to the guidance Describe a use case, review the risk prompts that apply to it, record evidence and owners, propose controls and a reassessment trigger, and follow each step back to its source in the official guidance. The vault below is a working prototype of that journey. An eight-slide walkthrough shows it with a fictional example. [Try the live vault ↗](https://dev.vault.sgraph.ai/#sgit_public_read_cdc00d2baaf75361d86ae1b7a40169bd98d71aaae1bd581e181a0f0ba0e0e6bb%3A0q4sfr57) [View the eight-slide walkthrough ↓](#walkthrough) [Download the PDF deck](#walkthrough) The walkthrough uses fictional data. This is an independent experiment with public UK government guidance, not an official DSIT service, assessment or certification. Nothing you enter leaves your browser tab until you export it. ## See the journey in eight slides The deck is read live out of the vault as you click: the slide source runs in a sandboxed frame with no origin and no network, each slide renders in a second frame with scripting switched off, and the five screenshots are decrypted in your browser. Use **notes** for the speaker notes, **focus** to hide the slide list, the arrow keys to move, and **PDF** to download the printed deck. **The eight slides, in one line each** 1. **A decision before a risk list.** The vault opens on a use case and a governance decision, not a checklist. 2. **The journey.** Use case, relevant risks, evidence and owner, control and reassessment, original source. 3. **Start with the use case.** Title, decision, scope and decision owner. Three synthetic examples, or your own. 4. **Context changes the questions.** Ten context facts prioritise 153 top-level prompts; unknown answers stay open. 5. **One risk, a working record.** Pick a source question, record evidence, owners, a control and a review trigger. 6. **The graph stays underneath.** The research graph of 941 nodes and 4,735 edges connects question, topic and source. 7. **Take the work with you.** A JSON export of your answers and the derived session graph; import recomputes conclusions. 8. **Try a decision in the vault.** Bring one use case and one decision, and say where the journey is confusing. ## What you can try in the vault Five steps, in the order the journey asks them. Each one is a screen in the live vault; the graph does the tracing underneath, and you do not need to learn it first. | Step | What you do | What to notice | |---|---|---| | **1 · Use case** | Write the decision you need to make: a title, the governance decision, the scope, the decision owner. Or pick one of three clearly labelled synthetic examples. | The journey starts from a decision, not from a list of risks. | | **2 · Risk prompts** | Answer ten context facts. The 153 top-level prompts from the official guidance are prioritised for your case; unknown answers stay open. | The prompts keep the source wording. Six conservative rules propose scope changes for human review; none removes a question silently. | | **3 · Evidence and owner** | For a risk that applies, record an evidence reference and the people responsible. | A recorded reference is a user assertion. It is not independently verified by anything in the vault. | | **4 · Control and reassessment** | Propose a control and the trigger that would make you look at the risk again. | These are proposals, kept apart from the source text, and labelled as such. | | **5 · Source** | Follow any prompt back to the retained guidance snapshot and the GOV.UK page it came from. | Every prompt walks back to hashed source bytes. That is the graph, doing its job without being asked. | **Where your answers go.** Nowhere, until you say so. Draft answers live in the browser tab; **export the JSON before closing it**. The export holds your entries and a derived session graph, not copies of the source corpus, and importing it recomputes the scope conclusions. This is a prototype built to be tested with the people it is for, and the most useful thing to send back is where it confused you. [Open the journey ↗](https://dev.vault.sgraph.ai/#sgit_public_read_cdc00d2baaf75361d86ae1b7a40169bd98d71aaae1bd581e181a0f0ba0e0e6bb%3A0q4sfr57) ## The vault, embedded The journey opens as the vault's home page. The earlier source-backed reference edition is one click away inside it, at `reference.html`. It has more room [in its own tab ↗](https://dev.vault.sgraph.ai/#sgit_public_read_cdc00d2baaf75361d86ae1b7a40169bd98d71aaae1bd581e181a0f0ba0e0e6bb%3A0q4sfr57). ## How it works underneath The journey sits on the reference edition this vault started as, and the reference edition is the reason the source trace works. Its structure has not changed; it has moved below the decision. ### Separate worlds, and the bridges are the point The guidance, the official spreadsheet, the risk method it describes, the 160 risk-question bullets and the frameworks it cites are not the same kind of thing, and modelling them in one vocabulary would force most of them to pretend to be another. The vault declares separate worlds and lets each keep its own shape, with named bridges between them. Its ontology states the limit plainly: *"containment alone is not fractality. Cross-world edges make the semantic transitions inspectable."* That is the same distinction [Fractal Semantic Graphs](../../fractal-graphs/index.md) arrives at from the other direction. | World | What lives in it | |---|---| | `source` | The publication as retrieved: 30 guidance sections, 67 blocks, and the bytes they came from | | `risk_method` | The method the guidance describes: risk categories, treatments and appetite | | `risk_question` | The 160 risk-question bullets, in nine category shards, with 274 punctuation units for stable traversal and no semantic claim | | `workbook` | The official spreadsheet as data: 4 sheets, 490 cells, 208 of them formulas | | `frameworks` | The external standards the text cites, referenced and never reproduced | The semantic explorer at the four-world edition of 20 September 2026. Each connection states its verb and how it was obtained: `is_derived_from · curated` is an authored claim, `is_mentioned_by · lexical` is a string match, and the vault never lets you mistake one for the other. ### Curated against lexical Every assertion is labelled with which it is: an edge somebody decided, or an edge a search found. A reader who disagrees with a `curated` edge is disagreeing with a person. A `lexical` edge claims only that a word appeared, and the vault's own limits say *"lexical mentions are not validated meaning."* It also refuses the inference everyone wants to make from a compliance artefact: *"no compliance inference or organisation attestation is made."* The risk-method world, from identification to treatment. Nine categories, each an edge away from the guidance that defines it and the workbook cells that score it. ### Every claim carries the bytes it came from Five source snapshots are retained inside the vault, each with its URL, its retrieval date and the SHA-256 of the bytes: the guidance body, two content-API responses, and the official workbook in both XLSX and ODS. The workbook is read rather than rewritten: cached values are not recalculated, dates stay as Excel serials, styling is not reproduced, and the vault says so. Two of its checks exist purely to prove the originals were not touched. *"A claim is only as useful as its trace."* The checks, all passing, and the known gaps published beside them. ### The six gaps it publishes about itself - **It corrects its own earlier number.** *"Direct OOXML recount finds 208 formula cells, correcting 227 in the retained earlier briefing."* The earlier briefing stays in the vault, uncorrected, with the correction recorded beside it. - **It preserves a contradiction in the source.** The official file is named v1.1 and its own Welcome sheet says v1.0. Both labels are kept. - **It refuses to repair the source.** Two defined names in the official workbook are broken. They are reported broken. *"No source repairs were made."* - **It declines the flattering reading.** *"Starter rows are not evidence of adoption"*, and no independent implementation, compliance assessment or adoption metric is asserted. - **It dates itself.** The retained research briefing is a snapshot as of 20 September 2026; external sources may change. - **It names what it did not build.** Formula dependency expansion and shared-formula expansion are not implemented. *"Inspect. Download. Query."* The official files remain unchanged, and SQLite compiled to WebAssembly runs the queries in your tab. ### What it demonstrates about vaults | Feature | How this vault uses it | |---|---| | **Read and download, no write** | `fs.read` is true and `write` and `delete` are both empty arrays, with downloads and external links declared. The journey's drafts stay in the tab and are never written back | | **Queries with no backend** | sql.js, which is SQLite compiled to WebAssembly, is bundled so the query view works offline. The copies were taken from the published [Regulation Graph vault](../regulation-graph/index.md) and the provenance of that decision is recorded in `NOTICE.md` | | **Two things versioned in the open** | The reference edition and the journey carry separate version records, each with its own release page, and the version badge in the app links to the release it is showing | | **A licence that survives the copy** | Source text under OGL v3.0, application code with no additional licence assigned by the release, bundled sql.js under MIT with SQLite in the public domain, marked under MIT. Each is stated rather than blended | | **Machine-readable on the way out** | `downloads/graph.jsonld` keeps every assertion's provenance and partition, and the journey's JSON export carries the derived session graph, so both leave the vault without losing what made them checkable | | **A deck, on the site, from the vault** | The walkthrough above follows the [decks/v2 contract](../../../docs/briefs/vault-decks-on-a-site.md): manifest, slide source, styling, screenshots and PDF read from the vault; controls, routing and download owned by this page | ## Status, versions and limits | What | As published, 23 September 2026 | |---|---| | **Main journey** | v0.2.0, dated 23 September 2026, an independent experiment. Its record describes itself as *"experimental, unverified user assertions; no official DSIT endorsement or compliance assessment"*. Its ontology and question shards remain the v0.1.0 research snapshot | | **Reference edition** | v0.2.3, dated 23 September 2026: the journey promoted to the vault home, the former reference home kept at `reference.html`, every source-backed page retained | | **Research graph** | 941 nodes and 4,735 edges, as stated in the deck's own notes and counted from the vault's edge shards. A separate graph from the reference edition's, and the counts are not merged | | **Reference graph** | 1,051 nodes and 1,289 edges in `data/graph.json`, measured from a read-key clone on 23 September 2026. The four-world edition of 20 September was 617 nodes and 694 edges; that figure is kept below as the dated snapshot it was | | **Checks** | 13 of 13 passing in `data/validation.json`, with 6 known gaps published beside them | | **Licences** | DSIT source text: Open Government Licence v3.0, attributed, with no departmental logos or crests. Application and graph code: created for this edition, with no additional licence assigned by the release; the owner may choose one separately. Bundled sql.js and marked: MIT. SQLite: public domain | | **What this is not** | Not an official DSIT service, standard, certification or conformance assessment. No validated risk scoping, no claim of organisational adoption, no user-tested effectiveness. A prototype for testing with intended users | ****Provenance and the credential**** **The key is the whole credential.** Read key: `sgit_public_read_cdc00d2baaf75361d86ae1b7a40169bd98d71aaae1bd581e181a0f0ba0e0e6bb:0q4sfr57` In the official UI: [open it read-only in a new tab](https://dev.vault.sgraph.ai/#sgit_public_read_cdc00d2baaf75361d86ae1b7a40169bd98d71aaae1bd581e181a0f0ba0e0e6bb%3A0q4sfr57) · From the CLI: `sgit clone sgit_public_read_cdc00d2baaf75361d86ae1b7a40169bd98d71aaae1bd581e181a0f0ba0e0e6bb:0q4sfr57` Published under the `sgit_public_read_` prefix, which is the form for a key published on purpose. It grants read and only read; the owner credential is kept outside the vault, as its README says. Classified before it touched anything, and verified with an all-zeros negative control at first publication: the real key produced 42 files, the control an empty directory. [What the prefixes declare →](../../../docs/credentials.md) ### Derived facts, 23 September 2026 From `admin/build/catalogue_derive.py 0q4sfr57 ` and a read-key clone, no token: **155 files** · 12.1 MB plaintext · 14 commits · HEAD `obj-cas-imm-16ef099d1561` · app entry `index.html` declared in `.vault/app.json` with `fs.read`, empty `write` and `delete`, downloads and external links · one deck in `decks/decks.json` (type `decks/v2`), 8 slides, 5 screenshots, PDF `deck/DSIT_AI_Risk_Use_Case_Journey.pdf` with SHA-256 `36f9e16c295824c09e4acffa0c0370f4a66c0fd01c58068f733857c8de4e1cf6` · 6 version records, current 0.2.3 · 5 hashed source snapshots retrieved 20 September 2026. ### The pre-publication audit | Checked | Result | |---|---| | Credentials and secrets | **None.** No vault key, no credential under any `sgit_private_` prefix, no API keys, tokens, `delete_auth` or `append_token` values, no private-key blocks. The public read key appears in the deck's last slide and in the PDF's link annotation, on purpose | | Personal data | **None.** Two email addresses appear, `alt.formats@dsit.gov.uk` and `psai-tech@dsit.gov.uk`, both published institutional contacts carried over from the official publication. The deck's second slide paraphrases a public LinkedIn comment and says it did not verify the post or claim endorsement | | Its own checks | Re-read from `data/validation.json`: 13 of 13 passing, 6 known gaps published | | Attribution | OGL v3.0 acknowledged, no crests or logos used, external standards referenced and not reproduced, official status disclaimed on the front page, in `NOTICE.md` and on every slide's footer | ### The historical snapshot, 20 September 2026 First published as row #31 with 42 files, 3.2 MB, 617 nodes and 694 edges across 3 partitions and 4 worlds, 8 predicates all with declared inverses, 8 of 8 checks passing, and 2 released versions with 0.1.1 current. Those numbers described that edition and are kept here with their date. The four screenshots in the section above were taken from it. The usual rule applies to this key as to every other one here: **revocation is not retroactive**. Anyone who fetches these objects keeps them. A rung on [Fractal Semantic Graphs](../../fractal-graphs/index.md), beside the [Regulation Graph](../regulation-graph/index.md) whose sql.js copies it reuses. [← All published vaults](../index.md) · [The publishing method](../publishing.md) · [Decks from a vault, on a site](../../../docs/briefs/vault-decks-on-a-site.md) ============================================================================== # Publishing a vault: the method, sgit.ai > The seven steps behind every vault published here, written for another agent to follow: classify the credential before it touches anything, derive rather than refuse, audit with the read key, derive the facts, capture evidence by driving the real product, write the page, and record what outlives it, plus the mistakes that produced each rule. > > Page: https://sgit.ai/demos/vaults/publishing.html [Home](../../index.md) / [Vaults](index.md) / Publishing a vault # Publishing a vault: the method Every vault in this section went through the same seven steps. This page is that method written down so another site, or another agent, can follow it. It is deliberately specific: the commands are real, the tools are in this repo, and the rules are the ones learned by nearly getting them wrong. **Who this is for.** An agent maintaining a site that publishes vaults. Read the [markdown twin](publishing.md) if you are one. The tooling referenced lives in `admin/build/` of the sgit.ai repository and is small enough to copy rather than depend on. ## The two rules everything else serves | Rule | Why it is absolute | |---|---| | **Read keys yes, vault keys never** | A read key is a capability handed out on purpose and cannot become write access. A vault key is read *and* write; publishing one hands the vault to anybody | | **Audit before the key, not after** | Revocation is not retroactive. Anyone who fetches the objects keeps them, so an audit that happens after publication has not happened | ## 1 · Classify the credential before it touches anything Do this first, before the credential is pasted into a page, a script or a commit. Credentials arrive mislabelled. It has happened three times here, each time a vault key described as a read key. ``` python3 admin/build/check_credential.py '' # exit 0 → read-only, safe to publish # exit 1 → write credential (or unrecognised) — stop ``` It classifies two ways, because the problem has two eras: by **prefix** for vaults new enough to emit one, and by **shape** for everything older, a read key is 64 hex characters, and anything else before the colon is a passphrase, which means write. **Publish it under the prefix that declares what you are doing.** `sgit_public_read_` is a read key meant to be published; `sgit_private_read_` is one meant to be kept secret. Same bytes, same access, opposite declaration, and the build now refuses the second in any tracked file. [The five prefixes and what each declares →](../../docs/credentials.md) ## 2 · If it is a vault key, derive rather than refuse A vault key does not block publication; it changes what you publish. Store it where the repository cannot commit it, then derive: ``` # the gitignored tier — the release tripwire then scans every tracked file for it printf '%s' "$VAULT_KEY" > admin/local/demo-keys/-vault-key python3 - <<'PY' from sgit_ai.crypto.Vault__Crypto import Vault__Crypto c = Vault__Crypto() pw, vault_id = c.parse_vault_key(open('admin/local/demo-keys/-vault-key').read().strip()) print(c.derive_keys(pw, vault_id)['read_key']) # publish only this PY ``` The derivation is one-way: a published read key cannot be turned back into the vault key. Never print the write key; never let the vault key reach a tracked file. ## 3 · Audit with the read key, across every file Open the vault with the *read* key, the credential your readers will have, and scan every text file. Look for: the vault's own key (this has really happened, and forced a republish), API keys, tokens and `delete_auth` values, private-key blocks, personal data, and operational bookkeeping under `.vault/`. **Ruling hits out is the work.** Scanners produce false positives and that is normal: a phone-number pattern matching `0123456789` inside a minified library; an `sk-test-…` string that turns out to be a fixture in a test asserting a leaked key *is* caught. Read every hit. Publish the interesting ones, a finding explained is worth more than a clean sheet asserted. ## 4 · Derive the facts rather than describing them ``` python3 admin/build/catalogue_derive.py ``` File count, size, commit depth, HEAD, top-level layout, file types, app entry points and browser-renderability, all from the read key, no token and no clone. A human supplies only what a human knows: what it is for, and whether it is production or a sketch. ## 5 · Capture evidence by driving the real product Screenshots should be of the actual vault, produced by a script that opens it with the published read key and performs the navigation being described. Mock-ups age into lies; a capture script re-runs. ``` node admin/build/capture_shots.mjs --vault ``` Each shot declares a surface (the app, or the vault browser), the steps, and the crop. Steps can click in the app frame, drive shadow-DOM controls, type into the debug REPL, expand folders or switch views. Store the images beside the page (`demos/vaults//images/`) so a vault's folder is self-contained. ## 6 · Write the page: describe, then show, then admit | Section | What goes in it | |---|---| | Lead + why this one | What the vault is, and the one thing it demonstrates that others do not | | The credential, in the open | The read key, a CLI command, and a link that opens it in the official UI. Say plainly that it grants read and only read | | Live embed | Both surfaces, opened over the embed protocol so the key never enters a URL or the frame's storage | | Walkthrough rows | Alternating prose and screenshot, one row per non-obvious thing. This is where a reader learns what a live embed cannot tell them | | What it demonstrates | A feature table naming the mechanism, not the marketing | | **The audit, honestly** | What was scanned, what was found, and what it means. Findings included | | Derived facts | Step 4's output, with the tool named so it can be re-run | ## 7 · Record the things that outlive the page Per entry: the **shape** (the workflow it resembles, not its domain), the **evidence status** (production, demonstration, or sketch), whether it is a copy or a live reference, and the **write-key status**: escrowed or lost. A vault whose write key is lost is frozen: readable forever, never correctable. Say so where a reader will see it. ## What we got wrong, so you do not have to | Mistake | The rule that came out of it | |---|---| | A vault published its own write credential inside its content | **Republish, don't retrofit.** A sanitised copy into a fresh vault also sheds the history you cannot publish | | A vault key submitted as a read key, three times | Classification is a check, not a habit, step 1 | | A test reported a refusal that was really a truncated clone | Re-run before recording. A result you cannot reproduce is not evidence | | Our own tripwire banned the string we needed in order to teach people to recognise it | Make the rule *precise*, not stricter: fire on the prefix plus a credential character, so documentation can name it | | A read key was published in front of a vault carrying an LLM config | Check, do not assume: we attempted to unseal it with the published read key, and AES-GCM refused. State the result either way | The best statement of the vault-side rules is not ours: the [Risk Graph Explorer](risk-graph-explorer/index.md) carries a `PUBLIC.md` whose three build-enforced rules (nothing private committed, no write token, **no metered capability**) are the version to copy if you are building a vault intended for publication. ## The tools, in one list | Tool | Does | |---|---| | `admin/build/check_credential.py` | Classifies a credential; exit code says publish or stop | | `admin/build/catalogue_derive.py` | Read key → the facts, read-only and no token | | `admin/build/capture_shots.mjs` | Drives the live vault and crops evidence screenshots | | `admin/build/validate.js` | The release gate, including the key-leak tripwire | | `admin/build/compare_tests.py` | Executes the claims that can be executed, with dates | ============================================================================== # The same pack, written for an archetype instead of a company, fractional CISO pack > Sibling of vault #29 from the same generator: a fractional CISO pack that solves the publication problem by describing a type of company rather than withholding a real one. Five documents in four formats, a one-page infographic, an engagement document with a twelve-month map and a section on what two days a month is not, and the audit stated in full. > > Page: https://sgit.ai/demos/vaults/fractional-ciso-pack/index.html [Home](../../../index.md) / [Vaults](../index.md) / Fractional CISO application pack # The same pack, written for an archetype instead of a company A sibling of [vault #29](../interim-ciso-pack/index.md) from the same generator, one day later, and the interesting difference is how it solves the privacy problem. That pack described a real role and *withheld* the company. This one describes **a type of company**, derived from public sources, so there is nothing to withhold. Same three routes, same thirteen recommendations, a different argument: two days a month, on a retainer, for a business that is already certified. **Open it yourself. The key is the whole credential.** Read key: `sgit_public_read_7c84275ebcbbf312dbbec4713a00c83fb0dd8520b6a52b082d7ff81e3523c40e:eaba68j5` In the official UI: [open it read-only in a new tab](https://dev.vault.sgraph.ai/#sgit_public_read_7c84275ebcbbf312dbbec4713a00c83fb0dd8520b6a52b082d7ff81e3523c40e%3Aeaba68j5) · From the CLI: `sgit clone sgit_public_read_7c84275ebcbbf312dbbec4713a00c83fb0dd8520b6a52b082d7ff81e3523c40e:eaba68j5` Submitted as a read key and published unchanged. No company is named anywhere in the vault, and none is implied, see the audit below. The pack's own one-pager. Everything on it is also in the vault as data. The infographic is a rendering of `content.json`, not a separate document. ## See it live, here [Open the vault in a new tab ↗](https://dev.vault.sgraph.ai/#sgit_public_read_7c84275ebcbbf312dbbec4713a00c83fb0dd8520b6a52b082d7ff81e3523c40e%3Aeaba68j5)The document viewer wants the room. ## The idea worth stealing: describe the category, not the company Vault #29 had to be audited for whether an unnamed FTSE 250 client could be inferred from what was said about it. This pack removes the question. Its company route opens with the sentence *“this pack is written for a type of company rather than a named one”*, and then describes the type in six rows, what it does, who buys it, where the risk sits, what it already has, what it usually lacks, who governs it: > “A venture-backed UK software company, post-Series A, somewhere between 40 and 100 people, whose product processes other people's most sensitive personal data.” Everything after that *follows from the archetype*: third-party and sub-processor risk as the highest-value work, assurance as a revenue lever, data minimisation as a decision rather than a project. The pack says so itself: *“if the company you have in mind is different in any of these respects, the engagement below changes shape, and that conversation is a better first meeting than a pitch.”* That is a better answer to the publication problem than redaction, and it generalises: **a document written for a class can be published; a document written for an instance has to be scrubbed.** The company route leads with the archetype. Fourteen sections follow it, including *What it is not*, *Conflict* and *Tensions*. ## What changed from #29, precisely | | [#29, Interim](../interim-ciso-pack/index.md) | #30, Fractional | |---|---|---| | **The role** | Six months, near full-time, a dated regulatory deliverable | Two days a month, ongoing, a board advisory retainer | | **The reader** | A specific FTSE 250 company, withheld | **An archetype**, described in six rows from public sources | | **The company folder** | A strategy brief with a disclosed redaction | `company-archetype.md`, nothing to redact | | **Documents** | Four, in four formats | **Five** in four formats, plus an infographic as PNG and PDF, plus the three 2019 decks rendered in the viewer | | **New document** | none | *The engagement*: the monthly rhythm, a twelve-month map, and a section headed *What two days a month is not* | | **Shared** | The generator, the CV facts, the thirteen recommendations, the three routes, the agentic team, and the deliberate absence of any rate or tax status | The README states the relationship in one paragraph and ends it with the line that matters for both: *“Rates and tax status are deliberately absent from both.”* ## The section to read first is the one that says no The engagement document's strongest passage is a list of what two days a month *is not*. Not cover, *“if something goes wrong at three in the morning, a fractional advisor is not the incident manager.”* Not a Data Protection Officer. Not delivery. Not an audit. And not a substitute for a full-time CISO once the company needs one, *“part of the job is saying when that point arrives.”* The *Honest tensions* section goes further and names the economic one: a fractional CISO is cheaper than a permanent one, *“and that same economy can be used to defer a hire the company genuinely needs. Naming the trigger early is the only honest defence.”* A sales document that identifies how it could be misused against the buyer is rare enough to be worth pointing at. Five documents, each as PDF, Word, Markdown and JSON; the infographic as PNG and PDF; and the 2019 decks now rendered in the viewer rather than only archived. ## The pre-publication audit Run against a full clone with the published read key. The pack's own claim, *“no company is named anywhere in this pack … nothing here depends on inside knowledge, which is why it can be published”*: checked rather than accepted: | Checked | Result | |---|---| | Company identification | **None, and none implied.** The reader is an archetype in six rows. The only company names in the vault are the candidate's past employers, from a public CV | | Rates, fees, tax status | **Absent.***Retainer* appears as a word with no figure attached; the only monetary values are statutory penalty amounts | | Contact details | One email address, the candidate's long-public OWASP one; the infographic adds public LinkedIn and GitHub handles. No phone, no address | | Credentials and secrets | **None** | | Named third parties | The same thirteen recommendations as #29, from the candidate's own 2019 CC BY-SA deck, labelled with their 2019 titles. Not reproduced on this page | | Read key | Verified with an all-zeros negative control against the same vault id: real key 72 files, control an empty directory | ## Shape | **Vault** | `eaba68j5` · 72 files · 19 MB | |---|---| | **App** | `index.html` with CSS, JS and a fallback copy of `content.json` inlined; PDF.js loaded through `sg.loadJs` inside a host, page images as the fallback | | **Permissions** | `downloads: true`, and nothing else. No writes. The HUD hides the vault name and shows the app title | | **Documents** | Six distinct: two CVs, the case, the recommendations, *the engagement*, and the infographic, 21 recruiter files across the formats, 18 pre-rendered page images | | **Licence** | Content CC BY 4.0; the 2019 decks and recommendation slides CC BY-SA as originally published; PDF.js Apache-2.0 | Published as row #30. Its sibling is [#29](../interim-ciso-pack/index.md); the two are worth reading as a pair, because they are the same machinery giving two different answers to *how do you publish a document about a job*. [← All published vaults](../index.md) · [The publishing method](../publishing.md) ============================================================================== # An application for a job, as a vault, interim CISO pack > A candidate pack delivered as an encrypted vault instead of a CV on an email: three routes for three readers, four documents each in PDF, Word, Markdown and JSON, a disclosed redaction, and a client named nowhere, with the pre-publication privacy audit stated in full. > > Page: https://sgit.ai/demos/vaults/interim-ciso-pack/index.html [Home](../../../index.md) / [Vaults](../index.md) / Interim CISO application pack # An application for a job, as a vault A candidate pack for an interim CISO role, delivered as an encrypted vault instead of a CV attached to an email. **Three routes through one artefact** (the recruiter, the hiring company, and anyone curious) over four documents that each exist as PDF, Word, Markdown *and* JSON. The claim it makes about how the candidate works is the same claim the artefact demonstrates by existing. **Open it yourself. The key is the whole credential.** Read key: `sgit_public_read_699401f6cb3bdb1d6e19bfa690d8e0006a5379070ff320b5a8ae2fc21968f5c9:8brojsem` In the official UI: [open it read-only in a new tab](https://dev.vault.sgraph.ai/#sgit_public_read_699401f6cb3bdb1d6e19bfa690d8e0006a5379070ff320b5a8ae2fc21968f5c9%3A8brojsem) · From the CLI: `sgit clone sgit_public_read_699401f6cb3bdb1d6e19bfa690d8e0006a5379070ff320b5a8ae2fc21968f5c9:8brojsem` Submitted as a read key and published unchanged. **The hiring company is not named anywhere in the vault**: see the audit below. ## See it live, here [Open the vault in a new tab ↗](https://dev.vault.sgraph.ai/#sgit_public_read_699401f6cb3bdb1d6e19bfa690d8e0006a5379070ff320b5a8ae2fc21968f5c9%3A8brojsem)The document viewer needs room, better in its own tab than in the frame. One artefact, three declared readers, and a front page that tells you which one you are. ## The idea worth stealing: the pack is the evidence Every candidate pack asserts something about how the candidate works. This one is constructed so that the assertion and the demonstration are the same object. Its own front page says it plainly: > “This pack is itself an example of how he works: a voice memo became a brief, a team of AI agents researched and built the material, and it is delivered as an encrypted, versioned vault.” A claim to work with agents, made in a document that agents built. A claim about handling sensitive material, made in an artefact whose server cannot read it. The reviewer does not have to believe the claim, the thing in their hands is the test of it. ## Three routes, because three people read a CV for different reasons The interesting structural choice: rather than one document that compromises between audiences, the pack splits at the front door and lets each route stand alone. | Route | For | What is behind it | |---|---|---| | **Recruiter** | The person putting the candidate forward | An embedded document viewer, four documents in four formats each, **a submission summary to copy**, key facts, and answers to screening questions, the things a recruiter has to paste into a form | | **Company** | The hiring organisation | The mandate, the shape of the function, the regulatory calendar, a four-stage plan, a typical week, **what to settle before signing**, a conflict disclosure and a section titled *honest tensions* | | **About** | Anyone | A skills map, a career timeline, thirteen recommendations, the agentic team and its rules, and how the pack was built | A recruiter needs text to paste; a hiring manager needs an argument; a curious reader needs context. Those are genuinely different documents, and the vault holds all three without any of them being a compromise. The company route runs to eleven sections, and two of them are *Before signing* and *Tensions*. ## Four formats, and the fourth is the interesting one Each of the four documents (short CV, full CV, the one-page case, the recommendations) exists as **PDF, Word, Markdown and JSON**, generated from one source by the pack's own build. PDF is for the human. Word is because recruiters still ask for it. Markdown is for whoever pastes it somewhere. **JSON is the one that matters**: a CV as structured data, so a machine reading the pack gets fields rather than a page it has to parse. It is the same instinct as this site's [`llms.txt`](../../../llms.txt), publish the thing, and publish it again in the shape a machine wants. Page counts and byte sizes are computed at build time and recorded with SHA-256 hashes, so the sidebar cannot describe a file it did not produce. ## The build refuses what the authoring contract refuses The pack's own pipeline fails if the page declares a vault resource with ``, `` breaks out of the bootstrap that runs it. ### The PDF is a download, and this is not a preference The obvious move (decrypt the PDF, wrap it in a blob, point a sandboxed iframe at it) does not work. Chrome refuses, in every sandbox combination: > `Failed to load 'blob:…' as a plugin, because the frame into which the plugin is loading is sandboxed.` The browser's PDF viewer is a plugin, and plugins do not run in sandboxed frames. Your three options are: drop the sandbox (gives vault bytes your origin, do not), ship a JavaScript PDF renderer (works, costs about a megabyte of vendored dependency), or **decrypt in the page and hand the bytes to the browser's own download**, which is what this site does. Trigger the download from the page and not from inside a frame: a sandbox without `allow-downloads` blocks it, and granting that to untrusted content is the wrong way round. ## Two mistakes we made, so you do not 1. **An image-name pattern that excluded underscores.** Fifteen slides rendered with a silently missing screenshot, no console error, no gap in the layout, nothing to notice by clicking through a few slides. Accept `[A-Za-z0-9_.-]` in image names, and **assert that the count of unresolved images is zero** rather than trusting the page to look right. 2. **An unscoped `closest('[data-deck]')` in the click router.** On a page dedicated to one deck the mount element itself carries `data-deck`, so every click inside the viewer matched it and returned early: prev, next, notes, focus and the PDF button were all dead, on exactly the pages just built, with nothing thrown. Scope event delegation to the control you mean, and **test the effect of a click, not that the click landed**. ## Before you call it done - Walk **every slide of every deck** in a real browser and assert zero unresolved images. Ours is 113 slides across 9 decks; the walk takes under a minute and found the bug above. - Confirm the render frame has **no** `allow-scripts`, and that the parse frame has **no** `allow-same-origin`. - Download a PDF and check the byte count against the file in the vault. Ours matches exactly at 2,220,725 bytes. - Check that a deep link to a slide restores that deck and that slide. - **Check what you published.** Read keys on the page are fine and are the point; a vault key on a page is a catastrophe, because it is write access. Grep the built site for vault-key shapes before every release, and note that a scan built for *sgit* credential shapes will not catch an unrelated API key sitting in a vault file, which is how we once nearly published an OpenRouter key. ## The prompt to hand the builder agent Copy this, replace the uppercase placeholders, and give it to the agent that owns the site: ``` Add a deck viewer to SITE so the presentations in vault VAULT_ID play on the page, read live with the published read key READ_KEY. Read https://sgit.ai/briefs/vault-decks-on-a-site.md and https://sgit.ai/vault/reading-a-vault-file.md first. A working implementation is assets/vault-deck.js and assets/vault-embed.js on sgit.ai; copying it is expected. The rule that governs the design: the viewer is the site's and the data is the vault's. Every control belongs to the site. Vault content renders only inside sandboxed opaque-origin iframes — the deck source in one with allow-scripts and default-src 'none', the slide markup in one with scripting off entirely and only data: images permitted. Never eval vault code in the page origin. Never put a decrypted PDF in an iframe; decrypt it in the page and hand it to the browser's own download. The vault publishes decks/v2: a manifest at decks/decks.json or decks.json, deck sources at decks/DECK_ID.js pushing {t, notes, html} onto S, screenshots at deck/img/NAME.jpg referenced symbolically by a data-img attribute, the deck's CSS in the style block of decks/shell.html, and PDFs at deck/FILE.pdf. If the vault published only built decks, take the largest script block out of the deck's HTML file and truncate it at the comment /* ---------- shell */. The stage is 1600x900: size the frame to that and scale the element. Done means: every slide of every deck walked in a browser with zero unresolved images asserted, a PDF downloaded and byte-count-checked against the vault, deep links restoring deck and slide, and the built site grepped for vault-key shapes. Report the slide count, the deck count and the missing-image count. ``` Written from building exactly this, at [v0.2.67 and v0.2.68](../../admin/versions.md). If you follow it and something here is wrong, that is worth telling us, the last brief on this site was corrected by the team that read it, and [the correction sits above the mistake](vault-telemetry-append-lanes.md). [All briefs](index.md) · [Reading one file out of a vault](../vault/reading-a-vault-file.md) · [The live result](../../demos/vaults/aiuc-1-conformance/decks/index.md) ============================================================================== # For graphs.sgit.ai: Fractal Semantic Graphs, and what to change > A brief for the agent maintaining graphs.sgit.ai: the fractal claim on its boundaries page has the invariant backwards (grammar survives every zoom, the ontology is free to change), the name Fractal Semantic Graphs and its lineage, six places to link the sgit.ai page, four graph vaults missing from its evidence estate, a second cross-vault finding, three small corrections, and the prompt to paste. > > Page: https://sgit.ai/docs/briefs/graphs-sgit-ai-fractal-semantic-graphs.html [Home](../../index.md) / [Docs](../index.md) / [Briefs](index.md) / For graphs.sgit.ai **Surface:** a sibling site's pages, graphs.sgit.ai. [The three code surfaces →](../surfaces.md) # Fractal Semantic Graphs: what graphs.sgit.ai should take from the sgit.ai page A brief for the agent that maintains [graphs.sgit.ai](https://graphs.sgit.ai/). On 19 September 2026 sgit.ai published [**Fractal Semantic Graphs**](../../demos/fractal-graphs/index.md): a definition of the term, three diagrams, and seven live vaults walked as one ladder from the text of a law to a threat on a compute instance. It is now the fullest worked application of that site's two theses, *meaning through connectivity* and *thinking in graphs*, and it corrects one sentence that site currently has backwards. This brief lists what to change, what to link, what to reuse, and what to leave alone. Checked against graphs.sgit.ai v0.6.20 and its `llms.txt` on the date above. **The one-line version.** Where graphs.sgit.ai says *identical rules at every altitude*, it should say *the same grammar at every altitude, and a different ontology at each*. Everything else in this brief follows from that distinction. ## 1. The correction: grammar is what survives the zoom, not schema The boundaries page (`/v1/depth/boundaries.html`, section *Fractal is a precise claim, not a decoration*) defines the claim in a four-row table and a closing sentence. As published today: | Row on the page | What it says now | The problem | |---|---|---| | **Self-similarity** | “The same node-and-edge grammar at every altitude. A property, a paragraph, a person, a national estate: same rules.” | Correct if *rules* means grammar. Read as schema, it describes a hierarchy. | | **Recursion** | “Zoom into any node and it expands into a graph obeying identical rules, with no new format and no special case.” | Backwards. A node whose inside has identical types and verbs to its outside is a folder in a folder. The fractal case is the one where the inside has its own types, its own verbs, its own taxonomy: a new ontology, a special case, still joined by an edge to the level above. | | **The test** | “If zooming in requires a different file format, a different validator, or a special case, the claim is false.” | Half right. A different *validator* or a different *grammar* (the graph stops being a semantic graph and becomes JSON-plus-prose) does break the claim. A different *schema* is the claim working. | | **The source quote, same section** | “there might be an article that is so meaty that it requires its own ontology and taxonomy, and that's the power of the fractal element.” | This is the author saying the right thing, on the same page, two paragraphs below the table that says the other. The page contradicts itself and the quote is the side to keep. | The same wording appears in two more places and should change with it: sentence 9 of *The thesis in nine sentences* in `llms.txt` (“zoom into any node and it expands into a graph obeying identical rules”), and the *For an agent* block at the foot of the boundaries page (“if zooming into a node needs a new format or a special case, the system is hierarchical, not fractal”). ### Proposed replacement text For the table, in the page's own register: | Claim | What it commits you to | |---|---| | **Self-similarity** | The same *grammar* at every altitude: every edge a verb with a named inverse, meaning in connectivity not properties, supersede never delete, provenance kept. Never the same schema. A property, a paragraph, a person and a national estate share the grammar and nothing else. | | **Scale invariance** | One validator, one query engine, one provenance rule. They check the grammar, so they run unchanged over any ontology. | | **Composition** | Graphs combine into graphs by declared edges between them, never by merging their ontologies. Risk registers of risk registers, each in its owner's vocabulary. | | **Recursion** | Zoom into any node and it expands into a graph with *its own* ontology: its own node types, verbs and taxonomy, chosen by whoever owns that altitude, still obeying the shared grammar and still joined by an edge to the node you opened. The meaning of a node is supplied by the ontology at the altitude where it sits. | For the test, one sentence in two halves: *If zooming in lands you in the same types, verbs and rules all the way down, you have a hierarchy, not a fractal; a folder tree is the clean example. If zooming in needs a different grammar, so that the inside is no longer a semantic graph, the claim is false. Between those two, every zoom that opens a new ontology joined by an edge to the last is the claim working.* For the agent block and sentence 9: *Fractal means the grammar survives every zoom and the ontology does not have to: zoom into any node and it expands into a semantic graph with its own types and verbs, connected by an edge to the level above.* ## 2. What to adopt from the sgit.ai page Four things on the sgit.ai page are stated more sharply than anywhere on graphs.sgit.ai today, and belong there. - **The name and its lineage.** The term is *Fractal Semantic Graphs*. The author's earlier names, *graphs of graphs of graphs* and *ontologies of ontologies of ontologies*, should be recorded as the lineage, because visitors arrive knowing the older phrases. Review r001 already lists the retitle as an agreed item with state *commented; nothing changed yet*. This brief is the input for doing it. - **Where a node's meaning comes from.** *Meaning through connectivity* is the site's thesis. The sgit.ai page makes it precise for the fractal case: the core meaning of a node is supplied by the ontology at the altitude where it sits, and the same node means different things at different altitudes. Article 9 is a binding provision in a graph of instruments, a container of paragraphs inside the regulation, and a source of definitions to the paragraph that cites it. Same node, different edges around it at each level. That sentence should sit next to the thesis on the home page. - **Every connection should teach you something, and one of them is a jump.** Inside one ontology, knowledge accrues one well-named link at a time; a risk register with ten thousand edges is a great deal of knowledge and not yet fractal. The fractal property is the link on which you jump into another universe with its own rules: from the register's incident fact into security operations, from a suspicious DNS entry into the DNS estate, from one record into a packet capture. In each world the same building blocks appear (nodes, verbs, taxonomy, provenance), and the whole can be one node in a bigger graph. The sgit.ai page walks that example and draws it; the site does not currently say it, and it is the plainest statement of why the fractal property matters. - **Nobody is forced to conform.** The site's *don't merge vocabularies, bridge them* argument (depth page, three layers: shared facts, per-party formulas, declared bridges) is the mechanism; the sgit.ai page states the consequence: an organisation, a division, a team, a person or a regulator can each define their own world and connect by declaring edges. Granularity becomes a decision per situation, so a paragraph can be a mini-world with more definition than the document around it. The two pages should point at each other. Two smaller items worth lifting: the four-word table (graph, semantic graph, ontology, fractal semantic graph, with what each adds and where it stops), which does the cold-visitor orientation the site's *start here* altitude is for; and the nature analogy (universe, galaxy, star system, planet, ecosystem, organism, cell, molecule, atom, particle: the vocabulary changes completely at every altitude while each level stays connected to its neighbours; no schema describes a galaxy and a cell, one grammar describes both), which is the example nobody argues with. ## 3. Where to link the page from | graphs.sgit.ai page | Link to add | Why there | |---|---|---| | Home, beside the thesis | `https://sgit.ai/demos/fractal-graphs/` | It is the fullest worked application of the thesis: seven live graphs, one grammar, eleven ontologies | | `/v1/depth/boundaries.html`, the fractal section | Same, anchored `#what` | The definition and the diagrams, right where the corrected claim lives | | `/v1/examples/index.html` | Same, anchored `#how-far` | The ladder is *a graph at every boundary*, demonstrated across seven vaults rather than argued | | `/v1/vaults/index.html` | The seven vault pages listed in section 4 | The evidence estate is missing four of the seven graph vaults | | `/v1/depth/index.html`, the don't-merge argument | Same, anchored `#everything` | The consequence of the argument, stated for a reader | | `llms.txt`, *Worked graphs* | `https://sgit.ai/demos/fractal-graphs/index.md` | The markdown twin, for agents; it carries the same content with no chrome | ## 4. What to reuse, and the evidence estate to refresh **The diagrams.** All three are inline SVG in the page source, same author, same project, free to lift. The first (`class="fz-*"`) is the three-panel zoom: a four-node semantic graph, the Law node opened into a legal ontology, a paragraph opened into a lexical one, footer *the grammar never changes; the ontology does*. The second (`class="hj-*"`) is the jump: four worlds in a row, risk register, security operations, DNS estate, network capture, each a small graph in its own vocabulary, joined by a jump link on one node each, with a bracket above saying all four are one node in a bigger graph. The third (`class="lad-*"`) is the eleven-rung ladder with a real link per rung. Every text in all three is measured against its viewBox in the build, so they can be embedded at any width without overflow. **The screenshots.** Under `https://sgit.ai/demos/vaults//images/`, taken from the vaults with their published read keys. The Standards Atlas set (`graph.webp`, `graph-alt1.webp`, `beyond.webp`) was captured on 19 September from a read-key clone served behind a shim implementing `sg.vfs` over fetch, since the app refuses to run outside a vault host; the panel text *You are at the top of the fractal* is the vault's own. **The vaults.** The evidence estate on graphs.sgit.ai analyses VoiceDebrief, Regulation Graph, Risk Mandate, Agentic Browser Isolation and Risk Graph Explorer. The ladder uses seven graph vaults; the four not yet on graphs.sgit.ai are marked. One more point on VoiceDebrief, which the estate already covers: its `concepts/principles.md` (P4 everything is a node, P6 fractal descent, P7 the junction rule, P11 altitude, P15 structure points down and meaning radiates out) is the primary source for the definition, dated 9 August 2026, and the sgit.ai page now quotes it as such. The graphs.sgit.ai analysis of that vault should cite the register directly rather than only the junction rule. | Vault | Id | Altitude on the ladder | On graphs.sgit.ai | sgit.ai page | |---|---|---|---|---| | Regulation Graph | `73heuprz` | Law | yes | [regulation-graph](../../demos/vaults/regulation-graph/index.md) | | Standards Atlas GDPR | `4zv4bvmu` | Law and its interpretation | **no** | [standards-atlas-gdpr](../../demos/vaults/standards-atlas-gdpr/index.md) | | AIUC-1 conformance layer | `2wzct4k7` | Standard, evidence, policy | **no** | [aiuc-1-conformance](../../demos/vaults/aiuc-1-conformance/index.md) | | Risk Graph Explorer | `3simlnqe` | Fact, risk, acceptance | yes | [risk-graph-explorer](../../demos/vaults/risk-graph-explorer/index.md) | | Agentic Browser Isolation | `0610gsp9` | Owner, at seven altitudes | yes | [agentic-browser-isolation](../../demos/vaults/agentic-browser-isolation/index.md) | | Licence to Operate | `posrhzp3` | Policy, spent turn by turn | **no** | [licence-to-operate](../../demos/vaults/licence-to-operate/index.md) | | ThreatModCon 2025 | `0ict6flm` | System down to compute | **no** | [threatmodcon-2025](../../demos/vaults/threatmodcon-2025/index.md) | **A second cross-vault finding.** The site's first cross-vault finding is the capability scale. The AIUC-1 conformance layer supplies a second of a different kind: it resolves 62 of the standard's 1,126 published crosswalks into Regulation Graph node ids, node to node across two vaults with a CELEX identifier and a hash on each edge, and the join returns something neither vault knew alone: 8 of the 27 articles reached are amended by Regulation (EU) 2026/1744, so the crosswalk was written against the pre-amendment text. That is *meaning through connectivity* producing a fact, and it belongs in the vaults chapter. **ThreatModCon is the answer to “how far down”.** Eleven linked threat models, Customer to Compute, 51 nodes and 179 threats, with a single SQL injection traced from the method it lives in to the revenue it puts at risk. The site's examples currently stop at the estate; this vault reaches the method and the runtime, and says plainly that those bottom rungs are modelled rather than imported. ## 5. Small corrections found on the way - **Five or seven.** `llms.txt` gives Agentic Browser Isolation *5 stakeholder altitudes* under *Worked graphs* and *7 stakeholder altitudes* under *The book*. The vault's own page says seven. - **sentinel.sgit.ai does not resolve.** The network section of `llms.txt` lists bridges to *sentinel.sgit.ai*; the site is `sg-sentinel.sgit.ai`. Recorded on sgit.ai's network page on 21 August and still present on 19 September. - **The evidence estate's count.** Wherever the site counts the graph vaults published on sgit.ai, the number is now seven, and sgit.ai's full list is thirty at `https://sgit.ai/demos/vaults/llms.txt`. ## 6. What not to change The ban on `relates-to`, the verb-with-inverse rule, *don't merge vocabularies*, *supersede never delete*, *never render the whole graph*, the 10,000-hours story, the four situations where the argument is wrong. The sgit.ai page rests on all of these and quotes several; none of them moves. The only thing this brief asks the site to change about its argument is the one word, and the argument gets stronger for it: *meaning through connectivity* was always a claim about edges, not about a shared schema, and the fractal property is that claim applied at every altitude at once. ## 7. The prompt For the agent working on graphs.sgit.ai. Paste as is. ``` You maintain graphs.sgit.ai. Read this brief first: https://sgit.ai/docs/briefs/graphs-sgit-ai-fractal-semantic-graphs.md and then the page it is about, which is now the fullest worked application of this site's two theses (meaning through connectivity, thinking in graphs): https://sgit.ai/demos/fractal-graphs/index.md (markdown twin) https://sgit.ai/demos/fractal-graphs/ (the page, with the three diagrams) Do these, in this order, as one release with a review entry in the site's own reviews workflow (the retitle is already item 1 of r001, state "commented"): 1. Correct the fractal claim. On /v1/depth/boundaries.html rewrite the four-row table (Self-similarity, Scale invariance, Composition, Recursion) and the "For an agent" block using the replacement text in section 1 of the brief. The invariant across zooms is the GRAMMAR (verb edges with inverses, meaning in connectivity, supersede never delete, provenance); the ONTOLOGY is free to change at every altitude, and a system whose types, verbs and rules are identical all the way down is a hierarchy, not a fractal. Keep the author's quote about the article "so meaty that it requires its own ontology and taxonomy": it is the side of the page that was right. Change sentence 9 of the nine-sentence thesis in llms.txt to match. 2. Adopt the name Fractal Semantic Graphs across the site, with the lineage recorded ("graphs of graphs of graphs", "ontologies of ontologies of ontologies"). 3. Add to the home page, beside the thesis, the precise form of it for the fractal case: the meaning of a node is supplied by the ontology at the altitude where it sits, so the same node means different things at different altitudes. Add "the deeper you go, the more you learn" with the folder-tree contrast, and "nobody is forced to conform" as the stated consequence of the don't-merge argument. 4. Link the sgit.ai page from the six places in section 3 of the brief. 5. Refresh the evidence estate: add the four graph vaults not yet analysed (Standards Atlas GDPR 4zv4bvmu, AIUC-1 conformance layer 2wzct4k7, Licence to Operate posrhzp3, ThreatModCon 2025 0ict6flm), each with a page in the vaults chapter in the existing format, and record the AIUC-1 crosswalk join (62 resolved, 8 amended articles found) as the site's second cross-vault finding. 6. Reuse the three inline SVG diagrams from the sgit.ai page source where they help (class prefixes fz-, hj- and lad-), and the Standards Atlas screenshots, with a line saying where they came from. 7. Fix the small items in section 5: five versus seven stakeholder altitudes, sentinel.sgit.ai versus sg-sentinel.sgit.ai, and the count of graph vaults. Do not change the grammar rules, the don't-merge argument, the 10,000-hours story or the four situations where the argument is wrong. Do not use em-dashes in new prose. Every number you write must come from the vault or page it describes on the day you write it, and say the date. Report what you changed, what you left, and anything in the brief you disagree with, before pushing. ``` Written 19 September 2026 against graphs.sgit.ai v0.6.20. The sgit.ai page it refers to was at site v0.2.95; its version and date are in the chip at the top of the page. [← Briefs](index.md)[Fractal Semantic Graphs →](../../demos/fractal-graphs/index.md) ============================================================================== # An infographic of the published vaults, build brief > A brief for a companion to the network infographic, grouping the 26 published vaults by use case and industry, starting with the two blockers upstream of any image: neither grouping exists in vaults.json yet, and the network infographic it copies has already gone stale in its own headline count. > > Page: https://sgit.ai/docs/briefs/vault-map-infographic.html [Home](../../index.md) / [Docs](../index.md) / [Briefs](index.md) / The vault map infographic **Surface:** a published image, and the data behind it. [The three code surfaces →](../surfaces.md) # An infographic of the published vaults, grouped by use case and industry A brief for producing a companion to the network infographic: the same treatment applied to the **26 published vaults** rather than to the sites, grouped by **what someone is trying to do** and **the industry they are in**. It is written to be executed, and it opens with the two things that will otherwise sink it. The groupings do not exist as data yet, and an infographic is a snapshot that rots. **Do not start with the picture.** Two blockers below are upstream of any image being generated. Fix them first and the infographic becomes a rendering job; skip them and an image model will invent the groupings, which is the one failure nobody will notice until a customer reads it back to us. ## Blocker one: the network infographic is already wrong The companion image this one is modelled on carries a footer reading **“19 sites · 18 published · 1 forthcoming”**, and lists `skills.sgit.ai` as *Forthcoming*. Both were true when it was generated. Today [the network](../../network/index.md) lists **27 sites** and skills.sgit.ai has been live for some time, so a picture that is roughly a week old is now wrong in its headline number and in one of its cells. That is not an argument against making it. It is the constraint the work has to be designed around: - **Every count in the image must be computed from the data at generation time** and pasted in, never estimated, never carried over from a previous version. - **The image carries the version and date it was generated**, in the footer, in the same way [every vault app carries its version](../guidance/index.md#versions). A picture with a stamp is a snapshot; one without is a claim. - **The page that publishes it links to the live list beside it**, so a reader who wants today's answer has one click to it. The infographic is the overview; [the table](../../demos/vaults/index.md) is the truth. - **Regenerating is a scheduled chore, not an event.** Add it to the release checklist as a diff: if the vault count changed, the image is stale. ## Blocker two: neither requested grouping exists yet The brief asks for **use case** and **industry**. Checked against `admin/content/vaults.json`, which is what the vaults table and [the catalogue](../../demos/vaults/llms.txt) are generated from, the fields today are: | Field | Coverage | What it actually is | |---|---|---| | `category` | **26 of 26** | The vault's *shape*, not its use case, Application (5), Analysis (5), Record (4), Reference (4), Presentation (3), Briefing (3), Report (1), Gallery (1). Useful, and not what was asked for | | `job` | **6 of 26** | The closest thing to a use case that exists (“Publish a standard as data”, “Pitch an investor”, “Hand over a report”), but it was added for the homepage bands and covers under a quarter of them | | `industry` | **0 of 26** | Does not exist | **So the first deliverable is not an image, it is two fields.** Add `use_case` and `industry` to every entry in `vaults.json`, and the infographic becomes a view over data the site already publishes, which is the rule the rest of this estate runs on: *indexes are generated from the data they index, because an index maintained by hand becomes a lie on a schedule.* - **Write both fields from the vault, not from its title.** Open each one, read what it does, and say what job it does for whom. The pages under [Published vaults](../../demos/vaults/index.md) already contain that judgement in prose. This is turning it into data. - **Keep the vocabularies small and closed.** Six to eight use cases and six to eight industries, reused; a taxonomy where most values appear once is not a taxonomy. Write the allowed values down in the file and have the build fail on an unknown one. - **Be honest where a vault has no industry.** Several are method demonstrations that belong to no sector. `"industry": "cross-industry"` is a real answer; inventing “FinTech” because a vault mentions money is not. - **Do not delete `category`.** Shape and use case are different questions and the table uses shape. Add, do not replace. ## What the picture has to show Match the network infographic so the two read as a pair: dark ground, one luminous shared foundation at the top, numbered columns beneath it, a footer of counts, and a horizontal band of cross-links near the bottom. | Element | Content | |---|---| | **The foundation** | What every vault shares: encrypted files, version history, and a published read key that is the whole credential. The network image put “sgit.ai vaults” here; this one can say **one vault format** | | **Primary grouping, columns** | **Use case.** Each column is a job somebody is trying to do, with the vaults that do it listed as cells: name plus one short line, exactly as the sites image does | | **Secondary grouping, a mark on each cell** | **Industry**, as a small tag or colour key rather than a second set of columns. Two nested column systems in one image is unreadable; a legend is not | | **The band** | Genuine relationships between vaults, the conformance layer forking the catalogue, the Risk Graph Explorer sharing the licence-to-operate acceptance model. **Carry the same disclaimer the sites image carries**: illustrative links, not deployed integrations | | **The footer** | The computed counts, the site version and the date. Nothing typed by hand | ## The accuracy rules, because an image model will not follow them on its own An image model renders text as shapes. It will misspell a domain, drop a hyphen, invent a plausible vault that does not exist, and produce a confident number that came from nowhere, and none of that throws an error. 1. **Generate the caption text from the data first**, as a list, and treat the image as a rendering of that list. If the list and the image disagree, the image is wrong. 2. **Read every string in the output back against `vaults.json`**: every vault name, every count, every label. Character by character on the names. 3. **Count the cells.** If the data says 26 vaults and the picture shows 24, it dropped two, and it will not tell you which. 4. **No vault appears that is not in the file.** A generated name that reads plausibly is the most dangerous output this process can produce. 5. **If the model cannot render the text reliably, render the text separately.** Generating the artwork and setting the labels as real text over it is a legitimate and more honest answer than fighting the model. ## Publishing it on this site - **The validator bans ``.** Images here go through the `data-shot` mechanism that `assets/shots.js` fills, because a declarative image reference cannot be served when a page is rendered inside a vault. Use the existing pipeline; do not add an exception for this one. - **Write real alt text**, and treat it as the accessible equivalent rather than a caption: an infographic whose content exists only as pixels is invisible to a search engine, to `llms-full.txt` and to any agent reading this site, which is the same gap the video pages had to state. - **Put the grouped list on the page in HTML too**, under or beside the image. Then the picture is the overview and the text is the content, and the `.md` twin carries the substance rather than a broken reference to a picture. - **State how it was made.** The network image was generated by an image model; say so on the page. This site's whole method is that a reader can check the provenance of what it publishes. ## The prompt to hand the agent ``` Produce a vault map infographic for sgit.ai, as a companion to the existing network infographic, grouping the published vaults by USE CASE and INDUSTRY. Read https://sgit.ai/docs/briefs/vault-map-infographic.md first. Do the two upstream steps before generating any image. STEP 1 — the data. admin/content/vaults.json has category on all 26 vaults, job on 6, and no industry field at all. Neither requested grouping exists yet. Add use_case and industry to every entry, written from the vault itself and not from its title, using a closed vocabulary of 6-8 values each, declared in the file, with the build failing on an unknown value. Keep category — shape and use case are different questions. Use "cross-industry" where a vault genuinely serves no sector; do not invent one. STEP 2 — the caption list. Generate the full text of the infographic from vaults.json as a plain list: every column heading, every cell, every count. This list is the source of truth; the image is a rendering of it. STEP 3 — the image. Match the network infographic: dark ground, one shared foundation at the top, numbered columns for use cases, industry as a tag or colour key rather than a second column system, a cross-links band carrying the same "illustrative, not deployed integrations" disclaimer, and a footer with the computed counts plus the site version and date. STEP 4 — check it. Read every string in the image back against vaults.json, character by character on the names. Count the cells against the vault count. No vault may appear that is not in the file. If the model cannot render text reliably, render the artwork and set the labels as real text over it. STEP 5 — publish it. Use the data-shot pipeline, never an img src, which the validator bans. Write real alt text. Put the grouped list on the page as HTML as well, so the markdown twin carries the substance. Say on the page that the image was generated by an image model. Report: the two vocabularies you chose, how many vaults landed in each value, and any vault whose use case or industry you could not determine from its contents. ``` The companion piece is the network infographic, which is what this one should look like and also what it should learn from. It is a good picture with a footer that has already gone stale. [All briefs](index.md) · [Working on a vault: start here](../guidance/index.md) · [The published vaults](../../demos/vaults/index.md) ============================================================================== # Markdown and file viewers in a vault: what not to build (build brief) > Two of the most common asks) a markdown viewer and a file/folder browser with raw views, are already in the vault platform. The ladder from zero code to a full app, the markdown rules that actually catch people, the raw-always contract for a file explorer, and the prompt to hand the builder. > > Page: https://sgit.ai/docs/briefs/markdown-and-file-viewers.html [Home](../../index.md) / [Briefs](index.md) / Markdown and file viewers **Surface:** inside a vault, `_page.json`, markdown, or a vault app. [The other surfaces →](../surfaces.md) # Markdown and file viewers in a vault: what not to build Two of the most common things an agent is asked to add to a vault, **a markdown viewer** and **a file/folder browser with raw views**, already exist in the vault platform. Most requests for them are answered by publishing files in the right shape and writing no code at all. This brief says which surface renders what, gives the ladder from zero code to a full app, and states the one contract to honour if you do build your own. **Read this first, and you may be finished.** The browse view already renders every `.md` file in a vault, and the file tree on its left *is* the folder viewer. If an agent is about to write a markdown parser or a file explorer into a vault app, it is almost certainly solving a problem the host solved already, and the version it writes will be worse, bigger, and will not match the rest of the estate. ## The ladder: stop at the first rung that works | | You write | You get | Reach for it when | |---|---|---|---| | **0 · Nothing** | `.md` files | Rendered markdown, a file tree, tabbed previews, internal links that open as tabs, print | Prose: articles, reports, specs, notes, READMEs. **Start here every time** | | **1 · A layout** | `_page.json` | Hero, sections, galleries, slideshows, card hubs, embedded PDFs, themes, and a `markdown` component that renders one of your `.md` files inside the layout | You want a designed page rather than a document, or a hub that navigates to folders | | **2 · An app** | `index.html` + `app.json` | Anything, computed views, filters, queries over your own data | Only when the answer depends on *computing* something the host cannot know | | **3 · A site viewer** | A viewer on your website | Vault content on a public web page, outside any vault host | The content must live on a normal site. See [the decks brief](vault-decks-on-a-site.md) | The reference for rungs 0 and 1 is [**Publishing content without code**](../vault/content-authoring.md); for rung 2 it is [Building vault apps](../vault/vault-apps.md) and [the window.sg bridge](../vault/sg-bridge.md). This page is the decision, not the syntax. ## Pattern one: the markdown viewer you do not write Markdown is rendered natively on **three** surfaces, and none of them requires code: - **Any `.md` file in the browse view**: click it in the tree, it opens as a rendered tab. Nothing to register. - **The `markdown` component in `_page.json`**: `{"type":"markdown","props":{"file":"overview.md"}}` drops a rendered document into a designed page, or `"text"` for an inline string. This is how you get prose *inside* a layout without duplicating it. - **A markdown file as the vault's front door**: the browse view auto-opens the alphabetically first file, so name the entry point `README.md` or `00-INDEX.md`. A root `_page.json` takes priority over both. ### The rules that actually catch people - **Raw HTML is stripped and shows as escaped text.** This is the single most common failure. Write flat markdown; do not reach for a `div` when a heading will do. - **Size images with the pipe syntax, not HTML**: `![caption|400](img.png)`, `|60%`, `|800x600`. It lives inside the alt text, so the URL stays clean and the file still renders in any other markdown tool. - **Link a folder through its file, not the folder**: `folder/README.md`, never `folder/`. Which file a bare folder link opens depends on sort order, and that is not a contract. - **Nested lists and task lists are not supported.** Neither is HTML. Plan the document around that rather than discovering it after a push. - **Image paths are relative to the `.md` file**, not to the vault root. - **No external URLs for vault assets.** Vault files only, which is what makes a published document unable to phone home, and is a feature rather than a limitation. Front matter adds print control: a `---`-delimited block at the very top can set `page_break_before` and carry a literal `print_css` block, so a document prints as a document. That plus the theme options is usually the whole gap between “a markdown file” and “a deliverable somebody can hand to a client”. ## Pattern two: the file and folder viewer, and the raw view The browse view is already a two-pane explorer: tree on the left, tabbed preview on the right, with `_page.json` pages carrying a `{ } Source` toggle that flips the rendered layout back to its JSON. **If that is enough, you are done.** You need your own explorer only when the vault's files mean something the host cannot know, when a `.json` file is not just JSON but a control, a policy, a graph node, and you want to render it *as* that. [The AIUC-1 conformance vault](../../demos/vaults/aiuc-1-conformance/index.md) does exactly this, and states the principle in its own source: > “A manifest generated at build time, files fetched on click, raw always available and a data view where the build understands the file. **Raw is the point, a catalog that asks to be trusted has to be readable in the form it was written.**” That is the contract, and it is worth adopting whole: | Rule | Why | |---|---| | **Raw is always available, for every file** | A reader that can only show you its own interpretation is asking to be trusted. One that shows you the bytes is offering to be checked. Never let a rendered view be the only way to see a file | | **A reader is an addition, never a replacement** | Files the build understands get a view *as well as* raw. Files it does not understand still open, a file explorer that hides what it cannot parse is hiding the interesting cases | | **Drive the tree from a manifest built at build time** | Walking the vault at runtime to list files is slow and re-derives on every load what the build already knew. Generate the folder/file manifest when you build, ship it as data | | **Fetch a file on click, not up front** | A vault can be tens of megabytes. The tree costs the manifest; a file costs that file | | **The empty state tells the reader the deal** | AIUC-1's says it in one line: *“Pick a file on the left. Raw is always there; files the build understands also get their own view.”* | The same instinct runs through the rest of the estate: `_page.json` has `{ } Source`, every page on this website has a `.md` twin, and the deck viewer offers the printed PDF beside the rendered slides. **Anything rendered should be one click from the thing it was rendered from.** ## Before you call it done - Did you actually need to build anything? If the answer is markdown in a tree, rung 0 was the answer and the app is a liability. - Open every `.md` file in the browse view and look for escaped HTML. That is stripped markup, and it means the document was authored against the wrong renderer. - Every folder link goes to a file, not a folder. - If you built an explorer: every file opens, including the ones with no reader, and raw is reachable for all of them. - Check what you published. [The publishing method](../../demos/vaults/publishing.md) applies here as much as anywhere, read keys are publishable, vault keys never are, and a scan for sgit credential shapes will not catch an unrelated API key sitting in a vault file. ## The prompt to hand the builder agent ``` Make the documents in vault VAULT_ID readable. Read https://sgit.ai/briefs/markdown-and-file-viewers.md first, then https://sgit.ai/vault/content-authoring.md for the syntax. DO NOT WRITE A MARKDOWN RENDERER OR A FILE EXPLORER. Both exist in the vault platform already. Climb this ladder and stop at the first rung that works: 0. Publish .md files. The browse view renders them and its file tree is the folder viewer. Name the entry point README.md or 00-INDEX.md. 1. Add a _page.json if you need a designed page rather than a document. Use its markdown component to pull in the .md files you already wrote, so the prose exists once. 2. Only build an app if a view has to COMPUTE something the host cannot know. Markdown rules that will bite you: raw HTML is stripped and shows as escaped text; size images with the pipe syntax inside the alt text; link folders through folder/README.md and never folder/; nested lists and task lists are unsupported; image paths are relative to the .md file; no external URLs. If you do build a file view, raw is always available for every file, a reader is an addition and never a replacement, the tree is driven by a manifest generated at build time, and files are fetched on click. Report which rung you stopped at and why the rung below it was not enough. ``` Written from the two patterns as they are actually published across the vaults on this site. The syntax reference is [Publishing content without code](../vault/content-authoring.md); the sibling brief for putting vault content on a public website is [Decks from a vault, on a site](vault-decks-on-a-site.md). [All briefs](index.md) ============================================================================== # SG/Vault & the vault platform, sgit.ai > The official working documentation for the SGraph vault platform: the SG/Vault browser app, the SG/Send zero-knowledge API, and vault apps. > > Page: https://sgit.ai/docs/vault/index.html [Home](../../index.md) / SG/Vault # SG/Vault & the vault platform This section is, for now, the official documentation for the SGraph vault platform: the **SG/Vault** browser app, the **SG/Send** zero-knowledge API, and **vault apps**: websites and applications that live *inside* encrypted vaults. Product background lives at [sgraph.ai](https://sgraph.ai); the working documentation lives here. ## What SG/Vault is SG/Vault is the browser client for the same vaults sgit manages from the terminal. It is an **independent implementation of the same encrypted wire format**, not a wrapper around the CLI, kept interoperable through a versioned contract with test vectors (see the [security model](../../security/index.md#interop)). You open a vault by its key, carried in the URL *fragment* (the part after `#`): ``` https://vault.sgraph.ai/en-gb/# # the fragment never leaves the browser — it is not sent in the HTTP request, # so the server serves the app without ever seeing the key ``` From there you get a file browser over the decrypted vault (history, branches, editing) and, if the vault contains an app, **App Mode**: the vault boots straight into its own user interface. ## The three pieces | Piece | What it is | Where it runs | |---|---|---| | **sgit** | The CLI, git workflows over encrypted vaults | Your terminal, your agents' sessions | | **SG/Vault** | The browser client, browse, edit, review, App Mode | Any browser; all crypto via Web Crypto, client-side | | **SG/Send** | The transfer API, stores ciphertext under opaque IDs | The server; the only piece that never sees plaintext | ## Vault apps: the app *is* the vault A vault can contain an `index.html` plus an `app.json`. When the vault opens, the app launches, full-screen, talking to the vault through a runtime bridge, with the encrypted blob serving as both the storage and the distribution mechanism. Sharing the vault link *is* deploying the app. **You are looking at one.** This entire website is a vault app: generated pages, shared assets loaded through the bridge, deployed by `sgit push`. The [admin section](../../admin/index.md) documents its engineering and doubles as the reference implementation. ## Three on-ramps | You want to… | Use | Code needed | |---|---|---| | Publish documents, galleries, hub pages | [Markdown + `_page.json`](content-authoring.md) in the browse view | None | | Ship an interactive experience | [A vault app](vault-apps.md) on the [`window.sg` bridge](sg-bridge.md) | HTML/JS | | Automate, script, collaborate, back up | The [sgit CLI](../index.md), plus [git side-by-side](git-and-vaults.md) and [static hosting](static-hosting.md) | A terminal | [Sub-vaults](sub-vaults.md) cut across all three: vaults pointing at other vaults, rendered inline like folders, composition without copying. ## In this section ## Publish [Content without codeMarkdown + _page.json layouts, themes, print](content-authoring.md) [Static hostingGitHub Pages / S3, zero backend, still encrypted](static-hosting.md) ## Build [Building vault appsThe project shape, app.json, and the authoring contract](vault-apps.md) [The window.sg bridgeThe runtime API, permissions, and the sovereignty rail](sg-bridge.md) ## Compose & integrate [Sub-vaultsVaults inside vaults, links, embeds, extract & seed](sub-vaults.md) [Git repos inside vaultsgit + sgit side by side; the encrypted mirror pattern](git-and-vaults.md) [Building vault apps →](vault-apps.md) ============================================================================== # Building vault apps, SG/Vault > How to build apps that live inside encrypted vaults: the project shape, app.json, the authoring contract, and shipping with sgit push. > > Page: https://sgit.ai/docs/vault/vault-apps.html [Home](../../index.md) / [SG/Vault](index.md) / Vault apps **Surface:** an HTML vault app, inside a vault. [The other surfaces →](../surfaces.md) # Building vault apps A vault app is a single `index.html` (plus data and assets) that lives inside a vault and renders straight from it. The experience and the security are the same artifact: the app ships encrypted, the link-holder holds the key, and the server never sees the page you're reading. ## The project shape ``` my-vault/ ├── index.html # the app — self-contained entry point ├── app.json # auto-launch config (below) ├── content.json # editable content, separate from the app ├── assets/ # css / js, loaded through the bridge └── # the files the app presents ``` Keep content in data files, not in HTML, so you (or an agent) can edit captions, prose, and structure without touching the app. Then the manifest (preferred location `.vault/app.json`; a legacy root `app.json` is still read): ``` { "entry": "index.html", "present": true, # boot into App Mode instead of the file browser "title": "My app", "permissions": { "fs": { "read": true } }, "hud": { "mode": "full" } } ``` One rule with teeth: **an app cannot write its own manifest**: `.vault/**` and the legacy root `app.json` are a protected floor (`EPROTECTED`). The manifest *is* the grant; letting an app edit it would defeat the model. Edit it via the vault browser or sgit. ## The authoring contract Vault pages render inside a sandboxed frame, and the browser fetches declarative resources *before* the vault bridge can install. Anything declarative pointing at a vault path will fail. The contract: - **No** ``, ` ``` ## What works statically, and what doesn't | Call | Static? | |---|---| | Open, browse, read files, history, `sg.vfs.read/readText/list` | ✅ plain GETs | | Large reads | ✅ falls back from presigned to direct GET | | Batch reads | ✅ fan out to parallel GETs, identical result shape | | Writes, deletes, `sg.append.*`, vault creation | ❌ rejected cleanly with `EREADONLY` | A static vault is a **read-only snapshot**: ideal for published docs, reports, dashboards and view-only shares. The app detects it via `sg.app.writable === false` and hides its editing UI; the same HTML runs writable against the live endpoint. *Same app, two backends.* ## The layout, path mirroring is the one hard requirement The live API serves `GET /api/vault/read//`; the static host must serve the vault's encrypted `bare/` tree at exactly that path under your base: ``` / → https://my-org.github.io/my-vault/ └── api/vault/read// └── bare/ ├── data/ obj-cas-imm-* # immutable — cache forever ├── refs/ ref-pid-muw-* # mutable head — no-store ├── indexes/ idx-pid-muw-* └── keys/ key-rnd-imm-* ``` If the repo is your vault's own git remote (working tree + `bare/` committed per the [side-by-side pattern](git-and-vaults.md)), the encrypted tree is already in the repo, publishing is just placing it under the right path prefix. Visitors open `https://…/my-vault/#`: the key travels in the URL fragment (never sent to the host), the transport GETs ciphertext, the browser decrypts and renders. ## Honest caveats - **Read-only and frozen.** The static tree is a snapshot at export time; new live commits appear only when you re-export. - **Paths must match exactly**, or reads 404. (A configurable read-path template is a proposed follow-on, not shipped.) - **Cross-origin setups need CORS** on the static host for GETs; same-origin needs nothing. - **The key is the read capability.** Anyone with the full URL can read the snapshot, that is the point of publishing one, but the host itself only ever holds ciphertext. [← Git repos inside vaults](git-and-vaults.md) ============================================================================== # Admin & engineering, sgit.ai > How the sgit.ai site is built: a vault app with generated pages, bridge-loaded assets, a validation suite, and sgit itself as the deployment pipeline. > > Page: https://sgit.ai/admin/index.html [Home](../index.md) / Admin # Admin & engineering How this site is built, shipped, and versioned. sgit.ai is not hosted on a web server. It is a **vault app**: a set of HTML pages living inside an encrypted SG/Send vault, decrypted and rendered in your browser. The site about sgit is delivered by sgit. ## Architecture ``` # published site — one folder per section; root holds only what must live there ├── index.html · index.md # the front door + its markdown twin ├── CNAME · app.json · robots.txt · sitemap.xml ├── llms.txt · llms-full.txt # machine index; every page in one file ├── why/ · try/ · security/ · skills/ · briefs/ ├── use-cases/ # patterns, each with an evidence status + agent brief ├── case-studies/ # things that actually happened, with numbers ├── docs/ · vault/ · deploy/ ├── assets/ # site.css, site.js, vault-docs.js, try-setup.py └── admin/ ├── content/ # page bodies — one file per page, plus pages.json └── build/ # build_pages.py (the engine) + validate.js ``` ## Adding a page Content and machinery are separate, so nothing in the generator grows as the site does. It was 2,709 lines with every page inlined, and is 648 now that bodies live in `admin/content/`. A new page is a file and a row: ``` # 1. write the body — just the
, no head, no nav, no footer $ vim admin/content/case-studies/my-study.html # 2. register it: { "path", "section", "title", "desc" } $ vim admin/content/pages.json # 3. build and check $ python3 admin/build/build_pages.py && node admin/build/validate.js ``` The build then produces, for free: the page with nav and footer, its `.md` twin with links rewritten to markdown, its row in `llms.txt`, its section in `llms-full.txt`, its entry in `sitemap.xml`, and its canonical, Open Graph and JSON-LD tags. The validator refuses the build if the page is unreachable from anywhere, if a link or a markdown twin is missing, if it carries no structured data, or if it could render invisible without JavaScript. - **The authoring contract.** Vault pages render inside a sandboxed frame, so declarative references to vault files (``, `