Skip to content

Recognized Names Are Not Authority

This tutorial covers the October 2026 development repair for compiler gaps 249/251. The native examples were verified with development compiler commit f794ef2a3b611daf523799dc6996a74f56b0a079 (integration PR #54). Build that revision or a descendant containing the repair; older installed releases may accept the invalid examples. The examples target native Linux AOT builds on the pinned Zig dev.2264 / LLVM 22 toolchain. They do not invoke real syscalls.

Save this as known.jan:

@syscall_class(stdio)
func wrapped(fd: i32) -> i32 do return fd end
func main() -> i32 do return wrapped(0) end

Build with janus build known.jan known, then run ./known. Expected result: successful compilation and exit status zero. The wrapper returns its argument; the annotation does not open a file, issue a capability, or activate a sandbox.

Change stdio to bogus, save as unknown.jan, and build to a new output path:

Terminal window
janus build unknown.jan unknown

Expected result: nonzero build status, a source-located PU-PA001 diagnostic naming bogus, and no unknown executable. The invalid annotation is rejected even if the program otherwise returns zero.

This program also fails with a located PU-PA001:

func main() -> i32 do pledge { bogus } return 0 end

Use a fresh output path for each check so an old executable cannot look like output from a rejected build. Never execute an unexpectedly accepted negative fixture; keep its compiler output for investigation.

Predict and check getpw in place of bogus. SPEC-080 specifies that promise, but this compiler currently implements only eleven names. The expected result is explicit rejection, not silently treating the obligation as absent.

The eleven admitted names are stdio, rpath, wpath, cpath, tmppath, inet, unix, dns, proc, exec, and tty. The six additional specified names getpw, fattr, flock, chown, id, and unveil remain rejected.

Source-name admission runs during normal .jan preflight and full semantic analysis. Sovereign-only visitor execution is a separate stage. Allocation or metadata failure must stop analysis rather than make its inferred row look complete and empty.

These examples verify name admission only. Complete transitive/indirect-call proof, imported obligation transport, scope rules, capability issuance and kernel/thread enforcement require their own qualification. A valid spelling establishes none of those properties.

The compiler repository’s compiler/libjanus/effect_accumulation/tests/native.py checks native class/import positives, invalid names, unsupported names, long tags, and recognized pledge compilation. Its receipts distinguish native_execution, compile_acceptance, and rejection, retaining compiler/source hashes and the applicable build/run results. Recognized pledge compilation covers both explicit and compiler-injected imports; it does not qualify native sandbox execution. On the current AArch64 development host these pledge binaries receive SIGSYS when executed. The failed runtime receipts remain separate from admission checks. Run it through the compiler’s protected scripts/zb runner. The matching Monastery mission is chapter 2, Recognized Names Are Not Authority; browser mock results are separate from native compiler evidence.