v2026.3.23 — janus fmt Ships
v2026.3.23 — janus fmt Ships
Section titled “v2026.3.23 — janus fmt Ships”Released: March 21, 2026
A language that takes itself seriously has a formatter. Now Janus does.
janus fmt
Section titled “janus fmt”1,887 lines. 34 tests. Zero configuration.
janus fmt src/main.jan # Format in-placejanus fmt --check src/main.jan # CI: exit 1 if not formatted, show diffThe formatter enforces SPEC-017 Law 2 (the structural divide), normalizes spacing around operators, indents bodies at 4 spaces, preserves all comments, and inserts blank lines between top-level declarations.
Every test verifies idempotency: format(format(x)) == format(x). Always. Dogfooded on 1,056-line hinge_cli.jan — formats and compiles.
--check mode shows a line-by-line diff so CI logs tell you what changed, not just that something failed.
janus build Reads Lockfile
Section titled “janus build Reads Lockfile”janus build now reads janus.lock when present. For each dependency in the lockfile, it finds the source in .hinge/registry/<name>/<version>/src/, compiles it to an object file, and links it into the final binary.
Deduplication: dependencies already compiled via use zig are detected by basename and skipped. No double-linking.
Verified end-to-end: library publishes with source, consumer resolves + locks + builds, binary calls functions from the dependency. It works.
:service Profile — Fully Green
Section titled “:service Profile — Fully Green”The nested using type mismatch (i64 passed to ptr parameter of janus_using_close) was confirmed fixed. Verified with 3-level nesting: db -> tx -> cursor with correct LIFO cleanup order.
All :service profile tests pass: channels, select, nursery, spawn, using, async/await.
Hinge Integration
Section titled “Hinge Integration”- Deduplicated SemVer, manifest, and resolver into canonical
lib/modules addcommand writes proper KDLdependencies { }blocks (was appending comments)- Lockfile includes transitive dependencies with CID schema
publishcopies source files to local registry- Full local loop:
init -> add -> resolve -> lock -> publish -> search -> consume
println Compiler Fix
Section titled “println Compiler Fix”The LLVM emitter now correctly detects string sources from variables. User-defined functions that return string pointers are treated as strings by println (not printed as raw pointer addresses). The fix removes a function_return_types check that misclassified all :core functions as integer-returning.
Numbers
Section titled “Numbers”- 4 commits in this release
- 1,887 lines of formatter code
- 34 formatter tests (idempotency-verified)
- ~140 lines of lockfile consumption in the build pipeline
- 5 :service profile test targets all green