Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -57,7 +57,7 @@ Then add it to a local consumer:
<dependency>
<groupId>io.github.pzhin</groupId>
<artifactId>sfqd-core</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>
</dependency>
```

Expand Down
4 changes: 2 additions & 2 deletions docs/TOOLING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>io.github.pzhin</groupId>
<artifactId>sfqd-java-parent</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>
<packaging>pom</packaging>
<name>SFQ(D) Java Parent</name>
<description>Build parent for the SFQ(D) Java library.</description>
Expand Down Expand Up @@ -35,7 +35,7 @@
<connection>scm:git:https://github.com/pzhin/sfqd-java.git</connection>
<developerConnection>scm:git:ssh://git@github.com/pzhin/sfqd-java.git</developerConnection>
<url>https://github.com/pzhin/sfqd-java</url>
<tag>v1.0.0</tag>
<tag>v1.1.0</tag>
</scm>

<modules>
Expand Down Expand Up @@ -289,7 +289,7 @@
</excludeArtifacts>
<autoPublish>true</autoPublish>
<waitUntil>published</waitUntil>
<deploymentName>sfqd-java 1.0.0</deploymentName>
<deploymentName>sfqd-java 1.1.0</deploymentName>
</configuration>
</plugin>
</plugins>
Expand Down
2 changes: 1 addition & 1 deletion sfqd-benchmarks/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>io.github.pzhin</groupId>
<artifactId>sfqd-java-parent</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>
</parent>
<artifactId>sfqd-benchmarks</artifactId>
<name>SFQ(D) JMH Harness</name>
Expand Down
2 changes: 1 addition & 1 deletion sfqd-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>io.github.pzhin</groupId>
<artifactId>sfqd-java-parent</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>
</parent>
<artifactId>sfqd-core</artifactId>
<name>SFQ(D) Core</name>
Expand Down
2 changes: 1 addition & 1 deletion sfqd-coverage/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>io.github.pzhin</groupId>
<artifactId>sfqd-java-parent</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>
</parent>
<artifactId>sfqd-coverage</artifactId>
<packaging>pom</packaging>
Expand Down
2 changes: 1 addition & 1 deletion sfqd-examples/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>io.github.pzhin</groupId>
<artifactId>sfqd-java-parent</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>
</parent>
<artifactId>sfqd-examples</artifactId>
<name>SFQ(D) Examples</name>
Expand Down
2 changes: 1 addition & 1 deletion sfqd-jcstress/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>io.github.pzhin</groupId>
<artifactId>sfqd-java-parent</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>
</parent>
<artifactId>sfqd-jcstress</artifactId>
<name>SFQ(D) jcstress Harness</name>
Expand Down
16 changes: 8 additions & 8 deletions tools/verify-publication-topology.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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(
Expand All @@ -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 "
Expand Down Expand Up @@ -313,7 +313,7 @@ cat >"${CONSUMER_ROOT}/pom.xml" <<EOF
<dependency>
<groupId>io.github.pzhin</groupId>
<artifactId>sfqd-core</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>
</dependency>
</dependencies>
<build>
Expand Down Expand Up @@ -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
Expand Down