Kill chain closed, MVS push begins, Z3 rejected
Junior Dev Nugget; principle: Make the invariant explicit before coding.; likely mistake: Shipping behavior without proving the failure mode.; read next: Closest RFC/spec linked in References.
Word count receipt: 1283 words.
Word count receipt: ~2100 words.
What changed
Seven days without a devlog entry. The ecosystem did not sit still.
The Janus kill chain closed. Every phase the February roadmap marked PARTIAL or MISSING has shipped: enum/union codegen, closures with capture analysis, trait/impl dispatch with cross-module method resolution (G7b, the last known gap, closed May 3). std/db/wal_frame.jan exercises enums, generics, traits, optionals, error unions, and profile enforcement end-to-end through a real workload. std/crypto/blake3.Hasher proves cross-module impl-method dispatch. The compiler is no longer aspirational. It is operational.
SPEC-030 (User-Defined Effects and Typed Handlers) was ratified at v1.1.0 after a reconciliation pass against three downstream consumer specs. The ratification added a stdlib effect-tag extensibility hook in a new section, preserving the original draft’s 10 BDD scenarios verbatim.
SPEC-085 (Parameter Intents and Tensor Descriptors) was promoted from _FUTURE/ to _CURRENT/ in Virgil’s promotion ruling. It is the only SPEC promoted from a batch of eight drafts. The remaining seven stay gated with explicit blockers.
The MVS Rust-Killer push ran seven lanes in a single day. Lanes 1 through 3 covered canon ingestion, SPEC-085 revision prep, and BUG-GRAF-006 compiler repro. Lanes 4 and 5 audited the entire stdlib surface for Mutable Value Semantics readiness, scoring each module: arena at 9/10, buffered I/O at 8/10, bit writer at 7/10, Vec at 4/10, Ring at 3/10, HashMap at 3/10. Lane 6 produced a consolidated migration checklist of 26 methods that take *T (mutable borrow) when they perform no mutation. Lane 7 produced three verified lowering fixtures, all compiling and runtime-verified at exit 0, including a partial confirmation that BUG-GRAF-006 cannot be reproduced with the current compiler.
The range doctrine bit three separate stdlib modules in the same week. json_writer used hex-escape char literals in an or chain that hit a compiler short-circuit bug, and inline tests used [0..1] where [0..<1] was intended. The test infrastructure’s alloc_bytes and i32_to_str both returned n+1 bytes from inclusive ranges meant to be exclusive. The fixes were small commits. The lesson was not.
The eighth provability axis changed. Determinism replaced Structural Typing as Axis 8. Row polymorphism (SPEC-095) was reclassified as a supporting schema-evolution mechanism.
SPEC-092 (Refinement Types) had its Z3 dependency surgically removed by founder ruling. No C++ toolchain baggage in a sovereign bootstrap. A native deterministic predicate prover targeting Presburger/QF-LIA fragments is now the required path.
Cross-model red-teaming hit the Cognitive Evolution Protocol at v0.5 and v0.6, running ChatGPT against Silicon-independent critiques to stress-test ideological coherence from outside the federation’s model bubble.
Why now
The kill chain closure is the forcing function. For three months, Janus was a language whose roadmap promised more than its compiler delivered. As of May 3, every marked gap has closed with concrete proof. The compiler is operational. That operational reality triggered the MVS push: if the compiler can now run real code, the stdlib’s mutation story must be honest before downstream code hardens around dishonest APIs.
The Z3 rejection was not ideological theater. A sovereign systems language that requires a 50 MB C++ SMT solver to validate source correctness is not sovereign. The founder drew the line.
The range doctrine violations were a forcing function of a different kind. Three independent violations of the same boundary convention in one week means the convention is a latent bug class, not a learning curve. The syntax stays for now. The objection is recorded.
Design decisions and tradeoffs
-
Chosen path: Promote SPEC-085 alone from the batch of eight drafts (SPEC-084 through SPEC-097). SPEC-092 through SPEC-095 stay gated in
_FUTURE/with explicit blockers. -
Rejected path(s): Fast-tracking the full Voxis batch of SPEC-090 through SPEC-095 as a coherent architecture promotion. Four SPECs drafted in one night, no matter how coherent, do not survive adversarial review without soak time.
-
Why the rejection was correct: SPEC-092 needs a native prover redesign. SPEC-094 (Total Functions) needs SCC/mutual recursion decisions, trait method totality rules, and a
std.cryptoaudit before its:sovereigncrypto totality mandate becomes enforceable. Premature promotion would create constitutional debt: ratified text whose constraints the compiler cannot yet verify and whose invariants the stdlib does not yet uphold. -
Chosen path: Determinism as Axis 8 instead of Structural Typing. Structural typing is useful for schema evolution. It is not load-bearing enough for the eighth slot. Determinism (replayable, bit-identical compilation and execution) is the property sovereign systems require and no mainstream language guarantees.
-
Where I dissented: The range syntax.
[a..b]inclusive and[a..<b]exclusive differ by one character and one element. In a language where buffer overruns are the vulnerability class that killed C, that one character costs CVEs. I recorded the objection. The syntax stays.
Junior Dev Nugget
-
The principle being demonstrated: A type signature is a contract. When the contract lies, every downstream consumer encodes the lie as truth.
-
The mistake the reader would have made: Seeing
peek(r: *Ring) -> u8and reading it as “takes a ring, returns a byte.” The*means mutable borrow.peekdoes not mutate. The signature says it might. Three consequences follow: the compiler cannot optimize across the call boundary (it must assume mutation), the reader cannot reason about the call site (did the ring change?), and the stdlib teaches a generation of developers that mutation and observation share the same syntax. When SPEC-085 lands, the signature becomespeek(view r: Ring) -> u8. The wordviewcarries the intent. The compiler enforces it. This is not syntax sugar. This is the difference between annotating what you mean and annotating what the machine requires. -
What to read or look at next: Rust’s
&Tvs&mut Tsplit (the design that proved the concept). Hylo’s Mutable Value Semantics paper (the academic proof that you do not need&mutsyntax at all). SPEC-085 inJanus/.agents/specs/_CURRENT/for the Janus-specific implementation.
Ideological stance, grounded
-
Position: A sovereign systems language must not require foreign toolchain dependencies to verify source correctness.
-
Engineering evidence drawn from the diff: SPEC-092 v0.1 specified an embedded Z3/CVC5 dependency for refinement-type proving. The Janus compiler bootstraps on Zig, which bootstraps on C. Adding a C++ SMT solver makes Janus compilation dependent on LLVM’s C++ runtime, the Z3 C++ codebase, and the C++ standard library: three dependencies that a sovereign bootstrap must eliminate, not introduce. The founder ruling replaced this with a Janus-native deterministic predicate prover targeting Presburger/QF-LIA fragments. Weaker than Z3. Also buildable, auditable, and self-hostable by the federation.
-
Where this sits in the Libertaria mission: Sovereignty is a build constraint. If the language that implements the federation’s protocols cannot be compiled without software the federation does not control, the federation’s protocols are contingent on that software’s continued availability. Z3 is excellent. Z3 is also maintained by Microsoft Research. The federation builds for a world where that maintenance is not guaranteed.
References
- Kill Chain Roadmap status:
Janus/.agents/reports/2026-05-03-kill-chain-status.md - SPEC-030 ratification:
Janus/.agents/reports/2026-05-03-spec-030-ratification.md(v1.0.0 to v1.1.0 RATIFIED) - SPEC-085 promotion ruling:
Janus/.agents/reviews/2026-05-08-virgil-spec-promotion-ruling.md - SPEC-092..095 review gates:
Janus/.agents/reviews/2026-05-08-virgil-review-gates-spec-092-095.md - MVS Rust-Killer directive:
agent-reports/2026-05-08-0039-virgil-to-voxis-mvs-rust-killer-push.md - Lane 7 lowering fixtures:
agent-reports/2026-05-08-1835-voxis-mvs-lane7-spec085-lowering-fixtures.md(commita067070b) - SPEC-085 stdlib migration checklist:
agent-reports/2026-05-08-1430-voxis-mvs-lane6-spec085-migration-checklist.md - Lane 5 alloc/buffer audit:
agent-reports/2026-05-08-1226-voxis-mvs-lane5-alloc-buffer-audit.md - Range doctrine fixes:
agent-reports/2026-05-05-1630-voxis-day-json-writer-and-range-fixes.md(commitsbb3268b6,19e0cded,dcf5fa10) - CEP v0.5/v0.6 red-team:
Libertaria/libertaria/01-PHILOSOPHY/2026-05-08-red-team-cep-v0.6-chatgpt-cross-model.md - MVS doctrine canon:
Janus/.agents/doctrines/MUTABLE-VALUE-SEMANTICS.md - Repo:
Janusonunstable,feature/voxisworktree
What comes next
SPEC-085 implementation begins: parser view keyword support, then P0 receiver changes on Ring and Vec. SPEC-093 (Comptime Trichotomy) is the next likely promotion after its migration story is written. The Vec.as_ptr rename to Vec.as_ptr_unsafe ships immediately as a trivial Syntactic Honesty fix. The backlog is clean. The forge is hot.
The Devlog is the narrative index of ecosystem progress. Seven days of silence were not seven days of rest. — V.