Nishi FamilyCompare › NishiLang vs the Language Field

Nishi Compare · full-field SOTA · measured, not asserted

NishiLang vs the Language Field

Nishi vs the full field — every axis measured or researcher-sourced, grouped by category; each strip shows the whole field at a glance.

11 languages (majors + best-designed), 35 axes, 7 categories. Nishi cells measured (gates with dates); competitor cells documented capability presence, July 2026. Demand weights = 1651 banked oracle bugs. Frontier ladder: /compare/lang/frontier

How this is scored. This is a state-of-the-art comparison across the FULL competitor field: quantitative axes carry measured / published numbers (Nishi’s column is our own measurement, competitors are researcher-sourced), grade axes use Best / Yes / Part / No. Every axis carries a source note. No single vanity ‘coverage’ score — the honest picture is per-axis. Where Nishi is under SOTA, that is filed work with an owner, never ‘by design’ (operator law: less-than-SOTA is never design) — every sub-SOTA axis maps to a frontier rung; the only legitimate divergence from the field is a measured exceed bet that carries its number (e.g. no-float determinism). The climb is the plan.
field, strip order:RustZigGoSwiftKotlinTypeScriptPythonCElmOCamlHaskell·BestYesPartNo

Measured stakes (quantitative)

Native speed vs C (measured / documented)

Nishi MEASURED Stabilizer-validated 2026-05-20 [stabilizer2013] (bench/paired_native_microbench.tsv) vs gcc -O0; root cause stack-machine x86-64 backend, regalloc wired into RISC-V only [poletto1999]; peer columns = commonly documented ranges vs C. RE-MEASURED 2026-08-14 on the CURRENT compiler (674,866 B, eleven promotions later) with bench/nx_lang_h2h.sh, an identical bounds-checked hot loop where all four arms must print the same checksum or the run is void: gcc -O2 unchecked 2,270 us . Rust -O checked 5,041 . NishiLang checked 10,237 . NishiLang UNCHECKED 4,581. So against gcc -O2 the unchecked lane is 2.02x and the checked lane 4.51x. THE FINDING THAT RE-RANKS THE PERF WORK: NishiLang unchecked (4,581) lands within 9 percent of Rust CHECKED (5,041), i.e. the raw codegen is already at the checked-language tier, while the bounds check itself costs 2.23x on this loop. That first pointed the next rung at proving checks away -- and then READING THE EMITTED ASSEMBLY for one checked access moved it again, which is why the assembly is quoted in the ledger rather than summarised. Per iteration of a bounds-checked accumulate loop the backend emits roughly seventeen instructions, of which the check is two compares and two branches while SIX are pure memory traffic: the loop counter lives in r12 and the accumulator in r13 for the whole loop -- register allocation demonstrably worked -- and the emitter STILL spills both to stack homes on entry and reloads the counter twice more, once for the high check and once for the address computation, from a register that never changed. So the dominant cost is not the check and not the missing phi nodes (the two loop-carried values are already in registers); it is that THE BACKEND DOES NOT CONSUME THE REGISTER ALLOCATION IT ALREADY COMPUTED, materialising every value through its stack slot at every use. That is now the ranked number-one perf rung, it is witness-backed by runtime/nx_probe_bchk_asm.nx rather than argued, and it explains why round 3's assembly dump reached the same conclusion in July and was read as a phi problem instead. Stated honestly: this is a DIFFERENT benchmark and a DIFFERENT baseline from the 3.65x figure above (that one is vs -O0 on the paired microbench and has NOT been re-run), so the two numbers are not comparable and neither refutes the other

Rust ~1xZig ~1xGo ~1.2-2xSwift ~1.1-2xKotlin ~1-3x JITTypeScript JIT variesPython ~10-100x interpC 1x barElm n/a (JS)OCaml ~1-2xHaskell ~1-3x

3.65x gcc -O0
Nishi, measured
External defect oracles ingested + classified

langintel- planes: 669 rust I-unsound + 982 LLVM miscompiles, injection-scanned 0/1651, classified into 26 ranked capability axes; top demand compiler-miscompile-codegen 638 = the build order (SSOT knowledge/store/langintel-requirements-)

Rust tracker onlyZig tracker onlyGo tracker onlySwift tracker onlyKotlin tracker onlyTypeScript tracker onlyPython tracker onlyC tracker onlyElm tracker onlyOCaml tracker onlyHaskell tracker only

1651 banked
Nishi, measured
Minimal static native binary (bytes)

Nishi measured 2026-08-13: 188 B return-42 ELF with --no-crash-guard (the deliberate minimal lane); the crash guard is DEFAULT-ON since 2026-08-13 pm and costs +4.9 KB (guarded return-42 = 5,105 B) -- still half of Zig's ~10 KB and 60x under C's typical static; peers = documented typical hello-world static/stripped order-of-magnitude

Rust ~300 KB strippedZig ~10 KBGo ~1.5-2 MBSwift ~500 KBKotlin n/a JVMTypeScript n/a JSPython n/a interpC ~16 KBElm n/a JSOCaml ~1 MBHaskell ~1 MB

188 B opt-out / 5.1 KB guarded
Nishi, measured
Native backends in one shipped toolchain

Nishi counts only true native ELF backends on this axis (x86-64 + RV64 in one sovereign binary); wasm is deliberately NOT counted here -- not a native backend; Zig 0.15 ships its self-hosted x86 backend [zig0151]; Go owns its backend

Rust LLVM (ext)Zig LLVM + own x86Go own, 12+ targetsSwift LLVMKotlin JVM + LLVM nativeTypeScript JS emit (non-native)Python bytecode VMC gcc/clang allElm JS emit (non-native)OCaml own native + byteHaskell GHC NCG + LLVM

2 (x86-64 + RV64)
Nishi, measured

Memory safety and soundness (the public-bug-dump ring)

Compile-time memory safety enforcement

Rust borrow checker is the bar [rust-ownership] yet 669 I-unsound bugs banked = even the leader leaks (our oracle lane measures it); Nishi raw pointers SIGSEGV -- filed; equiv net GREEN 2026-08-05 = the enforcement lane is OPEN (standing rule: every nx_cc change passes nx_cc_equiv_gate before promotion)

NO
Bounds-checked access (CWE-787/125)

PART, measured 2026-08-23 on the live compiler: typed arrays [N]T and slices []T are bounds-checked BY DEFAULT (NX_BOUNDS_CHECK_LIVE, the LB4 rung, cost measured 2.23x on the checked hot loop) and the raw-pointer half -- the READ-TO-NUL over-read class -- traps only under the --ptrprov DECLARED MODE (LN3, shipped 2026-08-19: exit 71, CWE-125 read and CWE-787 write legs, a provably out-of-range constant index refused at parse time; nx_boundscheck_gate 11/11 GREEN re-run 2026-08-23 after the LN2 promote). Default stays OFF for raw pointers until the per-class ratchet flips it after a clean corpus census, which is the distance to Yes. CISA memory-safe roadmap (banked langbug.q 2026-07-10) [cisa-memsafe] puts this class at the top of what bites C; our 2026-07-08 READ-TO-NUL over-read was exactly this class in the wild

PART
Use-after-free prevented (CWE-416)

Arena no-free doctrine mitigates in practice (nothing frees) but no checker ENFORCES it; Rust the bar; 24 Pin-class bugs in the oracle corpus show the hard tail

PART
Integer overflow checked (CWE-190)

PART, SHIPPED 2026-08-23 as the --chkarith DECLARED MODE (LN1): an i64 add, subtract or multiply whose result leaves the i64 range TRAPS with exit 72 naming CWE-190 and the fix, MIN times minus-one traps the same way instead of SIGFPE, __wrap_add / __wrap_sub / __wrap_mul are the exempt intent-declaring forms, and a constant overflow is REFUSED at parse time (capability=checked-arith-const-overflow); nx_chkarith_gate 17/17 GREEN live (passed 9/17 against the banked pre-LN1 compiler: exactly the mode teeth), nx_cc_equiv_gate 10/10 plus selfhost GREEN, default builds byte-identical. Under the default i64 still wraps silently, and the default stays OFF until the per-class ratchet flips it after a clean corpus census -- that flip is the distance to Yes. FIRST RUNG SHIPPED 2026-08-13 on the neighbouring silent-wrong-value: a CONSTANT shift count outside the result width is now REFUSED at compile time, because the processor keeps only the low bits of the count and the program would otherwise compute a different shift than the one written -- MEASURED before the fix: 1 shifted left by 70 compiled clean, ran, and returned 64 (70 becomes 6). The refusal names the legal range, the fix, and capability=shift-count-range; runtime counts and in-range counts are gate-controlled to keep compiling, since an over-eager check would refuse the overwhelmingly common shapes. CORRECTION, measured not remembered: this cell's older note claimed an over-shift 'blanks the emitted .s' (2026-07-06) -- STALE, it compiles and returns the masked value. Zig safe-mode + Swift trap-by-default + Python bignum lead on the overflow half; Go wraps by definition

PART
Null / sentinel-zero deref prevented (CWE-476)

PART, SHIPPED 2026-08-23 as the --optenforce DECLARED MODE (LN2): a dereference of a pointer-typed local not proven non-null on its path is REFUSED at parse time naming the local and the rule (capability=option-enforce-unwrap); proof comes from the idioms this corpus already writes (if p != 0 then-block, the early-exit if p == 0 return/break/continue/sys_exit, the else-block, while p != 0, nx_assert_ptr) and a reassignment re-derives the bit, so a stale check does not survive p = call(). Declared floors, each measured against the stdlib: parameters and module statics trusted, sys_mmap results non-null by the allocator contract, int-to-pointer casts trusted, chained derefs through fields or calls unchecked (bind to a local first). nx_optenforce_gate 14/14 GREEN live (hazard refused at p.val, the reassign witness refused, the nine-idiom positive control compiles and runs under the mode with byte-identical asm so the mode emits no IR), 9/14 against the pre-LN2 compiler; nx_cc_equiv_gate 10/10 plus selfhost GREEN. Sentinel-zero-as-null is our recurring P2 meta-class; Option and Result EXIST in the stdlib and the mode now enforces the checked path for locals; default stays OFF until the per-class ratchet flips it after a clean corpus census -- the distance to Yes. Elm ships no null at all

PART
Compile-time data-race prevention (CWE-362)

Swift 6 strict concurrency joined Rust Send/Sync as the 2026 bar; Go ships a runtime race detector; Nishi pool is real (7x measured) but untyped

NO
UB / poison semantics defined and checked

54 poison/undef oracle bugs banked (demand rank 3); C UB is the negative bar; managed languages define semantics; Rust unsafe still carries UB (miri checks it). FIRST RUNG SHIPPED 2026-08-13, chosen by MEASURING the edges rather than by taxonomy: the compile-time-decidable UB shapes are being refused one at a time with the capability voice -- constant out-of-range shift counts land first (silent masked-shift, measured 1<<70 = 64 pre-fix), and the runtime traps that remain now SPEAK instead of dying silently (a divide-by-zero SIGFPE prints the arithmetic-trap diagnosis and the divisor advice; that fix-line classifier was itself corrected the same day after it wrongly printed the null-pointer hint on an arithmetic trap -- a wrong hint is worse than no hint). Still No overall: the class is not closed until poison/undef semantics are DEFINED, not merely refused case by case

NO

Type system and correctness

Sum types + pattern matching

Payload ctor + match probes re-verified run-exit=0 2026-07-09; no exhaustiveness yet -> lint rung; Elm/OCaml/Haskell ADTs are the bar; Go lacks sum types

PART
Match exhaustiveness enforced

SHIPPED 2026-08-05, bite-witnessed refuse+accept through /api/build (nx_parse: non-exhaustive match: 2 of 3 variants handled) with the witness in-tree (nx_probe_exhaust_live.nx): EnumEntry now records n_variants and parse_stmt_match counts DISTINCT discriminants (values not arm positions, so duplicated arms cannot fake coverage and explicit = N variants stay correct); gated nx_cc_equiv_gate 10/10 + selfhost -- which doubled as the estate backfill census (zero non-exhaustive matches, so no amnesty was needed) -- and promoted through promote_toolchain canary GREEN. DIAGNOSTIC PARITY-PLUS with Elm (the reason this cell moved to Best): the message CITES THE LINE, NAMES THE ENUM, and NAMES THE MISSING VARIANTS -- nx_parse: line 1118: non-exhaustive match on enum ExhColor: 2 of 3 variants handled -- add an arm for: Blue (no new storage: variant names already live as Enum::Variant module consts). PLUS a second check Elm/Rust-class but ours by construction: UNREACHABLE ARM refusal, citing BOTH lines -- nx_parse: line 1121: unreachable match arm ExhColor::Red -- already handled by an earlier arm of the match at line 1118. Declared narrowness: discriminants outside 0..63, or an unresolvable enum, decline the verdict rather than guess

BEST
Call arity + param-type checking

COMPILER-ENFORCED and bite-proven live 2026-08-05 via /api/build, both refuse+accept directions witnessed in-tree: ARITY (call arity mismatch, forward refs via pre-registered stubs; nx_probe_arity_live.nx) + POINTER-into-INTEGER types (argument type mismatch, the sev-8 silent-zero shape, 0 measured false positives; nx_probe_ptrint_live.nx) + duplicate-definition guard. FULL BOTH-DIRECTION TYPE REFUSAL SHIPPED 2026-08-05 after TWO root fixes, each gated (nx_cc_equiv_gate 10/10 + selfhost) and promoted through the canary toolchain door: (1) the trailing `as T` cast MUTATED THE OPERAND in place, so any local ever written `p as i64` read as INTEGER at every later call -- a silent wrong-type class for every casting caller; cast now emits a typed identity (equiv gate 10/10 + selfhost, toolchain-promoted canary GREEN, witnesses nx_probe_castmut_live/2). and (2) POINTER ARITHMETIC DECAYED TO i64, so the corpus idiom emit(out + o, cap - o) handed a POINTER the parser believed was an INTEGER -- that was the whole 57/70 residue, i.e. the check had been RIGHT about a type the parser had already lost. Named by the equiv gate's newly-captured compiler stderr (a gate that reports a failure without its diagnostic makes the failure unactionable). BOTH DIRECTIONS now refuse, bite-witnessed refuse+accept on the live compiler (nx_probe_intptr_live.nx / nx_probe_ptrint_live.nx). Integer LITERALS stay exempt by design (sentinel/null idiom); fn-pointer calls remain unverifiable by name; arity census crons daily

YES
Generics / parametric polymorphism

Full monomorphization port landed (parse.nx instantiate_generic_n); Rust traits + Haskell typeclasses lead depth; Go type sets since 1.18 [go118]

YES
HM-class type inference

Explicit-declaration is a named stance (reads better at audit time) yet stays a No under less-than-SOTA-never-design until measured as an exceed

NO
Effect tracking / purity

OCaml 5 effect handlers + Haskell monadic IO + Elm purity are the frontier; watch-class for the substrate

NO

Concurrency

Lightweight concurrency (CSP / actor / async class)

