… stryker blocker (#115) (#128)
* build(deps): bump actions/cache from v4 to v6
Supersedes #118. Drop-in verified: action.yml inputs are byte-identical
between v4.3.0 and v6.1.0 (only the node20 -> node24 runtime line
differs); all 18 steps pass exactly {path, key, restore-keys}; @v6
resolves to v6.1.0, which adds graceful handling of read-only cache
tokens (the accurate 'cache write denied' warning on fork PRs instead
of the bogus 'another job may be creating this cache').
* build(deps): bump droste-core from 0.9.0-M3 to 0.10.0
Supersedes #124. Benchmark-only dependency (never published downstream).
0.10.0 is dependency maintenance upstream (cats update,
scala-collection-compat 2.13.0, Scala.js 1.18.2); our droste surface
(Fix, scheme.{cata,ana,hylo}, Algebra/Coalgebra) compiles unchanged and
all nine SchemesBench benchmarks execute on the new version.
* build(deps): bump sbt-stryker4s from 0.20.4 to 1.1.1
Supersedes #126. No removed or renamed features reach this build: the
setting keys used in build.sbt (strykerReporters, strykerExcludedMutations,
strykerThresholdsBreak) are unchanged, the borrowed-tests wiring still
resolves, and 1.x requires sbt >= 1.11.2 (we run 1.13.0). Verified with a
schemes smoke run (48/58 killed, 0 NoCoverage) and a full avroIntegration
run (481 killed / 51 survived / 58 known-macro NoCoverage, no crash).
Decisive for issue #115: 1.1.1 fixes stryker4s' rollback invariant crash
('cases should be non-empty') that killed avro's mutation run on main —
0.20.4's mutant removal could empty a Term.Match by deleting its default
Pat.Wildcard case; 1.1.1 filters it. Also refreshes the invocation-doctrine
comment: the module-scoped <m>/stryker form works again since 0.20.4.
* fix(avro): keep AvroWalk's null-narrowing outside stryker's reach
Addresses #115 blocker 1. The flow-typed 'val here = if index != null
then index else ...' loses its narrowing the moment stryker4s' mutator
rewrites the condition, so two mutants died as compile errors instead of
being exercised (and on 0.20.4 that rollback crashed the whole run).
Express the narrowing as a match on the null sentinel with an explicit
JMap[String, Integer] type: a match has no condition to mutate, so the
narrowing is structural rather than flow-based. (The ascribe + 'index.nn'
spelling from the issue does not compile here — the guard already narrows,
E216 fires, and -Werror rejects the warning.) Applied at both occurrences
(totalNominalIndex and recordSlots); AvroCompileError mutants from
AvroWalk go to zero.
* docs: refresh version pins and the stryker invocation doctrine
CLAUDE.md said Scala 3.8.3 / sbt 1.12.9; the project builds Scala 3.9.0
(build.sbt scala3Version) on sbt 1.13.0 (project/build.properties).
CONTRIBUTING.md's bootstrap list pointed Scala at build.properties and
omitted the JDK 25 requirement for kyo + the docs site.
The 'invoke as project <m>; stryker, NOT <m>/stryker' claim stopped being
true in 0.20.4 (module-scoped task resolution was fixed upstream); state
the history instead of forbidding the working form. The mutationAll alias
also covers zio and kyo now, not just the original eight modules.
quality-assurance.md's scoverage path follows the Scala version.
* build(ci): bump the workflow generator's actions/cache ref to v6
The cache bump landed as a hand-edit of the generated ci.yml (mirroring
Dependabot's #118 diff), which githubWorkflowCheck rightly flags: ci.yml
is generator-owned (CONTRIBUTING.md: never hand-edit it). This pairs the
edit with its source of truth — UseRef.Public("actions", "cache", "v6")
in the setup-java cache patch. githubWorkflowGenerate now emits zero
workflow drift, so the committed ci.yml is exactly generated output, and
githubWorkflowCheck passes.
Bumps io.stryker-mutator:sbt-stryker4s from 0.20.4 to 1.1.1.
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)