Repository navigation
Releases
Myna 0.13.0
Myna 0.13.0
This release makes the ABI fingerprint describe the ABI rather than the target triple
(#61), so one platform-neutral bindings JAR
accepts native libraries built for every target with the same layout.
- Canonical
seam.json(schema 3) records the target's resolved ABI class,
"targetAbi": {"dataModel":"LP64","byteOrder":"little"}, in place of"targetTriple".
seam.abiremains its SHA-256. Struct layouts, scalar widths and Java carriers follow from
the class alone. - Targets in one class now produce the same
ABI_FINGERPRINT, the same native
fingerprint()export, and byte-identicalseam.json,seam.abi,seam.h,seam.rs,
Java, Truffle and Native Image outputs. All four supported targets (x86_64andaarch64
Linux GNU and macOS) share the LP64 little-endian class. - Only the LLVM contracts (
seam.ll,seam-jni.ll) name the triple. Sub-word argument
extension and by-value lowering stay target-specific there, andmyna applystill rejects
contracts for a different target. myna validate INPUT.seam --targets TRIPLE,...validates every listed target and fails
unless they share one fingerprint, so a publishing project catches a layout divergence at
build time instead of as a load-time rejection.
Consumers reading targetTriple from seam.json should read the triple from seam.ll or
their own build configuration. The schema 3 descriptor and generator version change every
fingerprint; regenerate matching outputs together and rebuild native libraries against them.
Binding ABI 2 and native value ABI v3 are unchanged. No existing published artifacts or tags
are replaced.
Myna 0.12.0
Myna 0.12.0
This release adds Truffle native cells: truffle_cells=true on a module emits a
<NativeClass>Truffle.java with one DSL-free Truffle cell per import, calling the
module's existing Native Image or FFM bindings with language-neutral coercions from
the new myna-truffle JAR. The pinned Elide GraalVM moves to 25.5.5-elide.26.
- Cells never change a binding's leaf status or embed addresses. From runtime-compiled
guest code a leaf cell costs the same as the direct Java call (1.5 ns, no allocation),
a transitioning cell calls its AOT stub directly (4.9 ns, graal#196), and the generic
interop wrapper adds nothing, so scalar calls need no language-specific glue. truffle_backend=native|ffm,truffle_coercion=strict|wrapand
truffle_transitions=direct|boundaryrefine a module;truffle_cell=falseand
truffle_raw_pointers=truefacts refine an import. The configuration is serialized
under"truffle"; descriptors without it keep their canonical shape.- Borrows become guest-visible buffers whose byte count is derived: native memory is
lent in place, heap arrays are pinned in an image from 256 bytes (measured crossover)
and copied below, interop buffers are copied and written back. Resources become
exactly-once, optionally confined owners. benchmarks/cellsmeasures cells against direct calls and Truffle NFI from compiled
code, with a checked-in advisory baseline;tests/truffle_integration.pyproves cells
run from runtime-compiled Native Image code.- The pinned Elide GraalVM is 25.5.5-elide.26 (graal#189, #190, #196, #197); the fixture
uses direct transitions and compile isolates stay enabled.
Generator-versioned canonical descriptors have new fingerprints; regenerate matching
outputs together. The v0.12.0 tag is signed with the OpenPGP key
15FAB722A29D5AD20917A0C50A11B04C1623040F (ed25519, Sam Gammon), a signer change from
the X.509 signatures on earlier tags; verify it with git verify-tag v0.12.0. Builds use elide-dev/toolchain 2026.11.5. No existing published
artifacts or tags are replaced. See Truffle native cells and
calling Myna bindings from Truffle guest code.
See release verification instructions for checksums and provenance.
Full changelog: v0.11.0...v0.12.0
Myna 0.11.0
Myna 0.11.0
This release adds opt-in value ABI v4 for producer-neutral aliases, per-node
metadata, and indexed object lookup. Default Rust and C++ producers retain ABI
v3; Java readers support v2, v3, and v4. Existing v3 descriptor layouts are
unchanged. Enable v4 explicitly and pass its complete 88-byte descriptor.
- Object directories use a shared FNV-1a UTF-8 hash and preserve first-match
semantics for duplicates and hash collisions. - References name completed earlier subtrees. Readers expose targets explicitly;
they never expand aliases automatically. Metadata IDs remain format-specific. - C++ builders can reserve nodes, bytes, regions, and container depth, retain
capacity across clear/reuse, and preserve allocator and poison contracts. - Native readers can rebind between messages. Checked kind/key helpers and
prepared-key word/hash accessors support partially evaluated callers. - Batch text export converts keys, strings, and exact number tokens into shared
caller-owned Latin-1/UTF-16LE storage and a per-node index table. - SIMD crossover is configurable per reader. The default remains 256 bytes;
the expanded benchmark retains raw samples and build/hardware metadata.
Builds use elide-dev/toolchain 2026.11.5. No existing published artifacts or tags
are replaced. See value API contracts and
text benchmark instructions.
See release verification instructions for checksums and provenance.
Full changelog: v0.10.0...v0.11.0
Myna 0.10.0
Myna 0.10.0
Native value ABI v3 now supports opt-in IEEE-754 NaN and positive/negative infinity for YAML and other non-JSON producers. Rust Document/Builder and C++ value_builder can set descriptor flag bit 0; both Java native readers honor it. Finite-only defaults, strict decimal tokens, descriptor layouts, allocator ownership and poisoned-builder recovery remain unchanged. Older readers safely reject flagged descriptors. See value API documentation.
This release adds enforced Java/C++/Rust formatting, strict Java and LLVM warnings, Clang security analysis, stronger malformed-input regression coverage, and deterministic JAR/SDK packaging. Native build wrappers honor caller compiler and flag overrides. The README now includes the live OpenSSF Best Practices badge, with governance, security-response and assurance documentation supporting the silver application.
Regenerate matching seam outputs together: generator version 0.10.0 changes canonical descriptor fingerprints. Binding ABI 2 and value ABI v3 remain unchanged. New non-finite values require upgraded producers and readers.
Validation includes Rust and JVM tests, C++ sanitizer tests, expected-failure sanitizer canaries, LLVM integration/coverage, and real Native Image execution through both value readers. No changes to previously published artifacts or tags.
Myna 0.9.1
Myna 0.9.1
Myna now applies contracts to ELF FatLTO objects and their members inside regular .a/.rlib archives. Version 0.9.0 rejected their embedded .llvm.lto sections, preventing use with FatLTO sysroot libraries.
The applicator rewrites embedded IR, rebuilds summaries and hashes, and preserves ThinLTO/full-LTO mode. Native fallback sections, symbols and relocations remain unchanged. Mixed archives retain their member names and order and receive a rebuilt symbol index. Invalid payloads, incompatible contracts and duplicate LTO sections fail before replacing output.
The pinned toolchain is now elide-dev/toolchain 2026.11.2. On Linux, its -flto links select FatLTO archive bitcode by default. Non-LTO links retain the native fallback; Myna contracts affect the LTO representation only.
Regenerate matching seam outputs together: the 0.9.1 generator version changes canonical descriptor fingerprints. Binding ABI 2 and native value ABI v3 are unchanged.
Regression coverage includes real ThinLTO and full-LTO ELF containers, mixed archives, idempotence, unchanged native fallback bytes, malformed-input recovery, and Linux link/run tests against generated fixtures and the shipped sysroot archive. See the LTO integration guide.
Myna 0.9.0
Myna 0.9.0
Myna 0.9.0 expands Java 25 FFM (Panama) support for the JVM and Substrate VM, and adds optional static JNI bindings for Substrate VM. The direct Native Image C API remains the primary runtime and performance target. Binding ABI 2 and native value ABI v3 are unchanged.
Adopting the adapters
- FFM
LibraryBindingaccepts an explicitSymbolLookupor library path and caller-owned arena. It supports scalar and by-value record calls, scoped byte-buffer borrows, and consumer-owned resource factories.CriticalLibraryBindingexposes typed critical calls only for imports satisfying the native-leaf contract; normal calls remain available separately. - Scoped upcalls support dynamic Java callbacks, native-thread invocation through shared arenas, and explicit exception sentinels. Declared static targets additionally support direct AOT upcall registration with an
i32ori64status policy. Void callbacks discard uncaught exceptions. By-value record callbacks remain unsupported and are rejected during validation. myna generate INPUT.seam --jni --out generatedemits Java declarations, C wrappers, JNI C/Rust declarations, separate optimizer contracts, and a static-library symbol manifest. Build the wrapper with the pinned compiler and JNI headers, archive it with the native implementation, and retain the generated Native Image resources. Static JNI uses normal JNI transitions; JVM consumers should use FFM.
Regenerate all matching Java, C, Rust, JSON and LLVM outputs together, then rebuild consumers. Generator-versioned canonical descriptors have new fingerprints in 0.9.0, including declared static callback policies. Keep the generated META-INF/native-image resources and the pinned Graal SDK compile-only dependencies. The supported toolchain is Elide 1.6.2, elide-dev/toolchain 2026.11.1 (LLVM 23), and the external elide-dev/graal 25.5.5-elide.24 distribution.
The adapter guide provides the build recipe and exact contracts. Callers own library and callback arena lifetimes. Resource consumers enforce required-thread access, guarded borrows and exactly-once destruction. Static JNI raw addresses require caller-managed lifetime, extent and alignment. Its direct-buffer overloads check liveness and thread accessibility before entry but do not pin an arena against concurrent or callback-driven closure; use FFM borrows when scope acquisition is required.
Correctness and LTO
This release fixes unsigned narrow callback return extension, generated JNI wrapper names that shadow native symbols, and record-result allocator parameter collisions. Runtime fixtures cover carrier conversions, both record ABI classes, callback exception policies, shared and confined resources, failed adoption cleanup, and closed or wrong-thread memory and library scopes on the JVM and SVM.
The LLVM applicator preserves ThinLTO and full LTO input modes, including Rust fat-LTO bitcode. Integration tests link and execute both modes and retain optimized IR, disassembly and hashes. LLVM ELF FatLTO native objects with embedded .llvm.lto sections are a distinct format and remain unsupported; standalone objects and mixed archives containing them fail explicitly.
Validation and performance limits
A one-million-input native value fuzz campaign completed with no findings, including the required ASan, UBSan, leak and RSS expected-failure canaries. CI uses bounded ten-minute campaigns; longer campaigns run separately. These results cover the exercised native value workload, not every generated adapter or ABI signature.
The comparison harness separates generated and handwritten direct SVM normal/leaf calls, FFM normal/critical calls, and static JNI, retaining allocation observations, raw samples, compiler settings, hashes and instructions. Existing scalar measurements do not establish buffer, record, callback or resource performance. JVM measurements remain secondary; a critical-call configuration is not itself evidence of a speedup.
Myna remains dual-licensed under Apache-2.0 OR MIT. The portable value SDK includes the value-reader JAR, Rust crate, C/C++ headers and license texts; it does not imply publication to crates.io or Maven Central. Source archives, container images, checksums, attestations and symbol receipts follow the release verification procedure. macOS Native Image symbols preserve method names, not complete source-level DWARF.
Myna 0.8.0
Myna 0.8.0
SDK and source archives are available below with checksums, attestations, and Linux/macOS symbol receipts. Container images are still publishing.
Myna 0.8.0 makes the inlineable native-call path the default for Native Image imports. Binding ABI 2 replaces the ordinary leaf adapter with generated typed function pointers and relocated linker symbols. Consumers no longer need handwritten pointer interfaces or resolver functions for fixed symbols.
Breaking migration
Regenerate bindings and rebuild consumers together. Imports now promise short, bounded, nonblocking execution with no Java reentry. Explicitly opt out for other calls with native_leaf=false@explicit_contract; exports retain normal isolate entry. Audit callbacks, locks, allocation, I/O, cleanup and potentially long-running operations. Canonical JSON schema 2 records the binding ABI and effective call policy. Module protocol versions remain independent, and value-tape ABI v3 is unchanged.
Compile generated bindings with the pinned Elide Graal SDK's compile-only jars and package their generated META-INF/native-image resources. The new compiler helper handles both. See the migration guide for commands and lifecycle requirements.
Performance
Five-process ARM64 identity-call measurements from the retained matched builds:
| Host | Myna default | Handwritten SVM leaf | Native C pointer, unrolled ×4 |
|---|---|---|---|
| Linux ARM64 | 0.526 ns | 1.510 ns | 0.442 ns |
| Apple M5 Max | 0.519 ns | 0.999 ns | 0.512 ns |
These include the callee and loop; no control is subtracted. Compare within each host. Mac default/native process ranges overlap. README graphics, raw results and rerun commands, and retained assembly identify the sources, toolchain and hardware. CI checks that generated leaf adapter stubs do not reappear.
Validation
The change passes 196 JVM tests with production line coverage 99.27% and branch coverage 93.17%, native CLI end-to-end tests, six Native Image integration tests, Rust tests, and LLVM/ThinLTO integration tests. New coverage includes static linking, unused undefined symbols, first use before pointer resolution, and calls during concurrent allocation/GC. ASAN/TSAN workloads and their expected-failure canaries pass locally, as does sanitized C++/simdjson conformance. Required Linux/macOS, JVM, and container smoke-test gates passed before tagging.
Myna remains dual-licensed under Apache-2.0 OR MIT. Symbol sidecars, artifact checksums and provenance follow the release process.
Myna 0.7.2
Myna 0.7.2 specializes AOT FFM adapters at image build time, pins the Elide native toolchain and GraalVM, and adds repeatable performance and sanitizer coverage.
-
Direct Native Image C bindings remain the primary path. Generated versus handwritten C calls are measured under equivalent normal and leaf transition contracts. Standalone comparison runs retain raw samples and toolchain/source provenance; CodSpeed tracks Myna's own workloads separately.
-
Generated AOT FFM convenience calls use build-time unbound adapters with runtime symbol addresses. Explicit SymbolLookup factories remain compatible. Local measurements remove the prior microsecond-scale adapter overhead; checked-in shared-host timings are advisory.
-
Pin Elide 1.6.2, elide-dev/toolchain 2026.11.1 and checksum-verified elide-dev/graal 25.5.5-elide.24 across development, CI and containers.
-
Add deterministic fuzzing, ASan/UBSan and TSan workloads with expected-failure canaries, production coverage gates, and retained ThinLTO optimization evidence.
-
Local production line coverage: JVM 99.19%, Rust 97.79%, C/C++ values 99.39%, LLVM applicator 98.85%. Native-only Java readers are exercised in real SVM integration tests; managed-heap sanitizer coverage is not claimed.
-
Require nonempty matching build IDs/UUIDs; explicitly link Linux executables with GNU build IDs and reject unidentified inputs before stripping.
-
Retain matching ELF/DWARF and Mach-O dSYM sidecars and publish them to debuginfo staging through the Elide Cloud Myna connection. Cloud repository ingestion and agent-context onboarding are configured.
-
Checked-in ARM64 instruction evidence shows identical generated/manual scalar C-call sequences (normal and leaf). Hosted ARM timings remain advisory; a configurable compatible runner supports controlled measurement.
The portable value SDK retains value ABI v3. Regenerate versioned seam artifacts together when upgrading. See docs/benchmarking.md for rerun commands, comparison contracts and platform limitations.
The attached five-process ARM boundary baseline records verified source revision 57e3aa5a879d95a823cabdef3030ef99d7f411af, full CPU identity, raw samples and toolchain provenance. It precedes the symbol build-ID correction and version bump. Shared-host timings remain advisory.
Licensing: Myna is available under Apache-2.0 OR MIT, at your option. Both license texts are attached; third-party components retain their own terms. Original SDK/archive bytes and checksums are unchanged.
All four original Linux/macOS symbol sidecars were published successfully after replaying transient staging failures. The attached recovery receipts record source revision, content hashes and provider identifiers.
The attached hosted-arm64-0.7.2 baseline and SVM charts record the actual 0.7.2 source revision (7401c446ef9ad80d7bd14a9bf92f360a04956b80) with full CPU provenance and five processes per case. Earlier baseline files remain historical evidence. Shared-host timings remain advisory.
Myna 0.7.0
Myna 0.7.0 adds direct JSON-shaped value exchange between Rust/C++ producers and Substrate VM.
- Serde structs, nested containers, enums, and dynamic JSON types map directly to a native value tape.
- bumpalo is the default Rust arena; allocator-api2 and C++ PMR support caller-owned allocation.
- ABI v3 provides 16-byte inline text, explicitly borrowed regions, and exact JSON-number tokens.
- C++17 producer helpers work without Rust or Serde. Conformance tests exercise C++ simdjson OnDemand → Myna → Native Image.
- simdutf supplies Unicode validation and optional bulk UTF-16 conversion; Java readers support prepared keys, direct traversal, and lazy String materialization.
- The value runtime is a separate JAR, preserving generator-only downstream builds.
The attached portable SDK contains the Rust crate, C/C++ headers, value-reader JAR, ABI example, documentation, and SHA-256 manifests. It requires a 64-bit native target, a C++ compiler for simdutf, and Java 25+ with the Graal Native Image SDK for the SVM readers. Rust dependencies can also use this Git tag. This release does not publish to crates.io or Maven Central.
Serde strings copy because custom serializers can supply temporary strings. Direct builders support explicit borrowing; owners must keep the input, parser/unescape storage, and structural buffers alive and immutable through consumption. Exact-number conversion to BigDecimal or fixed-width numbers remains explicit and fallible.
The production TruffleData JSON backend, known-schema projections, and JEP 540/Jackson/JSON-P facades are planned upstream; this release supplies their native foundation, not a claim of facade compliance.
Validation: 16 Rust tests and 3 doctests; 189 JVM tests with coverage gates; C/C++ layout and ASan/UBSan checks; 2 CLI, 8 LLVM, and 5 Native Image integration tests. Cross-platform release checks run on Linux and macOS.
See the value API and ABI guide and PR #30.
Myna 0.6.0
What's Changed
- fix(validate): reject Rust prelude trait names as resource names and qualify emitted trait paths by Detail (@detail-app)[bot] in #21
- fix(validate): reject by-value imports of structs with reserved gaps or over-declared size by Detail (@detail-app)[bot] in #22
- fix(validate): reject Rust Fn alias collisions across functions by Detail (@detail-app)[bot] in #23
- fix(ffm): zero-extend unsigned u8/u16 arguments instead of sign-extending by Detail (@detail-app)[bot] in #24
- fix(validate): reserve the generated "Literals" holder name by Detail (@detail-app)[bot] in #25
- fix(validate): reject declared types named core or Option by Detail (@detail-app)[bot] in #20
- build: refresh dependencies and standardize reusable CI by Sam Gammon (@sgammon) in #26
- build: adopt mise and Elide embedded toolchains by Sam Gammon (@sgammon) in #28
Full Changelog: v0.5.0...v0.6.0