diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,23 @@
 
 ## Unreleased
 
+## 0.2.1.3 — 2026-08-29
+
+### Changed
+
+- Every library dependency now carries a PVP upper bound: `aeson`, `containers`,
+  `effectful`, `vector`. `cabal check` reported these under
+  `missing-upper-bounds`. Without one, a future breaking release of a dependency
+  enters a consumer's build plan unchecked — which is the failure the bound
+  exists to prevent.
+
+  Each bound admits the version this package is built and tested against and
+  stops below the next major.
+
+  `aeson` stops at `<2.3` rather than `<2.4`: baikai-openai 0.5 constrains it to
+  `^>=2.2`, so aeson 2.3 is not reachable for this cohort and a wider bound
+  would assert compatibility that cannot be exercised here.
+
 ## 0.2.1.2 — 2026-08-07
 
 ### Changed
diff --git a/shikumi-optimize.cabal b/shikumi-optimize.cabal
--- a/shikumi-optimize.cabal
+++ b/shikumi-optimize.cabal
@@ -1,6 +1,6 @@
 cabal-version:   3.4
 name:            shikumi-optimize
-version:         0.2.1.2
+version:         0.2.1.3
 synopsis:        The optimizer framework for shikumi LM programs (EP-10)
 category:        AI
 description:
@@ -60,10 +60,10 @@
     Shikumi.Optimize.Types
 
   build-depends:
-    , aeson
+    , aeson            >=2.2      && <2.3
     , base             >=4.20     && <5
-    , containers
-    , effectful
+    , containers       >=0.6      && <0.9
+    , effectful        >=2.5      && <2.7
     , generic-lens     >=2.2      && <2.4
     , lens             ^>=5.3
     , shikumi          ^>=0.3.0.0
@@ -71,7 +71,7 @@
     , shikumi-eval     ^>=0.2.0.0
     , shikumi-trace    ^>=0.2.0.0
     , text             ^>=2.1
-    , vector
+    , vector           >=0.13     && <0.14
 
 test-suite shikumi-optimize-test
   import:         common-options
@@ -98,7 +98,7 @@
 
   build-depends:
     , aeson
-    , baikai            >=0.5      && <0.6
+    , baikai            >=0.6      && <0.7
     , base
     , containers
     , effectful
diff --git a/test/StubLM.hs b/test/StubLM.hs
--- a/test/StubLM.hs
+++ b/test/StubLM.hs
@@ -68,8 +68,8 @@
     Context,
     Response,
     TextContent (..),
-    _Response,
-    _TextContent,
+    emptyResponse,
+    emptyTextContent,
   )
 import Baikai.Content (UserContent (..))
 import Baikai.Message (AssistantPayload (..), Message (..), UserPayload (..))
@@ -425,4 +425,4 @@
 -- | An assistant 'Response' carrying @body@ as its single text block.
 mkResponse :: Text -> Response
 mkResponse body =
-  _Response & #message . #content .~ V.singleton (AssistantText (_TextContent & #text .~ body))
+  emptyResponse & #message . #content .~ V.singleton (AssistantText (emptyTextContent & #text .~ body))
