diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,22 @@
 
 ## Unreleased
 
+## 0.1.2.3 — 2026-08-29
+
+### Changed
+
+- Every library dependency now carries a PVP upper bound: `aeson`, `effectful`,
+  `hasql`. `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.1.2.2 — 2026-08-07
 
 ### Changed
diff --git a/shikumi-cache-postgres.cabal b/shikumi-cache-postgres.cabal
--- a/shikumi-cache-postgres.cabal
+++ b/shikumi-cache-postgres.cabal
@@ -1,6 +1,6 @@
 cabal-version:   3.4
 name:            shikumi-cache-postgres
-version:         0.1.2.2
+version:         0.1.2.3
 synopsis:        Postgres-backed shikumi cache (EP-6)
 category:        AI
 description:
@@ -38,10 +38,10 @@
   hs-source-dirs:  src
   exposed-modules: Shikumi.Cache.Backend.Postgres
   build-depends:
-    , aeson
+    , aeson          >=2.2      && <2.3
     , base           >=4.20     && <5
-    , effectful
-    , hasql
+    , effectful      >=2.5      && <2.7
+    , hasql          >=1.9      && <1.11
     , shikumi-cache  ^>=0.1.2.0
     , text           ^>=2.1
 
@@ -52,7 +52,7 @@
   main-is:        Main.hs
   ghc-options:    -threaded -with-rtsopts=-N
   build-depends:
-    , baikai                  >=0.5      && <0.6
+    , baikai                  >=0.6      && <0.7
     , base
     , effectful
     , ephemeral-pg
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -11,7 +11,7 @@
 -- a failure.
 module Main (main) where
 
-import Baikai (Context, Model, Options, Response, user, _Context, _Model, _Options, _Response)
+import Baikai (Context, Model, Options, Response, emptyContext, emptyModel, emptyOptions, emptyResponse, user)
 import Control.Exception (finally)
 import Control.Lens ((&), (.~))
 import Data.Generics.Labels ()
@@ -33,16 +33,16 @@
 import Test.Tasty.HUnit (testCase, (@?=))
 
 fixModel :: Model
-fixModel = _Model & #modelId .~ "claude-sonnet-4-6" & #provider .~ "anthropic"
+fixModel = emptyModel & #modelId .~ "claude-sonnet-4-6" & #provider .~ "anthropic"
 
 fixCtx :: Context
-fixCtx = _Context & #systemPrompt .~ Just "You are helpful." & #messages .~ V.singleton (user "ping")
+fixCtx = emptyContext & #systemPrompt .~ Just "You are helpful." & #messages .~ V.singleton (user "ping")
 
 fixOpts :: Options
-fixOpts = _Options & #temperature .~ Just 0.0 & #maxTokens .~ Just 1024
+fixOpts = emptyOptions & #temperature .~ Just 0.0 & #maxTokens .~ Just 1024
 
 stubResponse :: Response
-stubResponse = _Response
+stubResponse = emptyResponse
 
 someTime :: UTCTime
 someTime = read "2026-06-08 00:00:00 UTC"
