diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,58 @@
 
 ## [Unreleased]
 
+## [baikai 0.3.1.0] - 2026-07-15
+
+### Added
+
+- Added `claude-sonnet-5` to the Anthropic model catalog (1M context window,
+  128k max output, `tool_call` + reasoning).
+- Added the `gpt-5.6` family — `gpt-5.6`, `gpt-5.6-luna`, `gpt-5.6-sol`, and
+  `gpt-5.6-terra` — to the OpenAI model catalog (chat-completions with
+  `tool_call` support).
+
+### Changed
+
+- Corrected `claude-sonnet-4-5` context window to 1M tokens and
+  `claude-sonnet-4-6` max output to 128k tokens in the catalog.
+- Added PVP-compliant upper bounds to all previously-unbounded library and
+  executable dependencies.
+
+## [baikai-claude 0.3.0.1] - 2026-07-15
+
+### Changed
+
+- Added PVP-compliant upper bounds to all previously-unbounded library and
+  executable dependencies.
+
+## [baikai-openai 0.3.0.1] - 2026-07-15
+
+### Changed
+
+- Added PVP-compliant upper bounds to all previously-unbounded library and
+  executable dependencies.
+
+## [baikai-trace-otel 0.3.0.1] - 2026-07-15
+
+### Changed
+
+- Added PVP-compliant upper bounds to all previously-unbounded library and
+  executable dependencies.
+
+## [baikai-effectful 0.3.0.1] - 2026-07-15
+
+### Changed
+
+- Added PVP-compliant upper bounds to all previously-unbounded library and
+  executable dependencies.
+
+## [baikai-kit 0.1.0.2] - 2026-07-15
+
+### Changed
+
+- Added PVP-compliant upper bounds to all previously-unbounded library and
+  executable dependencies.
+
 ## [baikai 0.3.0.0] - 2026-07-03
 
 ### Added
diff --git a/baikai.cabal b/baikai.cabal
--- a/baikai.cabal
+++ b/baikai.cabal
@@ -1,6 +1,6 @@
 cabal-version:   3.4
 name:            baikai
-version:         0.3.0.0
+version:         0.3.1.0
 synopsis:        Unified Haskell interface for multiple AI providers
 description:
   baikai provides a unified, provider-agnostic Haskell interface for working
@@ -71,21 +71,21 @@
     Baikai.Usage
 
   build-depends:
-    , aeson
-    , base               >=4.20 && <5
-    , base64-bytestring
-    , bytestring
-    , containers
-    , generic-lens
+    , aeson              ^>=2.2
+    , base               >=4.20  && <5
+    , base64-bytestring  ^>=1.2
+    , bytestring         ^>=0.12
+    , containers         ^>=0.7
+    , generic-lens       ^>=2.3
     , lens               ^>=5.3
-    , openai
-    , scientific
-    , streamly           >=0.11 && <0.13
-    , streamly-core      >=0.3  && <0.5
+    , openai             ^>=2.5
+    , scientific         ^>=0.3
+    , streamly           >=0.11  && <0.13
+    , streamly-core      >=0.3   && <0.5
     , text               ^>=2.1
-    , time
-    , unliftio-core
-    , vector
+    , time               ^>=1.14
+    , unliftio-core      ^>=0.2
+    , vector             ^>=0.13
 
 executable baikai-gen-models
   import:         common-options
@@ -93,14 +93,14 @@
   main-is:        GenModels.hs
   other-modules:  GenModelsCore
   build-depends:
-    , aeson
+    , aeson       ^>=2.2
     , baikai
-    , base        >=4.20 && <5
-    , bytestring
-    , containers
-    , directory
-    , filepath
-    , scientific
+    , base        >=4.20  && <5
+    , bytestring  ^>=0.12
+    , containers  ^>=0.7
+    , directory   ^>=1.3
+    , filepath    ^>=1.5
+    , scientific  ^>=0.3
     , text        ^>=2.1
 
 executable baikai-fetch-models
@@ -114,20 +114,20 @@
   -- @Main.hs@ without a module-name clash.
   ghc-options:    -main-is FetchModels
   build-depends:
-    , aeson
+    , aeson            ^>=2.2
     , baikai
-    , base             >=4.20 && <5
-    , bytestring
-    , containers
-    , directory
-    , filepath
-    , generic-lens
-    , http-client
-    , http-client-tls
-    , lens
-    , scientific
+    , base             >=4.20  && <5
+    , bytestring       ^>=0.12
+    , containers       ^>=0.7
+    , directory        ^>=1.3
+    , filepath         ^>=1.5
+    , generic-lens     ^>=2.3
+    , http-client      ^>=0.7
+    , http-client-tls  ^>=0.3
+    , lens             ^>=5.3
+    , scientific       ^>=0.3
     , text             ^>=2.1
-    , vector
+    , vector           ^>=0.13
 
 test-suite baikai-test
   import:             common-options
diff --git a/fetch/FetchModelsCore.hs b/fetch/FetchModelsCore.hs
--- a/fetch/FetchModelsCore.hs
+++ b/fetch/FetchModelsCore.hs
@@ -229,7 +229,11 @@
 openaiInclude :: Set Text
 openaiInclude =
   Set.fromList
