From 7b9ad9ae82d719437895fc6cf5c07bf918f4c729 Mon Sep 17 00:00:00 2001 From: michalharakal Date: Thu, 15 Oct 2026 08:36:32 +0200 Subject: [PATCH 1/4] docs(changelog): 0.60.0 entry --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7db1f0f..4b2aba8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.60.0] — 2026-10-15 + +**Exact GELU from the engine.** Against engine **0.59.0**, which makes `erf` a first-class op and +gives `gelu` an `approximate` flag carried as op metadata. Laya's decision models now run their +exact GELU through `gelu(approximate = false)` instead of a host-side loop per FFN per layer, so the +activation is a regular op on the compiled path (graph executor, backward rule, StableHLO `chlo.erf` +or `skainet.gelu` composite) and the multilingual predict fixtures still reproduce (55 values, +max |diff| 4.99e-5). The BOM re-exports `skainet-bom:0.59.0`. The SKEEP-006 deprecation schedule +moves by one more minor (see *Deprecated*). + ### Changed - **Engine 0.59.0.** The version catalog moves `sk.ainet.core:*` to 0.59.0. @@ -21,6 +31,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 the 22-layer encoder no longer pays 44 host round trips per decision. `LayaGelu.geluErf` / `erf` stay as the double-precision reference the engine kernel is checked against. +### Deprecated + +- **Schedule moved by one more minor.** The SKEEP-006 legacy surface (`GGUFTokenizer` and its + strategies, `TokenizerType`, `SentencePieceSpecialTokens`, `TekkenTokenizerAdapter`, `ModelRegistry`, + the `sk.ainet.apps.kllama.GGUFTokenizer` alias) stays at WARNING in 0.60, goes to ERROR in 0.61 + and leaves in 0.62; `TokenizerFactory` and the `sk.ainet.apps.llm.Tokenizer` sub-interface are + deprecated in 0.61 and removed in 0.62. The runtimes, CLIs and benchmarks still reach the engine + through the factory (about thirty main-source files); that migration is a release of its own and + did not fit next to the engine bump. This matches the engine, whose io-core aliases also stay at + WARNING in 0.59. + ## [0.59.0] — 2026-10-13 **Typed decisions.** Three new modules on the JVM path, against engine **0.58.0**: the From e71c220d68eaf08ef09ae43be7911cf909e52aa6 Mon Sep 17 00:00:00 2001 From: michalharakal Date: Thu, 15 Oct 2026 08:36:32 +0200 Subject: [PATCH 2/4] docs(readme): 0.60.0 highlights and BOM coordinate --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 12005e0f..1af8a179 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,11 @@ Honest status — see the project-status note at the top of this README. ## Current release -The current release is **0.59.0**, against **SKaiNET 0.58.0**. +The current release is **0.60.0**, against **SKaiNET 0.59.0**. + +**Exact GELU from the engine.** SKaiNET 0.59.0 makes `erf` a first-class op and gives `gelu` an `approximate` flag that travels as op metadata through the graph executor, the backward rule and the StableHLO export. Laya's decision models now run their exact GELU through `gelu(approximate = false)` instead of a host-side loop per FFN per layer, and the multilingual predict fixtures still reproduce (55 values, max |diff| 4.99e-5). The SKEEP-006 legacy tokenizer surface stays at WARNING in 0.60; the schedule moves by one more minor (ERROR in 0.61, gone in 0.62). + +It builds on **0.59.0**, against **SKaiNET 0.58.0**: **Typed decisions, not text.** Three new modules bring decision models to the JVM path. `skainet-transformers-decisions-api` (`sk.ainet.decisions`, no engine dependency) is the contract: a `DecisionRequest` carries a state and up to 64 questions of three primitives — `choice` (one option out of a list), `score` (an ordinal scale), `boolean probability` — and every question ends in `Accepted`, `Abstained(reason, candidate)` or `Failed(error)`, never a silent guess; the caller owns the `AcceptancePolicy`. `skainet-transformers-decisions-runtime` validates a request against the adapter's capabilities and applies the policy. `skainet-transformers-inference-laya` is the first adapter: the Laya multilingual checkpoint (mmBERT-base encoder, decision head, Apache 2.0, Convai Innovations) on the FP32 CPU path with exact GELU, verified against the fixtures shipped with the checkpoint (26/26 packed sequences, a 40-text tokenizer corpus, predictions within 5e-5). The Kotlin DSL — `decisionSchema { }` declares questions, policy and model once and stamps out a request per state; `decisionRequest { }`, `acceptancePolicy { }`; `choice(id)` / `score(id)` / `boolean(id)` readback — follows the NN and data pipeline DSLs. Eager FP32 is seconds per decision on a laptop; the compiled and quantized lanes, batching across questions (#490) and an exact GELU op in the engine (SKaiNET#1342) are the open items. `HuggingFaceBPETokenizer` is removed; the remaining SKEEP-006 deprecations stay at WARNING and leave in 0.61. @@ -287,7 +291,7 @@ The recommended way to consume is via the BOM. It pins every published `skainet- ```kotlin dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.59.0")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) // Versions resolved from the BOM: implementation("sk.ainet.transformers:skainet-transformers-core") From d1b64bb4bef7c49c306afecdcb8955d0453605b0 Mon Sep 17 00:00:00 2001 From: michalharakal Date: Thu, 15 Oct 2026 08:36:32 +0200 Subject: [PATCH 3/4] docs: bump version references to 0.60.0 --- .../ROOT/pages/how-to/export-moonshine-v2-streaming.adoc | 2 +- docs/modules/ROOT/pages/reference/moonshine-encoder.adoc | 2 +- docs/modules/ROOT/pages/reference/tokenizer-api.adoc | 7 ++++--- docs/modules/ROOT/pages/reference/typed-decisions.adoc | 2 +- .../ROOT/pages/tutorials/android-getting-started.adoc | 2 +- .../modules/ROOT/pages/tutorials/getting-started-java.adoc | 4 ++-- .../modules/ROOT/pages/tutorials/getting-started-leaf.adoc | 2 +- docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc | 2 +- 8 files changed, 12 insertions(+), 11 deletions(-) diff --git a/docs/modules/ROOT/pages/how-to/export-moonshine-v2-streaming.adoc b/docs/modules/ROOT/pages/how-to/export-moonshine-v2-streaming.adoc index 440ebe2e..db660631 100644 --- a/docs/modules/ROOT/pages/how-to/export-moonshine-v2-streaming.adoc +++ b/docs/modules/ROOT/pages/how-to/export-moonshine-v2-streaming.adoc @@ -32,7 +32,7 @@ From your own build, resolve the published module and run its main class: ---- val exportTool by configurations.creating dependencies { - exportTool(platform("sk.ainet.transformers:skainet-transformers-bom:0.59.0")) + exportTool(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) exportTool("sk.ainet.transformers:skainet-transformers-inference-moonshine") } tasks.register("exportMoonshine") { diff --git a/docs/modules/ROOT/pages/reference/moonshine-encoder.adoc b/docs/modules/ROOT/pages/reference/moonshine-encoder.adoc index 4baf34bc..14514990 100644 --- a/docs/modules/ROOT/pages/reference/moonshine-encoder.adoc +++ b/docs/modules/ROOT/pages/reference/moonshine-encoder.adoc @@ -24,7 +24,7 @@ a DSL decoder is future work. [source,kotlin] ---- dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.59.0")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) implementation("sk.ainet.transformers:skainet-transformers-inference-moonshine") } ---- diff --git a/docs/modules/ROOT/pages/reference/tokenizer-api.adoc b/docs/modules/ROOT/pages/reference/tokenizer-api.adoc index d9f69c29..8f6531d7 100644 --- a/docs/modules/ROOT/pages/reference/tokenizer-api.adoc +++ b/docs/modules/ROOT/pages/reference/tokenizer-api.adoc @@ -87,6 +87,7 @@ descriptor with `+`. `GGUFModelInfo.identity` is the string identity |=== `HuggingFaceBPETokenizer` (no callers since 0.58) was removed in 0.59.0. The schedule for the -rest moved by one minor in 0.59.0: the legacy classes stay at WARNING through 0.59, go to ERROR -in 0.60 and leave in 0.61, because the runtimes, CLIs and benchmarks still reach the engine -through `TokenizerFactory` and the sub-interface, and moving them is a release of its own. +rest moved by one minor in 0.59.0 and by one more in 0.60.0: the legacy classes stay at WARNING +through 0.60, go to ERROR in 0.61 and leave in 0.62, because the runtimes, CLIs and benchmarks +still reach the engine through `TokenizerFactory` and the sub-interface, and moving them is a +release of its own. diff --git a/docs/modules/ROOT/pages/reference/typed-decisions.adoc b/docs/modules/ROOT/pages/reference/typed-decisions.adoc index e1337ba9..5872b4db 100644 --- a/docs/modules/ROOT/pages/reference/typed-decisions.adoc +++ b/docs/modules/ROOT/pages/reference/typed-decisions.adoc @@ -12,7 +12,7 @@ below put that on the JVM path with the same contract for every model. [source,kotlin] ---- dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.59.0")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) implementation("sk.ainet.transformers:skainet-transformers-decisions-api") // the contract, no engine dependency implementation("sk.ainet.transformers:skainet-transformers-decisions-runtime") // validation + acceptance policy implementation("sk.ainet.transformers:skainet-transformers-inference-laya") // Laya as a DecisionAdapter diff --git a/docs/modules/ROOT/pages/tutorials/android-getting-started.adoc b/docs/modules/ROOT/pages/tutorials/android-getting-started.adoc index 7205d058..b5f7cb46 100644 --- a/docs/modules/ROOT/pages/tutorials/android-getting-started.adoc +++ b/docs/modules/ROOT/pages/tutorials/android-getting-started.adoc @@ -55,7 +55,7 @@ dependencies { // self-registers it on ART at process start — nothing to call. runtimeOnly("sk.ainet.core:skainet-backend-jni-cpu") - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.59.0")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) implementation("sk.ainet.transformers:skainet-transformers-core") implementation("sk.ainet.transformers:skainet-transformers-runtime-kllama") implementation("sk.ainet.transformers:skainet-transformers-inference-llama") diff --git a/docs/modules/ROOT/pages/tutorials/getting-started-java.adoc b/docs/modules/ROOT/pages/tutorials/getting-started-java.adoc index b90e84b6..966487a1 100644 --- a/docs/modules/ROOT/pages/tutorials/getting-started-java.adoc +++ b/docs/modules/ROOT/pages/tutorials/getting-started-java.adoc @@ -25,7 +25,7 @@ In your `build.gradle.kts`: [source,kotlin] ---- dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.59.0")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) implementation("sk.ainet.transformers:skainet-transformers-runtime-kllama") implementation("sk.ainet.transformers:skainet-transformers-agent") @@ -41,7 +41,7 @@ Or in Maven (Maven needs the `-jvm` classifier suffix on platform artifacts): sk.ainet.transformers skainet-transformers-bom - 0.59.0 + 0.60.0 pom import diff --git a/docs/modules/ROOT/pages/tutorials/getting-started-leaf.adoc b/docs/modules/ROOT/pages/tutorials/getting-started-leaf.adoc index 0b016b95..7a97ee4f 100644 --- a/docs/modules/ROOT/pages/tutorials/getting-started-leaf.adoc +++ b/docs/modules/ROOT/pages/tutorials/getting-started-leaf.adoc @@ -34,7 +34,7 @@ encoder output to the advertised dimensionality. The runtime applies it automati [source,kotlin] ---- dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.59.0")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) implementation("sk.ainet.transformers:skainet-transformers-providers") } ---- diff --git a/docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc b/docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc index 35c81b43..c58b8aee 100644 --- a/docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc +++ b/docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc @@ -52,7 +52,7 @@ The pieces you need live in three modules: [source,kotlin] ---- dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.59.0")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) implementation("sk.ainet.transformers:skainet-transformers-runtime-kllama") implementation("sk.ainet.transformers:skainet-transformers-agent") From 1621954a33b7cdd69a839a20f853ddae523580cc Mon Sep 17 00:00:00 2001 From: michalharakal Date: Thu, 15 Oct 2026 08:36:32 +0200 Subject: [PATCH 4/4] release: prepare 0.60.0 -- against engine 0.59.0 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 77cef5a7..6f505c9a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ GROUP=sk.ainet.transformers -VERSION_NAME=0.59.0 +VERSION_NAME=0.60.0 POM_DESCRIPTION=SKaiNET-transformers