From fa99bb0216131e543f5c20fdba4d81531d95059d Mon Sep 17 00:00:00 2001 From: michalharakal Date: Thu, 24 Sep 2026 12:59:28 +0200 Subject: [PATCH 1/5] docs(changelog): 0.57.0 entry --- CHANGELOG.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5e044e3..39201f76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ ## [Unreleased] +## [0.57.0] - 2026-09-24 + +Headline: **grouped-query KV-cache graphs export with an attention mask, and the toolchain moves to +Kotlin 2.4.20.** The StableHLO attention converter now emits valid IR for an explicit mask under +grouped-query attention and onto a dynamic key length, the shape of a chunked-prefill graph over a +KV cache. Static graphs emit exactly what they did in 0.56.0. + +Version note: SKaiNET-transformers 0.57.0 follows on this engine release, keeping the two on one +version line. + ### Fixed - **SDPA StableHLO export: explicit masks under grouped-query attention and onto a dynamic key @@ -14,6 +24,25 @@ `known_nonexpanding_dimensions`, the form IREE 3.11 lowers. Static graphs are unchanged. Note: IREE 3.11 does not lower `dynamic_reshape`, so for IREE prefer a head-shared `[b, 1, Sq, ?]` mask when the key length is dynamic. +- **`skainet-data-source` exports kotlinx-io as `api`** (#1295). `DataSourceArtifact.openSource()` / + `copyTo()`, `DataSourceRemoteContent` and `DataSourceArtifactStore` expose `kotlinx.io.Source` and + `Sink`, but kotlinx-io was an implementation dependency (runtime scope in the published POM), so + consumers failed with "Cannot access class kotlinx.io.Source" unless they declared it themselves. + +### Changed + +- **Kotlin 2.4.20** (#1304; supersedes #1271, #1272, #1273), with the Kotlin/JS `yarn.lock` + regenerated for the newer JS toolchain. +- **Security pins**: the `webpack` pin is dropped. Kotlin 2.4.20's Gradle plugin requests webpack + 5.108.1, already past 5.104.1, the first release clearing GHSA-8fgc-7cc6-rx7x and + GHSA-38r7-794h-5758, so the pin only held the bundler behind the version the plugin is tested + with. All other npm pins are unchanged. +- **Dependencies**: AGP 9.4.1 (#1299), Ktor client 3.6.0 (#1296), kctfork 0.14.0 (#1300). +- **CI**: the publish workflow gains a manual dry run (`workflow_dispatch`): the full release + pipeline into Maven Local, never given the Maven Central credentials (#1294). `GITFLOW.adoc` + documents the dry-run and green-before-tag gates. Action bumps: `actions/deploy-pages` 5.0.1 + (#1263), `android-actions/setup-android` 4.0.4 (#1298), `github/codeql-action/upload-sarif` + 4.38.1 (#1297). ## [0.56.0] - 2026-09-20 From bb9d1ad2502df4d07d4e47febce1927637191d7d Mon Sep 17 00:00:00 2001 From: michalharakal Date: Thu, 24 Sep 2026 12:59:47 +0200 Subject: [PATCH 2/5] docs(readme): 0.57.0 highlights and BOM coordinate --- README.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index f2df1213..57804234 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Add the core dependencies (Gradle Kotlin DSL): ```kotlin dependencies { // Recommended: import the umbrella BOM and drop versions on the engine modules. - implementation(platform("sk.ainet:skainet-bom:0.56.0")) + implementation(platform("sk.ainet:skainet-bom:0.57.0")) implementation("sk.ainet.core:skainet-lang-core") implementation("sk.ainet.core:skainet-backend-cpu") @@ -308,24 +308,18 @@ val withoutLabel = dataPipeline() --- -## What's New in 0.56.0 +## What's New in 0.57.0 -Grouped-query attention becomes native to the engine, and the compiled leg of SKEEP-005 lands: +Grouped-query KV-cache graphs export with an attention mask, and the toolchain moves to Kotlin 2.4.20: -- **Grouped-query `scaledDotProductAttention`** — K/V arrive with their own head count - (`[b, nKV, Sk, hd]`); query head `h` reads K/V head `h / (H / nKV)`. Bit-identical to before when - `nKV == H`, and to the old tiled form otherwise. Model code no longer expands K/V heads before - attention — not eagerly, not on the tape. -- **Leaner StableHLO for GQA models** — attention lowers with the head groups as a batching - dimension, so exports carry no broadcast or concatenate of K/V. -- **Structure at compile time, cores at run time** — `ScheduleAnnotationPass` stamps structural - defaults (`parallel_dims = [batch, heads]` on every attention); an explicit `parallelism` is - advisory and a default can never carry a core count. -- **Graph contexts honour the schedule of their ops** — the new `ScheduledOps` seam lets - `DefaultGraphExecutionContext` answer `schedule`/`withSchedule` from the ops it wraps, so the JVM - `ComputeGraphExecutor` runs under the caller's schedule. - -0.55.0 is skipped so the engine and SKaiNET-transformers share a version line again. +- **Masked grouped-query attention exports to valid StableHLO** — a per-head mask under GQA is split + into the K/V head groups instead of broadcast onto them, and a mask onto a dynamic key length (the + chunked-prefill shape of a KV-cache graph) uses `dynamic_broadcast_in_dim` with the expansion hints + IREE 3.11 needs. Static graphs emit exactly what they did before. +- **kotlinx-io is part of `skainet-data-source`'s API** — callers of `openSource()` / `copyTo()` no + longer need to declare it themselves. +- **Kotlin 2.4.20**, AGP 9.4.1, Ktor client 3.6.0; the `webpack` security pin is retired now that + the Kotlin toolchain's own webpack is past the fix. See [CHANGELOG.md](CHANGELOG.md) for full release notes, including every prior release. @@ -351,6 +345,12 @@ We love contributions! Whether it's a new operator, documentation, or a bug fix: Browse the full codebase documentation on [DeepWiki](https://deepwiki.com/SKaiNET-developers/SKaiNET). +### Contributors (0.57.0) + +- **Michal Harakal** ([@michalharakal](https://github.com/michalharakal)) — masked grouped-query + attention in the StableHLO export, the kotlinx-io API fix, the Kotlin 2.4.20 upgrade, and the + publish dry run + ### Contributors (0.56.0) - **Michal Harakal** ([@michalharakal](https://github.com/michalharakal)) — grouped-query-native From 0c5310dcd79851436edf36b4b8a851db83720410 Mon Sep 17 00:00:00 2001 From: michalharakal Date: Thu, 24 Sep 2026 13:00:01 +0200 Subject: [PATCH 3/5] docs: bump version references to 0.57.0 --- docs/antora.yml | 2 +- .../android-classifier-getting-started.adoc | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/antora.yml b/docs/antora.yml index 8fd8ea3c..dcc30cc9 100644 --- a/docs/antora.yml +++ b/docs/antora.yml @@ -15,7 +15,7 @@ asciidoc: framework_name: SKaiNET # Current SKaiNET release — bump once per release; referenced as # {skainet_version} in dependency snippets (blocks need subs="attributes+"). - skainet_version: 0.56.0 + skainet_version: 0.57.0 ksp_version: 2.2.21-2.0.5 dokka_version: 2.1.0 asciidoctorj_version: 3.0.0 diff --git a/docs/modules/ROOT/pages/tutorials/android-classifier-getting-started.adoc b/docs/modules/ROOT/pages/tutorials/android-classifier-getting-started.adoc index a72c911e..82f3859b 100644 --- a/docs/modules/ROOT/pages/tutorials/android-classifier-getting-started.adoc +++ b/docs/modules/ROOT/pages/tutorials/android-classifier-getting-started.adoc @@ -19,12 +19,12 @@ An Android project with Kotlin. Add the SKaiNET modules: [source,kotlin] ---- dependencies { - implementation("sk.ainet.core:skainet-lang-core:0.56.0") // tensors, DSL, training - implementation("sk.ainet.core:skainet-backend-cpu:0.56.0") // CPU ops - implementation("sk.ainet.core:skainet-compile-dag:0.56.0") // autograd (training context) - implementation("sk.ainet.core:skainet-data-api:0.56.0") // Dataset / DataBatch - implementation("sk.ainet.core:skainet-data-simple:0.56.0") // embedded Iris - runtimeOnly("sk.ainet.core:skainet-backend-jni-cpu:0.56.0") // NEON kernels (see below) + implementation("sk.ainet.core:skainet-lang-core:0.57.0") // tensors, DSL, training + implementation("sk.ainet.core:skainet-backend-cpu:0.57.0") // CPU ops + implementation("sk.ainet.core:skainet-compile-dag:0.57.0") // autograd (training context) + implementation("sk.ainet.core:skainet-data-api:0.57.0") // Dataset / DataBatch + implementation("sk.ainet.core:skainet-data-simple:0.57.0") // embedded Iris + runtimeOnly("sk.ainet.core:skainet-backend-jni-cpu:0.57.0") // NEON kernels (see below) } ---- From e7a9405cdbf103522d2b5f40745468f78c22a100 Mon Sep 17 00:00:00 2001 From: michalharakal Date: Thu, 24 Sep 2026 13:00:02 +0200 Subject: [PATCH 4/5] release: 0.57.0 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 66fc22f0..fc4cdeb9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ GROUP=sk.ainet.core -VERSION_NAME=0.56.0 +VERSION_NAME=0.57.0 POM_DESCRIPTION=SKaiNET POM_URL=https://github.com/SKaiNET-developers/skainet/ From 92b098318b2f58e241031ea515abd5761a0326bc Mon Sep 17 00:00:00 2001 From: michalharakal Date: Thu, 24 Sep 2026 13:00:22 +0200 Subject: [PATCH 5/5] docs: regenerate operator and kernel matrices at 0.57.0 --- docs/modules/ROOT/pages/reference/kernel-support-matrix.adoc | 2 +- .../modules/ROOT/pages/reference/operators/generated/index.adoc | 2 +- docs/modules/ROOT/pages/reference/ops-status-matrix.adoc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/modules/ROOT/pages/reference/kernel-support-matrix.adoc b/docs/modules/ROOT/pages/reference/kernel-support-matrix.adoc index 9055b935..82367da8 100644 --- a/docs/modules/ROOT/pages/reference/kernel-support-matrix.adoc +++ b/docs/modules/ROOT/pages/reference/kernel-support-matrix.adoc @@ -1,7 +1,7 @@ = Kernel × platform support matrix :description: Which compute-kernel provider serves each weight format on each KMP target. -Generated from `kernel-support.json` (version `0.56.0`) by `KernelSupportMatrixTest` — registry introspection of the registered `KernelProvider` implementations. Do not edit by hand; run `./gradlew generateKernelMatrix` to refresh. +Generated from `kernel-support.json` (version `0.57.0`) by `KernelSupportMatrixTest` — registry introspection of the registered `KernelProvider` implementations. Do not edit by hand; run `./gradlew generateKernelMatrix` to refresh. Each cell is the best (highest-priority) provider that serves `Float32 × format` `matmul` on that platform: *native-ffm* (100) → *panama-vector* (50) → *scalar* (0). An empty cell (`—`) means no provider carries a kernel there (the format is dequant-to-FP32 only). diff --git a/docs/modules/ROOT/pages/reference/operators/generated/index.adoc b/docs/modules/ROOT/pages/reference/operators/generated/index.adoc index 6bcf540a..57c23c16 100644 --- a/docs/modules/ROOT/pages/reference/operators/generated/index.adoc +++ b/docs/modules/ROOT/pages/reference/operators/generated/index.adoc @@ -1,6 +1,6 @@ = AI-NET Operators Reference -Generated from version `0.56.0` on 2026-09-20 +Generated from version `0.57.0` on 2026-09-24 == Operators by Modality diff --git a/docs/modules/ROOT/pages/reference/ops-status-matrix.adoc b/docs/modules/ROOT/pages/reference/ops-status-matrix.adoc index 3b9ae8fe..a013a9cb 100644 --- a/docs/modules/ROOT/pages/reference/ops-status-matrix.adoc +++ b/docs/modules/ROOT/pages/reference/ops-status-matrix.adoc @@ -1,7 +1,7 @@ = Operator Coverage Matrix :description: Cross-backend status for every operator function in SKaiNET. -Generated from `operators.json` version `0.56.0` on 2026-09-20. +Generated from `operators.json` version `0.57.0` on 2026-09-24. Rows are `Operator.function` pairs. The `Validated` column shows whether the function's documentation has been DARC-validated by a reviewer (see xref:contributing/darc-workflow.adoc[DARC workflow]). Remaining columns are backends that appear in any function's `statusByBackend` map — a missing entry means the backend makes no claim about the function (treat it as "unknown", not "not supported").