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.
Start with a recognized class
Section titled “Start with a recognized class”Save this as known.jan:
@syscall_class(stdio)func wrapped(fd: i32) -> i32 do return fd endfunc main() -> i32 do return wrapped(0) endBuild 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.
Predict a rejection
Section titled “Predict a rejection”Change stdio to bogus, save as unknown.jan, and build to a new output path:
janus build unknown.jan unknownExpected 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 endUse 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.
Exercise
Section titled “Exercise”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.
Interpret the result
Section titled “Interpret the result”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.