diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,16 @@
 
 ## Unreleased
 
+## 0.1.1.0 - 2026-06-28
+
+### Added
+
+- `EvalConfig` now derives `Generic`.
+
+### Changed
+
+- Refreshed the internal `shikumi` bound for the `0.2` series.
+
 ## 0.1.0.1 - 2026-06-21
 
 ### Changed
diff --git a/shikumi-eval.cabal b/shikumi-eval.cabal
--- a/shikumi-eval.cabal
+++ b/shikumi-eval.cabal
@@ -1,6 +1,6 @@
 cabal-version:   3.4
 name:            shikumi-eval
-version:         0.1.0.1
+version:         0.1.1.0
 synopsis:        Typed evaluation framework for shikumi LM programs (EP-8)
 category:        AI
 description:
@@ -53,7 +53,7 @@
     , effectful
     , generic-lens
     , lens          ^>=5.3
-    , shikumi       ^>=0.1.0.1
+    , shikumi       ^>=0.2.0.0
     , tasty
     , tasty-golden
     , text          ^>=2.1
@@ -83,8 +83,8 @@
     , effectful
     , generic-lens
     , lens
-    , shikumi       ^>=0.1.0.1
-    , shikumi-eval  ^>=0.1.0.1
+    , shikumi       ^>=0.2.0.0
+    , shikumi-eval  ^>=0.1.1.0
     , tasty
     , tasty-golden
     , tasty-hunit
diff --git a/src/Shikumi/Eval/Metric.hs b/src/Shikumi/Eval/Metric.hs
--- a/src/Shikumi/Eval/Metric.hs
+++ b/src/Shikumi/Eval/Metric.hs
@@ -208,9 +208,9 @@
 -- | The judge's input: the grading rubric plus the reference and candidate texts
 -- (plain fields so the rendered prompt stays clean).
 data JudgeInput = JudgeInput
-  { rubric :: Text,
-    reference :: Text,
-    candidate :: Text
+  { rubric :: !Text,
+    reference :: !Text,
+    candidate :: !Text
   }
   deriving stock (Generic, Show)
 
diff --git a/src/Shikumi/Eval/Report.hs b/src/Shikumi/Eval/Report.hs
--- a/src/Shikumi/Eval/Report.hs
+++ b/src/Shikumi/Eval/Report.hs
@@ -32,6 +32,7 @@
 import Data.Maybe (isJust, mapMaybe)
 import Data.Text (Text)
 import Data.Text qualified as T
+import GHC.Generics (Generic)
 import Numeric (showFFloat)
 import Numeric.Natural (Natural)
 import Shikumi.Eval.Types (Score, scoreZero, unScore)
@@ -96,7 +97,7 @@
     -- | samples per example for multi-sample metrics (forced to @>= 1@)
     numSamples :: !Int
   }
-  deriving stock (Eq, Show)
+  deriving stock (Eq, Show, Generic)
 
 -- | The default: four-way concurrency, score failures @0@ and keep going, one
 -- sample per example.
diff --git a/test/EvaluateSpec.hs b/test/EvaluateSpec.hs
--- a/test/EvaluateSpec.hs
+++ b/test/EvaluateSpec.hs
@@ -4,6 +4,8 @@
 -- completes; and the same error aborting the run under 'FailAbort'.
 module EvaluateSpec (tests) where
 
+import Control.Lens ((&), (.~))
+import Data.Generics.Labels ()
 import Effectful (runEff)
 import Effectful.Concurrent (runConcurrent)
 import Effectful.Error.Static (runErrorNoCallStack)
@@ -72,7 +74,7 @@
         -- example fails, the rest succeed.
         let ds = dataset [example (Question "q0") (Answer "a"), example (Question "q1") (Answer "ok")]
             replies = [MockFail providerErr, MockOk (answerResponse "ok")]
-            cfg = defaultEvalConfig {concurrency = 1}
+            cfg = defaultEvalConfig & #concurrency .~ 1
         report <-
           runEff . runPrim . runTime . runConcurrent . runErrorNoCallStack @ShikumiError $
             runScriptedLLM replies $
@@ -93,7 +95,7 @@
       testCase "FailAbort surfaces the error" $ do
         let ds = dataset [example (Question "q0") (Answer "a"), example (Question "q1") (Answer "ok")]
             replies = [MockFail providerErr, MockOk (answerResponse "ok")]
-            cfg = defaultEvalConfig {concurrency = 1, failurePolicy = FailAbort}
+            cfg = defaultEvalConfig & #concurrency .~ 1 & #failurePolicy .~ FailAbort
         report <-
           runEff . runPrim . runTime . runConcurrent . runErrorNoCallStack @ShikumiError $
             runScriptedLLM replies $
