ZFL — Zero-trust Formal Language, the language of the studio (ZTL is the logic; ZFL is how you write for it)

Why a table and not a syntax

Everything you write here is one document: a list of NAMES, each saying where it stands with you, plus what you CLAIM about them. There is no genre to declare and no mode to pick. Which instruments answer — the numeric floor, the passport office, the ledger, the judge — follows from which cells you filled.

The one rule underneath

Truth is not granted on credit. A name is verified when a verification was produced, and the ground column is where you say what produced it. A name with nothing backing it is not false — it is unverified, which is an honest third answer and the reason this logic exists.

Asking for a number

Put `?` in a value and the row stops being an answer and becomes a question. `x = ?` with a claim of `x - 10 = 20` is answered: x is 30, and earned. This is the one cell that changes what the machine DOES — everywhere else you are telling it what you know, and here you are asking.

Where formulas survive, and the one cell that reads two ways

In two cells only. In GROUND, when a name is DEFINED by a formula over other names — that is how self-reference is written, and it is why the liar needs no special mode. And in CLAIM, which is what you are actually asserting. Note what the ground cell is doing: for a verified name it holds `inv-17`, an opaque name the machine never looks inside and which means nothing but its own identity; for a defined name it holds `~Tr(L)`, a formula the machine reads and evaluates. The status decides which, and the form asks again whenever you change it.

the columns of a row

columnwhat it isrequiredoptions / examples
namewhat we call it; formulas use thisalwaysline · budget · L
meanswhat it MEANS for this to be truenothe invoice line · this sentence is false
statuswhere it stands with usalwaysverified · refuted · not verified · defined
groundwhat backs it, or the formula defining itin contextinv-17 · ~Tr(L)
dimensiondoes this SUPPORT the claim or PERMIT itnoevidence (supports) · authority (permits)
kind of grounda document unless you say otherwisenodocument · act (nothing to withdraw) · certificate (expires) · another row
expires atthe name of the event after which this ground no longer holds — another rownocourt_judgment · registry_recheck
valuea number, an interval [0,10], or ? for unknownno1500 · [0,10] · ?
unitonly with a value; metres never meet roublesnoRUB · m · m2
scalewhat it rounds tonoexact · whole · hundredths · thirds
separate measurementseach occurrence is its own act of measuringno

the document itself

columnwhat it isrequiredoptions / examples
admissible groundsthe grounds this document accepts, comma-separated. A row earning on a ground outside the list falls to unverified rather than to false. A tier may be given — 'master:story, perebor:act': story means 'so it was said', and what earns on it is marked. Empty: the gate says nothingnoregistry_extract:place, testimony:story · перебор:act, промер:act, мастер:story
claimwhat you are actually assertingnoline <= budget · rain -> umbrella
asknarrow the report; empty shows everything that appliesnoverdict · warranty · passport · stipulations · blast · brackets

operators

&and
->if … then
=the same value as
^exactly one of
|or
~not
Tr(x)the value of the row x — this is how self-reference is written
<=at most
>=at least
==equal to
<less than
>greater than

arithmetic

*times
+plus
-minus
/divided by
sum(a,b,…)the sum of several — the same as a + b + …
( )brackets, to say what goes first
-xa leading minus: the sign of a term, not the operation between two — `-x + 100 = 70` is a fair question and was not accepted until 2026-08-13

what can go in a value

1500a number you have measured or read off a document
[0,10]a box: somewhere in this range, and the machine keeps the range rather than picking a point. Both ends are INCLUDED; for a strict bound put it in the claim — `x > 0`. Write it backwards, [10,0], and you get E: the row names nothing, which is a verdict rather than a typo
?A QUESTION. You do not know it and you are asking. If the rest of the table determines it, the solver answers with the value AND the provenance it inherited — `x = 30, earned`. If it does not, you get told what would settle it.

a worked example

columnmeansstatusgroundvalue
linethe invoice lineverifiedinv-171500
budgetthe ceilingverifiedorder-45000
rainit is rainingunverified
Lthis sentence is falsedefined~Tr(L)

admissible grounds: line <= budget

error codes

E_BADNAMEa name a formula could not use
E_CLAIMthe claim does not parse
E_DIMa dimension outside the list — a ground either supports a claim or permits it
E_DIM_CLASHa ground carries one mark, not two: 'authority' cannot be combined with an act, a certificate or another row
E_DUPNAMEthe same name twice
E_EMPTYthe table has no rows
E_EXPIRY_NO_GROUNDa clock on a row that has no earned ground to lose
E_FORMULAthe defining formula does not parse
E_GROUND_SPACESa ground with a space in it — a ground is one word, because it names a document
E_KINDa kind of ground outside the list
E_NOGROUNDverified, refuted or defined, with nothing backing it
E_NONAMEa row without a name
E_OPEN_INTERVALan open bound like (0,10) — put the strictness in the claim instead
E_SCALEa scale that is not empty/int/decimalK/fracM, or out of bounds
E_STATUSa status outside the four
E_UNITa unit that cannot be read — a word, optionally with a power (m2), joined by · or /
E_UNKNOWN_NAMEa formula names a row that does not exist
E_UNREADABLEthe instruments could not read the claim — the message says what they choked on
E_VALUE_FORMa value that is neither a number, an interval nor ?
E_VALUE_SETa choice between values, {0,10} — that is two rows, not one quantity
W_NO_GLOSSno gloss, so nobody can check the name means what it seems to
W_UNIT_NO_VALUEa unit with no value