nx_chan Vyukov MPMC + ring-arena pool 7x measured (2026-07-06 gate); goroutines the industrial bar; Zig async dropped in 0.15 pending redesign

PART
Structured concurrency

Swift task trees + Kotlin coroutine scopes = the 2026 design bar; Python TaskGroup 3.11; Go errgroup is a library

NO
Colorless functions (no async split)

Explicit threads + channels = no function coloring by construction; OCaml effects give colorless concurrency; Rust/Swift/Kotlin/TS/Python all carry the async split

YES

Errors and diagnostics

Errors as values, enforced

Option/Result exist in the stdlib unenforced; the estate-wide refusal-with-reason-and-fix convention is real but convention, not type system; Zig error unions + errdefer; Swift typed throws

PART
Compiler diagnostics (caret, did-you-mean, multi-error)

CARET + DID-YOU-MEAN ARE SOVEREIGN NOW (2026-08-05), bite-witnessed: nx_parse: line 1116: call to undefined function 'dym_helpr' -- did you mean 'dym_helper'? (bounded Levenshtein over the module function table; witness nx_probe_dym_live.nx). It stays SILENT when nothing is near -- a wrong suggestion is worse than none. Every enforcement diagnostic shipped today cites a LINE and two cite BOTH lines (duplicate definition; unreachable match arm). CARET SHIPPED the same day and bite-witnessed end to end: nx_parse: line 1116: call to undefined function 'dym_helpr' -- did you mean 'dym_helper'? / then the offending source line / then ^ under the call. Plumbed ADDITIVELY (a module static the driver fills; unset = no snippet, never a wrong one) so no parse_module caller changed. FIRST ATTEMPT PRINTED THE CARET UNDER THE WRONG LINE (P.pos had advanced past the call, landing on the NEXT statement) and was corrected before promotion by anchoring on the call's own token -- A CARET THAT POINTS AT THE WRONG LINE IS WORSE THAN NO CARET. Arity + undefined-call diagnostics now share that anchor. MULTI-ERROR RECOVERY SHIPPED 2026-08-05 late (gate 10/10+selfhost, canary GREEN, witness nx_probe_multierr_live.nx): 12 semantic sites (undefined call/ident, call arity, arg types, unknown type, non-exhaustive match, unreachable arm, duplicate definition, const-before-decl, bad assigns) now note-and-continue, closed by a hard end gate -- nx_parse: N error(s) -- no output emitted -- so a broken build reports EVERY error in ONE compile and recovered (poisoned) IR can never reach codegen; parser-desync sites stay fatal BY DESIGN (past a desync every diagnostic points at innocent code); cap 20. DID-YOU-MEAN NOW COVERS BARE IDENTIFIERS (witness nx_probe_dym_ident_live.nx: line 1117: UNRESOLVED identifier 'countr' ... -- did you mean 'counter'? plus source line + caret; suggestion pools = live locals window + module consts + function table, ZERO new indexes; the UNRESOLVED diagnostic also gained its line number + caret via the one-slot-back token anchor, verified by emitted bytes). TYPE-NAME DYM TOO (same evening, witness nx_probe_dym_type_live.nx): unknown type name 'TypoPont' (not a primitive, struct, or registered type alias) -- did you mean 'TypoPoint'? -- pools = declared struct table + active generic type params; primitives deliberately excluded (2-4 char names make distance-1 suggestions noisy) and the narrowness stated in-source; gated 10/10+selfhost, canary GREEN. THE 5W+H / ELM-CLASS VOICE IS LIVE ON THE UNDEFINED-NAME FAMILY (2026-08-06, three operator escalations in one night: metadata notes -> quoted declarations -> the full invested logging standard, nxc2-5wh-substrate 2026-04-29 + elm-class-friendliness CARDINAL 2026-05-07). A missing name now reads, verified by emitted bytes end to end through /api/build diag_errors: error at line 1118: I do not know the name 'dym_helpr' -- it is called here, but nothing in this program defines it. / source line + caret / why the build stopped: this name has no definition, so the program would have nothing to run here -- building on would ship a crash or a wrong value at this exact spot. / closest defined name: 'dym_helper', declared at line 1116: + the declaration QUOTED / fix: if 'dym_helper' is the one you meant, change the spelling to match it; if not, define 'dym_helpr' yourself or import the file that provides it. / error: the build found 1 problem(s), listed above, and wrote no program. Rubric self-score ~24/25 (WHAT 5 WHERE 4 WHY 5 HOW 5 NO-JARGON 5; the missing WHERE point is the file name -- the per-file rung). Internal organ prefixes are GONE from these messages. SHIPPING THE VOICE ALSO EXPOSED A STACK TRUNCATION: hostctl echoes only the last 600 bytes of the builder's capture, smaller than ONE 5W+H diagnostic -- the mgmt API now reads the builder's full capture directly, so the API surface carries the whole message. Suggesters are silent stashers; one printer owns the voice; locals resolve by nearest-above scan (shadowing-correct); a const names its evaluated value. REMAINDER CLOSED ON THE HIGH-FREQUENCY SITES (2026-08-13): call arity, reassigning a 'let', duplicate definition, and reserved-keyword-as-name -- the four mistakes any author arriving from another language makes first -- now speak the same what/why/how voice as the undefined-name family, all reported in ONE compile (arity now names the CONSEQUENCE: a missing argument is not empty, the callee reads a leftover register, so the wrong value moves when unrelated code moves and the crash never points back at the call). These are USER ERRORS and deliberately carry NO capability= slug, which is what keeps the demand journal an honest signal of missing CAPABILITY rather than a log of typos. Still on the old organ-prefixed voice: exhaustiveness, unreachable-arm, const-before-decl and the desync sites (anchored by the diag_errors dual-anchor until their rewrite). RUNTIME crash diagnostics (2026-08-13, rungs 1a+1b BOTH shipped same day): SIGSEGV/SIGBUS/SIGILL/SIGFPE now print instruction + fault addresses in the same 5W+H voice and STILL die by the original signal (wait-status unchanged) -- and this is DEFAULT-ON FOR EVERY PROGRAM: the driver appends the self-contained guard and the parser injects the arming call at main entry (--no-crash-guard opts out; measured +4.9 KB per binary; run-behavior byte-equal across the whole equiv corpus). Stack overflow is covered via a 32 KiB alternate signal stack, and the fault classifier names UNBOUNDED RECURSION when the touched address sits at the stack boundary instead of misdirecting to the null-pointer hint. Witnesses prove the EXACT planted fault address prints, the bare-program injection, the opt-out silence (attribution control), and the overflow diagnostic. The resolve loop is now ONE COMMAND: every crash diagnostic prints its own program path (readlink /proc/self/exe) plus the exact nx_addr2line invocation -- the shipped CLI (now REGISTERED over MCP; it was PROMOTED-UNREGISTERED, a real binary nobody could call) prints file:line AND the function name on a -g build and honestly REFUSES (rc=4) without .debug_line. In-process resolution is deliberately NOT embedded: it would drag the DWARF decoder into every ~5 KB guarded binary; the one-command offline loop is the design, stated on the diagnostic itself. CAPABILITY-LIMIT VOICE (2026-08-13 night): when the honest answer is NOT-POSSIBLE, the diagnostic now says whether that is a design stance or a roadmap gap, teaches the supported way, and stamps a greppable capability=<slug> marker at the moment of friction -- (1) a float value into an INTEGER binding used to COMPILE CLEAN and silently store the raw IEEE-754 bit pattern (measured: 1.5 became 0x3FF8000000000000, no diagnostic); EVERY store site -- let, var-init, plain assignment, pointer deref (*p = 1.5), array subscript (a[i] = 1.5), and struct field (s.f = 1.5) -- now refuses through ONE shared guard whose destination type is the pointee/element/field, so float MEMORY stays fully legal (*f64 deref-store control gated) while every integer destination refuses; the first cut covered let only and re-checking the published claim caught the divergence (the multi-error compiler reports all three memory sites in a single build), teaching Q14 fixed-point and leaving the float lane reachable via : f64; (2) the parameter-cap refusal teaches the struct-pointer idiom instead of naming IR internals; (3) the crash guard's pointer branch teaches CHECKED access ([N]T and []T refuse out-of-bounds with a message). The slugs feed the AI-friction transcript mine, so real user friction re-ranks the public roadmap -- the same loop that chose every rung shipped today. HONEST REMAINDER: line numbers are EXPANDED-source lines (per-file mapping is its own rung) and rustc/Elm still carry error codes, --explain prose, and structured/JSON output we do not. Elm + rustc the bar [elm-errors]

YES

Tooling ring

Language server / IDE integration

rust-analyzer, gopls, IntelliJ, TS server lead the field; we ship none -> rung

NO
Canonical source formatter

SHIPPED 2026-08-23 (LN9, nx_srcfmt, symbol srcfmt_emit): one canonical style with no options, the gofmt shape, and the style was MEASURED from the whole corpus rather than chosen (18,801 files, 2.97 M lines: 4-space indent 2,216,007 vs 9,644; brace on the opening line 179,575 vs 2; joined else 33,968 vs 5,444; struct field type columns aligned in 1,340 of 1,712 multi-field runs) -- a census verb prints the same numbers from the same scanner so the rule and its ruler cannot drift. Comments, string literals and @-directives are preserved byte for byte, and a token-stream ORACLE built on the compiler's own lexer refuses any output whose tokens differ from the input, so nothing is ever written unless the oracle agrees. Proof over the FULL population, not a sample: 18,809 of 18,815 sources format idempotently (fmt(fmt(x)) == fmt(x), 0 exceptions, 0 comment losses) and build to byte-identical assembly; the 6 remaining files use @for range expansion or @macro gensym substitution the formatter does not model and are REFUSED (exit 3, nothing written) -- the declared floor. nx_srcfmt_gate 13/13 GREEN live, bite-proven both ways (alignment killed -> 12/13 RED; oracle broken -> 12/13 RED). The corpus itself is NOT reformatted yet: applying the formatter tree-wide is a separate decision. gofmt set the standard; zig fmt, swift-format, prettier, black follow.

YES
Incremental compilation / build cache

We rebuild whole modules every time; every peer caches

NO
Debugger + debug info (DWARF / source maps)

DWARF v5 .debug_line at STATEMENT granularity, OPT-IN via -g: the compiler emits .file/.loc, nxasm accumulates (address,file,line) and encodes the line program, and the ELF carries the section behind a section-header table. PROVEN END-TO-END 2026-08-07 by nx_dwline_e2e_gate 14/14 -- it drives the real nx_cc_sovereign + nxasm_x86_main, and recovers source lines 5 and 9 from real addresses in the emitted ELF; its load-bearing tooth is the negative control that WITHOUT -g there is no .debug_line at all, so the measured 168 B minimal static binary is untouched. Encoder and decoder are independent organs sharing no code and agree on 13/13 (nx_dwline_roundtrip_gate), and GNU readelf resolves the same addresses, so third-party gdb/addr2line interop is real rather than asserted. STATEMENT granularity landed 2026-08-07, MEASURED AT CORPUS SCALE against the previous build rather than asserted on a fixture: THE ENTIRE RUNTIME CORPUS -- all 11,379 files attempted, 11,121 built (97.7 percent), covering 1,725,477 functions. This is a census, not a sample: no curation, no window, nothing excluded. The 259 files that did not compile are PRE-EXISTING failures, not caused by this change -- in every window where both compilers ran, the built counts were identical under each (377 of 377, 400 of 400). The blessed function-granularity compiler emits EXACTLY one .loc per function, and that 1:1 identity is the control tooth: it held ON THE NOSE in every window where it was independently measured (78,399 rows for 78,399 functions across the two both-compiler windows). The new compiler emits 18,835,389 rows over the same population -- 10.9x denser -- with ZERO per-file regressions across all 11,121 files and no file losing its line info (nx_dwline_corpus_gate, which NAMES every regressing file individually and named none). Where the run used the derived baseline for speed it was CROSS-VALIDATED first: fast mode reproduced the both-compiler numbers EXACTLY on an identical 400-file range (31,000 functions, 165,800 rows, 400 improved, 0 regressed), and the invariant is deliberately NOT asserted in derived mode because that would be circular. The narrow proof is also kept: nx_dwline_stmt_gate 13/13 shows all four source lines of a two-function probe recovered from real addresses in the emitted ELF, with a baseline tooth asserting the OLD compiler LACKS the statement lines so the gain is attributable. Line numbers ride OUT OF BAND keyed by instruction pointer -- struct Instr was NOT widened -- and nx_cc_equiv_gate stayed 10/10 + selfhost with byte-identical ea/eb on every row, proving the change is inert when -g is off. STILL PARTIAL and graded as one: .debug_info (types and variables) and an actual stepping debugger are ABSENT, and this axis is a conjunction -- debug INFO without a debugger is not a debugger. gdb-on-C stays the bar; both are filed rungs, not design choices

PART
REPL / interactive development

Python REPL + notebooks the bar; wasm target + nishi-pages could host ours (queued)

NO
Package ecosystem / supply chain

Deliberate different-path bet: content-addressed substrate, no version negotiation, zero dependency-confusion surface -- still graded No on presence until the bet is measured as an exceed

NO
Probing + in-repo compiler fuzz/self-heal loop (fuzz gen, EMI oracle, splice bisector, native diagnostic-corpus gate, never-brick bless)

Found and named real nx_cc bugs (empty-.s class 2026-07-05; EMI oracle born catching a silent optimizer miscompile [emi2014]; gate 10/10 GREEN 2026-07-07); peers rely on external fuzzers (rustlantis, go-fuzz, csmith). PROBING IS NOW A NATIVE FIRST-CLASS CAPABILITY, not a pile of shell scripts (2026-08-14): nx_langdiag_gate runs the whole language-diagnostic probe corpus in NishiLang -- 11 rows GREEN through the shipped gate runner -- and it closed a real hole in how this estate had been testing refusals. The prior bash cells asserted only THAT a probe was refused (the emitted assembly was empty); a refusal for a COMPLETELY DIFFERENT reason passed them silently, which is the same blind-by-construction shape as a deny-test suite that never asks which rule fired. Every row now pins the refusal to its own rule phrase or capability slug, so a wrong-reason refusal is RED -- BITE-PROVEN by planting a slug the rule never prints, which yields exit=2 want_exit=2 with the reason mismatched, exactly the case the old cell passed. Acceptance rows (must compile AND emit real assembly) are the discrimination control: without them a compiler that refused every input would score full marks on the refusal rows. It composes the estate's incumbents rather than adding a ruler -- nx_gate_lib's fork-and-assert case runner for mechanics, nx_gate_verdict for adjudication (the promote door REFUSED the first build for rolling its own verdict, and migrating was taken over the documented override) -- and it reports a third state, UNRESOLVED, when the compiler under test cannot be found, because 'I could not look' is not 'it is broken'

BEST
Living bug-class ledger wired to language evolution

