Repository navigation
Developer reference
This page describes main, which the nightly build is made from. The latest release is 0.7.0: ✅ is in it, 🌙 is only in the nightly build, 🟡 is being built and ⏳ is planned.
The numbers and lists a plug-in, a host or a tool that reads graph notes is built against.
| Interface | Version | Changes when |
|---|---|---|
Plug-in interface (PLUGIN_API) |
1 |
A plug-in built for another version is refused. |
Host interface (HOST_CONTRACT_VERSION) |
3 |
Every change to DisplayHost. |
Every problem the reader raises has a stable code, the same in JavaScript and Python, and given as the Language Server Protocol diagnostic code. A code is never reused. Each {name} is filled in by the problem.
| Code | Problem | Fix | Spec | Raised by |
|---|---|---|---|---|
GN101 |
the block names no graph | start it with '// graph: <name>' (§3) | §3 | JavaScript, Python |
GN102 |
the graph name '{name}' is not one word | use letters, digits and underscores only — reader_choice, not reader-choice (§3) | §3 | JavaScript, Python |
GN103 |
a comment must be on a line of its own: // also occurs inside identifiers, such as ni:/// hashes (§3) | put the comment on its own line | §3 | JavaScript, Python |
GN104 |
cannot read '{text}' | a data block holds only nodes, relationships and simple values | — | JavaScript, Python |
GN105 |
'{escape}' is not an escape GQL names | double the backslash to write a backslash: \{escape} | — | JavaScript, Python |
GN201 |
expected '{expected}', found '{found}' | keep to the document profile (§3) | §3 | JavaScript, Python |
GN202 |
expected a name, found '{found}' | keep to the document profile (§3) | §3 | JavaScript, Python |
GN203 |
'{text}' is not a date | write DATE 'YYYY-MM-DD' | — | JavaScript, Python |
GN204 |
'{text}' is not an instant | write DATETIME 'YYYY-MM-DDTHH:MM:SS+HH:MM' | — | JavaScript, Python |
GN205 |
'{text}' has no offset | an instant carries its offset (§9, principle 11) | §9 | JavaScript, Python |
GN206 |
'{text}' is not an instant: in UTC it falls outside years 1 to 9999 | write DATETIME 'YYYY-MM-DDTHH:MM:SS+HH:MM' within years 1 to 9999 | — | Python |
GN207 |
'{token}' is not a value in the profile | use 'text', a number, TRUE, FALSE, DATE '…' or DATETIME '…' — no lists, no expressions | — | JavaScript, Python |
GN208 |
id {written} is not text | write id: {quoted} — a node's id is always text (§3) | §3 | JavaScript, Python |
GN209 |
SET would change {var}'s id, and a node's id never changes (§3) | write the right node, then link {var} to it or supersede it (§12) | §3 | JavaScript, Python |
GN210 |
unexpected '{token}' | a data block ends after its INSERT and SET (§3) | §3 | JavaScript, Python |
GN301 |
[{written}] has no colon, and graph {graph} has no relationship type called {written} | a relationship type is written with its colon: [:{type}] | — | JavaScript, Python |
GN302 |
[{written}] has no colon, and graph {graph} has relationship types {types} and {last}, which differ only by case | write the one meant with its colon, such as [:{type}] | — | JavaScript, Python |
GN303 |
this is a query block | queries ask questions of a graph; they are not data | — | JavaScript, Python |
GN304 |
this is an excerpt | an excerpt illustrates part of a graph; it is not data | — | JavaScript, Python |
GN305 |
MATCH must find a node by its id alone | write MATCH (v:Label {id: '…'}) | — | JavaScript, Python |
GN306 |
MATCH finds no {labels} with id '{id}' in graph {graph} | the node must be written earlier — in this document or one loaded before it | — | JavaScript, Python |
GN307 |
{var} is written twice | give each new node its own variable | — | JavaScript, Python |
GN308 |
id '{id}' is already a node in graph {graph} | an id names one node (§10) — MATCH it to add to it, or supersede it (§12) | §10 | JavaScript, Python |
GN309 |
{var} is used before it is written | write the node before any relationship that uses it — GQL binds a name only once its node is written (§3) | §3 | JavaScript, Python |
GN310 |
no thing called {var} in graph {graph} | check the spelling — or write it here with its kind: ({var}:Kind {…}) | — | JavaScript, Python |
GN311 |
SET names {var}, which is no thing in graph {graph} | check the spelling — SET names a thing by its id | — | JavaScript, Python |
GN401 |
a target is named by its id alone | write MATCH (v:Kind {id: '…'}) — a thing by its name, a link by its two ends and its type | — | JavaScript, Python |
GN402 |
a link is named by its type | write [r:TYPE] — a link by its two ends and its type | — | JavaScript, Python |
GN403 |
a link is named by its two ends and its type alone | leave its values to a SET | — | JavaScript, Python |
GN404 |
this names more than one target | a DELETE or SET names exactly one target (§24) | §24 | JavaScript, Python |
GN405 |
{var} is not the one target | a DELETE or SET names exactly one target (§24) | §24 | JavaScript, Python |
GN406 |
a DELETE needs the target it removes | write MATCH (v:Kind {id: '…'}) DELETE v | — | JavaScript, Python |
GN407 |
DETACH is followed by DELETE | write DETACH DELETE v | — | JavaScript, Python |
GN408 |
this removes more than one target | a DELETE or SET names exactly one target (§24) | §24 | JavaScript, Python |
GN409 |
unexpected '{token}' | a DELETE ends after the one target it removes | — | JavaScript, Python |
GN410 |
a link has no links to detach | write DELETE r | — | JavaScript, Python |
GN411 |
a change is a DELETE or a SET | write DELETE or SET after the MATCH | — | JavaScript, Python |
GN412 |
this changes more than one target | a DELETE or SET names exactly one target (§24) | §24 | JavaScript, Python |
GN413 |
SET would change {var}'s id, and a node's id never changes (§3) | write the right node, then supersede it (§12) | §3 | JavaScript, Python |
GN414 |
{key} is not a name a SET may give a value to | choose another name for the value | — | JavaScript, Python |
GN415 |
unexpected '{token}' | a SET ends after its values | — | JavaScript, Python |
GN416 |
the block names graph {named}, but the base gives it as graph {graph} | give it as graph {named} — a block is loaded into the graph its first line names (§3) | §3 | Python |
GN501 |
id '{id}' is already a node | an id names one node (§10) — MATCH it to add to it, or supersede it (§12) | §10 | Python |
GN502 |
cannot find where {var} is written | write it as (name:Kind {…}) | — | Python |
GN503 |
[{written}] has no colon | an engine is given only corrected text — read the block with its graph and load Store.corrected(block), or write it with its colon: [:{type}] | — | Python |
A graph can name one in its first line, such as // graph: reader · schema decision@1, and needs no schema of its own.
| Schema | What it is for |
|---|---|
decision@1 |
The standard schema for a decision: a question, the options that answer it, and the reasons for and against each. |
Made from packages/graph-spec/src/reader/problem-codes.json, the core and its contracts at d0d6f56 on 19 Oct 2026. This page is generated: change the repository, not this page, as edits here are overwritten.