BendScript — a specification in the ComputeDriven worldlive_deployedThat rung covers the playground at /app/, which parses, validates and content-addresses a document in your browser on this domain — and nothing else here. There is no server, no account and no storage, and the LLM round-trip the spec is gated on has never been run against a real model.
The question this site exists to answer

Can a document be its own graph?

Most formats answer no by construction. Markdown puts a link inside a string and forgets it; RDF keeps the graph and loses the document. BendScript attaches the edge to the span — this exact phrase cites that exact phrase — so the prose and the graph are one object with one identity. Whether that survives contact with a language model is the interesting half, and it is the half nobody here has measured.

Open the playground  See what was checked

20
Corpus documents
29
Edges recomputed
4
Vocabularies exercised
0
Servers your document touches
0
Models the round-trip has been measured against
The one idea

A link that knows what it is doing.

A typed inline link facet is a mark on a span of text that carries a predicate and a target. It is not metadata about the document and it is not a footnote — it is part of the sentence, and it expands deterministically into an edge in the document's graph.

the memory loop closes on every outcome supports bend:bafy…#blk-4.spn-1

The underlined run of text is a span. The pill is the predicate. The tail is a bend: URI that resolves to a span inside another document. On parse, that mark expands into an edge — deterministically and idempotently, so expanding twice adds nothing. A link mark with no predicate expands into no edge at all, which is how an ordinary hyperlink stays an ordinary hyperlink.

What is running, and at which rung

Three things exist here. They are not at the same rung, so they are not in the same list.

A single status for this domain would be a lie in one direction or the other. One artifact answers on the deployed domain, one is a package with a test suite, and one is a draft document.

The playground

live_deployed

Paste a .bend.json document; it parses, validates against §2/§3, expands link marks into edges and computes the content address. All of it client-side — no request leaves the browser and there is nothing to sign in to.

Where: /app/
Witness: Opened from https://bendscript.com/app/ on 2026-08-16 and made to print a CIDv1 for its built-in document.

@bendscript/core

in_tree

The reference parser, validator, canonicaliser, link-mark expander and content-address function, plus the §8 drift harness. TypeScript, two runtime dependencies, Node 20+.

Where: npm
Witness: 96 tests pass — 85 round-trip, 11 harness. The version on npm is 0.1.0-alpha.0, which is also the version this page is stamped with.

The protocol

spec

v0.1 draft. Six primitives, one strict round-trip guarantee (§8.1.1), one measured round-trip property (§8.1.2), five reserved vocabularies and a gating adoption section (§14).

Where: docs/spec/README.md
Witness: A document. Nothing about a draft spec is running anywhere, and §14 says v0.1 is not final until a portfolio product ships a vocabulary.
What is not established

The claim this format exists for has never been run.

The spec distinguishes two round-trips sharply, and only one of them is a guarantee. §8.1.1 — that a parser returns the same structure it was handed — is deterministic, testable, and checked below. §8.1.2 — that a frontier model can edit a document and leave the graph intact — is measured, and the measurement has not happened.

§8.1.2 — the LLM round-trip

spec

The claim the whole format is built for: that a frontier model can modify a .bend document and leave the graph intact. The harness, the drift metric and the thresholds are written and tested; what has never happened is a run against a real model.

Needs: 60 modification tasks across 20 documents and 3 models — roughly 180 API calls. The harness prints its own verdict. Built: harness yes, run no.

A second implementation

spec

The spec says an Elixir, Rust or plain-HTML implementation MUST produce the same id for the same document. One TypeScript implementation cannot demonstrate that; it can only fail to contradict it.

Needs: Anyone. The id is sha2-256 over JCS-canonical bytes wrapped as a CIDv1 with the json multicodec — the table below is the fixture to check against. Built: no.

§14.3 — a portfolio product that actually uses it

spec