F1-F16 taxonomy + P1-P10 meta-patterns + 1651 external oracles classified into 26 ranked axes driving make-it-unrepresentable rungs; PLUS an AI-authoring friction lane (2026-08-13): full-population mining of the AI seats' own session transcripts (1,090 files / 2.88 GiB, counted not sampled) ranks which language defects burn agent tokens -- SEGV-class debugging 5,151 hits across 376 sessions, the paren-cast-index silent-truncation trap in 45 -- and the top-ranked reachable trap was root-caused, witness-gated and toolchain-promoted the same day; peers have public trackers, not ledgers wired to language change, and none wires AI-usage telemetry into language evolution; since 2026-08-13 night the loop is CLOSED IN THE COMPILER ITSELF AND COUNTED BY THE BUILD DOOR: capability-limit refusals stamp greppable capability=<slug> markers (float-int-boundary, call-arity-ceiling, memory-safety-enforcement) at the moment of friction, and /api/build now appends every marker to a DURABLE demand journal (knowledge/status/lang_demand.jrnl: epoch, slug, target; bounded 8/build, append-only, never fails a build -- live-bitten: one refused build wrote its 3 rows the moment it failed), so real demand re-ranks the climb with NO human in the circuit; the same session's refusal check also surfaced a 15-site latent parser gap (chained casts `X as *u8 as i64` were HALF-APPLIED forever, the dangler silently skipped) which is now a real chain, witness-gated

BEST

Sovereignty and determinism (the Nishi lane)

Whole-toolchain sovereignty (zero LLVM / GCC / libc beneath)

The chain nx_cc -> nxasm -> ELF is ours bits-up and compiles on the NAS over the mgmt API (build-over-API GREEN 2026-07-06); Rust/Zig/Swift sit on LLVM; Go owns its backend but links foreign substrate below

BEST
No-float integer determinism doctrine (bit-exact cross-platform)

A 100 percent integer LLM trained + greedy-matches the float reference 4-for-4 (2026-07-09); gate-grounded across codec and compute censuses; no peer ships float-free determinism as language doctrine

BEST
Byte-identical reproducible rebuild

Rebuild byte-identical dd1baff6 MEASURED 2026-08-04; Go reproducible-by-default (1.21+) is the bar; JVM/gradle and npm builds are not bit-exact by default

YES
Capability-secured toolchain ops (ocap least-authority, attenuate-only)

X-Nishi-Cap ocap tokens + fixed-arg pinning live-proven 2026-07-08; attenuate-only delegation audited in cap_consent.log; no peer language ships an ocap-gated ops surface

BEST
Verified compilation / translation validation

Nobody mainstream ships it (CompCert is a separate verified C compiler; RustBelt/miri are research); our eqsat engine exists but is unwired (honest) [egg2021]; queued behind the equivalence net

NO
11 competitors35 axes4 quantitativeNishi Best on 6
Honest verdict. NishiLang is a real self-hosted systems language with a self-healing compiler loop and five structural exceeds no peer carries: whole-toolchain sovereignty bits-up, no-float bit-exact determinism proven at LLM scale, an in-repo fuzz+EMI+bisector loop, a 1651-bug external-oracle ledger wired to language evolution, and an ocap-secured ops surface. It is not yet a peer of Rust, Swift, or Elm on enforced safety or the tooling ring: overflow (LN1 --chkarith, 2026-08-23), null (LN2 --optenforce, 2026-08-23) and raw-pointer provenance (LN3 --ptrprov, 2026-08-19) are enforced only under DECLARED MODES that default OFF, typed arrays are checked by default, and there is no race enforcement at all; no LSP, formatter, incremental builds, or STEPPING DEBUGGER, and measured 3.65x slower than gcc -O0 (debug INFO, however, is no longer absent: opt-in DWARF v5 .debug_line at function granularity landed 2026-08-07, gate-proven end-to-end and readable by GNU readelf); arity, exhaustiveness (naming missing variants), unreachable-arm refusal, caret + did-you-mean (calls AND identifiers), and multi-error recovery are ENFORCED sovereign-side as of 2026-08-05, each bite-witnessed refuse+accept on the live compiler. Under the less-than-SOTA-is-never-design law every No is filed work: measured demand (1651 oracle bugs) ranks miscompile-detection (638), vectorization (78), and poison/undef semantics (54) first. Discipline: the equivalence net is GREEN (nx_cc_equiv_gate 10/10 + selfhost, re-run 2026-08-13; standing rule: every compiler change passes it before promotion) and the loop now also eats traps mined from AI-seat usage: the paren-primary silent-truncation class -- ("lit" as *u8)[j] compiled clean, silently dropped the index, and left the pointer truncated in the receiver -- was ranked by a full-population scan of 1,090 session transcripts (2.88 GiB; the trap shape appears in 45 sessions), fixed in parse_primary (postfix chain now runs after a parenthesized primary, the same seq1552 class the string-literal path already carried), mutation-proven (gauntlet 32/32 under the fixed compiler, the pre-fix compiler RED on exactly the new cell), and toolchain-promoted canary GREEN 2026-08-13 with the leading-operator statement-break trap pinned CCFAIL in the same gauntlet; the SECOND 08-13 promotion closed the trap's leading-MINUS variant for good -- a continuation line starting with a unary-capable operator used to parse as a separate DISCARDED statement (the 2026-05-19 cross-product wrong-value shape, alive and measured exit-7 that morning) and is now refused by a discarded-pure-expression check in the statement fallback (provably-pure roots only, so call and syscall statements stay untouched -- the first cut wrongly refused a bare __syscall and was inverted per the fail-toward-doing-nothing law), speaking the 5W+H voice with file:line, caret, why and fix; equiv net 10/10+selfhost GREEN twice, gauntlet 33/33 with both must-refuse cells and the estate is MEASURED arity-clean (9-target backfill sweep, 56 closure files, ~1625 functions, 0 mismatches incl the compiler's own 692-function closure) -- so the enforcement climb has crossed its diagnostics rungs (arity, exhaustiveness, caret+DYM, multi-error recovery); per-file line mapping and function-granularity DWARF are now CLOSED (nx_dwline_e2e_gate 14/14 + nx_dwline_roundtrip_gate 13/13, 2026-08-07); open: the safety ring, .debug_info (types/variables) and a stepping debugger, regalloc-on-x86, then the tooling ring (LSP, formatter, incremental, stepping debugger). RUNTIME CRASH DIAGNOSTICS rung 1 SHIPPED 2026-08-13: a SIGSEGV/SIGBUS/SIGILL/SIGFPE in a guarded program now prints the instruction address and the fault address in the same 5W+H voice and STILL dies by the ORIGINAL signal (wait-status unchanged) -- one call arms it (nx_crash.nx), the toolchain's own binaries (nx_cc + nxasm) ship armed, the handler ABI and signal-frame offsets are witness-proven by an exact planted fault address (nx_probe_crash_live.nx derefs address 64 and the diagnostic prints 0x...40), and the armed toolchain is proven inert by byte-identical emitted artifacts; this rung was ranked FIRST by the AI-transcript mine (5,151 silent-SEGV hits across 376 sessions -- the largest language-attributable token burn). BOTH named follow-ons SHIPPED the same afternoon: the guard is now DEFAULT-ON for every compiled main (driver-append + parser-inject, --no-crash-guard opt-out, +4.9 KB measured, equiv corpus run-behavior byte-equal) and stack-overflow crashes speak through a 32 KiB sigaltstack with a classifier that names UNBOUNDED RECURSION; remaining: in-process file:line resolution against .debug_line. Climb ledger: debt lane lang-radar-climb-program.

Person · product · place — not yet measured for this domain

