diff --git a/.claude/settings.json b/.claude/settings.json
index 357650cf71..3c7da68c35 100644
--- a/.claude/settings.json
+++ b/.claude/settings.json
@@ -1,5 +1,6 @@
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
+ "plansDirectory": ".claude/plans",
"permissions": {
"allow": [
"Edit(version.gradle.kts)",
@@ -32,8 +33,11 @@
"Bash(mkdir:*)",
"Bash(touch:*)",
"Bash(python3 .agents/skills/update-copyright/scripts/update_copyright.py:*)",
+ "Bash(.agents/skills/version-bumped/scripts/version-bumped.sh)",
"Bash(./config/pull)",
- "Bash(./config/migrate)"
+ "Bash(./config/migrate)",
+ "Skill(pre-pr)",
+ "Skill(pre-pr:*)"
],
"deny": [
"Bash(git reset --hard:*)",
diff --git a/.gitignore b/.gitignore
index dfb4774d4e..ed1b0baa78 100644
--- a/.gitignore
+++ b/.gitignore
@@ -54,8 +54,12 @@
.idea/modules
.idea/shelf
+# `.idea/misc.xml` is intentionally NOT re-included below. It is project-local —
+# it holds the per-project JDK name and IDEA's own churn (entry-point list
+# indices, external-storage toggles) — so `.idea/*.xml` above keeps it ignored.
+# `./config/pull` (via `migrate`) untracks any copy an earlier pull committed.
+
# Do not ignore the following IDEA settings
-!.idea/misc.xml
!.idea/codeStyleSettings.xml
!.idea/codeStyles/
!.idea/copyright/
@@ -173,6 +177,12 @@ __pycache__/
# Claude working files
/.claude/worktrees/
+# Ephemeral plan-mode scratch (durable task docs live in `.agents/tasks/`).
+/.claude/plans/
+
+# Personal, per-developer Claude Code settings overrides (never committed;
+# the distributed `.claude/settings.json` is the shared, committed layer).
+/.claude/settings.local.json
# Auto-downloaded Lychee binary used by the `check-links` skill.
/.agents/skills/check-links/.cache/
@@ -190,7 +200,6 @@ docs/_preview/resources/
# <<< shared config <<<
# >>> repo-local entries (preserved across ./config/pull) >>>
-!.idea/misc.xml
!.idea/codeStyleSettings.xml
!.idea/codeStyles/
!.idea/copyright/
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 264f823015..0000000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/base/src/main/kotlin/io/spine/compare/ComparatorRegistry.kt b/base/src/main/kotlin/io/spine/compare/ComparatorRegistry.kt
index 7803370ce2..dd231e64c8 100644
--- a/base/src/main/kotlin/io/spine/compare/ComparatorRegistry.kt
+++ b/base/src/main/kotlin/io/spine/compare/ComparatorRegistry.kt
@@ -53,10 +53,18 @@ public object ComparatorRegistry {
map[clazz] = comparator
}
+ /**
+ * Registers a [comparator] for the specified type [T].
+ *
+ * The method overrides the previously set comparator, if any.
+ */
+ public inline fun register(comparator: Comparator): Unit =
+ register(T::class.java, comparator)
+
/**
* Returns a comparator for the given [clazz].
*
- * @throws IllegalStateException if there is no a comparator for the given [clazz].
+ * @throws IllegalStateException if there is no comparator for the given [clazz].
*/
@JvmStatic
@Suppress("UNCHECKED_CAST") // Type safety is enforced by `register()` method signature.
@@ -65,6 +73,13 @@ public object ComparatorRegistry {
return map[clazz]!! as Comparator
}
+ /**
+ * Returns a comparator for the specified type [T].
+ *
+ * @throws IllegalStateException if there is no comparator for the type [T].
+ */
+ public inline fun get(): Comparator = get(T::class.java)
+
/**
* Returns a comparator for the given [clazz], if any.
*/
@@ -72,12 +87,22 @@ public object ComparatorRegistry {
@Suppress("UNCHECKED_CAST") // Type safety is enforced by `register()` method signature.
public fun find(clazz: Class): Comparator? = map[clazz] as Comparator?
+ /**
+ * Returns a comparator for the specified type [T], if any.
+ */
+ public inline fun find(): Comparator? = find(T::class.java)
+
/**
* Tells whether the registry has a comparator for the given [clazz].
*/
@JvmStatic
public fun contains(clazz: Class<*>): Boolean = map.containsKey(clazz)
+ /**
+ * Tells whether the registry has a comparator for the specified type [T].
+ */
+ public inline fun contains(): Boolean = contains(T::class.java)
+
/**
* Returns the types for which comparators are currently registered.
*
@@ -92,28 +117,3 @@ public object ComparatorRegistry {
.forEach { it.registerIn(this) }
}
}
-
-/**
- * Tells whether the registry has a comparator for the specified type [T].
- */
-public inline fun ComparatorRegistry.contains(): Boolean = contains(T::class.java)
-
-/**
- * Returns a comparator for the specified type [T], if any.
- */
-public inline fun ComparatorRegistry.find(): Comparator? = find(T::class.java)
-
-/**
- * Returns a comparator for the specified type [T].
- *
- * @throws IllegalStateException if there is no a comparator for the type [T].
- */
-public inline fun ComparatorRegistry.get(): Comparator = get(T::class.java)
-
-/**
- * Registers a [comparator] for the specified type [T].
- *
- * The method overrides the previously set comparator, if any.
- */
-public inline fun ComparatorRegistry.register(comparator: Comparator): Unit =
- register(T::class.java, comparator)
diff --git a/base/src/main/kotlin/io/spine/string/Indent.kt b/base/src/main/kotlin/io/spine/string/Indent.kt
index b1368c912b..fdda6a04a2 100644
--- a/base/src/main/kotlin/io/spine/string/Indent.kt
+++ b/base/src/main/kotlin/io/spine/string/Indent.kt
@@ -51,6 +51,21 @@ public data class Indent(
*/
override fun toString(): String = value
+ /**
+ * Repeats this indentation [n] times.
+ *
+ * @throws [IllegalArgumentException] when [n] < 0.
+ */
+ public fun repeat(n: Int): String {
+ require(n >= 0) { "Count `n` must be non-negative, but was $n."}
+ return value.repeat(n)
+ }
+
+ /**
+ * Same as [repeat].
+ */
+ public fun atLevel(n: Int): String = repeat(n)
+
public companion object {
/**
@@ -88,18 +103,3 @@ public data class Indent(
}
}
}
-
-/**
- * Repeats this indentation [n] times.
- *
- * @throws [IllegalArgumentException] when [n] < 0.
- */
-public fun Indent.repeat(n: Int): String {
- require(size >= 0) { "Count `n` must be non-negative, but was $size."}
- return value.repeat(n)
-}
-
-/**
- * Same as [repeat].
- */
-public fun Indent.atLevel(l: Int): String = repeat(l)
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/ErrorProne.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/ErrorProne.kt
index b1e3e474cf..a0226ca4a4 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/build/ErrorProne.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/ErrorProne.kt
@@ -29,8 +29,13 @@ package io.spine.dependency.build
// https://errorprone.info/
@Suppress("unused", "ConstPropertyName")
object ErrorProne {
- // https://github.com/google/error-prone
- private const val version = "2.36.0"
+ /**
+ * This is the last version which is compatible with Java 17.
+ *
+ * The version 2.43.0 requires JDK 21.
+ * https://github.com/google/error-prone/releases/tag/v2.43.0
+ */
+ private const val version = "2.42.0"
const val group = "com.google.errorprone"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Jackson.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Jackson.kt
index a2a64c0efa..33b3b089cc 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Jackson.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Jackson.kt
@@ -33,7 +33,7 @@ import io.spine.dependency.DependencyWithBom
@Suppress("unused")
object Jackson : DependencyWithBom() {
override val group = "com.fasterxml.jackson"
- override val version = "2.22.0"
+ override val version = "2.22.1"
// https://github.com/FasterXML/jackson-annotations?tab=readme-ov-file#release-notes
const val annotationsVersion = "2.22"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt
index 433c1bd959..4c0bcf02ef 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt
@@ -33,8 +33,8 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName", "unused")
object Base {
- const val version = "2.0.0-SNAPSHOT.421"
- const val versionForBuildScript = "2.0.0-SNAPSHOT.421"
+ const val version = "2.0.0-SNAPSHOT.423"
+ const val versionForBuildScript = "2.0.0-SNAPSHOT.423"
const val group = Spine.group
private const val prefix = "spine"
const val libModule = "$prefix-base"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt
index 8dbffcdc46..ba16d2f8bd 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt
@@ -72,7 +72,7 @@ object Compiler : Dependency() {
* The version of the Compiler dependencies.
*/
override val version: String
- private const val fallbackVersion = "2.0.0-SNAPSHOT.059"
+ private const val fallbackVersion = "2.0.0-SNAPSHOT.061"
/**
* The distinct version of the Compiler used by other build tools.
@@ -81,7 +81,7 @@ object Compiler : Dependency() {
* transitive dependencies, this is the version used to build the project itself.
*/
val dogfoodingVersion: String
- private const val fallbackDfVersion = "2.0.0-SNAPSHOT.059"
+ private const val fallbackDfVersion = "2.0.0-SNAPSHOT.061"
/**
* The artifact for the Compiler Gradle plugin.
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt
index d4b8a18ccc..2f7e68e775 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt
@@ -39,7 +39,7 @@ typealias CoreJava = CoreJvm
@Suppress("ConstPropertyName", "unused")
object CoreJvm {
const val group = Spine.group
- const val version = "2.0.0-SNAPSHOT.381"
+ const val version = "2.0.0-SNAPSHOT.420"
const val coreArtifact = "spine-core"
const val clientArtifact = "spine-client"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt
index e9f477ac3c..c79171f064 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt
@@ -33,7 +33,7 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName", "unused")
object Logging {
- const val version = "2.0.0-SNAPSHOT.419"
+ const val version = "2.0.0-SNAPSHOT.422"
const val group = Spine.group
const val loggingArtifact = "spine-logging"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt
index 3ff845647a..271fe49e33 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt
@@ -40,7 +40,7 @@ import io.spine.dependency.Dependency
)
object Time : Dependency() {
override val group = Spine.group
- override val version = "2.0.0-SNAPSHOT.242"
+ override val version = "2.0.0-SNAPSHOT.244"
private const val infix = "spine-time"
fun lib(version: String): String = "$group:$infix:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt
index cd11577fbe..c0cbea3869 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt
@@ -34,8 +34,8 @@ package io.spine.dependency.local
@Suppress("ConstPropertyName", "unused")
object ToolBase {
const val group = Spine.toolsGroup
- const val version = "2.0.0-SNAPSHOT.402"
- const val dogfoodingVersion = "2.0.0-SNAPSHOT.402"
+ const val version = "2.0.0-SNAPSHOT.403"
+ const val dogfoodingVersion = "2.0.0-SNAPSHOT.403"
const val lib = "$group:tool-base:$version"
const val classicCodegen = "$group:classic-codegen:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt
index 10f9f0dba1..9a92fe8b0f 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt
@@ -36,7 +36,7 @@ object Validation {
/**
* The version of the Validation library artifacts.
*/
- const val version = "2.0.0-SNAPSHOT.446"
+ const val version = "2.0.0-SNAPSHOT.450"
const val group = Spine.toolsGroup
private const val prefix = "validation"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/test/Jacoco.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/Jacoco.kt
index 478ae1b96a..04a8888897 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Jacoco.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Jacoco.kt
@@ -34,4 +34,12 @@ package io.spine.dependency.test
@Suppress("ConstPropertyName")
object Jacoco {
const val version = "0.8.15"
+
+ /**
+ * The Maven coordinates of the standalone JaCoCo agent JAR (the `runtime`
+ * classifier), attached via `-javaagent:` to forked JVMs — Gradle TestKit
+ * workers and the Spine Compiler process — so their execution is credited
+ * to coverage.
+ */
+ const val agent = "org.jacoco:org.jacoco.agent:$version:runtime"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/KoverConfig.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/KoverConfig.kt
index e3bd5b98dd..9836fae1a6 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/KoverConfig.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/KoverConfig.kt
@@ -29,13 +29,16 @@ package io.spine.gradle.report.coverage
import io.spine.dependency.test.Jacoco
import io.spine.dependency.test.Kover
import io.spine.gradle.testing.TESTKIT_COVERAGE_DIR
+import io.spine.gradle.testing.isSpineCompilerLaunchTask
import java.io.File
import kotlinx.kover.gradle.plugin.dsl.KoverProjectExtension
import org.gradle.api.Project
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.provider.Provider
+import org.gradle.api.tasks.JavaExec
import org.gradle.api.tasks.SourceSet
+import org.gradle.kotlin.dsl.project
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
@@ -104,6 +107,13 @@ private const val KOTLIN_FILE_CLASS_SUFFIX: String = "Kt"
* the probe level against each module's actual bytecode: a line hit both
* in-process and out-of-process is counted once. Summing pre-aggregated XML
* reports instead would double-count such lines.
+ * - Feeds the JaCoCo execution data produced by the forked Spine Compiler JVMs
+ * (see [io.spine.gradle.testing.enableSpineCompilerCoverage]) into the **root**
+ * `total` report as `additionalBinaryReports`. This credits code-generation
+ * plugins — renderers and generators that run out-of-process in the compiler
+ * fork and are otherwise reported at ~0%. Fed only at the root: Codecov ingests
+ * the root report, whose aggregation owns those classes, so a per-module feed
+ * would be redundant.
*
* This is the Kover-based successor to the deprecated JaCoCo-based
* coverage aggregation pipeline. The behaviour mirrors what
@@ -160,7 +170,10 @@ class KoverConfig private constructor(
}
private fun addAggregationDependency(sub: Project) {
- rootProject.dependencies.add("kover", rootProject.project(sub.path))
+ // Pass the project path, not the `Project` instance: using a `Project`
+ // object as a dependency notation is deprecated since Gradle 9.
+ val dependencies = rootProject.dependencies
+ dependencies.add("kover", dependencies.project(sub.path))
}
/**
@@ -198,6 +211,7 @@ class KoverConfig private constructor(
onCheck.set(true)
}
additionalBinaryReports.addAll(rootTestKitExecFilesProvider())
+ additionalBinaryReports.addAll(rootCompilerExecFilesProvider())
}
filters {
excludes {
@@ -239,7 +253,43 @@ class KoverConfig private constructor(
rootProject.provider {
rootProject.subprojects.asSequence()
.filter { it.pluginManager.hasPlugin(Kover.id) }
- .flatMap { testKitExecFiles(it).asSequence() }
+ .flatMap { execFiles(it, TESTKIT_COVERAGE_DIR).asSequence() }
+ .toList()
+ }
+
+ /**
+ * Lazy `Provider` of the JaCoCo execution-data files produced by the forked
+ * Spine Compiler JVMs across every subproject.
+ *
+ * These files credit the out-of-process execution of compiler plugins —
+ * renderers and generators that run inside the compiler fork — to the root
+ * coverage rollup. Unlike the TestKit files, they are collected from **all**
+ * subprojects regardless of whether the producing module applies Kover: the
+ * exec may be produced by a module that does not itself apply Kover
+ * (typically a test-only module), while the classes it credits belong to the
+ * aggregated production modules. Resolved at task-graph time, after the
+ * launch tasks have written them.
+ *
+ * The files are the `.exec` outputs that each subproject's **currently
+ * configured** `launch*SpineCompiler` tasks still declare — read from the task
+ * outputs, not by scanning the coverage directory. A stale exec left in an
+ * un-`clean`ed workspace is therefore never credited, whether its launch task
+ * was removed or the module simply stopped enabling the helper (in which case
+ * the task no longer declares the exec as an output). Filtering by the `exec`
+ * extension drops any non-coverage outputs the compiler task may also declare.
+ *
+ * @see io.spine.gradle.testing.enableSpineCompilerCoverage
+ */
+ private fun rootCompilerExecFilesProvider(): Provider> =
+ rootProject.provider {
+ rootProject.subprojects.asSequence()
+ .flatMap { sub ->
+ sub.tasks.withType(JavaExec::class.java)
+ .matching { it.isSpineCompilerLaunchTask() }
+ .asSequence()
+ .flatMap { it.outputs.files.asSequence() }
+ }
+ .filter { it.isFile && it.extension == "exec" }
.toList()
}
@@ -248,7 +298,7 @@ class KoverConfig private constructor(
* TestKit workers of [sub]. See [rootTestKitExecFilesProvider] for timing notes.
*/
private fun testKitExecFilesProvider(sub: Project): Provider> =
- sub.provider { testKitExecFiles(sub) }
+ sub.provider { execFiles(sub, TESTKIT_COVERAGE_DIR) }
/**
* Lazy `Provider` of the generated-class FQN exclusion patterns
@@ -284,15 +334,20 @@ class KoverConfig private constructor(
}
/**
- * Returns the JaCoCo execution-data (`.exec`) files written by the Gradle TestKit
- * workers of the [project], or an empty list if the module produced none.
+ * Returns the JaCoCo execution-data (`.exec`) files found in the [dirName]
+ * directory under the [project]'s `build` directory, or an empty list if the
+ * module produced none.
*
- * The files reside under `build/`[TESTKIT_COVERAGE_DIR] and are created by the
- * `plugin-testlib` test harness when a module opts in via
- * [io.spine.gradle.testing.enableTestKitCoverage].
+ * Used for the Gradle TestKit workers, which write into [TESTKIT_COVERAGE_DIR]
+ * when a module opts in via [io.spine.gradle.testing.enableTestKitCoverage]. A
+ * directory scan is safe there because the exec directory is wiped once per build
+ * (see `enableTestKitCoverage`); the Spine Compiler collector instead gathers its
+ * files from the current launch tasks (see
+ * [io.spine.gradle.testing.enableSpineCompilerCoverage]), because its cacheable
+ * tasks cannot wipe the directory.
*/
-private fun testKitExecFiles(project: Project): List {
- val dir = project.layout.buildDirectory.dir(TESTKIT_COVERAGE_DIR).get().asFile
+private fun execFiles(project: Project, dirName: String): List {
+ val dir = project.layout.buildDirectory.dir(dirName).get().asFile
if (!dir.isDirectory) {
return emptyList()
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/SiblingCoverage.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/SiblingCoverage.kt
index 1c9d1f54da..69a42c5a49 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/SiblingCoverage.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/SiblingCoverage.kt
@@ -101,8 +101,10 @@ private fun Project.execFilesOf(testTasks: TaskCollection): Provider]SpineCompiler`
+ * [JavaExec][org.gradle.api.tasks.JavaExec] tasks. Kover (and JaCoCo) instrument
+ * only the `test` JVM, so this out-of-process execution is otherwise not credited
+ * to coverage, even though the module's `.proto` fixtures exercise it on every build.
+ *
+ * For every such launch task, this method:
+ *
+ * 1. Resolves the standalone JaCoCo agent JAR ([Jacoco.agent]) through a dedicated
+ * [AGENT_CONFIGURATION] configuration.
+ * 2. Attaches
+ * `-javaagent:=destfile=build/`[COMPILER_COVERAGE_DIR]`/.exec,append=false`
+ * to the forked JVM. Each launch variant (`main`, `test`, `testFixtures`)
+ * writes its own per-task file, and `append=false` makes every run overwrite
+ * it, so a re-run never accumulates a previous run's probes.
+ * 3. Declares that `.exec` file as a **task output**, which keeps the launch tasks
+ * cacheable. A `JavaExec` task blocks until the forked JVM exits, and the agent
+ * flushes the exec on that exit — so the file is already on disk when the task
+ * action returns and *can* be a declared output. Declaring it lets Gradle's
+ * build cache store and restore it, so the coverage survives both an
+ * `UP-TO-DATE` skip (the file stays on disk from the previous run) and a
+ * `FROM-CACHE` hit (the file is restored from the cache). This is the key
+ * difference from [enableTestKitCoverage], whose TestKit workers flush their
+ * exec only *after* the `Test` task completes, so the file cannot be declared
+ * as a task output — which is why that helper must instead disable caching.
+ *
+ * The agent is attached from a `doFirst` action rather than a `jvmArgumentProviders`
+ * entry so that its *absolute path* — machine-specific, under the Gradle user home —
+ * stays out of the task's input fingerprint, where it would break build-cache reuse
+ * across machines. The agent *coordinate* ([Jacoco.agent]) is instead declared as an
+ * `inputs.property`, so bumping the JaCoCo version invalidates the launch tasks and
+ * regenerates the exec — a stale exec from an incompatible agent can never survive an
+ * `UP-TO-DATE` skip or a `FROM-CACHE` hit. The exec content otherwise depends on the
+ * compiler's own inputs, which already key up-to-dateness.
+ *
+ * The produced `.exec` files are merged into the **root** Kover report by
+ * [io.spine.gradle.report.coverage.KoverConfig]. Only classes the root aggregation
+ * owns — the project's own renderers and generators — are credited from them; the
+ * compiler loads those classes as their original, un-relocated artifacts, so
+ * JaCoCo's class IDs match. The agent emits binary execution data because Kover
+ * merges binary data at the probe level — see `KoverConfig` for why binary, not XML.
+ *
+ * The method is idempotent — a repeated call on the same project returns early
+ * instead of attaching the agent twice — and may be called on every subproject;
+ * it is a no-op for modules that declare no `launch*SpineCompiler` task.
+ */
+fun Project.enableSpineCompilerCoverage() {
+ if (configurations.findByName(AGENT_CONFIGURATION) != null) {
+ return
+ }
+ val agent = configurations.maybeCreate(AGENT_CONFIGURATION).apply {
+ isCanBeConsumed = false
+ isCanBeResolved = true
+ }
+ dependencies.add(agent.name, Jacoco.agent)
+
+ val agentPath = agent.elements.map { it.single().asFile.absolutePath }
+ val execDir = layout.buildDirectory.dir(COMPILER_COVERAGE_DIR)
+
+ val launchTasks = tasks.withType().matching { it.isSpineCompilerLaunchTask() }
+
+ launchTasks.configureEach {
+ val taskName = name
+ val execFile = execDir.map { it.file("$taskName.exec") }
+ // Track the agent *coordinate*, not the resolved absolute path, so a JaCoCo
+ // version bump invalidates the task and regenerates the exec while the cache
+ // key stays machine-independent — see the KDoc.
+ inputs.property(JACOCO_AGENT_INPUT, Jacoco.agent)
+ // Captured as a task output so the build cache stores and restores it —
+ // see the KDoc for why a synchronous `JavaExec` can declare its agent exec
+ // while a TestKit worker cannot.
+ outputs.file(execFile)
+ doFirst {
+ val file = execFile.get().asFile
+ file.parentFile.mkdirs()
+ jvmArgs(
+ "-javaagent:${agentPath.get()}=destfile=${file.absolutePath},append=false"
+ )
+ }
+ }
+
+ // The root Kover report/verification tasks read these exec files as
+ // `additionalBinaryReports`, but do not otherwise depend on the (non-Kover)
+ // test modules that produce them. Make them depend on the launch tasks —
+ // a hard `dependsOn`, not mere ordering, so that running a report task by
+ // itself still triggers the launch tasks that write the exec files.
+ rootProject.tasks
+ .matching { it.consumesCoverageBinaryReports() }
+ .configureEach { dependsOn(launchTasks) }
+}
+
+/**
+ * Tells whether this is one of the `launch[]SpineCompiler` tasks that
+ * fork the Spine Compiler — matched by name to avoid a compile-time dependency on
+ * the compiler Gradle plugin's task types.
+ *
+ * `internal` so [io.spine.gradle.report.coverage.KoverConfig] can collect the exec
+ * files of the **current** launch tasks (rather than scanning the directory) and
+ * thereby ignore stale execs from removed tasks.
+ */
+internal fun Task.isSpineCompilerLaunchTask(): Boolean =
+ name.startsWith(LAUNCH_TASK_PREFIX) && name.endsWith(LAUNCH_TASK_SUFFIX)
+
+/**
+ * The name of the directory under a module's `build` directory where the coverage
+ * of forked Spine Compiler JVMs is collected.
+ *
+ * The directory holds JaCoCo execution-data (`.exec`) files — one per launch task —
+ * written by the JaCoCo agent attached to the compiler fork. `KoverConfig` picks
+ * these files up and feeds them into the root Kover report as additional binary
+ * reports.
+ *
+ * @see io.spine.gradle.report.coverage.KoverConfig
+ */
+internal const val COMPILER_COVERAGE_DIR: String = "jacoco-compiler"
+
+/**
+ * The name of the dedicated, resolvable configuration that holds the standalone
+ * JaCoCo agent JAR ([Jacoco.agent]) attached to the forked Spine Compiler JVMs.
+ *
+ * The configuration is hidden and non-consumable; it exists only to resolve the
+ * agent JAR.
+ */
+private const val AGENT_CONFIGURATION: String = "spineCompilerJacocoAgent"
+
+/**
+ * The name of the task input property that records the JaCoCo agent coordinate
+ * ([Jacoco.agent]), so a version bump invalidates the `launch*SpineCompiler` tasks
+ * and their cached `.exec` outputs.
+ */
+private const val JACOCO_AGENT_INPUT: String = "jacocoAgentCoordinate"
+
+private const val LAUNCH_TASK_PREFIX: String = "launch"
+private const val LAUNCH_TASK_SUFFIX: String = "SpineCompiler"
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/testing/TestKitCoverage.kt b/buildSrc/src/main/kotlin/io/spine/gradle/testing/TestKitCoverage.kt
index 9682596d83..6c21a6b0ed 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/testing/TestKitCoverage.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/testing/TestKitCoverage.kt
@@ -43,8 +43,8 @@ import org.gradle.kotlin.dsl.withType
*
* This method:
*
- * 1. Resolves the standalone JaCoCo agent JAR pinned to [Jacoco.version]
- * through a dedicated [AGENT_CONFIGURATION] configuration.
+ * 1. Resolves the standalone JaCoCo agent JAR ([Jacoco.agent]) through a
+ * dedicated [AGENT_CONFIGURATION] configuration.
* 2. Passes the agent JAR path and a per-module exec directory
* (`build/`[TESTKIT_COVERAGE_DIR]) to the test JVM as system properties.
* The `plugin-testlib` harness reads these and writes a `gradle.properties`
@@ -84,7 +84,7 @@ fun Project.enableTestKitCoverage() {
isCanBeConsumed = false
isCanBeResolved = true
}
- dependencies.add(agent.name, "org.jacoco:org.jacoco.agent:${Jacoco.version}:runtime")
+ dependencies.add(agent.name, Jacoco.agent)
val agentPath = agent.elements.map { it.single().asFile.absolutePath }
val execDir = layout.buildDirectory.dir(TESTKIT_COVERAGE_DIR)
@@ -150,8 +150,7 @@ private const val EXEC_DIR_PROPERTY: String =
/**
* The name of the dedicated, resolvable configuration that holds the standalone
- * JaCoCo agent JAR (`org.jacoco:org.jacoco.agent::runtime`) attached to
- * TestKit worker JVMs.
+ * JaCoCo agent JAR ([Jacoco.agent]) attached to TestKit worker JVMs.
*
* The configuration is hidden and non-consumable; it exists only to resolve the
* agent JAR and to register it as an input of the `test` tasks.
diff --git a/config b/config
index c2aae6e746..dc94820ec3 160000
--- a/config
+++ b/config
@@ -1 +1 @@
-Subproject commit c2aae6e74662ddbe60e3e8695cc6a1b8b104f0a3
+Subproject commit dc94820ec307537314e7978731988dea34b18461
diff --git a/docs/dependencies/dependencies.md b/docs/dependencies/dependencies.md
index 5fca22028a..4d2596ff4c 100644
--- a/docs/dependencies/dependencies.md
+++ b/docs/dependencies/dependencies.md
@@ -1,6 +1,6 @@
-# Dependencies of `io.spine:spine-annotations:2.0.0-SNAPSHOT.423`
+# Dependencies of `io.spine:spine-annotations:2.0.0-SNAPSHOT.424`
## Runtime
1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.1.0.
@@ -94,11 +94,11 @@
* **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_annotation](https://errorprone.info/error_prone_annotation)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -106,16 +106,15 @@
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_check_api](https://errorprone.info/error_prone_check_api)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_core](https://errorprone.info/error_prone_core)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.36.0.
- * **Project URL:** [https://errorprone.info/error_prone_type_annotations](https://errorprone.info/error_prone_type_annotations)
+1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.42.0.
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
@@ -126,7 +125,7 @@
* **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
* **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.19.1.
+1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.27.0.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
@@ -772,14 +771,14 @@
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
+This report was generated on **Tue Jul 14 18:16:51 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine:spine-base:2.0.0-SNAPSHOT.423`
+# Dependencies of `io.spine:spine-base:2.0.0-SNAPSHOT.424`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -790,7 +789,7 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -925,11 +924,11 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **Project URL:** [https://goo.gle/ksp](https://goo.gle/ksp)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_annotation](https://errorprone.info/error_prone_annotation)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -937,16 +936,15 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_check_api](https://errorprone.info/error_prone_check_api)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_core](https://errorprone.info/error_prone_core)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.36.0.
- * **Project URL:** [https://errorprone.info/error_prone_type_annotations](https://errorprone.info/error_prone_type_annotations)
+1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.42.0.
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
@@ -957,7 +955,7 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
* **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.19.1.
+1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.27.0.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
@@ -1648,14 +1646,14 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
+This report was generated on **Tue Jul 14 18:16:51 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine:spine-environment:2.0.0-SNAPSHOT.423`
+# Dependencies of `io.spine:spine-environment:2.0.0-SNAPSHOT.424`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -1666,7 +1664,7 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -1808,11 +1806,11 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_annotation](https://errorprone.info/error_prone_annotation)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -1820,16 +1818,15 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_check_api](https://errorprone.info/error_prone_check_api)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_core](https://errorprone.info/error_prone_core)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.36.0.
- * **Project URL:** [https://errorprone.info/error_prone_type_annotations](https://errorprone.info/error_prone_type_annotations)
+1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.42.0.
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
@@ -1840,7 +1837,7 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
* **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.19.1.
+1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.27.0.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
@@ -2486,17 +2483,17 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
+This report was generated on **Tue Jul 14 18:16:51 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine:spine-format:2.0.0-SNAPSHOT.423`
+# Dependencies of `io.spine:spine-format:2.0.0-SNAPSHOT.424`
## Runtime
-1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2505,37 +2502,37 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-yaml. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-yaml. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson-dataformats-text](https://github.com/FasterXML/jackson-dataformats-text)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-guava. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-guava. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson-datatypes-collections](https://github.com/FasterXML/jackson-datatypes-collections)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jdk8. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jdk8. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jsr310. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jsr310. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2548,7 +2545,7 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2613,7 +2610,7 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2631,7 +2628,7 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2641,7 +2638,7 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2651,22 +2648,22 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-yaml. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-yaml. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson-dataformats-text](https://github.com/FasterXML/jackson-dataformats-text)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-guava. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-guava. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson-datatypes-collections](https://github.com/FasterXML/jackson-datatypes-collections)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jdk8. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jdk8. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jsr310. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jsr310. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2676,7 +2673,7 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.22.0.
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.22.1.
* **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2722,11 +2719,11 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_annotation](https://errorprone.info/error_prone_annotation)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2734,16 +2731,15 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_check_api](https://errorprone.info/error_prone_check_api)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.36.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.42.0.
* **Project URL:** [https://errorprone.info/error_prone_core](https://errorprone.info/error_prone_core)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.36.0.
- * **Project URL:** [https://errorprone.info/error_prone_type_annotations](https://errorprone.info/error_prone_type_annotations)
+1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.42.0.
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
@@ -2754,7 +2750,7 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
* **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
* **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.19.1.
+1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.27.0.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
@@ -3404,6 +3400,6 @@ This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Thu Jul 02 16:32:02 WEST 2026** using
+This report was generated on **Tue Jul 14 18:16:51 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
\ No newline at end of file
diff --git a/docs/dependencies/pom.xml b/docs/dependencies/pom.xml
index d20c6979b2..bcabb3e90b 100644
--- a/docs/dependencies/pom.xml
+++ b/docs/dependencies/pom.xml
@@ -10,7 +10,7 @@ all modules and does not describe the project structure per-subproject.
-->
io.spinebase-libraries
-2.0.0-SNAPSHOT.423
+2.0.0-SNAPSHOT.4242015
@@ -26,37 +26,37 @@ all modules and does not describe the project structure per-subproject.
com.fasterxml.jacksonjackson-bom
- 2.22.0
+ 2.22.1compilecom.fasterxml.jackson.corejackson-databind
- 2.22.0
+ 2.22.1compilecom.fasterxml.jackson.dataformatjackson-dataformat-yaml
- 2.22.0
+ 2.22.1compilecom.fasterxml.jackson.datatypejackson-datatype-guava
- 2.22.0
+ 2.22.1compilecom.fasterxml.jackson.datatypejackson-datatype-jdk8
- 2.22.0
+ 2.22.1compilecom.fasterxml.jackson.datatypejackson-datatype-jsr310
- 2.22.0
+ 2.22.1compile
@@ -86,7 +86,7 @@ all modules and does not describe the project structure per-subproject.
io.spinespine-logging
- 2.0.0-SNAPSHOT.419
+ 2.0.0-SNAPSHOT.422compile
@@ -134,13 +134,13 @@ all modules and does not describe the project structure per-subproject.
com.google.errorproneerror_prone_annotations
- 2.47.0
+ 2.42.0providedcom.google.errorproneerror_prone_type_annotations
- 2.36.0
+ 2.42.0provided
@@ -152,7 +152,7 @@ all modules and does not describe the project structure per-subproject.
com.fasterxml.jackson.modulejackson-module-kotlin
- 2.22.0
+ 2.22.1runtime
@@ -170,7 +170,7 @@ all modules and does not describe the project structure per-subproject.
io.spinespine-logging-smoke-test
- 2.0.0-SNAPSHOT.419
+ 2.0.0-SNAPSHOT.422test
@@ -182,7 +182,7 @@ all modules and does not describe the project structure per-subproject.
io.spine.toolslogging-testlib
- 2.0.0-SNAPSHOT.419
+ 2.0.0-SNAPSHOT.422test
@@ -223,7 +223,7 @@ all modules and does not describe the project structure per-subproject.
com.google.errorproneerror_prone_core
- 2.36.0
+ 2.42.0com.google.protobuf
diff --git a/version.gradle.kts b/version.gradle.kts
index c3bd036c91..e463ae2c9b 100644
--- a/version.gradle.kts
+++ b/version.gradle.kts
@@ -24,4 +24,4 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-extra.set("versionToPublish", "2.0.0-SNAPSHOT.423")
+extra.set("versionToPublish", "2.0.0-SNAPSHOT.424")