-    [ "gpt-5.5",
+    [ "gpt-5.6",
+      "gpt-5.6-luna",
+      "gpt-5.6-sol",
+      "gpt-5.6-terra",
+      "gpt-5.5",
       "gpt-5.4",
       "gpt-5.4-mini",
       "gpt-5.4-nano",
@@ -257,6 +261,7 @@
       "claude-opus-4-7",
       "claude-opus-4-6",
       "claude-opus-4-5",
+      "claude-sonnet-5",
       "claude-sonnet-4-6",
       "claude-sonnet-4-5",
       "claude-haiku-4-5",
diff --git a/src/Baikai/Models/Generated.hs b/src/Baikai/Models/Generated.hs
--- a/src/Baikai/Models/Generated.hs
+++ b/src/Baikai/Models/Generated.hs
@@ -192,7 +192,7 @@
             cacheReadCost = 3 % 10,
             cacheWriteCost = 15 % 4
           },
-      contextWindow = 200000,
+      contextWindow = 1000000,
       maxOutputTokens = 64000,
       headers = Map.empty,
       compat = CompatNone
@@ -216,11 +216,34 @@
             cacheWriteCost = 15 % 4
           },
       contextWindow = 1000000,
-      maxOutputTokens = 64000,
+      maxOutputTokens = 128000,
       headers = Map.empty,
       compat = CompatNone
     }
 
+anthropic_claude_sonnet_5 :: Model
+anthropic_claude_sonnet_5 =
+  emptyModel
+    { modelId = "claude-sonnet-5",
+      name = "Claude Sonnet 5",
+      api = AnthropicMessages,
+      provider = "anthropic",
+      baseUrl = "https://api.anthropic.com",
+      reasoning = True,
+      input = [InputText, InputImage],
+      cost =
+        ModelCost
+          { inputCost = 2 % 1,
+            outputCost = 10 % 1,
+            cacheReadCost = 1 % 5,
+            cacheWriteCost = 5 % 2
+          },
+      contextWindow = 1000000,
+      maxOutputTokens = 128000,
+      headers = Map.empty,
+      compat = CompatNone
+    }
+
 deepseek_deepseek_chat :: Model
 deepseek_deepseek_chat =
   emptyModel
@@ -536,6 +559,98 @@
             outputCost = 30 % 1,
             cacheReadCost = 1 % 2,
             cacheWriteCost = 0 % 1
+          },
+      contextWindow = 1050000,
+      maxOutputTokens = 128000,
+      headers = Map.empty,
+      compat = CompatNone
+    }
+
+openai_gpt_5_6 :: Model
+openai_gpt_5_6 =
+  emptyModel
+    { modelId = "gpt-5.6",
+      name = "GPT-5.6",
+      api = OpenAIChatCompletions,
+      provider = "openai",
+      baseUrl = "https://api.openai.com",
+      reasoning = True,
+      input = [InputText, InputImage],
+      cost =
+        ModelCost
+          { inputCost = 5 % 1,
+            outputCost = 30 % 1,
+            cacheReadCost = 1 % 2,
+            cacheWriteCost = 25 % 4
+          },
+      contextWindow = 1050000,
+      maxOutputTokens = 128000,
+      headers = Map.empty,
+      compat = CompatNone
+    }
+
+openai_gpt_5_6_luna :: Model
+openai_gpt_5_6_luna =
+  emptyModel
+    { modelId = "gpt-5.6-luna",
+      name = "GPT-5.6 Luna",
+      api = OpenAIChatCompletions,
+      provider = "openai",
+      baseUrl = "https://api.openai.com",
+      reasoning = True,
+      input = [InputText, InputImage],
+      cost =
+        ModelCost
+          { inputCost = 1 % 1,
+            outputCost = 6 % 1,
+            cacheReadCost = 1 % 10,
+            cacheWriteCost = 5 % 4
+          },
+      contextWindow = 1050000,
+      maxOutputTokens = 128000,
+      headers = Map.empty,
+      compat = CompatNone
+    }
+
+openai_gpt_5_6_sol :: Model
+openai_gpt_5_6_sol =
+  emptyModel
+    { modelId = "gpt-5.6-sol",
+      name = "GPT-5.6 Sol",
+      api = OpenAIChatCompletions,
+      provider = "openai",
+      baseUrl = "https://api.openai.com",
+      reasoning = True,
+      input = [InputText, InputImage],
+      cost =
+        ModelCost
+          { inputCost = 5 % 1,
+            outputCost = 30 % 1,
+            cacheReadCost = 1 % 2,
+            cacheWriteCost = 25 % 4
+          },
+      contextWindow = 1050000,
+      maxOutputTokens = 128000,
+      headers = Map.empty,
+      compat = CompatNone
+    }
+
+openai_gpt_5_6_terra :: Model
+openai_gpt_5_6_terra =
+  emptyModel
+    { modelId = "gpt-5.6-terra",
+      name = "GPT-5.6 Terra",
+      api = OpenAIChatCompletions,
+      provider = "openai",
+      baseUrl = "https://api.openai.com",
+      reasoning = True,
+      input = [InputText, InputImage],
+      cost =
+        ModelCost
+          { inputCost = 5 % 2,
+            outputCost = 15 % 1,
+            cacheReadCost = 1 % 4,
+            cacheWriteCost = 25 % 8
           },
       contextWindow = 1050000,
       maxOutputTokens = 128000,
