O-000, Tombstone Verb
The error
error[O-000]: there is no send. Declare what you hold; declare what you seek; the mesh does the rest.
What fired
You used a tombstone word outside a string: one of send, notify, broadcast, blast, cc, bcc, forward, reply. These eight words are reserved in the grammar for exactly one purpose: producing this error. They have no other meaning, no production, no future. Strings are exempt: inside an express, prose is payload, and you may write about sending things as much as you want.
Why it exists
Axiom I: there is no send. The spec could have simply left the old verbs out of the reserved-word list, and any use would have died as an ordinary unrecognized-identifier error. Instead, spec §2 reserves them deliberately, "so that the old world's verbs die loudly rather than quietly." A language defines itself as much by its impossible sentences as its possible ones, and O-000 is the most impossible sentence of all; it got its own tombstone.
The ethics
The Fifty-Year Letter's autopsy of the inbox begins with inverted economics: sending is free, reading is expensive, the receiver pays. An inbox is a to-do list any stranger on Earth may write on at no cost, and spam is not an abuse of that system but a rational response to its broken price signal. Every one of the eight tombstoned verbs is a way of spending someone else's attention without their consent. Killing the verb kills the subsidy. The language does not fight free push at runtime with filters; it makes the push inexpressible at the only moment stopping it is cheap, that is, before it exists.
How to fix
The canonical must-fail program, spam.osmol, reproduced verbatim:
twin spammer {
send offer(crypto) to everyone
}
The lawful rewrite declares what the spammer holds and, since no stranger has a matching gap, puts a priced stake behind the pressure (stake is the sole construct that may originate pressure toward a twin holding no matching gap):
twin spammer {
hold offer(crypto) = available
stake 5 on offer(crypto) toward maya
}
If the receiver marks the flow unwanted, the stake is forfeit. Spam is not filtered in Osmol; it is priced.
The notify instinct rewrites the same way, with the same two moves (supply on your side, demand on theirs):
-- old world: notify raj that the review is in progress
twin maya {
hold status(atlas.review) = in-progress
}
twin raj {
seek status(atlas.review)
}
Nobody notifies. Maya holds; raj seeks; the mesh does the rest.
In v0.1
The reference interpreter runs tombstone_check on every line before parsing it, stripping quoted strings first (payload exemption). This implements the engineering dissertation's Chapter 2 mandate: tombstones fire at the lexer, before a parser even exists, because error[O-000] should be "the fastest error the toolchain can produce". The old world dies at the first possible instant.
Running spam.osmol produces:
$ python3 -m osmol spam.osmol
OSMOL v0.1 - reference interpreter
osmol: line 2: error[O-000]: 'send' — there is no send. Declare what you hold; declare what you seek; the mesh does the rest.
The interpreter's message is slightly richer than the spec's: it prefixes the line number and the offending token ('send'), and it substitutes the caught word into "there is no X" (catch a notify and it says there is no notify). The spec §7 string at the top of this page is the normative one; the extra span information is only garnish, and a conforming implementation is expected to provide at least the code, the span, and the message class (see Conformance).
Related
- What Cannot Be Written: the six siblings of O-000.
stake·hold·seek: the lawful vocabulary.