What Cannot Be Written
A language is defined as much by its impossible sentences as its possible ones.
(Osmol spec, §7)
Most language references catalogue what you can say. This section of the reference catalogues what you cannot, because in Osmol the impossible sentences are the point. The grammar was shaped so that the characteristic abuses of the 1971 paradigm have no spelling.
The design thesis
The spec §7 closes with the claim this entire section unpacks: in the old paradigm, spam, oversharing, attention theft, and impersonation were runtime problems, fought forever at the filter. In Osmol they are syntax errors, caught, in the spec's words, "at the only moment they are cheap: before existence."
A spam filter fights spam after it exists, forever, at the receiver's expense. A tombstone word fights it at the lexer, once, at the sender's compiler. The difference is not efficiency; it is who pays, and when, and whether the fight ever ends.
The errors are the ethics
The engineering dissertation (Chapter 2, semantic analysis) mandates that these diagnostics be rustc-grade: coded, spanned, and pretty-printed. Each code answers to osmol explain O-xxx with a paragraph of philosophy, "because in this language the error messages are the ethics." The seven chapters that follow this page are those paragraphs. When the Rust toolchain ships osmol explain, this is the text it should print.
The seven diagnostics
| Code | Name | Fires when… | |
|---|---|---|---|
| O-000 | tombstone verb | any use of send, notify, broadcast, blast, cc, bcc, forward, reply | → |
| O-001 | foreign gap | a seek names another twin as its subject | → |
| O-002 | granularity inversion | a transform casts upward along the lattice | → |
| O-003 | unsolicited pressure | flow is constructed toward a twin with no matching gap, outside stake | → |
| O-004 | transformed expression | a membrane or attention rule's selector matches an express | → |
| O-005 | counterfeit humanity | an express is authored by an autonomous process | → |
| O-006 | foreign sovereignty | anything references another twin's attention or membrane | → |
Enforcement in v0.1, honestly
The seven codes are all normative, their wording included, but they are enforced today by three different mechanisms, and an implementer should know which is which.
Mechanically enforced. O-000 fires in the reference interpreter at parse time: every line is scanned for tombstone words before any other processing (strings are exempt: prose is payload, and mentioning the word send inside an express is not sending). This is the one diagnostic you can trigger right now: run spam.osmol and watch it die loudly.
Enforced by grammar shape. O-001, O-003, and O-006 are impossible to write rather than illegal to run: no production lets a seek, attention, or membrane block name a foreign twin as its subject, and the engine only ever computes flows toward matching gaps. The spec §5 calls these absences load-bearing. The interpreter inherits the safety architecturally; there is simply no code path for the forbidden thing. Likewise O-004 and O-005: expressions bypass the membrane machinery entirely and carry provenance=human with no syntax to claim otherwise.
Awaiting the Rust checker. O-002 requires tracking each holding's granularity coordinate and rejecting upward casts; the v0.1 interpreter parses transforms but does not type-check the lattice. The explicit AST-level guards for O-001/O-004/O-005/O-006 (protecting against malformed trees constructed by tools rather than by the parser) are Stage 3 of the compiler pipeline, specified in the dissertation and due in osmol-core.
The distinction matters for anyone carrying the stone: a conforming implementation must produce all seven diagnostics, with these exact messages, from whatever stage can catch them earliest. The dissertation's instruction for O-000 is explicit: it fires at the lexer, because there is no send should be the fastest error the toolchain can produce.