NodemancyDocsMapLibraryCards
Reference

The paste format

What the Import box accepts, key by key. The same markdown a vault holds as files, with two differences that matter.

The shape of a document

One paste can carry any number of blocks. A block starts at a ---fence and its body runs until the next block's fence or the end of the document. There is no separator to write and no wrapper to add.

---
title: "Sam Dash"
slug: wg-dash
group: congress
kind: person
---

# Sam Dash

**Definition.** Chief counsel to the Senate Watergate Committee, who led
the questioning that drew out Dean's and Butterfield's testimony.

**See also.** [[wg-ervin-committee|Senate Watergate Committee]],
[[wg-the-tapes::investigated|The White House Tapes]]

---
title: "The White House Tapes"
slug: wg-the-tapes
group: evidence
kind: document
---

# The White House Tapes
…
You can paste the whole chat message, code fence and all. A fence that wraps the payload is recognised and removed — an opener before the first block is never content, and an unpaired closer at the end is the signature of one that was copied along with the reply. A balanced pair inside a body is left alone, so a node that legitimately contains a code block survives.

Frontmatter keys

Nine keys are read. title is the only one required — everything else is inferred or omitted.

KeyWhat it does
titleRequired. If absent, the first # heading in the body is used. If there is neither, the block is an error and will not import.
slugThe node's identity. Normalised on the way in. If absent it is derived from the title — which is the single most common cause of a batch that imports cleanly and links to nothing. See below.
lensWhich lens this node belongs in, by slug. Absent means “the lens the importer is pointed at”, which is what you want for an ordinary single-lens paste. A value naming a lens you do not have is an error, with a did-you-mean.
groupA group key declared in this lens. Undeclared imports with a warning and lands ungrouped; absent does the same without the warning.
kindThe entity type — person, event, document. Kinds are not declared anywhere, so anything is accepted; take one the lens already uses rather than inventing a category.
event_dateThe date the entry is about, distinct from when you wrote it. Must be YYYY-MM-DD or it is ignored with a warning.
aliasesOther names for the same thing. A bare string, or a list — ["Deep Throat", "W. Mark Felt"].
visibilitypublic (default) or restricted. Restricted keeps the node yours in every lens it appears in, and it is never sent to a hosted model. Any other value reads as public.
statusA free-text workflow marker of your own — seed, needs-sources. The app stores it and does not interpret it.

Everything else is reported and dropped

Invent a key — phase, confidence, source — and the preview says so by name, then imports the node without it. That is deliberate: the node is fine and refusing it would punish you for a model being better informed than the importer. But the value is lost, so put facts in the body.

A vault sync keeps unknown keys verbatim — that is the covenant of the file lane. If you have a vault and a key you care about, that is the door that preserves it. Working with files.
Two keys are exceptions, and one of them is a wart. synced_hashis skipped silently on purpose — it is the sync tool's bookkeeping and reporting its loss would alarm somebody who never wrote it. typeis skipped silently by this lane and takes the database's own default instead — it is a record marker rather than something you set, and it is the one key here that is neither read nor reported. If you meant the entity type, that is kind.

Slugs

Lowercase, alphanumeric, dash-separated. Whatever you supply is normalised the same way a link target is, so a slug and a link to it cannot disagree about what canonical means:

  • lowercase everything
  • replace every run of non-[a-z0-9] with a single -
  • strip leading and trailing -
WrittenBecomes
"Jon Snow"jon-snow
"R'hllor, Lord of Light"rhllor-lord-of-light
slug: WG Dashwg-dash
Set slug: explicitly whenever your lens tags its slugs. Slugs are unique across your whole account, so most lenses prefix them — wg-, got-. Without the key, title: "Sam Dash" becomes sam-dash, which is inconsistent with the lens and breaks every sibling link pointing at [[wg-dash]]. The file lane never has this problem, because there the filename is the slug.

Links

Four forms, all of them valid anywhere in a body:

