Who this is for: whoever writes anything a person reads here — a setting's label, a manual page, a fix line the doctor prints, a tool description a client renders. You need: nothing; this is offline prose and a generated table. Not here: what each setting does (engine-config-surface.md is the per-key reference), or how a component declares settings of its own (writing-a-connector.md).
There were three vocabularies at once. A field could be called Reading model
in one place and the model that does the reading in another; the same fact —
a value the environment supplies and the page cannot change — was one phrase on
a chip and a different phrase in a summary; and half the labels were questions
while the other half were noun phrases. Nothing was wrong in any one string.
What was wrong is that there was no answer to "what is this called", so every
new field invented one.
The manual had the same problem one level up. A person who learned a word on the configuration page met a different word for it in a page of this manual, and an agent reading a tool description met a third.
So the words are declared, and this page is the standard they are declared by.
It is generated from revetly.configcopy — the glossary, the banned words,
the rival spellings, the US forms, the product terms, the button verbs and the
exceptions are that module's tuples. tests/test_config_copy.py holds every
label, summary, value word, button, chip and heading on the configuration page
to the rules below, and the house lint holds the manual, both READMEs, the
templates a scaffolded instance receives, the sentences the doctor prints and
the descriptions the MCP surface serves to the machine-checkable half of them.
It runs in make check, over this repository's own docs/ and README.
Regenerate this page with:
revetly config --write-copy-standard docs/writing.md
Some of what follows a program can decide. A retired spelling, an exclamation mark, a US form, a heading that is a question: each of those is a match or it is not, and the lint fails a build on it.
The rest is judgement. Whether a sentence carries one idea, whether the mechanism is named rather than gestured at, whether the tone is plain: nothing below pretends those are tests. They are stated because a standard that only says what a regular expression can catch teaches the wrong lesson about what good writing here is.
What one option is called lives on that option — label, summary and
reads_as on the Option record in revetly/configspec.py for the engine's
own hundred and fifteen, and in each component's SettingsDeclaration for the
fifty-two a connector or a verifier declares. A component ships its own
settings and cannot reach a table in the engine, so its words travel with it.
Everything else the configuration page says lives in
revetly/configcopy.py — the headline, the level headings, the chips, the
buttons, the placeholder. A page that hard-codes a sentence is a page whose
words cannot be checked.
A generated page is fixed at its source. The table in connector-contract.md, the table in engine-config-surface.md and the block below are rendered from declarations. Editing one of those blocks by hand fails the build; when a generated block carries a word this standard refuses, the fix is the declaration it came from, and then the command that regenerates the page.
Two exceptions are named in the page's own test with their reason, and there
are no others: the engine-owned [auth.grants.*] and [auth.tokens.*] tables
carry no option record at all, so there is nothing to hold to a standard; and
[connectors.todoist] write_project is five words rather than four, because
its label has to say both whose project is meant and what it is for.
Most labels write themselves once the glossary exists. A handful did not, and the owner ruled on each by name rather than leaving it to whoever wrote the next one:
[llm] provider is LLM provider, and [embedding] provider is
Embedding provider — naming which half of the vocabulary each answers,
rather than the shorter Provider that would say nothing about which one
an instance running two providers is looking at.[llm] small_model is LLM high-volume model, beside LLM model. The
industry's own word for the seat is small model; the label says why
somebody would reach for it — volume, cost — rather than what it is called
by other people, because that is the question the person answering the field
actually has.revetly ingest cannot
explain the command.One vocabulary, several surfaces. Each rule below says which of these it reaches.
docs/, README.md, the handout README.txt, and the CLAUDE.md and README a scaffolded instance receivesrevetly doctor, revetly check and revetly init print, each check's fix line, and each provider's and connector's probeTwenty terms. Nothing written here uses a domain word outside this list, and nothing uses a spelling one of them retires.
| Term | Means | Replaces |
|---|---|---|
| LLM | the model that reads an artifact and extracts facts from it | who does the reading, reading model, reads your sources |
| embedding | the vector model that turns text into something searchable | who does the searching, the searching half, search model, search address, search key |
| extraction | the LLM step that turns one artifact into entities, links and statements | read closely, read decisions too, goes through the model |
| read pass | one run over the sources that puts new artifacts into the graph | the pass, ingest |
| artifact | one of what Revetly holds — a backlog item, note, commit or document | things, what is saved |
| source | a system or folder a read pass reads from | what this project reads, connector |
| project | one namespaced body of work inside an instance | — |
| instance | one installed Revetly with its own configuration and graph | — |
| namespace | the stamp every artifact of a project carries | name stamped on what is saved, shared space |
| records | the backlog items, conversation notes and delivery records Revetly writes itself | saved discussions |
| classification | a source-declared sensitivity level: public, internal, confidential, restricted | keep private, sensitive |
| provider | the vendor an LLM or embedding call goes to | who does the reading, who does the searching, sink |
| endpoint | the base URL a service is called at | search address, where that address is |
| API key | the credential that pays for provider calls | the key that pays, key seat |
| backfill | a priced pass over history older than the read floor | how much history, a historical pass |
| watch | the unattended schedule that keeps read passes running | check for new work, on its own |
| telemetry | usage data a component sends to its own vendor | phone home, ping its vendor |
| override | a value that outranks the one set here — from the environment, or a project restating an instance setting | set outside this page, done differently here |
| token | a bearer credential at a served endpoint, or a personal access token at a source | way in, ways in |
| withhold | keep an artifact body out of every provider call | kept from the provider, never leaves |
Reach. every option's label, on the configuration page.
Reach. every option's one-sentence summary.
Reach. the word a value in a closed set renders as.
Reach. the page's buttons, chips, headline and headings.
Reach. the manual under docs/, README.md, the handout README.txt, and the CLAUDE.md and README a scaffolded instance receives.
phone home, it sends telemetry; a body is not sealed, it is withheld.we puts a company in the room they did not ask about.[docs] roots, unless naming the key is the point of the sentence.Reach. every sentence revetly doctor, revetly check and revetly init print, each check's fix line, and each provider's and connector's probe.
Reach. the tool, prompt and resource descriptions the MCP surface serves.
tests/test_folded_surface.py. Saying it once and well is how a description stays under it.Banned words. thing, things, stuff, everyday, closely, phone home, sealed, stamped, elsewhere, instead, anyway, differently
Product names. Neo4j, Docker, GitHub, Git, OpenAI, Anthropic, OpenRouter, Cloudflare, Todoist, Azure DevOps, Graphiti, Revetly, CONTEXT, Streamable HTTP, Claude, Claude Code
Acronyms. LLM, API, REST, URL, JWKS, OIDC, PKCE, JWT, MCP, USD, JSON, RSA, PSS, SHA
Button verbs. Show, Hide, Add, Remove, Change, Test, Search, Save, Discard, Apply, Open, Close, Continue, Back, Price, Run, Cancel, Keep
Rival spellings. ingest pass, ingestion, embedder, api key, held back, phone-home, artefact
US forms, and what replaces them. analyze → analyse, analyzed → analysed, authorization → authorisation, authorizations → authorisations, authorize → authorise, authorized → authorised, behavior → behaviour, behaviors → behaviours, canceled → cancelled, catalog → catalogue, catalogs → catalogues, center → centre, centered → centred, color → colour, colors → colours, commoditize → commoditise, customize → customise, defense → defence, episodization → episodisation, favor → favour, fulfill → fulfil, generalize → generalise, gray → grey, initialize → initialise, initialized → initialised, labeled → labelled, labeling → labelling, license → licence, licenses → licences, maximize → maximise, minimize → minimise, modeling → modelling, neighbor → neighbour, normalize → normalise, normalized → normalised, optimize → optimise, organization → organisation, organizations → organisations, organize → organise, prioritize → prioritise, prioritized → prioritised, realize → realise, recognize → recognise, recognized → recognised, serialization → serialisation, serialize → serialise, serialized → serialised, standardize → standardise, summarize → summarise, summarized → summarised, synchronize → synchronise, traveled → travelled, visualize → visualise
A product's own spelling outranks the UK rule, because a word a reader cannot find in the product has helped nobody.
| Term | Owner | Why |
|---|---|---|
organization |
Azure DevOps | Azure DevOps names its top-level container an organization, and it is the key an instance sets. A company is an organisation; the Azure DevOps container is not |
authorization server |
OAuth 2.0 | the specification's own term for what this engine trusts, and what every issuer's documentation calls it |
Authorization |
HTTP | the header's name, spelled the way a request spells it |
dialog |
MCP | an elicitation dialog is what the client renders and what the protocol's own writing calls it |
dialogs |
MCP | the plural of the same |
Business Source License |
MariaDB | the licence's own name; docs/licensing.md quotes its defined terms and cannot respell them |
Change License |
MariaDB | a defined term of the Business Source License |
Change Date |
MariaDB | a defined term of the Business Source License, and the date one version of this engine converts on |
Apache License |
the Apache Software Foundation | the licence's own name |
Licensed Work |
MariaDB | a defined term of the Business Source License |
artifact |
Revetly | the glossary's own term, and the spelling of the id, the graph node and every tool argument |
Each is retired on a card and kept everywhere else, for the reason beside it.
| Word | Kept because |
|---|---|
connector |
the engine's own extension point: a class somebody writes and registers. A card says source because a reader of the page has not written one; the manual that explains how to write one cannot avoid the word |
ingest |
the name of a command — revetly ingest. A card says read pass for what it does; prose naming the command has to spell it the way somebody types it |
the pass |
an ordinary back-reference in a paragraph that has already said read pass. On a card there is no earlier sentence to refer back to, so the page spells it in full |
sink |
the wedge's word for a destination, surviving only in this project's own superseded thinking, which is not rewritten |
| Term | Refused | Why |
|---|---|---|
| read pass | ingest pass |
half the command name and half the term |
| read pass | ingestion |
a noun for which the engine has no gesture |
| embedding | embedder |
the vendor's word for the component; the glossary's word is the call it makes |
| API key | api key |
the acronym is capitalised, on a card and in a paragraph alike |
| withhold | held back |
a phrase that does not say what is kept, or from what |
| telemetry | phone-home |
a figure of speech where the mechanism has a name |
| artifact | artefact |
the product's own term, spelled the way the id, the API and the graph spell it — the one place the UK rule gives way |
Sentence length. Over 30 words is reported as a warning and fails nothing.
A fenced block, an indented block, a code span and anything between double quotation marks are somebody else's words — a vendor's error sentence, a command as typed, a question as asked. The spelling and naming rules do not reach inside any of them. Every other exception is one file, named here with its reason.
| File | Not held, because |
|---|---|
CHANGELOG.md |
history. What a release said it did is the record of that release, and rewriting it would make the record describe a decision taken afterwards |
docs/NEXT-STEPS.md |
superseded: the roadmap for the wedge, kept for the reasoning in it and shipped to nobody |
docs/wedge-pitch.md |
superseded: internal positioning for the wedge |
docs/customer-discovery.md |
superseded: an interview script, quoting the questions as they were asked |
docs/requirements-workbench-spec-v2.md |
superseded: the build spec for the wedge, now one optional sink |
docs/live-loop-spec.md |
an agreed spec for a slice, written before it was built and dated |
docs/revetly-2.0-context-fabric.md |
this project's thinking about the product as a working concept, dated and still moving — not documentation of what a recipient installed |
docs/architecture.md |
how the engine and Graphiti split the graph, for whoever changes the engine; it names modules and Cypher as the code spells them |
docs/glossary.md |
this project's measurement vocabulary, for whoever runs the benchmark or the change gate; shipped to nobody |
docs/adr/0001-benchmarked-per-job-on-own-workload.md |
an architecture decision record, dated and shipped to nobody |
docs/adr/0002-exact-match-slots-no-llm-judge.md |
an architecture decision record, dated and shipped to nobody |
docs/research/memory-tool-benchmarks-2026-10.md |
dated research notes quoting other tools' published numbers as they stated them |
docs/research/persona-value-estimates-2026-10.md |
dated estimates of value per persona, with the measurements they rest on |
Headline. Configured and running. · One answer still needed. · {n} answers still needed. · Revetly will not start on these settings.
Page headings. This instance · Projects · Instance settings · All settings ({n}), with technical names
Project card regions. Namespace and identity · Sources · Records folders · Approved item store · Item types and parents · Imports and exports · Overrides
Instance sections. LLM and embedding · Extraction and spend · Search and ranking · Sensitivity and withholding · Watch and retries · Git and records · Connections · Authentication and approval · Ports, updates and containers · Project defaults
Instance card lines. Neo4j: connected · Neo4j: not reachable · Neo4j: not tested · LLM and embedding: {provider} · LLM: {llm} · Embedding: {embedding} · Endpoint: answering at {address} · Endpoint: nothing answering · Endpoint: {address}, not tested · Git credentials: {names} · Git credentials: {names} and {n} more · Watch loop: running · Watch loop: not running · Watch loop: off · Last tick
Buttons. Show {n} more · Show · Hide · Add project · Add your first project · Add source · Remove source · Add connection · Add override · Remove override · Change · Change folders · Test · Test connection · Test credential · Remove · Save · Discard · Price a pass · Run a pass · Show issue types · Save issue types
Field chips. Required · Required, not set · Changed from default
Provenance chips. Fixed at startup · Environment override · Saved, not applied · Saved and in use · Never validated · Applies to every project
Controls. Advanced settings · Search settings · Changed from default · Required · No overrides · {n} more with Advanced settings
One goal per page, the configuration page path first and the command line beside it. The register is Cloudflare's developer documentation. revetly.guidespec states every rule below and tests/test_howto.py runs them over every page under docs/howto/.
In this order, and no others. Before you start, Configuration page, Command line, Troubleshooting (optional), Next steps.
A page: tutorial page is one path rather than two: Before you start, an H2 per stage numbered in its own heading (## 1. Load the engine), then Troubleshooting and Next steps.
The retired shape is refused by name: ## Steps, ## Check, ## If not, ## Why and a You see: line.
Numbered from 1 without gaps, in each section separately. One instruction per step, ending in a full stop — or a colon where a block follows. A second sentence clarifies and never acts, so it opens with one of Replace, If, Leave, Wait, Revetly.
A page step opens with one of: Open, Go to, On, In, Select, Enter, Choose, Tick, Untick, Turn on, Turn off, Type, Reload, Wait, Read, Copy, Paste, Leave.
Navigation is written Go to **A** > **B**. A command step carries an sh block, a block typed into a file, or the name of a gesture in a code span.
On top of the lists above: click, navigate, enable, disable, press, hit, tap, button. Link text is never here, this page, read more, click here — it is the target page's own title.
A step whose block is toml, env, yaml, yml, ini, json names that file in a code span in its own sentence: revetly.toml, .env, docker-compose.yml, .mcp.json, claude_desktop_config.json, or a [projects.<KEY>] table for revetly.toml.
The block's first line is a comment naming the same file (# revetly.toml). json has no comments, so it keeps the sentence rule and skips the comment rule.
The sentence says where the file lives the first time the page names it: at the project root, beside it.
<UPPER_SNAKE_CASE> in code, blocks and spans alike. A <lower-case> or <Mixed Case> placeholder is refused. Every distinct placeholder is introduced once by Replace `<X>` with …, in its own step or the one before.
A You should see … line sits under the step as its own paragraph. It carries exactly one bold span — a string the page paints — or exactly one code span, a sentence the terminal prints.
A ```txt output block does the same under a command step. Every line of it is a sentence this engine prints, a doctor line, or a line carrying a placeholder.
At most one result line per step, and at least one step in each path carries a result.
Bold is one of three and never a fourth. A control after a UI verb (configcopy.known_controls()). A string in a You should see line: a control, or a sentence this engine prints. The failure phrase opening a Troubleshooting bullet.
:::note (Note), :::tip (Tip), :::caution (Warning). Each opens a line of its own, with an optional [Title], holds one paragraph, and is closed by :::. At most 1 on a page besides the not-on-page note, and at most one link inside one.
The guide keeps its Configuration page heading and carries one :::note reading exactly one of two sentences. Where the page will gain the gesture:
This is not on the configuration page yet. Use the command line below.
Where the page is not the place for it — installing, scaffolding, wiring a client, the authoring gestures, updating, snapshotting, moving:
This is done from the command line, not on the configuration page.
Each is one constant in configcopy, so it reads the same on every such page; the day the page gains a gesture, the first note is deleted and nothing else changes.
Before you start: 1 to 3 bullets, each a link, at most 1 a plain condition. Troubleshooting: at most 2 bullets, each opening with the failure in bold and ending in a full stop, then at most 2 sentences of fix. Next steps: 1 or 2 links, no prose. The intro is at most 2 sentences. A sentence over 20 words warns and fails nothing.