§14 is gating: v0.1 is not final until at least one product has committed to bend: URIs and shipped a vocabulary implementation. Graphonomous is the named first adopter and has not started.

Needs: A vocabulary implementation in a product, not a promise in a spec. Built: no.

§4 — the text projection

spec

There is no .bend text syntax. The canonical form is JSON and it is meant to be produced by editors, not typed. A projection is deferred to v0.2 and the spec does not pretend otherwise.

Needs: A grammar, and a reason to have one. Built: no, and deliberately deferred.
Evidence, recomputed at build time

Every id below was produced by the library, not typed onto this page.

The corpus files are checked into this repository. This build imports the published package, parses each one, expands its link marks and computes its content address — and refuses to emit the page if any value disagrees with the frozen record beside it. A number cannot be hand-written onto this site. The ids are the fixture a second implementation has to reproduce.

Corpus documentStructureGraphVocabularyDocument id (CIDv1, json multicodec, sha2-256)
plain prose1 blocks0 edgescorebagaaiera2r4gqoyqnoqmwdlsu6xnjvi5ney5wywtliyqy6r73zi6il244uca
heading paragraph2 blocks0 edgescorebagaaieraiim2khmj2cwp2ksuapfi2ir3cgg75aybu7q2ihtd64jwpkpqyzvq
marks1 blocks0 edgescorebagaaierafmp7ebm2svksve3jjn5oj6ygcbyiyutvnmjdmlkxbz6gkjv26umq
typed link1 blocks1 edgescorebagaaiera32ml6rat5sqdaxkcn7xgtxgko4v7jl4jjxaw4jghevtk76wmux6q
document edges1 blocks1 edgescorebagaaieraqap4kuslufcrm6pes65oklewm3dl6oyeetdka7r6td2u4ks4pkba
list quote code4 blocks0 edgescorebagaaieratq54d4wuiz2ln2sowdiyttudxqc5z72wrww6buixf3vngq6w6h5a
memory vocab1 blocks1 edgesbendscript.memory.v1bagaaierac2zyr2473k7eaiyzgbdqayjygkpw367gogbteeo3rya6bm5bfqgq
nested lists1 blocks0 edgescorebagaaiera6tbxyy25nl4vvniqdjkvaqywevdrxlsnav2f6qpqgbehexaccd2q
embed divider5 blocks0 edgescorebagaaierawepfijfqdskngazha4zlcqljat6wbeivxy5h2mo5jqckx5z5w42a
multi mark span1 blocks0 edgescorebagaaierapwrgybul23z2fcdyacwsreuv7mvmv5vzpaifjijiko7oonkob74a
untyped link1 blocks0 edgescorebagaaiera4v4pqmr6hft3rqsxjme73f3hig6ydydagj4ye2vxlp5mv2hgrvcq
all core predicates1 blocks9 edgescorebagaaierao57xbtz5sftwdjbebqwibr2mvyphfoqgitzgg7u2zapybq2rxasa
edge meta2 blocks2 edgescorebagaaieraedf5g6fxovfcu7tntj6luaogdsnxfgkn3wtp7736cwvnreh4nr4q
supersedes tombstone1 blocks1 edgescorebagaaieraioih54rw6lslw3tlbnjdm3peaubgc6doksablcftbvnufhfqefea
argument vocab3 blocks2 edgesbendscript.argument.v1bagaaierazgxlyz2ny6qeqx7lgydflsfcx5uaxygc4k4frhgpssqzrd553pwa
spec vocab4 blocks2 edgesbendscript.spec.v1bagaaieraxh4hhtg7fgb6k6mm46avsc6waesgcd5uke7nlur6bg5jl6zffx3a
cross doc edges3 blocks6 edgescorebagaaieravie4fk37o5wsudcy3vy7op66cymiekcr4nxavrnm3gariwayhana
unicode emoji3 blocks0 edgescorebagaaieraqb3y54k6ciew5idcbsq2buloipstw3nw2z45usgzv2brwsl7vcba
large document10 blocks3 edgescorebagaaieraqryv6avv3c66ygpweuo2dqlicpukim4earoq5m3its7mlqeztfsq
adversarial3 blocks1 edgescorebagaaierayubxtbbx5tvt43x52ov6yni4ww7kvddzyf4ao2z7dsxa742xuqga