FormMeaning
[[wg-dash]]A plain edge. The slug is also what the reader sees.
[[wg-dash|Sam Dash]]A plain edge with a human label. The slug still resolves.
[[wg-the-tapes::investigated]]A typed edge. The relation must be declared in the lens.
[[wg-the-tapes::investigated|The Tapes]]Both.
[[atvi::owns=51|Activision Blizzard]]A typed edge carrying a value — everything after the first =, kept verbatim. Usually a share (owns=51), but not always — a title in the same slot (officer-of=Chairman) is equally valid.
[[atvi::owns=51@2013-10-11..2016-01-05]]A span — when the edge held. Everything after the last @ is the range. Leave either side of the ..empty for “since” (@2023-10-13..) or “until” (@..2016-01-05).
[[atvi::owns=51@2013-10-11]]No .., so this is a point: that day alone, not “from then on”. The ..is what makes a span open-ended, on purpose — a silent “and thereafter” is the kind of default that turns a typo into a claim.
[[atvi::owns=12@2016]]Write the precision you have. A bound may be a year (@2016), a month (@2016-03) or a day. It is stored as the first day of that period alongside the precision it was claimed at, so @2016 stays the year 2016 rather than becoming the 1st of January.

A trailing #anchor is parsed and ignored. Never put | inside a label — it splits the field.

One value per relation per target when the edges are undated owns=51 and owns=49 to the same target with no dates is a contradiction, not two edges; only the first is kept. Give them different spans and they stop being a contradiction: they become two facts about two times, and both are kept. What a value actually asserts, and the shape column a lens can declare for a relation, is covered in Typed relations.

Direction

  • Directed relations (parent-of, authorized, investigated) go on the source only, pointing at the target.
  • Symmetric relations (allied-with, sibling-of) go on both endpoints, or the graph reads correctly from one side only.
An undeclared relation is not an error — the edge still draws, it just falls back to plain. Which is the right outcome, because a wrong typed edge is worse than an untyped one: an untyped edge says “these are connected”, and a wrong typed edge asserts a specific claim that looks like data.

Creating lenses in a paste

A block that carries authority: or a taxonomy section is read as a lens rather than a node — that is how the importer tells the two apart, since both open with ---.

---
title: Rome
slug: rome
authority: web
---

## Groups
<!-- key | Label | #color | familyKey -->
- republic | The Republic | #2dd4c8
- empire | The Empire | #f0a830

## Relations
<!-- value | Label | directed|symmetric | #color -->
- succeeded | Succeeded | directed | #3ea6ff
KeyNotes
titleRequired. A lens needs a name.
slugRequired, and never guessed from the title. A vault lens takes its slug from its folder; a paste has no folder, and an invented identity is a lens the author never named.
parentThe macro lens's slug, on each child. Omit on the macro lens itself and on a standalone lens. A parent may appear later in the document — macro-first is the usual order and both work.
authorityAlways web. A pasted lens is owned by the app; vault is accepted with a warning and corrected on the way in.

Lenses and nodes can share one document — lenses are created first, then nodes, and a node uses lens: to say which room it belongs in. Nodes naming a lens that could not be created are held back and reported rather than filed somewhere arbitrary.

The Relations table, in full

Four columns are the floor. Two more are optional and purely additive — a five-field row is read as ending on #color, so a bare fifth word is always the shape, never the direction column:

## Relations
<!-- value | Label | directed|symmetric | #color | shape | down|invert -->
- owns          | Owns          | directed | #c14953 | weighted | down
- subsidiary-of | Subsidiary of | directed | #7c4a8c | tree     | invert
ColumnNotes
shapeOptional, 5th. One of tree, chain, dag, weighted, many. Omitted or unrecognised falls back to many, the least constrained.
down / invertOptional, 6th — only meaningful with a shape present. invert flips the edge before laying out a chart; down, blank, or anything else is the ordinary reading.

Neither column ever blocks an import — a shape only produces a warning on the graph, never a rejection. What each shape catches, and when a relation wants invert, is covered in Typed relations.

What the preview tells you

StatusMeaning
readyWill import.
exists · skipA node with that slug is already here. A collision, not an error — nothing is overwritten.
errorWill not import, and says why. Missing title, a title with no letters or digits to form a slug, an unknown lens, or two blocks claiming one slug.
warnWill import, with something undeclared, unresolvable or dropped. See the warnings table in Bring your own AI.

Nothing is written until you confirm, and after you do the app reports counts in plain words: how many nodes were created, how many lenses were made, how many already existed and were left alone, and how many were held back.

See also