The Imscribing Grammar is the machine code. Twelve axes, and what runs on them is not a translation of a program — it is what the program was. x86, EVM, WASM, CPython bytecode, and the genetic code are ixcriptions of one fundamental language. V⊙x is what shows it: point it at any of them and it hands back the word, and where the substrate executes, the word executes.
The Imscriber's Guide states the identity rather than proposing it: the twelve operations and the twelve axes are one alphabet, "read as an operation or as an axis according to where it stands." So V⊙x does not carry programs into a notation. It reads them in the language they were already written in.
python3 vox.py --imasm out.imasm program.so
python3 vox.py --run gcd --args 1071,462 program.so
gcd(1071, 462) = 21 [26 steps in the twelve]That is not an emulator with a glyph theme. imasm_vm.Machine never sees the
binary; it dispatches on the glyph and nothing else, and what an instruction
was in x86 survives only as payload the glyph knows how to read. A ∈ splits,
a ∋ fuses, a ⊞ engages, a ◻ commits, a ⊙ transfers through data. Ackermann
recursion, SSE, switch tables, and dispatch through a function-pointer array all
run, because they were never anything else.
| ⊢ entry | ⊣ terminal | ∈ split | ∋ fuse |
| > call | < transfer | ⊙ indirect | ◻ commit |
| ⋈ link | ⊤ truth made | ⊥ truth taken | ⊞ engage |
⊙ is the one that earns its glyph. It is a transfer whose target is data — the structure taking itself as its own object, and precisely where a disassembler goes blind. It is not a special case bolted on; it is one of the twelve, and it was needed to run the first function-pointer table thrown at it.
Translation that cannot be checked is decoration. verify.py runs every
function in a shared object twice — once natively through ctypes, once as IMASM
in the machine — over identical inputs, and prints any disagreement with the
arguments that produced it.
lib0 … lib3, libs 1245 agreements, 0 mismatches
hard0 … hard3, hards 1125 agreements, 0 mismatches
Two corpora, five optimisation levels each, -O0 through -O3 and -Os:
integer arithmetic, division and modulo, loops, vectorised code, deep recursion,
cross-function calls, stack arrays, switch jump tables, calls through function
pointers. Twenty-three hundred agreements and nothing that disagreed.
Read that as a statement about the twelve rather than about the emulator. Every transformation gcc applies at every level — unrolling, vectorising, tail-calling, table-dispatching — produced code the twelve held without extension. Nothing had to be added to the alphabet to make a case pass.
measure.py charges the rewrite against the bytes that actually decoded.
| compiler | binary | bits/glyph | structure | lossless | ratio |
|---|---|---|---|---|---|
| MSVC C++ | ChemDraw.exe | 1.37 | 5.3% | 38.2% | 2.6x |
| rustc | momonados | 2.05 | 6.2% | 43.8% | 2.3x |
| Go | go | 1.81 | 5.7% | 41.1% | 2.4x |
| gcc C | xterm | 2.03 | 6.3% | 40.6% | 2.5x |
| gcc C++ | grub-render-label | 2.05 | 7.0% | 44.7% | 2.2x |
Structure — which of the twelve each instruction is, in order — lands between 5.3% and 7.1% of the machine code every time, across four compilers, four languages, two containers, and sizes spanning two hundredfold. A lossless rewrite that still runs costs 34% to 45%. The remainder is what the dialect charges for saying it in x86. See MEASUREMENTS.md, including why an earlier version of this table was wrong.
The same twelve read bytecode from instruction sets with nothing in common:
| dialect | input |
|---|---|
| native x86 | a PE or ELF binary, auto-detected |
| EVM | --evm HEX |
| WASM | --wasm HEX |
| CPython | a .py file, via dis |
| the genetic code | --rna SEQ |
Only the native lane executes today; the rest lift and verdict. The lift is the
same act in all five, which is the point — a merge is a merge whether it is a
JUMPDEST, an end, or a jump target with two predecessors.
The genetics lane is not an analogy laid over biology. Its chain is proved in
Lean and parsed out of that proof by gen_genetic_table.py, so nothing in it is
retyped or invented: guanine is B because it wobble-pairs with both C and U,
cytosine is T because it pairs only with G, adenine is F, uracil is
N; codons carry to amino acids by the genetic code; exactly twelve amino
acids are promoted and they biject the twelve axes.
$ python3 vox.py --rna AUGCAUUGGAAAGAAUACUGUAUUAACCAGGACUUUUAA
AUG Met Dimensionality ⊢ UGU Cys Recognition >
CAU His Granularity ∈ AUU Ile Kinetics ⊙
UGG Trp Topology ⊣ AAC Asn Coupling ∋
AAA Lys Stoichiometry ⊞ CAG Gln Criticality ⊤
GAA Glu Winding ◻ GAC Asp Chirality ⊥
UAC Tyr Parity < UUU Phe Fidelity ⋈
word ⊢∈⊣⊞◻<>⊙∋⊤⊥⋈
stop UAA
verdict T
That sequence is constructed to contain all twelve promoted codons, so it demonstrates the chain closing rather than reporting a finding about a natural gene. The same SIXTEEN_3 engine that verdicts x86 verdicts the transcript, because it is the same alphabet arriving by a different substrate.
One divergence, recorded rather than reconciled. The genetics dialect names four axes differently from the IMASM dialect — Recognition for Relational, Parity for Polarity, Coupling for Grammar, Winding for Protection — while holding the same slots in the same order. Eight of twelve names agree exactly. The generator carries the divergence explicitly instead of smoothing it, because which one is the better name is a live question and not one the tool should decide by silently picking.
Once a program is a word, the Grammar can be asked things about it. The first
question is whether it closes. A fork that commits state or returns before its
paths rejoin does not, and that open fork is the shape of a whole class of bugs
— Solidity reentrancy, a Python early return inside an if, a WASM store in an
escaped if. All three lift to the same word:
⊢∈◻⊣ → B
The verdict is Belnap FOUR from the SIXTEEN_3 trilattice: T closes, B a fork held open across a commit or return, N a linear routine that never forked. B is dialetheic and marks where to look; it is not a verdict of guilt. No pattern list, no per-language rules, no heuristics.
python3 vox.py program.exe # audit every function
python3 vox.py --word out.imscrb program.exe # the structure alone
python3 vox.py --selftest- The disassembler is a linear sweep split at call targets, not recursive descent, so a call-sparse region can be lumped into one long word.
- The machine implements the instructions the corpora reached. It has no syscalls and no operating system; it runs functions, not processes.
- A packed binary hides its code until runtime. V⊙x reads what is on disk, and reports how much of the file decoded so a low coverage is never silent.
vox.pythe front ends, the auditor, the CLI.imasm_module.pythe recompiler: every instruction to its glyph and payload.imasm_vm.pythe machine that runs a module, dispatching on the glyph.verify.pynative versus IMASM, the same inputs, decided.measure.pywhat the dialect costs.imasm16_3_core.pythe SIXTEEN_3 trilattice engine, vendored and standalone.USER.mdthe full reading.MEASUREMENTS.mdthe numbers.
The native lane needs capstone and pefile. Everything else is standard
library.
Unlicense. See LICENSE.