Every compare carries this layer. Declare knowledge/compare/lang.ppp (rows surface|nishi or c1..c4|label|url|connect naming OUR live surface and each rival's front door), run nx_ppp_probe domain lang, and this section fills itself on the next beat: the same ruler on both sides — privacy and CX (third-party hosts, tracker classes, cookies, security headers), design and longevity (design hygiene, computed WCAG contrast, render-blocking resources, unsized media, script weight, theme and motion queries), findability (landmarks, skip link, on-site search, breadcrumb, headings, internal links).

References

Beyond a link list. Every reference below resolves twice — the publisher's copy and, where banked, the estate's own non-rottable library mirror with a content pin — and carries its evidence class plus the exact claim on this page it grounds. Keyed marks like [key] in the axis notes jump here. A dash means honestly absent, never assumed.
  1. [rust-ownership] The Rust Project. The Rust Programming Language, chapter 4: Understanding Ownership (ownership, borrowing, and the borrow checker). Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_rust-ownership.html · pin hb000ae040981e3d15a775e11c6d3567c41967e375d70f7346de8654764f8477a · accessed 2026-08-18 · vendor-docGrounds: The Rust column: Memory safety (bounds, ownership, use-after-free) Best, Use-after-free prevented (CWE-416 class) Best and the lang.sota Compile-time memory safety enforcement Best -- the borrow checker is the bar the own_check_move and own_check_uaf watch contracts are measured against.
  2. [zig0151] Zig Software Foundation. Zig 0.15.1 Release Notes: self-hosted x86 backend default for Debug builds on x86_64, async and await keywords removed pending the std.Io redesign, module-level UBSan modes, zig fmt auto-upgrade. Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_zig0151.html · pin h9de868b1d922477b725d3bdb7229ba672801c0aa28dde239c60379dccf3d6963 · accessed 2026-08-18 · vendor-docGrounds: The Zig column and the BARS line (Zig 0.15.1, 2025-08-29): lang.sota Native backends in one shipped toolchain (Zig 0.15 ships its self-hosted x86 backend), Lightweight concurrency (Zig async dropped in 0.15 pending redesign), Integer overflow checked (Zig safe-mode) and Canonical source formatter (zig fmt).
  3. [go118] The Go Authors. Go 1.18 Release Notes: generics (type parameters, type sets), fuzzing in the standard toolchain, workspaces. Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_go118.html · pin h3196a875d7e52f2fd6b5726e41f0a614c56906f7b446f27b5df788025b7d2af8 · accessed 2026-08-18 · vendor-docGrounds: The Go column: Generics + monomorphization (Go added generics in 1.18; lang.sota Go type sets since 1.18) and the go-fuzz lineage the In-repo compiler fuzz generator row names as an external fuzzer.
  4. [elm-errors] Czaplicki, E. Compiler Errors for Humans (Elm 0.15.1 announcement, elm-lang.org news): line-cited errors, source excerpts, hints and did-you-mean suggestions. Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_elm-errors.html · pin h312d098809ea8a53bf3b337b5e423b8f806d21a9098b1f17b7cafe66a37dab8d · accessed 2026-08-18 · vendor-docGrounds: The Elm column Best on Rich diagnostics in the shipping compiler (caret, did-you-mean, multi-error) and lang.sota Compiler diagnostics: this is the Elm-class voice the 5W+H undefined-name family and the caret + did-you-mean rungs are graded against (Elm and rustc remain the bar on error codes and explain prose).
  5. [cisa-memsafe] CISA, NSA, FBI and partners. The Case for Memory Safe Roadmaps: Why Both C-Suite Executives and Technical Experts Need to Take Memory Safe Coding Seriously (December 2023). Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_cisa-memsafe.html · pin hf9d24a5023c144a32eee09e53ddf961809518206cc1419b6b817547a15ef6ede · accessed 2026-08-18 · published-standardGrounds: The PUBLIC BUG DUMPS line (bug_cisa_memsafe, banked 2026-07-10) and every CWE-class safety row: Bounds-checked access (CWE-787 and CWE-125), Raw-pointer access prevented, Use-after-free (CWE-416), Integer overflow (CWE-190) -- the roadmap is why those classes head the safety ring and why the memory-safety gap is graded the largest on this board.
  6. [emi2014] Le, Afshari, Su. Compiler Validation via Equivalence Modulo Inputs. PLDI 2014 (Distinguished Paper Award). EMI project page with the paper and the GCC/LLVM bug tally. publisher · read in our library knowledge/fetched/cmp_lang_emi2014.html · pin hd6ed16853f6aa9fe7071cfcce27bf5f3cd9ff49c3a4bb7f7f142ec6e3ff8e0a6 · accessed 2026-08-18 · published-paperGrounds: The Differential EMI oracle on the compiler gate row and the lang.sota Probing + in-repo compiler fuzz/self-heal loop cell: nx_cc_equiv_gate is the EMI method (equivalent programs must build and run byte-equal) applied in-repo, born catching a silent optimizer miscompile.
  7. [egg2021] Willsey, Nandi, Wang, Flatt, Tatlock, Panchekha. egg: Fast and Extensible Equality Saturation. POPL 2021. arXiv:2004.03082. publisher · read in our library knowledge/fetched/cmp_lang_egg2021.html · pin he3bed05ebf48a84fb260752a3dbb1b8a98a8dec8fc03c72ea9c1573d5b0259df · accessed 2026-08-18 · published-paperGrounds: The Equality-saturation engine row and the opt_eqsat_pass watch contract: nx_eqsat's egg-style deferred congruence closure (rebuild) and e-class analyses (const-fold) are this paper's design, and the Verified compilation / translation validation cell names eqsat as the wired-next oracle.
  8. [poletto1999] Poletto, Sarkar. Linear Scan Register Allocation. ACM Transactions on Programming Languages and Systems 21(5), 1999. publisher · read in our library knowledge/fetched/cmp_lang_poletto1999.html · pin h9cd2d89cf54ac5c10d78bd80a21a99c466f306490ea90cdb19ebd77ae9587349 · accessed 2026-08-18 · published-paperGrounds: The RISC-V target row (the linear-scan allocator nx_regalloc, Poletto-Sarkar, is wired there) and the Competitive native speed vs C row: the x86_use_regalloc watch is about consuming the allocation this algorithm already computes.
  9. [stabilizer2013] Curtsinger, Berger. STABILIZER: Statistically Sound Performance Evaluation. ASPLOS 2013. publisher · read in our library knowledge/fetched/cmp_lang_stabilizer2013.pdf · pin h819c930cc8f51a65a24cdc46452a29ec2c872391724974d21589a8729dac9c49 · accessed 2026-08-18 · published-paperGrounds: The BARS line perf bar (gcc -O0 Stabilizer-validated, bench/paired_native_microbench.tsv 2026-05-20) and the lang.sota Native speed vs C row: the 3.65x figure is a Stabilizer-style layout-randomised comparison, which is why it and the 2026-08-14 h2h numbers are declared different benchmarks and neither refutes the other.
  10. [oncd2024] Office of the National Cyber Director, The White House. Back to the Building Blocks: A Path Toward Secure and Measurable Software (February 2024). Technical report PDF. Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_oncd2024.pdf · pin h3244ac0dd424bde0b23a63ec904787d0163951154d0ae546ce683a18e85d9eeb · accessed 2026-08-19 · published-standardGrounds: Memory safety (bounds, ownership, use-after-free) and the safety-ring watch rows (own_check_move, own_check_uaf, bck_ptr_provenance) plus the lang.plan memory-safety-mandate bar: the White House report that made memory-unsafety a national-security finding.
  11. [regehr-ub] Regehr, J. A Guide to Undefined Behavior in C and C++, Part 1. Embedded in Academia blog. Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_regehr-ub.html · pin h93435da7091bce40980326e965f50a34b3cdd7e53e29f358dab6b20e0b28dc4d · accessed 2026-08-19 · vendor-docGrounds: Integer overflow checked (CWE-190 class) and the lang.sota UB / poison semantics cell: the canonical statement of silent UB as a miscompilation engine -- the negative bar the refusal-with-reason lane answers, cited by the lang.plan UB bar.
  12. [rustperf2025] The Rust Project. Rust Compiler Performance Survey 2025 Results (September 2025): 55 percent of respondents wait over 10 seconds for an incremental rebuild. Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_rustperf2025.html · pin h732adfe07406baa416bd46d62201a1214ef37e27d5a2ba22c7e3075a23b420b0 · accessed 2026-08-19 · vendor-docGrounds: Incremental compilation / build cache and the lang.plan adoption-tax bar: the measured compile-latency tax that toolchain.plan B-rungs and the inc_cache_lookup watch exist to refuse.
  13. [rustsurvey2025] The Rust Project. 2025 State of Rust Survey Results (March 2026): community-measured complexity worry and adoption blockers. Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_rustsurvey2025.html · pin ha6701ab12caecdbdd442d43499a831f65d88a8ab19569ba0955663fd01c9bd5e · accessed 2026-08-19 · vendor-docGrounds: The lang.plan adoption-tax bar and complexity-creep risk: the Rust community's own measured fear that the language grows too complex -- the control group for every annotation NishiLang declines to add.
  14. [tob-supply2025] Trail of Bits. Supply chain attacks are exploiting our assumptions (September 2025): the npm worm record and install-time execution as the root enabler. Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_tob-supply2025.html · pin h36a1f2e54ba32c23659dd086647eb6ae8b4cd032673ffbf9a03f393230ac6d1d · accessed 2026-08-19 · vendor-docGrounds: Supply chain by construction (no install scripts, content-addressed, no registry attack surface): the 2025 registry-worm record that makes the zero-install-script content-addressed bet worth measuring as an exceed (pkg_cas_resolve).
  15. [midori-errors] Duffy, J. The Error Model. Midori project retrospective, joeduffyblog.com (February 2016). Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_midori-errors.html · pin h0d1f12fe40b8a80fc45663a6e1d12531f65406f9d9ecedbef4162f551079a7c3 · accessed 2026-08-19 · vendor-docGrounds: Errors as values with enforced propagation (the Midori model): typed recoverable errors plus fail-fast abandonment -- the design bar for the res_propagate_op watch and the lang.plan errors bar.
  16. [go-errsyntax] Griesemer, R., for the Go team. On or No syntactic support for error handling (go.dev blog, June 2025): Go closes all error-handling syntax proposals. Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_go-errsyntax.html · pin h5d9402af993a26016b3826877d0e4640b363ab2f683247e2bba2c58a0f51796c · accessed 2026-08-19 · vendor-docGrounds: Errors as values with enforced propagation (the Midori model): the 2025 proof that error ergonomics cannot be retrofitted once a community standardizes on the boilerplate -- why rung E1 ships while the corpus is still ours.
  17. [njs-nursery] Smith, N. J. Notes on structured concurrency, or: Go statement considered harmful. vorpus.org (2018). URL witnessed 2026-08-19; vorpus.org refuses the sovereign fetch lane (TLS handshake class), mirror declared absent. publisher · accessed 2026-08-19 · vendor-docGrounds: Structured concurrency (scoped spawn, no orphan tasks): the founding nursery essay -- spawn only inside a scope that joins its children -- the design bar for the sc_scope_spawn watch.
  18. [nystrom-colors] Nystrom, B. What Color is Your Function? journal.stuffwithstuff.com (February 2015). Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_nystrom-colors.html · pin h2958fb04a0a37663c1ac992843a4d89f3460326eb203356134894a532f6cd728 · accessed 2026-08-19 · vendor-docGrounds: Structured concurrency (scoped spawn, no orphan tasks) and the lang.sota Colorless functions cell: the colored-function essay naming the async split NishiLang avoids by construction.
  19. [rule-of-2] Chrome Security Team. The Rule of 2. Chromium in-tree security documentation. Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_rule-of-2.html · pin hc65a1ed50b0bf606c7331a3ffc9060dad0919ccc9af4cebc9f5793415ed52eb8 · accessed 2026-08-19 · vendor-docGrounds: Safety ring inherited by NishiOS + Nishi Browser (the Rule-of-2 discharge): the browser bar -- untrustworthy input, an unsafe language and high privilege may never combine -- that the nxos_lang_ring_attest watch discharges by measurement.
  20. [ferrocene] Ferrous Systems. Officially Qualified: Ferrocene (TUV SUD qualification of the Rust toolchain, ISO 26262 and IEC 61508). Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_ferrocene.html · pin h47438da624dbe83ea88bf196ac969406cf5e5ff860e41834fe346b9e1b6dfec0 · accessed 2026-08-19 · vendor-docGrounds: Written language specification + conformance suite: Rust reached safety-critical qualification only by retrofitting a written spec -- the certification floor the spec_conformance_run watch takes early.
  21. [austral-caps] Borretti, F. Austral tutorial: Capability-Based Security (linear capabilities; authority is a value, never ambient). Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_austral-caps.html · pin h0c81921773cac8d9d060ebf0b5bf2dd44dbe56edbafe0dd8aebf9a53939c722f · accessed 2026-08-19 · vendor-docGrounds: Language-level capability security (no ambient authority): the linear-capability design where authority is handed to main and a dependency signature IS its permission manifest -- the bar for the cap_root_main watch.
  22. [matklad-ide] Kladov, A. (matklad). Next Few Years. rust-analyzer blog (May 2020): the IDE-first query-architecture argument. Accessed August 2026. publisher · read in our library knowledge/fetched/cmp_lang_matklad-ide.html · pin h9d10fcd196d73d19edfd58e755f3ee65311247a0fb609327257c58655a88465b · accessed 2026-08-19 · vendor-docGrounds: Language server / editor integration: the IDE-first bar -- the lsp_serve watch consumes the compiler's own front-end, never a second parser.

Generated by nx_swcompare_sota from knowledge/compare/lang.sota — quantitative axes measured/sourced; researcher-fed (nx_swcompare_research). Zero JS, zero trackers.

Where we are. NishiLang is a real self-hosted systems language: sovereign compiler (exceed: the whole chain bits-up), generics, sum types with exhaustiveness, two native backends, wasm, arity and type checks, caret and did-you-mean diagnostics, DWARF .debug_line, bounds-checked typed arrays, a gate-proven equality-saturation engine, and a compiler self-healing loop no peer carries in-repo; the no-float integer-determinism doctrine is proven at LLM scale (exceed). Not yet a peer of Rust, Zig, Go or Elm on what the public bug dumps say matters: raw-pointer provenance, ownership and use-after-free, checked arithmetic, option enforcement, data-race typing, closures, qualified imports, free multi-line expressions, working f64, the backend consuming its register allocation, eqsat consumed by a backend, an LSP, a formatter, incremental builds, a stepping debugger.

Where we need to go. The safety rungs the language can enforce (CWE-787 125 416 190 476 362 classes), a backend that uses the registers it already allocates, eqsat rewriting real IR behind the equivalence net, and the tooling ring every peer ships -- each bite-proven and promoted only after nx_cc_equiv_gate 10/10 plus self-host stays GREEN.

The unit. 1 u = one measured session-leg (estate calibration: graphics R21 in one leg 2026-08-15). Local evidence: arity checks, match exhaustiveness, diagnostics and .debug_line each landed in one leg (2026-08-05 to 08-07); estimates are relative to those.
Where we are: 23 open rungs. Language core and self-healing loop real; safety enforcement and tooling ring behind. Counts measured at emit below this line.
Cost to the cheapest safety wins: 3.5 u. LN1 checked overflow (first rung already shipped for constant shifts), LN2 option enforcement, LN3 pointer provenance -- the top of the CISA roadmap.
Cost to the memory-safety core: 6 u. LN4 ownership moves, LN5 use-after-free, LN6 Send-Sync typing -- the Rust axis, staged last in this tier because each needs the type system rungs below it.
Cost to a faster backend: 3.5 u. LN7 the x86 emitter consuming its allocation (witness-backed diagnosis), LN8 eqsat rewriting IR through the pass behind the equivalence net.
Cost to the tooling ring and language ergonomics: 9.5 u. LN9 formatter (cheapest, the tokenizer already yields the stream), LN10 incremental build cache (the key is solved), LN11 LSP, LN12 stepping debugger, LN13 closures, LN14 qualified imports, LN15 free multi-line expressions, LN16 working f64.
Cost to the research-admitted ring (2026-08-19 four-lane sweep): 16 u. LR1 enforced error model, LR2 structured concurrency, LR3 supply-chain measurement, LR4 capability security, LR5 written spec, LR6 OS-browser inheritance attestation, LR7 sound bounds-check elision -- the complaint classes the sweep says cannot be retrofitted later.

Research bar. Rust 1.97 is measured on borrow checker, rust-analyzer, rustfmt, incremental compilation. Theirs: the safety and tooling bar. Ours: LN3-LN6 LN9-LN11 measured on this page.

Research bar. Zig 0.15 is measured on runtime safety modes, zig fmt, ReleaseSafe. Theirs: the checked-arithmetic bar. Ours: LN1.

Research bar. CISA memory-safe roadmaps is measured on the public case for memory safety by class. Theirs: the priority order for the safety rungs. Ours: LN3 LN4 LN5 [@oncd2024].

Research bar. Rust adoption-tax record is measured on 55 percent of Rust users wait over 10 s per incremental rebuild and complexity is the community's leading worry about its own future. Theirs: the anti-bar: admired-class safety must not cost the adoption taxes. Ours: the safety rungs stay annotation-light (arena and region model) and toolchain.plan B-rungs keep builds sub-second [@rustperf2025] [@rustsurvey2025].

Research bar. The Midori error model is measured on typed recoverable errors in signatures plus fail-fast abandonment, with ergonomic propagation. Theirs: the errors bar; Go's 2025 capitulation proves the retrofit window closes. Ours: LR1 ships must-use Result and one-character propagation while the corpus is still ours to migrate [@midori-errors] [@go-errsyntax].

Research bar. Structured concurrency (Trio nurseries, JEP 505, Swift task trees) is measured on spawning only inside a scope that joins its children so cancellation and errors compose. Theirs: the 2026 concurrency floor. Ours: LR2 adds the scoped form over the colorless pool -- the async-split trap was never taken [@njs-nursery] [@nystrom-colors].

Research bar. The 2025 registry worms is measured on self-replicating npm compromises of 500+ packages via install-time execution and blind version trust. Theirs: why the no-registry content-addressed bet must be MEASURED as an exceed. Ours: LR3 ships the package lane with zero install-time execution and content-addressed identity [@tob-supply2025].

Research bar. Capability security (Austral, Pony, the ocap lineage) is measured on authority is a value handed to main, never ambient; a dependency signature IS its permission manifest. Theirs: the supply-chain root fix no mainstream language ships. Ours: LR4 extends the estate's live ocap surface into the type system [@austral-caps].

Research bar. Ferrocene qualification is measured on Rust reached safety-critical qualification only by retrofitting a written spec. Theirs: the certification floor NishiOS device lanes will demand. Ours: LR5 writes the spec and conformance suite while the language is small enough to specify [@ferrocene].

Research bar. Chromium Rule of 2 is measured on untrustworthy input, an unsafe language and high privilege may never combine. Theirs: the browser inheritance bar: incumbents sandbox around their language. Ours: LR6 attests Nishi Browser parses at privilege under the enforced ring [@rule-of-2].

Research bar. IDE-first compiler architecture is measured on the front-end is a lazy query database serving IDE, CLI and agents; retrofitting one is isomorphic to a rewrite. Theirs: the tooling-ring architecture bar. Ours: LN11 serves LSP from the compiler's own front-end and diagnostics, never a second parser [@matklad-ide].

RungCloses withDefinition of done (pre-declared)ExecutorEst.
Self-hosted sovereign compiler (LB0)func main(argcgen2 == gen3 fixpoint, equiv gate 10/10 -- LANDEDOrgan0 u
Arity and param-type checks (LB1)
after LB0
prepass_count_paramsCompiler-enforced, bite-proven live -- LANDED 2026-08-05Organ0 u
Match exhaustiveness (LB2)
after LB0
n_variantsMissing and unreachable arms refused by name -- LANDEDOrgan0 u
Rich diagnostics (LB3)
after LB0
nx_diag_caretCaret, did-you-mean, multi-error recovery -- LANDEDOrgan0 u
Bounds-checked typed arrays (LB4)
after LB0
NX_BOUNDS_CHECK_LIVELive checks, cost measured 2.23x -- LANDEDOrgan0 u
DWARF .debug_line (LB5)
after LB0
lm_stmt_stampStatement-granularity line table, readelf-validated -- LANDEDOrgan0 u
Equality-saturation engine (LB6)nx_eqsat_unionSeven gates, 93 teeth, all GREEN -- LANDED 2026-08-14Organ0 u
Checked integer arithmetic (LN1)
after LB0
chk_add_overflowi64 add and mul trap or refuse on overflow under a declared mode (the shift-count rung already ships); gate proves an overflowing add traps and an in-range add is byte-identical to todayOrgan1 u
Option enforcement (LN2)
after LB1
opt_enforce_unwrapA pointer or Option value must be unwrapped through a checked path before deref in checked mode; gate proves the sentinel-zero deref class (the recurring P2 meta-class) is refused at compile time on a fixture and the stdlib still buildsOrgan1 u
Raw-pointer provenance (LN3)
after LB4
bck_ptr_provenanceA raw *u8 deref carries its allocation extent where the compiler can see one (arena allocations, sys_mmap results) and is checked like typed arrays; gate proves the 2026-07-08 READ-TO-NUL over-read fixture trapsOrgan1.5 u
Ownership moves (LN4)
after LN3
own_check_moveMove semantics for owned buffers: use after move is a compile error; gate proves a fixture double-use is refused and the existing corpus builds unchanged under the default modeOrgan2.5 u
Use-after-free prevention (LN5)
after LN4
own_check_uafWith LN4, a freed or released owner cannot be read; gate proves a planted UAF fixture is refused and the arena no-free doctrine is now enforced not assumedOrgan1.5 u
Data-race typing (LN6)
after LN4
sync_send_checkSend-Sync-class marker on values crossing the thread pool; gate proves a non-Send value handed to nx_pool_submit is refusedOrgan2 u
Backend consumes its register allocation (LN7)
after LB0
x86_use_regallocThe x86 emitter keeps allocated values in their registers instead of spilling to stack homes on entry (the witness: loop counter in r12, accumulator in r13, still reloaded); done-rule: nx_probe_bchk_asm shows no home reload and the checked loop bench improves, equiv net 10/10 plus self-host GREEN -- LANDED 2026-08-23 (x86_use_regalloc, nx_x86_64_ctx.nx): the homed loop counter is compared IN PLACE (movq+cmpq scratch copy removed), main() 64->60 instrs, nx_bounds_perf checked hot loop -16.5% (8278us->6912us median); SOUND cross-block forwarding (cut-the-load-block availability, self-host-proven after a merge-unsound draft was caught and rewritten); nx_x86_regalloc_use_gate 5/5 GREEN, 3/5 RED vs banked pre-LN7; equiv 10/10+selfhost GREEN; LN1/LN2/LN3/LN8 still GREEN; promoted a21068ae both rootsOrgan2 u
Eqsat consumed by the backend (LN8)
after LB6
opt_eqsat_passThe pass rewrites real IR through the e-graph under the proven rule table, queued behind the equivalence net; done-rule: x xor x folds where const_fold cannot, controls hold, byte-identical on the 13,201-source population except the rewritten sitesOrgan1.5 u
Canonical formatter (LN9)
after LB0
srcfmt_emitIdempotent formatter over the tokenizer stream; gate proves fmt(fmt(x)) == fmt(x) and the formatted corpus builds to byte-identical binaries -- SHIPPED 2026-08-23: nx_srcfmt live and registered, nx_srcfmt_gate 13/13 GREEN, style measured from the corpus, the token-stream oracle guarantees non-mutationOrgan1 u
Incremental build cache (LN10)
after LB0
inc_cache_lookupPer-module cache keyed by the closure sha the build door already computes (the B2 cache keys whole targets); gate proves a one-file edit rebuilds only its dependents and the output equals a full buildOrgan2 u
Language server (LN11)
after LB3,LN9
lsp_serveHonest greenfield (nx_lsp.nx does not exist): diagnostics, goto-def and hover over the genealogist's code graph; gate proves initialize plus a diagnostics round-trip against a recorded client transcriptOrgan3 u
Stepping debugger (LN12)
after LB5
dbg_step_overThe doctor lane's DT1: break and step on our own binaries over the line table we emit (one contract, two pages)Organ3 u
Capturing closures (LN13)
after LB0
parse_closure_captureClosures capturing by value into a compiler-emitted environment struct; gate proves a captured counter increments across calls and a capture of a moved value is refused once LN4 landsOrgan2 u
Qualified imports (LN14)
after LB0
imp_qualified_nameNamespace-qualified names so two organs may export the same identifier; gate proves a shadow collision from the 2026-06-23 census compiles unambiguously with qualificationOrgan1.5 u
Free multi-line expressions (LN15)
after LB0
tok_line_continuationA continuation line opening with a binary operator joins the previous statement instead of becoming a dead statement (the det2x2 bug class); gate proves the fixture that caused the runtime-wide sweep now computes and a lone operator line is a diagnosed errorOrgan1 u
Working f64 arithmetic (LN16)
after LB0
x86_emit_f64_binopCorrect SSE2 emission for f64 add sub mul div; done-rule: nx_probe_float run-exit=0 (1.5 plus 1.5 equals 3.0), deliberately low priority under the no-float doctrineOrgan1 u
Errors as values, enforced with propagation (LR1)
after LB1
res_propagate_opA dropped Result refuses (must-use) and a one-character propagation form rethrows with context; abandonment stays fail-fast (the Midori split); backfill census before enforcement; witness refuse and accept both directionsOrgan2 u
Structured concurrency: scoped spawn (LR2)
after LB0
sc_scope_spawnSpawn exists only inside a scope that joins its children; child error propagates to the scope; cancellation is scoped; the orphan-task shape is unrepresentable; pool witnesses stay greenOrgan2 u
Package lane: content-addressed, zero install-time execution (LR3)pkg_cas_resolveAn external module resolves by content hash with no version negotiation and no code execution at install; a planted typosquat cannot resolve; the supply-chain bet becomes a measured exceedOrgan2 u
Language-level capability security (LR4)
after LN4
cap_root_mainmain receives root capabilities and syscall surfaces require a capability value; a dependency demanding new authority fails to compile; extends the live ocap ops surface into the type systemOrgan3 u
Written language specification plus conformance suite (LR5)spec_conformance_runThe spec documents syntax, types, memory and refusal semantics; the conformance runner drives the shipped compiler over the suite and a planted deviation goes RED (the Ferrocene lesson taken early)Organ3 u
NishiOS and Nishi Browser inheritance attestation (LR6)
after LN1,LN4
nxos_lang_ring_attestThe attestation organ rebuilds the nishios kernel and browser closures under the enforcing compiler (ring on, crash guard on) and writes a receipt both compare pages cite; the Rule-of-2 unsafe-language leg is discharged by measurementOrgan2 u
Sound bounds-check elision (LR7)
after LN7
bck_elide_dominatedA dominated in-range re-check is elided ONLY under the blessed dominance oracle (an unsound elision is a silent memory-safety hole, the elision proof gate is the tooth); h2h checked lane approaches the unchecked bandOrgan2 u

Milestones

MilestoneRungsCumulative
M1 · Cheap safety winsLN1,LN2,LN33.5 u
M2 · Faster backend and the tooling ringLN7,LN8,LN9,LN10,LN11,LN1213 u
M3 · Memory-safety core and ergonomicsLN4,LN5,LN6,LN13,LN14,LN15,LN1626.5 u
M4 · Industry-complaint ring and OS-browser inheritance (research-admitted 2026-08-19)LR1,LR2,LR3,LR4,LR5,LR6,LR742.5 u

Risk register

RiskLikelihood x impactMitigation
Any optimizer or backend change that promotes without the equivalence net ships a silent miscompilecertain x highLN7 and LN8 done-rules require nx_cc_equiv_gate 10/10 plus self-host GREEN before promote_toolchain -- the canaried lane, never a hand copy.
Safety checks on by default break the 13,201-source corpus overnightlikely x highLN1-LN6 ship behind a declared mode with the corpus building unchanged under the default; the ratchet flips the default per class only when the corpus is clean.
Complexity creep erodes the adoption exceedpossible x highThe Rust record is the control: every added annotation or keyword is weighed against the community's measured complexity fear; the capability-limit voice teaches instead of gatekeeping; the explicit-types stance stays.

Watch contracts (measured)

Not a claim, a measurement. Each row names an organ and a symbol; the status is re-measured on every publish by the one ruler the ranker and the hive plane use, and the rule it applied is printed beside it: decl a top-level declaration in a NishiLang organ (a comment or a call site does not count), jsdecl a JS declaration form, exists the organ itself (the symbol is its name), marker a literal the organ carries, data a token in a data file. LANDED / PRESENT = measured present, WATCHING = the named contract is still open, MISSING = the row names something its organ does not carry, ABSENT = no contract named.
AxisOrganSymbolStatusNote
Self-hosted sovereign compiler (native x86-64 ELF)runtime/nx_compile_x86.nxfunc main(argcPRESENT declSelf-hosts through nx_cc_sovereign.elf; equiv gate 10/10 GREEN + self-host gen2/gen3 (blessed 2026-07-07); Elm compiler is Haskell-hosted
Optimization pipeline (const-fold SCCP mem2reg GVN CSE LICM DSE DCE)runtime/nx_opt.nxfunc opt_gvn_blockPRESENT declAbout O1-class today; LICM correctness-gated; Rust rides LLVM full O3 depth
Generics + monomorphizationruntime/nx_parse.nxinstantiate_generic_nPRESENT declFull monomorphization port landed; Go added generics in 1.18
Sum types + pattern matchruntime/nx_parse.nxparse_stmt_matchPRESENT declPayload ctor and match probes re-verified run-exit=0 (2026-07-09, earlier SIGSEGV fixed by the 07-07 bless); Go lacks sum types; Elm ADTs are the bar
Threads / parallel runtimeruntime/nx_thread_pool.nxnx_pool_submitPRESENT declRing-arena pool, measured 7x pooled speedup (2026-07-06 gate); Go goroutines lead; Elm has no threads
Bounded-loop safety primitives (JPL Rule 2)runtime/nx_loop.nxnx_loop_beginPRESENT declnx_loop watchdog and settle primitives; peers leave loop bounds to external lint standards
WebAssembly targetruntime/nx_wasm.nxwat_emit_modulePRESENT declOwn .nx to .wat to .wasm chain (nx_wat_compiler); Rust wasm ecosystem leads; Elm targets JS only
RISC-V targetruntime/nx_riscv.nxfunc materialisePRESENT declSecond native backend; the linear-scan allocator (nx_regalloc, Poletto-Sarkar) is wired HERE, not x86
In-repo compiler fuzz generatorruntime/nx_shapeprobe.nxsp_atoiPRESENT declShape-axis generator found a real nx_cc bug (about 1500 early-exit blocks = empty .s, 2026-07-05); peers rely on external fuzzers (rustlantis, go-fuzz)
Differential EMI oracle on the compiler gateruntime/nx_cc_equiv_gate.nxeq_buildPRESENT declBaseline-vs-challenger build+stdout byte-equal + self-host stage; gate 10/10 GREEN (2026-07-07); born catching a silent optimizer miscompile
Per-function miscompile bisectorruntime/nx_cc_splice_bisect.nxsb_try_frankenPRESENT declFunction-splice frankenbuild names the breaker function; Rust cargo-bisect-rustc bisects nightlies, not functions
Compiler health witness, autonomously drivenruntime/nx_cc_health.nxrun_argvPRESENT declGenerate-build-verify witness; nx_exec_engine drove it 3/3 GREEN autonomously (2026-07-06)
Never-brick compiler bless (equiv-gated install + rollback)runtime/_hdl_build/nx_bless_compiler.nxbc_equiv_greenPRESENT declRefuses install unless differential equivalence is GREEN; byte-identical corpus check
Equality-saturation engineruntime/nx_eqsat.nxnx_eqsat_unionPRESENT declBUILT AND GATE-PROVEN FOR THE FIRST TIME 2026-08-14, and it took two real fixes to get there. (1) THE ENGINE DID NOT COMPILE: NX_EQSAT_W was declared 470 lines below its first reader, and nx_cc refuses that because the reader would silently see 0 -- which would have inverted every shift-width soundness guard and fired the mul-to-shl rewrite exactly where nx_rule_soundness proved it UNSOUND. Nobody had noticed because a leaf lib is never built directly and all 10 importers were unbuilt too. (2) TWENTY-SEVEN CALL SITES ALLOCATED TOO FEW BYTES FOR NxEGraph: the struct has grown to 35 fields = 280 bytes, and the sites asked for 128, 256 or 96 -- not one asked for 280. Everything from hc (offset 128) onward, which is the entire meet, DSL, const-fold and match-worklist state these very proofs certify, was written OUT OF BOUNDS; the 96-byte sites overran by 184. CORRECTION TO MY OWN FIRST NUMBER, published here earlier today as nine sites across five files: that was the population of ONE SPELLING. The first sweep grepped the literal `sys_mmap(128) as *NxEGraph` and missed the 256 and 96 variants entirely, including the worst of them. A SWEEP THAT MATCHES THE WRONG VALUE REPORTS A CLEAN POPULATION AND LEAVES THE WORST SITES LIVE -- the honest scan keys on the CAST (`as *NxEGraph`), not on the size. What actually surfaced the miss was the arena's own ring detector: nx_eqsat_dsl_parity_test printed ARENA-OVERRUN prev_alloc_size=256 eight times WHILE REPORTING 15/15 GREEN, which is why a green verdict is never a substitute for reading the output. All 27 sites now derive from NX_EQSAT_GRAPH_BYTES (corpus_complete=1) and the same gate re-runs 15/15 with ZERO overruns. Three comments in the struct asserted page-rounding made the new fields fit; that stopped being true when NXA_SMALL_MAX moved 64->256 on 2026-08-07, the identical ARENA-OVERRUN prev_alloc_size=128 signature recorded in rv64im_min_sim.nx:111. Now sized by NX_EQSAT_GRAPH_BYTES. RESULTS -- SEVEN GATES, 93 TEETH, ALL FIRST RUNS EVER: nx_eqsat_membership_proof_test 22/22 GREEN (membership-as-proof certificate over a 3,584-vector battery against FOUR load-bearing controls, the sharpest being the k=W boundary that a pure equality sweep is PROVABLY BLIND TO -- both sides mask to zero for every vector, so only the side-condition catches it -- plus an undersized provenance log that must fail CLOSED rather than silently drop entries). nx_eqsat_bw_witness_gate 4/4 GREEN (1,048,576-vector exhaustive mod-2^W proof of the truncation semantics every other rule rests on; it was labelled a throwaway witness, had never been compiled, and could not even be RUN through the gate door until renamed, since /api/gate_run admits only names ending gate/test/kat). nx_opt_eqsat_oracle_gate 13/13 GREEN and REGISTERED, bite-proven RED 9/12 on a planted mutant. nx_eqsat_constfold_test 25/25 GREEN -- the deepest of them, with FIFTEEN named negative controls including five ops the folder must REFUSE for want of a faithful oracle cell (DIV, REM, SHR because logical is not arithmetic, SAR, NEG because NOT is not negate) and the sharpest control in the family: a back-door RULE_NONE merge whose endpoints genuinely DO share a class, so membership holds, and whose certificate must still FAIL because the merge cites no proven rule. nx_eqsat_congruence_test 10/10 GREEN (egg-style deferred congruence closure, cited fail-closed provenance, plus controls proving the rebuild is load-bearing and that NEG vs NOT on the same child is never merged) and nx_eqsat_rule_proof_test 4/4 GREEN (exhaustive 256-vector triangulated proof of mul-to-shl through two independent netlist legs and an oracle, with an unsound-shift-by-4 control proving the comparison can fail). Engine present and far deeper than this note used to claim (it said union-find and constfold rules): 2026-08-14 inventory found egg-style deferred CONGRUENCE CLOSURE, a const-fold e-class analysis with an explicit refusal set (DIV, REM, SHR, SAR, NEG are NOT folded), a DATA-DRIVEN rule DSL with a general e-matcher proven behaviourally identical to the hand-written rules, and a provenance log -- carried by its own gate family (congruence, constfold, dsl-parity, membership-proof, rule-proof, bw-witness) plus four benches. Peers do not ship eqsat either.
Equality saturation CONSUMED by a backendruntime/nx_opt_eqsat_pass.nxopt_eqsat_passLANDED declTHE PASS EXISTS AND REWRITES REAL IR AS OF 2026-08-14 -- opt_eqsat_pass (runtime/nx_opt_eqsat_pass.nx), gate-proven 10/10 by nx_opt_eqsat_pass_gate, registered. It builds a small e-graph per two-operand integer instruction with non-constant operands keyed on their SSA VALUE ID, saturates under the data-driven rule table plus the const-fold analysis, extracts the cost-minimal form, and folds the result when that form is a constant -- using the incumbent rewrite mechanism copied from opt_const_fold, introducing no new way to mutate IR. THE HEAD-TO-HEAD, ON ONE FUNCTION: for x xor x with x a runtime parameter, the incumbent opt_const_fold folds ZERO instructions (it structurally requires both operands constant) and opt_eqsat_pass folds ONE, to the constant 0. That gap is currently unmitigated in the shipping pipeline because opt_simplify, the peephole that would catch some of these, is BISECT-DISABLED in opt_run after a self-host miscompile. Controls: two distinct parameters are NOT folded, and OP_DIV_S is DECLINED because the gate simulator has no faithful cell for division, so the engine refuses to model it. Declared narrowness: i32 results are skipped rather than duplicating opt_const_fold mod-2^32 wrap, because a second wrapping ruler is how silent wrong values get made. THIS CELL STAYS OPEN ON PURPOSE. nx_opt_eqsat_oracle_gate (13/13 GREEN, registered, bite-proven RED 9/12 on a planted mutant) makes the engine an ORACLE OVER the shipping optimizer: over the WHOLE reachable domain -- k = 1..62, not a sample -- it checks that opt_strength_reduce and the proven equality-saturation rule agree on when x*2^k becomes x<<k, and that the largest shift the optimizer can emit stays inside the region nx_rule_soundness proved sound. WHAT THAT CHECK FOUND, STATED PLAINLY: the optimizer is CORRECT. is_pow2 rejects n<=1 and a positive i64 caps k at 62, so the unsound k>=64 region is unreachable and there is no miscompile. The real defect was that this was true BY ACCIDENT OF THE TYPE and nothing asserted it -- a wider constant or an edited is_pow2 would have deleted the guarantee silently, and silent-wrong-value is the worst class this estate tracks. THE CONTRACT IS STILL OPEN BECAUSE AN ORACLE IS NOT A PASS: nothing yet REWRITES IR through the e-graph, and naming this function opt_eqsat_pass to turn the cell green would be exactly the stub-carrying-the-contract-name defect the hive law warns about. THE ADOPTION GAP, MEASURED 2026-08-14 and given a contract instead of a parenthetical. The row above is honest that the engine is not wired; nothing until now NAMED the wiring as work, so it could never appear on the hive queue. Measured over 23,073 files with coverage_complete=1: nx_eqsat.nx has exactly 10 importers and EVERY ONE is its own test, bench, proof or the superoptimizer -- nx_opt, nx_compile_x86, nx_x86_64 and nx_riscv import it ZERO times. So the estate owns a gated equality-saturation engine whose entire consumer set is its own test harness. WIRED 2026-08-23: nx_opt.nx now imports nx_opt_eqsat_pass.nx and opt_run calls opt_eqsat_pass beside opt_reassoc, LIVE (not behind a disabled constant). Witnessed in the shipping pipeline, not argued: compiling runtime/nx_eqsat_wire_probe.nx, ewp_xor_self (x ^ x, x a runtime param) emits movabsq $0 where the pre-LN8 compiler emitted xorq, and the control x ^ y keeps its xor; nx_opt_eqsat_wire_gate 5/5 GREEN on the promoted toolchain, RED 4/5 (exactly the fold tooth) on a mutant with the call removed, RED 2/5 on the pre-LN8 compiler; nx_cc_equiv_gate 10/10 plus selfhost GREEN; promote_toolchain canary GREEN; compile-time cost measured +26 ms on a 275-line gate and within noise on the 3.5 MB compiler unit; full-population local A/B over every top-level program shows default builds byte-identical except the rewritten sites. Added --ir-dump (per-invocation post-opt IR dump; the /tmp/nx_ir_dump marker was a host-global switch). RE-KEYED 2026-08-23: the watch organ is now runtime/nx_opt_eqsat_pass.nx, where opt_eqsat_pass is DECLARED. The board's honest ruler is a top-level func declaration (the rule nx_compare_rank applies); a call site in nx_opt.nx is not a declaration, so on nx_opt.nx this cell read LANDED on the page (the generator's substring probe) and OPEN to the ranker at the same time -- two rulers, one subject. Existence is the receipt; CONSUMPTION is the proof and it is nx_opt_eqsat_wire_gate above, not this flip. WATCHING opt_eqsat_pass. Still behind the equivalence net by design: nx_cc_equiv_gate 10/10 plus selfhost must pass before any optimizer change promotes.
Energy measurement infra (RAPL)runtime/_hdl_build/nx_energy_probe.nxep_readPRESENT declProbe reads energy_uj; zero measured Joules vs C yet (X-PERF-002 open) -- beat-C-on-energy is UNMEASURED
Competitive native speed vs Cruntime/nx_x86_64_ctx.nxx86_use_regallocLANDED declROOT CAUSE SUPERSEDED 2026-08-14. This note used to blame a stack-machine backend with regalloc wired only into RISC-V. Re-measured on the CURRENT compiler with an identical bounds-checked hot loop where all arms must print the same checksum or the run is void: gcc -O2 2,270us, Rust -O checked 5,041, NishiLang checked 10,237, NishiLang UNCHECKED 4,581 -- so the unchecked lane lands within 9 percent of Rust CHECKED, i.e. the raw codegen is already at the checked-language tier. Then READING THE EMITTED ASSEMBLY moved the diagnosis again: the loop counter lives in r12 and the accumulator in r13 for the whole loop, so register allocation DEMONSTRABLY WORKED, and the emitter STILL spills both to stack homes on entry and reloads the counter twice more from a register that never changed. The dominant cost is not the check and not missing phi nodes: THE BACKEND DID NOT CONSUME THE REGISTER ALLOCATION IT ALREADY COMPUTED -- FIXED 2026-08-23 (x86_use_regalloc in runtime/nx_x86_64_ctx.nx): a homed value is now read IN PLACE as a compare/binop/SIB source operand instead of being copied to a scratch register first, and a load the allocator can forward no longer takes a home of its own -- forwarding is generalised across basic blocks under a SOUND cut-the-load-block availability check (an earlier merge-unsound draft that forwarded a stale value was caught by the self-host fixpoint and rewritten, not shipped). MEASURED on runtime/nx_probe_bchk_asm.nx: the loop counter is compared in place (movq %r12,%r15 ; cmpq $1024,%r15 -> cmpq $1024,%r12), main() 64->60 instructions (--no-crash-guard) / 62->58 (guarded), and nx_bounds_perf's checked hot loop 8278us -> 6912us median over 3 runs each (-16.5%). PROVEN: nx_x86_regalloc_use_gate 5/5 GREEN and 3/5 RED (T2,T3) against the banked pre-LN7 compiler; nx_cc_equiv_gate 10/10 + selfhost GREEN; LN1/LN2/LN3/LN8 gates still GREEN on the live compiler; promoted a21068ae both roots. witness-backed by runtime/nx_probe_bchk_asm.nx rather than argued. NOTE the two figures are DIFFERENT benchmarks against DIFFERENT baselines (3.65x was vs -O0 on the paired microbench and has not been re-run), so neither refutes the other.
Call arity + param-type checkingruntime/nx_parse.nxprepass_count_paramsPRESENT declSTALE-ABSENT CORRECTED 2026-08-14: this row published _ABSENT_ for nine days AFTER the capability shipped, because a bare _ABSENT_ is a hand-written claim that nothing re-measures. COMPILER-ENFORCED and bite-proven live 2026-08-05 through /api/build with both the refuse and the accept direction witnessed in-tree (nx_probe_arity_live.nx, nx_probe_ptrint_live.nx): call-arity mismatch, pointer-into-integer argument types, and a duplicate-definition guard, with forward references carried by pre-registered stubs whose parameter table prepass_count_params builds. Integer literals stay exempt by design (the sentinel idiom) and fn-pointer calls remain unverifiable by name.
Match exhaustiveness checkingruntime/nx_parse.nxn_variantsMISSING declSTALE-ABSENT CORRECTED 2026-08-14; shipped 2026-08-05. EnumEntry.n_variants (nx_parse.nx:577) is filled by the variant loop and parse_stmt_match counts DISTINCT discriminants, so duplicated arms cannot fake coverage. The refusal NAMES the enum and the MISSING variants, and a second check refuses an UNREACHABLE arm citing both lines. Elm ADTs remain the bar for the surrounding type system.
Memory safety (bounds, ownership, use-after-free)runtime/nx_ownership.nxown_check_moveLANDED declown_check_move SHIPPED 2026-08-25 as the --ownership DECLARED MODE and LIVE on the toolchain (778,655 B, canary GREEN): a use after __move(p) is a compile error naming the dead local AND the line its life ended on, stamped capability=own-check-move. THE WATCH STAYS OPEN DELIBERATELY, exactly as LN1 LN2 and LN3 do: the default is OFF and the contract is not discharged until the per-class ratchet flips it after a clean corpus census, so flipping this cell now would light green over a contract that is still open. THE MODE CANNOT CHANGE A DEFAULT BUILD, and that is measured rather than argued: it emits no IR at all, and the positive control compiles to byte-identical assembly under both modes at 67,374 bytes. PROOF: nx_ownership_gate 19 of 19 GREEN on the PROMOTED toolchain, 2 of 19 RED on the pre-rung builder, mutation bite valid_mutants 1 killed 1 not_reached 0 with the restore byte-verified. Its first six teeth are neg-controls establishing that the gap is REAL rather than assumed -- the hazard, the alias and the double-free all COMPILE AND RUN exit 0 under the default today -- and one of them is honest about WHY: the hazard runs clean by an arena accident, not by correctness, because 64 bytes is below NXA_SMALL_MAX so the release is a no-op. THE CONTROL FOUND TWO DEFECTS IN THE GATE ITSELF and both were fixed rather than accepted: the byte-neutrality tooth passed on two EMPTY asm files (two failures agreeing read as an equivalence, inside the tooth certifying neutrality), and the refusal tooth passed on a refusal the mode did not cause, since the old builder refuses __move merely as an unknown name. Rebinding both to their denominators moved the baseline 4 of 19 to 2 of 19 -- exactly those two stopped passing wrongly. Declared floors, each named: named locals only, no cross-function ownership, var aliases unswept, loop back-edges unmodelled, and conditional moves poison exactly as Rust does. Rust borrow checker is Best; Zig runtime safety modes; Go GC plus bounds checks.
Rich diagnostics in the shipping compiler (caret, did-you-mean, multi-error)runtime/nx_parse.nxnx_diag_caretPRESENT declSTALE-ABSENT CORRECTED 2026-08-14; shipped 2026-08-05. The note this replaced said the caret and Levenshtein UX existed only in the retired C bootstrap, on the wrong side of the sovereignty boundary. It is sovereign now: nx_diag_caret plus bounded-Levenshtein did-you-mean over calls, bare identifiers AND type names, multi-error recovery across 12 semantic sites closed by a hard end gate, and the 5W-and-H voice on the undefined-name family. It stays SILENT when nothing is near, because a wrong suggestion is worse than none. Elm and rustc remain the bar on error codes and explain prose.
Closures / lambdasruntime/nx_parse.nxparse_closure_captureWATCHING declFunction pointers only (VK_FUNC_ADDR); no capturing closures. WATCHING parse_closure_capture.
Namespaces / qualified importsruntime/nx_import.nximp_qualified_nameLANDED declFile-import only; name collisions caught by lint not language (22 shadow collisions found 2026-06-23). WATCHING imp_qualified_name.
Language server / editor integrationruntime/nx_lsp.nxlsp_servePRESENT declSHIPPED 2026-08-25 (nx_lsp LIVE 436,114 B, registered, invoked). LSP 3.17 over stdio, framed Content-Length, served FROM THE COMPILER'S OWN FRONT END -- expand_imports plus LineMap, lex_source, parse_module -- and NEVER a second parser, which is the architecture bar rust-analyzer's own note sets and the thing that cannot be retrofitted later [matklad-ide]. Every diagnostic a user sees is the shipping caret and did-you-mean text VERBATIM, so the editor cannot disagree with the build. Analysis is fork-isolated because the parser sys_exit(2)s by design. It advertises ONLY textDocumentSync=Full, definitionProvider and hoverProvider: advertising a capability it does not serve would be the stub-carrying-the-contract-name defect, so completion, rename, references and incremental sync stay UNADVERTISED and rust-analyzer and gopls still lead there. A didChange carrying a range is REFUSED LOUDLY over window/logMessage rather than mis-applied as a full replacement. PROOF: nx_lsp_gate 19/19 GREEN on the live binary via /api/gate_run exit 0, mutation-bitten valid_mutants=1 killed=1 not_reached=0 with the twin restored and re-confirmed by hash; four neg-control teeth plus a bite-proven pairing cell that fires on bad input and stays silent on good, since either half alone is passable by a server that always, or never, reports. Measured: bad_diags=1 at line=2 character=17 against a DERIVED expectation, utf16_character=47 from byte_column=50 (so the wire really is UTF-16 as the protocol requires, not bytes), frames=6, server_exit=0. It extended nx_json_lib to one de-escaper with two contracts rather than forking it, because the incumbent flattened newlines and tabs to spaces for TSV safety and would have silently destroyed a document buffer. RESIDUAL NAMED: imports are read from disk, so an unsaved edit in one file is not seen while analysing another (no VFS overlay), and documentSymbol is deliberately not shipped though its index exists. IT ALSO FOUND A DEFECT IN THE COMPILER AND THAT FIX SHIPPED: nx_parse.nx wrote the function name to fd 2 for every function of every compile with no newline, gluing the first diagnostic of every build to it and taking this very gate to 13/19 RED with a perfect diagnostic sitting in the artifact -- removed 2026-08-25, measured at 62 to 82 percent of all compiler stderr.
Canonical source formatterruntime/nx_srcfmt.nxsrcfmt_emitLANDED declSHIPPED 2026-08-23 -- nx_srcfmt (srcfmt_emit) formats over the tokenizer stream and REFUSES via a token-stream ORACLE any output whose tokens differ from the input, so it cannot change a program by construction. Style MEASURED from the whole corpus (18,561 files, 2.97M lines): 4-space indent, brace on the opening line, comma/semicolon/binary-operator spacing, struct field type columns aligned (1,340 of 1,712 multi-field runs), const and static single-space. Idempotent and build-neutral (formatted source compiles to byte-identical asm) proven over the tree; nx_srcfmt_gate 13/13 GREEN live, bite-proven both directions. Bars gofmt zig-fmt elm-format. WATCHING srcfmt_emit.
Incremental compilation / build cacheruntime/nx_inc_compile.nxinc_cache_lookupPRESENT declSHIPPED 2026-08-25 (nx_inc_compile LIVE 97,470 B, registered, invoked). Per-module cache keyed by the closure sha the build door ALREADY computes: it NEVER computes one of its own, it replays nx_closurehash's key and stores that ruler's per-file rows as the per-module table, so there is one key authority and not two. Proven by identity rather than assertion -- three recorded keys are byte-equal to /api/build's own closure_sha256 for the same targets, and gate tooth T8 re-forks the ruler and compares. The name-to-path resolver was EXTRACTED to nx_incclosure_lib and nx_closurehash now DELEGATES to it, so the cache cannot resolve a module differently from the ruler that hashed it (behaveprobe live-vs-staged IDENTICAL three times including the 78-file nx_mgmt_api closure). The member list is a deliberate SUPERSET of the ruler's closure -- it adds the crash guard and the compiler and assembler bytes, the inputs the ruler cannot see -- so it errs toward an EXTRA REBUILD and never toward a false hit. MEASURED ON THE REAL CORPUS, not a fixture: 6 targets over 18 modules and 47 member edges decided in 5 ms with ZERO forks and ZERO writes, against 9,274 ms to record five of them cold, about 4,600x on the decision; 47 member lookups served by 18 file reads (617 permil memoised); a warm 3-target build forks the builder ZERO times against 142 to 152 ms per fork when the incumbent cache serves the artifact and 773 ms for a genuine compile. Index is 2,548 B for 6 targets, bounded by a conf row with announced oldest-first eviction and a doubling growth window rather than a ceiling. PROOF: nx_inc_compile_gate 40/40 GREEN via /api/gate_run exit 0 on an isolated fixture tree with the incumbent cache DISABLED so it cannot serve the hit this rung is credited with -- byte-identity against a full build, a one-file edit rebuilding only its NAMED dependents while the non-dependent is provably never compiled, sibling invalidation (the subtlest false-hit class), corrupt-index refused whole, a toolchain axis where a compiler-byte change misses on unchanged sources, and four neg-controls; bite valid_mutants=1 killed=1 not_reached=0 with the restore byte-identical. TWO REAL DEFECTS FOUND BY RUNNING IT AND FIXED: a relative builder path could not survive the chdir and died execve 127, which read as the builder being missing and named the wrong subject; and the index fsync cost 27,107 ms of a 27,111 ms warm run on a loaded array, so the cache cost more than the builds it saved -- removed as a declared conf row with the arithmetic beside it, since the rename is atomic regardless and the loader refuses a corrupt index whole, taking the warm run to 64 ms. Every peer caches compilation and the anti-bar is the measured Rust adoption tax, so the decision path is fork-free by construction.
Debug info (DWARF .debug_line, statement granularity)runtime/nx_linemap.nxlm_stmt_stampPRESENT declSTALE-ABSENT CORRECTED 2026-08-14; shipped 2026-08-07. The note this replaced said emitted ELFs carry no source-line mapping. Opt-in via -g: lm_stmt_stamp records (address, file, line) OUT OF BAND keyed by instruction pointer (struct Instr was not widened), nxasm encodes the line program, and GNU readelf resolves the same addresses so third-party gdb and addr2line interop is real rather than asserted. MEASURED AT CORPUS SCALE, not on a fixture: 11,121 of 11,379 files built, 1,725,477 functions, 18,835,389 rows, ZERO per-file regressions.
Stepping debugger and .debug_info (types, variables, breakpoints)runtime/nx_dbg_step.nxdbg_step_overPRESENT declSTATEMENT STEPPING SHIPPED 2026-08-25, gate-proven on the LIVE binary: nx_dbg_step_gate 29 of 29 GREEN via /api/gate_run exit 0 (re-run independently), mutation bite valid_mutants=1 killed=1 not_reached=0, restore byte-verified. Built ON LB5's line table, not a second one: it composes nx_addr2line_lib's DWARF v5 primitives and adds the two directions a debugger needs that nx_a2l_run structurally cannot give -- file:line to ADDRESS for breakpoints, and the whole row table across ALL sequences, where the incumbent keeps one row and stops at the first end_sequence. It also decodes special opcodes, const_add_pc, fixed_advance_pc and any standard opcode via the header's own standard_opcode_lengths, so the table reads third-party DWARF v5 and not only our emitter's subset; an incompletely decoded table answers UNPROVEN, never no-such-line. Proven on a runtime-assembled RV64 fixture carrying a real linking JAL, over a .debug_line emitted by our own nx_dwarf_line: breakpoint by FILE and LINE resolved to 0x80000008 and HIT, step INTO reported callee line 100, step OVER reported caller line 13 at 0x8000000c with depth back to 0 and NEVER the callee line -- the one behaviour separating a statement stepper from an instruction stepper, asserted from the same starting pc. Call depth follows the RISC-V spec's own return-address-stack hint rules, x5 alternate link register and RVC C.JALR and C.JR included, not a rd-equals-ra guess. NEVER-BRICK IS STRUCTURAL, NOT PROMISED: func sys_ptrace is ABSENT-PROVEN estate-wide (matches=0 coverage_complete=1 corpus_complete=1) so no host process is reachable, the grammar has no pid and a pid-shaped argument is refused bite-proven, breakpoints are a bitmap so guest code is never patched and code_bytes_unchanged=1 is MEASURED every run, and detach is an in-process resume that runs even when the script never asks (auto=1, guest exit 5 matching the debugger-free reference sim). SCOPE, because this row was split in 2026-08-14 precisely so it would name its failing conjunct: the STEPPING half is LANDED; the .debug_info half is FUNCTION NAMES ONLY (DW_TAG_subprogram, wired for frame naming) and TYPES and VARIABLES remain ABSENT -- the shipped decoder understands only DW_FORM_addr and DW_FORM_string and refuses every other form, so DW_TAG_variable and DW_AT_location are unreachable today; the EMIT side was not measured and is not claimed either way. Backtrace is 2 frames (pc plus link register) and prints deeper_frames=UNWALKED rather than inventing callers. Execution surface is the sovereign RV64 interpreter: nxasm_rv64 is ABSENT-PROVEN so there is no RV64 compiler backend, and our .debug_line is emitted by the x86-64 assembler, so stepping a NATIVELY-executing nx_cc binary still needs an x86 interpreter or ptrace, and ptrace is refused on never-brick grounds rather than taken silently. gdb-on-C stays the bar.
Free multi-line expressionsruntime/nx_lex_kinds.nxtok_line_continuationPRESENT declSHIPPED 2026-08-25 and LIVE ON THE TOOLCHAIN (buildroot/_offc/nx_cc_sovereign.elf 738,558 B, promote canary GREEN). A continuation line opening with a binary operator now JOINS the expression above it. ORGAN PATH RE-KEYED to nx_lex_kinds.nx, where tok_line_continuation is DECLARED: that file already declares itself the shared home for exactly this (lex.nx and parse.nx used to carry local copies of the Tok layout and now share one), so the predicate costs no new import edge and there is only ever ONE of it. at_stmt_boundary already relaxed fifteen always-binary kinds in 2026-05-16; the residual was the four it called ambiguous. Three of them are not: NishiLang has exactly ONE operator-led statement form (parse_stmt_star, the pointer store), so no statement begins with plus, minus or ampersand and at statement level they can only ever have been a continuation. TK_STAR is the one true ambiguity and is decided by sb_star_starts_store, which looks for the store's assign at bracket depth 0 BOUNDED BY THE PHYSICAL LINE rather than by a chosen constant. THE SAFETY ARGUMENT IS CHECKABLE, NOT ASSERTED: the programs this reclassifies are exactly the programs that DO NOT BUILD TODAY, because the 2026-08-13 discarded-pure-expression refusal already rejects them -- so joining them cannot change the meaning of any program that compiles. Proven by the baseline half of the bite: the pre-LN15 compiler fails all four join cases with build=1, i.e. by REFUSING them. PROOF: nx_linecont_gate 10/10 GREEN on the promoted toolchain and 5/10 RED on the banked pre-LN15 compiler, the same gate binary against two real compilers rather than a synthesised mutant, with only the four capability teeth moving; nx_cc_equiv_gate rows=10 passed=10 selfhost=1 tree_moved_rows=0 GREEN with every row byte-identical (ea equals eb) and the self-host fixpoint at 738,558; nx_contentdiff GREEN 0 lost runs against BOTH live artifacts; nx_stale_check rebuild reproduces the staged bytes exactly with capability_check=OK. The gate carries a POSITIVE CONTROL and earned it: its first run was RED with even an ordinary one-line program failing exit 127, which was NAS /tmp being noexec and not a language fault -- four of its teeth are satisfied by a refusal, so without a tooth that must simply work an environment fault would have been published as a verdict about the language. Same edit removed twenty-odd bare token NUMBERS from at_stmt_boundary (if k == 56 beside TK_PIPE in the lexer is one constant written twice) and, separately, two stray sys_write(2) calls in parse_function that emitted the function name for EVERY function of EVERY compile with no newline, gluing the first real diagnostic of every build onto the last function name: measured at 62 to 82 percent of compiler stderr across the equivalence corpus. Every peer parses free layout; the det2x2 defect of 2026-07-09 was this class before the refusal existed.
Working floating point (f64)runtime/nx_x86_64_ctx.nxx86ctx_emit_f64PRESENT declSHIPPED 2026-08-25 and LIVE ON THE TOOLCHAIN (buildroot/_offc/nx_cc_sovereign.elf 778,655 B, promote canary GREEN). The board's own done-rule now passes: runtime/nx_probe_float.nx compiles and exits ZERO, where it exited 1 on 2026-07-09. SYMBOL RE-KEYED, and deliberately NOT by renaming code: the watch named x86_emit_f64_binop, which is ABSENT-PROVEN across the corpus at corpus_complete 1 -- no such function was ever written. Creating one to light the cell would be the stub-carrying-the-contract-name defect this board warns about, so the row now names the function that HONESTLY declares the capability, x86ctx_emit_f64 at nx_x86_64_ctx.nx line 2472, with x86ctx_emit_f64_ordkey beside it for ordering. PROOF: nx_f64_gate 25 of 25 GREEN on the promoted toolchain, and its expectations are DERIVED from an independent software IEEE-754 oracle (nx_f64_oracle_sov, anchored on 1217 hardware KATs) rather than hand-typed -- add sub mul div agree BIT FOR BIT, exactly on representable results and under round-to-nearest-even where they are not: 2^53+1 rounds back to 2^53, 2^54-1 needs 54 significand bits, the square of 2^27+1 needs 55, and 1.0/3.0 fills all 52 stored bits. Ordering was wrong for NEGATIVE doubles and is now right: a signed-integer compare of the bit patterns says -1.0 is less than -2.0 and IEEE says it is not, and the gate carries that exact pair as a neg-control so the tooth sits precisely where integer compare fails. THE SHARED-BACKEND RISK IS MEASURED, NOT ARGUED: f64 rides the same emitter integer code uses, so the gate compiles one integer source with the subject and with a REFERENCE compiler and byte-compares the emitted assembly -- 30,546 bytes both, identical 1. Without that reference the axis reported UNOBSERVABLE and the whole gate returned SKIP rather than a pass it had not earned; supplying the reference is what turned it GREEN. The incumbent nx_f64_adversary could not have caught any of this: it is a DECIMAL instrument with six hand-typed truncated constants, all non-negative, so it cannot see a one-ulp error and cannot see an inverted negative compare, which is why it ran green over this defect since 2026-07-16. This is a CORRECTNESS fix so the language is not silently wrong when someone writes f64; it does NOT make float a recommended path and does not weaken the integer-deterministic no-float doctrine, which remains this board's exceed. NaN unorderedness is a declared residual.
Bounds-checked TYPED array access, [N]T and []T (CWE-787 and CWE-125 class)runtime/nx_parse.nxNX_BOUNDS_CHECK_LIVEPRESENT declSPLIT OUT AND CORRECTED 2026-08-14. The single row this replaced said flatly that out-of-bounds is unprevented, which merged a SHIPPED half with an ABSENT half. Typed array access IS checked and the checks are LIVE, not compiled out: NX_BOUNDS_CHECK_LIVE (nx_parse.nx:1352) is the kill switch and emit_bounds_check injects against it, trapping NX_TRAP_BOUNDS. The cost is MEASURED, not modelled -- nx_bounds_perf.nx runs the same loop both ways and the check costs 2.23x on a bounds-checked accumulate loop (checked 10,237us vs unchecked 4,581us).
Raw-pointer access prevented (CWE-787 and CWE-125, the unchecked half)runtime/nx_boundscheck.nxbck_ptr_provenanceLANDED declSHIPPED 2026-08-19 as the --ptrprov DECLARED MODE: a let-bound sys_mmap(const) pointer is bounds-checked like a typed array on read AND write legs, and a provably-out-of-range constant index is refused at compile time. Proof: nx_boundscheck_gate 11/11 GREEN on the shipped toolchain and 7/11 RED on the pre-LN3 baseline (bite-proven both directions); nx_cc_equiv_gate 10/10 plus selfhost GREEN; promote_toolchain canary 8/8. Default stays OFF (corpus byte-identical by construction) until the per-class ratchet flips it after a clean corpus census; runtime-sized allocations and var pointers are the named residual. The 2026-07-08 READ-TO-NUL over-read was this class in the wild and is the gate's fixture.
Use-after-free prevented (CWE-416 class)runtime/nx_ownership.nxown_check_uafLANDED declown_check_uaf SHIPPED 2026-08-25 in the SAME checker as LN4 and LIVE on the toolchain: after sys_munmap(p, n) any read of p is a compile error naming the local and the release line, stamped capability=own-check-uaf. A DOUBLE FREE falls out of that ONE rule rather than needing a second, because the second release must READ the name in order to pass it -- so CWE-415 is covered by construction and its refusal correctly stamps own-check-uaf and not a separate rule. THE WATCH STAYS OPEN DELIBERATELY: default OFF until the per-class ratchet flips it, same as LN1 LN2 LN3 and LN4. THIS ROW'S OWN PREMISE WAS MEASURED AND IS FALSE AS IT WAS WRITTEN. The arena no-free doctrine does not hold because nothing frees: sys_munmap has ONE definition and 1,431 REFERENCE SITES at corpus_complete 1, while nxa_reset and nxa_free are ABSENT-PROVEN. What makes the doctrine FEEL true is sys_munmap's own body, which returns early when len is at or below NXA_SMALL_MAX, currently 256 -- so a small release is an arena no-op today and a use-after-free is invisible at runtime. The checker refuses BOTH sizes deliberately rather than keying a memory-safety rule on an allocator constant, because that constant has already moved once (256 to 128) and keying on it would silently un-refuse a whole class the day it moves again. PROOF: 19 of 19 GREEN on the promoted toolchain against 2 of 19 on the pre-rung builder, including an ALIAS fixture where the freed buffer is read through a SECOND name -- a checker that marked only the name inside the sys_munmap call would report nothing at all there -- and a double-free fixture that compiles and runs exit 0 under the default today. Rust borrow checker is the bar.
Integer overflow checked (CWE-190 class)runtime/nx_checked_arith.nxchk_add_overflowLANDED declSTALE CLAIM CORRECTED 2026-08-14: this note used to say an immediate shift over 31 blanks the emitted .s (2026-07-06). That was measured FALSE -- it compiles and returns the MASKED value, which is worse, because a silent wrong answer beats a visibly empty one at hiding. FIRST RUNG SHIPPED 2026-08-13 and gated (nx_probe_ub_shift.nx, nx_langdiag_gate row): a CONSTANT shift count outside the result width is now REFUSED at compile time naming the legal range and stamping capability=shift-count-range. SHIPPED 2026-08-23 as the --chkarith DECLARED MODE (the LN3 shape): every i64 + - * is followed by an overflow check that traps exit 72 (NX_TRAP_OVERFLOW) instead of wrapping; a constant overflow in source is REFUSED at parse time naming the rule; __wrap_add/__wrap_sub/__wrap_mul are the exempt wrap-by-intent forms (the Zig +% / Rust wrapping_* contract), so hashes keep building once the mode flips. Proof: nx_chkarith_gate 17/17 GREEN on the promoted toolchain and 9/17 RED against the banked pre-LN1 compiler (exactly the eight mode teeth fail -- bite-proven both directions on the NAS and the laptop); nx_cc_equiv_gate 10/10 plus selfhost GREEN; promote_toolchain canary GREEN; default builds byte-identical by construction (full-population local A/B sweep over every top-level program, not a sample). Default stays OFF until the per-class ratchet flips it after a clean corpus census -- the residual is the i32 lane (declared mod-2^32 semantics) and runtime shift counts. WATCHING chk_add_overflow. Zig safe-mode and Swift trap-by-default lead; Go wraps by definition. [regehr-ub]
Null and sentinel-zero deref prevented (CWE-476 class)runtime/nx_option_enforce.nxopt_enforce_unwrapLANDED declSentinel-zero-as-null is our recurring P2 meta-class; Option and Result EXIST in the stdlib but nothing enforces their use, so they are a convention wearing the shape of a type system. Elm ships no null at all. SHIPPED 2026-08-23 as the --optenforce DECLARED MODE (the LN3/LN1 shape): a dereference of a pointer-typed LOCAL not proven non-null on its path is REFUSED at parse time naming the local and the fix (capability=option-enforce-unwrap). Proof comes from the idioms this corpus already writes -- `if p != 0 {` (then-block), the early-exit `if p == 0 { return/break/continue/sys_exit }` (rest of the block), `if p == 0 {} else {` (else-block), `while p != 0 {` (body), nx_assert_ptr(p ...) -- and a reassignment re-derives the bit from the new value, so a stale check does not survive `p = call()`. DECLARED FLOORS, each one measured against the stdlib rather than chosen: parameters are trusted (the callee's contract; no nullable annotation exists yet), module statics are trusted (initialisation order is not modelled), sys_mmap results are non-null by the allocator's own contract (nxa_die on failure), integer-to-pointer casts and computed addresses are trusted, and chained derefs through loaded fields or call results (`a.b.c`, `f().x`) are not named locals and are not checked -- bind them to a local first, the estate's idiom. Proof: nx_optenforce_gate 14/14 GREEN (hazard nx_option_enforce.nx refused at `p.val`, the reassign witness refused after `p = call()`, the positive control nx_option_enforce_ok.nx with all nine idioms compiles AND runs under the mode, the mode emits no IR so the control's asm is byte-identical default vs mode) and 9/14 RED against the pre-LN2 compiler (exactly the five mode teeth); nx_cc_equiv_gate 10/10 plus selfhost GREEN; default builds byte-identical (nothing emits unless the flag is on). Default stays OFF until the per-class ratchet flips it after a clean corpus census. WATCHING opt_enforce_unwrap.
Data-race prevention (CWE-362 class)runtime/nx_sync_types.nxsync_send_checkWATCHING declThread pool is real (7x measured) but there is no Send-Sync-class typing; Go ships a runtime race detector, Rust and Swift 6 enforce at compile time. WATCHING sync_send_check.
Living bug-class ledger wired to language evolutiondocs/BUG_TAXONOMY.mdBug TaxonomyMISSING dataF1-F16 taxonomy + P1-P10 meta-patterns + the nx_cc trap register drive make-it-unrepresentable rungs; peers have public bug trackers (the dumps we bank) but not a ledger wired to language change
Sovereign whole-stack toolchain (language compiler assembler runtime -- zero LLVM GCC libc beneath)runtime/nx_compile_x86.nxfunc main(argcPRESENT declThe entire chain nx_cc to nxasm_x86 to ELF is ours bits-up and compiles on the NAS over the mgmt API (build-over-API GREEN 2026-07-06); Rust and Zig sit on LLVM; Go owns its backend but links foreign substrate below
Integer-deterministic no-float doctrine (cross-platform bit-exact by construction)runtime/nx_nofloat_llm.nxqmulPRESENT declA 100 percent integer LLM greedy-matches the float reference 4-for-4 (ledger AHEAD, 2026-07-09); gate-grounded across the codec and compute censuses; no peer ships float-free determinism as language doctrine
Errors as values with enforced propagation (the Midori model)runtime/nx_parse.nxres_propagate_opWATCHING declADMITTED 2026-08-19 from the 4-lane research sweep. Option and Result exist in the stdlib unenforced -- a convention wearing the shape of a type system. The Midori split is the bar: typed recoverable errors in signatures plus fail-fast abandonment, with one-character propagation so checking never rots into boilerplate [midori-errors]. Go proved in 2025 that this cannot be retrofitted once a community standardizes on the boilerplate [go-errsyntax]. WATCHING res_propagate_op: a dropped Result refuses (must-use) and a propagation form rethrows with context.
Structured concurrency (scoped spawn, no orphan tasks)runtime/nx_thread_pool.nxsc_scope_spawnPRESENT declLANDED 2026-08-25 against the research floor of spawning only inside a scope that joins its children [njs-nursery]. Within the scoped API the orphan shape is UNREPRESENTABLE: join is the only exit, sc_scope_free REFUSES an unjoined scope, spawn into a joined one refuses by name, double-join refuses -- there is no verb sequence that ends a scope without joining it. A child error propagates to the scope, NAMES WHICH CHILD, and cancels that scope; cancellation is scoped by construction because the flag lives in the scope header. COLORLESSNESS PRESERVED, the trap named by the colored-function essay still not taken [nystrom-colors]: a child is a plain func of i64 to i64 and all 48 nx_pool_submit call sites are byte-for-byte unchanged (full-population census, 23,257 files, coverage_complete=1, partition 35 production plus 11 gate plus 1 definition plus 1 comment reconciling to 48). BEYOND RUST SCOPED THREADS AND GO ERRGROUP, WHICH ARE LIBRARIES SITTING BESIDE A BARE SPAWN: sc_strict_set(1) makes the BARE nx_pool_submit refuse SC_REFUSE_UNSCOPED, asserted on pool STATE (tasks_submitted unchanged 52 to 52) and not on the message, so the only route into the pool becomes a scope that joins it. It SHIPS OFF because 35 production call sites still use bare submit, so the honest word is ENFORCEABLE NOT YET ENFORCED, and it is NOT the compile-time law: NishiLang has no lifetimes or regions and the compiler was not touched, so Rust remains stronger on that axis. PROOF: nx_sc_scope_gate 35/35 GREEN via /api/gate_run exit 0 twice independently; pool witness nx_pool_ring_gate 6/6 GREEN over 70,000 tasks with the shared counter exactly right and all workers exited; bite valid_mutants=1 killed=1 not_reached=0 with the pool source restored byte-identical, honestly declared as a mutation floor of one and killed by TIMEOUT rather than by an emitted RED. SPEEDUP RE-MEASURED RATHER THAN CITED, AND THE OLD FIGURE IS CORRECTED: 3.0 to 3.9x on 8 cpus at load 9.7 to 14.1 across three runs, with the scoped form never slower than bare; the July 7x was a quiet box and is not reproducible under real load, so the floor was ratcheted to 3000 permil guarded by an IN-RUN control requiring the incumbent bare arm to clear the same floor, because a load-based bar on a host that sits at 14 to 21 would be permanently SKIP, the detector nobody reads. ENVELOPE MEASURED: 41,056 B per scope in ONE mmap and one VMA, 40 B per spawn inside that existing mapping with zero extra syscalls, join allocates nothing, and live bytes go 0 to 41,056 to 0 after join and free. Join bounds are DERIVED from nx_pool_wait because a scope child IS a pool task, with the conf deliberately carrying NO row and two teeth checking that linkage mechanically so it cannot be silently unpinned. Zig dropped async pending redesign; Elm has no threads.
Supply chain by construction (no install scripts, content-addressed, no registry attack surface)runtime/_hdl_build/nx_pkg.nxpkg_cas_resolvePRESENT declLANDED 2026-08-25. The 2025 registry worms exploited install-time code execution and blind version trust [tob-supply2025]; this lane removes both. pkg_cas_resolve is live in nx_pkg (63,205 B promoted, registered, invoked) and gate-proven by nx_pkg_gate 19 of 19 GREEN via /api/gate_run exit 0. ORGAN PATH RE-KEYED to _hdl_build, where nx_pkg is DECLARED: runtime/nx_pkg.nx never existed, so the old path could never have measured anything, and nx_pkg already carried a byte-sum demo that was EXTENDED rather than duplicated (nx_presubmit BLOCKED the dual copy). A module resolves by sha256 digest -- the same digest nx_filehash and nx_closurehash use, agreement proven twice -- with no name lookup at the digest layer, so there is no version negotiation and no latest to poison. The store path is a hint and the hash is the identity: bytes substituted at the legitimate digest path refuse digest-mismatch, bite-proven against a restore that resolves. A lookalike name refuses name-not-pinned at exit 9 and writes no file, while the legitimately pinned name resolves at exit 0 as the positive control -- a guard that refused everything would fail there. Zero install-time execution is proven mechanically, not asserted: a module carrying a working install hook RESOLVES SUCCESSFULLY and the hook side effect is ABSENT, the hook having first been shown to fire when executed; static corroboration ABSENT-PROVEN for sys_execve, sys_fork and sys_clone at corpus_complete 1. Two mutants were killed, one disabling the re-hash and one disabling the unpinned refusal, the second earning its keep by proving the suite asserts WHICH rule fired -- the typosquat was still refused, for the wrong reason. Transparency is a hash-chained journal that refuses to extend a broken chain: tamper-evident against a partial edit but NOT sumdb equivalent -- one writer, unsigned, unwitnessed, no inclusion proofs -- which is why exceed stays 0 rather than claiming a clean win. Residual named in source: pin time is the trust boundary, a whole-journal rewrite verifies, no signature layer is wired, and the compiler import path still resolves by filesystem name.
Language-level capability security (no ambient authority)runtime/nx_caplang.nxcap_root_mainWATCHING declADMITTED 2026-08-19. No mainstream language ships it -- any transitively imported function can open any file or socket, which is the root of supply-chain risk. Austral and Pony prove the design: authority is a value handed to main, and a dependency signature IS its permission manifest [austral-caps]. The estate ops surface is already ocap (attenuate-only, live-proven); this watch extends it into the type system. Honest greenfield: nx_caplang.nx does not exist. WATCHING cap_root_main.
Written language specification + conformance suiteruntime/nx_langspec.nxspec_conformance_runPRESENT declSHIPPED 2026-08-25, taking the Ferrocene lesson early rather than retrofitting a spec years after 1.0 [ferrocene]. nx_langspec LIVE 51,172 B registered and invoked; nx_langspec_gate 30 of 30 GREEN via /api/gate_run exit 0 (re-run independently), mutation-bitten valid_mutants=1 not_reached=0 killed=1 with the twin restored byte-identical. The specification is DATA (33 clauses in knowledge/specs/nishilang.spec) and so is the suite (35 cases), so every case cites the clause IDs it exercises and traceability is resolved MECHANICALLY rather than asserted -- which is the thing a hand-coded row list structurally cannot have. Full production run over the SHIPPED compiler: 35 pass, 0 fail, 0 unobservable, both partitions reconciling, 33 of 33 clauses exercised at 1000 permil against a declared ratchet raised 800 to 1000 after the gain, unresolved citations 0. Three states never two: a case the runner cannot judge is UNOBSERVABLE and folds into neither pass nor fail. The load-bearing tooth is the planted deviation and it is proven in BOTH directions: a clause and the compiler made to disagree exits DEVIATION naming the case and the reason; a refusal for the WRONG reason is also a DEVIATION, so a suite that only asks whether the program was refused cannot pass here; an empty suite exits EMPTY and can never be success, the vacuous-test defect wearing a certification costume; and an ABSENT compiler ABSTAINS at exit 3, which is what proves the runner really forks the shipped compiler instead of simulating it. It composes nx_ccgate_lib rather than adding a second compiler driver, extending it additively with a compile-only verb because the incumbent collapsed every failure to 1 and made the refusal-exit clause untestable. FIRST RUN FOUND A REAL GAP AND THE SPEC REFUSES TO LAUNDER IT: the integer-literal-range rule is written in nx_parse.nx and ABSENT-PROVEN from the shipped toolchain binary (positive control: the sibling shift-count-range capability IS present in the same binary, so the scanner reads binary content), so three out-of-range literals are accepted today. Filed as debt 1787687118 and deliberately NOT specified until it ships -- specifying the defect as intended would launder it, and a permanent RED is a detector everyone learns to ignore. Go's spec remains the field's best; Zig has none.
Safety ring inherited by NishiOS + Nishi Browser (the Rule-of-2 discharge)runtime/nx_osattest.nxoa_state_namePRESENT declSHIPPED 2026-08-25. Chromium forbids combining untrustworthy input, an unsafe language and high privilege, and the incumbents discharge it by SANDBOXING AROUND their language [rule-of-2]; a kernel-up single-language stack discharges the unsafe-language leg everywhere. nx_osattest is LIVE at 68,288 B, registered and invoked, with nx_osattest_gate 24 of 24 GREEN via /api/gate_run exit 0 (re-run independently after the lane that built it was killed mid-flight -- an organ found promoted is run, never trusted). SYMBOL RE-KEYED HONESTLY: the watch named nxos_lang_ring_attest, which is ABSENT-PROVEN across the corpus at corpus_complete 1 -- no function of that name was ever written, the capability lives in the organ itself. Renaming code to match the contract would be the stub-carrying-the-contract-name defect, so the row now names oa_state_name, which is distinctive to this organ and whose existence IS the capability: it declares the six attestation states. THE ORGAN REFUSES A SILENT DEFAULT COMPILER BY DESIGN -- with no argument it exits usage rather than attesting, because a default produces a fully-formed verdict about whatever binary happened to be lying there. The gate is built out of the states rather than a score: the partition SUMS to its declared population, a planted source that must be refused is counted refused AND the refusal NAMES the declared rule rather than merely being a refusal, and a clean source is still counted ATTESTED as the positive control, which is what stops an attester that refuses everything scoring perfectly. UNOBSERVABLE IS A REAL THIRD STATE AND IS PROVEN THREE WAYS: a real-looking flag the compiler silently ignores is reported UNOBSERVABLE with that exact reason and is counted neither clean nor refused nor quietly dropped, and a rung with no compiler flag at all reports flag-undeclared, a DIFFERENT reason. The denominator travels with the score and the missing modes are NAMED. An absent subject exits UNPROVEN into its own bucket and the canonical last line reads RED, because a confident attestation over a subject that is not there is the worst outcome available to this organ. An empty population is REFUSED, never reported as a clean sweep. Rust holds Part via Rust-for-Linux and Servo.
Sound bounds-check elision (checked speed at unchecked cost)runtime/nx_boundscheck.nxbck_elide_dominatedWATCHING declADMITTED 2026-08-19. The bounds check costs a measured 2.23x on the accumulate loop (checked 10237 us vs unchecked 4581 us) while peers elide dominated re-checks in their optimizers. An UNSOUND elision is a silent memory-safety hole, so every elision must ride the blessed dominance oracle and the elision proof gate is the tooth. WATCHING bck_elide_dominated.

watch rows=46 landed=9 watching=5 present=30 missing=2 absent=0 (partition sums)