diff --git a/CHANGELOG.md b/CHANGELOG.md index aeed56c..95b3879 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,39 @@ All notable changes to this project are documented in this file. +## 1.1.0 - 2026-08-30 + +Adds opt-in virtual-cost refunds for queued cancellation while preserving the +original charged-cost behavior as the default. + +### Added + +- `CancellationAccounting.REFUND_CANCELLED_COST` for callers that need a + cancelled queued job's virtual cost returned to later queued work of the + same flow; +- reference, differential, numeric-boundary, lifecycle, deterministic + concurrency, and jcstress coverage for refundable cancellation; +- policy-aware JMH workloads for cancellation latency, cancel-and-replace + cycles, terminal idle reset, and first-busy-period cycles. + +### Changed + +- refund-mode admission now reserves exact-rational capacity for every future + queued cancellation and rejects an unsafe enqueue atomically with + `NUMERIC_LIMIT`; +- refund-mode queued cancellation recomputes only the later queued suffix of + the same flow and never revises an earlier dispatch decision; +- benchmark fixture verification covers both cancellation policies. + +### Compatibility + +- `CHARGE_RESERVED_COST` remains the default and retains its previous + admission and cancellation behavior; +- existing public signatures are unchanged; the public enum gains one + constant, so exhaustive client switches without a default may need updating; +- completed-work fairness guarantees remain intentionally unspecified for + traces containing cancellation under either policy. + ## 1.0.0 - 2026-08-23 Initial public release of the generic, thread-safe SFQ(D) scheduler. diff --git a/README.md b/README.md index f20c743..97cd3cb 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ weights. ## Status -Version 1.0.0 is the first stable release. The library is published to Maven -Central as `io.github.pzhin:sfqd-core:1.0.0` and uses the Java package +Version 1.1.0 is the current stable release. The library is published to Maven +Central as `io.github.pzhin:sfqd-core:1.1.0` and uses the Java package `io.github.pzhin.sfqd`. The benchmark harness is an executable measurement protocol, not a benchmark @@ -57,7 +57,7 @@ Then add it to a local consumer: io.github.pzhin sfqd-core - 1.0.0 + 1.1.0 ``` diff --git a/docs/TOOLING.md b/docs/TOOLING.md index a6bdcd0..6a68f8d 100644 --- a/docs/TOOLING.md +++ b/docs/TOOLING.md @@ -96,7 +96,7 @@ are not test failures; forbidden test outcomes are. java -jar sfqd-benchmarks/target/sfqd-benchmarks.jar -l ``` -Verification compiles the generated JMH metadata, runs a bounded 60-case +Verification compiles the generated JMH metadata, runs a bounded 90-case idle-reset fixture smoke, and exercises three representative performance-scale fixtures. The largest smoke fixture is `B=10_000`, `Q=100_000`, and `depth=1_024`; completing one invariant-checked cycle proves wiring and state @@ -153,7 +153,7 @@ Before running the profile, the release engineer must have: - an unlocked GnuPG agent, or `MAVEN_GPG_PASSPHRASE` supplied through a secure environment mechanism. -Publish the immutable 1.0.0 coordinates from the commit tagged `v1.0.0`: +Publish the immutable 1.1.0 coordinates from the commit tagged `v1.1.0`: ```shell ./mvnw --batch-mode --no-transfer-progress -Prelease clean deploy diff --git a/pom.xml b/pom.xml index ace4f7e..22b2cbe 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 io.github.pzhin sfqd-java-parent - 1.0.0 + 1.1.0 pom SFQ(D) Java Parent Build parent for the SFQ(D) Java library. @@ -35,7 +35,7 @@ scm:git:https://github.com/pzhin/sfqd-java.git scm:git:ssh://git@github.com/pzhin/sfqd-java.git https://github.com/pzhin/sfqd-java - v1.0.0 + v1.1.0 @@ -289,7 +289,7 @@ true published - sfqd-java 1.0.0 + sfqd-java 1.1.0 diff --git a/sfqd-benchmarks/pom.xml b/sfqd-benchmarks/pom.xml index 5791655..36a783b 100644 --- a/sfqd-benchmarks/pom.xml +++ b/sfqd-benchmarks/pom.xml @@ -6,7 +6,7 @@ io.github.pzhin sfqd-java-parent - 1.0.0 + 1.1.0 sfqd-benchmarks SFQ(D) JMH Harness diff --git a/sfqd-core/pom.xml b/sfqd-core/pom.xml index 858ee45..a112a27 100644 --- a/sfqd-core/pom.xml +++ b/sfqd-core/pom.xml @@ -6,7 +6,7 @@ io.github.pzhin sfqd-java-parent - 1.0.0 + 1.1.0 sfqd-core SFQ(D) Core diff --git a/sfqd-coverage/pom.xml b/sfqd-coverage/pom.xml index 65a2c42..a2d09ff 100644 --- a/sfqd-coverage/pom.xml +++ b/sfqd-coverage/pom.xml @@ -6,7 +6,7 @@ io.github.pzhin sfqd-java-parent - 1.0.0 + 1.1.0 sfqd-coverage pom diff --git a/sfqd-examples/pom.xml b/sfqd-examples/pom.xml index 7f0f987..8d03342 100644 --- a/sfqd-examples/pom.xml +++ b/sfqd-examples/pom.xml @@ -6,7 +6,7 @@ io.github.pzhin sfqd-java-parent - 1.0.0 + 1.1.0 sfqd-examples SFQ(D) Examples diff --git a/sfqd-jcstress/pom.xml b/sfqd-jcstress/pom.xml index 39bed25..48c2b50 100644 --- a/sfqd-jcstress/pom.xml +++ b/sfqd-jcstress/pom.xml @@ -6,7 +6,7 @@ io.github.pzhin sfqd-java-parent - 1.0.0 + 1.1.0 sfqd-jcstress SFQ(D) jcstress Harness diff --git a/tools/verify-publication-topology.sh b/tools/verify-publication-topology.sh index cdfa54b..e761a5b 100755 --- a/tools/verify-publication-topology.sh +++ b/tools/verify-publication-topology.sh @@ -100,8 +100,8 @@ PY ) readonly GROUP_DIRECTORY="${DEPLOY_REPOSITORY}/io/github/pzhin" -readonly PARENT_DIRECTORY="${GROUP_DIRECTORY}/sfqd-java-parent/1.0.0" -readonly CORE_DIRECTORY="${GROUP_DIRECTORY}/sfqd-core/1.0.0" +readonly PARENT_DIRECTORY="${GROUP_DIRECTORY}/sfqd-java-parent/1.1.0" +readonly CORE_DIRECTORY="${GROUP_DIRECTORY}/sfqd-core/1.1.0" shopt -s nullglob parent_poms=("${PARENT_DIRECTORY}"/*.pom) @@ -143,7 +143,7 @@ import sys import xml.etree.ElementTree as ET namespace = {"m": "http://maven.apache.org/POM/4.0.0"} -expected_parent = ("io.github.pzhin", "sfqd-java-parent", "1.0.0") +expected_parent = ("io.github.pzhin", "sfqd-java-parent", "1.1.0") parent = ET.parse(sys.argv[1]).getroot() parent_coordinates = tuple( @@ -209,7 +209,7 @@ expected_scm = ( "scm:git:https://github.com/pzhin/sfqd-java.git", "scm:git:ssh://git@github.com/pzhin/sfqd-java.git", "https://github.com/pzhin/sfqd-java", - "v1.0.0", + "v1.1.0", ) if scm_metadata != expected_scm: raise SystemExit( @@ -235,7 +235,7 @@ effective_core_coordinates = tuple( effective_core.findtext(f"m:{name}", namespaces=namespace) for name in ("groupId", "artifactId", "version") ) -expected_core = ("io.github.pzhin", "sfqd-core", "1.0.0") +expected_core = ("io.github.pzhin", "sfqd-core", "1.1.0") if effective_core_coordinates != expected_core: raise SystemExit( "ERROR: effective core coordinates are " @@ -313,7 +313,7 @@ cat >"${CONSUMER_ROOT}/pom.xml" < io.github.pzhin sfqd-core - 1.0.0 + 1.1.0 @@ -343,8 +343,8 @@ LC_ALL=C LANG=C TZ=UTC "${REPOSITORY_ROOT}/mvnw" \ -Dmaven.repo.local="${CONSUMER_LOCAL_REPOSITORY}" \ -f "${CONSUMER_ROOT}/pom.xml" clean compile -readonly RESOLVED_PARENT="${CONSUMER_LOCAL_REPOSITORY}/io/github/pzhin/sfqd-java-parent/1.0.0" -readonly RESOLVED_CORE="${CONSUMER_LOCAL_REPOSITORY}/io/github/pzhin/sfqd-core/1.0.0" +readonly RESOLVED_PARENT="${CONSUMER_LOCAL_REPOSITORY}/io/github/pzhin/sfqd-java-parent/1.1.0" +readonly RESOLVED_CORE="${CONSUMER_LOCAL_REPOSITORY}/io/github/pzhin/sfqd-core/1.1.0" if [[ ! -f "${RESOLVED_PARENT}/_remote.repositories" ]]; then fail "fresh consumer did not resolve the published parent" fi