VoiceDebrief · Fractal Semantic Graphs
Four apps in one vault: lifting meaning out of text — from fictional voice notes to Article 9(2) of the EU AI Act — into typed semantic graphs. The current app requests read over one folder, write over nothing, and the vault ships the briefings it was built from beside the work: source material dated across June to August 2026, assembled into this vault over two days.
Read key:
sgit_rk1_31e8196d3e83b37277083c29f105b8310dbac4569e22715b5e0f85d46878eec1:k6xy9z4dIn the official UI: open it read-only in a new tab · From the CLI:
sgit clone sgit_rk1_31e8196d3e83b37277083c29f105b8310dbac4569e22715b5e0f85d46878eec1:k6xy9z4dPublished deliberately, and derived: this vault was submitted as a vault key, and only the one-way read key derived from it appears here. It grants read, and only read.
See it live, here
Both surfaces open automatically below. You can also open the app in its own window ↗.
What this vault demonstrates
| Feature | How this vault uses it |
|---|---|
| Read scoped to one folder, write nowhere | app.json declares fs.read over part-4/ and nothing else — no write, no mkdir, at any path. The app is a reader, so the capability it never asked for cannot be misused. The host's own chrome shows the result as R3 W0: three reads granted, zero writes |
| A nested app entry | entry is part-4/index.html, not a root file. The app that opens is four folders into the tree, which is what lets the vault keep four apps without one of them having to own the root |
| Lineage kept, not overwritten | part-2/ and part-3/ hold frozen app snapshots at the state they shipped in; part-4/ is current. A shared Parts nav links all three, so the earlier thinking stays openable rather than surviving only as a commit message |
| Two surfaces, one vault | _page.json gives the vault browser a themed landing page (hero, dark mode, accent #d9a63f); app.json makes the Article 9 app auto-open. The same objects serve a document reader and an application without either being converted into the other |
| The app-folder pattern over the bridge | from part 4 on, each app is a slim index.html shell plus app/styles.css and app/app.js, pulled in at runtime through sg.loadCss / sg.loadJs — the vault's own files loaded over the bridge rather than inlined into one unreadable page |
| Licensing declared inside the vault | LICENSE and NOTICE dual-license the contents: Apache 2.0 for anything executable, CC BY 4.0 for the written packs — with the tie-break stated ("the more permissive reading applies"). Terms travel with the objects, not with the page that links to them |
| Git-compatible by construction | .gitattributes and .gitignore ship inside the vault, and guides/publish-sgit-vault-to-github.md documents the round trip — trust-boundary analysis, the Secrets pattern, and a restore drill. The same tree can be an sgit vault and a git repository, which is how this website is built |
| The source travels with the work | briefings/ is 50 files of everything this was built against, and concepts/ carries a principles register (P1–P15, each with origin, implementation and evolution) plus a notation spec. The reasoning is in the artefact — the difference between a demo and a record |
What is going on here, step by step
The embeds above are the real vault, which makes it easy to scroll past the parts that matter. Each row points at one of them. Every screenshot is of this vault, driven by a script holding nothing but the published read key.
The vault opens four folders deep
Opening the read key does not land you in a file listing. app.json sets auto_open and points entry at part-4/index.html, so the Article 9 app boots directly — with the Parts nav across the top and the seven views as tabs.
Note the chrome: Read-only, and R3 W0. The host is reporting the capabilities this app actually holds, and the write count is zero.
part-4/index.html — badged Read-only, R3 W0.Five annotation layers — and the empty one is the point
The paragraph view renders Article 9(2) with five toggleable annotation classes over it: deontic · 2, defined terms · 5, cross-refs · 2, qualifiers · 4, concepts · 3.
There is a sixth layer, actors, and it is deliberately empty. The app says why: no duty-holder appears anywhere in the text. A view that can show you nothing, and tell you that nothing is the result, is doing something a highlighter cannot.
Six altitudes over the same provision
Intent → five words → one sentence → compressed paragraph → the notation → the text, each rung labelled with what it costs. L4 · intent: "Make risk management a standing duty, not a document." L3 · five words: "Continuously find, judge, address risks" — annotated "lossy on its own — lossless with the links held." L1.5 compresses ~140 words to ~60, with the note that every clause maps to a span; the gap survives compression.
Between each pair of rungs the app prints ↓ compresses · links held. That is the whole claim, and it is checkable rather than asserted: tap a notation line and its source span lights up in the original.
Every term carries two senses, and the gap between them
The Concepts view is a graph page per term. Focus risk management system and you get its Act sense (self-defining: no Article 3 entry — Article 9 defines it functionally), its industry sense (ISO 31000's framework + process; ISO/IEC 23894 for AI), and then the finding:
"The Act names a SYSTEM (something you can audit) where ISO names a FRAMEWORK + PROCESS — close, not identical; the audit surface differs." The divergence is not an error to reconcile; it is the product. Below it sit nine outgoing and three incoming computed edges, external standards among them as first-class nodes.
The grammar answers the question the annotation raised
The Grammar view merges dependency arcs with the word-class tree of the same sentence, then labels the semantic roles on understand: ARGM-MOD shall — the deontic carrier, ARG1 the risk management system, ARG2 as a continuous iterative process — and ARG0 marked implicit, recovered from Art 9(1) + 16(a).
That is the explanation for the empty actors layer two rows up: "Deontic modal + agentless passive: the obligation is explicit and the duty-holder is grammatical absence." The missing party is not an oversight in the drafting or a gap in the extraction — it is a property of the legal register, and the parse is what demonstrates it.
ARG0 implicit.Structure upward, meaning outward
The bow-tie here is not the risk practitioner's diagram. It is the paragraph as a knot with two different axes running through it. Upward is structure, the taxonomy: Regulation (EU) 2024/1689 → Chapter III → Section 2 → Article 9 → paragraph 2. Outward is meaning, the ontology: typed edges with their inverses named, and — pointedly — the gap edge and the undefined threshold marked as such.
The line under the stack is the one to take away: the positional hash is stable under amendment; the content hash moves with the wording. Two identities for the same paragraph, so a citation can survive a renumbering without pretending the text did not change.
Two graphs, one junction — never paragraph-to-paragraph
This is the row that justifies the vault's title. It takes a plain operations paragraph with no regulation in it — a fictional security product, NetSentinel, watching a fictional grid operator's SCADA estate — and lifts it into its own nodes: "nobody signs off on that feed, it just lands", "there hasn't been one since spring", "an engineer copied the model onto a personal laptop".
Then it joins that graph to the Article 9 graph node-to-node, through the intermediate layer. The app states the rule it is obeying: "this paragraph never links to the Act's paragraph. Its extracted nodes link to the NODES extracted from Article 9(2) — the steps, the defined terms, the threshold — and through them to the text." The obligations attach at the twin: the running instance and its telemetry, not beside the risks.
The permission block, read out of the store
Here is the vault's own app.json, opened in the vault browser. The whole manifest is 217 bytes, and the permission block is three lines: fs.read over part-4/.
There is no write grant, no mkdir grant, and no read grant over briefings/, concepts/ or the other parts — the app simply cannot reach them. A commit message in this vault's history dates the change: "declare fs.read [part-4/] grant ahead of the deny-by-default flip". The grant was narrowed before the platform started refusing by default, which is the direction that indicates intent rather than compliance.
app.json: a nested entry, read over one folder, and no write anywhere.The briefings it was built from ship with it
Expand briefings/ in the vault browser and there are 50 files: the VoiceDebrief pack, the fractal-semantic-graphs pack with its supporting documents grouped by theme, and the v0.33.57 interim briefs. Beside them, concepts/ holds the principles register and notation spec, and guides/ the operational how-tos.
The vault's README draws the line explicitly: everything in part-*/, concepts/ and guides/ is produced work; everything in briefings/ is source. A reader with the read key can check the output against the input that produced it, without asking anyone for access to either.
Eighteen commits, and the reasoning is in them
The SGit view lists the whole history against the working HEAD. The messages are not "wip": they record the refactor to the app-folder pattern, the retirement of the root hub so part 4 could boot directly, the rename of the vault, and the licensing commit that added Apache 2.0 and CC BY 4.0.
This matters for a published vault specifically. A read key hands over every commit, not just the current tree — so the history is part of what you publish, and here it reads as a record somebody would be content to have read.
Why this shape matters beyond one provision
The transferable part is the junction rule. Most attempts to connect a regulation to an operation link document to document — a control mapped to a clause, a policy citing an article — and the link is only as good as the sentence somebody wrote around it. Here both sides are lifted into typed nodes first, and the join happens between nodes at an intermediate layer. Any domain with two bodies of text that must be reconciled — a standard and an implementation, a contract and a delivery, an incident and a policy — can borrow it.
The vault-shaped part is that all of this is one credential. The apps, the source briefings that produced them, the licence terms and the full history arrive together, decrypt in the reader's browser, and can be re-derived by anyone. Compare it with Regulation Graph, which takes the other route to the same subject: the whole EU AI Act parsed from official Formex XML and hash-verified to source bytes, where this one works a single provision to exhaustion.
The audit, honestly
Every vault is audited before its read key appears here. This one arrived as a vault key — the legacy passphrase:vault_id form with no prefix to give it away — and was classified as a write credential by admin/build/check_credential.py before it touched anything. The vault key was stored in the gitignored tier, the read key derived from it one-way, and only the derived key appears on this page. That derivation cannot be reversed.
The content scan is clean on credentials: no vault key inside the vault's own files, no sgit_vk1_ or sgit_private_read_ string, no API keys, tokens, delete_auth or append_token values, no private-key blocks, and no .vault/ operational bookkeeping.
Two hits were ruled out by reading them, and both are worth naming because a clean sheet asserted is worth less than a finding explained. A 2FA worked example contains the sentence "Leaked or reused passwords can be tried at scale" — prose about passwords in a risk chain, matched by a pattern looking for assignments. And guides/publish-sgit-vault-to-github.md contains the literal string BEGIN PRIVATE KEY, in a table of the things its .gitignore must exclude. That is the same shape as a mistake this site made itself: a tripwire firing on the exact string a document needs in order to teach people to recognise it.
On personal data: parts 1–3 are built on a corpus the README states is fictional — invented companies, invented voice notes — and the part 4 cyber instantiation is likewise a fictional provider and grid operator. The only real-world entities named are public ones: Regulation (EU) 2024/1689, ISO 31000, ISO/IEC 23894.
The rule that goes with any published key applies here too: revocation is not retroactive. Anybody who fetches these objects keeps them, and rotating the key protects future commits only.
Derived facts
92 files · 1,154 KB · 18 commits · HEAD obj-cas-imm-3026ed53e995 · last updated 10 Aug 2026 · app entry part-4/index.html · 71 markdown, 11 JSON, 3 HTML — derived from the read key alone by admin/build/catalogue_derive.py, the same derivation that populates the catalogue, with no token and no clone.