Each row was produced by importing the compiled library, parsing the file at ./test-corpus/v0.1/, expanding its link marks into edges per §2.5.1, validating it against §2/§3, and hashing the JCS-canonical { blocks, edges } with sha2-256 wrapped as a CIDv1. Then the document was re-serialised, re-parsed and re-hashed, and the two ids compared — §8.1.1 exercised at build time rather than cited. id and meta are excluded from the hash, so editing metadata does not invalidate the address (§5.1).

Status

Where this stands, and what would move it.

Status
live_deployed — The playground at /app/ was loaded from this domain and made to compute a CIDv1 document id in the browser. The reference library it mirrors is published, and its parser round-trip holds for the whole v0.1 corpus.
Last verified
2026-08-16
Source
Two measurements on 2026-08-16. (1) npm test — vitest, 96 tests across test/round-trip.test.ts and test/harness.test.ts. (2) https://bendscript.com/app/ opened in a browser, INSPECT then "document id": it returned bagaaieraow7l4hfhdhrpljlcidagibztg3dln5thmvxgkdxjedf34iox2w3a for its built-in document, and the same page served from a local server returned the identical id.
Limit
This establishes that the parser is deterministic and that one page on this domain runs. It does not establish the protocol's own load-bearing claim — §8.1.2, that a document survives a round trip through a real language model — which has been exercised only against mock models inside this repository. It does not establish that any implementation other than this one produces the same id for the same document, and §14.3 adoption by a portfolio product has not started.
Next rung
external — A second implementation, written by someone who is not us, that produces the same document id as the table below for the same corpus file — or a corpus document this parser gets wrong. Either would move this off self-report; nothing else will.
Servers your document touches
0. The playground is one HTML file with one inline module. Parsing, validation, link-mark expansion and the sha2-256 are all done in the page; the only network calls it can make are to a model endpoint you supply a key for.
Models the round-trip has been measured against
0. §8.1.2 is the spec's own gating claim and has been exercised against mock models only. The mocks are in src/harness/mock-model.ts and they are named identity, small-edit, lossy and garbage.

Retraction — this page claimed the LLM round-trip works

Until this revision the subtitle of this site read deterministic JSON · LLM-round-trippable, and the comparison against Markdown ended with the sentence Round-trip a doc through an LLM and the graph survives. Both state §8.1.2 as an established property. It has never been run against a language model.

What exists is the machinery: the drift metric with its five components, the median and P95 aggregation, the threshold verdict, and four mock models named identity, small-edit, lossy and garbage that exercise each failure mode. The mocks prove the harness measures something. They cannot prove what it would measure. The spec itself is careful here — §8.1.1 is a hard MUST and §8.1.2 is explicitly “a measured property, not a guarantee” — and the landing page had quietly collapsed the two into one.

The fix is structural rather than careful. Those two strings are now in the publication gate's blocklist and any page that reinstates one is refused, except inside this paragraph, because naming the wrong claim is what a retraction is. The claim comes back when a run comes back, and not before.

What you can actually do here

Three rungs, three lists. Nothing asks you to use what is not built.

A correction is worth more than a compliment

Tell us a figure on this page is wrong.

Every number here is a measurement with a date on it, and measurements go stale. The form below is a real form with a real action: it posts to formspree.io when you press the button, and it works with JavaScript off. The script that upgrades it to an inline reply prints “sent” only when the endpoint actually answers 2xx — a form that says thank-you on submit and drops the message is the exact failure this page argues against. If you would rather leave a public trail, open an issue instead.