diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,7 +1,11 @@
-# 0.0.0.1 (2023-01-11)
+## 0.0.1.0 (2023-03-03)
 
+Add `SupplyChain.Vendor.state`
+
+## 0.0.0.1 (2023-01-11)
+
 Documentation enhancements
 
-# 0.0.0.0 (2022-11-08)
+## 0.0.0.0 (2022-11-08)
 
 Initial release
diff --git a/readme.md b/readme.md
--- a/readme.md
+++ b/readme.md
@@ -241,3 +241,13 @@
 
 This latter component is what allows vendors to be stateful, and it is usually
 defined recursively.
+
+
+## Notes on package versioning
+
+This `supply-chain` package re-exports types and values from
+`supply-chain-core`. Since a `supply-chain-core` API change can cause a
+`supply-chain` API change, our version bounds on the `supply-chain-core`
+dependency must include three digits. A major or minor version bump in
+`supply-chain-core` prompts a corresponding bump in `supply-chain` if any
+re-exported entities have changed.
diff --git a/supply-chain.cabal b/supply-chain.cabal
--- a/supply-chain.cabal
+++ b/supply-chain.cabal
@@ -1,7 +1,7 @@
 cabal-version: 3.0
 
 name: supply-chain
-version: 0.0.0.1
+version: 0.0.1.0
 
 category: Monads, Streaming
 synopsis: Composable request-response pipelines
@@ -36,7 +36,7 @@
 
     build-depends:
       , base ^>= 4.16 || ^>= 4.17
-      , supply-chain-core ^>= 0.0
+      , supply-chain-core == 0.0.0.*
 
 library
     import: base
diff --git a/supply-chain/SupplyChain/Vendor.hs b/supply-chain/SupplyChain/Vendor.hs
--- a/supply-chain/SupplyChain/Vendor.hs
+++ b/supply-chain/SupplyChain/Vendor.hs
@@ -4,7 +4,7 @@
   (
     {- * Type -} Vendor (Vendor, handle),
     {- * Connection -} (>->), id,
-    {- * Some simple vendors -} function, action, map, absurd,
+    {- * Some simple vendors -} function, action, state, map, absurd,
     {- * Running -} run, eval, eval',
     {- * Alteration -} alter, alter',
   )
@@ -24,6 +24,7 @@
 import Control.Applicative (pure)
 import Control.Monad (Monad)
 import Data.Function ((.))
+import Data.Functor ((<&>))
 import Data.Functor.Const (Const)
 import Data.Void (Void)
 
@@ -80,9 +81,21 @@
     -> Vendor up down action
 action f = loop' (Job.perform . f)
 
+{-| A stateful vendor -}
+state ::
+    s -- ^ Initial state
+    -> (forall response. down response -> s -> Job up action (response, s))
+    -> Vendor up down action
+state initial step = go initial
+  where
+    go s =
+        Vendor{ handle = \request ->
+            step request s <&> \(response, s') ->
+                Referral response (go s') }
+
 {-| A vendor that applies a transformation to each request
-    and then simply forwards it upstream. -}
-map :: (forall x. down x -> up x) -> Vendor up down action
+    and then simply forwards it upstream -}
+map :: (forall response. down response -> up response) -> Vendor up down action
 map f = loop' (Job.order . f)
 
 alter :: (forall x. Effect up action x -> Job up' action' x)
