diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -5,8 +5,9 @@
 
 - *Lasagne* is now *Sylvan*.
 - runPlanK -> runKPlan
-- unliftPlanK -> uliftKPlan
+- unliftPlanK -> unliftKPlan
 - planK -> kplan
 - planKIO -> kplanIO
 - Removed non-essential *paths* function.
+- Added "obligatoriness".
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -38,6 +38,11 @@
 
 ## Inspiration
 
-[StaticArrow](http://hackage.haskell.org/package/arrows-0.4.4.1/docs/Control-Arrow-Transformer-Static.html)
-from the [arrows](http://hackage.haskell.org/package/arrows) package.
+- [StaticArrow](http://hackage.haskell.org/package/arrows-0.4.4.1/docs/Control-Arrow-Transformer-Static.html)
+  from the [arrows](http://hackage.haskell.org/package/arrows) package.
+
+- Not exactly an inspiration (as I don't understand the stuff well enough) but
+  Tomas Petricek's work on ["coeffects"](http://tomasp.net/coeffects/) seems
+  relevant for helping applications to "fail early". See section 1.1 of his
+  [thesis](http://tomasp.net/academic/theses/coeffects/thesis.pdf).
 
diff --git a/lib/Control/Plan.hs b/lib/Control/Plan.hs
--- a/lib/Control/Plan.hs
+++ b/lib/Control/Plan.hs
@@ -12,7 +12,7 @@
                       step "f" (foretell [4] *> plan (threadDelay 1e6)))
     in 
     bifoldMap id (foldMap Prelude.show) (getSteps example)
-:}
+    :}
 "ab1c2de3f4"
 
 Some possible use cases:
diff --git a/lib/Control/Plan/Core.hs b/lib/Control/Plan/Core.hs
--- a/lib/Control/Plan/Core.hs
+++ b/lib/Control/Plan/Core.hs
@@ -37,6 +37,17 @@
 import qualified Streaming.Prelude
 import Streaming.Prelude (Stream,Of(..),yield,next,effects)
 
+{- $setup
+
+>>> :set -XArrows
+>>> :set -XTypeApplications
+>>> import Control.Applicative
+>>> import Control.Plan
+>>> import Data.Tree
+>>> import Text.Read(readMaybe)
+
+-}
+
 -- | A computation that takes inputs of type @i@ and produces outputs of type
 -- @o@ working in the underlying monad @m@. The 'Applicative' instance cares
 -- only about the outputs, the 'Arrow' instance cares about both inputs and
@@ -72,8 +83,10 @@
 data Steps s w = Steps !(Seq (w,s,Mandatoriness,Steps s w)) w 
                deriving (Functor,Foldable,Traversable,Eq,Show)
 
--- | Steps of 'Plan's constructed in 'Applicative' fashion are always
--- 'Mandatory'. Only steps declared with 'skippable' are optional.
+{- Steps of 'Plan's constructed in 'Applicative' fashion are always
+  'Mandatory'. Only steps declared with 'skippable' are optional.
+
+-}
 data Mandatoriness = Skippable
                    | Mandatory
                    deriving (Show,Eq,Ord)
@@ -161,12 +174,26 @@
     Plan (Steps (Seq.singleton (mempty,s,Mandatory,forest)) mempty) 
          (Star (\x -> yield Started' *> f x <* yield Finished'))
 
--- | Declare an optional step by wrapping an existing arrow plan. The step will
--- only be executed when the input is 'Just'.
---
--- This function only makes sense when using the 'Arrow' instance of 'Plan',
--- because for 'Applicative's an effect cannot depend on previously obtained
--- values.
+{-| Declare an optional step by wrapping an existing arrow plan. The step will only
+    be executed when the input is 'Just'.
+
+    This function only makes sense when using the 'Arrow' instance of 'Plan',
+    because for 'Applicative's an effect cannot depend on previously obtained
+    values.
+
+>>> :{
+    let example :: Plan String () IO () ()
+        example = proc () -> do 
+            i <- step "reading" (plan (readMaybe @Int <$> getLine)) -< () 
+            skippable "writing" (kplan print) -< i
+    in  putStr . drawForest . fmap (fmap show) . toForest . mandatoriness . getSteps $ example
+    :}
+(Mandatory,"reading")
+<BLANKLINE>
+(Skippable,"writing")
+<BLANKLINE>
+
+-}
 skippable :: (Monoid w,Monad m) => s -> Plan s w m i o -> Plan s w m (Maybe i) ()
 skippable s (Plan forest (Star f)) = 
     Plan (Steps (Seq.singleton (mempty,s,Skippable,forest)) mempty) 
diff --git a/plan-applicative.cabal b/plan-applicative.cabal
--- a/plan-applicative.cabal
+++ b/plan-applicative.cabal
@@ -1,5 +1,5 @@
 name:                plan-applicative
-version:             2.0.0.0
+version:             2.0.0.1
 synopsis:            Applicative/Arrow for resource estimation and progress tracking.
 description:         This module contains a writer-like Applicative for giving
                      monoidal annotations to underlying computations. The
@@ -43,12 +43,13 @@
 test-suite doctests
   type:                exitcode-stdio-1.0
   ghc-options:         -Wall -threaded
-  hs-source-dirs:      tests
+  hs-source-dirs:      tests,lib
   main-is:             doctests.hs
+  other-modules:       Control.Plan
+                       Control.Plan.Core
   build-depends:
                        base          >= 4.6    && < 5,
-                       doctest       >= 0.11,
-                       plan-applicative
+                       doctest       >= 0.11
   default-language:    Haskell2010
 
 test-suite tests
diff --git a/tests/doctests.hs b/tests/doctests.hs
--- a/tests/doctests.hs
+++ b/tests/doctests.hs
@@ -3,4 +3,4 @@
 import Test.DocTest
 
 main :: IO ()
-main = doctest [ "lib/Control/Plan.hs" ]
+main = doctest ["lib/Control/Plan.hs","lib/Control/Plan/Core.hs"]
