diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -151,7 +151,8 @@
   meta holds, through evaluation, 𝔼, as in `𝑛2: 𝑛1`.
 * `defer` binds a term meta to a fresh symbol when another meta holds a copy
   of an object whose argument is a bare symbol, `⟦ λ ⤍ 𝜎1 ⟧`, and to that
-  term as it is otherwise.
+  term as it is otherwise, or when under `--acyclic` the φ of the copy
+  repeats a formation the run is inside.
 * `stay` binds a term meta to the term another meta holds, with every
   `( ρ ↦ … )` applied to a dispatch dropped.
 * `symbolize` binds a term meta to the term another meta holds, with every
@@ -310,7 +311,7 @@
 ⟧
 $ phino morph --symbolic=down.yaml --locator=Q.y --acyclic=proven \
     --minutes=down.txt --sweet --hide-rho down.phi
-⟦ x ↦ 𝜎1:λ, λ ⤍ L_down ⟧.φ
+𝜎3:λ
 $ cat down.txt
 𝕄(Φ.y):
   remembered 𝑛·0·1 ≡ Φ.down  # ⟦ x ↦ ∅, λ ⤍ L_down ⟧
@@ -329,7 +330,11 @@
       morphed 𝑛·1·4 := 𝑛·1·3
     𝑛·1·5 := 𝑛·1·3  # 𝕄(𝑛·1·1)
     remembered 𝑛·1·3 ≡ 𝑛·0·3
-  looped 𝑛·0·3  # proven
+  recalled 𝑛·1·3 ⇒ 𝑛·0·3
+  recalled 𝑛·0·3 ⇒ 𝑛·0·1( x ↦ 𝜎1:λ )
+  recalled 𝑛·0·1 ⇒ Φ.down
+  looped 𝜎3 := 𝑛·0·2.φ  # proven, repeats 𝑛·0·3
+  morphed 𝑛·0·4 := 𝜎3:λ
 ```
 
 In a name such as `𝑛·1·2`, the first number counts the firings, `0` outside
@@ -353,6 +358,8 @@
 * `𝛿·1·1 := …` closes a `𝔻` block with the data it found, or with
   `𝔻(𝜎1:λ)` where it came down to a symbol.
 * `morphed …` closes a `𝕄` block with the term it came to.
+* `normalized …` is the term a normalization came to, where no line named it
+  before, and the comment names the term it came from.
 * `joined …`, `fabricated …`, `diverged …` and `unripe …` are what a `join`
   made of its two sides, or why it could not join them.
 * `deferred …` and `symbolized …` are the symbols a `defer` or a `symbolize`
diff --git a/phino.cabal b/phino.cabal
--- a/phino.cabal
+++ b/phino.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name: phino
-version: 0.0.164
+version: 0.0.165
 license: MIT
 synopsis: Command-Line Manipulator of 𝜑-Calculus Expressions
 description: Please see the README on GitHub at <https://github.com/objectionary/phino#readme>
diff --git a/src/AST.hs b/src/AST.hs
--- a/src/AST.hs
+++ b/src/AST.hs
@@ -25,6 +25,8 @@
   , repeated
   , attributeFromBinding
   , alike
+  , akin
+  , boxed
   , within
   , symbols
   , lifted
@@ -309,9 +311,34 @@
       FnFresh slot -> goSlot (step h 39) slot
 
 alike :: Expression -> Expression -> Bool
-alike one two = isJust (goExpr (Map.empty, Map.empty) one two)
+alike = likened (\_ _ -> False)
+
+akin :: Expression -> Expression -> Bool
+akin = likened grown
   where
+    grown :: Expression -> Expression -> Bool
+    grown before@(ExFormation left) after@(ExFormation right) = boxed left && boxed right && within before after
+    grown _ _ = False
+
+boxed :: [Binding] -> Bool
+boxed bds = any phi bds && not (any lambda bds) && not (any delta bds)
+  where
+    phi :: Binding -> Bool
+    phi (BiTau AtPhi _) = True
+    phi _ = False
+    lambda :: Binding -> Bool
+    lambda (BiLambda _) = True
+    lambda _ = False
+    delta :: Binding -> Bool
+    delta (BiDelta _) = True
+    delta _ = False
+
+likened :: (Expression -> Expression -> Bool) -> Expression -> Expression -> Bool
+likened loose one two = isJust (goExpr (Map.empty, Map.empty) one two)
+  where
     goExpr :: (Map.Map Int Int, Map.Map Int Int) -> Expression -> Expression -> Maybe (Map.Map Int Int, Map.Map Int Int)
+    goExpr pairing left right
+      | loose left right = Just pairing
     goExpr pairing (ExFormation left) (ExFormation right) = goList goBinding pairing left right
     goExpr pairing (ExApplication left arg) (ExApplication right arg') = goExpr pairing left right >>= \next -> goArgument next arg arg'
     goExpr pairing (ExDispatch left attr) (ExDispatch right attr')
diff --git a/src/Dataize.hs b/src/Dataize.hs
--- a/src/Dataize.hs
+++ b/src/Dataize.hs
@@ -71,7 +71,7 @@
           pure ((bts, NE.toList seq'), state'{_manufactured = Nothing})
         Just (In.Onward way built world, state') -> do
           ctx' <- boxing way built ctx
-          (dataizable, state'') <- onward seq state' way built ctx'
+          (dataizable, state'') <- onward seq state' way univ built ctx'
           dataize' dataizable world state'' ctx'
         Nothing -> throwIO (Undataizable expr seq state)
   where
diff --git a/src/Deps.hs b/src/Deps.hs
--- a/src/Deps.hs
+++ b/src/Deps.hs
@@ -19,7 +19,7 @@
 import Data.IORef (IORef, readIORef, writeIORef)
 import Data.List (intercalate, sortOn)
 import qualified Data.Map.Strict as Map
-import Data.Maybe (fromMaybe, listToMaybe, mapMaybe, maybeToList)
+import Data.Maybe (catMaybes, fromMaybe, isJust, listToMaybe, mapMaybe, maybeToList)
 import qualified Data.Text as T
 import Data.Time (ZonedTime, defaultTimeLocale, formatTime)
 import Files (overwrite)
@@ -155,7 +155,9 @@
   | EvBuilt Int Expression
   | EvAnswer Int Expression
   | EvMorphed Int Expression
+  | EvNormalized Int Expression Expression
   | EvJoined Int (Either T.Text Expression) Int (Int, Int) (Maybe Int) (Maybe Expression)
+  | EvGuarded Int (Either T.Text Expression) (Expression, Expression) (Expression, Expression) Side (Maybe Expression)
   | EvDiverged Int (Expression, Expression) (Expression, Expression) [Attribute] Refusal
   | EvUnripe Int (Expression, Expression) (Expression, Expression) Side Attribute
   | EvFabricated Int (Expression, Expression) (Expression, Expression) Expression
@@ -228,7 +230,9 @@
 tier (EvBuilt depth _) = depth
 tier (EvAnswer depth _) = depth
 tier (EvMorphed depth _) = depth
+tier (EvNormalized depth _ _) = depth
 tier (EvJoined depth _ _ _ _ _) = depth
+tier (EvGuarded depth _ _ _ _ _) = depth
 tier (EvDiverged depth _ _ _ _) = depth
 tier (EvUnripe depth _ _ _ _) = depth
 tier (EvFabricated depth _ _ _) = depth
@@ -293,10 +297,11 @@
   , _answered :: [(Int, Expression, String)]
   , _unwritten :: Map.Map Int (Named Expression)
   , _stated :: Named [(Expression, (String, String))]
+  , _spelt :: Map.Map Int (Map.Map Bytes String)
   }
 
 emptyProtocol :: Protocol
-emptyProtocol = Protocol 0 Map.empty [] False Map.empty Map.empty Map.empty Map.empty Nothing [] [] Map.empty Map.empty
+emptyProtocol = Protocol 0 Map.empty [] False Map.empty Map.empty Map.empty Map.empty Nothing [] [] Map.empty Map.empty Map.empty
 
 data Nesting = Nesting
   { _fires :: Int
@@ -465,25 +470,25 @@
     written at (EvData _ spelling operand value) protocol = do
       datum <- maybe (spelt value) pure (found value protocol._found)
       line <- commented protocol (printf "%s := %s" (labelled protocol spelling) datum) Dataization operand
-      pure (protocol, Just (indented at line))
+      pure (either (const protocol) (\bytes -> protocol{_spelt = Map.insertWith Map.union (opener protocol) (Map.singleton bytes (labelled protocol spelling)) protocol._spelt}) value, Just (indented at line))
     written at (EvTerm _ spelling judgment operand term) protocol = do
       let naming = labelled protocol spelling
-      (protocol', value) <- valued protocol naming term
+      (protocol', value) <- inscribed protocol naming term
       line <- commented protocol (printf "%s := %s" naming value) judgment operand
       pure (protocol', Just (indented at line))
     written _ (EvBound _ meta term) protocol =
       pure (protocol{_unwritten = Map.alter (Just . namedInsert meta term . fromMaybe Map.empty) (opener protocol) protocol._unwritten}, Nothing)
     written at (EvReshaped _ spelling block source term) protocol = do
       let naming = labelled protocol spelling
-      (protocol', value) <- valued protocol naming term
+      (protocol', value) <- inscribed protocol naming term
       line <- printf "%s := %s  # %s(%s)" naming value (T.unpack block) <$> salted (unwritten protocol source)
       pure (protocol', Just (indented at line))
     written at (EvSymbolized _ symbol bytes) protocol = do
       datum <- render (ExBytes bytes)
-      pure (protocol, Just (indented at (remarked (printf "symbolized %s := %s" (printFunction (FnSymbol symbol)) datum) (maybe [] pure (ieee bytes)))))
+      pure (protocol, Just (indented at (remarked (printf "symbolized %s := %s" (printFunction (FnSymbol symbol)) datum) (catMaybes [Map.lookup (opener protocol) protocol._spelt >>= Map.lookup bytes, ieee bytes]))))
     written at (EvCast _ spelling source model term) protocol = do
       let naming = labelled protocol spelling
-      (protocol', value) <- valued protocol naming term
+      (protocol', value) <- inscribed protocol naming term
       one <- spoken protocol source
       two <- spoken protocol model
       pure (protocol', Just (indented at (printf "cast %s := %s  # %s up to %s" naming value one two)))
@@ -517,19 +522,24 @@
           naming = printf "%s·%d" stem index
       (protocol', value) <- valued counted naming term
       pure (protocol'{_made = namedFormation term (alias (opener protocol) index) protocol'._made}, Just (indented at (printf "%s := %s  # 𝕄(%s·%d)" naming value stem (Map.findWithDefault 1 (opener protocol) protocol._built))))
-    written at (EvMorphed _ term) protocol = do
-      let (index, counted) = numbered protocol
-          naming :: String
-          naming = printf "%s·%d" (labelled protocol answer) index
-      (protocol', value) <- case (namedLookup term protocol._made, namedLookup term protocol._named) of
-        (Nothing, Nothing) -> valued counted naming term
-        _ -> (,) counted <$> borrowed protocol term
-      pure (protocol'{_made = namedFormation term (alias (opener protocol) index) protocol'._made}, Just (indented at (printf "morphed %s := %s" naming value)))
+    written at (EvMorphed _ term) protocol = concluding at "morphed" term protocol
+    written at (EvNormalized _ source term) protocol
+      | isJust (namedLookup term protocol._named) || isJust (namedLookup term protocol._made) = pure (protocol, Nothing)
+      | otherwise = do
+          origin <- render source
+          second (fmap (`remarked` [origin])) <$> concluding at "normalized" term protocol
     written at (EvJoined _ condition symbol (left, right) bottom raised) protocol = do
       on <- either (pure . labelled protocol) salted condition
       termination <- render ExTermination
       raiser <- traverse salted raised
       pure (protocol, Just (indented at (remarked (printf "joined %s := %s ? %s : %s" (printFunction (FnSymbol symbol)) on (printFunction (FnSymbol left)) (printFunction (FnSymbol right))) [printf "where %s is %s%s" (printFunction (FnSymbol idx)) termination (maybe "" (printf " raised by %s") raiser :: String) | Just idx <- [bottom], idx `elem` [left, right]])))
+    written at (EvGuarded _ condition left right side raised) protocol = do
+      on <- either (pure . labelled protocol) salted condition
+      one <- sided protocol left
+      two <- sided protocol right
+      termination <- render ExTermination
+      raiser <- traverse salted raised
+      pure (protocol, Just (indented at (remarked (printf "guarded %s ? %s : %s" on one two) [printf "where %s is %s%s" (if side == Lefthand then one else two) termination (maybe "" (printf " raised by %s") raiser :: String)])))
     written at (EvDiverged _ left right path refusal) protocol = do
       one <- sided protocol left
       two <- sided protocol right
@@ -581,10 +591,15 @@
       Just _ -> do
         value <- maybe (render term) (pure . T.unpack) (namedLookup term protocol._named)
         pure (protocol{_named = namedInsert term (T.pack naming) protocol._named}, value)
+    inscribed :: Protocol -> String -> Expression -> IO (Protocol, String)
+    inscribed protocol naming term = do
+      (protocol', value) <- valued protocol naming term
+      pure (maybe protocol'{_made = namedFormation term (ExMeta (T.pack ('n' : drop 1 naming))) protocol'._made} (const protocol') (namedLookup term protocol._made), value)
     borrowed :: Protocol -> Expression -> IO String
-    borrowed protocol term = case namedLookup term protocol._named of
-      Nothing -> render term
-      Just naming -> pure (T.unpack naming)
+    borrowed protocol term = case (namedLookup term protocol._named, namedLookup term protocol._made) of
+      (Just naming, _) -> pure (T.unpack naming)
+      (Nothing, Just meta) -> render meta
+      (Nothing, Nothing) -> render term
     explained :: Protocol -> [Attribute] -> Expression -> Expression -> IO String
     explained protocol path one two = case reverse path of
       [] -> printf "the left side is %s and the right side is %s" <$> borrowed protocol one <*> borrowed protocol two
@@ -611,7 +626,7 @@
     held :: Protocol -> Named Expression
     held protocol = Map.findWithDefault Map.empty (opener protocol) protocol._unwritten
     outer :: Int -> Protocol -> Protocol
-    outer depth protocol = protocol{_open = dropWhile ((>= depth) . fst) protocol._open, _answered = dropWhile (\(level, _, _) -> level > depth) protocol._answered, _unwritten = foldr (Map.delete . snd) protocol._unwritten (takeWhile ((>= depth) . fst) protocol._open)}
+    outer depth protocol = protocol{_open = dropWhile ((>= depth) . fst) protocol._open, _answered = dropWhile (\(level, _, _) -> level > depth) protocol._answered, _unwritten = foldr (Map.delete . snd) protocol._unwritten (takeWhile ((>= depth) . fst) protocol._open), _spelt = foldr (Map.delete . snd) protocol._spelt (takeWhile ((>= depth) . fst) protocol._open)}
     labelled :: Protocol -> T.Text -> String
     labelled protocol spelling = printf "%s·%d" (T.unpack spelling) (opener protocol)
     opener :: Protocol -> Int
@@ -628,6 +643,15 @@
       where
         index :: Int
         index = maybe 1 (+ 1) (Map.lookup (opener protocol) protocol._counted)
+    concluding :: Int -> String -> Expression -> Protocol -> IO (Protocol, Maybe String)
+    concluding at word term protocol = do
+      let (index, counted) = numbered protocol
+          naming :: String
+          naming = printf "%s·%d" (labelled protocol answer) index
+      (protocol', value) <- case (namedLookup term protocol._made, namedLookup term protocol._named) of
+        (Nothing, Nothing) -> valued counted naming term
+        _ -> (,) counted <$> borrowed protocol term
+      pure (protocol'{_made = namedFormation term (alias (opener protocol) index) protocol'._made}, Just (indented at (printf "%s %s := %s" word naming value)))
     taking :: Int -> String -> Expression -> Protocol -> IO (Protocol, Maybe String)
     taking at word term protocol = do
       let (index, counted) = numbered protocol
@@ -664,12 +688,15 @@
     beside at _ nesting = nesting{_heads = dropWhile ((>= at) . fst) nesting._heads, _pending = dropWhile (\(level, _, _) -> level >= at) nesting._pending}
     flushed :: Nesting -> IO (Nesting, [String])
     flushed nesting
-      | silent report = pure (nesting, [])
+      | silent report || skipped nesting report = pure (nesting, [])
       | otherwise = foldM pended (nesting{_pending = []}, []) (reverse nesting._pending)
     pended :: (Nesting, [String]) -> (Int, Judgment, Expression) -> IO (Nesting, [String])
     pended (nesting, openings) (level, judgment, site) = do
       (nesting', lines') <- staged level nesting (printf "<%s at=\"%s\">" (opened judgment) . escapeXML <$> located level site)
       pure (nesting'{_closing = (level, opened judgment) : nesting'._closing}, openings ++ lines')
+    skipped :: Nesting -> Evaluation -> Bool
+    skipped nesting (EvNormalized _ _ term) = echoed nesting term
+    skipped _ _ = False
     silent :: Evaluation -> Bool
     silent EvStarted{} = True
     silent EvWorld{} = True
@@ -820,13 +847,23 @@
         (naming, _) <- counted
         modify (first (\nesting' -> nesting'{_sources = (depth, term, naming) : nesting'._sources}))
         pure (printf "<built meta=\"%s\">%s</built>" (escapeXML naming) (escapeXMLText body))
-    elements at (EvAnswer depth term) nesting = placed at nesting (concluded "answered" depth term)
-    elements at (EvMorphed depth term) nesting = placed at nesting (concluded "morphed" depth term)
+    elements at (EvAnswer depth term) nesting = placed at nesting (concluded "answered" "" depth term)
+    elements at (EvMorphed depth term) nesting = placed at nesting (concluded "morphed" "" depth term)
+    elements at (EvNormalized depth source term) nesting
+      | echoed nesting term = pure (nesting, [])
+      | otherwise = placed at nesting (leaf depth source >>= \origin -> concluded "normalized" (printf " of=\"%s\"" (escapeXML origin)) depth term)
     elements at (EvJoined depth condition symbol (left, right) bottom raised) nesting =
       placed at nesting $ do
         on <- either (pure . labelled nesting) (lift . traced) condition
         raiser <- traverse (leaf depth) [term | Just idx <- [bottom], idx `elem` [left, right], Just term <- [raised]]
         pure (printf "<joined symbol=\"%s\" on=\"%s\" left=\"%s\" right=\"%s\"%s%s/>" (sigma symbol) (escapeXML on) (sigma left) (sigma right) (concat [printf " terminator=\"%s\"" (sigma idx) :: String | Just idx <- [bottom], idx `elem` [left, right]]) (concat [printf " raised=\"%s\"" (escapeXML name) :: String | name <- raiser]))
+    elements at (EvGuarded depth condition left right side raised) nesting =
+      placed at nesting $ do
+        on <- either (pure . labelled nesting) (lift . traced) condition
+        one <- sided depth nesting left
+        two <- sided depth nesting right
+        raiser <- traverse (leaf depth) (maybeToList raised)
+        pure (printf "<guarded on=\"%s\" left=\"%s\" right=\"%s\" terminator=\"%s\"%s/>" (escapeXML on) (escapeXML one) (escapeXML two) (if side == Lefthand then "left" else "right" :: String) (concat [printf " raised=\"%s\"" (escapeXML name) :: String | name <- raiser]))
     elements at (EvDiverged depth left right path refusal) nesting =
       placed at nesting $ do
         one <- sided depth nesting left
@@ -845,7 +882,7 @@
         body <- leaf depth term
         (naming, _) <- counted
         pure (printf "<fabricated meta=\"%s\" left=\"%s\" right=\"%s\">%s</fabricated>" (escapeXML naming) (escapeXML one) (escapeXML two) (escapeXMLText body))
-    elements at (EvTaken depth term) nesting = placed at nesting (concluded "answered" depth term)
+    elements at (EvTaken depth term) nesting = placed at nesting (concluded "answered" "" depth term)
     elements at (EvRemembered depth object source) nesting = placed at nesting (attesting "remembered" depth nesting object source)
     elements at (EvMemoized depth form reply) nesting = placed at nesting (attesting "memoized" depth nesting form reply)
     elements at (EvRecalled depth term reply) nesting =
@@ -928,12 +965,17 @@
         (naming, aliased) <- counted
         modify (first (\nesting' -> nesting'{_objects = namedInsert term aliased nesting'._objects}))
         pure (printf "<%s meta=\"%s\">%s</%s>" tag (escapeXML naming) (escapeXMLText body) tag)
-    concluded :: String -> Int -> Expression -> Naming String
-    concluded tag depth term = do
+    concluded :: String -> String -> Int -> Expression -> Naming String
+    concluded tag marks depth term = do
       body <- leaf depth term
       (naming, aliased) <- counted
       modify (first (\nesting -> nesting{_objects = namedFormation term aliased nesting._objects}))
-      pure (printf "<%s meta=\"%s\">%s</%s>" tag (escapeXML naming) (escapeXMLText body) tag)
+      pure (printf "<%s meta=\"%s\"%s>%s</%s>" tag (escapeXML naming) marks (escapeXMLText body) tag)
+    echoed :: Nesting -> Expression -> Bool
+    echoed nesting term = case namedLookup term nesting._objects of
+      Just (ExMeta naming) -> "n" `T.isPrefixOf` naming
+      Just ExRoot -> True
+      _ -> False
     bind :: Int -> Nesting -> T.Text -> Expression -> Naming String
     bind depth nesting spelling term = printf "<bound meta=\"%s\">%s</bound>" (escapeXML (labelled nesting spelling)) . escapeXMLText <$> leaf depth term
     leaf :: Int -> Expression -> Naming String
diff --git a/src/Evaluate.hs b/src/Evaluate.hs
--- a/src/Evaluate.hs
+++ b/src/Evaluate.hs
@@ -14,6 +14,7 @@
 import Builder (buildExpressionThrows)
 import Control.Exception (Exception, catch, throwIO, try)
 import Control.Monad (foldM, unless, when)
+import Data.Bool (bool)
 import Data.IORef (readIORef, writeIORef)
 import Data.List (partition)
 import Data.List.NonEmpty (NonEmpty (..))
@@ -21,10 +22,10 @@
 import qualified Data.Text as T
 import Deps (Evaluation (..), Judgment (Evaluation, Morphing), State (..), dontSaveEval, dontSaveStep, resited)
 import Engine (Engine (..))
-import Forks (Refusal (Unnamed, Unripe), forked, joined)
+import Forks (Refusal (Unnamed, Unripe), Side (Lefthand, Righthand), forked, joined)
 import Lambdas (Ending (..), Lambda (..), Line (..), Meta (..), cast, emptyLambdas, matched, minted, rewritten, stayed, symbolized, thrown)
 import Matcher (MetaValue (..), Subst, combine, substEmpty, substSingle, substSlot)
-import Morph (Answer (..), Budget (..), Firing (..), Kept (..), ReduceContext (..), ReduceException (..), Steps (..), argued, awaited, boxed, called, charged, coined, counted, deeper, ended, expired, fired, isLambda, lambda, morphing, normalized, noted, opening, recalled, remember, remembered, remembering, retained, settled, starved, unparked, voided)
+import Morph (Answer (..), Budget (..), Firing (..), Kept (..), ReduceContext (..), ReduceException (..), Steps (..), argued, awaited, called, charged, coined, counted, deeper, ended, expired, fired, isLambda, lambda, morphing, normalized, noted, opening, recalled, remember, remembered, remembering, repeats, retained, settled, starved, unparked, voided)
 import Printer (printExpression, printFunction)
 import Rule (RuleContext (RuleContext))
 import Text.Printf (printf)
@@ -314,8 +315,21 @@
     postponing ctx state' site (ExFormation bds)
       | copied bds = do
           known <- mapM resolved bds
-          if any bare known then Just <$> postponed known else pure Nothing
+          if any bare known then bool (Just <$> postponed known) (pure Nothing) =<< recursive else pure Nothing
       where
+        recursive :: IO Bool
+        recursive = case ctx._acyclic of
+          Just mode -> do
+            outcome <- try (settled (ExDispatch (ExFormation bds) AtPhi) univ state' reading{_facts = Nothing})
+            case outcome of
+              Right (body, _) | atomic body -> not . null <$> repeats mode body ctx
+              Left (OutOfSteps (Seconds cap)) -> expired ctx cap
+              Left (OutOfStepsAt (Seconds cap) _ _) -> expired ctx cap
+              _ -> pure False
+          Nothing -> pure False
+        atomic :: Expression -> Bool
+        atomic (ExFormation inner) = any isLambda inner
+        atomic _ = False
         copied :: [Binding] -> Bool
         copied bds = boxed bds && not (any void bds) && or [not (formed body) | BiTau AtPhi body <- bds]
           where
@@ -384,6 +398,7 @@
         Right (term, made, bottom, spent') -> do
           writeIORef ctx._minted spent'
           mapM_ (\(fresh, pair) -> ctx._saveEval (EvJoined ctx._nesting (either (Left . _spelling) Right on) fresh pair bottom raised)) made
+          mapM_ (\side -> ctx._saveEval (EvGuarded ctx._nesting (either (Left . _spelling) Right on) (left, one) (right, two) side raised)) [side | null made, term /= ExTermination, (side, ExTermination) <- [(Lefthand, stopped one), (Righthand, stopped two)]]
           ctx._saveEval (EvTaken ctx._nesting term)
           pure (Joined term, state''')
         Left path -> case maybe (Left Unnamed) (\name -> forked name condition one two) fallback of
diff --git a/src/Forks.hs b/src/Forks.hs
--- a/src/Forks.hs
+++ b/src/Forks.hs
@@ -29,6 +29,10 @@
   deriving (Eq, Show)
 
 joined :: Expression -> Expression -> Int -> Either [Attribute] (Expression, [(Int, (Int, Int))], Maybe Int, Int)
+joined ExTermination right spent
+  | null (symbols right) = Right (right, [], Nothing, spent)
+joined left ExTermination spent
+  | null (symbols left) = Right (left, [], Nothing, spent)
 joined left right spent = (\(term, (spent', bottom, _, made)) -> (term, reverse made, bottom, spent')) <$> goExpr left right (spent, Nothing, Map.empty, [])
   where
     goExpr :: Expression -> Expression -> Joining -> Either [Attribute] (Expression, Joining)
@@ -100,8 +104,8 @@
 
 forked :: Function -> Either Int Bytes -> Expression -> Expression -> Either Refusal Expression
 forked func condition left right = do
-  one <- formed Lefthand left
-  two <- formed Righthand right
+  one <- inlined <$> formed Lefthand left
+  two <- inlined <$> formed Righthand right
   maybe (Right (fabricated one two)) Left (listToMaybe (unripe Lefthand one two ++ unripe Righthand two one))
   where
     formed :: Side -> Expression -> Either Refusal [Binding]
@@ -113,19 +117,22 @@
         voids :: [Attribute]
         voids = nub (vacant one ++ vacant two)
         branch :: Attribute -> Binding
-        branch attr = maybe (forking attr) (BiTau attr) (aliased attr)
-        aliased :: Attribute -> Maybe Expression
-        aliased attr = case (bound one attr, bound two attr) of
-          (Just term@(ExDispatch ExXi name), Just other) | term == other && name `elem` attributes one ++ attributes two -> Just term
-          _ -> Nothing
-        bound :: [Binding] -> Attribute -> Maybe Expression
-        bound bds attr = listToMaybe [term | BiTau label term <- bds, label == attr]
-        forking :: Attribute -> Binding
-        forking attr = BiTau attr (ExFormation ([BiVoid AtRho, BiLambda func] ++ map BiVoid (inner attr) ++ [BiTau (AtLabel "on🌵") (ExFormation [either (BiLambda . FnSymbol) BiDelta condition]), ask "left🌵" one attr, ask "right🌵" two attr]))
+        branch attr = BiTau attr (ExFormation ([BiVoid AtRho, BiLambda func] ++ map BiVoid (inner attr) ++ [BiTau (AtLabel "on🌵") (ExFormation [either (BiLambda . FnSymbol) BiDelta condition]), ask "left🌵" one attr, ask "right🌵" two attr]))
         inner :: Attribute -> [Attribute]
         inner attr = nub (concat (mapMaybe (`held` attr) [one, two]))
         ask :: Text -> [Binding] -> Attribute -> Binding
         ask name bds attr = BiTau (AtLabel name) (applied (ExDispatch (ExDispatch (ExDispatch ExXi AtRho) (AtLabel name)) attr) (fromMaybe (inner attr) (held bds attr)))
+    inlined :: [Binding] -> [Binding]
+    inlined bds = map goBinding bds
+      where
+        goBinding :: Binding -> Binding
+        goBinding (BiTau attr term) = BiTau attr (fromMaybe term (goTerm [attr] term))
+        goBinding bd = bd
+        goTerm :: [Attribute] -> Expression -> Maybe Expression
+        goTerm seen term@(ExDispatch ExXi name)
+          | name `elem` seen = Nothing
+          | otherwise = maybe (Just term) (goTerm (name : seen)) (listToMaybe [bound | BiTau label bound <- bds, label == name])
+        goTerm _ term = Just term
     unripe :: Side -> [Binding] -> [Binding] -> [Refusal]
     unripe side bds others = [Unripe side attr | attr <- vacant bds, attr `elem` [label | BiTau label _ <- others]]
     vacant :: [Binding] -> [Attribute]
diff --git a/src/Margin.hs b/src/Margin.hs
--- a/src/Margin.hs
+++ b/src/Margin.hs
@@ -39,7 +39,9 @@
   withMargin' _ EX_PHI_MEET{..} = EX_PHI_MEET prefix idx (toSingleLine expr)
   withMargin' cfg@(extra, margin) ex@EX_SINGLE{pair = PA_TAU{..}, ..} =
     let single = toSingleLine ex
-        asset = withMargin' (extra, margin - lengthOf attr - 1) expr
+        wide = withMargin' (extra + lengthOf attr + 1, margin) expr
+        narrow = withMargin' (extra, margin - lengthOf attr - 1) expr
+        asset = if displayWidth (last (T.lines (render wide))) + lengthOf attr + 1 <= margin then wide else narrow
      in if lengthOf single + extra <= margin then single else EX_SINGLE (PA_TAU attr arrow asset) space (withMargin' cfg formation)
   withMargin' cfg@(extra, margin) ex@EX_APPLICATION{tab = tab@(TAB indt), ..} =
     let single = toSingleLine ex
diff --git a/src/Morph.hs b/src/Morph.hs
--- a/src/Morph.hs
+++ b/src/Morph.hs
@@ -11,7 +11,7 @@
 -- SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com
 -- SPDX-License-Identifier: MIT
 
-module Morph (Answer (..), Budget (..), Deadline (..), Firing (..), Facts, Kept (..), ReduceContext (..), ReduceException (..), EvaluationFunc, Memo (..), ReductionFunc, Morphed, Steps (..), Tally (..), admitting, argued, awaited, boxed, called, carried, charged, coined, counted, declared, deeper, emptyState, ended, enter, execBuildTerm, expired, fired, inferred, insideUniverse, isLambda, lambda, leadsTo, factual, memoized, morph, noted, remembering, morph', morphing, normalized, onward, opening, parking, recalled, refused, remember, remembered, retained, settled, severing, starved, tallied, timed, universed, unparked, vetted, voided) where
+module Morph (Answer (..), Budget (..), Deadline (..), Firing (..), Facts, Kept (..), ReduceContext (..), ReduceException (..), EvaluationFunc, Memo (..), ReductionFunc, Morphed, Steps (..), Tally (..), admitting, argued, awaited, called, carried, charged, coined, counted, declared, deeper, emptyState, ended, enter, execBuildTerm, expired, fired, inferred, insideUniverse, isLambda, lambda, leadsTo, factual, memoized, morph, noted, remembering, morph', morphing, normalized, onward, opening, parking, recalled, refused, remember, remembered, repeats, retained, settled, severing, starved, tallied, timed, universed, unparked, vetted, voided) where
 
 import AST
 import Builder (buildExpressionThrows, nameIn)
@@ -543,7 +543,7 @@
     repeated :: Acyclic -> Expression -> Bool
     repeated Proven before = alike form before
     repeated Plausible before
-      | atomic form = alike form before
+      | atomic form = akin before form
       | otherwise = within before form
     atomic :: Expression -> Bool
     atomic (ExFormation bds) = any isLambda bds
@@ -562,16 +562,6 @@
   | isJust (lambda bds) = Just term
 entrance _ _ = Nothing
 
-boxed :: [Binding] -> Bool
-boxed bds = any phi bds && not (any isLambda bds) && not (any delta bds)
-  where
-    phi :: Binding -> Bool
-    phi (BiTau AtPhi _) = True
-    phi _ = False
-    delta :: Binding -> Bool
-    delta (BiDelta _) = True
-    delta _ = False
-
 lambda :: [Binding] -> Maybe (T.Text, Expression)
 lambda bds = case partition isLambda bds of
   ([BiLambda (Function func)], rest) -> Just (func, ExFormation rest)
@@ -599,7 +589,7 @@
             seq' <- leadsTo seq step built ctx
             pure ((built, seq'), state')
           Just (In.Onward way built world, state') -> do
-            (morphed, state'') <- onward seq state' way built ctx
+            (morphed, state'') <- onward seq state' way univ built ctx
             go morphed world state'' ctx
           Nothing -> throwIO (Unmorphable term)
       where
@@ -655,18 +645,29 @@
       next answer >>= premised state''
     premised state' (In.Contextualizes term context next) = ctx._engine._contextualize term context >>= next >>= premised state'
 
-onward :: NonEmpty Rewritten -> State -> In.Way -> Expression -> ReduceContext -> IO (Morphed, State)
-onward seq state (In.Taken step) expr ctx = do
+onward :: NonEmpty Rewritten -> State -> In.Way -> Expression -> Expression -> ReduceContext -> IO (Morphed, State)
+onward seq state (In.Taken step) _ expr ctx = do
   seq' <- leadsTo seq step expr ctx
   pure ((expr, seq'), state)
-onward seq state (In.Normalized step) expr ctx = do
+onward seq state (In.Normalized step) univ expr ctx = do
   labelled <- leadsTo seq step expr ctx
-  normal <- normalized expr labelled ctx
+  normal@(term, _) <- normalized expr labelled ctx
+  unless (term `elem` [expr, bare expr]) (ctx._saveEval (EvNormalized ctx._nesting (rooted expr) term))
   pure (normal, state)
-onward seq state (In.Named step) expr ctx = case ctx._universe of
-  Just world -> onward seq state (In.Taken step) world ctx
-  Nothing -> onward seq state (In.Normalized step) expr ctx
-onward seq state (In.Staged stage) expr ctx = morph' (expr, seq) stage state ctx
+  where
+    bare :: Expression -> Expression
+    bare (ExApplication inner _) = bare inner
+    bare inner = inner
+    rooted :: Expression -> Expression
+    rooted inner
+      | inner == univ = ExRoot
+    rooted (ExDispatch inner attr) = ExDispatch (rooted inner) attr
+    rooted (ExApplication inner arg) = ExApplication (rooted inner) arg
+    rooted inner = inner
+onward seq state (In.Named step) univ expr ctx = case ctx._universe of
+  Just world -> onward seq state (In.Taken step) univ world ctx
+  Nothing -> onward seq state (In.Normalized step) univ expr ctx
+onward seq state (In.Staged stage) _ expr ctx = morph' (expr, seq) stage state ctx
 
 leadsTo :: NonEmpty Rewritten -> (Judgment, String) -> Expression -> ReduceContext -> IO (NonEmpty Rewritten)
 leadsTo ((current, _) :| rest) rule expr ReduceContext{..} = do
diff --git a/test-resources/evaluate-packs/answers-a-symbol-nobody-has-worked-out.yaml b/test-resources/evaluate-packs/answers-a-symbol-nobody-has-worked-out.yaml
--- a/test-resources/evaluate-packs/answers-a-symbol-nobody-has-worked-out.yaml
+++ b/test-resources/evaluate-packs/answers-a-symbol-nobody-has-worked-out.yaml
@@ -20,10 +20,12 @@
 result: '𝜎1:λ'
 protocol: |
   𝕄(Φ.φ):
-    𝑛·0·1 := 5.0
-    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0 )
-    𝑛·0·4 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧
+    normalized 𝑛·0·1 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number
+    𝑛·0·2 := 5.0
+    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+    normalized 𝑛·0·4 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·3.plus
+    𝑛·0·5 := 𝑛·0·2.plus( x ↦ 6.0 )
+    𝑛·0·6 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -31,30 +33,36 @@
           𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·1·3 := 𝑛·1·2
         boxed 𝑛·1·4 := 𝑛·1·3.φ
+        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4
         𝕄(𝑛·1·4):
-          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
-          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes
+          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
+          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·9 := 𝑛·1·8
+        boxed 𝑛·1·10 := 𝑛·1·9.φ
+        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10
         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·9 := 6.0
-          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·1·11 := 𝑛·1·10
-        boxed 𝑛·1·12 := 𝑛·1·11.φ
-        𝕄(𝑛·1·12):
-          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
-          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·15 := 𝑛·1·14
-        boxed 𝑛·1·16 := 𝑛·1·15.φ
+          𝑛·1·12 := 6.0
+          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·1·14 := 𝑛·1·13
+        boxed 𝑛·1·15 := 𝑛·1·14.φ
+        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )  # 𝑛·1·15
+        𝕄(𝑛·1·15):
+          𝑛·1·17 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
+          𝑛·1·18 := 40-18-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·19 := 𝑛·1·18
+        boxed 𝑛·1·20 := 𝑛·1·19.φ
+        normalized 𝑛·1·21 := 40-18-00-00-00-00-00-00:Δ  # 𝑛·1·20
         𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0
       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)
-      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛
-      𝕄(𝑛·1·17):
-        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )
-        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
-        morphed 𝑛·1·20 := 𝑛·1·19
-      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)
-    morphed 𝑛·0·5 := 𝜎1:λ
+      𝑛·1·22 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛
+      𝕄(𝑛·1·22):
+        𝑛·1·23 := Φ.number( φ ↦ 𝜎1:λ )
+        𝑛·1·24 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
+        morphed 𝑛·1·25 := 𝑛·1·24
+      𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·22)
+    normalized 𝑛·0·7 := 𝜎1:λ  # 𝑛·1·26.φ
+    morphed 𝑛·0·8 := 𝑛·0·7
diff --git a/test-resources/evaluate-packs/answers-a-whole-family-of-names-with-one-entry.yaml b/test-resources/evaluate-packs/answers-a-whole-family-of-names-with-one-entry.yaml
--- a/test-resources/evaluate-packs/answers-a-whole-family-of-names-with-one-entry.yaml
+++ b/test-resources/evaluate-packs/answers-a-whole-family-of-names-with-one-entry.yaml
@@ -20,10 +20,12 @@
 result: '𝜎2:λ'
 protocol: |
   𝕄(Φ.φ):
-    𝑛·0·1 := 5.0
-    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧
-    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0 )
-    𝑛·0·4 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧
+    normalized 𝑛·0·1 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧  # Φ.number
+    𝑛·0·2 := 5.0
+    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧
+    normalized 𝑛·0·4 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·3.plus
+    𝑛·0·5 := 𝑛·0·2.plus( x ↦ 6.0 )
+    𝑛·0·6 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -31,60 +33,70 @@
           𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧
           morphed 𝑛·1·3 := 𝑛·1·2
         boxed 𝑛·1·4 := 𝑛·1·3.φ
+        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4
         𝕄(𝑛·1·4):
-          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
-          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes
+          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
+          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·9 := 𝑛·1·8
+        boxed 𝑛·1·10 := 𝑛·1·9.φ
+        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10
         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·9 := 6.0
-          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧
-          morphed 𝑛·1·11 := 𝑛·1·10
-        boxed 𝑛·1·12 := 𝑛·1·11.φ
-        𝕄(𝑛·1·12):
-          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
-          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·15 := 𝑛·1·14
-        boxed 𝑛·1·16 := 𝑛·1·15.φ
+          𝑛·1·12 := 6.0
+          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧
+          morphed 𝑛·1·14 := 𝑛·1·13
+        boxed 𝑛·1·15 := 𝑛·1·14.φ
+        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )  # 𝑛·1·15
+        𝕄(𝑛·1·15):
+          𝑛·1·17 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
+          𝑛·1·18 := 40-18-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·19 := 𝑛·1·18
+        boxed 𝑛·1·20 := 𝑛·1·19.φ
+        normalized 𝑛·1·21 := 40-18-00-00-00-00-00-00:Δ  # 𝑛·1·20
         𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0
       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)
-      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛
-      𝕄(𝑛·1·17):
-        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )
-        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧
-        morphed 𝑛·1·20 := 𝑛·1·19
-      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)
-    𝑛·0·5 := 𝑛·1·18.times( x ↦ 7.0 )
-    𝑛·0·6 := ⟦ x ↦ 7.0, λ ⤍ L_number_times ⟧
+      𝑛·1·22 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛
+      𝕄(𝑛·1·22):
+        𝑛·1·23 := Φ.number( φ ↦ 𝜎1:λ )
+        𝑛·1·24 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧
+        morphed 𝑛·1·25 := 𝑛·1·24
+      𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·22)
+    normalized 𝑛·0·7 := ⟦ x ↦ ∅, λ ⤍ L_number_times ⟧  # 𝑛·1·26.times
+    𝑛·0·8 := 𝑛·1·23.times( x ↦ 7.0 )
+    𝑛·0·9 := ⟦ x ↦ 7.0, λ ⤍ L_number_times ⟧
     𝔼(L_number_times):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
           𝑛·2·1 := Φ.number( φ ↦ 𝜎1:λ )
           𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧
-          morphed 𝑛·2·3 := 𝑛·1·21
+          morphed 𝑛·2·3 := 𝑛·1·26
         boxed 𝑛·2·4 := 𝑛·2·3.φ
+        normalized 𝑛·2·5 := 𝜎1:λ  # 𝑛·2·4
         𝛿·2·1 := 𝔻(𝜎1:λ)
       𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·2·5 := 7.0
-          𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧
-          morphed 𝑛·2·7 := 𝑛·2·6
-        boxed 𝑛·2·8 := 𝑛·2·7.φ
-        𝕄(𝑛·2·8):
-          𝑛·2·9 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )
-          𝑛·2·10 := 40-1C-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·2·11 := 𝑛·2·10
-        boxed 𝑛·2·12 := 𝑛·2·11.φ
+          𝑛·2·6 := 7.0
+          𝑛·2·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧
+          morphed 𝑛·2·8 := 𝑛·2·7
+        boxed 𝑛·2·9 := 𝑛·2·8.φ
+        normalized 𝑛·2·10 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )  # 𝑛·2·9
+        𝕄(𝑛·2·9):
+          𝑛·2·11 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )
+          𝑛·2·12 := 40-1C-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·2·13 := 𝑛·2·12
+        boxed 𝑛·2·14 := 𝑛·2·13.φ
+        normalized 𝑛·2·15 := 40-1C-00-00-00-00-00-00:Δ  # 𝑛·2·14
         𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0
       𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)
-      𝑛·2·13 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
-      𝕄(𝑛·2·13):
-        𝑛·2·14 := Φ.number( φ ↦ 𝜎2:λ )
-        𝑛·2·15 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧
-        morphed 𝑛·2·16 := 𝑛·2·15
-      𝑛·2·17 := 𝑛·2·16  # 𝕄(𝑛·2·13)
-    morphed 𝑛·0·7 := 𝜎2:λ
+      𝑛·2·16 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
+      𝕄(𝑛·2·16):
+        𝑛·2·17 := Φ.number( φ ↦ 𝜎2:λ )
+        𝑛·2·18 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧
+        morphed 𝑛·2·19 := 𝑛·2·18
+      𝑛·2·20 := 𝑛·2·19  # 𝕄(𝑛·2·16)
+    normalized 𝑛·0·10 := 𝜎2:λ  # 𝑛·2·20.φ
+    morphed 𝑛·0·11 := 𝑛·0·10
diff --git a/test-resources/evaluate-packs/answers-an-operand-that-dataizes-in-circles-with-a-symbol.yaml b/test-resources/evaluate-packs/answers-an-operand-that-dataizes-in-circles-with-a-symbol.yaml
--- a/test-resources/evaluate-packs/answers-an-operand-that-dataizes-in-circles-with-a-symbol.yaml
+++ b/test-resources/evaluate-packs/answers-an-operand-that-dataizes-in-circles-with-a-symbol.yaml
@@ -33,19 +33,21 @@
           remembered 𝑛·1·3 ≡ 𝑛·1·1( x ↦ ⟦⟧ )
           morphed 𝑛·1·4 := 𝑛·1·3
         boxed 𝑛·1·5 := 𝑛·1·4.φ
+        normalized 𝑛·1·6 := Φ.cyc( ⟦⟧ )  # 𝑛·1·5
         𝕄(𝑛·1·5):
-          𝑛·1·6 := Φ.cyc( x ↦ ⟦⟧ )
-          𝑛·1·7 := ⟦ x ↦ ⟦⟧, φ ↦ Φ.cyc( x ) ⟧
-          morphed 𝑛·1·8 := 𝑛·1·7
+          𝑛·1·7 := Φ.cyc( x ↦ ⟦⟧ )
+          𝑛·1·8 := ⟦ x ↦ ⟦⟧, φ ↦ Φ.cyc( x ) ⟧
+          morphed 𝑛·1·9 := 𝑛·1·8
         recalled 𝑛·1·3 ⇒ 𝑛·1·1( x ↦ ⟦⟧ )
         recalled 𝑛·1·1 ⇒ Φ.cyc
-        𝕄(𝑛·1·8.x):
-          morphed 𝑛·1·9 := ⟦⟧
-        looped 𝜎1 := Φ.cyc( x ↦ 𝑛·1·9 )  # 𝔻(𝑛·1·5), proven, repeats 𝑛·1·8
+        𝕄(𝑛·1·9.x):
+          morphed 𝑛·1·10 := ⟦⟧
+        looped 𝜎1 := Φ.cyc( x ↦ 𝑛·1·10 )  # 𝔻(𝑛·1·5), proven, repeats 𝑛·1·9
         𝛿·1·1 := 𝔻(𝜎1:λ)
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.arg)
-      𝑛·1·10 := 𝜎2:λ:bar  # 𝑛
-      𝕄(𝑛·1·10):
-        morphed 𝑛·1·11 := 𝜎2:λ:bar
-      𝑛·1·12 := 𝑛·1·11  # 𝕄(𝑛·1·10)
-    morphed 𝑛·0·1 := 𝜎2:λ
+      𝑛·1·11 := 𝜎2:λ:bar  # 𝑛
+      𝕄(𝑛·1·11):
+        morphed 𝑛·1·12 := 𝜎2:λ:bar
+      𝑛·1·13 := 𝑛·1·12  # 𝕄(𝑛·1·11)
+    normalized 𝑛·0·1 := 𝜎2:λ  # 𝑛·1·13.bar
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/answers-bottom-for-a-meta-that-raises.yaml b/test-resources/evaluate-packs/answers-bottom-for-a-meta-that-raises.yaml
--- a/test-resources/evaluate-packs/answers-bottom-for-a-meta-that-raises.yaml
+++ b/test-resources/evaluate-packs/answers-bottom-for-a-meta-that-raises.yaml
@@ -28,4 +28,5 @@
         morphed 𝑛·1·1 := L_throw:λ
       𝑛1·1 := L_throw:λ  # 𝕄(ξ.x)
       𝑛·1·2 := ⊥
-    morphed 𝑛·0·4 := ⊥
+    normalized 𝑛·0·4 := ⊥  # ⊥.φ
+    morphed 𝑛·0·5 := ⊥
diff --git a/test-resources/evaluate-packs/answers-its-own-sides-on-a-condition-another-join-read.yaml b/test-resources/evaluate-packs/answers-its-own-sides-on-a-condition-another-join-read.yaml
--- a/test-resources/evaluate-packs/answers-its-own-sides-on-a-condition-another-join-read.yaml
+++ b/test-resources/evaluate-packs/answers-its-own-sides-on-a-condition-another-join-read.yaml
@@ -49,10 +49,12 @@
     𝔼(L_pick):
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·1 := 5.0
-          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧
-          𝑛·1·3 := 𝑛·1·1.gt( x ↦ 0.0 )
-          𝑛·1·4 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧
+          normalized 𝑛·1·1 := ⟦ φ ↦ ∅, gt(x) ↦ L_number_gt:λ ⟧  # Φ.number
+          𝑛·1·2 := 5.0
+          𝑛·1·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧
+          normalized 𝑛·1·4 := ⟦ x ↦ ∅, λ ⤍ L_number_gt ⟧  # 𝑛·1·3.gt
+          𝑛·1·5 := 𝑛·1·2.gt( x ↦ 0.0 )
+          𝑛·1·6 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧
           𝔼(L_number_gt):
             𝔻(ξ.ρ):
               𝕄(ξ.ρ):
@@ -60,80 +62,92 @@
                 𝑛·2·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧
                 morphed 𝑛·2·3 := 𝑛·2·2
               boxed 𝑛·2·4 := 𝑛·2·3.φ
+              normalized 𝑛·2·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·2·4
               𝕄(𝑛·2·4):
-                𝑛·2·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
-                𝑛·2·6 := 40-14-00-00-00-00-00-00:Δ:φ
-                morphed 𝑛·2·7 := 𝑛·2·6
-              boxed 𝑛·2·8 := 𝑛·2·7.φ
+                normalized 𝑛·2·6 := ∅:φ  # Φ.bytes
+                𝑛·2·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
+                𝑛·2·8 := 40-14-00-00-00-00-00-00:Δ:φ
+                morphed 𝑛·2·9 := 𝑛·2·8
+              boxed 𝑛·2·10 := 𝑛·2·9.φ
+              normalized 𝑛·2·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·2·10
               𝛿·2·1 := 40-14-00-00-00-00-00-00  # 5.0
             𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)
             𝔻(ξ.x):
               𝕄(ξ.x):
-                𝑛·2·9 := 0.0
-                𝑛·2·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧
-                morphed 𝑛·2·11 := 𝑛·2·10
-              boxed 𝑛·2·12 := 𝑛·2·11.φ
-              𝕄(𝑛·2·12):
-                𝑛·2·13 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
-                𝑛·2·14 := 00-00-00-00-00-00-00-00:Δ:φ
-                morphed 𝑛·2·15 := 𝑛·2·14
-              boxed 𝑛·2·16 := 𝑛·2·15.φ
+                𝑛·2·12 := 0.0
+                𝑛·2·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧
+                morphed 𝑛·2·14 := 𝑛·2·13
+              boxed 𝑛·2·15 := 𝑛·2·14.φ
+              normalized 𝑛·2·16 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )  # 𝑛·2·15
+              𝕄(𝑛·2·15):
+                𝑛·2·17 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
+                𝑛·2·18 := 00-00-00-00-00-00-00-00:Δ:φ
+                morphed 𝑛·2·19 := 𝑛·2·18
+              boxed 𝑛·2·20 := 𝑛·2·19.φ
+              normalized 𝑛·2·21 := 00-00-00-00-00-00-00-00:Δ  # 𝑛·2·20
               𝛿·2·2 := 00-00-00-00-00-00-00-00  # 0.0
             𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)
-            𝑛·2·17 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛
-            𝕄(𝑛·2·17):
-              𝑛·2·18 := Φ.bool( φ ↦ 𝜎1:λ )
-              𝑛·2·19 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
-              morphed 𝑛·2·20 := 𝑛·2·19
-            𝑛·2·21 := 𝑛·2·20  # 𝕄(𝑛·2·17)
-            memoized 𝑛·1·4 ⇛ 𝑛·2·21
-          𝑛·1·5 := 𝑛·2·18.if( then ↦ 7.0 )
-          𝑛·1·6 := ⟦ then ↦ 7.0, else ↦ ∅, λ ⤍ L_fork ⟧
-          𝑛·1·7 := 𝑛·1·5( else ↦ 7.0 )
-          𝑛·1·8 := ⟦ then ↦ 7.0, else ↦ 7.0, λ ⤍ L_fork ⟧
-          morphed 𝑛·1·9 := 𝑛·1·8
+            𝑛·2·22 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛
+            𝕄(𝑛·2·22):
+              normalized 𝑛·2·23 := ⟦ φ ↦ ∅, if(then, else) ↦ L_fork:λ ⟧  # Φ.bool
+              𝑛·2·24 := Φ.bool( φ ↦ 𝜎1:λ )
+              𝑛·2·25 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
+              morphed 𝑛·2·26 := 𝑛·2·25
+            𝑛·2·27 := 𝑛·2·26  # 𝕄(𝑛·2·22)
+            memoized 𝑛·1·6 ⇛ 𝑛·2·27
+          normalized 𝑛·1·7 := ⟦ then ↦ ∅, else ↦ ∅, λ ⤍ L_fork ⟧  # 𝑛·2·27.if
+          𝑛·1·8 := 𝑛·2·24.if( then ↦ 7.0 )
+          𝑛·1·9 := ⟦ then ↦ 7.0, else ↦ ∅, λ ⤍ L_fork ⟧
+          𝑛·1·10 := 𝑛·1·8( else ↦ 7.0 )
+          𝑛·1·11 := ⟦ then ↦ 7.0, else ↦ 7.0, λ ⤍ L_fork ⟧
+          morphed 𝑛·1·12 := 𝑛·1·11
         𝔼(L_fork):
           𝔻(ξ.ρ):
             𝕄(ξ.ρ):
               𝑛·3·1 := Φ.bool( φ ↦ 𝜎1:λ )
               𝑛·3·2 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
-              morphed 𝑛·3·3 := 𝑛·2·21
+              morphed 𝑛·3·3 := 𝑛·2·27
             boxed 𝑛·3·4 := 𝑛·3·3.φ
+            normalized 𝑛·3·5 := 𝜎1:λ  # 𝑛·3·4
             𝛿·3·1 := 𝔻(𝜎1:λ)
           𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.ρ)
           𝕄(ξ.then):
-            𝑛·3·5 := 7.0
-            𝑛·3·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧
-            morphed 𝑛·3·7 := 𝑛·3·6
+            𝑛·3·6 := 7.0
+            𝑛·3·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧
+            morphed 𝑛·3·8 := 𝑛·3·7
           𝕄(ξ.else):
-            𝑛·3·8 := 7.0
-            𝑛·3·9 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧
-            morphed 𝑛·3·10 := 𝑛·3·9
-          𝑛·3·11 := 𝑛·3·10
-          memoized 𝑛·1·8 ⇛ 𝑛·3·11
-        boxed 𝑛·1·10 := 𝑛·3·11.φ
-        𝕄(𝑛·1·10):
-          𝑛·1·11 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )
-          𝑛·1·12 := 40-1C-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·13 := 𝑛·1·12
-        boxed 𝑛·1·14 := 𝑛·1·13.φ
+            𝑛·3·9 := 7.0
+            𝑛·3·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧
+            morphed 𝑛·3·11 := 𝑛·3·10
+          𝑛·3·12 := 𝑛·3·11
+          memoized 𝑛·1·11 ⇛ 𝑛·3·12
+        boxed 𝑛·1·13 := 𝑛·3·12.φ
+        normalized 𝑛·1·14 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )  # 𝑛·1·13
+        𝕄(𝑛·1·13):
+          𝑛·1·15 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )
+          𝑛·1·16 := 40-1C-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·17 := 𝑛·1·16
+        boxed 𝑛·1·18 := 𝑛·1·17.φ
+        normalized 𝑛·1·19 := 40-1C-00-00-00-00-00-00:Δ  # 𝑛·1·18
         𝛿·1·1 := 40-1C-00-00-00-00-00-00  # 7.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.x)
       𝕄(ξ.y):
-        𝑛·1·15 := Φ.number( φ ↦ 𝑛·2·5 )
-        𝑛·1·16 := ⟦ φ ↦ 𝑛·2·5, gt(x) ↦ L_number_gt:λ ⟧
-        𝑛·1·17 := 𝑛·1·15.gt( x ↦ 𝑛·2·9 )
-        𝑛·1·18 := ⟦ x ↦ 𝑛·2·9, λ ⤍ L_number_gt ⟧
+        𝑛·1·20 := Φ.number( φ ↦ 𝑛·2·7 )
+        𝑛·1·21 := ⟦ φ ↦ 𝑛·2·7, gt(x) ↦ L_number_gt:λ ⟧
+        normalized 𝑛·1·22 := ⟦ x ↦ ∅, λ ⤍ L_number_gt ⟧  # 𝑛·1·21.gt
+        𝑛·1·23 := 𝑛·1·20.gt( x ↦ 𝑛·2·12 )
+        𝑛·1·24 := ⟦ x ↦ 𝑛·2·12, λ ⤍ L_number_gt ⟧
         𝔼(L_number_gt):
-          recalled 𝑛·1·4 ⇒ 𝑛·2·21
+          recalled 𝑛·1·6 ⇒ 𝑛·2·27
           𝑛·4·1 := 𝑛·3·1  # 𝑛
-          𝑛·4·2 := 𝑛·2·21  # 𝕄(𝑛·4·1)
-        𝑛·1·19 := 𝑛·3·1.if( then ↦ 70.0 )
-        𝑛·1·20 := ⟦ then ↦ 70.0, else ↦ ∅, λ ⤍ L_fork ⟧
-        𝑛·1·21 := 𝑛·1·19( else ↦ 70.0 )
-        𝑛·1·22 := ⟦ then ↦ 70.0, else ↦ 70.0, λ ⤍ L_fork ⟧
-        morphed 𝑛·1·23 := 𝑛·1·22
-      𝑛1·1 := 𝑛·1·22  # 𝕄(ξ.y)
+          𝑛·4·2 := 𝑛·2·27  # 𝕄(𝑛·4·1)
+        normalized 𝑛·1·25 := ⟦ then ↦ ∅, else ↦ ∅, λ ⤍ L_fork ⟧  # 𝑛·4·2.if
+        𝑛·1·26 := 𝑛·3·1.if( then ↦ 70.0 )
+        𝑛·1·27 := ⟦ then ↦ 70.0, else ↦ ∅, λ ⤍ L_fork ⟧
+        𝑛·1·28 := 𝑛·1·26( else ↦ 70.0 )
+        𝑛·1·29 := ⟦ then ↦ 70.0, else ↦ 70.0, λ ⤍ L_fork ⟧
+        morphed 𝑛·1·30 := 𝑛·1·29
+      𝑛1·1 := 𝑛·1·29  # 𝕄(ξ.y)
       𝔼(L_fork):  # 𝔼(𝑛1)
         𝔻(ξ.ρ):
           𝕄(ξ.ρ):
@@ -152,14 +166,15 @@
           𝑛·5·9 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-51-80-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ ⟧
           morphed 𝑛·5·10 := 𝑛·5·9
         𝑛·5·11 := 𝑛·5·10
-        memoized 𝑛·1·22 ⇛ 𝑛·5·11
+        memoized 𝑛·1·29 ⇛ 𝑛·5·11
       𝑛2·1 := 𝑛·5·11  # 𝔼(𝑛1)
-      𝑛·1·24 := 𝑛·5·11  # 𝑛
-      𝕄(𝑛·1·24):
-        morphed 𝑛·1·25 := 𝑛·5·11
-      𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·24)
-      remembered 𝑛·1·26 ≡ 𝑛·0·5
-      memoized 𝑛·0·5 ⇛ 𝑛·1·26
-    𝑛·0·6 := Φ.bytes( φ ↦ 40-51-80-00-00-00-00-00:Δ )
-    𝑛·0·7 := 40-51-80-00-00-00-00-00:Δ:φ
-    morphed 𝑛·0·8 := 𝑛·0·7
+      𝑛·1·31 := 𝑛·5·11  # 𝑛
+      𝕄(𝑛·1·31):
+        morphed 𝑛·1·32 := 𝑛·5·11
+      𝑛·1·33 := 𝑛·1·32  # 𝕄(𝑛·1·31)
+      remembered 𝑛·1·33 ≡ 𝑛·0·5
+      memoized 𝑛·0·5 ⇛ 𝑛·1·33
+    normalized 𝑛·0·6 := Φ.bytes( φ ↦ 40-51-80-00-00-00-00-00:Δ )  # 𝑛·1·33.φ
+    𝑛·0·7 := Φ.bytes( φ ↦ 40-51-80-00-00-00-00-00:Δ )
+    𝑛·0·8 := 40-51-80-00-00-00-00-00:Δ:φ
+    morphed 𝑛·0·9 := 𝑛·0·8
diff --git a/test-resources/evaluate-packs/answers-the-same-dataization-loop-under-partial.yaml b/test-resources/evaluate-packs/answers-the-same-dataization-loop-under-partial.yaml
--- a/test-resources/evaluate-packs/answers-the-same-dataization-loop-under-partial.yaml
+++ b/test-resources/evaluate-packs/answers-the-same-dataization-loop-under-partial.yaml
@@ -30,19 +30,21 @@
           remembered 𝑛·1·3 ≡ 𝑛·1·1( x ↦ ⟦⟧ )
           morphed 𝑛·1·4 := 𝑛·1·3
         boxed 𝑛·1·5 := 𝑛·1·4.φ
+        normalized 𝑛·1·6 := Φ.cyc( ⟦⟧ )  # 𝑛·1·5
         𝕄(𝑛·1·5):
-          𝑛·1·6 := Φ.cyc( x ↦ ⟦⟧ )
-          𝑛·1·7 := ⟦ x ↦ ⟦⟧, φ ↦ Φ.cyc( x ) ⟧
-          morphed 𝑛·1·8 := 𝑛·1·7
+          𝑛·1·7 := Φ.cyc( x ↦ ⟦⟧ )
+          𝑛·1·8 := ⟦ x ↦ ⟦⟧, φ ↦ Φ.cyc( x ) ⟧
+          morphed 𝑛·1·9 := 𝑛·1·8
         recalled 𝑛·1·3 ⇒ 𝑛·1·1( x ↦ ⟦⟧ )
         recalled 𝑛·1·1 ⇒ Φ.cyc
-        𝕄(𝑛·1·8.x):
-          morphed 𝑛·1·9 := ⟦⟧
-        looped 𝜎1 := Φ.cyc( x ↦ 𝑛·1·9 )  # 𝔻(𝑛·1·5), proven, repeats 𝑛·1·8
+        𝕄(𝑛·1·9.x):
+          morphed 𝑛·1·10 := ⟦⟧
+        looped 𝜎1 := Φ.cyc( x ↦ 𝑛·1·10 )  # 𝔻(𝑛·1·5), proven, repeats 𝑛·1·9
         𝛿·1·1 := 𝔻(𝜎1:λ)
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.arg)
-      𝑛·1·10 := 𝜎2:λ:bar  # 𝑛
-      𝕄(𝑛·1·10):
-        morphed 𝑛·1·11 := 𝜎2:λ:bar
-      𝑛·1·12 := 𝑛·1·11  # 𝕄(𝑛·1·10)
-    morphed 𝑛·0·1 := 𝜎2:λ
+      𝑛·1·11 := 𝜎2:λ:bar  # 𝑛
+      𝕄(𝑛·1·11):
+        morphed 𝑛·1·12 := 𝜎2:λ:bar
+      𝑛·1·13 := 𝑛·1·12  # 𝕄(𝑛·1·11)
+    normalized 𝑛·0·1 := 𝜎2:λ  # 𝑛·1·13.bar
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/answers-the-same-under-acyclic.yaml b/test-resources/evaluate-packs/answers-the-same-under-acyclic.yaml
--- a/test-resources/evaluate-packs/answers-the-same-under-acyclic.yaml
+++ b/test-resources/evaluate-packs/answers-the-same-under-acyclic.yaml
@@ -21,10 +21,12 @@
 result: '𝜎1:λ'
 protocol: |
   𝕄(Φ.φ):
-    𝑛·0·1 := 5.0
-    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0 )
-    𝑛·0·4 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧
+    normalized 𝑛·0·1 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number
+    𝑛·0·2 := 5.0
+    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+    normalized 𝑛·0·4 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·3.plus
+    𝑛·0·5 := 𝑛·0·2.plus( x ↦ 6.0 )
+    𝑛·0·6 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -32,30 +34,36 @@
           𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·1·3 := 𝑛·1·2
         boxed 𝑛·1·4 := 𝑛·1·3.φ
+        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4
         𝕄(𝑛·1·4):
-          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
-          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes
+          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
+          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·9 := 𝑛·1·8
+        boxed 𝑛·1·10 := 𝑛·1·9.φ
+        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10
         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·9 := 6.0
-          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·1·11 := 𝑛·1·10
-        boxed 𝑛·1·12 := 𝑛·1·11.φ
-        𝕄(𝑛·1·12):
-          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
-          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·15 := 𝑛·1·14
-        boxed 𝑛·1·16 := 𝑛·1·15.φ
+          𝑛·1·12 := 6.0
+          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·1·14 := 𝑛·1·13
+        boxed 𝑛·1·15 := 𝑛·1·14.φ
+        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )  # 𝑛·1·15
+        𝕄(𝑛·1·15):
+          𝑛·1·17 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
+          𝑛·1·18 := 40-18-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·19 := 𝑛·1·18
+        boxed 𝑛·1·20 := 𝑛·1·19.φ
+        normalized 𝑛·1·21 := 40-18-00-00-00-00-00-00:Δ  # 𝑛·1·20
         𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0
       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)
-      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛
-      𝕄(𝑛·1·17):
-        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )
-        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
-        morphed 𝑛·1·20 := 𝑛·1·19
-      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)
-    morphed 𝑛·0·5 := 𝜎1:λ
+      𝑛·1·22 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛
+      𝕄(𝑛·1·22):
+        𝑛·1·23 := Φ.number( φ ↦ 𝜎1:λ )
+        𝑛·1·24 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
+        morphed 𝑛·1·25 := 𝑛·1·24
+      𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·22)
+    normalized 𝑛·0·7 := 𝜎1:λ  # 𝑛·1·26.φ
+    morphed 𝑛·0·8 := 𝑛·0·7
diff --git a/test-resources/evaluate-packs/binds-a-copy-whose-phi-repeats-the-formation-fired-as-it-is.yaml b/test-resources/evaluate-packs/binds-a-copy-whose-phi-repeats-the-formation-fired-as-it-is.yaml
new file mode 100644
--- /dev/null
+++ b/test-resources/evaluate-packs/binds-a-copy-whose-phi-repeats-the-formation-fired-as-it-is.yaml
@@ -0,0 +1,79 @@
+# SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com
+# SPDX-License-Identifier: MIT
+---
+# yamllint disable rule:line-length
+# The copy 'down( i ↦ 𝜎2 )' is the left side of the fork the φ of 'down' calls,
+# so its own φ comes to the very formation that is being fired. Its argument is
+# a bare symbol, but a 'defer' line binds such a copy as it is under
+# '--acyclic' (#2206): a symbol standing for the call would hide the recursion
+# from the cut, and the 'cast' line would then give that symbol the 'not' of
+# 'Φ.no', which nobody checked. The fork fabricates a formation of both sides,
+# and the fork under its 'not' is the one that goes on into the copy.
+symbolic: |
+  - λ: L_fork
+    dataize:
+      𝛿1: $.on🌵
+    morph:
+      𝑛1: $.left🌵
+      𝑛2: $.right🌵
+    symbolize:
+      𝑛3: 𝑛1
+      𝑛4: 𝑛2
+    defer:
+      𝑛5: 𝑛3
+      𝑛6: 𝑛4
+    cast:
+      𝑛7: 𝑛5
+      𝑛8: 𝑛6
+    join:
+      'on': 𝛿1
+      left: 𝑛7
+      right: 𝑛8
+      otherwise: L_fork
+location: 'Q.y'
+acyclic: plausible
+partial: true
+input: >
+  ⟦ no ↦ ⟦ φ ↦ 00-:Δ, not ↦ FF-:Δ ⟧,
+    fork(on🌵, left🌵, right🌵) ↦ ⟦ λ ⤍ L_fork ⟧,
+    down(i) ↦ ⟦ φ ↦ Φ.fork( 𝜎1:λ, Φ.down( i ↦ 𝜎2:λ ), Φ.no ) ⟧,
+    y ↦ Φ.down( i ↦ 𝜎3:λ ).not ⟧
+result: '⟦ λ ⤍ L_fork, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.not, right🌵 ↦ ρ.right🌵.not ⟧'
+protocol: |
+  𝕄(Φ.y):
+    remembered 𝑛·0·1 ≡ Φ.down  # ⟦ i ↦ ∅, φ ↦ Φ.fork( 𝜎1:λ, Φ.down( i ↦ 𝜎2:λ ), Φ.no ) ⟧
+    𝑛·0·2 := Φ.down( i ↦ 𝜎3:λ )
+    𝑛·0·3 := ⟦ i ↦ 𝜎3:λ, φ ↦ Φ.fork( 𝜎1:λ, Φ.down( i ↦ 𝜎2:λ ), Φ.no ) ⟧
+    remembered 𝑛·0·3 ≡ 𝑛·0·1( i ↦ 𝜎3:λ )
+    normalized 𝑛·0·4 := Φ.fork( 𝜎1:λ, Φ.down( i ↦ 𝜎2:λ ), Φ.no ).not  # 𝑛·0·3.φ.not
+    remembered 𝑛·0·5 ≡ Φ.fork  # ⟦ on🌵 ↦ ∅, left🌵 ↦ ∅, right🌵 ↦ ∅, λ ⤍ L_fork ⟧
+    𝑛·0·6 := Φ.fork( on🌵 ↦ 𝜎1:λ )
+    𝑛·0·7 := ⟦ on🌵 ↦ 𝜎1:λ, left🌵 ↦ ∅, right🌵 ↦ ∅, λ ⤍ L_fork ⟧
+    remembered 𝑛·0·7 ≡ 𝑛·0·5( on🌵 ↦ 𝜎1:λ )
+    𝑛·0·8 := 𝑛·0·6( left🌵 ↦ Φ.down( i ↦ 𝜎2:λ ) )
+    𝑛·0·9 := ⟦ on🌵 ↦ 𝜎1:λ, left🌵 ↦ Φ.down( i ↦ 𝜎2:λ ), right🌵 ↦ ∅, λ ⤍ L_fork ⟧
+    remembered 𝑛·0·9 ≡ 𝑛·0·7( left🌵 ↦ Φ.down( i ↦ 𝜎2:λ ) )
+    𝑛·0·10 := 𝑛·0·8( right🌵 ↦ Φ.no )
+    𝑛·0·11 := ⟦ on🌵 ↦ 𝜎1:λ, left🌵 ↦ Φ.down( i ↦ 𝜎2:λ ), right🌵 ↦ Φ.no, λ ⤍ L_fork ⟧
+    remembered 𝑛·0·11 ≡ 𝑛·0·9( right🌵 ↦ Φ.no )
+    𝔼(L_fork):
+      𝔻(ξ.on🌵):
+        𝛿·1·1 := 𝔻(𝜎1:λ)
+      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.on🌵)
+      𝕄(ξ.left🌵):
+        𝑛·1·1 := Φ.down( i ↦ 𝜎2:λ )
+        𝑛·1·2 := ⟦ i ↦ 𝜎2:λ, φ ↦ Φ.fork( 𝜎1:λ, Φ.down( i ↦ 𝜎2:λ ), Φ.no ) ⟧
+        remembered 𝑛·1·2 ≡ 𝑛·0·1( i ↦ 𝜎2:λ )
+        morphed 𝑛·1·3 := 𝑛·1·2
+      𝑛1·1 := 𝑛·1·3  # 𝕄(ξ.left🌵)
+      𝕄(ξ.right🌵):
+        remembered 𝑛·1·4 ≡ Φ.no  # ⟦ φ ↦ 00-:Δ, not ↦ FF-:Δ ⟧
+        morphed 𝑛·1·5 := 𝑛·1·4
+      𝑛2·1 := 𝑛·1·5  # 𝕄(ξ.right🌵)
+      symbolized 𝜎4 := 00-
+      𝑛4·1 := ⟦ φ ↦ 𝜎4:λ, not ↦ FF-:Δ ⟧  # symbolize(𝑛2)
+      fabricated 𝑛·1·6 := 𝑛·1·3 and 𝑛4·1  # ⟦ left🌵 ↦ 𝑛·1·3, right🌵 ↦ 𝑛4·1, i ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.i, right🌵 ↦ ρ.right🌵.i ⟧, φ ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧, not ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.not, right🌵 ↦ ρ.right🌵.not ⟧ ⟧
+      remembered 𝑛·1·6 ≡ 𝑛·0·11
+      memoized 𝑛·0·11 ⇛ 𝑛·1·6
+    remembered 𝑛·0·12 ≡ 𝑛·1·6.not  # ⟦ λ ⤍ L_fork, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.not, right🌵 ↦ ρ.right🌵.not ⟧
+    morphed 𝑛·0·13 := 𝑛·0·12
diff --git a/test-resources/evaluate-packs/copies-a-call-written-twice-once.yaml b/test-resources/evaluate-packs/copies-a-call-written-twice-once.yaml
--- a/test-resources/evaluate-packs/copies-a-call-written-twice-once.yaml
+++ b/test-resources/evaluate-packs/copies-a-call-written-twice-once.yaml
@@ -14,4 +14,5 @@
     𝑛·0·1 := ⟦ x ↦ ∅, φ ↦ x ⟧( x ↦ 𝜎1:λ )
     𝑛·0·2 := ⟦ x ↦ 𝜎1:λ, φ ↦ x ⟧
     recalled 𝑛·0·1 ⇒ 𝑛·0·2
-    morphed 𝑛·0·3 := 𝑛·0·2
+    normalized 𝑛·0·3 := ⟦ a ↦ 𝑛·0·2, b ↦ 𝑛·0·2 ⟧  # Φ.c
+    morphed 𝑛·0·4 := 𝑛·0·2
diff --git a/test-resources/evaluate-packs/cuts-a-loop-met-at-a-dispatch-off-an-atom.yaml b/test-resources/evaluate-packs/cuts-a-loop-met-at-a-dispatch-off-an-atom.yaml
--- a/test-resources/evaluate-packs/cuts-a-loop-met-at-a-dispatch-off-an-atom.yaml
+++ b/test-resources/evaluate-packs/cuts-a-loop-met-at-a-dispatch-off-an-atom.yaml
@@ -28,10 +28,11 @@
 result: '𝜎3:λ.q'
 protocol: |
   𝕄(Φ.y):
-    remembered 𝑛·0·1 ≡ Φ.times  # ⟦ b ↦ ∅, λ ⤍ L_times ⟧
-    𝑛·0·2 := Φ.times( b ↦ Φ.dataized( Φ.x.q ) )
-    𝑛·0·3 := ⟦ b ↦ Φ.dataized( Φ.x.q ), λ ⤍ L_times ⟧
-    remembered 𝑛·0·3 ≡ 𝑛·0·1( b ↦ Φ.dataized( Φ.x.q ) )
+    normalized 𝑛·0·1 := Φ.times( Φ.dataized( Φ.x.q ) )  # Φ.x
+    remembered 𝑛·0·2 ≡ Φ.times  # ⟦ b ↦ ∅, λ ⤍ L_times ⟧
+    𝑛·0·3 := Φ.times( b ↦ Φ.dataized( Φ.x.q ) )
+    𝑛·0·4 := ⟦ b ↦ Φ.dataized( Φ.x.q ), λ ⤍ L_times ⟧
+    remembered 𝑛·0·4 ≡ 𝑛·0·2( b ↦ Φ.dataized( Φ.x.q ) )
     𝔼(L_times):
       𝔻(ξ.b):
         𝕄(ξ.b):
@@ -43,18 +44,19 @@
         𝔼(L_dataized):
           𝔻(ξ.target):
             𝕄(ξ.target):
-              𝑛·2·1 := Φ.times( b ↦ Φ.dataized( Φ.x.q ) )
-              𝑛·2·2 := ⟦ b ↦ Φ.dataized( Φ.x.q ), λ ⤍ L_times ⟧
-              recalled 𝑛·0·3 ⇒ 𝑛·0·1( b ↦ Φ.dataized( Φ.x.q ) )
-              recalled 𝑛·0·1 ⇒ Φ.times
-              looped 𝜎1 := 𝑛·2·1.q  # plausible, repeats 𝑛·2·2
-              morphed 𝑛·2·3 := 𝜎1:λ
+              normalized 𝑛·2·1 := Φ.times( Φ.dataized( Φ.x.q ) )  # Φ.x
+              𝑛·2·2 := Φ.times( b ↦ Φ.dataized( Φ.x.q ) )
+              𝑛·2·3 := ⟦ b ↦ Φ.dataized( Φ.x.q ), λ ⤍ L_times ⟧
+              recalled 𝑛·0·4 ⇒ 𝑛·0·2( b ↦ Φ.dataized( Φ.x.q ) )
+              recalled 𝑛·0·2 ⇒ Φ.times
+              looped 𝜎1 := 𝑛·2·2.q  # plausible, repeats 𝑛·2·3
+              morphed 𝑛·2·4 := 𝜎1:λ
             𝛿·2·1 := 𝔻(𝜎1:λ)
           𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.target)
-          𝑛·2·4 := 𝜎2:λ  # 𝑛
-          𝕄(𝑛·2·4):
-            morphed 𝑛·2·5 := 𝜎2:λ
-          𝑛·2·6 := 𝑛·2·5  # 𝕄(𝑛·2·4)
+          𝑛·2·5 := 𝜎2:λ  # 𝑛
+          𝕄(𝑛·2·5):
+            morphed 𝑛·2·6 := 𝜎2:λ
+          𝑛·2·7 := 𝑛·2·6  # 𝕄(𝑛·2·5)
           memoized 𝑛·1·3 ⇛ 𝜎2:λ
         𝛿·1·1 := 𝔻(𝜎2:λ)
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.b)
@@ -62,5 +64,5 @@
       𝕄(𝑛·1·5):
         morphed 𝑛·1·6 := 𝜎3:λ
       𝑛·1·7 := 𝑛·1·6  # 𝕄(𝑛·1·5)
-      memoized 𝑛·2·2 ⇛ 𝜎3:λ
+      memoized 𝑛·2·3 ⇛ 𝜎3:λ
     unanswered 𝜎3  # 𝕄(𝜎3:λ)
diff --git a/test-resources/evaluate-packs/dataizes-what-a-morph-operand-of-the-same-entry-brought-down.yaml b/test-resources/evaluate-packs/dataizes-what-a-morph-operand-of-the-same-entry-brought-down.yaml
--- a/test-resources/evaluate-packs/dataizes-what-a-morph-operand-of-the-same-entry-brought-down.yaml
+++ b/test-resources/evaluate-packs/dataizes-what-a-morph-operand-of-the-same-entry-brought-down.yaml
@@ -28,13 +28,15 @@
         𝛿·1·1 := 𝔻(𝜎1:λ)
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.n)
       𝕄(ξ.v.φ):
-        morphed 𝑛·1·1 := 2A-:Δ
+        normalized 𝑛·1·1 := 2A-:Δ  # Φ.t
+        morphed 𝑛·1·2 := 2A-:Δ
       𝑛1·1 := 2A-:Δ  # 𝕄(ξ.v.φ)
       𝔻(𝑛1):
         𝛿·1·2 := 2A-
       𝛿2·1 := 𝛿·1·2  # 𝔻(𝑛1)
-      𝑛·1·2 := 𝜎2:λ:φ  # 𝑛
-      𝕄(𝑛·1·2):
-        morphed 𝑛·1·3 := 𝜎2:λ:φ
-      𝑛·1·4 := 𝑛·1·3  # 𝕄(𝑛·1·2)
-    morphed 𝑛·0·1 := 𝜎2:λ
+      𝑛·1·3 := 𝜎2:λ:φ  # 𝑛
+      𝕄(𝑛·1·3):
+        morphed 𝑛·1·4 := 𝜎2:λ:φ
+      𝑛·1·5 := 𝑛·1·4  # 𝕄(𝑛·1·3)
+    normalized 𝑛·0·1 := 𝜎2:λ  # 𝑛·1·5.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/defers-a-copy-a-join-passed-through-stay-and-symbolize.yaml b/test-resources/evaluate-packs/defers-a-copy-a-join-passed-through-stay-and-symbolize.yaml
--- a/test-resources/evaluate-packs/defers-a-copy-a-join-passed-through-stay-and-symbolize.yaml
+++ b/test-resources/evaluate-packs/defers-a-copy-a-join-passed-through-stay-and-symbolize.yaml
@@ -67,8 +67,10 @@
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.x)
       𝑛·1·1 := Φ.num( φ ↦ 𝜎6:λ )  # 𝑛
       𝕄(𝑛·1·1):
-        𝑛·1·2 := Φ.num( φ ↦ 𝜎6:λ )
-        𝑛·1·3 := 𝜎6:λ:φ
-        morphed 𝑛·1·4 := 𝑛·1·3
-      𝑛·1·5 := 𝑛·1·4  # 𝕄(𝑛·1·1)
-    morphed 𝑛·0·1 := 𝜎6:λ
+        normalized 𝑛·1·2 := ∅:φ  # Φ.num
+        𝑛·1·3 := Φ.num( φ ↦ 𝜎6:λ )
+        𝑛·1·4 := 𝜎6:λ:φ
+        morphed 𝑛·1·5 := 𝑛·1·4
+      𝑛·1·6 := 𝑛·1·5  # 𝕄(𝑛·1·1)
+    normalized 𝑛·0·1 := 𝜎6:λ  # 𝑛·1·6.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/defers-a-copy-whose-phi-reads-nothing-of-its-own.yaml b/test-resources/evaluate-packs/defers-a-copy-whose-phi-reads-nothing-of-its-own.yaml
--- a/test-resources/evaluate-packs/defers-a-copy-whose-phi-reads-nothing-of-its-own.yaml
+++ b/test-resources/evaluate-packs/defers-a-copy-whose-phi-reads-nothing-of-its-own.yaml
@@ -34,4 +34,5 @@
       𝕄(𝑛·1·5):
         morphed 𝑛·1·6 := 𝜎2:λ:φ
       𝑛·1·7 := 𝑛·1·6  # 𝕄(𝑛·1·5)
-    morphed 𝑛·0·1 := 𝜎2:λ
+    normalized 𝑛·0·1 := 𝜎2:λ  # 𝑛·1·7.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/diverges-on-two-sides-that-do-not-join.yaml b/test-resources/evaluate-packs/diverges-on-two-sides-that-do-not-join.yaml
--- a/test-resources/evaluate-packs/diverges-on-two-sides-that-do-not-join.yaml
+++ b/test-resources/evaluate-packs/diverges-on-two-sides-that-do-not-join.yaml
@@ -39,10 +39,12 @@
 fails: "No entry of --symbolic answers the λ function 'L_fork'"
 protocol: |
   𝕄(Φ.φ):
-    𝑛·0·1 := 5.0
-    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-    𝑛·0·3 := 𝑛·0·1.gt( x ↦ 0.0 )
-    𝑛·0·4 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧
+    normalized 𝑛·0·1 := ⟦ φ ↦ ∅, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number
+    𝑛·0·2 := 5.0
+    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+    normalized 𝑛·0·4 := ⟦ x ↦ ∅, λ ⤍ L_number_gt ⟧  # 𝑛·0·3.gt
+    𝑛·0·5 := 𝑛·0·2.gt( x ↦ 0.0 )
+    𝑛·0·6 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧
     𝔼(L_number_gt):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -50,55 +52,65 @@
           𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·1·3 := 𝑛·1·2
         boxed 𝑛·1·4 := 𝑛·1·3.φ
+        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4
         𝕄(𝑛·1·4):
-          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
-          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes
+          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
+          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·9 := 𝑛·1·8
+        boxed 𝑛·1·10 := 𝑛·1·9.φ
+        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10
         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·9 := 0.0
-          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·1·11 := 𝑛·1·10
-        boxed 𝑛·1·12 := 𝑛·1·11.φ
-        𝕄(𝑛·1·12):
-          𝑛·1·13 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
-          𝑛·1·14 := 00-00-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·15 := 𝑛·1·14
-        boxed 𝑛·1·16 := 𝑛·1·15.φ
+          𝑛·1·12 := 0.0
+          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·1·14 := 𝑛·1·13
+        boxed 𝑛·1·15 := 𝑛·1·14.φ
+        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )  # 𝑛·1·15
+        𝕄(𝑛·1·15):
+          𝑛·1·17 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
+          𝑛·1·18 := 00-00-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·19 := 𝑛·1·18
+        boxed 𝑛·1·20 := 𝑛·1·19.φ
+        normalized 𝑛·1·21 := 00-00-00-00-00-00-00-00:Δ  # 𝑛·1·20
         𝛿·1·2 := 00-00-00-00-00-00-00-00  # 0.0
       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)
-      𝑛·1·17 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛
-      𝕄(𝑛·1·17):
-        𝑛·1·18 := Φ.bool( φ ↦ 𝜎1:λ )
-        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
-        morphed 𝑛·1·20 := 𝑛·1·19
-      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)
-    𝑛·0·5 := 𝑛·1·18.if( then ↦ 1.0.plus( 2.0 ) )
-    𝑛·0·6 := ⟦ then ↦ 1.0.plus( 2.0 ), else ↦ ∅, λ ⤍ L_fork ⟧
-    𝑛·0·7 := 𝑛·0·5( else ↦ 3.0.plus( 4.0 ) )
-    𝑛·0·8 := ⟦ then ↦ 1.0.plus( 2.0 ), else ↦ 3.0.plus( 4.0 ), λ ⤍ L_fork ⟧
+      𝑛·1·22 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛
+      𝕄(𝑛·1·22):
+        normalized 𝑛·1·23 := ⟦ φ ↦ ∅, if(then, else) ↦ L_fork:λ ⟧  # Φ.bool
+        𝑛·1·24 := Φ.bool( φ ↦ 𝜎1:λ )
+        𝑛·1·25 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
+        morphed 𝑛·1·26 := 𝑛·1·25
+      𝑛·1·27 := 𝑛·1·26  # 𝕄(𝑛·1·22)
+    normalized 𝑛·0·7 := ⟦ then ↦ ∅, else ↦ ∅, λ ⤍ L_fork ⟧  # 𝑛·1·27.if
+    𝑛·0·8 := 𝑛·1·24.if( then ↦ 1.0.plus( 2.0 ) )
+    𝑛·0·9 := ⟦ then ↦ 1.0.plus( 2.0 ), else ↦ ∅, λ ⤍ L_fork ⟧
+    𝑛·0·10 := 𝑛·0·8( else ↦ 3.0.plus( 4.0 ) )
+    𝑛·0·11 := ⟦ then ↦ 1.0.plus( 2.0 ), else ↦ 3.0.plus( 4.0 ), λ ⤍ L_fork ⟧
     𝔼(L_fork):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
           𝑛·2·1 := Φ.bool( φ ↦ 𝜎1:λ )
           𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
-          morphed 𝑛·2·3 := 𝑛·1·21
+          morphed 𝑛·2·3 := 𝑛·1·27
         boxed 𝑛·2·4 := 𝑛·2·3.φ
+        normalized 𝑛·2·5 := 𝜎1:λ  # 𝑛·2·4
         𝛿·2·1 := 𝔻(𝜎1:λ)
       𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)
       𝕄(ξ.then):
-        𝑛·2·5 := 1.0
-        𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        𝑛·2·7 := 𝑛·2·5.plus( x ↦ 2.0 )
-        𝑛·2·8 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧
-        morphed 𝑛·2·9 := 𝑛·2·8
+        𝑛·2·6 := 1.0
+        𝑛·2·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        normalized 𝑛·2·8 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·2·7.plus
+        𝑛·2·9 := 𝑛·2·6.plus( x ↦ 2.0 )
+        𝑛·2·10 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧
+        morphed 𝑛·2·11 := 𝑛·2·10
       𝕄(ξ.else):
-        𝑛·2·10 := 3.0
-        𝑛·2·11 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        𝑛·2·12 := 𝑛·2·10.plus( x ↦ 4.0 )
-        𝑛·2·13 := ⟦ x ↦ 4.0, λ ⤍ L_number_plus ⟧
-        morphed 𝑛·2·14 := 𝑛·2·13
-      diverged 𝑛·2·8 vs 𝑛·2·13  # cannot join: at .ρ the left side has ρ ↦ 𝑛·2·5 and the right side has ρ ↦ 𝑛·2·10; cannot fabricate: the join names no otherwise
+        𝑛·2·12 := 3.0
+        𝑛·2·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        normalized 𝑛·2·14 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·2·13.plus
+        𝑛·2·15 := 𝑛·2·12.plus( x ↦ 4.0 )
+        𝑛·2·16 := ⟦ x ↦ 4.0, λ ⤍ L_number_plus ⟧
+        morphed 𝑛·2·17 := 𝑛·2·16
+      diverged 𝑛·2·10 vs 𝑛·2·16  # cannot join: at .ρ the left side has ρ ↦ 𝑛·2·6 and the right side has ρ ↦ 𝑛·2·12; cannot fabricate: the join names no otherwise
diff --git a/test-resources/evaluate-packs/fabricates-a-formation-holding-the-bytes-its-condition-came-down-to.yaml b/test-resources/evaluate-packs/fabricates-a-formation-holding-the-bytes-its-condition-came-down-to.yaml
--- a/test-resources/evaluate-packs/fabricates-a-formation-holding-the-bytes-its-condition-came-down-to.yaml
+++ b/test-resources/evaluate-packs/fabricates-a-formation-holding-the-bytes-its-condition-came-down-to.yaml
@@ -30,4 +30,5 @@
       𝕄(ξ.b):
         morphed 𝑛·1·2 := ⟦ φ ↦ Φ.ol, pe ↦ Φ.ki ⟧
       fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛·1·2  # ⟦ left🌵 ↦ 𝑛·1·1, right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 3A-:Δ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧, pe ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 3A-:Δ, left🌵 ↦ ρ.left🌵.pe, right🌵 ↦ ρ.right🌵.pe ⟧ ⟧
-    morphed 𝑛·0·1 := ⟦ λ ⤍ L_join, on🌵 ↦ 3A-:Δ, left🌵 ↦ ρ.left🌵.pe, right🌵 ↦ ρ.right🌵.pe ⟧
+    normalized 𝑛·0·1 := ⟦ λ ⤍ L_join, on🌵 ↦ 3A-:Δ, left🌵 ↦ ρ.left🌵.pe, right🌵 ↦ ρ.right🌵.pe ⟧  # 𝑛·1·3.pe
+    morphed 𝑛·0·2 := ⟦ λ ⤍ L_join, on🌵 ↦ 3A-:Δ, left🌵 ↦ ρ.left🌵.pe, right🌵 ↦ ρ.right🌵.pe ⟧
diff --git a/test-resources/evaluate-packs/fabricates-a-formation-holding-the-symbol-a-path-of-its-condition-reaches.yaml b/test-resources/evaluate-packs/fabricates-a-formation-holding-the-symbol-a-path-of-its-condition-reaches.yaml
--- a/test-resources/evaluate-packs/fabricates-a-formation-holding-the-symbol-a-path-of-its-condition-reaches.yaml
+++ b/test-resources/evaluate-packs/fabricates-a-formation-holding-the-symbol-a-path-of-its-condition-reaches.yaml
@@ -26,4 +26,5 @@
       𝕄(ξ.right🌵):
         morphed 𝑛·1·2 := ⟦ φ ↦ Φ.ma, tu ↦ Φ.ip ⟧
       fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛·1·2  # ⟦ left🌵 ↦ 𝑛·1·1, right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎5:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧, tu ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎5:λ, left🌵 ↦ ρ.left🌵.tu, right🌵 ↦ ρ.right🌵.tu ⟧ ⟧
-    morphed 𝑛·0·1 := ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎5:λ, left🌵 ↦ ρ.left🌵.tu, right🌵 ↦ ρ.right🌵.tu ⟧
+    normalized 𝑛·0·1 := ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎5:λ, left🌵 ↦ ρ.left🌵.tu, right🌵 ↦ ρ.right🌵.tu ⟧  # 𝑛·1·3.tu
+    morphed 𝑛·0·2 := ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎5:λ, left🌵 ↦ ρ.left🌵.tu, right🌵 ↦ ρ.right🌵.tu ⟧
diff --git a/test-resources/evaluate-packs/fabricates-a-formation-of-two-sides-of-different-shapes.yaml b/test-resources/evaluate-packs/fabricates-a-formation-of-two-sides-of-different-shapes.yaml
--- a/test-resources/evaluate-packs/fabricates-a-formation-of-two-sides-of-different-shapes.yaml
+++ b/test-resources/evaluate-packs/fabricates-a-formation-of-two-sides-of-different-shapes.yaml
@@ -36,4 +36,5 @@
       𝕄(ξ.b):
         morphed 𝑛·1·2 := Φ.zu:φ
       fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛·1·2  # ⟦ left🌵 ↦ 𝑛·1·1, right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧, ke ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke, right🌵 ↦ ρ.right🌵.ke ⟧ ⟧
-    morphed 𝑛·0·1 := ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke, right🌵 ↦ ρ.right🌵.ke ⟧
+    normalized 𝑛·0·1 := ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke, right🌵 ↦ ρ.right🌵.ke ⟧  # 𝑛·1·3.ke
+    morphed 𝑛·0·2 := ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke, right🌵 ↦ ρ.right🌵.ke ⟧
diff --git a/test-resources/evaluate-packs/fails-on-an-operand-that-reaches-the-terminator.yaml b/test-resources/evaluate-packs/fails-on-an-operand-that-reaches-the-terminator.yaml
--- a/test-resources/evaluate-packs/fails-on-an-operand-that-reaches-the-terminator.yaml
+++ b/test-resources/evaluate-packs/fails-on-an-operand-that-reaches-the-terminator.yaml
@@ -36,29 +36,38 @@
 fails: 'terminator ⊥'
 protocol: |
   𝕄(Φ.l🌵.e1):
-    𝑛·0·1 := ⟦ n ↦ ∅, v ↦ ∅, λ ⤍ L_entry ⟧( n ↦ 1.0 )
-    𝑛·0·2 := ⟦ n ↦ 1.0, v ↦ ∅, λ ⤍ L_entry ⟧
-    𝑛·0·3 := 𝑛·0·2( v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read )
-    𝑛·0·4 := ⟦ n ↦ 1.0, v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read, λ ⤍ L_entry ⟧
+    normalized 𝑛·0·1 := ⟦ mark(n, v) ↦ L_entry:λ, root(v) ↦ L_root:λ, e1 ↦ Φ.l🌵.mark( n ↦ 1.0, v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read ).φ ⟧  # Φ.l🌵
+    normalized 𝑛·0·2 := ⟦ n ↦ ∅, v ↦ ∅, λ ⤍ L_entry ⟧  # 𝑛·0·1.mark
+    𝑛·0·3 := ⟦ n ↦ ∅, v ↦ ∅, λ ⤍ L_entry ⟧( n ↦ 1.0 )
+    𝑛·0·4 := ⟦ n ↦ 1.0, v ↦ ∅, λ ⤍ L_entry ⟧
+    𝑛·0·5 := 𝑛·0·4( v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read )
+    𝑛·0·6 := ⟦ n ↦ 1.0, v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read, λ ⤍ L_entry ⟧
     𝔼(L_entry):
       𝔻(ξ.n):
         𝕄(ξ.n):
-          𝑛·1·1 := 1.0
-          𝑛·1·2 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ):φ
-          morphed 𝑛·1·3 := 𝑛·1·2
-        boxed 𝑛·1·4 := 𝑛·1·3.φ
-        𝕄(𝑛·1·4):
-          𝑛·1·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )
-          𝑛·1·6 := ⟦ φ ↦ 3F-F0-00-00-00-00-00-00:Δ, size ↦ L_bytes_size:λ ⟧
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          normalized 𝑛·1·1 := ∅:φ  # Φ.number
+          𝑛·1·2 := 1.0
+          𝑛·1·3 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ):φ
+          morphed 𝑛·1·4 := 𝑛·1·3
+        boxed 𝑛·1·5 := 𝑛·1·4.φ
+        normalized 𝑛·1·6 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )  # 𝑛·1·5
+        𝕄(𝑛·1·5):
+          normalized 𝑛·1·7 := ⟦ φ ↦ ∅, size ↦ L_bytes_size:λ ⟧  # Φ.bytes
+          𝑛·1·8 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )
+          𝑛·1·9 := ⟦ φ ↦ 3F-F0-00-00-00-00-00-00:Δ, size ↦ L_bytes_size:λ ⟧
+          morphed 𝑛·1·10 := 𝑛·1·9
+        boxed 𝑛·1·11 := 𝑛·1·10.φ
+        normalized 𝑛·1·12 := 3F-F0-00-00-00-00-00-00:Δ  # 𝑛·1·11
         𝛿·1·1 := 3F-F0-00-00-00-00-00-00  # 1.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.n)
       𝕄(ξ.v.φ):
-        𝑛·1·9 := Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) )
-        𝑛·1·10 := ⟦ data ↦ ∅, buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ), read ↦ Φ.dataized( target ↦ ρ.data.size ).as-bytes:φ ⟧
-        remembered 𝑛·1·11 ≡ Φ.dataized  # ⟦ target ↦ ∅, λ ⤍ L_dataized ⟧
-        𝑛·1·12 := Φ.dataized( target ↦ ⊥ )
-        𝑛·1·13 := ⟦ target ↦ ⊥, λ ⤍ L_dataized ⟧
-        remembered 𝑛·1·13 ≡ 𝑛·1·11( target ↦ ⊥ )
+        normalized 𝑛·1·13 := ⟦ data ↦ ∅, buffer ↦ ∅, read ↦ Φ.dataized( target ↦ ρ.data.size ).as-bytes:φ ⟧  # Φ.block
+        𝑛·1·14 := Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) )
+        𝑛·1·15 := ⟦ data ↦ ∅, buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ), read ↦ Φ.dataized( target ↦ ρ.data.size ).as-bytes:φ ⟧
+        normalized 𝑛·1·16 := Φ.dataized( target ↦ ρ.data.size ).as-bytes:φ  # 𝑛·1·15.read
+        normalized 𝑛·1·17 := Φ.dataized( target ↦ ⊥ ).as-bytes  # 𝑛·1·16.φ
+        remembered 𝑛·1·18 ≡ Φ.dataized  # ⟦ target ↦ ∅, λ ⤍ L_dataized ⟧
+        𝑛·1·19 := Φ.dataized( target ↦ ⊥ )
+        𝑛·1·20 := ⟦ target ↦ ⊥, λ ⤍ L_dataized ⟧
+        remembered 𝑛·1·20 ≡ 𝑛·1·18( target ↦ ⊥ )
         𝔼(L_dataized):
diff --git a/test-resources/evaluate-packs/fires-a-formation-once-however-often-it-is-met.yaml b/test-resources/evaluate-packs/fires-a-formation-once-however-often-it-is-met.yaml
--- a/test-resources/evaluate-packs/fires-a-formation-once-however-often-it-is-met.yaml
+++ b/test-resources/evaluate-packs/fires-a-formation-once-however-often-it-is-met.yaml
@@ -42,19 +42,22 @@
   𝕄(Φ.p):
     𝔼(L_pair):
       𝕄(ξ.a):
-        𝑛·1·1 := 7.0
-        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-        𝑛·1·3 := 𝑛·1·1.plus( x ↦ 5.0.plus( 6.0 ) )
-        𝑛·1·4 := ⟦ x ↦ 5.0.plus( 6.0 ), λ ⤍ L_number_plus ⟧
-        morphed 𝑛·1·5 := 𝑛·1·4
-      𝑛1·1 := 𝑛·1·4  # 𝕄(ξ.a)
+        normalized 𝑛·1·1 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number
+        𝑛·1·2 := 7.0
+        𝑛·1·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+        normalized 𝑛·1·4 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·1·3.plus
+        𝑛·1·5 := 𝑛·1·2.plus( x ↦ 5.0.plus( 6.0 ) )
+        𝑛·1·6 := ⟦ x ↦ 5.0.plus( 6.0 ), λ ⤍ L_number_plus ⟧
+        morphed 𝑛·1·7 := 𝑛·1·6
+      𝑛1·1 := 𝑛·1·6  # 𝕄(ξ.a)
       𝕄(ξ.b):
-        𝑛·1·6 := 7.0
-        𝑛·1·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-        𝑛·1·8 := 𝑛·1·6.plus( x ↦ 5.0.plus( 6.0 ) )
-        𝑛·1·9 := ⟦ x ↦ 5.0.plus( 6.0 ), λ ⤍ L_number_plus ⟧
-        morphed 𝑛·1·10 := 𝑛·1·9
-      𝑛2·1 := 𝑛·1·9  # 𝕄(ξ.b)
+        𝑛·1·8 := 7.0
+        𝑛·1·9 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+        normalized 𝑛·1·10 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·1·9.plus
+        𝑛·1·11 := 𝑛·1·8.plus( x ↦ 5.0.plus( 6.0 ) )
+        𝑛·1·12 := ⟦ x ↦ 5.0.plus( 6.0 ), λ ⤍ L_number_plus ⟧
+        morphed 𝑛·1·13 := 𝑛·1·12
+      𝑛2·1 := 𝑛·1·12  # 𝕄(ξ.b)
       𝔼(L_number_plus):  # 𝔼(𝑛1)
         𝔻(ξ.ρ):
           𝕄(ξ.ρ):
@@ -62,20 +65,24 @@
             𝑛·2·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
             morphed 𝑛·2·3 := 𝑛·2·2
           boxed 𝑛·2·4 := 𝑛·2·3.φ
+          normalized 𝑛·2·5 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )  # 𝑛·2·4
           𝕄(𝑛·2·4):
-            𝑛·2·5 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )
-            𝑛·2·6 := 40-1C-00-00-00-00-00-00:Δ:φ
-            morphed 𝑛·2·7 := 𝑛·2·6
-          boxed 𝑛·2·8 := 𝑛·2·7.φ
+            normalized 𝑛·2·6 := ∅:φ  # Φ.bytes
+            𝑛·2·7 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )
+            𝑛·2·8 := 40-1C-00-00-00-00-00-00:Δ:φ
+            morphed 𝑛·2·9 := 𝑛·2·8
+          boxed 𝑛·2·10 := 𝑛·2·9.φ
+          normalized 𝑛·2·11 := 40-1C-00-00-00-00-00-00:Δ  # 𝑛·2·10
           𝛿·2·1 := 40-1C-00-00-00-00-00-00  # 7.0
         𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)
         𝔻(ξ.x):
           𝕄(ξ.x):
-            𝑛·2·9 := 5.0
-            𝑛·2·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-            𝑛·2·11 := 𝑛·2·9.plus( x ↦ 6.0 )
-            𝑛·2·12 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧
-            morphed 𝑛·2·13 := 𝑛·2·12
+            𝑛·2·12 := 5.0
+            𝑛·2·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+            normalized 𝑛·2·14 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·2·13.plus
+            𝑛·2·15 := 𝑛·2·12.plus( x ↦ 6.0 )
+            𝑛·2·16 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧
+            morphed 𝑛·2·17 := 𝑛·2·16
           𝔼(L_number_plus):
             𝔻(ξ.ρ):
               𝕄(ξ.ρ):
@@ -83,52 +90,58 @@
                 𝑛·3·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
                 morphed 𝑛·3·3 := 𝑛·3·2
               boxed 𝑛·3·4 := 𝑛·3·3.φ
+              normalized 𝑛·3·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·3·4
               𝕄(𝑛·3·4):
-                𝑛·3·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
-                𝑛·3·6 := 40-14-00-00-00-00-00-00:Δ:φ
-                morphed 𝑛·3·7 := 𝑛·3·6
-              boxed 𝑛·3·8 := 𝑛·3·7.φ
+                𝑛·3·6 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
+                𝑛·3·7 := 40-14-00-00-00-00-00-00:Δ:φ
+                morphed 𝑛·3·8 := 𝑛·3·7
+              boxed 𝑛·3·9 := 𝑛·3·8.φ
+              normalized 𝑛·3·10 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·3·9
               𝛿·3·1 := 40-14-00-00-00-00-00-00  # 5.0
             𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.ρ)
             𝔻(ξ.x):
               𝕄(ξ.x):
-                𝑛·3·9 := 6.0
-                𝑛·3·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-                morphed 𝑛·3·11 := 𝑛·3·10
-              boxed 𝑛·3·12 := 𝑛·3·11.φ
-              𝕄(𝑛·3·12):
-                𝑛·3·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
-                𝑛·3·14 := 40-18-00-00-00-00-00-00:Δ:φ
-                morphed 𝑛·3·15 := 𝑛·3·14
-              boxed 𝑛·3·16 := 𝑛·3·15.φ
+                𝑛·3·11 := 6.0
+                𝑛·3·12 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+                morphed 𝑛·3·13 := 𝑛·3·12
+              boxed 𝑛·3·14 := 𝑛·3·13.φ
+              normalized 𝑛·3·15 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )  # 𝑛·3·14
+              𝕄(𝑛·3·14):
+                𝑛·3·16 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
+                𝑛·3·17 := 40-18-00-00-00-00-00-00:Δ:φ
+                morphed 𝑛·3·18 := 𝑛·3·17
+              boxed 𝑛·3·19 := 𝑛·3·18.φ
+              normalized 𝑛·3·20 := 40-18-00-00-00-00-00-00:Δ  # 𝑛·3·19
               𝛿·3·2 := 40-18-00-00-00-00-00-00  # 6.0
             𝛿2·3 := 𝛿·3·2  # 𝔻(ξ.x)
-            𝑛·3·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛
-            𝕄(𝑛·3·17):
-              𝑛·3·18 := Φ.number( φ ↦ 𝜎1:λ )
-              𝑛·3·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
-              morphed 𝑛·3·20 := 𝑛·3·19
-            𝑛·3·21 := 𝑛·3·20  # 𝕄(𝑛·3·17)
-            memoized 𝑛·2·12 ⇛ 𝑛·3·21
-          boxed 𝑛·2·14 := 𝑛·3·21.φ
+            𝑛·3·21 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛
+            𝕄(𝑛·3·21):
+              𝑛·3·22 := Φ.number( φ ↦ 𝜎1:λ )
+              𝑛·3·23 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
+              morphed 𝑛·3·24 := 𝑛·3·23
+            𝑛·3·25 := 𝑛·3·24  # 𝕄(𝑛·3·21)
+            memoized 𝑛·2·16 ⇛ 𝑛·3·25
+          boxed 𝑛·2·18 := 𝑛·3·25.φ
+          normalized 𝑛·2·19 := 𝜎1:λ  # 𝑛·2·18
           𝛿·2·2 := 𝔻(𝜎1:λ)
         𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)
-        𝑛·2·15 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
-        𝕄(𝑛·2·15):
-          𝑛·2·16 := Φ.number( φ ↦ 𝜎2:λ )
-          𝑛·2·17 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·2·18 := 𝑛·2·17
-        𝑛·2·19 := 𝑛·2·18  # 𝕄(𝑛·2·15)
-        memoized 𝑛·1·9 ⇛ 𝑛·2·19
-      𝑛3·1 := 𝑛·2·19  # 𝔼(𝑛1)
+        𝑛·2·20 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
+        𝕄(𝑛·2·20):
+          𝑛·2·21 := Φ.number( φ ↦ 𝜎2:λ )
+          𝑛·2·22 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·2·23 := 𝑛·2·22
+        𝑛·2·24 := 𝑛·2·23  # 𝕄(𝑛·2·20)
+        memoized 𝑛·1·12 ⇛ 𝑛·2·24
+      𝑛3·1 := 𝑛·2·24  # 𝔼(𝑛1)
       𝔼(L_number_plus):  # 𝔼(𝑛2)
-        recalled 𝑛·1·9 ⇒ 𝑛·2·19
-        𝑛·4·1 := 𝑛·2·16  # 𝑛
+        recalled 𝑛·1·12 ⇒ 𝑛·2·24
+        𝑛·4·1 := 𝑛·2·21  # 𝑛
         𝑛·4·2 := 𝑛3·1  # 𝕄(𝑛·4·1)
       𝑛4·1 := 𝑛·4·2  # 𝔼(𝑛2)
-      𝑛·1·11 := ⟦ a ↦ 𝑛·4·2, b ↦ 𝑛·4·2 ⟧:φ  # 𝑛
-      𝕄(𝑛·1·11):
-        morphed 𝑛·1·12 := ⟦ a ↦ 𝑛·4·2, b ↦ 𝑛·4·2 ⟧:φ
-      𝑛·1·13 := 𝑛·1·12  # 𝕄(𝑛·1·11)
-      memoized 𝑛·1·14 ⇛ 𝑛·1·13  # ⟦ a ↦ 𝑛·2·1.plus( 𝑛·3·1.plus( 𝑛·3·9 ) ), b ↦ 𝑛·2·1.plus( 𝑛·3·1.plus( 𝑛·3·9 ) ), λ ⤍ L_pair ⟧
-    morphed 𝑛·0·1 := ⟦ a ↦ 𝑛·4·2, b ↦ 𝑛·4·2 ⟧
+      𝑛·1·14 := ⟦ a ↦ 𝑛·4·2, b ↦ 𝑛·4·2 ⟧:φ  # 𝑛
+      𝕄(𝑛·1·14):
+        morphed 𝑛·1·15 := ⟦ a ↦ 𝑛·4·2, b ↦ 𝑛·4·2 ⟧:φ
+      𝑛·1·16 := 𝑛·1·15  # 𝕄(𝑛·1·14)
+      memoized 𝑛·1·17 ⇛ 𝑛·1·16  # ⟦ a ↦ 𝑛·2·1.plus( 𝑛·3·1.plus( 𝑛·3·11 ) ), b ↦ 𝑛·2·1.plus( 𝑛·3·1.plus( 𝑛·3·11 ) ), λ ⤍ L_pair ⟧
+    normalized 𝑛·0·1 := ⟦ a ↦ 𝑛·4·2, b ↦ 𝑛·4·2 ⟧  # 𝑛·1·16.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/fires-the-answer-of-an-evaluate-line-on-the-next-line.yaml b/test-resources/evaluate-packs/fires-the-answer-of-an-evaluate-line-on-the-next-line.yaml
--- a/test-resources/evaluate-packs/fires-the-answer-of-an-evaluate-line-on-the-next-line.yaml
+++ b/test-resources/evaluate-packs/fires-the-answer-of-an-evaluate-line-on-the-next-line.yaml
@@ -42,4 +42,5 @@
       𝕄(𝑛·1·2):
         morphed 𝑛·1·3 := 𝑛3·1
       𝑛·1·4 := 𝑛3·1  # 𝕄(𝑛·1·2)
-    morphed 𝑛·0·1 := 𝜎1:λ
+    normalized 𝑛·0·1 := 𝜎1:λ  # 𝑛·1·4.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/fires-the-arguments-of-a-copy-a-defer-line-defers.yaml b/test-resources/evaluate-packs/fires-the-arguments-of-a-copy-a-defer-line-defers.yaml
--- a/test-resources/evaluate-packs/fires-the-arguments-of-a-copy-a-defer-line-defers.yaml
+++ b/test-resources/evaluate-packs/fires-the-arguments-of-a-copy-a-defer-line-defers.yaml
@@ -56,23 +56,25 @@
           recalled 𝑛·2·4 ⇒ 𝑛·2·2( x ↦ Φ.items.tail )
           recalled 𝑛·2·2 ⇒ Φ.box
           𝕄(𝑛2.w):
-            𝑛·2·8 := Φ.inc( x ↦ 2A-:Δ )
-            𝑛·2·9 := ⟦ x ↦ 2A-:Δ, λ ⤍ L_inc ⟧
-            morphed 𝑛·2·10 := 𝑛·2·9
+            normalized 𝑛·2·8 := ⟦ x ↦ ∅, λ ⤍ L_inc ⟧  # Φ.inc
+            𝑛·2·9 := Φ.inc( x ↦ 2A-:Δ )
+            𝑛·2·10 := ⟦ x ↦ 2A-:Δ, λ ⤍ L_inc ⟧
+            morphed 𝑛·2·11 := 𝑛·2·10
           𝔼(L_inc):  # 𝔼(𝑛2.w)
             𝔻(ξ.x):
               𝛿·3·1 := 2A-
             𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.x)
             𝑛·3·1 := Φ.num( φ ↦ 𝜎4:λ )  # 𝑛
             𝕄(𝑛·3·1):
-              𝑛·3·2 := Φ.num( φ ↦ 𝜎4:λ )
-              𝑛·3·3 := 𝜎4:λ:φ
-              morphed 𝑛·3·4 := 𝑛·3·3
-            𝑛·3·5 := 𝑛·3·4  # 𝕄(𝑛·3·1)
-            remembered 𝑛·3·5 ≡ 𝑛·2·9
-          deferred 𝜎5 := Φ.box( x ↦ 𝜎1:λ, w ↦ 𝑛·3·5 )  # 𝕄(𝑛2.φ)
+              normalized 𝑛·3·2 := ∅:φ  # Φ.num
+              𝑛·3·3 := Φ.num( φ ↦ 𝜎4:λ )
+              𝑛·3·4 := 𝜎4:λ:φ
+              morphed 𝑛·3·5 := 𝑛·3·4
+            𝑛·3·6 := 𝑛·3·5  # 𝕄(𝑛·3·1)
+            remembered 𝑛·3·6 ≡ 𝑛·2·10
+          deferred 𝜎5 := Φ.box( x ↦ 𝜎1:λ, w ↦ 𝑛·3·6 )  # 𝕄(𝑛2.φ)
           joined 𝜎6 := 𝛿1·2 ? 𝜎3 : 𝜎5
-          𝑛·2·11 := 𝜎6:λ
+          𝑛·2·12 := 𝜎6:λ
         𝛿·1·1 := 𝔻(𝜎6:λ)
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.x)
       𝑛·1·1 := Φ.num( φ ↦ 𝜎7:λ )  # 𝑛
@@ -81,4 +83,5 @@
         𝑛·1·3 := 𝜎7:λ:φ
         morphed 𝑛·1·4 := 𝑛·1·3
       𝑛·1·5 := 𝑛·1·4  # 𝕄(𝑛·1·1)
-    morphed 𝑛·0·1 := 𝜎7:λ
+    normalized 𝑛·0·1 := 𝜎7:λ  # 𝑛·1·5.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/fires-what-a-rewrite-line-unwrapped.yaml b/test-resources/evaluate-packs/fires-what-a-rewrite-line-unwrapped.yaml
--- a/test-resources/evaluate-packs/fires-what-a-rewrite-line-unwrapped.yaml
+++ b/test-resources/evaluate-packs/fires-what-a-rewrite-line-unwrapped.yaml
@@ -43,4 +43,5 @@
       𝕄(𝑛·1·2):
         morphed 𝑛·1·3 := 𝑛3·1
       𝑛·1·4 := 𝑛3·1  # 𝕄(𝑛·1·2)
-    morphed 𝑛·0·1 := 𝜎1:λ
+    normalized 𝑛·0·1 := 𝜎1:λ  # 𝑛·1·4.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/guards-a-side-holding-no-symbol-against-a-bottom.yaml b/test-resources/evaluate-packs/guards-a-side-holding-no-symbol-against-a-bottom.yaml
new file mode 100644
--- /dev/null
+++ b/test-resources/evaluate-packs/guards-a-side-holding-no-symbol-against-a-bottom.yaml
@@ -0,0 +1,40 @@
+# SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com
+# SPDX-License-Identifier: MIT
+---
+# yamllint disable rule:line-length
+# The right side is ⊥ and the left side is a formation holding no symbol, so
+# nothing could stand for ⊥ in a 'joined' line. A fork one branch of which
+# raises is the other branch under the condition, so the join answers the left
+# side as it is and writes a 'guarded' line saying the right side is ⊥ (#2370).
+symbolic: |
+  - λ: L_fork
+    dataize:
+      𝛿1: $.on🌵
+    morph:
+      𝑛1: $.left🌵
+      𝑛2: $.right🌵
+    join:
+      on: 𝛿1
+      left: 𝑛1
+      right: 𝑛2
+      otherwise: L_fork
+location: 'Q.e1'
+input: '⟦ k ↦ ⟦ q ↦ ⟦⟧ ⟧, e1 ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ ⟦ Δ ⤍ 00- ⟧, left🌵 ↦ ⟦ φ ↦ Φ.k ⟧, right🌵 ↦ ⊥ ⟧.φ ⟧'
+result: '⟦ q ↦ ⟦⟧ ⟧'
+protocol: |
+  𝕄(Φ.e1):
+    𝔼(L_fork):
+      𝔻(ξ.on🌵):
+        𝛿·1·1 := 00-
+      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.on🌵)
+      𝕄(ξ.left🌵):
+        morphed 𝑛·1·1 := Φ.k:φ
+      𝑛1·1 := 𝑛·1·1  # 𝕄(ξ.left🌵)
+      𝕄(ξ.right🌵):
+        morphed 𝑛·1·2 := ⊥
+      𝑛2·1 := ⊥  # 𝕄(ξ.right🌵)
+      guarded 𝛿1·1 ? 𝑛1·1 : 𝑛2·1  # where 𝑛2·1 is ⊥
+      𝑛·1·3 := 𝑛·1·1
+    normalized 𝑛·0·1 := Φ.k  # 𝑛·1·3.φ
+    normalized 𝑛·0·2 := ⟦⟧:q  # Φ.k
+    morphed 𝑛·0·3 := 𝑛·0·2
diff --git a/test-resources/evaluate-packs/hands-a-named-argument-to-both-sides-of-an-attribute-of-a-fabricated-formation.yaml b/test-resources/evaluate-packs/hands-a-named-argument-to-both-sides-of-an-attribute-of-a-fabricated-formation.yaml
--- a/test-resources/evaluate-packs/hands-a-named-argument-to-both-sides-of-an-attribute-of-a-fabricated-formation.yaml
+++ b/test-resources/evaluate-packs/hands-a-named-argument-to-both-sides-of-an-attribute-of-a-fabricated-formation.yaml
@@ -37,8 +37,9 @@
       𝕄(ξ.b):
         morphed 𝑛·1·2 := ⟦ ke(x) ↦ x:k ⟧
       fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛·1·2  # ⟦ left🌵 ↦ 𝑛·1·1, right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧, ke(x) ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧ ⟧
-    𝑛·0·1 := ⟦ λ ⤍ L_join, x ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧( x ↦ 𝜎2:λ )
-    𝑛·0·2 := ⟦ λ ⤍ L_join, x ↦ 𝜎2:λ, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧
+    normalized 𝑛·0·1 := ⟦ λ ⤍ L_join, x ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧  # 𝑛·1·3.ke
+    𝑛·0·2 := ⟦ λ ⤍ L_join, x ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧( x ↦ 𝜎2:λ )
+    𝑛·0·3 := ⟦ λ ⤍ L_join, x ↦ 𝜎2:λ, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧
     𝔼(L_join):
       𝑛·2·1 := ⟦ x ↦ ∅, k ↦ x ⟧( x ↦ 𝜎2:λ )  # 𝕄(ξ.left🌵)
       𝑛·2·2 := ⟦ x ↦ 𝜎2:λ, k ↦ x ⟧
@@ -49,4 +50,5 @@
       𝕄(ξ.right🌵):
         morphed 𝑛·2·6 := 𝑛·2·5
       𝑛·2·7 := 𝑛·2·6
-    morphed 𝑛·0·3 := 𝜎2:λ
+    normalized 𝑛·0·4 := 𝜎2:λ  # 𝑛·2·7.k
+    morphed 𝑛·0·5 := 𝑛·0·4
diff --git a/test-resources/evaluate-packs/hands-a-positional-argument-to-both-sides-of-an-attribute-of-a-fabricated-formation.yaml b/test-resources/evaluate-packs/hands-a-positional-argument-to-both-sides-of-an-attribute-of-a-fabricated-formation.yaml
--- a/test-resources/evaluate-packs/hands-a-positional-argument-to-both-sides-of-an-attribute-of-a-fabricated-formation.yaml
+++ b/test-resources/evaluate-packs/hands-a-positional-argument-to-both-sides-of-an-attribute-of-a-fabricated-formation.yaml
@@ -37,8 +37,9 @@
       𝕄(ξ.b):
         morphed 𝑛·1·2 := ⟦ ke(x) ↦ x:k ⟧
       fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛·1·2  # ⟦ left🌵 ↦ 𝑛·1·1, right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧, ke(x) ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧ ⟧
-    𝑛·0·1 := ⟦ λ ⤍ L_join, x ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧( x ↦ 𝜎2:λ )
-    𝑛·0·2 := ⟦ λ ⤍ L_join, x ↦ 𝜎2:λ, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧
+    normalized 𝑛·0·1 := ⟦ λ ⤍ L_join, x ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧  # 𝑛·1·3.ke
+    𝑛·0·2 := ⟦ λ ⤍ L_join, x ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧( x ↦ 𝜎2:λ )
+    𝑛·0·3 := ⟦ λ ⤍ L_join, x ↦ 𝜎2:λ, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x ) ⟧
     𝔼(L_join):
       𝑛·2·1 := ⟦ x ↦ ∅, k ↦ x ⟧( x ↦ 𝜎2:λ )  # 𝕄(ξ.left🌵)
       𝑛·2·2 := ⟦ x ↦ 𝜎2:λ, k ↦ x ⟧
@@ -49,4 +50,5 @@
       𝕄(ξ.right🌵):
         morphed 𝑛·2·6 := 𝑛·2·5
       𝑛·2·7 := 𝑛·2·6
-    morphed 𝑛·0·3 := 𝜎2:λ
+    normalized 𝑛·0·4 := 𝜎2:λ  # 𝑛·2·7.k
+    morphed 𝑛·0·5 := 𝑛·0·4
diff --git a/test-resources/evaluate-packs/hands-a-side-of-a-fabricated-formation-only-the-voids-its-attribute-leaves.yaml b/test-resources/evaluate-packs/hands-a-side-of-a-fabricated-formation-only-the-voids-its-attribute-leaves.yaml
--- a/test-resources/evaluate-packs/hands-a-side-of-a-fabricated-formation-only-the-voids-its-attribute-leaves.yaml
+++ b/test-resources/evaluate-packs/hands-a-side-of-a-fabricated-formation-only-the-voids-its-attribute-leaves.yaml
@@ -9,8 +9,8 @@
 # leaves alone (#2031), since 'miss' turns an application to an attribute a
 # formation lacks into ⊥. The program hands 'x' over, so the right side gets
 # 'w' bound to ⊥, the two sides differ in shape and are fabricated again, and
-# 'k' stays the alias of 'x' both sides bind it to (#2260), so the copy under
-# 'x' finds it on both of them.
+# 'k', an alias of 'x' on both sides, gets a copy of 'L_join' of its own
+# (#2368), which asks both sides for 'k' and finds 'x' on both of them.
 symbolic: |
   - λ: L_fork
     dataize:
@@ -40,8 +40,9 @@
       𝕄(ξ.b):
         morphed 𝑛·1·2 := ⟦ ke(x, w) ↦ x:k ⟧
       fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛·1·2  # ⟦ left🌵 ↦ 𝑛·1·1, right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧, ke(x, w) ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x, w ↦ w ) ⟧ ⟧
-    𝑛·0·1 := ⟦ λ ⤍ L_join, x ↦ ∅, w ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x, w ↦ w ) ⟧( x ↦ 𝜎2:λ:φ )
-    𝑛·0·2 := ⟦ λ ⤍ L_join, x ↦ 𝜎2:λ:φ, w ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x, w ↦ w ) ⟧
+    normalized 𝑛·0·1 := ⟦ λ ⤍ L_join, x ↦ ∅, w ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x, w ↦ w ) ⟧  # 𝑛·1·3.ke
+    𝑛·0·2 := ⟦ λ ⤍ L_join, x ↦ ∅, w ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x, w ↦ w ) ⟧( x ↦ 𝜎2:λ:φ )
+    𝑛·0·3 := ⟦ λ ⤍ L_join, x ↦ 𝜎2:λ:φ, w ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke( x ↦ x ), right🌵 ↦ ρ.right🌵.ke( x ↦ x, w ↦ w ) ⟧
     𝔼(L_join):
       𝑛·2·1 := ⟦ x ↦ ∅, k ↦ x ⟧( x ↦ 𝜎2:λ:φ )  # 𝕄(ξ.left🌵)
       𝑛·2·2 := ⟦ x ↦ 𝜎2:λ:φ, k ↦ x ⟧
@@ -53,11 +54,13 @@
       𝑛·2·7 := ⟦ x ↦ 𝜎2:λ:φ, w ↦ ⊥, k ↦ x ⟧
       𝕄(ξ.right🌵):
         morphed 𝑛·2·8 := 𝑛·2·7
-      fabricated 𝑛·2·9 := 𝑛·2·3 and 𝑛·2·8  # ⟦ left🌵 ↦ 𝑛·2·3, right🌵 ↦ 𝑛·2·8, x ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.x, right🌵 ↦ ρ.right🌵.x ⟧, k ↦ x, w ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.w, right🌵 ↦ ρ.right🌵.w ⟧ ⟧
+      fabricated 𝑛·2·9 := 𝑛·2·3 and 𝑛·2·8  # ⟦ left🌵 ↦ 𝑛·2·3, right🌵 ↦ 𝑛·2·8, x ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.x, right🌵 ↦ ρ.right🌵.x ⟧, k ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.k, right🌵 ↦ ρ.right🌵.k ⟧, w ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.w, right🌵 ↦ ρ.right🌵.w ⟧ ⟧
+    normalized 𝑛·0·4 := ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.k, right🌵 ↦ ρ.right🌵.k ⟧  # 𝑛·2·9.k
     𝔼(L_join):
       𝕄(ξ.left🌵):
         morphed 𝑛·3·1 := 𝜎2:λ:φ
       𝕄(ξ.right🌵):
         morphed 𝑛·3·2 := 𝑛·3·1
       𝑛·3·3 := 𝑛·3·1
-    morphed 𝑛·0·3 := 𝜎2:λ
+    normalized 𝑛·0·5 := 𝜎2:λ  # 𝑛·3·3.φ
+    morphed 𝑛·0·6 := 𝑛·0·5
diff --git a/test-resources/evaluate-packs/heads-the-block-of-a-dataize-operand-with-the-operand.yaml b/test-resources/evaluate-packs/heads-the-block-of-a-dataize-operand-with-the-operand.yaml
--- a/test-resources/evaluate-packs/heads-the-block-of-a-dataize-operand-with-the-operand.yaml
+++ b/test-resources/evaluate-packs/heads-the-block-of-a-dataize-operand-with-the-operand.yaml
@@ -20,10 +20,12 @@
     φ ↦ 5.plus( 6 ).φ ⟧
 protocol: |
   𝕄(Φ.φ):
-    𝑛·0·1 := 5.0
-    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0 )
-    𝑛·0·4 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧
+    normalized 𝑛·0·1 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number
+    𝑛·0·2 := 5.0
+    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+    normalized 𝑛·0·4 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·3.plus
+    𝑛·0·5 := 𝑛·0·2.plus( x ↦ 6.0 )
+    𝑛·0·6 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -31,30 +33,36 @@
           𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·1·3 := 𝑛·1·2
         boxed 𝑛·1·4 := 𝑛·1·3.φ
+        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4
         𝕄(𝑛·1·4):
-          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
-          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes
+          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
+          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·9 := 𝑛·1·8
+        boxed 𝑛·1·10 := 𝑛·1·9.φ
+        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10
         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·9 := 6.0
-          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·1·11 := 𝑛·1·10
-        boxed 𝑛·1·12 := 𝑛·1·11.φ
-        𝕄(𝑛·1·12):
-          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
-          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·15 := 𝑛·1·14
-        boxed 𝑛·1·16 := 𝑛·1·15.φ
+          𝑛·1·12 := 6.0
+          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·1·14 := 𝑛·1·13
+        boxed 𝑛·1·15 := 𝑛·1·14.φ
+        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )  # 𝑛·1·15
+        𝕄(𝑛·1·15):
+          𝑛·1·17 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
+          𝑛·1·18 := 40-18-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·19 := 𝑛·1·18
+        boxed 𝑛·1·20 := 𝑛·1·19.φ
+        normalized 𝑛·1·21 := 40-18-00-00-00-00-00-00:Δ  # 𝑛·1·20
         𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0
       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)
-      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛
-      𝕄(𝑛·1·17):
-        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )
-        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
-        morphed 𝑛·1·20 := 𝑛·1·19
-      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)
-    morphed 𝑛·0·5 := 𝜎1:λ
+      𝑛·1·22 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛
+      𝕄(𝑛·1·22):
+        𝑛·1·23 := Φ.number( φ ↦ 𝜎1:λ )
+        𝑛·1·24 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
+        morphed 𝑛·1·25 := 𝑛·1·24
+      𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·22)
+    normalized 𝑛·0·7 := 𝜎1:λ  # 𝑛·1·26.φ
+    morphed 𝑛·0·8 := 𝑛·0·7
diff --git a/test-resources/evaluate-packs/heads-the-block-of-a-morph-operand-with-the-operand.yaml b/test-resources/evaluate-packs/heads-the-block-of-a-morph-operand-with-the-operand.yaml
--- a/test-resources/evaluate-packs/heads-the-block-of-a-morph-operand-with-the-operand.yaml
+++ b/test-resources/evaluate-packs/heads-the-block-of-a-morph-operand-with-the-operand.yaml
@@ -18,12 +18,14 @@
   𝕄(Φ.y):
     𝔼(L_kept):
       𝕄(ξ.x):
-        𝑛·1·1 := 5.0
-        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), neg ↦ ⟦⟧ ⟧
-        morphed 𝑛·1·3 := 𝑛·1·2
-      𝑛1·1 := 𝑛·1·3  # 𝕄(ξ.x)
-      𝑛·1·4 := 𝜎1:λ:φ  # 𝑛
-      𝕄(𝑛·1·4):
-        morphed 𝑛·1·5 := 𝜎1:λ:φ
-      𝑛·1·6 := 𝑛·1·5  # 𝕄(𝑛·1·4)
-    morphed 𝑛·0·1 := 𝜎1:λ
+        normalized 𝑛·1·1 := ⟦ φ ↦ ∅, neg ↦ ⟦⟧ ⟧  # Φ.number
+        𝑛·1·2 := 5.0
+        𝑛·1·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), neg ↦ ⟦⟧ ⟧
+        morphed 𝑛·1·4 := 𝑛·1·3
+      𝑛1·1 := 𝑛·1·4  # 𝕄(ξ.x)
+      𝑛·1·5 := 𝜎1:λ:φ  # 𝑛
+      𝕄(𝑛·1·5):
+        morphed 𝑛·1·6 := 𝜎1:λ:φ
+      𝑛·1·7 := 𝑛·1·6  # 𝕄(𝑛·1·5)
+    normalized 𝑛·0·1 := 𝜎1:λ  # 𝑛·1·7.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-down-two-decorators.yaml b/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-down-two-decorators.yaml
--- a/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-down-two-decorators.yaml
+++ b/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-down-two-decorators.yaml
@@ -42,4 +42,5 @@
       cast 𝑛3·1 := ⟦ φ ↦ ⟦ φ ↦ 𝜎2:λ, if ↦ Φ.zu ⟧, x ↦ Φ.ty ⟧  # 𝑛1·1 up to 𝑛2·1
       joined 𝜎4 := 𝛿1·1 ? 𝜎2 : 𝜎3
       𝑛·1·3 := ⟦ φ ↦ ⟦ φ ↦ 𝜎4:λ, if ↦ Φ.zu ⟧, x ↦ Φ.ty ⟧
-    morphed 𝑛·0·1 := ⟦ φ ↦ 𝜎4:λ, if ↦ Φ.zu ⟧
+    normalized 𝑛·0·1 := ⟦ φ ↦ 𝜎4:λ, if ↦ Φ.zu ⟧  # 𝑛·1·3.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-into-a-decorator-of-a-fork.yaml b/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-into-a-decorator-of-a-fork.yaml
--- a/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-into-a-decorator-of-a-fork.yaml
+++ b/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-into-a-decorator-of-a-fork.yaml
@@ -46,7 +46,8 @@
         morphed 𝑛·1·2 := 𝜎3:λ
       𝑛2·1 := 𝑛·1·2  # 𝕄(ξ.right🌵)
       cast 𝑛6·1 := ⟦ k ↦ ⟦⟧, φ ↦ 𝜎3:λ ⟧  # 𝑛2·1 up to 𝑛·1·1
-      fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛6·1  # ⟦ left🌵 ↦ 𝑛·1·1, right🌵 ↦ ⟦ k ↦ ⟦⟧, φ ↦ 𝜎3:λ ⟧, k ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.k, right🌵 ↦ ρ.right🌵.k ⟧, φ ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧ ⟧
+      fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛6·1  # ⟦ left🌵 ↦ 𝑛·1·1, right🌵 ↦ 𝑛6·1, k ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.k, right🌵 ↦ ρ.right🌵.k ⟧, φ ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧ ⟧
+    normalized 𝑛·0·1 := ⟦ λ ⤍ L_fork, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧  # 𝑛·1·3.φ
     𝔼(L_fork):
       𝔻(ξ.on🌵):
         𝛿·2·1 := 𝔻(𝜎1:λ)
@@ -73,4 +74,5 @@
       cast 𝑛6·2 := 𝜎3:λ:φ  # 𝑛2·2 up to 𝑛3·2
       joined 𝜎8 := 𝛿1·2 ? 𝜎7 : 𝜎3
       𝑛·2·3 := 𝜎8:λ:φ
-    morphed 𝑛·0·1 := 𝜎8:λ
+    normalized 𝑛·0·2 := 𝜎8:λ  # 𝑛·2·3.φ
+    morphed 𝑛·0·3 := 𝑛·0·2
diff --git a/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-into-a-side-holding-a-symbol-off-its-phi-chain.yaml b/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-into-a-side-holding-a-symbol-off-its-phi-chain.yaml
--- a/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-into-a-side-holding-a-symbol-off-its-phi-chain.yaml
+++ b/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-into-a-side-holding-a-symbol-off-its-phi-chain.yaml
@@ -40,4 +40,5 @@
       cast 𝑛3·1 := ⟦ φ ↦ 𝜎2:λ, ke ↦ 𝜎4:λ ⟧  # 𝑛1·1 up to 𝑛2·1
       joined 𝜎5 := 𝛿1·1 ? 𝜎2 : 𝜎3
       𝑛·1·3 := ⟦ φ ↦ 𝜎5:λ, ke ↦ 𝜎4:λ ⟧
-    morphed 𝑛·0·1 := 𝜎5:λ
+    normalized 𝑛·0·1 := 𝜎5:λ  # 𝑛·1·3.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-into-the-shape-of-a-decorator.yaml b/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-into-the-shape-of-a-decorator.yaml
--- a/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-into-the-shape-of-a-decorator.yaml
+++ b/test-resources/evaluate-packs/joins-a-bare-symbol-a-cast-brought-into-the-shape-of-a-decorator.yaml
@@ -46,4 +46,5 @@
       cast 𝑛20·1 := ⟦ k ↦ ⟦⟧, φ ↦ 𝜎3:λ ⟧  # 𝑛14·1 up to 𝑛13·1
       joined 𝜎4 := 𝛿1·1 ? 𝜎2 : 𝜎3
       𝑛·1·3 := ⟦ k ↦ ⟦⟧, φ ↦ 𝜎4:λ ⟧
-    morphed 𝑛·0·1 := 𝜎4:λ
+    normalized 𝑛·0·1 := 𝜎4:λ  # 𝑛·1·3.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/joins-a-bool-literal-a-rewrite-line-brought-into-the-shape-of-the-other-side.yaml b/test-resources/evaluate-packs/joins-a-bool-literal-a-rewrite-line-brought-into-the-shape-of-the-other-side.yaml
--- a/test-resources/evaluate-packs/joins-a-bool-literal-a-rewrite-line-brought-into-the-shape-of-the-other-side.yaml
+++ b/test-resources/evaluate-packs/joins-a-bool-literal-a-rewrite-line-brought-into-the-shape-of-the-other-side.yaml
@@ -55,4 +55,5 @@
       𝑛3·1 := ⟦ φ ↦ 𝜎2:λ, kq ↦ Φ.bool( if ↦ 01-:Δ ) ⟧  # rewrite(𝑛1)
       joined 𝜎4 := 𝛿1·1 ? 𝜎2 : 𝜎3
       𝑛·1·3 := ⟦ φ ↦ 𝜎4:λ, kq ↦ Φ.bool( if ↦ 01-:Δ ) ⟧
-    morphed 𝑛·0·1 := 𝜎4:λ
+    normalized 𝑛·0·1 := 𝜎4:λ  # 𝑛·1·3.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/joins-a-bottom-into-the-shape-of-the-other-side.yaml b/test-resources/evaluate-packs/joins-a-bottom-into-the-shape-of-the-other-side.yaml
--- a/test-resources/evaluate-packs/joins-a-bottom-into-the-shape-of-the-other-side.yaml
+++ b/test-resources/evaluate-packs/joins-a-bottom-into-the-shape-of-the-other-side.yaml
@@ -38,4 +38,5 @@
       𝑛2·1 := 𝑛·1·2  # 𝕄(ξ.right🌵)
       joined 𝜎4 := 𝛿1·1 ? 𝜎3 : 𝜎2  # where 𝜎3 is ⊥
       𝑛·1·3 := ⟦ k ↦ ⟦⟧, φ ↦ 𝜎4:λ ⟧
-    morphed 𝑛·0·1 := 𝜎4:λ
+    normalized 𝑛·0·1 := 𝜎4:λ  # 𝑛·1·3.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/joins-a-number-with-a-formation-an-undress-took-the-number-out-of.yaml b/test-resources/evaluate-packs/joins-a-number-with-a-formation-an-undress-took-the-number-out-of.yaml
--- a/test-resources/evaluate-packs/joins-a-number-with-a-formation-an-undress-took-the-number-out-of.yaml
+++ b/test-resources/evaluate-packs/joins-a-number-with-a-formation-an-undress-took-the-number-out-of.yaml
@@ -35,24 +35,27 @@
         𝛿·1·1 := 𝔻(𝜎1:λ)
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.on🌵)
       𝕄(ξ.left🌵):
-        𝑛·1·1 := 42.0
-        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-45-00-00-00-00-00-00:Δ ), neg ↦ ρ:φ ⟧
-        morphed 𝑛·1·3 := 𝑛·1·2
-      𝑛1·1 := 𝑛·1·3  # 𝕄(ξ.left🌵)
+        normalized 𝑛·1·1 := ⟦ φ ↦ ∅, neg ↦ ρ:φ ⟧  # Φ.number
+        𝑛·1·2 := 42.0
+        𝑛·1·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-45-00-00-00-00-00-00:Δ ), neg ↦ ρ:φ ⟧
+        morphed 𝑛·1·4 := 𝑛·1·3
+      𝑛1·1 := 𝑛·1·4  # 𝕄(ξ.left🌵)
       𝕄(ξ.right🌵):
-        morphed 𝑛·1·4 := 7.0:φ
-      undressed 𝑛·1·5 := 𝑛·1·4.φ
-      𝕄(𝑛·1·5):
-        𝑛·1·6 := 7.0
-        𝑛·1·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), neg ↦ ρ:φ ⟧
-        morphed 𝑛·1·8 := 𝑛·1·7
-      𝑛2·1 := 𝑛·1·8  # undress(ξ.right🌵)
+        morphed 𝑛·1·5 := 7.0:φ
+      undressed 𝑛·1·6 := 𝑛·1·5.φ
+      𝕄(𝑛·1·6):
+        𝑛·1·7 := 7.0
+        𝑛·1·8 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), neg ↦ ρ:φ ⟧
+        morphed 𝑛·1·9 := 𝑛·1·8
+      𝑛2·1 := 𝑛·1·9  # undress(ξ.right🌵)
       symbolized 𝜎2 := 40-45-00-00-00-00-00-00  # 42.0
       𝑛3·1 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎2:λ ), neg ↦ ρ:φ ⟧  # symbolize(𝑛1)
       symbolized 𝜎3 := 40-1C-00-00-00-00-00-00  # 7.0
       𝑛4·1 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎3:λ ), neg ↦ ρ:φ ⟧  # symbolize(𝑛2)
       joined 𝜎4 := 𝛿1·1 ? 𝜎2 : 𝜎3
-      𝑛·1·9 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎4:λ ), neg ↦ ρ:φ ⟧
-    𝑛·0·1 := Φ.bytes( φ ↦ 𝜎4:λ )
-    𝑛·0·2 := 𝜎4:λ:φ
-    morphed 𝑛·0·3 := 𝑛·0·2
+      𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎4:λ ), neg ↦ ρ:φ ⟧
+    normalized 𝑛·0·1 := Φ.bytes( φ ↦ 𝜎4:λ )  # 𝑛·1·10.φ
+    normalized 𝑛·0·2 := ∅:φ  # Φ.bytes
+    𝑛·0·3 := Φ.bytes( φ ↦ 𝜎4:λ )
+    𝑛·0·4 := 𝜎4:λ:φ
+    morphed 𝑛·0·5 := 𝑛·0·4
diff --git a/test-resources/evaluate-packs/joins-a-side-a-morph-line-brought-down-from-what-a-rewrite-line-unwrapped.yaml b/test-resources/evaluate-packs/joins-a-side-a-morph-line-brought-down-from-what-a-rewrite-line-unwrapped.yaml
--- a/test-resources/evaluate-packs/joins-a-side-a-morph-line-brought-down-from-what-a-rewrite-line-unwrapped.yaml
+++ b/test-resources/evaluate-packs/joins-a-side-a-morph-line-brought-down-from-what-a-rewrite-line-unwrapped.yaml
@@ -53,4 +53,5 @@
       𝑛4·1 := 𝑛·1·4  # 𝕄(𝑛3)
       joined 𝜎4 := 𝛿1·1 ? 𝜎2 : 𝜎3
       𝑛·1·5 := 𝜎4:λ:φ
-    morphed 𝑛·0·1 := 𝜎4:λ
+    normalized 𝑛·0·1 := 𝜎4:λ  # 𝑛·1·5.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/joins-a-side-an-evaluate-line-fired-with-a-bool-it-left-as-it-is.yaml b/test-resources/evaluate-packs/joins-a-side-an-evaluate-line-fired-with-a-bool-it-left-as-it-is.yaml
--- a/test-resources/evaluate-packs/joins-a-side-an-evaluate-line-fired-with-a-bool-it-left-as-it-is.yaml
+++ b/test-resources/evaluate-packs/joins-a-side-an-evaluate-line-fired-with-a-bool-it-left-as-it-is.yaml
@@ -37,10 +37,11 @@
         morphed 𝑛·1·1 := L_eq:λ
       𝑛1·1 := L_eq:λ  # 𝕄(ξ.a)
       𝕄(ξ.b):
-        𝑛·1·2 := Φ.bool( φ ↦ 𝜎2:λ )
-        𝑛·1·3 := 𝜎2:λ:φ
-        morphed 𝑛·1·4 := 𝑛·1·3
-      𝑛2·1 := 𝑛·1·4  # 𝕄(ξ.b)
+        normalized 𝑛·1·2 := ∅:φ  # Φ.bool
+        𝑛·1·3 := Φ.bool( φ ↦ 𝜎2:λ )
+        𝑛·1·4 := 𝜎2:λ:φ
+        morphed 𝑛·1·5 := 𝑛·1·4
+      𝑛2·1 := 𝑛·1·5  # 𝕄(ξ.b)
       𝔼(L_eq):  # 𝔼(𝑛1)
         𝑛·2·1 := Φ.bool( φ ↦ 𝜎3:λ )  # 𝑛
         𝕄(𝑛·2·1):
@@ -50,5 +51,6 @@
         𝑛·2·5 := 𝑛·2·4  # 𝕄(𝑛·2·1)
       𝑛3·1 := 𝑛·2·5  # 𝔼(𝑛1)
       joined 𝜎4 := 𝛿1·1 ? 𝜎3 : 𝜎2
-      𝑛·1·5 := 𝜎4:λ:φ
-    morphed 𝑛·0·1 := 𝜎4:λ
+      𝑛·1·6 := 𝜎4:λ:φ
+    normalized 𝑛·0·1 := 𝜎4:λ  # 𝑛·1·6.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/joins-a-side-holding-a-datum-a-symbolize-turned-into-a-symbol.yaml b/test-resources/evaluate-packs/joins-a-side-holding-a-datum-a-symbolize-turned-into-a-symbol.yaml
--- a/test-resources/evaluate-packs/joins-a-side-holding-a-datum-a-symbolize-turned-into-a-symbol.yaml
+++ b/test-resources/evaluate-packs/joins-a-side-holding-a-datum-a-symbolize-turned-into-a-symbol.yaml
@@ -44,6 +44,8 @@
       𝑛3·1 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎4:λ ) ):φ  # symbolize(𝑛1)
       joined 𝜎5 := 𝛿1·1 ? 𝜎4 : 𝜎2
       𝑛·1·3 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎5:λ ) ):φ
-    𝑛·0·1 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎5:λ ) )
-    𝑛·0·2 := Φ.bytes( φ ↦ 𝜎5:λ ):φ
-    morphed 𝑛·0·3 := 𝑛·0·2
+    normalized 𝑛·0·1 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎5:λ ) )  # 𝑛·1·3.φ
+    normalized 𝑛·0·2 := ∅:φ  # Φ.number
+    𝑛·0·3 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎5:λ ) )
+    𝑛·0·4 := Φ.bytes( φ ↦ 𝜎5:λ ):φ
+    morphed 𝑛·0·5 := 𝑛·0·4
diff --git a/test-resources/evaluate-packs/joins-a-side-reading-the-rho-it-binds-in-a-fabricated-formation.yaml b/test-resources/evaluate-packs/joins-a-side-reading-the-rho-it-binds-in-a-fabricated-formation.yaml
--- a/test-resources/evaluate-packs/joins-a-side-reading-the-rho-it-binds-in-a-fabricated-formation.yaml
+++ b/test-resources/evaluate-packs/joins-a-side-reading-the-rho-it-binds-in-a-fabricated-formation.yaml
@@ -39,14 +39,17 @@
       𝕄(ξ.b):
         morphed 𝑛·1·3 := 𝜎3:λ:k:φ
       fabricated 𝑛·1·4 := 𝑛·1·2 and 𝑛·1·3  # ⟦ tu ↦ ∅, left🌵 ↦ 𝑛·1·2( tu ↦ tu ), right🌵 ↦ 𝑛·1·3, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧ ⟧
+    normalized 𝑛·0·1 := ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧  # 𝑛·1·4.φ
     𝔼(L_join):
       𝑛·2·1 := Φ.t( tu ↦ ⊥ )  # 𝕄(ξ.left🌵)
       𝑛·2·2 := ⟦ tu ↦ ⊥, φ ↦ ρ.s ⟧
       remembered 𝑛·2·2 ≡ 𝑛·1·2( tu ↦ ⊥ )
       𝕄(ξ.left🌵):
-        morphed 𝑛·2·3 := 𝜎2:λ:k
+        normalized 𝑛·2·3 := 𝜎2:λ:k  # Φ.s
+        morphed 𝑛·2·4 := 𝑛·2·3
       𝕄(ξ.right🌵):
-        morphed 𝑛·2·4 := 𝜎3:λ:k
+        morphed 𝑛·2·5 := 𝜎3:λ:k
       joined 𝜎4 := ξ.on🌵 ? 𝜎2 : 𝜎3
-      𝑛·2·5 := 𝜎4:λ:k
-    morphed 𝑛·0·1 := 𝜎4:λ
+      𝑛·2·6 := 𝜎4:λ:k
+    normalized 𝑛·0·2 := 𝜎4:λ  # 𝑛·2·6.k
+    morphed 𝑛·0·3 := 𝑛·0·2
diff --git a/test-resources/evaluate-packs/joins-a-side-that-dispatches-on-a-terminator.yaml b/test-resources/evaluate-packs/joins-a-side-that-dispatches-on-a-terminator.yaml
--- a/test-resources/evaluate-packs/joins-a-side-that-dispatches-on-a-terminator.yaml
+++ b/test-resources/evaluate-packs/joins-a-side-that-dispatches-on-a-terminator.yaml
@@ -41,4 +41,5 @@
       𝑛2·1 := 𝑛·1·4  # 𝕄(ξ.right🌵)
       joined 𝜎4 := 𝛿1·1 ? 𝜎2 : 𝜎3  # where 𝜎3 is ⊥ raised by 𝑛·1·4
       𝑛·1·6 := ⟦ k ↦ ⟦⟧, φ ↦ 𝜎4:λ ⟧
-    morphed 𝑛·0·1 := 𝜎4:λ
+    normalized 𝑛·0·1 := 𝜎4:λ  # 𝑛·1·6.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/joins-a-side-that-raises-through-a-terminator.yaml b/test-resources/evaluate-packs/joins-a-side-that-raises-through-a-terminator.yaml
--- a/test-resources/evaluate-packs/joins-a-side-that-raises-through-a-terminator.yaml
+++ b/test-resources/evaluate-packs/joins-a-side-that-raises-through-a-terminator.yaml
@@ -55,4 +55,5 @@
       𝑛2·1 := 𝑛·1·4  # 𝕄(ξ.right🌵)
       joined 𝜎4 := 𝛿1·1 ? 𝜎2 : 𝜎3  # where 𝜎3 is ⊥ raised by 𝑛·1·4
       𝑛·1·6 := ⟦ k ↦ ⟦⟧, φ ↦ 𝜎4:λ ⟧
-    morphed 𝑛·0·1 := 𝜎4:λ
+    normalized 𝑛·0·1 := 𝜎4:λ  # 𝑛·1·6.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/joins-a-side-whose-operand-raises.yaml b/test-resources/evaluate-packs/joins-a-side-whose-operand-raises.yaml
--- a/test-resources/evaluate-packs/joins-a-side-whose-operand-raises.yaml
+++ b/test-resources/evaluate-packs/joins-a-side-whose-operand-raises.yaml
@@ -43,8 +43,10 @@
         remembered 𝑛·1·4 ≡ 𝑛·1·2( x ↦ L_throw:λ )
         𝔼(L_wrap):
           𝑛·2·1 := ⊥
-        morphed 𝑛·1·5 := ⊥
+        normalized 𝑛·1·5 := ⊥  # ⊥.φ
+        morphed 𝑛·1·6 := ⊥
       𝑛2·1 := ⊥  # 𝕄(ξ.r)
       joined 𝜎4 := 𝛿1·1 ? 𝜎2 : 𝜎3  # where 𝜎3 is ⊥
-      𝑛·1·6 := 𝜎4:λ:φ
-    morphed 𝑛·0·1 := 𝜎4:λ
+      𝑛·1·7 := 𝜎4:λ:φ
+    normalized 𝑛·0·1 := 𝜎4:λ  # 𝑛·1·7.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/joins-a-side-whose-void-the-fabricated-formation-holds.yaml b/test-resources/evaluate-packs/joins-a-side-whose-void-the-fabricated-formation-holds.yaml
--- a/test-resources/evaluate-packs/joins-a-side-whose-void-the-fabricated-formation-holds.yaml
+++ b/test-resources/evaluate-packs/joins-a-side-whose-void-the-fabricated-formation-holds.yaml
@@ -39,6 +39,7 @@
       𝕄(ξ.b):
         morphed 𝑛·1·2 := 𝜎3:λ:k:φ
       fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛·1·2  # ⟦ tu ↦ ∅, left🌵 ↦ 𝑛·1·1( tu ↦ tu ), right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧ ⟧
+    normalized 𝑛·0·1 := ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧  # 𝑛·1·3.φ
     𝔼(L_join):
       𝑛·2·1 := 𝑛·1·1( tu ↦ ⊥ )  # 𝕄(ξ.left🌵)
       𝑛·2·2 := ⟦ φ ↦ 𝜎2:λ:k, tu ↦ ⊥ ⟧
@@ -48,4 +49,5 @@
         morphed 𝑛·2·4 := 𝜎3:λ:k
       joined 𝜎4 := ξ.on🌵 ? 𝜎2 : 𝜎3
       𝑛·2·5 := 𝜎4:λ:k
-    morphed 𝑛·0·1 := 𝜎4:λ
+    normalized 𝑛·0·2 := 𝜎4:λ  # 𝑛·2·5.k
+    morphed 𝑛·0·3 := 𝑛·0·2
diff --git a/test-resources/evaluate-packs/joins-again-the-attribute-of-a-fabricated-formation.yaml b/test-resources/evaluate-packs/joins-again-the-attribute-of-a-fabricated-formation.yaml
--- a/test-resources/evaluate-packs/joins-again-the-attribute-of-a-fabricated-formation.yaml
+++ b/test-resources/evaluate-packs/joins-again-the-attribute-of-a-fabricated-formation.yaml
@@ -38,6 +38,7 @@
       𝕄(ξ.b):
         morphed 𝑛·1·2 := Φ.hx( 𝜎3:λ ):φ
       fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛·1·2  # ⟦ left🌵 ↦ 𝑛·1·1, right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧, ob ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ob, right🌵 ↦ ρ.right🌵.ob ⟧ ⟧
+    normalized 𝑛·0·1 := ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧  # 𝑛·1·3.φ
     𝔼(L_join):
       𝕄(ξ.left🌵):
         remembered 𝑛·2·1 ≡ Φ.hx  # ⟦ ke ↦ ∅, φ ↦ ke ⟧
@@ -52,4 +53,5 @@
         morphed 𝑛·2·7 := 𝑛·2·6
       joined 𝜎4 := ξ.on🌵 ? 𝜎2 : 𝜎3
       𝑛·2·8 := ⟦ ke ↦ 𝜎4:λ, φ ↦ ke ⟧
-    morphed 𝑛·0·1 := 𝜎4:λ
+    normalized 𝑛·0·2 := 𝜎4:λ  # 𝑛·2·8.φ
+    morphed 𝑛·0·3 := 𝑛·0·2
diff --git a/test-resources/evaluate-packs/joins-an-attribute-named-left-of-a-copy-in-a-fabricated-formation.yaml b/test-resources/evaluate-packs/joins-an-attribute-named-left-of-a-copy-in-a-fabricated-formation.yaml
--- a/test-resources/evaluate-packs/joins-an-attribute-named-left-of-a-copy-in-a-fabricated-formation.yaml
+++ b/test-resources/evaluate-packs/joins-an-attribute-named-left-of-a-copy-in-a-fabricated-formation.yaml
@@ -39,6 +39,7 @@
       𝕄(ξ.b):
         morphed 𝑛·1·2 := 𝜎3:λ:left:ke
       fabricated 𝑛·1·3 := 𝑛·1·1 and 𝑛·1·2  # ⟦ left🌵 ↦ 𝑛·1·1, right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧, ke ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke, right🌵 ↦ ρ.right🌵.ke ⟧ ⟧
+    normalized 𝑛·0·1 := ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.ke, right🌵 ↦ ρ.right🌵.ke ⟧  # 𝑛·1·3.ke
     𝔼(L_join):
       𝕄(ξ.left🌵):
         morphed 𝑛·2·1 := 𝜎2:λ:left
@@ -46,4 +47,5 @@
         morphed 𝑛·2·2 := 𝜎3:λ:left
       joined 𝜎4 := ξ.on🌵 ? 𝜎2 : 𝜎3
       𝑛·2·3 := 𝜎4:λ:left
-    morphed 𝑛·0·1 := 𝜎4:λ
+    normalized 𝑛·0·2 := 𝜎4:λ  # 𝑛·2·3.left
+    morphed 𝑛·0·3 := 𝑛·0·2
diff --git a/test-resources/evaluate-packs/joins-two-numbers-into-one-symbol-keeping-the-constant-a-method-holds.yaml b/test-resources/evaluate-packs/joins-two-numbers-into-one-symbol-keeping-the-constant-a-method-holds.yaml
--- a/test-resources/evaluate-packs/joins-two-numbers-into-one-symbol-keeping-the-constant-a-method-holds.yaml
+++ b/test-resources/evaluate-packs/joins-two-numbers-into-one-symbol-keeping-the-constant-a-method-holds.yaml
@@ -34,19 +34,22 @@
         𝛿·1·1 := 𝔻(𝜎3:λ)
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.c)
       𝕄(ξ.a):
-        𝑛·1·1 := 42.0
-        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-45-00-00-00-00-00-00:Δ ), neg ↦ ρ.times( x ↦ -1.0 ):φ ⟧
-        morphed 𝑛·1·3 := 𝑛·1·2
-      𝑛1·1 := 𝑛·1·3  # 𝕄(ξ.a)
+        normalized 𝑛·1·1 := ⟦ φ ↦ ∅, neg ↦ ρ.times( x ↦ -1.0 ):φ ⟧  # Φ.number
+        𝑛·1·2 := 42.0
+        𝑛·1·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-45-00-00-00-00-00-00:Δ ), neg ↦ ρ.times( x ↦ -1.0 ):φ ⟧
+        morphed 𝑛·1·4 := 𝑛·1·3
+      𝑛1·1 := 𝑛·1·4  # 𝕄(ξ.a)
       𝕄(ξ.b):
-        𝑛·1·4 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎2:λ ) )
-        𝑛·1·5 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎2:λ ), neg ↦ ρ.times( x ↦ -1.0 ):φ ⟧
-        morphed 𝑛·1·6 := 𝑛·1·5
-      𝑛2·1 := 𝑛·1·6  # 𝕄(ξ.b)
+        𝑛·1·5 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎2:λ ) )
+        𝑛·1·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎2:λ ), neg ↦ ρ.times( x ↦ -1.0 ):φ ⟧
+        morphed 𝑛·1·7 := 𝑛·1·6
+      𝑛2·1 := 𝑛·1·7  # 𝕄(ξ.b)
       symbolized 𝜎4 := 40-45-00-00-00-00-00-00  # 42.0
       𝑛3·1 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎4:λ ), neg ↦ ρ.times( x ↦ -1.0 ):φ ⟧  # symbolize(𝑛1)
       joined 𝜎5 := 𝛿1·1 ? 𝜎4 : 𝜎2
-      𝑛·1·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎5:λ ), neg ↦ ρ.times( x ↦ -1.0 ):φ ⟧
-    𝑛·0·1 := Φ.bytes( φ ↦ 𝜎5:λ )
-    𝑛·0·2 := 𝜎5:λ:φ
-    morphed 𝑛·0·3 := 𝑛·0·2
+      𝑛·1·8 := ⟦ φ ↦ Φ.bytes( φ ↦ 𝜎5:λ ), neg ↦ ρ.times( x ↦ -1.0 ):φ ⟧
+    normalized 𝑛·0·1 := Φ.bytes( φ ↦ 𝜎5:λ )  # 𝑛·1·8.φ
+    normalized 𝑛·0·2 := ∅:φ  # Φ.bytes
+    𝑛·0·3 := Φ.bytes( φ ↦ 𝜎5:λ )
+    𝑛·0·4 := 𝜎5:λ:φ
+    morphed 𝑛·0·5 := 𝑛·0·4
diff --git a/test-resources/evaluate-packs/joins-two-sides-a-stay-brought-to-one-shape.yaml b/test-resources/evaluate-packs/joins-two-sides-a-stay-brought-to-one-shape.yaml
--- a/test-resources/evaluate-packs/joins-two-sides-a-stay-brought-to-one-shape.yaml
+++ b/test-resources/evaluate-packs/joins-two-sides-a-stay-brought-to-one-shape.yaml
@@ -48,6 +48,8 @@
       joined 𝜎4 := 𝛿1·1 ? 𝜎1 : 𝜎2
       𝑛·1·3 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎4:λ ) ):φ
       remembered 𝑛·1·3 ≡ 𝑛·0·1
-    𝑛·0·2 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎4:λ ) )
-    𝑛·0·3 := Φ.bytes( φ ↦ 𝜎4:λ ):φ
-    morphed 𝑛·0·4 := 𝑛·0·3
+    normalized 𝑛·0·2 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎4:λ ), ρ ↦ Φ.number( φ ↦ Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎4:λ ) ) ) )  # 𝑛·1·3.φ
+    normalized 𝑛·0·3 := ∅:φ  # Φ.number
+    𝑛·0·4 := Φ.number( φ ↦ Φ.bytes( φ ↦ 𝜎4:λ ) )
+    𝑛·0·5 := Φ.bytes( φ ↦ 𝜎4:λ ):φ
+    morphed 𝑛·0·6 := 𝑛·0·5
diff --git a/test-resources/evaluate-packs/joins-two-sides-differing-in-a-datum-a-symbolize-found-off-the-phi-chain.yaml b/test-resources/evaluate-packs/joins-two-sides-differing-in-a-datum-a-symbolize-found-off-the-phi-chain.yaml
--- a/test-resources/evaluate-packs/joins-two-sides-differing-in-a-datum-a-symbolize-found-off-the-phi-chain.yaml
+++ b/test-resources/evaluate-packs/joins-two-sides-differing-in-a-datum-a-symbolize-found-off-the-phi-chain.yaml
@@ -44,8 +44,9 @@
       𝑛3·1 := Φ.bool( if ↦ 𝜎3:λ:φ ):φ  # symbolize(𝑛1)
       joined 𝜎4 := 𝛿1·1 ? 𝜎3 : 𝜎2
       𝑛·1·3 := Φ.bool( if ↦ 𝜎4:λ:φ ):φ
-    remembered 𝑛·0·1 ≡ Φ.bool  # ⟦ if ↦ ∅, φ ↦ if ⟧
-    𝑛·0·2 := Φ.bool( if ↦ 𝜎4:λ:φ )
-    𝑛·0·3 := ⟦ if ↦ 𝜎4:λ:φ, φ ↦ if ⟧
-    remembered 𝑛·0·3 ≡ 𝑛·0·1( if ↦ 𝜎4:λ:φ )
-    morphed 𝑛·0·4 := 𝑛·0·3
+    normalized 𝑛·0·1 := Φ.bool( if ↦ 𝜎4:λ:φ, ρ ↦ 𝑛·1·3 )  # 𝑛·1·3.φ
+    remembered 𝑛·0·2 ≡ Φ.bool  # ⟦ if ↦ ∅, φ ↦ if ⟧
+    𝑛·0·3 := Φ.bool( if ↦ 𝜎4:λ:φ )
+    𝑛·0·4 := ⟦ if ↦ 𝜎4:λ:φ, φ ↦ if ⟧
+    remembered 𝑛·0·4 ≡ 𝑛·0·2( if ↦ 𝜎4:λ:φ )
+    morphed 𝑛·0·5 := 𝑛·0·4
diff --git a/test-resources/evaluate-packs/joins-two-sides-that-differ-only-in-symbols.yaml b/test-resources/evaluate-packs/joins-two-sides-that-differ-only-in-symbols.yaml
--- a/test-resources/evaluate-packs/joins-two-sides-that-differ-only-in-symbols.yaml
+++ b/test-resources/evaluate-packs/joins-two-sides-that-differ-only-in-symbols.yaml
@@ -37,10 +37,12 @@
 result: '𝜎5:λ'
 protocol: |
   𝕄(Φ.φ):
-    𝑛·0·1 := 5.0
-    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-    𝑛·0·3 := 𝑛·0·1.gt( x ↦ 0.0 )
-    𝑛·0·4 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧
+    normalized 𝑛·0·1 := ⟦ φ ↦ ∅, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number
+    𝑛·0·2 := 5.0
+    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+    normalized 𝑛·0·4 := ⟦ x ↦ ∅, λ ⤍ L_number_gt ⟧  # 𝑛·0·3.gt
+    𝑛·0·5 := 𝑛·0·2.gt( x ↦ 0.0 )
+    𝑛·0·6 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧
     𝔼(L_number_gt):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -48,50 +50,59 @@
           𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·1·3 := 𝑛·1·2
         boxed 𝑛·1·4 := 𝑛·1·3.φ
+        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4
         𝕄(𝑛·1·4):
-          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
-          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes
+          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
+          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·9 := 𝑛·1·8
+        boxed 𝑛·1·10 := 𝑛·1·9.φ
+        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10
         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·9 := 0.0
-          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·1·11 := 𝑛·1·10
-        boxed 𝑛·1·12 := 𝑛·1·11.φ
-        𝕄(𝑛·1·12):
-          𝑛·1·13 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
-          𝑛·1·14 := 00-00-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·15 := 𝑛·1·14
-        boxed 𝑛·1·16 := 𝑛·1·15.φ
+          𝑛·1·12 := 0.0
+          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·1·14 := 𝑛·1·13
+        boxed 𝑛·1·15 := 𝑛·1·14.φ
+        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )  # 𝑛·1·15
+        𝕄(𝑛·1·15):
+          𝑛·1·17 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
+          𝑛·1·18 := 00-00-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·19 := 𝑛·1·18
+        boxed 𝑛·1·20 := 𝑛·1·19.φ
+        normalized 𝑛·1·21 := 00-00-00-00-00-00-00-00:Δ  # 𝑛·1·20
         𝛿·1·2 := 00-00-00-00-00-00-00-00  # 0.0
       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)
-      𝑛·1·17 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛
-      𝕄(𝑛·1·17):
-        𝑛·1·18 := Φ.bool( φ ↦ 𝜎1:λ )
-        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
-        morphed 𝑛·1·20 := 𝑛·1·19
-      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)
-    𝑛·0·5 := 𝑛·1·18.if( then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·9 ) )
-    𝑛·0·6 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·9 ), else ↦ ∅, λ ⤍ L_fork ⟧
-    𝑛·0·7 := 𝑛·0·5( else ↦ 3.0.plus( 4.0 ).plus( 𝑛·1·9 ) )
-    𝑛·0·8 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·9 ), else ↦ 3.0.plus( 4.0 ).plus( 𝑛·1·9 ), λ ⤍ L_fork ⟧
+      𝑛·1·22 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛
+      𝕄(𝑛·1·22):
+        normalized 𝑛·1·23 := ⟦ φ ↦ ∅, if(then, else) ↦ L_fork:λ ⟧  # Φ.bool
+        𝑛·1·24 := Φ.bool( φ ↦ 𝜎1:λ )
+        𝑛·1·25 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
+        morphed 𝑛·1·26 := 𝑛·1·25
+      𝑛·1·27 := 𝑛·1·26  # 𝕄(𝑛·1·22)
+    normalized 𝑛·0·7 := ⟦ then ↦ ∅, else ↦ ∅, λ ⤍ L_fork ⟧  # 𝑛·1·27.if
+    𝑛·0·8 := 𝑛·1·24.if( then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·12 ) )
+    𝑛·0·9 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·12 ), else ↦ ∅, λ ⤍ L_fork ⟧
+    𝑛·0·10 := 𝑛·0·8( else ↦ 3.0.plus( 4.0 ).plus( 𝑛·1·12 ) )
+    𝑛·0·11 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·12 ), else ↦ 3.0.plus( 4.0 ).plus( 𝑛·1·12 ), λ ⤍ L_fork ⟧
     𝔼(L_fork):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
           𝑛·2·1 := Φ.bool( φ ↦ 𝜎1:λ )
           𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
-          morphed 𝑛·2·3 := 𝑛·1·21
+          morphed 𝑛·2·3 := 𝑛·1·27
         boxed 𝑛·2·4 := 𝑛·2·3.φ
+        normalized 𝑛·2·5 := 𝜎1:λ  # 𝑛·2·4
         𝛿·2·1 := 𝔻(𝜎1:λ)
       𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)
       𝕄(ξ.then):
-        𝑛·2·5 := 1.0
-        𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        𝑛·2·7 := 𝑛·2·5.plus( x ↦ 2.0 )
-        𝑛·2·8 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧
+        𝑛·2·6 := 1.0
+        𝑛·2·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        normalized 𝑛·2·8 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·2·7.plus
+        𝑛·2·9 := 𝑛·2·6.plus( x ↦ 2.0 )
+        𝑛·2·10 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧
         𝔼(L_number_plus):
           𝔻(ξ.ρ):
             𝕄(ξ.ρ):
@@ -99,40 +110,46 @@
               𝑛·3·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
               morphed 𝑛·3·3 := 𝑛·3·2
             boxed 𝑛·3·4 := 𝑛·3·3.φ
+            normalized 𝑛·3·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )  # 𝑛·3·4
             𝕄(𝑛·3·4):
-              𝑛·3·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )
-              𝑛·3·6 := 3F-F0-00-00-00-00-00-00:Δ:φ
-              morphed 𝑛·3·7 := 𝑛·3·6
-            boxed 𝑛·3·8 := 𝑛·3·7.φ
+              𝑛·3·6 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )
+              𝑛·3·7 := 3F-F0-00-00-00-00-00-00:Δ:φ
+              morphed 𝑛·3·8 := 𝑛·3·7
+            boxed 𝑛·3·9 := 𝑛·3·8.φ
+            normalized 𝑛·3·10 := 3F-F0-00-00-00-00-00-00:Δ  # 𝑛·3·9
             𝛿·3·1 := 3F-F0-00-00-00-00-00-00  # 1.0
           𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.ρ)
           𝔻(ξ.x):
             𝕄(ξ.x):
-              𝑛·3·9 := 2.0
-              𝑛·3·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-              morphed 𝑛·3·11 := 𝑛·3·10
-            boxed 𝑛·3·12 := 𝑛·3·11.φ
-            𝕄(𝑛·3·12):
-              𝑛·3·13 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )
-              𝑛·3·14 := 40-00-00-00-00-00-00-00:Δ:φ
-              morphed 𝑛·3·15 := 𝑛·3·14
-            boxed 𝑛·3·16 := 𝑛·3·15.φ
+              𝑛·3·11 := 2.0
+              𝑛·3·12 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+              morphed 𝑛·3·13 := 𝑛·3·12
+            boxed 𝑛·3·14 := 𝑛·3·13.φ
+            normalized 𝑛·3·15 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )  # 𝑛·3·14
+            𝕄(𝑛·3·14):
+              𝑛·3·16 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )
+              𝑛·3·17 := 40-00-00-00-00-00-00-00:Δ:φ
+              morphed 𝑛·3·18 := 𝑛·3·17
+            boxed 𝑛·3·19 := 𝑛·3·18.φ
+            normalized 𝑛·3·20 := 40-00-00-00-00-00-00-00:Δ  # 𝑛·3·19
             𝛿·3·2 := 40-00-00-00-00-00-00-00  # 2.0
           𝛿2·3 := 𝛿·3·2  # 𝔻(ξ.x)
-          𝑛·3·17 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
-          𝕄(𝑛·3·17):
-            𝑛·3·18 := Φ.number( φ ↦ 𝜎2:λ )
-            𝑛·3·19 := ⟦ φ ↦ 𝜎2:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-            morphed 𝑛·3·20 := 𝑛·3·19
-          𝑛·3·21 := 𝑛·3·20  # 𝕄(𝑛·3·17)
-        𝑛·2·9 := 𝑛·3·18.plus( x ↦ 𝑛·1·9 )
-        𝑛·2·10 := ⟦ x ↦ 𝑛·1·9, λ ⤍ L_number_plus ⟧
-        morphed 𝑛·2·11 := 𝑛·2·10
+          𝑛·3·21 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
+          𝕄(𝑛·3·21):
+            𝑛·3·22 := Φ.number( φ ↦ 𝜎2:λ )
+            𝑛·3·23 := ⟦ φ ↦ 𝜎2:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+            morphed 𝑛·3·24 := 𝑛·3·23
+          𝑛·3·25 := 𝑛·3·24  # 𝕄(𝑛·3·21)
+        normalized 𝑛·2·11 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·3·25.plus
+        𝑛·2·12 := 𝑛·3·22.plus( x ↦ 𝑛·1·12 )
+        𝑛·2·13 := ⟦ x ↦ 𝑛·1·12, λ ⤍ L_number_plus ⟧
+        morphed 𝑛·2·14 := 𝑛·2·13
       𝕄(ξ.else):
-        𝑛·2·12 := 3.0
-        𝑛·2·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        𝑛·2·14 := 𝑛·2·12.plus( x ↦ 4.0 )
-        𝑛·2·15 := ⟦ x ↦ 4.0, λ ⤍ L_number_plus ⟧
+        𝑛·2·15 := 3.0
+        𝑛·2·16 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        normalized 𝑛·2·17 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·2·16.plus
+        𝑛·2·18 := 𝑛·2·15.plus( x ↦ 4.0 )
+        𝑛·2·19 := ⟦ x ↦ 4.0, λ ⤍ L_number_plus ⟧
         𝔼(L_number_plus):
           𝔻(ξ.ρ):
             𝕄(ξ.ρ):
@@ -140,37 +157,42 @@
               𝑛·4·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
               morphed 𝑛·4·3 := 𝑛·4·2
             boxed 𝑛·4·4 := 𝑛·4·3.φ
+            normalized 𝑛·4·5 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )  # 𝑛·4·4
             𝕄(𝑛·4·4):
-              𝑛·4·5 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )
-              𝑛·4·6 := 40-08-00-00-00-00-00-00:Δ:φ
-              morphed 𝑛·4·7 := 𝑛·4·6
-            boxed 𝑛·4·8 := 𝑛·4·7.φ
+              𝑛·4·6 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )
+              𝑛·4·7 := 40-08-00-00-00-00-00-00:Δ:φ
+              morphed 𝑛·4·8 := 𝑛·4·7
+            boxed 𝑛·4·9 := 𝑛·4·8.φ
+            normalized 𝑛·4·10 := 40-08-00-00-00-00-00-00:Δ  # 𝑛·4·9
             𝛿·4·1 := 40-08-00-00-00-00-00-00  # 3.0
           𝛿1·4 := 𝛿·4·1  # 𝔻(ξ.ρ)
           𝔻(ξ.x):
             𝕄(ξ.x):
-              𝑛·4·9 := 4.0
-              𝑛·4·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-              morphed 𝑛·4·11 := 𝑛·4·10
-            boxed 𝑛·4·12 := 𝑛·4·11.φ
-            𝕄(𝑛·4·12):
-              𝑛·4·13 := Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ )
-              𝑛·4·14 := 40-10-00-00-00-00-00-00:Δ:φ
-              morphed 𝑛·4·15 := 𝑛·4·14
-            boxed 𝑛·4·16 := 𝑛·4·15.φ
+              𝑛·4·11 := 4.0
+              𝑛·4·12 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+              morphed 𝑛·4·13 := 𝑛·4·12
+            boxed 𝑛·4·14 := 𝑛·4·13.φ
+            normalized 𝑛·4·15 := Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ )  # 𝑛·4·14
+            𝕄(𝑛·4·14):
+              𝑛·4·16 := Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ )
+              𝑛·4·17 := 40-10-00-00-00-00-00-00:Δ:φ
+              morphed 𝑛·4·18 := 𝑛·4·17
+            boxed 𝑛·4·19 := 𝑛·4·18.φ
+            normalized 𝑛·4·20 := 40-10-00-00-00-00-00-00:Δ  # 𝑛·4·19
             𝛿·4·2 := 40-10-00-00-00-00-00-00  # 4.0
           𝛿2·4 := 𝛿·4·2  # 𝔻(ξ.x)
-          𝑛·4·17 := Φ.number( φ ↦ 𝜎3:λ )  # 𝑛
-          𝕄(𝑛·4·17):
-            𝑛·4·18 := Φ.number( φ ↦ 𝜎3:λ )
-            𝑛·4·19 := ⟦ φ ↦ 𝜎3:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-            morphed 𝑛·4·20 := 𝑛·4·19
-          𝑛·4·21 := 𝑛·4·20  # 𝕄(𝑛·4·17)
-        𝑛·2·16 := 𝑛·4·18.plus( x ↦ 𝑛·1·9 )
-        𝑛·2·17 := ⟦ x ↦ 𝑛·1·9, λ ⤍ L_number_plus ⟧
-        morphed 𝑛·2·18 := 𝑛·2·17
+          𝑛·4·21 := Φ.number( φ ↦ 𝜎3:λ )  # 𝑛
+          𝕄(𝑛·4·21):
+            𝑛·4·22 := Φ.number( φ ↦ 𝜎3:λ )
+            𝑛·4·23 := ⟦ φ ↦ 𝜎3:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+            morphed 𝑛·4·24 := 𝑛·4·23
+          𝑛·4·25 := 𝑛·4·24  # 𝕄(𝑛·4·21)
+        normalized 𝑛·2·20 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·4·25.plus
+        𝑛·2·21 := 𝑛·4·22.plus( x ↦ 𝑛·1·12 )
+        𝑛·2·22 := ⟦ x ↦ 𝑛·1·12, λ ⤍ L_number_plus ⟧
+        morphed 𝑛·2·23 := 𝑛·2·22
       joined 𝜎4 := 𝛿1·2 ? 𝜎2 : 𝜎3
-      𝑛·2·19 := ⟦ x ↦ 𝑛·1·9, λ ⤍ L_number_plus ⟧
+      𝑛·2·24 := ⟦ x ↦ 𝑛·1·12, λ ⤍ L_number_plus ⟧
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -178,25 +200,29 @@
           𝑛·5·2 := ⟦ φ ↦ 𝜎4:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·5·3 := 𝑛·5·2
         boxed 𝑛·5·4 := 𝑛·5·3.φ
+        normalized 𝑛·5·5 := 𝜎4:λ  # 𝑛·5·4
         𝛿·5·1 := 𝔻(𝜎4:λ)
       𝛿1·5 := 𝛿·5·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·5·5 := Φ.number( φ ↦ 𝑛·1·13 )
-          𝑛·5·6 := ⟦ φ ↦ 𝑛·1·13, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·5·7 := 𝑛·5·6
-        boxed 𝑛·5·8 := 𝑛·5·7.φ
-        𝕄(𝑛·5·8):
-          𝑛·5·9 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
-          𝑛·5·10 := 00-00-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·5·11 := 𝑛·5·10
-        boxed 𝑛·5·12 := 𝑛·5·11.φ
+          𝑛·5·6 := Φ.number( φ ↦ 𝑛·1·17 )
+          𝑛·5·7 := ⟦ φ ↦ 𝑛·1·17, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·5·8 := 𝑛·5·7
+        boxed 𝑛·5·9 := 𝑛·5·8.φ
+        normalized 𝑛·5·10 := 𝑛·1·17  # 𝑛·5·9
+        𝕄(𝑛·5·9):
+          𝑛·5·11 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
+          𝑛·5·12 := 00-00-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·5·13 := 𝑛·5·12
+        boxed 𝑛·5·14 := 𝑛·5·13.φ
+        normalized 𝑛·5·15 := 00-00-00-00-00-00-00-00:Δ  # 𝑛·5·14
         𝛿·5·2 := 00-00-00-00-00-00-00-00  # 0.0
       𝛿2·5 := 𝛿·5·2  # 𝔻(ξ.x)
-      𝑛·5·13 := Φ.number( φ ↦ 𝜎5:λ )  # 𝑛
-      𝕄(𝑛·5·13):
-        𝑛·5·14 := Φ.number( φ ↦ 𝜎5:λ )
-        𝑛·5·15 := ⟦ φ ↦ 𝜎5:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        morphed 𝑛·5·16 := 𝑛·5·15
-      𝑛·5·17 := 𝑛·5·16  # 𝕄(𝑛·5·13)
-    morphed 𝑛·0·9 := 𝜎5:λ
+      𝑛·5·16 := Φ.number( φ ↦ 𝜎5:λ )  # 𝑛
+      𝕄(𝑛·5·16):
+        𝑛·5·17 := Φ.number( φ ↦ 𝜎5:λ )
+        𝑛·5·18 := ⟦ φ ↦ 𝜎5:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        morphed 𝑛·5·19 := 𝑛·5·18
+      𝑛·5·20 := 𝑛·5·19  # 𝕄(𝑛·5·16)
+    normalized 𝑛·0·12 := 𝜎5:λ  # 𝑛·5·20.φ
+    morphed 𝑛·0·13 := 𝑛·0·12
diff --git a/test-resources/evaluate-packs/leaves-a-formation-with-an-attribute-of-its-own-as-it-is.yaml b/test-resources/evaluate-packs/leaves-a-formation-with-an-attribute-of-its-own-as-it-is.yaml
--- a/test-resources/evaluate-packs/leaves-a-formation-with-an-attribute-of-its-own-as-it-is.yaml
+++ b/test-resources/evaluate-packs/leaves-a-formation-with-an-attribute-of-its-own-as-it-is.yaml
@@ -59,4 +59,5 @@
       joined 𝜎4 := 𝛿1·1 ? 𝜎2 : 𝜎3
       𝑛·1·8 := ⟦ v ↦ 𝜎4:λ, tag ↦ v, λ ⤍ L_box ⟧
       remembered 𝑛·1·9 ≡ 𝑛·0·1  # ⟦ v ↦ 𝜎4:λ, tag ↦ v, λ ⤍ L_box ⟧
-    morphed 𝑛·0·2 := 𝜎4:λ
+    normalized 𝑛·0·2 := 𝜎4:λ  # 𝑛·1·9.tag
+    morphed 𝑛·0·3 := 𝑛·0·2
diff --git a/test-resources/evaluate-packs/mints-a-fresh-symbol-for-every-firing.yaml b/test-resources/evaluate-packs/mints-a-fresh-symbol-for-every-firing.yaml
--- a/test-resources/evaluate-packs/mints-a-fresh-symbol-for-every-firing.yaml
+++ b/test-resources/evaluate-packs/mints-a-fresh-symbol-for-every-firing.yaml
@@ -20,10 +20,12 @@
 result: '𝜎2:λ'
 protocol: |
   𝕄(Φ.φ):
-    𝑛·0·1 := 5.0
-    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0 )
-    𝑛·0·4 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧
+    normalized 𝑛·0·1 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number
+    𝑛·0·2 := 5.0
+    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+    normalized 𝑛·0·4 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·3.plus
+    𝑛·0·5 := 𝑛·0·2.plus( x ↦ 6.0 )
+    𝑛·0·6 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -31,60 +33,70 @@
           𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·1·3 := 𝑛·1·2
         boxed 𝑛·1·4 := 𝑛·1·3.φ
+        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4
         𝕄(𝑛·1·4):
-          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
-          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes
+          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
+          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·9 := 𝑛·1·8
+        boxed 𝑛·1·10 := 𝑛·1·9.φ
+        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10
         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·9 := 6.0
-          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·1·11 := 𝑛·1·10
-        boxed 𝑛·1·12 := 𝑛·1·11.φ
-        𝕄(𝑛·1·12):
-          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
-          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·15 := 𝑛·1·14
-        boxed 𝑛·1·16 := 𝑛·1·15.φ
+          𝑛·1·12 := 6.0
+          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·1·14 := 𝑛·1·13
+        boxed 𝑛·1·15 := 𝑛·1·14.φ
+        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )  # 𝑛·1·15
+        𝕄(𝑛·1·15):
+          𝑛·1·17 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
+          𝑛·1·18 := 40-18-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·19 := 𝑛·1·18
+        boxed 𝑛·1·20 := 𝑛·1·19.φ
+        normalized 𝑛·1·21 := 40-18-00-00-00-00-00-00:Δ  # 𝑛·1·20
         𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0
       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)
-      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛
-      𝕄(𝑛·1·17):
-        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )
-        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
-        morphed 𝑛·1·20 := 𝑛·1·19
-      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)
-    𝑛·0·5 := 𝑛·1·18.plus( x ↦ 7.0 )
-    𝑛·0·6 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧
+      𝑛·1·22 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛
+      𝕄(𝑛·1·22):
+        𝑛·1·23 := Φ.number( φ ↦ 𝜎1:λ )
+        𝑛·1·24 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
+        morphed 𝑛·1·25 := 𝑛·1·24
+      𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·22)
+    normalized 𝑛·0·7 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·1·26.plus
+    𝑛·0·8 := 𝑛·1·23.plus( x ↦ 7.0 )
+    𝑛·0·9 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
           𝑛·2·1 := Φ.number( φ ↦ 𝜎1:λ )
           𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·2·3 := 𝑛·1·21
+          morphed 𝑛·2·3 := 𝑛·1·26
         boxed 𝑛·2·4 := 𝑛·2·3.φ
+        normalized 𝑛·2·5 := 𝜎1:λ  # 𝑛·2·4
         𝛿·2·1 := 𝔻(𝜎1:λ)
       𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·2·5 := 7.0
-          𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·2·7 := 𝑛·2·6
-        boxed 𝑛·2·8 := 𝑛·2·7.φ
-        𝕄(𝑛·2·8):
-          𝑛·2·9 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )
-          𝑛·2·10 := 40-1C-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·2·11 := 𝑛·2·10
-        boxed 𝑛·2·12 := 𝑛·2·11.φ
+          𝑛·2·6 := 7.0
+          𝑛·2·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·2·8 := 𝑛·2·7
+        boxed 𝑛·2·9 := 𝑛·2·8.φ
+        normalized 𝑛·2·10 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )  # 𝑛·2·9
+        𝕄(𝑛·2·9):
+          𝑛·2·11 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )
+          𝑛·2·12 := 40-1C-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·2·13 := 𝑛·2·12
+        boxed 𝑛·2·14 := 𝑛·2·13.φ
+        normalized 𝑛·2·15 := 40-1C-00-00-00-00-00-00:Δ  # 𝑛·2·14
         𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0
       𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)
-      𝑛·2·13 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
-      𝕄(𝑛·2·13):
-        𝑛·2·14 := Φ.number( φ ↦ 𝜎2:λ )
-        𝑛·2·15 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧
-        morphed 𝑛·2·16 := 𝑛·2·15
-      𝑛·2·17 := 𝑛·2·16  # 𝕄(𝑛·2·13)
-    morphed 𝑛·0·7 := 𝜎2:λ
+      𝑛·2·16 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
+      𝕄(𝑛·2·16):
+        𝑛·2·17 := Φ.number( φ ↦ 𝜎2:λ )
+        𝑛·2·18 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧
+        morphed 𝑛·2·19 := 𝑛·2·18
+      𝑛·2·20 := 𝑛·2·19  # 𝕄(𝑛·2·16)
+    normalized 𝑛·0·10 := 𝜎2:λ  # 𝑛·2·20.φ
+    morphed 𝑛·0·11 := 𝑛·0·10
diff --git a/test-resources/evaluate-packs/morphs-a-program-that-already-carries-a-symbol.yaml b/test-resources/evaluate-packs/morphs-a-program-that-already-carries-a-symbol.yaml
--- a/test-resources/evaluate-packs/morphs-a-program-that-already-carries-a-symbol.yaml
+++ b/test-resources/evaluate-packs/morphs-a-program-that-already-carries-a-symbol.yaml
@@ -20,10 +20,12 @@
 result: '𝜎2:λ'
 protocol: |
   𝕄(Φ.φ):
-    𝑛·0·1 := Φ.number( φ ↦ 𝜎1:λ )
-    𝑛·0·2 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
-    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 7.0 )
-    𝑛·0·4 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧
+    normalized 𝑛·0·1 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number
+    𝑛·0·2 := Φ.number( φ ↦ 𝜎1:λ )
+    𝑛·0·3 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
+    normalized 𝑛·0·4 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·3.plus
+    𝑛·0·5 := 𝑛·0·2.plus( x ↦ 7.0 )
+    𝑛·0·6 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -31,25 +33,30 @@
           𝑛·1·2 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·1·3 := 𝑛·1·2
         boxed 𝑛·1·4 := 𝑛·1·3.φ
+        normalized 𝑛·1·5 := 𝜎1:λ  # 𝑛·1·4
         𝛿·1·1 := 𝔻(𝜎1:λ)
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·5 := 7.0
-          𝑛·1·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
-        𝕄(𝑛·1·8):
-          𝑛·1·9 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )
-          𝑛·1·10 := 40-1C-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·11 := 𝑛·1·10
-        boxed 𝑛·1·12 := 𝑛·1·11.φ
+          𝑛·1·6 := 7.0
+          𝑛·1·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·1·8 := 𝑛·1·7
+        boxed 𝑛·1·9 := 𝑛·1·8.φ
+        normalized 𝑛·1·10 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )  # 𝑛·1·9
+        𝕄(𝑛·1·9):
+          normalized 𝑛·1·11 := ∅:φ  # Φ.bytes
+          𝑛·1·12 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )
+          𝑛·1·13 := 40-1C-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·14 := 𝑛·1·13
+        boxed 𝑛·1·15 := 𝑛·1·14.φ
+        normalized 𝑛·1·16 := 40-1C-00-00-00-00-00-00:Δ  # 𝑛·1·15
         𝛿·1·2 := 40-1C-00-00-00-00-00-00  # 7.0
       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)
-      𝑛·1·13 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
-      𝕄(𝑛·1·13):
-        𝑛·1·14 := Φ.number( φ ↦ 𝜎2:λ )
-        𝑛·1·15 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧
-        morphed 𝑛·1·16 := 𝑛·1·15
-      𝑛·1·17 := 𝑛·1·16  # 𝕄(𝑛·1·13)
-    morphed 𝑛·0·5 := 𝜎2:λ
+      𝑛·1·17 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
+      𝕄(𝑛·1·17):
+        𝑛·1·18 := Φ.number( φ ↦ 𝜎2:λ )
+        𝑛·1·19 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧
+        morphed 𝑛·1·20 := 𝑛·1·19
+      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)
+    normalized 𝑛·0·7 := 𝜎2:λ  # 𝑛·1·21.φ
+    morphed 𝑛·0·8 := 𝑛·0·7
diff --git a/test-resources/evaluate-packs/morphs-two-branches-spelling-one-term-through-one-firing.yaml b/test-resources/evaluate-packs/morphs-two-branches-spelling-one-term-through-one-firing.yaml
--- a/test-resources/evaluate-packs/morphs-two-branches-spelling-one-term-through-one-firing.yaml
+++ b/test-resources/evaluate-packs/morphs-two-branches-spelling-one-term-through-one-firing.yaml
@@ -40,10 +40,12 @@
 result: '⟦ x ↦ 9, λ ⤍ L_number_plus ⟧'
 protocol: |
   𝕄(Φ.φ):
-    𝑛·0·1 := 5.0
-    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-    𝑛·0·3 := 𝑛·0·1.gt( x ↦ 0.0 )
-    𝑛·0·4 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧
+    normalized 𝑛·0·1 := ⟦ φ ↦ ∅, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number
+    𝑛·0·2 := 5.0
+    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+    normalized 𝑛·0·4 := ⟦ x ↦ ∅, λ ⤍ L_number_gt ⟧  # 𝑛·0·3.gt
+    𝑛·0·5 := 𝑛·0·2.gt( x ↦ 0.0 )
+    𝑛·0·6 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧
     𝔼(L_number_gt):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -51,51 +53,60 @@
           𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·1·3 := 𝑛·1·2
         boxed 𝑛·1·4 := 𝑛·1·3.φ
+        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4
         𝕄(𝑛·1·4):
-          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
-          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes
+          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
+          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·9 := 𝑛·1·8
+        boxed 𝑛·1·10 := 𝑛·1·9.φ
+        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10
         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·9 := 0.0
-          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·1·11 := 𝑛·1·10
-        boxed 𝑛·1·12 := 𝑛·1·11.φ
-        𝕄(𝑛·1·12):
-          𝑛·1·13 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
-          𝑛·1·14 := 00-00-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·15 := 𝑛·1·14
-        boxed 𝑛·1·16 := 𝑛·1·15.φ
+          𝑛·1·12 := 0.0
+          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·1·14 := 𝑛·1·13
+        boxed 𝑛·1·15 := 𝑛·1·14.φ
+        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )  # 𝑛·1·15
+        𝕄(𝑛·1·15):
+          𝑛·1·17 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
+          𝑛·1·18 := 00-00-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·19 := 𝑛·1·18
+        boxed 𝑛·1·20 := 𝑛·1·19.φ
+        normalized 𝑛·1·21 := 00-00-00-00-00-00-00-00:Δ  # 𝑛·1·20
         𝛿·1·2 := 00-00-00-00-00-00-00-00  # 0.0
       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)
-      𝑛·1·17 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛
-      𝕄(𝑛·1·17):
-        𝑛·1·18 := Φ.bool( φ ↦ 𝜎1:λ )
-        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
-        morphed 𝑛·1·20 := 𝑛·1·19
-      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)
-      memoized 𝑛·0·4 ⇛ 𝑛·1·21
-    𝑛·0·5 := 𝑛·1·18.if( then ↦ 1.0.plus( 2.0 ).plus( 3.0 ) )
-    𝑛·0·6 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 3.0 ), else ↦ ∅, λ ⤍ L_fork ⟧
-    𝑛·0·7 := 𝑛·0·5( else ↦ 1.0.plus( 2.0 ).plus( 3.0 ) )
-    𝑛·0·8 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 3.0 ), else ↦ 1.0.plus( 2.0 ).plus( 3.0 ), λ ⤍ L_fork ⟧
+      𝑛·1·22 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛
+      𝕄(𝑛·1·22):
+        normalized 𝑛·1·23 := ⟦ φ ↦ ∅, if(then, else) ↦ L_fork:λ ⟧  # Φ.bool
+        𝑛·1·24 := Φ.bool( φ ↦ 𝜎1:λ )
+        𝑛·1·25 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
+        morphed 𝑛·1·26 := 𝑛·1·25
+      𝑛·1·27 := 𝑛·1·26  # 𝕄(𝑛·1·22)
+      memoized 𝑛·0·6 ⇛ 𝑛·1·27
+    normalized 𝑛·0·7 := ⟦ then ↦ ∅, else ↦ ∅, λ ⤍ L_fork ⟧  # 𝑛·1·27.if
+    𝑛·0·8 := 𝑛·1·24.if( then ↦ 1.0.plus( 2.0 ).plus( 3.0 ) )
+    𝑛·0·9 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 3.0 ), else ↦ ∅, λ ⤍ L_fork ⟧
+    𝑛·0·10 := 𝑛·0·8( else ↦ 1.0.plus( 2.0 ).plus( 3.0 ) )
+    𝑛·0·11 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 3.0 ), else ↦ 1.0.plus( 2.0 ).plus( 3.0 ), λ ⤍ L_fork ⟧
     𝔼(L_fork):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
           𝑛·2·1 := Φ.bool( φ ↦ 𝜎1:λ )
           𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
-          morphed 𝑛·2·3 := 𝑛·1·21
+          morphed 𝑛·2·3 := 𝑛·1·27
         boxed 𝑛·2·4 := 𝑛·2·3.φ
+        normalized 𝑛·2·5 := 𝜎1:λ  # 𝑛·2·4
         𝛿·2·1 := 𝔻(𝜎1:λ)
       𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)
       𝕄(ξ.then):
-        𝑛·2·5 := 1.0
-        𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        𝑛·2·7 := 𝑛·2·5.plus( x ↦ 2.0 )
-        𝑛·2·8 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧
+        𝑛·2·6 := 1.0
+        𝑛·2·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        normalized 𝑛·2·8 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·2·7.plus
+        𝑛·2·9 := 𝑛·2·6.plus( x ↦ 2.0 )
+        𝑛·2·10 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧
         𝔼(L_number_plus):
           𝔻(ξ.ρ):
             𝕄(ξ.ρ):
@@ -103,55 +114,62 @@
               𝑛·3·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
               morphed 𝑛·3·3 := 𝑛·3·2
             boxed 𝑛·3·4 := 𝑛·3·3.φ
+            normalized 𝑛·3·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )  # 𝑛·3·4
             𝕄(𝑛·3·4):
-              𝑛·3·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )
-              𝑛·3·6 := 3F-F0-00-00-00-00-00-00:Δ:φ
-              morphed 𝑛·3·7 := 𝑛·3·6
-            boxed 𝑛·3·8 := 𝑛·3·7.φ
+              𝑛·3·6 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )
+              𝑛·3·7 := 3F-F0-00-00-00-00-00-00:Δ:φ
+              morphed 𝑛·3·8 := 𝑛·3·7
+            boxed 𝑛·3·9 := 𝑛·3·8.φ
+            normalized 𝑛·3·10 := 3F-F0-00-00-00-00-00-00:Δ  # 𝑛·3·9
             𝛿·3·1 := 3F-F0-00-00-00-00-00-00  # 1.0
           𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.ρ)
           𝔻(ξ.x):
             𝕄(ξ.x):
-              𝑛·3·9 := 2.0
-              𝑛·3·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-              morphed 𝑛·3·11 := 𝑛·3·10
-            boxed 𝑛·3·12 := 𝑛·3·11.φ
-            𝕄(𝑛·3·12):
-              𝑛·3·13 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )
-              𝑛·3·14 := 40-00-00-00-00-00-00-00:Δ:φ
-              morphed 𝑛·3·15 := 𝑛·3·14
-            boxed 𝑛·3·16 := 𝑛·3·15.φ
+              𝑛·3·11 := 2.0
+              𝑛·3·12 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+              morphed 𝑛·3·13 := 𝑛·3·12
+            boxed 𝑛·3·14 := 𝑛·3·13.φ
+            normalized 𝑛·3·15 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )  # 𝑛·3·14
+            𝕄(𝑛·3·14):
+              𝑛·3·16 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )
+              𝑛·3·17 := 40-00-00-00-00-00-00-00:Δ:φ
+              morphed 𝑛·3·18 := 𝑛·3·17
+            boxed 𝑛·3·19 := 𝑛·3·18.φ
+            normalized 𝑛·3·20 := 40-00-00-00-00-00-00-00:Δ  # 𝑛·3·19
             𝛿·3·2 := 40-00-00-00-00-00-00-00  # 2.0
           𝛿2·3 := 𝛿·3·2  # 𝔻(ξ.x)
-          𝑛·3·17 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
-          𝕄(𝑛·3·17):
-            𝑛·3·18 := Φ.number( φ ↦ 𝜎2:λ )
-            𝑛·3·19 := ⟦ φ ↦ 𝜎2:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-            morphed 𝑛·3·20 := 𝑛·3·19
-          𝑛·3·21 := 𝑛·3·20  # 𝕄(𝑛·3·17)
-          memoized 𝑛·2·8 ⇛ 𝑛·3·21
-        𝑛·2·9 := 𝑛·3·18.plus( x ↦ 3.0 )
-        𝑛·2·10 := ⟦ x ↦ 3.0, λ ⤍ L_number_plus ⟧
-        morphed 𝑛·2·11 := 𝑛·2·10
-      𝑛1·2 := 𝑛·2·10  # 𝕄(ξ.then)
+          𝑛·3·21 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
+          𝕄(𝑛·3·21):
+            𝑛·3·22 := Φ.number( φ ↦ 𝜎2:λ )
+            𝑛·3·23 := ⟦ φ ↦ 𝜎2:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+            morphed 𝑛·3·24 := 𝑛·3·23
+          𝑛·3·25 := 𝑛·3·24  # 𝕄(𝑛·3·21)
+          memoized 𝑛·2·10 ⇛ 𝑛·3·25
+        normalized 𝑛·2·11 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·3·25.plus
+        𝑛·2·12 := 𝑛·3·22.plus( x ↦ 3.0 )
+        𝑛·2·13 := ⟦ x ↦ 3.0, λ ⤍ L_number_plus ⟧
+        morphed 𝑛·2·14 := 𝑛·2·13
+      𝑛1·2 := 𝑛·2·13  # 𝕄(ξ.then)
       𝕄(ξ.else):
-        𝑛·2·12 := Φ.number( φ ↦ 𝑛·3·5 )
-        𝑛·2·13 := ⟦ φ ↦ 𝑛·3·5, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        𝑛·2·14 := 𝑛·2·12.plus( x ↦ 𝑛·3·9 )
-        𝑛·2·15 := ⟦ x ↦ 𝑛·3·9, λ ⤍ L_number_plus ⟧
+        𝑛·2·15 := Φ.number( φ ↦ 𝑛·3·6 )
+        𝑛·2·16 := ⟦ φ ↦ 𝑛·3·6, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        normalized 𝑛·2·17 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·2·16.plus
+        𝑛·2·18 := 𝑛·2·15.plus( x ↦ 𝑛·3·11 )
+        𝑛·2·19 := ⟦ x ↦ 𝑛·3·11, λ ⤍ L_number_plus ⟧
         𝔼(L_number_plus):
-          recalled 𝑛·2·8 ⇒ 𝑛·3·21
-          𝑛·4·1 := 𝑛·3·18  # 𝑛
-          𝑛·4·2 := 𝑛·3·21  # 𝕄(𝑛·4·1)
-        𝑛·2·16 := 𝑛·3·18.plus( x ↦ 3.0 )
-        𝑛·2·17 := ⟦ x ↦ 3.0, λ ⤍ L_number_plus ⟧
-        morphed 𝑛·2·18 := 𝑛·2·17
-      𝑛2·2 := 𝑛·2·17  # 𝕄(ξ.else)
-      𝑛·2·19 := 𝑛·2·17  # 𝑛
-      𝕄(𝑛·2·19):
-        morphed 𝑛·2·20 := 𝑛·2·17
-      𝑛·2·21 := 𝑛·2·17  # 𝕄(𝑛·2·19)
-      memoized 𝑛·0·8 ⇛ 𝑛·2·17
+          recalled 𝑛·2·10 ⇒ 𝑛·3·25
+          𝑛·4·1 := 𝑛·3·22  # 𝑛
+          𝑛·4·2 := 𝑛·3·25  # 𝕄(𝑛·4·1)
+        normalized 𝑛·2·20 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·4·2.plus
+        𝑛·2·21 := 𝑛·3·22.plus( x ↦ 3.0 )
+        𝑛·2·22 := ⟦ x ↦ 3.0, λ ⤍ L_number_plus ⟧
+        morphed 𝑛·2·23 := 𝑛·2·22
+      𝑛2·2 := 𝑛·2·22  # 𝕄(ξ.else)
+      𝑛·2·24 := 𝑛·2·22  # 𝑛
+      𝕄(𝑛·2·24):
+        morphed 𝑛·2·25 := 𝑛·2·22
+      𝑛·2·26 := 𝑛·2·22  # 𝕄(𝑛·2·24)
+      memoized 𝑛·0·11 ⇛ 𝑛·2·22
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -159,28 +177,32 @@
           𝑛·5·2 := ⟦ φ ↦ 𝜎2:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·5·3 := 𝑛·4·2
         boxed 𝑛·5·4 := 𝑛·5·3.φ
+        normalized 𝑛·5·5 := 𝜎2:λ  # 𝑛·5·4
         𝛿·5·1 := 𝔻(𝜎2:λ)
       𝛿1·5 := 𝛿·5·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·5·5 := 3.0
-          𝑛·5·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·5·7 := 𝑛·5·6
-        boxed 𝑛·5·8 := 𝑛·5·7.φ
-        𝕄(𝑛·5·8):
-          𝑛·5·9 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )
-          𝑛·5·10 := 40-08-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·5·11 := 𝑛·5·10
-        boxed 𝑛·5·12 := 𝑛·5·11.φ
+          𝑛·5·6 := 3.0
+          𝑛·5·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·5·8 := 𝑛·5·7
+        boxed 𝑛·5·9 := 𝑛·5·8.φ
+        normalized 𝑛·5·10 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )  # 𝑛·5·9
+        𝕄(𝑛·5·9):
+          𝑛·5·11 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )
+          𝑛·5·12 := 40-08-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·5·13 := 𝑛·5·12
+        boxed 𝑛·5·14 := 𝑛·5·13.φ
+        normalized 𝑛·5·15 := 40-08-00-00-00-00-00-00:Δ  # 𝑛·5·14
         𝛿·5·2 := 40-08-00-00-00-00-00-00  # 3.0
       𝛿2·5 := 𝛿·5·2  # 𝔻(ξ.x)
-      𝑛·5·13 := Φ.number( φ ↦ 𝜎3:λ )  # 𝑛
-      𝕄(𝑛·5·13):
-        𝑛·5·14 := Φ.number( φ ↦ 𝜎3:λ )
-        𝑛·5·15 := ⟦ φ ↦ 𝜎3:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        morphed 𝑛·5·16 := 𝑛·5·15
-      𝑛·5·17 := 𝑛·5·16  # 𝕄(𝑛·5·13)
-      memoized 𝑛·2·17 ⇛ 𝑛·5·17
-    𝑛·0·9 := 𝑛·5·14.plus( x ↦ 9.0 )
-    𝑛·0·10 := ⟦ x ↦ 9.0, λ ⤍ L_number_plus ⟧
-    morphed 𝑛·0·11 := 𝑛·0·10
+      𝑛·5·16 := Φ.number( φ ↦ 𝜎3:λ )  # 𝑛
+      𝕄(𝑛·5·16):
+        𝑛·5·17 := Φ.number( φ ↦ 𝜎3:λ )
+        𝑛·5·18 := ⟦ φ ↦ 𝜎3:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        morphed 𝑛·5·19 := 𝑛·5·18
+      𝑛·5·20 := 𝑛·5·19  # 𝕄(𝑛·5·16)
+      memoized 𝑛·2·22 ⇛ 𝑛·5·20
+    normalized 𝑛·0·12 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·5·20.plus
+    𝑛·0·13 := 𝑛·5·17.plus( x ↦ 9.0 )
+    𝑛·0·14 := ⟦ x ↦ 9.0, λ ⤍ L_number_plus ⟧
+    morphed 𝑛·0·15 := 𝑛·0·14
diff --git a/test-resources/evaluate-packs/names-a-reshaped-side-of-a-fabricated-formation-by-its-meta.yaml b/test-resources/evaluate-packs/names-a-reshaped-side-of-a-fabricated-formation-by-its-meta.yaml
new file mode 100644
--- /dev/null
+++ b/test-resources/evaluate-packs/names-a-reshaped-side-of-a-fabricated-formation-by-its-meta.yaml
@@ -0,0 +1,48 @@
+# SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com
+# SPDX-License-Identifier: MIT
+---
+# yamllint disable rule:line-length
+# The left side of the join is 'ξ.a' with its datum turned into a symbol, a
+# term the line '𝑛3·1' writes, and the 'stay' line after it leaves that term
+# as it is, so the join reads '𝑛4', which no line writes. The 'fabricated'
+# line spelled that side in full, at its head and in its comment, though the
+# line of '𝑛3·1' named it right above (#2364). It names the side '𝑛3·1' now,
+# as it names the right side by the line of '𝑛2'.
+symbolic: |
+  - λ: L_join
+    𝑛: $.on🌵
+  - λ: L_fork
+    dataize:
+      𝛿1: $.c
+    morph:
+      𝑛1: $.a
+      𝑛2: $.b
+    symbolize:
+      𝑛3: 𝑛1
+    stay:
+      𝑛4: 𝑛3
+    join:
+      on: 𝛿1
+      left: 𝑛4
+      right: 𝑛2
+      otherwise: L_join
+location: 'Q.y'
+input: '⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ φ ↦ ξ.f( x ↦ ⟦ Δ ⤍ 01- ⟧ ), f ↦ ⟦ x ↦ ∅ ⟧ ⟧, b ↦ ⟦ φ ↦ Φ.zu ⟧, λ ⤍ L_fork ⟧.f ⟧'
+result: '⟦ λ ⤍ L_join, x ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.f( x ↦ x ), right🌵 ↦ ρ.right🌵.f( x ↦ x ) ⟧'
+protocol: |
+  𝕄(Φ.y):
+    𝔼(L_fork):
+      𝔻(ξ.c):
+        𝛿·1·1 := 𝔻(𝜎1:λ)
+      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.c)
+      𝕄(ξ.a):
+        morphed 𝑛·1·1 := ⟦ φ ↦ f( x ↦ 01-:Δ ), f(x) ↦ ⟦⟧ ⟧
+      𝑛1·1 := 𝑛·1·1  # 𝕄(ξ.a)
+      𝕄(ξ.b):
+        morphed 𝑛·1·2 := Φ.zu:φ
+      𝑛2·1 := 𝑛·1·2  # 𝕄(ξ.b)
+      symbolized 𝜎2 := 01-
+      𝑛3·1 := ⟦ φ ↦ f( x ↦ 𝜎2:λ ), f(x) ↦ ⟦⟧ ⟧  # symbolize(𝑛1)
+      fabricated 𝑛·1·3 := 𝑛3·1 and 𝑛2·1  # ⟦ left🌵 ↦ 𝑛3·1, right🌵 ↦ 𝑛·1·2, φ ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.φ, right🌵 ↦ ρ.right🌵.φ ⟧, f(x) ↦ ⟦ λ ⤍ L_join, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.f( x ↦ x ), right🌵 ↦ ρ.right🌵.f( x ↦ x ) ⟧ ⟧
+    normalized 𝑛·0·1 := ⟦ λ ⤍ L_join, x ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.f( x ↦ x ), right🌵 ↦ ρ.right🌵.f( x ↦ x ) ⟧  # 𝑛·1·3.f
+    morphed 𝑛·0·2 := ⟦ λ ⤍ L_join, x ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ρ.left🌵.f( x ↦ x ), right🌵 ↦ ρ.right🌵.f( x ↦ x ) ⟧
diff --git a/test-resources/evaluate-packs/nests-the-firing-an-operand-brought-down.yaml b/test-resources/evaluate-packs/nests-the-firing-an-operand-brought-down.yaml
--- a/test-resources/evaluate-packs/nests-the-firing-an-operand-brought-down.yaml
+++ b/test-resources/evaluate-packs/nests-the-firing-an-operand-brought-down.yaml
@@ -21,10 +21,12 @@
     φ ↦ 5.plus( 6.plus( 7 ) ).plus( 8 ) ⟧
 protocol: |
   𝕄(Φ.φ):
-    𝑛·0·1 := 5.0
-    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0.plus( 7.0 ) )
-    𝑛·0·4 := ⟦ x ↦ 6.0.plus( 7.0 ), λ ⤍ L_number_plus ⟧
+    normalized 𝑛·0·1 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number
+    𝑛·0·2 := 5.0
+    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+    normalized 𝑛·0·4 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·3.plus
+    𝑛·0·5 := 𝑛·0·2.plus( x ↦ 6.0.plus( 7.0 ) )
+    𝑛·0·6 := ⟦ x ↦ 6.0.plus( 7.0 ), λ ⤍ L_number_plus ⟧
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -32,20 +34,24 @@
           𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·1·3 := 𝑛·1·2
         boxed 𝑛·1·4 := 𝑛·1·3.φ
+        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4
         𝕄(𝑛·1·4):
-          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
-          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes
+          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
+          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·9 := 𝑛·1·8
+        boxed 𝑛·1·10 := 𝑛·1·9.φ
+        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10
         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·9 := 6.0
-          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-          𝑛·1·11 := 𝑛·1·9.plus( x ↦ 7.0 )
-          𝑛·1·12 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧
-          morphed 𝑛·1·13 := 𝑛·1·12
+          𝑛·1·12 := 6.0
+          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+          normalized 𝑛·1·14 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·1·13.plus
+          𝑛·1·15 := 𝑛·1·12.plus( x ↦ 7.0 )
+          𝑛·1·16 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧
+          morphed 𝑛·1·17 := 𝑛·1·16
         𝔼(L_number_plus):
           𝔻(ξ.ρ):
             𝕄(ξ.ρ):
@@ -53,41 +59,47 @@
               𝑛·2·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
               morphed 𝑛·2·3 := 𝑛·2·2
             boxed 𝑛·2·4 := 𝑛·2·3.φ
+            normalized 𝑛·2·5 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )  # 𝑛·2·4
             𝕄(𝑛·2·4):
-              𝑛·2·5 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
-              𝑛·2·6 := 40-18-00-00-00-00-00-00:Δ:φ
-              morphed 𝑛·2·7 := 𝑛·2·6
-            boxed 𝑛·2·8 := 𝑛·2·7.φ
+              𝑛·2·6 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
+              𝑛·2·7 := 40-18-00-00-00-00-00-00:Δ:φ
+              morphed 𝑛·2·8 := 𝑛·2·7
+            boxed 𝑛·2·9 := 𝑛·2·8.φ
+            normalized 𝑛·2·10 := 40-18-00-00-00-00-00-00:Δ  # 𝑛·2·9
             𝛿·2·1 := 40-18-00-00-00-00-00-00  # 6.0
           𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)
           𝔻(ξ.x):
             𝕄(ξ.x):
-              𝑛·2·9 := 7.0
-              𝑛·2·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-              morphed 𝑛·2·11 := 𝑛·2·10
-            boxed 𝑛·2·12 := 𝑛·2·11.φ
-            𝕄(𝑛·2·12):
-              𝑛·2·13 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )
-              𝑛·2·14 := 40-1C-00-00-00-00-00-00:Δ:φ
-              morphed 𝑛·2·15 := 𝑛·2·14
-            boxed 𝑛·2·16 := 𝑛·2·15.φ
+              𝑛·2·11 := 7.0
+              𝑛·2·12 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+              morphed 𝑛·2·13 := 𝑛·2·12
+            boxed 𝑛·2·14 := 𝑛·2·13.φ
+            normalized 𝑛·2·15 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )  # 𝑛·2·14
+            𝕄(𝑛·2·14):
+              𝑛·2·16 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )
+              𝑛·2·17 := 40-1C-00-00-00-00-00-00:Δ:φ
+              morphed 𝑛·2·18 := 𝑛·2·17
+            boxed 𝑛·2·19 := 𝑛·2·18.φ
+            normalized 𝑛·2·20 := 40-1C-00-00-00-00-00-00:Δ  # 𝑛·2·19
             𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0
           𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)
-          𝑛·2·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛
-          𝕄(𝑛·2·17):
-            𝑛·2·18 := Φ.number( φ ↦ 𝜎1:λ )
-            𝑛·2·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
-            morphed 𝑛·2·20 := 𝑛·2·19
-          𝑛·2·21 := 𝑛·2·20  # 𝕄(𝑛·2·17)
-        boxed 𝑛·1·14 := 𝑛·2·21.φ
+          𝑛·2·21 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛
+          𝕄(𝑛·2·21):
+            𝑛·2·22 := Φ.number( φ ↦ 𝜎1:λ )
+            𝑛·2·23 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧
+            morphed 𝑛·2·24 := 𝑛·2·23
+          𝑛·2·25 := 𝑛·2·24  # 𝕄(𝑛·2·21)
+        boxed 𝑛·1·18 := 𝑛·2·25.φ
+        normalized 𝑛·1·19 := 𝜎1:λ  # 𝑛·1·18
         𝛿·1·2 := 𝔻(𝜎1:λ)
       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)
-      𝑛·1·15 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
-      𝕄(𝑛·1·15):
-        𝑛·1·16 := Φ.number( φ ↦ 𝜎2:λ )
-        𝑛·1·17 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧
-        morphed 𝑛·1·18 := 𝑛·1·17
-      𝑛·1·19 := 𝑛·1·18  # 𝕄(𝑛·1·15)
-    𝑛·0·5 := 𝑛·1·16.plus( x ↦ 8.0 )
-    𝑛·0·6 := ⟦ x ↦ 8.0, λ ⤍ L_number_plus ⟧
-    morphed 𝑛·0·7 := 𝑛·0·6
+      𝑛·1·20 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
+      𝕄(𝑛·1·20):
+        𝑛·1·21 := Φ.number( φ ↦ 𝜎2:λ )
+        𝑛·1·22 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧
+        morphed 𝑛·1·23 := 𝑛·1·22
+      𝑛·1·24 := 𝑛·1·23  # 𝕄(𝑛·1·20)
+    normalized 𝑛·0·7 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·1·24.plus
+    𝑛·0·8 := 𝑛·1·21.plus( x ↦ 8.0 )
+    𝑛·0·9 := ⟦ x ↦ 8.0, λ ⤍ L_number_plus ⟧
+    morphed 𝑛·0·10 := 𝑛·0·9
diff --git a/test-resources/evaluate-packs/parks-a-firing-whose-operand-has-a-void-phi.yaml b/test-resources/evaluate-packs/parks-a-firing-whose-operand-has-a-void-phi.yaml
--- a/test-resources/evaluate-packs/parks-a-firing-whose-operand-has-a-void-phi.yaml
+++ b/test-resources/evaluate-packs/parks-a-firing-whose-operand-has-a-void-phi.yaml
@@ -19,5 +19,6 @@
     𝔼(L_pair):
       𝔻(ξ.x):
         boxed 𝑛·1·1 := ∅:φ.φ
+        normalized 𝑛·1·2 := ⊥  # 𝑛·1·1
       unanswered ⊥  # 𝔻(⊥)
       stuck ⊥
diff --git a/test-resources/evaluate-packs/parks-a-firing-whose-operand-reaches-the-terminator.yaml b/test-resources/evaluate-packs/parks-a-firing-whose-operand-reaches-the-terminator.yaml
--- a/test-resources/evaluate-packs/parks-a-firing-whose-operand-reaches-the-terminator.yaml
+++ b/test-resources/evaluate-packs/parks-a-firing-whose-operand-reaches-the-terminator.yaml
@@ -37,31 +37,40 @@
 result: '⟦ n ↦ 1, v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read, λ ⤍ L_entry ⟧.φ'
 protocol: |
   𝕄(Φ.l🌵.e1):
-    𝑛·0·1 := ⟦ n ↦ ∅, v ↦ ∅, λ ⤍ L_entry ⟧( n ↦ 1.0 )
-    𝑛·0·2 := ⟦ n ↦ 1.0, v ↦ ∅, λ ⤍ L_entry ⟧
-    𝑛·0·3 := 𝑛·0·2( v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read )
-    𝑛·0·4 := ⟦ n ↦ 1.0, v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read, λ ⤍ L_entry ⟧
+    normalized 𝑛·0·1 := ⟦ mark(n, v) ↦ L_entry:λ, e1 ↦ Φ.l🌵.mark( n ↦ 1.0, v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read ).φ ⟧  # Φ.l🌵
+    normalized 𝑛·0·2 := ⟦ n ↦ ∅, v ↦ ∅, λ ⤍ L_entry ⟧  # 𝑛·0·1.mark
+    𝑛·0·3 := ⟦ n ↦ ∅, v ↦ ∅, λ ⤍ L_entry ⟧( n ↦ 1.0 )
+    𝑛·0·4 := ⟦ n ↦ 1.0, v ↦ ∅, λ ⤍ L_entry ⟧
+    𝑛·0·5 := 𝑛·0·4( v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read )
+    𝑛·0·6 := ⟦ n ↦ 1.0, v ↦ Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) ).read, λ ⤍ L_entry ⟧
     𝔼(L_entry):
       𝔻(ξ.n):
         𝕄(ξ.n):
-          𝑛·1·1 := 1.0
-          𝑛·1·2 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ):φ
-          morphed 𝑛·1·3 := 𝑛·1·2
-        boxed 𝑛·1·4 := 𝑛·1·3.φ
-        𝕄(𝑛·1·4):
-          𝑛·1·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )
-          𝑛·1·6 := ⟦ φ ↦ 3F-F0-00-00-00-00-00-00:Δ, size ↦ L_bytes_size:λ ⟧
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          normalized 𝑛·1·1 := ∅:φ  # Φ.number
+          𝑛·1·2 := 1.0
+          𝑛·1·3 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ):φ
+          morphed 𝑛·1·4 := 𝑛·1·3
+        boxed 𝑛·1·5 := 𝑛·1·4.φ
+        normalized 𝑛·1·6 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )  # 𝑛·1·5
+        𝕄(𝑛·1·5):
+          normalized 𝑛·1·7 := ⟦ φ ↦ ∅, size ↦ L_bytes_size:λ ⟧  # Φ.bytes
+          𝑛·1·8 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )
+          𝑛·1·9 := ⟦ φ ↦ 3F-F0-00-00-00-00-00-00:Δ, size ↦ L_bytes_size:λ ⟧
+          morphed 𝑛·1·10 := 𝑛·1·9
+        boxed 𝑛·1·11 := 𝑛·1·10.φ
+        normalized 𝑛·1·12 := 3F-F0-00-00-00-00-00-00:Δ  # 𝑛·1·11
         𝛿·1·1 := 3F-F0-00-00-00-00-00-00  # 1.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.n)
       𝕄(ξ.v.φ):
-        𝑛·1·9 := Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) )
-        𝑛·1·10 := ⟦ data ↦ ∅, buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ), read ↦ Φ.dataized( target ↦ ρ.data.size ).as-bytes:φ ⟧
-        remembered 𝑛·1·11 ≡ Φ.dataized  # ⟦ target ↦ ∅, λ ⤍ L_dataized ⟧
-        𝑛·1·12 := Φ.dataized( target ↦ ⊥ )
-        𝑛·1·13 := ⟦ target ↦ ⊥, λ ⤍ L_dataized ⟧
-        remembered 𝑛·1·13 ≡ 𝑛·1·11( target ↦ ⊥ )
+        normalized 𝑛·1·13 := ⟦ data ↦ ∅, buffer ↦ ∅, read ↦ Φ.dataized( target ↦ ρ.data.size ).as-bytes:φ ⟧  # Φ.block
+        𝑛·1·14 := Φ.block( buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ) )
+        𝑛·1·15 := ⟦ data ↦ ∅, buffer ↦ Φ.bytes( φ ↦ 𝜎1:λ ), read ↦ Φ.dataized( target ↦ ρ.data.size ).as-bytes:φ ⟧
+        normalized 𝑛·1·16 := Φ.dataized( target ↦ ρ.data.size ).as-bytes:φ  # 𝑛·1·15.read
+        normalized 𝑛·1·17 := Φ.dataized( target ↦ ⊥ ).as-bytes  # 𝑛·1·16.φ
+        remembered 𝑛·1·18 ≡ Φ.dataized  # ⟦ target ↦ ∅, λ ⤍ L_dataized ⟧
+        𝑛·1·19 := Φ.dataized( target ↦ ⊥ )
+        𝑛·1·20 := ⟦ target ↦ ⊥, λ ⤍ L_dataized ⟧
+        remembered 𝑛·1·20 ≡ 𝑛·1·18( target ↦ ⊥ )
         𝔼(L_dataized):
           unanswered ⊥  # 𝔻(⊥)
           stuck ⊥
diff --git a/test-resources/evaluate-packs/reduces-a-carried-symbol-through-morphing.yaml b/test-resources/evaluate-packs/reduces-a-carried-symbol-through-morphing.yaml
--- a/test-resources/evaluate-packs/reduces-a-carried-symbol-through-morphing.yaml
+++ b/test-resources/evaluate-packs/reduces-a-carried-symbol-through-morphing.yaml
@@ -22,4 +22,5 @@
       𝕄(𝑛·1·2):
         morphed 𝑛·1·3 := 𝜎5:λ:z
       𝑛·1·4 := 𝑛·1·3  # 𝕄(𝑛·1·2)
-    morphed 𝑛·0·1 := 𝜎5:λ
+    normalized 𝑛·0·1 := 𝜎5:λ  # 𝑛·1·4.z
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/starts-minting-after-the-symbols-the-program-carries.yaml b/test-resources/evaluate-packs/starts-minting-after-the-symbols-the-program-carries.yaml
--- a/test-resources/evaluate-packs/starts-minting-after-the-symbols-the-program-carries.yaml
+++ b/test-resources/evaluate-packs/starts-minting-after-the-symbols-the-program-carries.yaml
@@ -20,10 +20,12 @@
 result: '𝜎4:λ'
 protocol: |
   𝕄(Φ.φ):
-    𝑛·0·1 := 5.0
-    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-    𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0 )
-    𝑛·0·4 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧
+    normalized 𝑛·0·1 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number
+    𝑛·0·2 := 5.0
+    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+    normalized 𝑛·0·4 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·3.plus
+    𝑛·0·5 := 𝑛·0·2.plus( x ↦ 6.0 )
+    𝑛·0·6 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -31,30 +33,36 @@
           𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·1·3 := 𝑛·1·2
         boxed 𝑛·1·4 := 𝑛·1·3.φ
+        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4
         𝕄(𝑛·1·4):
-          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
-          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes
+          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
+          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·9 := 𝑛·1·8
+        boxed 𝑛·1·10 := 𝑛·1·9.φ
+        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10
         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·9 := 6.0
-          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·1·11 := 𝑛·1·10
-        boxed 𝑛·1·12 := 𝑛·1·11.φ
-        𝕄(𝑛·1·12):
-          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
-          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·15 := 𝑛·1·14
-        boxed 𝑛·1·16 := 𝑛·1·15.φ
+          𝑛·1·12 := 6.0
+          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·1·14 := 𝑛·1·13
+        boxed 𝑛·1·15 := 𝑛·1·14.φ
+        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )  # 𝑛·1·15
+        𝕄(𝑛·1·15):
+          𝑛·1·17 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )
+          𝑛·1·18 := 40-18-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·19 := 𝑛·1·18
+        boxed 𝑛·1·20 := 𝑛·1·19.φ
+        normalized 𝑛·1·21 := 40-18-00-00-00-00-00-00:Δ  # 𝑛·1·20
         𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0
       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)
-      𝑛·1·17 := Φ.number( φ ↦ 𝜎4:λ )  # 𝑛
-      𝕄(𝑛·1·17):
-        𝑛·1·18 := Φ.number( φ ↦ 𝜎4:λ )
-        𝑛·1·19 := ⟦ φ ↦ 𝜎4:λ, plus(x) ↦ L_number_plus:λ ⟧
-        morphed 𝑛·1·20 := 𝑛·1·19
-      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)
-    morphed 𝑛·0·5 := 𝜎4:λ
+      𝑛·1·22 := Φ.number( φ ↦ 𝜎4:λ )  # 𝑛
+      𝕄(𝑛·1·22):
+        𝑛·1·23 := Φ.number( φ ↦ 𝜎4:λ )
+        𝑛·1·24 := ⟦ φ ↦ 𝜎4:λ, plus(x) ↦ L_number_plus:λ ⟧
+        morphed 𝑛·1·25 := 𝑛·1·24
+      𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·22)
+    normalized 𝑛·0·7 := 𝜎4:λ  # 𝑛·1·26.φ
+    morphed 𝑛·0·8 := 𝑛·0·7
diff --git a/test-resources/evaluate-packs/takes-the-answer-of-a-firing-with-the-same-operands.yaml b/test-resources/evaluate-packs/takes-the-answer-of-a-firing-with-the-same-operands.yaml
--- a/test-resources/evaluate-packs/takes-the-answer-of-a-firing-with-the-same-operands.yaml
+++ b/test-resources/evaluate-packs/takes-the-answer-of-a-firing-with-the-same-operands.yaml
@@ -56,31 +56,34 @@
       𝔼(L_dataized):  # 𝔼(𝑛1)
         𝔻(ξ.target):
           𝕄(ξ.target):
-            morphed 𝑛·2·1 := 01-:Δ
+            normalized 𝑛·2·1 := 01-:Δ  # Φ.x
+            morphed 𝑛·2·2 := 01-:Δ
           𝛿·2·1 := 01-
         𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.target)
-        𝑛·2·2 := 𝜎1:λ  # 𝑛
-        𝕄(𝑛·2·2):
-          morphed 𝑛·2·3 := 𝜎1:λ
-        𝑛·2·4 := 𝑛·2·3  # 𝕄(𝑛·2·2)
+        𝑛·2·3 := 𝜎1:λ  # 𝑛
+        𝕄(𝑛·2·3):
+          morphed 𝑛·2·4 := 𝜎1:λ
+        𝑛·2·5 := 𝑛·2·4  # 𝕄(𝑛·2·3)
         memoized 𝑛·1·3 ⇛ 𝜎1:λ
-      𝑛3·1 := 𝑛·2·4  # 𝔼(𝑛1)
+      𝑛3·1 := 𝑛·2·5  # 𝔼(𝑛1)
       recalled 𝑛·1·6 ⇒ 𝑛·1·1( target ↦ Φ.y )
       recalled 𝑛·1·1 ⇒ Φ.dataized
       𝔼(L_dataized):  # 𝔼(𝑛2)
         𝔻(ξ.target):
           𝕄(ξ.target):
-            morphed 𝑛·3·1 := 01-:Δ
+            normalized 𝑛·3·1 := 01-:Δ  # Φ.y
+            morphed 𝑛·3·2 := 01-:Δ
           𝛿·3·1 := 01-
         𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.target)
         recalled 𝑛·1·3 ⇒ 𝜎1:λ
-        𝑛·3·2 := 𝑛3·1  # 𝑛
-        𝑛·3·3 := 𝑛3·1  # 𝕄(𝑛·3·2)
+        𝑛·3·3 := 𝑛3·1  # 𝑛
+        𝑛·3·4 := 𝑛3·1  # 𝕄(𝑛·3·3)
         memoized 𝑛·1·6 ⇛ 𝜎1:λ
-      𝑛4·1 := 𝑛·3·3  # 𝔼(𝑛2)
+      𝑛4·1 := 𝑛·3·4  # 𝔼(𝑛2)
       𝑛·1·8 := ⟦ a ↦ 𝜎1:λ, b ↦ 𝜎1:λ ⟧:φ  # 𝑛
       𝕄(𝑛·1·8):
         morphed 𝑛·1·9 := ⟦ a ↦ 𝜎1:λ, b ↦ 𝜎1:λ ⟧:φ
       𝑛·1·10 := 𝑛·1·9  # 𝕄(𝑛·1·8)
       memoized 𝑛·1·11 ⇛ 𝑛·1·10  # ⟦ a ↦ 𝑛·1·2, b ↦ 𝑛·1·5, λ ⤍ L_pair ⟧
-    morphed 𝑛·0·1 := ⟦ a ↦ 𝜎1:λ, b ↦ 𝜎1:λ ⟧
+    normalized 𝑛·0·1 := ⟦ a ↦ 𝜎1:λ, b ↦ 𝜎1:λ ⟧  # 𝑛·1·10.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/takes-the-one-term-both-sides-of-a-join-come-to.yaml b/test-resources/evaluate-packs/takes-the-one-term-both-sides-of-a-join-come-to.yaml
--- a/test-resources/evaluate-packs/takes-the-one-term-both-sides-of-a-join-come-to.yaml
+++ b/test-resources/evaluate-packs/takes-the-one-term-both-sides-of-a-join-come-to.yaml
@@ -33,10 +33,12 @@
 result: '𝜎2:λ'
 protocol: |
   𝕄(Φ.φ):
-    𝑛·0·1 := 5.0
-    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-    𝑛·0·3 := 𝑛·0·1.gt( x ↦ 0.0 )
-    𝑛·0·4 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧
+    normalized 𝑛·0·1 := ⟦ φ ↦ ∅, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number
+    𝑛·0·2 := 5.0
+    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+    normalized 𝑛·0·4 := ⟦ x ↦ ∅, λ ⤍ L_number_gt ⟧  # 𝑛·0·3.gt
+    𝑛·0·5 := 𝑛·0·2.gt( x ↦ 0.0 )
+    𝑛·0·6 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧
     𝔼(L_number_gt):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -44,58 +46,68 @@
           𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·1·3 := 𝑛·1·2
         boxed 𝑛·1·4 := 𝑛·1·3.φ
+        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4
         𝕄(𝑛·1·4):
-          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
-          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes
+          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
+          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·9 := 𝑛·1·8
+        boxed 𝑛·1·10 := 𝑛·1·9.φ
+        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10
         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·9 := 0.0
-          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·1·11 := 𝑛·1·10
-        boxed 𝑛·1·12 := 𝑛·1·11.φ
-        𝕄(𝑛·1·12):
-          𝑛·1·13 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
-          𝑛·1·14 := 00-00-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·15 := 𝑛·1·14
-        boxed 𝑛·1·16 := 𝑛·1·15.φ
+          𝑛·1·12 := 0.0
+          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·1·14 := 𝑛·1·13
+        boxed 𝑛·1·15 := 𝑛·1·14.φ
+        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )  # 𝑛·1·15
+        𝕄(𝑛·1·15):
+          𝑛·1·17 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
+          𝑛·1·18 := 00-00-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·19 := 𝑛·1·18
+        boxed 𝑛·1·20 := 𝑛·1·19.φ
+        normalized 𝑛·1·21 := 00-00-00-00-00-00-00-00:Δ  # 𝑛·1·20
         𝛿·1·2 := 00-00-00-00-00-00-00-00  # 0.0
       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)
-      𝑛·1·17 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛
-      𝕄(𝑛·1·17):
-        𝑛·1·18 := Φ.bool( φ ↦ 𝜎1:λ )
-        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
-        morphed 𝑛·1·20 := 𝑛·1·19
-      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)
-    𝑛·0·5 := 𝑛·1·18.if( then ↦ 1.0.plus( 2.0 ) )
-    𝑛·0·6 := ⟦ then ↦ 1.0.plus( 2.0 ), else ↦ ∅, λ ⤍ L_fork ⟧
-    𝑛·0·7 := 𝑛·0·5( else ↦ 1.0.plus( 2.0 ) )
-    𝑛·0·8 := ⟦ then ↦ 1.0.plus( 2.0 ), else ↦ 1.0.plus( 2.0 ), λ ⤍ L_fork ⟧
+      𝑛·1·22 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛
+      𝕄(𝑛·1·22):
+        normalized 𝑛·1·23 := ⟦ φ ↦ ∅, if(then, else) ↦ L_fork:λ ⟧  # Φ.bool
+        𝑛·1·24 := Φ.bool( φ ↦ 𝜎1:λ )
+        𝑛·1·25 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
+        morphed 𝑛·1·26 := 𝑛·1·25
+      𝑛·1·27 := 𝑛·1·26  # 𝕄(𝑛·1·22)
+    normalized 𝑛·0·7 := ⟦ then ↦ ∅, else ↦ ∅, λ ⤍ L_fork ⟧  # 𝑛·1·27.if
+    𝑛·0·8 := 𝑛·1·24.if( then ↦ 1.0.plus( 2.0 ) )
+    𝑛·0·9 := ⟦ then ↦ 1.0.plus( 2.0 ), else ↦ ∅, λ ⤍ L_fork ⟧
+    𝑛·0·10 := 𝑛·0·8( else ↦ 1.0.plus( 2.0 ) )
+    𝑛·0·11 := ⟦ then ↦ 1.0.plus( 2.0 ), else ↦ 1.0.plus( 2.0 ), λ ⤍ L_fork ⟧
     𝔼(L_fork):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
           𝑛·2·1 := Φ.bool( φ ↦ 𝜎1:λ )
           𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
-          morphed 𝑛·2·3 := 𝑛·1·21
+          morphed 𝑛·2·3 := 𝑛·1·27
         boxed 𝑛·2·4 := 𝑛·2·3.φ
+        normalized 𝑛·2·5 := 𝜎1:λ  # 𝑛·2·4
         𝛿·2·1 := 𝔻(𝜎1:λ)
       𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)
       𝕄(ξ.then):
-        𝑛·2·5 := 1.0
-        𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        𝑛·2·7 := 𝑛·2·5.plus( x ↦ 2.0 )
-        𝑛·2·8 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧
-        morphed 𝑛·2·9 := 𝑛·2·8
+        𝑛·2·6 := 1.0
+        𝑛·2·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        normalized 𝑛·2·8 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·2·7.plus
+        𝑛·2·9 := 𝑛·2·6.plus( x ↦ 2.0 )
+        𝑛·2·10 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧
+        morphed 𝑛·2·11 := 𝑛·2·10
       𝕄(ξ.else):
-        𝑛·2·10 := 1.0
-        𝑛·2·11 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        𝑛·2·12 := 𝑛·2·10.plus( x ↦ 2.0 )
-        𝑛·2·13 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧
-        morphed 𝑛·2·14 := 𝑛·2·13
-      𝑛·2·15 := 𝑛·2·13
+        𝑛·2·12 := 1.0
+        𝑛·2·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        normalized 𝑛·2·14 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·2·13.plus
+        𝑛·2·15 := 𝑛·2·12.plus( x ↦ 2.0 )
+        𝑛·2·16 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧
+        morphed 𝑛·2·17 := 𝑛·2·16
+      𝑛·2·18 := 𝑛·2·16
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -103,30 +115,35 @@
           𝑛·3·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·3·3 := 𝑛·3·2
         boxed 𝑛·3·4 := 𝑛·3·3.φ
+        normalized 𝑛·3·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )  # 𝑛·3·4
         𝕄(𝑛·3·4):
-          𝑛·3·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )
-          𝑛·3·6 := 3F-F0-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·3·7 := 𝑛·3·6
-        boxed 𝑛·3·8 := 𝑛·3·7.φ
+          𝑛·3·6 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )
+          𝑛·3·7 := 3F-F0-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·3·8 := 𝑛·3·7
+        boxed 𝑛·3·9 := 𝑛·3·8.φ
+        normalized 𝑛·3·10 := 3F-F0-00-00-00-00-00-00:Δ  # 𝑛·3·9
         𝛿·3·1 := 3F-F0-00-00-00-00-00-00  # 1.0
       𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·3·9 := 2.0
-          𝑛·3·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·3·11 := 𝑛·3·10
-        boxed 𝑛·3·12 := 𝑛·3·11.φ
-        𝕄(𝑛·3·12):
-          𝑛·3·13 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )
-          𝑛·3·14 := 40-00-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·3·15 := 𝑛·3·14
-        boxed 𝑛·3·16 := 𝑛·3·15.φ
+          𝑛·3·11 := 2.0
+          𝑛·3·12 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·3·13 := 𝑛·3·12
+        boxed 𝑛·3·14 := 𝑛·3·13.φ
+        normalized 𝑛·3·15 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )  # 𝑛·3·14
+        𝕄(𝑛·3·14):
+          𝑛·3·16 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )
+          𝑛·3·17 := 40-00-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·3·18 := 𝑛·3·17
+        boxed 𝑛·3·19 := 𝑛·3·18.φ
+        normalized 𝑛·3·20 := 40-00-00-00-00-00-00-00:Δ  # 𝑛·3·19
         𝛿·3·2 := 40-00-00-00-00-00-00-00  # 2.0
       𝛿2·3 := 𝛿·3·2  # 𝔻(ξ.x)
-      𝑛·3·17 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
-      𝕄(𝑛·3·17):
-        𝑛·3·18 := Φ.number( φ ↦ 𝜎2:λ )
-        𝑛·3·19 := ⟦ φ ↦ 𝜎2:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        morphed 𝑛·3·20 := 𝑛·3·19
-      𝑛·3·21 := 𝑛·3·20  # 𝕄(𝑛·3·17)
-    morphed 𝑛·0·9 := 𝜎2:λ
+      𝑛·3·21 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
+      𝕄(𝑛·3·21):
+        𝑛·3·22 := Φ.number( φ ↦ 𝜎2:λ )
+        𝑛·3·23 := ⟦ φ ↦ 𝜎2:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        morphed 𝑛·3·24 := 𝑛·3·23
+      𝑛·3·25 := 𝑛·3·24  # 𝕄(𝑛·3·21)
+    normalized 𝑛·0·12 := 𝜎2:λ  # 𝑛·3·25.φ
+    morphed 𝑛·0·13 := 𝑛·0·12
diff --git a/test-resources/evaluate-packs/tells-two-carried-symbols-apart-in-one-firing.yaml b/test-resources/evaluate-packs/tells-two-carried-symbols-apart-in-one-firing.yaml
--- a/test-resources/evaluate-packs/tells-two-carried-symbols-apart-in-one-firing.yaml
+++ b/test-resources/evaluate-packs/tells-two-carried-symbols-apart-in-one-firing.yaml
@@ -20,10 +20,12 @@
 result: '𝜎6:λ'
 protocol: |
   𝕄(Φ.φ):
-    𝑛·0·1 := Φ.number( φ ↦ 𝜎2:λ )
-    𝑛·0·2 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧
-    𝑛·0·3 := 𝑛·0·1.plus( x ↦ Φ.number( φ ↦ 𝜎5:λ ) )
-    𝑛·0·4 := ⟦ x ↦ Φ.number( φ ↦ 𝜎5:λ ), λ ⤍ L_number_plus ⟧
+    normalized 𝑛·0·1 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number
+    𝑛·0·2 := Φ.number( φ ↦ 𝜎2:λ )
+    𝑛·0·3 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧
+    normalized 𝑛·0·4 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·3.plus
+    𝑛·0·5 := 𝑛·0·2.plus( x ↦ Φ.number( φ ↦ 𝜎5:λ ) )
+    𝑛·0·6 := ⟦ x ↦ Φ.number( φ ↦ 𝜎5:λ ), λ ⤍ L_number_plus ⟧
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -31,20 +33,23 @@
           𝑛·1·2 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·1·3 := 𝑛·1·2
         boxed 𝑛·1·4 := 𝑛·1·3.φ
+        normalized 𝑛·1·5 := 𝜎2:λ  # 𝑛·1·4
         𝛿·1·1 := 𝔻(𝜎2:λ)
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·5 := Φ.number( φ ↦ 𝜎5:λ )
-          𝑛·1·6 := ⟦ φ ↦ 𝜎5:λ, plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          𝑛·1·6 := Φ.number( φ ↦ 𝜎5:λ )
+          𝑛·1·7 := ⟦ φ ↦ 𝜎5:λ, plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·1·8 := 𝑛·1·7
+        boxed 𝑛·1·9 := 𝑛·1·8.φ
+        normalized 𝑛·1·10 := 𝜎5:λ  # 𝑛·1·9
         𝛿·1·2 := 𝔻(𝜎5:λ)
       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)
-      𝑛·1·9 := Φ.number( φ ↦ 𝜎6:λ )  # 𝑛
-      𝕄(𝑛·1·9):
-        𝑛·1·10 := Φ.number( φ ↦ 𝜎6:λ )
-        𝑛·1·11 := ⟦ φ ↦ 𝜎6:λ, plus(x) ↦ L_number_plus:λ ⟧
-        morphed 𝑛·1·12 := 𝑛·1·11
-      𝑛·1·13 := 𝑛·1·12  # 𝕄(𝑛·1·9)
-    morphed 𝑛·0·5 := 𝜎6:λ
+      𝑛·1·11 := Φ.number( φ ↦ 𝜎6:λ )  # 𝑛
+      𝕄(𝑛·1·11):
+        𝑛·1·12 := Φ.number( φ ↦ 𝜎6:λ )
+        𝑛·1·13 := ⟦ φ ↦ 𝜎6:λ, plus(x) ↦ L_number_plus:λ ⟧
+        morphed 𝑛·1·14 := 𝑛·1·13
+      𝑛·1·15 := 𝑛·1·14  # 𝕄(𝑛·1·11)
+    normalized 𝑛·0·7 := 𝜎6:λ  # 𝑛·1·15.φ
+    morphed 𝑛·0·8 := 𝑛·0·7
diff --git a/test-resources/evaluate-packs/tells-two-symbols-of-one-datum-apart-between-firings.yaml b/test-resources/evaluate-packs/tells-two-symbols-of-one-datum-apart-between-firings.yaml
--- a/test-resources/evaluate-packs/tells-two-symbols-of-one-datum-apart-between-firings.yaml
+++ b/test-resources/evaluate-packs/tells-two-symbols-of-one-datum-apart-between-firings.yaml
@@ -48,26 +48,29 @@
         𝔼(L_dataized):
           𝔻(ξ.target):
             𝕄(ξ.target):
-              𝑛·2·1 := Φ.bytes( φ ↦ 𝜎1:λ )
-              𝑛·2·2 := 𝜎1:λ:φ
-              morphed 𝑛·2·3 := 𝑛·2·2
-            boxed 𝑛·2·4 := 𝑛·2·3.φ
+              normalized 𝑛·2·1 := ∅:φ  # Φ.bytes
+              𝑛·2·2 := Φ.bytes( φ ↦ 𝜎1:λ )
+              𝑛·2·3 := 𝜎1:λ:φ
+              morphed 𝑛·2·4 := 𝑛·2·3
+            boxed 𝑛·2·5 := 𝑛·2·4.φ
+            normalized 𝑛·2·6 := 𝜎1:λ  # 𝑛·2·5
             𝛿·2·1 := 𝔻(𝜎1:λ)
           𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.target)
-          𝑛·2·5 := Φ.bytes( φ ↦ 𝜎3:λ )  # 𝑛
-          𝕄(𝑛·2·5):
-            𝑛·2·6 := Φ.bytes( φ ↦ 𝜎3:λ )
-            𝑛·2·7 := 𝜎3:λ:φ
-            morphed 𝑛·2·8 := 𝑛·2·7
-          𝑛·2·9 := 𝑛·2·8  # 𝕄(𝑛·2·5)
-          remembered 𝑛·2·9 ≡ 𝑛·1·3
-          memoized 𝑛·1·3 ⇛ 𝑛·2·9
-        morphed 𝑛·1·4 := 𝜎3:λ
+          𝑛·2·7 := Φ.bytes( φ ↦ 𝜎3:λ )  # 𝑛
+          𝕄(𝑛·2·7):
+            𝑛·2·8 := Φ.bytes( φ ↦ 𝜎3:λ )
+            𝑛·2·9 := 𝜎3:λ:φ
+            morphed 𝑛·2·10 := 𝑛·2·9
+          𝑛·2·11 := 𝑛·2·10  # 𝕄(𝑛·2·7)
+          remembered 𝑛·2·11 ≡ 𝑛·1·3
+          memoized 𝑛·1·3 ⇛ 𝑛·2·11
+        normalized 𝑛·1·4 := 𝜎3:λ  # 𝑛·2·11.φ
+        morphed 𝑛·1·5 := 𝑛·1·4
       𝑛1·1 := 𝑛·1·4  # 𝕄(ξ.x)
       𝕄(ξ.y):
-        𝑛·1·5 := Φ.dataized( target ↦ Φ.bytes( φ ↦ 𝜎2:λ ) )
-        𝑛·1·6 := ⟦ target ↦ Φ.bytes( φ ↦ 𝜎2:λ ), λ ⤍ L_dataized ⟧
-        remembered 𝑛·1·6 ≡ 𝑛·1·1( target ↦ Φ.bytes( φ ↦ 𝜎2:λ ) )
+        𝑛·1·6 := Φ.dataized( target ↦ Φ.bytes( φ ↦ 𝜎2:λ ) )
+        𝑛·1·7 := ⟦ target ↦ Φ.bytes( φ ↦ 𝜎2:λ ), λ ⤍ L_dataized ⟧
+        remembered 𝑛·1·7 ≡ 𝑛·1·1( target ↦ Φ.bytes( φ ↦ 𝜎2:λ ) )
         𝔼(L_dataized):
           𝔻(ξ.target):
             𝕄(ξ.target):
@@ -75,22 +78,25 @@
               𝑛·3·2 := 𝜎2:λ:φ
               morphed 𝑛·3·3 := 𝑛·3·2
             boxed 𝑛·3·4 := 𝑛·3·3.φ
+            normalized 𝑛·3·5 := 𝜎2:λ  # 𝑛·3·4
             𝛿·3·1 := 𝔻(𝜎2:λ)
           𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.target)
-          𝑛·3·5 := Φ.bytes( φ ↦ 𝜎4:λ )  # 𝑛
-          𝕄(𝑛·3·5):
-            𝑛·3·6 := Φ.bytes( φ ↦ 𝜎4:λ )
-            𝑛·3·7 := 𝜎4:λ:φ
-            morphed 𝑛·3·8 := 𝑛·3·7
-          𝑛·3·9 := 𝑛·3·8  # 𝕄(𝑛·3·5)
-          remembered 𝑛·3·9 ≡ 𝑛·1·6
-          memoized 𝑛·1·6 ⇛ 𝑛·3·9
-        morphed 𝑛·1·7 := 𝜎4:λ
-      𝑛2·1 := 𝑛·1·7  # 𝕄(ξ.y)
-      𝑛·1·8 := ⟦ x ↦ 𝜎3:λ, y ↦ 𝜎4:λ ⟧:φ  # 𝑛
-      𝕄(𝑛·1·8):
-        morphed 𝑛·1·9 := ⟦ x ↦ 𝜎3:λ, y ↦ 𝜎4:λ ⟧:φ
-      𝑛·1·10 := 𝑛·1·9  # 𝕄(𝑛·1·8)
-      remembered 𝑛·1·10 ≡ 𝑛·0·5
-      memoized 𝑛·0·5 ⇛ 𝑛·1·10
-    morphed 𝑛·0·6 := ⟦ x ↦ 𝜎3:λ, y ↦ 𝜎4:λ ⟧
+          𝑛·3·6 := Φ.bytes( φ ↦ 𝜎4:λ )  # 𝑛
+          𝕄(𝑛·3·6):
+            𝑛·3·7 := Φ.bytes( φ ↦ 𝜎4:λ )
+            𝑛·3·8 := 𝜎4:λ:φ
+            morphed 𝑛·3·9 := 𝑛·3·8
+          𝑛·3·10 := 𝑛·3·9  # 𝕄(𝑛·3·6)
+          remembered 𝑛·3·10 ≡ 𝑛·1·7
+          memoized 𝑛·1·7 ⇛ 𝑛·3·10
+        normalized 𝑛·1·8 := 𝜎4:λ  # 𝑛·3·10.φ
+        morphed 𝑛·1·9 := 𝑛·1·8
+      𝑛2·1 := 𝑛·1·8  # 𝕄(ξ.y)
+      𝑛·1·10 := ⟦ x ↦ 𝜎3:λ, y ↦ 𝜎4:λ ⟧:φ  # 𝑛
+      𝕄(𝑛·1·10):
+        morphed 𝑛·1·11 := ⟦ x ↦ 𝜎3:λ, y ↦ 𝜎4:λ ⟧:φ
+      𝑛·1·12 := 𝑛·1·11  # 𝕄(𝑛·1·10)
+      remembered 𝑛·1·12 ≡ 𝑛·0·5
+      memoized 𝑛·0·5 ⇛ 𝑛·1·12
+    normalized 𝑛·0·6 := ⟦ x ↦ 𝜎3:λ, y ↦ 𝜎4:λ ⟧  # 𝑛·1·12.φ
+    morphed 𝑛·0·7 := 𝑛·0·6
diff --git a/test-resources/evaluate-packs/undresses-a-formation-twice-to-reach-what-it-wraps.yaml b/test-resources/evaluate-packs/undresses-a-formation-twice-to-reach-what-it-wraps.yaml
--- a/test-resources/evaluate-packs/undresses-a-formation-twice-to-reach-what-it-wraps.yaml
+++ b/test-resources/evaluate-packs/undresses-a-formation-twice-to-reach-what-it-wraps.yaml
@@ -29,10 +29,12 @@
         morphed 𝑛·1·3 := Φ.z:φ
       undressed 𝑛·1·4 := 𝑛·1·3.φ
       𝕄(𝑛·1·4):
-        morphed 𝑛·1·5 := ⟦ t(k) ↦ ⟦⟧ ⟧
-      𝑛2·1 := 𝑛·1·5  # undress(𝑛1)
-      𝑛·1·6 := 𝑛·1·5  # 𝑛
-      𝕄(𝑛·1·6):
-        morphed 𝑛·1·7 := 𝑛·1·5
-      𝑛·1·8 := 𝑛·1·7  # 𝕄(𝑛·1·6)
-    morphed 𝑛·0·1 := ∅:k
+        normalized 𝑛·1·5 := ⟦ t(k) ↦ ⟦⟧ ⟧  # Φ.z
+        morphed 𝑛·1·6 := 𝑛·1·5
+      𝑛2·1 := 𝑛·1·6  # undress(𝑛1)
+      𝑛·1·7 := 𝑛·1·6  # 𝑛
+      𝕄(𝑛·1·7):
+        morphed 𝑛·1·8 := 𝑛·1·6
+      𝑛·1·9 := 𝑛·1·8  # 𝕄(𝑛·1·7)
+    normalized 𝑛·0·1 := ∅:k  # 𝑛·1·9.t
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/work-out-an-argument-that-comes-to-a-hanging-object.yaml b/test-resources/evaluate-packs/work-out-an-argument-that-comes-to-a-hanging-object.yaml
--- a/test-resources/evaluate-packs/work-out-an-argument-that-comes-to-a-hanging-object.yaml
+++ b/test-resources/evaluate-packs/work-out-an-argument-that-comes-to-a-hanging-object.yaml
@@ -55,16 +55,18 @@
           recalled 𝑛·2·4 ⇒ 𝑛·2·2( x ↦ Φ.items.tail )
           recalled 𝑛·2·2 ⇒ Φ.box
           𝕄(𝑛2.w):
-            𝑛·2·8 := Φ.hang( x ↦ Φ.num( φ ↦ 𝜎4:λ ) )
-            𝑛·2·9 := ⟦ x ↦ Φ.num( φ ↦ 𝜎4:λ ), φ ↦ x ⟧
-            morphed 𝑛·2·10 := 𝑛·2·9
+            normalized 𝑛·2·8 := ⟦ x ↦ ∅, φ ↦ x ⟧  # Φ.hang
+            𝑛·2·9 := Φ.hang( x ↦ Φ.num( φ ↦ 𝜎4:λ ) )
+            𝑛·2·10 := ⟦ x ↦ Φ.num( φ ↦ 𝜎4:λ ), φ ↦ x ⟧
+            morphed 𝑛·2·11 := 𝑛·2·10
           𝕄(𝑛2.w.φ):
-            𝑛·2·11 := Φ.num( φ ↦ 𝜎4:λ )
-            𝑛·2·12 := 𝜎4:λ:φ
-            morphed 𝑛·2·13 := 𝑛·2·12
-          deferred 𝜎5 := Φ.box( x ↦ 𝜎1:λ, w ↦ 𝑛·2·13 )  # 𝕄(𝑛2.φ)
+            normalized 𝑛·2·12 := ∅:φ  # Φ.num
+            𝑛·2·13 := Φ.num( φ ↦ 𝜎4:λ )
+            𝑛·2·14 := 𝜎4:λ:φ
+            morphed 𝑛·2·15 := 𝑛·2·14
+          deferred 𝜎5 := Φ.box( x ↦ 𝜎1:λ, w ↦ 𝑛·2·15 )  # 𝕄(𝑛2.φ)
           joined 𝜎6 := 𝛿1·2 ? 𝜎3 : 𝜎5
-          𝑛·2·14 := 𝜎6:λ
+          𝑛·2·16 := 𝜎6:λ
         𝛿·1·1 := 𝔻(𝜎6:λ)
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.x)
       𝑛·1·1 := Φ.num( φ ↦ 𝜎7:λ )  # 𝑛
@@ -73,4 +75,5 @@
         𝑛·1·3 := 𝜎7:λ:φ
         morphed 𝑛·1·4 := 𝑛·1·3
       𝑛·1·5 := 𝑛·1·4  # 𝕄(𝑛·1·1)
-    morphed 𝑛·0·1 := 𝜎7:λ
+    normalized 𝑛·0·1 := 𝜎7:λ  # 𝑛·1·5.φ
+    morphed 𝑛·0·2 := 𝑛·0·1
diff --git a/test-resources/evaluate-packs/writes-no-joined-line-for-a-join-the-memo-answered.yaml b/test-resources/evaluate-packs/writes-no-joined-line-for-a-join-the-memo-answered.yaml
--- a/test-resources/evaluate-packs/writes-no-joined-line-for-a-join-the-memo-answered.yaml
+++ b/test-resources/evaluate-packs/writes-no-joined-line-for-a-join-the-memo-answered.yaml
@@ -40,10 +40,13 @@
 result: '𝜎6:λ'
 protocol: |
   𝕄(Φ.φ):
-    𝑛·0·1 := 5.0
-    𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-    𝑛·0·3 := 𝑛·0·1.gt( x ↦ 0.0 )
-    𝑛·0·4 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧
+    normalized 𝑛·0·1 := 5.0.gt( 0.0 ).if( 1.0.plus( 2.0 ).plus( 0.0 ), 3.0.plus( 4.0 ).plus( 0.0 ) )  # Φ.f
+    normalized 𝑛·0·2 := ⟦ φ ↦ ∅, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number
+    𝑛·0·3 := 5.0
+    𝑛·0·4 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+    normalized 𝑛·0·5 := ⟦ x ↦ ∅, λ ⤍ L_number_gt ⟧  # 𝑛·0·4.gt
+    𝑛·0·6 := 𝑛·0·3.gt( x ↦ 0.0 )
+    𝑛·0·7 := ⟦ x ↦ 0.0, λ ⤍ L_number_gt ⟧
     𝔼(L_number_gt):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -51,51 +54,60 @@
           𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·1·3 := 𝑛·1·2
         boxed 𝑛·1·4 := 𝑛·1·3.φ
+        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4
         𝕄(𝑛·1·4):
-          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
-          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·7 := 𝑛·1·6
-        boxed 𝑛·1·8 := 𝑛·1·7.φ
+          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes
+          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )
+          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·9 := 𝑛·1·8
+        boxed 𝑛·1·10 := 𝑛·1·9.φ
+        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10
         𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0
       𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·1·9 := 0.0
-          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·1·11 := 𝑛·1·10
-        boxed 𝑛·1·12 := 𝑛·1·11.φ
-        𝕄(𝑛·1·12):
-          𝑛·1·13 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
-          𝑛·1·14 := 00-00-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·1·15 := 𝑛·1·14
-        boxed 𝑛·1·16 := 𝑛·1·15.φ
+          𝑛·1·12 := 0.0
+          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·1·14 := 𝑛·1·13
+        boxed 𝑛·1·15 := 𝑛·1·14.φ
+        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )  # 𝑛·1·15
+        𝕄(𝑛·1·15):
+          𝑛·1·17 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
+          𝑛·1·18 := 00-00-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·1·19 := 𝑛·1·18
+        boxed 𝑛·1·20 := 𝑛·1·19.φ
+        normalized 𝑛·1·21 := 00-00-00-00-00-00-00-00:Δ  # 𝑛·1·20
         𝛿·1·2 := 00-00-00-00-00-00-00-00  # 0.0
       𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)
-      𝑛·1·17 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛
-      𝕄(𝑛·1·17):
-        𝑛·1·18 := Φ.bool( φ ↦ 𝜎1:λ )
-        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
-        morphed 𝑛·1·20 := 𝑛·1·19
-      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)
-      memoized 𝑛·0·4 ⇛ 𝑛·1·21
-    𝑛·0·5 := 𝑛·1·18.if( then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·9 ) )
-    𝑛·0·6 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·9 ), else ↦ ∅, λ ⤍ L_fork ⟧
-    𝑛·0·7 := 𝑛·0·5( else ↦ 3.0.plus( 4.0 ).plus( 𝑛·1·9 ) )
-    𝑛·0·8 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·9 ), else ↦ 3.0.plus( 4.0 ).plus( 𝑛·1·9 ), λ ⤍ L_fork ⟧
+      𝑛·1·22 := Φ.bool( φ ↦ 𝜎1:λ )  # 𝑛
+      𝕄(𝑛·1·22):
+        normalized 𝑛·1·23 := ⟦ φ ↦ ∅, if(then, else) ↦ L_fork:λ ⟧  # Φ.bool
+        𝑛·1·24 := Φ.bool( φ ↦ 𝜎1:λ )
+        𝑛·1·25 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
+        morphed 𝑛·1·26 := 𝑛·1·25
+      𝑛·1·27 := 𝑛·1·26  # 𝕄(𝑛·1·22)
+      memoized 𝑛·0·7 ⇛ 𝑛·1·27
+    normalized 𝑛·0·8 := ⟦ then ↦ ∅, else ↦ ∅, λ ⤍ L_fork ⟧  # 𝑛·1·27.if
+    𝑛·0·9 := 𝑛·1·24.if( then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·12 ) )
+    𝑛·0·10 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·12 ), else ↦ ∅, λ ⤍ L_fork ⟧
+    𝑛·0·11 := 𝑛·0·9( else ↦ 3.0.plus( 4.0 ).plus( 𝑛·1·12 ) )
+    𝑛·0·12 := ⟦ then ↦ 1.0.plus( 2.0 ).plus( 𝑛·1·12 ), else ↦ 3.0.plus( 4.0 ).plus( 𝑛·1·12 ), λ ⤍ L_fork ⟧
     𝔼(L_fork):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
           𝑛·2·1 := Φ.bool( φ ↦ 𝜎1:λ )
           𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, if(then, else) ↦ L_fork:λ ⟧
-          morphed 𝑛·2·3 := 𝑛·1·21
+          morphed 𝑛·2·3 := 𝑛·1·27
         boxed 𝑛·2·4 := 𝑛·2·3.φ
+        normalized 𝑛·2·5 := 𝜎1:λ  # 𝑛·2·4
         𝛿·2·1 := 𝔻(𝜎1:λ)
       𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)
       𝕄(ξ.then):
-        𝑛·2·5 := 1.0
-        𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        𝑛·2·7 := 𝑛·2·5.plus( x ↦ 2.0 )
-        𝑛·2·8 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧
+        𝑛·2·6 := 1.0
+        𝑛·2·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        normalized 𝑛·2·8 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·2·7.plus
+        𝑛·2·9 := 𝑛·2·6.plus( x ↦ 2.0 )
+        𝑛·2·10 := ⟦ x ↦ 2.0, λ ⤍ L_number_plus ⟧
         𝔼(L_number_plus):
           𝔻(ξ.ρ):
             𝕄(ξ.ρ):
@@ -103,41 +115,47 @@
               𝑛·3·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
               morphed 𝑛·3·3 := 𝑛·3·2
             boxed 𝑛·3·4 := 𝑛·3·3.φ
+            normalized 𝑛·3·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )  # 𝑛·3·4
             𝕄(𝑛·3·4):
-              𝑛·3·5 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )
-              𝑛·3·6 := 3F-F0-00-00-00-00-00-00:Δ:φ
-              morphed 𝑛·3·7 := 𝑛·3·6
-            boxed 𝑛·3·8 := 𝑛·3·7.φ
+              𝑛·3·6 := Φ.bytes( φ ↦ 3F-F0-00-00-00-00-00-00:Δ )
+              𝑛·3·7 := 3F-F0-00-00-00-00-00-00:Δ:φ
+              morphed 𝑛·3·8 := 𝑛·3·7
+            boxed 𝑛·3·9 := 𝑛·3·8.φ
+            normalized 𝑛·3·10 := 3F-F0-00-00-00-00-00-00:Δ  # 𝑛·3·9
             𝛿·3·1 := 3F-F0-00-00-00-00-00-00  # 1.0
           𝛿1·3 := 𝛿·3·1  # 𝔻(ξ.ρ)
           𝔻(ξ.x):
             𝕄(ξ.x):
-              𝑛·3·9 := 2.0
-              𝑛·3·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-              morphed 𝑛·3·11 := 𝑛·3·10
-            boxed 𝑛·3·12 := 𝑛·3·11.φ
-            𝕄(𝑛·3·12):
-              𝑛·3·13 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )
-              𝑛·3·14 := 40-00-00-00-00-00-00-00:Δ:φ
-              morphed 𝑛·3·15 := 𝑛·3·14
-            boxed 𝑛·3·16 := 𝑛·3·15.φ
+              𝑛·3·11 := 2.0
+              𝑛·3·12 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+              morphed 𝑛·3·13 := 𝑛·3·12
+            boxed 𝑛·3·14 := 𝑛·3·13.φ
+            normalized 𝑛·3·15 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )  # 𝑛·3·14
+            𝕄(𝑛·3·14):
+              𝑛·3·16 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )
+              𝑛·3·17 := 40-00-00-00-00-00-00-00:Δ:φ
+              morphed 𝑛·3·18 := 𝑛·3·17
+            boxed 𝑛·3·19 := 𝑛·3·18.φ
+            normalized 𝑛·3·20 := 40-00-00-00-00-00-00-00:Δ  # 𝑛·3·19
             𝛿·3·2 := 40-00-00-00-00-00-00-00  # 2.0
           𝛿2·3 := 𝛿·3·2  # 𝔻(ξ.x)
-          𝑛·3·17 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
-          𝕄(𝑛·3·17):
-            𝑛·3·18 := Φ.number( φ ↦ 𝜎2:λ )
-            𝑛·3·19 := ⟦ φ ↦ 𝜎2:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-            morphed 𝑛·3·20 := 𝑛·3·19
-          𝑛·3·21 := 𝑛·3·20  # 𝕄(𝑛·3·17)
-          memoized 𝑛·2·8 ⇛ 𝑛·3·21
-        𝑛·2·9 := 𝑛·3·18.plus( x ↦ 𝑛·1·9 )
-        𝑛·2·10 := ⟦ x ↦ 𝑛·1·9, λ ⤍ L_number_plus ⟧
-        morphed 𝑛·2·11 := 𝑛·2·10
+          𝑛·3·21 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛
+          𝕄(𝑛·3·21):
+            𝑛·3·22 := Φ.number( φ ↦ 𝜎2:λ )
+            𝑛·3·23 := ⟦ φ ↦ 𝜎2:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+            morphed 𝑛·3·24 := 𝑛·3·23
+          𝑛·3·25 := 𝑛·3·24  # 𝕄(𝑛·3·21)
+          memoized 𝑛·2·10 ⇛ 𝑛·3·25
+        normalized 𝑛·2·11 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·3·25.plus
+        𝑛·2·12 := 𝑛·3·22.plus( x ↦ 𝑛·1·12 )
+        𝑛·2·13 := ⟦ x ↦ 𝑛·1·12, λ ⤍ L_number_plus ⟧
+        morphed 𝑛·2·14 := 𝑛·2·13
       𝕄(ξ.else):
-        𝑛·2·12 := 3.0
-        𝑛·2·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        𝑛·2·14 := 𝑛·2·12.plus( x ↦ 4.0 )
-        𝑛·2·15 := ⟦ x ↦ 4.0, λ ⤍ L_number_plus ⟧
+        𝑛·2·15 := 3.0
+        𝑛·2·16 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        normalized 𝑛·2·17 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·2·16.plus
+        𝑛·2·18 := 𝑛·2·15.plus( x ↦ 4.0 )
+        𝑛·2·19 := ⟦ x ↦ 4.0, λ ⤍ L_number_plus ⟧
         𝔼(L_number_plus):
           𝔻(ξ.ρ):
             𝕄(ξ.ρ):
@@ -145,39 +163,44 @@
               𝑛·4·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
               morphed 𝑛·4·3 := 𝑛·4·2
             boxed 𝑛·4·4 := 𝑛·4·3.φ
+            normalized 𝑛·4·5 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )  # 𝑛·4·4
             𝕄(𝑛·4·4):
-              𝑛·4·5 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )
-              𝑛·4·6 := 40-08-00-00-00-00-00-00:Δ:φ
-              morphed 𝑛·4·7 := 𝑛·4·6
-            boxed 𝑛·4·8 := 𝑛·4·7.φ
+              𝑛·4·6 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )
+              𝑛·4·7 := 40-08-00-00-00-00-00-00:Δ:φ
+              morphed 𝑛·4·8 := 𝑛·4·7
+            boxed 𝑛·4·9 := 𝑛·4·8.φ
+            normalized 𝑛·4·10 := 40-08-00-00-00-00-00-00:Δ  # 𝑛·4·9
             𝛿·4·1 := 40-08-00-00-00-00-00-00  # 3.0
           𝛿1·4 := 𝛿·4·1  # 𝔻(ξ.ρ)
           𝔻(ξ.x):
             𝕄(ξ.x):
-              𝑛·4·9 := 4.0
-              𝑛·4·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-              morphed 𝑛·4·11 := 𝑛·4·10
-            boxed 𝑛·4·12 := 𝑛·4·11.φ
-            𝕄(𝑛·4·12):
-              𝑛·4·13 := Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ )
-              𝑛·4·14 := 40-10-00-00-00-00-00-00:Δ:φ
-              morphed 𝑛·4·15 := 𝑛·4·14
-            boxed 𝑛·4·16 := 𝑛·4·15.φ
+              𝑛·4·11 := 4.0
+              𝑛·4·12 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ ), gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+              morphed 𝑛·4·13 := 𝑛·4·12
+            boxed 𝑛·4·14 := 𝑛·4·13.φ
+            normalized 𝑛·4·15 := Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ )  # 𝑛·4·14
+            𝕄(𝑛·4·14):
+              𝑛·4·16 := Φ.bytes( φ ↦ 40-10-00-00-00-00-00-00:Δ )
+              𝑛·4·17 := 40-10-00-00-00-00-00-00:Δ:φ
+              morphed 𝑛·4·18 := 𝑛·4·17
+            boxed 𝑛·4·19 := 𝑛·4·18.φ
+            normalized 𝑛·4·20 := 40-10-00-00-00-00-00-00:Δ  # 𝑛·4·19
             𝛿·4·2 := 40-10-00-00-00-00-00-00  # 4.0
           𝛿2·4 := 𝛿·4·2  # 𝔻(ξ.x)
-          𝑛·4·17 := Φ.number( φ ↦ 𝜎3:λ )  # 𝑛
-          𝕄(𝑛·4·17):
-            𝑛·4·18 := Φ.number( φ ↦ 𝜎3:λ )
-            𝑛·4·19 := ⟦ φ ↦ 𝜎3:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-            morphed 𝑛·4·20 := 𝑛·4·19
-          𝑛·4·21 := 𝑛·4·20  # 𝕄(𝑛·4·17)
-          memoized 𝑛·2·15 ⇛ 𝑛·4·21
-        𝑛·2·16 := 𝑛·4·18.plus( x ↦ 𝑛·1·9 )
-        𝑛·2·17 := ⟦ x ↦ 𝑛·1·9, λ ⤍ L_number_plus ⟧
-        morphed 𝑛·2·18 := 𝑛·2·17
+          𝑛·4·21 := Φ.number( φ ↦ 𝜎3:λ )  # 𝑛
+          𝕄(𝑛·4·21):
+            𝑛·4·22 := Φ.number( φ ↦ 𝜎3:λ )
+            𝑛·4·23 := ⟦ φ ↦ 𝜎3:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+            morphed 𝑛·4·24 := 𝑛·4·23
+          𝑛·4·25 := 𝑛·4·24  # 𝕄(𝑛·4·21)
+          memoized 𝑛·2·19 ⇛ 𝑛·4·25
+        normalized 𝑛·2·20 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·4·25.plus
+        𝑛·2·21 := 𝑛·4·22.plus( x ↦ 𝑛·1·12 )
+        𝑛·2·22 := ⟦ x ↦ 𝑛·1·12, λ ⤍ L_number_plus ⟧
+        morphed 𝑛·2·23 := 𝑛·2·22
       joined 𝜎4 := 𝛿1·2 ? 𝜎2 : 𝜎3
-      𝑛·2·19 := ⟦ x ↦ 𝑛·1·9, λ ⤍ L_number_plus ⟧
-      memoized 𝑛·0·8 ⇛ ⟦ x ↦ 𝑛·1·9, λ ⤍ L_number_plus ⟧
+      𝑛·2·24 := ⟦ x ↦ 𝑛·1·12, λ ⤍ L_number_plus ⟧
+      memoized 𝑛·0·12 ⇛ ⟦ x ↦ 𝑛·1·12, λ ⤍ L_number_plus ⟧
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
@@ -185,69 +208,78 @@
           𝑛·5·2 := ⟦ φ ↦ 𝜎4:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
           morphed 𝑛·5·3 := 𝑛·5·2
         boxed 𝑛·5·4 := 𝑛·5·3.φ
+        normalized 𝑛·5·5 := 𝜎4:λ  # 𝑛·5·4
         𝛿·5·1 := 𝔻(𝜎4:λ)
       𝛿1·5 := 𝛿·5·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·5·5 := Φ.number( φ ↦ 𝑛·1·13 )
-          𝑛·5·6 := ⟦ φ ↦ 𝑛·1·13, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·5·7 := 𝑛·5·6
-        boxed 𝑛·5·8 := 𝑛·5·7.φ
-        𝕄(𝑛·5·8):
-          𝑛·5·9 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
-          𝑛·5·10 := 00-00-00-00-00-00-00-00:Δ:φ
-          morphed 𝑛·5·11 := 𝑛·5·10
-        boxed 𝑛·5·12 := 𝑛·5·11.φ
+          𝑛·5·6 := Φ.number( φ ↦ 𝑛·1·17 )
+          𝑛·5·7 := ⟦ φ ↦ 𝑛·1·17, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+          morphed 𝑛·5·8 := 𝑛·5·7
+        boxed 𝑛·5·9 := 𝑛·5·8.φ
+        normalized 𝑛·5·10 := 𝑛·1·17  # 𝑛·5·9
+        𝕄(𝑛·5·9):
+          𝑛·5·11 := Φ.bytes( φ ↦ 00-00-00-00-00-00-00-00:Δ )
+          𝑛·5·12 := 00-00-00-00-00-00-00-00:Δ:φ
+          morphed 𝑛·5·13 := 𝑛·5·12
+        boxed 𝑛·5·14 := 𝑛·5·13.φ
+        normalized 𝑛·5·15 := 00-00-00-00-00-00-00-00:Δ  # 𝑛·5·14
         𝛿·5·2 := 00-00-00-00-00-00-00-00  # 0.0
       𝛿2·5 := 𝛿·5·2  # 𝔻(ξ.x)
-      𝑛·5·13 := Φ.number( φ ↦ 𝜎5:λ )  # 𝑛
-      𝕄(𝑛·5·13):
-        𝑛·5·14 := Φ.number( φ ↦ 𝜎5:λ )
-        𝑛·5·15 := ⟦ φ ↦ 𝜎5:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        morphed 𝑛·5·16 := 𝑛·5·15
-      𝑛·5·17 := 𝑛·5·16  # 𝕄(𝑛·5·13)
-      memoized 𝑛·5·18 ⇛ 𝑛·5·17  # ⟦ x ↦ 𝑛·5·5, λ ⤍ L_number_plus ⟧
-    𝑛·0·9 := 𝑛·5·14.plus( x ↦ Φ.f )
-    𝑛·0·10 := ⟦ x ↦ Φ.f, λ ⤍ L_number_plus ⟧
+      𝑛·5·16 := Φ.number( φ ↦ 𝜎5:λ )  # 𝑛
+      𝕄(𝑛·5·16):
+        𝑛·5·17 := Φ.number( φ ↦ 𝜎5:λ )
+        𝑛·5·18 := ⟦ φ ↦ 𝜎5:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        morphed 𝑛·5·19 := 𝑛·5·18
+      𝑛·5·20 := 𝑛·5·19  # 𝕄(𝑛·5·16)
+      memoized 𝑛·5·21 ⇛ 𝑛·5·20  # ⟦ x ↦ 𝑛·5·6, λ ⤍ L_number_plus ⟧
+    normalized 𝑛·0·13 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·5·20.plus
+    𝑛·0·14 := 𝑛·5·17.plus( x ↦ Φ.f )
+    𝑛·0·15 := ⟦ x ↦ Φ.f, λ ⤍ L_number_plus ⟧
     𝔼(L_number_plus):
       𝔻(ξ.ρ):
         𝕄(ξ.ρ):
           𝑛·6·1 := Φ.number( φ ↦ 𝜎5:λ )
           𝑛·6·2 := ⟦ φ ↦ 𝜎5:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-          morphed 𝑛·6·3 := 𝑛·5·17
+          morphed 𝑛·6·3 := 𝑛·5·20
         boxed 𝑛·6·4 := 𝑛·6·3.φ
+        normalized 𝑛·6·5 := 𝜎5:λ  # 𝑛·6·4
         𝛿·6·1 := 𝔻(𝜎5:λ)
       𝛿1·6 := 𝛿·6·1  # 𝔻(ξ.ρ)
       𝔻(ξ.x):
         𝕄(ξ.x):
-          𝑛·6·5 := Φ.number( φ ↦ 𝑛·1·5 )
-          𝑛·6·6 := ⟦ φ ↦ 𝑛·1·5, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-          𝑛·6·7 := 𝑛·6·5.gt( x ↦ 𝑛·5·5 )
-          𝑛·6·8 := ⟦ x ↦ 𝑛·5·5, λ ⤍ L_number_gt ⟧
+          normalized 𝑛·6·6 := 𝑛·1·1.gt( 𝑛·5·6 ).if( 𝑛·3·1.plus( 𝑛·3·11 ).plus( 𝑛·5·6 ), 𝑛·4·1.plus( 𝑛·4·11 ).plus( 𝑛·5·6 ) )  # Φ.f
+          𝑛·6·7 := Φ.number( φ ↦ 𝑛·1·7 )
+          𝑛·6·8 := ⟦ φ ↦ 𝑛·1·7, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+          normalized 𝑛·6·9 := ⟦ x ↦ ∅, λ ⤍ L_number_gt ⟧  # 𝑛·6·8.gt
+          𝑛·6·10 := 𝑛·6·7.gt( x ↦ 𝑛·5·6 )
+          𝑛·6·11 := ⟦ x ↦ 𝑛·5·6, λ ⤍ L_number_gt ⟧
           𝔼(L_number_gt):
-            recalled 𝑛·0·4 ⇒ 𝑛·1·21
+            recalled 𝑛·0·7 ⇒ 𝑛·1·27
             𝑛·7·1 := 𝑛·2·1  # 𝑛
-            𝑛·7·2 := 𝑛·1·21  # 𝕄(𝑛·7·1)
-          𝑛·6·9 := 𝑛·2·1.if( then ↦ 𝑛·3·1.plus( 𝑛·3·9 ).plus( 𝑛·5·5 ) )
-          𝑛·6·10 := ⟦ then ↦ 𝑛·3·1.plus( 𝑛·3·9 ).plus( 𝑛·5·5 ), else ↦ ∅, λ ⤍ L_fork ⟧
-          𝑛·6·11 := 𝑛·6·9( else ↦ 𝑛·4·1.plus( 𝑛·4·9 ).plus( 𝑛·5·5 ) )
-          𝑛·6·12 := ⟦ then ↦ 𝑛·3·1.plus( 𝑛·3·9 ).plus( 𝑛·5·5 ), else ↦ 𝑛·4·1.plus( 𝑛·4·9 ).plus( 𝑛·5·5 ), λ ⤍ L_fork ⟧
-          morphed 𝑛·6·13 := 𝑛·6·12
+            𝑛·7·2 := 𝑛·1·27  # 𝕄(𝑛·7·1)
+          normalized 𝑛·6·12 := ⟦ then ↦ ∅, else ↦ ∅, λ ⤍ L_fork ⟧  # 𝑛·7·2.if
+          𝑛·6·13 := 𝑛·2·1.if( then ↦ 𝑛·3·1.plus( 𝑛·3·11 ).plus( 𝑛·5·6 ) )
+          𝑛·6·14 := ⟦ then ↦ 𝑛·3·1.plus( 𝑛·3·11 ).plus( 𝑛·5·6 ), else ↦ ∅, λ ⤍ L_fork ⟧
+          𝑛·6·15 := 𝑛·6·13( else ↦ 𝑛·4·1.plus( 𝑛·4·11 ).plus( 𝑛·5·6 ) )
+          𝑛·6·16 := ⟦ then ↦ 𝑛·3·1.plus( 𝑛·3·11 ).plus( 𝑛·5·6 ), else ↦ 𝑛·4·1.plus( 𝑛·4·11 ).plus( 𝑛·5·6 ), λ ⤍ L_fork ⟧
+          morphed 𝑛·6·17 := 𝑛·6·16
         𝔼(L_fork):
-          recalled 𝑛·0·8 ⇒ ⟦ x ↦ 𝑛·1·9, λ ⤍ L_number_plus ⟧
-          𝑛·8·1 := 𝑛·5·18
+          recalled 𝑛·0·12 ⇒ ⟦ x ↦ 𝑛·1·12, λ ⤍ L_number_plus ⟧
+          𝑛·8·1 := 𝑛·5·21
         𝔼(L_number_plus):
-          recalled 𝑛·5·18 ⇒ 𝑛·5·17
+          recalled 𝑛·5·21 ⇒ 𝑛·5·20
           𝑛·9·1 := 𝑛·6·1  # 𝑛
-          𝑛·9·2 := 𝑛·5·17  # 𝕄(𝑛·9·1)
-        boxed 𝑛·6·14 := 𝑛·9·2.φ
+          𝑛·9·2 := 𝑛·5·20  # 𝕄(𝑛·9·1)
+        boxed 𝑛·6·18 := 𝑛·9·2.φ
         𝛿·6·2 := 𝔻(𝜎5:λ)
       𝛿2·6 := 𝛿·6·2  # 𝔻(ξ.x)
-      𝑛·6·15 := Φ.number( φ ↦ 𝜎6:λ )  # 𝑛
-      𝕄(𝑛·6·15):
-        𝑛·6·16 := Φ.number( φ ↦ 𝜎6:λ )
-        𝑛·6·17 := ⟦ φ ↦ 𝜎6:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
-        morphed 𝑛·6·18 := 𝑛·6·17
-      𝑛·6·19 := 𝑛·6·18  # 𝕄(𝑛·6·15)
-      memoized 𝑛·0·10 ⇛ 𝑛·6·19
-    morphed 𝑛·0·11 := 𝜎6:λ
+      𝑛·6·19 := Φ.number( φ ↦ 𝜎6:λ )  # 𝑛
+      𝕄(𝑛·6·19):
+        𝑛·6·20 := Φ.number( φ ↦ 𝜎6:λ )
+        𝑛·6·21 := ⟦ φ ↦ 𝜎6:λ, gt(x) ↦ L_number_gt:λ, plus(x) ↦ L_number_plus:λ ⟧
+        morphed 𝑛·6·22 := 𝑛·6·21
+      𝑛·6·23 := 𝑛·6·22  # 𝕄(𝑛·6·19)
+      memoized 𝑛·0·15 ⇛ 𝑛·6·23
+    normalized 𝑛·0·16 := 𝜎6:λ  # 𝑛·6·23.φ
+    morphed 𝑛·0·17 := 𝑛·0·16
diff --git a/test-resources/evaluate-packs/writes-the-term-a-normalize-premise-came-to.yaml b/test-resources/evaluate-packs/writes-the-term-a-normalize-premise-came-to.yaml
new file mode 100644
--- /dev/null
+++ b/test-resources/evaluate-packs/writes-the-term-a-normalize-premise-came-to.yaml
@@ -0,0 +1,21 @@
+# SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com
+# SPDX-License-Identifier: MIT
+---
+# yamllint disable rule:line-length
+# The rule 'md' of 𝕄 normalizes 'Φ.x' and then '𝑛·0·1.a' before it morphs
+# what they came to. Each normalization that changed its term writes a line
+# binding the term it came to to a fresh 𝑛, so the reader sees every term
+# the chain passed through, not only the one 𝕄 came to (#2362). The line
+# names in its comment the term the normalization came from, and a
+# normalization that came to a term an earlier line named, as 'Φ.x' came to
+# '𝑛·0·1', writes nothing, since that line would only repeat the name (#2366).
+symbolic: '[]'
+location: 'Q.@'
+input: >
+  ⟦ x ↦ ⟦ φ ↦ ⟦ a ↦ ⟦⟧ ⟧ ⟧, φ ↦ Φ.x.a ⟧
+result: ⟦⟧
+protocol: |
+  𝕄(Φ.φ):
+    remembered 𝑛·0·1 ≡ Φ.x  # ⟦⟧:a:φ
+    normalized 𝑛·0·2 := ⟦⟧  # 𝑛·0·1.φ.a
+    morphed 𝑛·0·3 := 𝑛·0·2
diff --git a/test/ASTSpec.hs b/test/ASTSpec.hs
--- a/test/ASTSpec.hs
+++ b/test/ASTSpec.hs
@@ -325,6 +325,24 @@
     it "does not find a term inside a bare symbol at the top" $
       within (ExFormation [BiDelta (BtOne "3E")]) (ExFormation [BiLambda (FnSymbol 5)]) `shouldBe` False
 
+  describe "akin" $ do
+    let down :: Expression -> Expression
+        down idx = ExFormation [BiTau (AtLabel "i") idx, BiTau AtPhi (ExDispatch ExRoot (AtLabel "qo"))]
+        next :: Expression -> Expression
+        next arg = ExApplication (ExDispatch ExRoot (AtLabel "next")) (ArTau (AtLabel "x") arg)
+        atom :: Expression -> Int -> Expression
+        atom side idx = ExFormation [BiTau (AtLabel "on") (ExFormation [BiLambda (FnSymbol idx)]), BiTau AtRho (ExFormation [BiTau (AtLabel "rt") side]), BiLambda (Function "L_vex")]
+    it "finds an atom inside the next one whose boxed formation wraps its argument once more" $
+      akin (atom (down (next (ExFormation [BiLambda (FnSymbol 3)]))) 5) (atom (down (next (next (ExFormation [BiLambda (FnSymbol 3)])))) 8) `shouldBe` True
+    it "does not find an atom inside one whose boxed formation lost a wrapper" $
+      akin (atom (down (next (next ExRoot))) 2) (atom (down (next ExRoot)) 2) `shouldBe` False
+    it "does not find an atom inside one that differs outside its boxed formations" $
+      akin (ExFormation [BiTau (AtLabel "t") (ExDispatch ExRoot (AtLabel "pu")), BiLambda (Function "L_yo")]) (ExFormation [BiTau (AtLabel "t") (next (ExDispatch ExRoot (AtLabel "pu"))), BiLambda (Function "L_yo")]) `shouldBe` False
+    it "does not find an atom inside one naming another λ function" $
+      akin (ExFormation [BiTau (AtLabel "w") (down ExXi), BiLambda (Function "L_ab")]) (ExFormation [BiTau (AtLabel "w") (down (next ExXi)), BiLambda (Function "L_cd")]) `shouldBe` False
+    it "does not map one symbol outside a boxed formation to two others" $
+      akin (atom (down ExRoot) 4) (ExFormation [BiTau (AtLabel "on") (ExFormation [BiLambda (FnSymbol 6)]), BiTau AtRho (ExFormation [BiTau (AtLabel "rt") (down ExRoot), BiTau (AtLabel "of") (ExFormation [BiLambda (FnSymbol 6)])]), BiLambda (Function "L_vex")]) `shouldBe` False
+
   describe "hashSkeleton" $ do
     it "does not tell apart two formations that bind other terms to the same attributes" $
       hashSkeleton (ExFormation [BiTau (AtLabel "acc") ExRoot, BiLambda (Function "L_f")])
diff --git a/test/CLISpec.hs b/test/CLISpec.hs
--- a/test/CLISpec.hs
+++ b/test/CLISpec.hs
@@ -1525,2498 +1525,2672 @@
                        , "    remembered 𝑛·0·3 ≡ 𝑛·0·1( x ↦ ⟦⟧ )"
                        , "    morphed 𝑛·0·4 := 𝑛·0·3"
                        , "  boxed 𝑛·0·5 := 𝑛·0·4.φ"
-                       , "  𝕄(𝑛·0·5):"
-                       , "    𝑛·0·6 := Φ.cyc( x ↦ ⟦⟧ )"
-                       , "    𝑛·0·7 := ⟦ x ↦ ⟦⟧, φ ↦ Φ.cyc( x ) ⟧"
-                       , "    morphed 𝑛·0·8 := 𝑛·0·7"
-                       , "  recalled 𝑛·0·3 ⇒ 𝑛·0·1( x ↦ ⟦⟧ )"
-                       , "  recalled 𝑛·0·1 ⇒ Φ.cyc"
-                       , "  𝕄(𝑛·0·8.x):"
-                       , "    morphed 𝑛·0·9 := ⟦⟧"
-                       , "  looped 𝜎1 := Φ.cyc( x ↦ 𝑛·0·9 )  # 𝔻(𝑛·0·5), proven, repeats 𝑛·0·8"
-                       , "  𝛿·0·1 := 𝔻(𝜎1:λ)"
-                       ]
-
-      it "writes the cut to the XML protocol with the formation in an element of its own" $
-        withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-          hClose stream
-          withStdin circling $
-            testCLISucceeded
-              ["dataize", "--locator=Q.t", "--acyclic=proven", "--partial", "--protocol=" ++ path, "--sweet", "--hide-rho", "--flat", "--quiet"]
-              []
-          records <- readProtocol path
-          lines records
-            `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                       , "<dataize at=\"Φ.t\">"
-                       , "  <morph at=\"Φ.t\">"
-                       , "    <remembered meta=\"𝑛·0·1\" as=\"Φ.cyc\"/>"
-                       , "    <formed meta=\"𝑒·0·1\"/>"
-                       , "    <applied meta=\"𝑛·0·2\" by=\"morph\" at=\"Φ.t\" of=\"Φ.cyc\"><meta attr=\"x\">𝑒·0·1</meta></applied>"
-                       , "    <formed meta=\"𝑛·0·3\" of=\"Φ.cyc\"><meta attr=\"x\">𝑒·0·1</meta></formed>"
-                       , "    <applied meta=\"𝑒·0·2\" of=\"𝑛·0·1\"><meta attr=\"x\">𝑒·0·1</meta></applied>"
-                       , "    <remembered of=\"𝑛·0·3\" as=\"𝑒·0·2\"/>"
-                       , "    <morphed meta=\"𝑛·0·4\">𝑛·0·3</morphed>"
-                       , "  </morph>"
-                       , "  <boxed meta=\"𝑛·0·5\">𝑛·0·4.φ</boxed>"
-                       , "  <morph at=\"𝑛·0·5\">"
-                       , "    <applied meta=\"𝑛·0·6\" by=\"morph\" at=\"𝑛·0·5\" of=\"Φ.cyc\"><meta attr=\"x\">𝑒·0·1</meta></applied>"
-                       , "    <formed meta=\"𝑛·0·7\" of=\"Φ.cyc\"><meta attr=\"x\">𝑒·0·1</meta></formed>"
-                       , "    <morphed meta=\"𝑛·0·8\">𝑛·0·7</morphed>"
-                       , "  </morph>"
-                       , "  <recalled of=\"𝑛·0·3\" as=\"𝑒·0·2\"/>"
-                       , "  <recalled of=\"𝑛·0·1\" as=\"Φ.cyc\"/>"
-                       , "  <morph at=\"𝑛·0·8.x\">"
-                       , "    <morphed meta=\"𝑛·0·9\">𝑒·0·1</morphed>"
-                       , "  </morph>"
-                       , "  <looped symbol=\"𝜎1\" by=\"dataize\" match=\"proven\" at=\"𝑛·0·5\" of=\"𝑛·0·8\" object=\"Φ.cyc\"><with><meta attr=\"x\">𝑛·0·9</meta></with></looped>"
-                       , "  <manufactured meta=\"𝛿·0·1\">𝜎1</manufactured>"
-                       , "</dataize>"
-                       ]
-
-      it "writes a plausible cut to the protocol as plausible" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin circling $
-            testCLISucceeded
-              ["dataize", "--locator=Q.t", "--acyclic=plausible", "--partial", "--minutes=" ++ path, "--sweet", "--hide-rho", "--flat", "--quiet"]
-              []
-          records <- readProtocol path
-          lines records `shouldContain` ["  looped 𝜎1 := Φ.cyc( x ↦ 𝑛·0·9 )  # 𝔻(𝑛·0·5), plausible, repeats 𝑛·0·8"]
-
-      it "refuses the flag without a mode" $
-        withStdin "⟦ t ↦ ⟦ Δ ⤍ 01-02 ⟧ ⟧" $
-          testCLIFailed ["dataize", "--locator=Q.t", "--acyclic"] ["The option `--acyclic` expects an argument"]
-
-      it "refuses a mode it does not know" $
-        withStdin "⟦ t ↦ ⟦ Δ ⤍ 01-02 ⟧ ⟧" $
-          testCLIFailed ["dataize", "--locator=Q.t", "--acyclic=sure"] ["The value 'sure' can't be used for '--acyclic' option"]
-
-      it "answers a terminating program the same way with the flag" $
-        withStdin "⟦ t ↦ ⟦ Δ ⤍ 01-02 ⟧ ⟧" $
-          testCLISucceeded ["dataize", "--locator=Q.t", "--acyclic=proven"] ["01-02"]
-
-    describe "--max-loops" $ do
-      let once = "⟦ f ↦ ⟦ x ↦ ∅, φ ↦ ξ.x.again ⟧, start ↦ ⟦ again ↦ Φ.f( x ↦ Φ.stop( v ↦ Φ.start ) ) ⟧, stop ↦ ⟦ v ↦ ∅, again ↦ ⟦ Δ ⤍ 01- ⟧ ⟧, t ↦ Φ.f( x ↦ Φ.start ) ⟧"
-      it "cuts a recursion that stops after one round without the flag" $
-        withStdin once $
-          testCLISucceeded
-            ["dataize", "--locator=Q.t", "--acyclic=plausible"]
-            ["40-45-00-00-00-00-00-00"]
-
-      it "dataizes a recursion that stops after one round with --max-loops=1" $
-        withStdin once $
-          testCLISucceeded ["dataize", "--locator=Q.t", "--acyclic=plausible", "--max-loops=1"] ["01-"]
-
-      it "cuts a recursion that never stops with --max-loops=1" $
-        withStdin "⟦ cyc ↦ ⟦ x ↦ ∅, φ ↦ Φ.cyc( ξ.x ) ⟧, t ↦ Φ.cyc( ⟦⟧ ) ⟧" $
-          testCLISucceeded
-            ["dataize", "--locator=Q.t", "--acyclic=proven", "--max-loops=1", "--max-steps=4000"]
-            ["40-45-00-00-00-00-00-00"]
-
-      it "refuses a negative count" $
-        withStdin once $
-          testCLIFailed ["dataize", "--locator=Q.t", "--acyclic=plausible", "--max-loops=-1"] ["--max-loops must be >= 0"]
-
-      it "refuses the flag without --acyclic" $
-        withStdin once $
-          testCLIFailed ["dataize", "--locator=Q.t", "--max-loops=1"] ["The option --max-loops requires --acyclic, since only --acyclic cuts a loop"]
-
-    describe "--acyclic at a recursive call" $ do
-      let recursive = "⟦ call(a) ↦ ⟦ λ ⤍ L_call ⟧, wrap(v) ↦ ⟦⟧, down(i) ↦ ⟦ φ ↦ Φ.call( a ↦ Φ.down( i ↦ Φ.wrap( v ↦ i ) ) ) ⟧, t ↦ Φ.down( i ↦ ⟦ Δ ⤍ 01- ⟧ ) ⟧"
-          calling = T.pack "- λ: L_call\n  morph:\n    𝑛1: $.a\n  evaluate:\n    𝑛2: 𝑛1\n  𝑛: 𝑛2\n"
-          recorded :: String -> IO [String]
-          recorded name =
-            withTempFile name $ \(path, stream) -> do
-              hClose stream
-              withLambdasOf calling $ \file ->
-                withStdin recursive $
-                  testCLISucceeded
-                    ["dataize", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=plausible", recording path, "--quiet", "--sweet", "--hide-rho"]
-                    []
-              lines <$> readProtocol path
-      it "answers the recursive call it cuts with a fresh symbol and goes on" $
-        withLambdasOf calling $ \file ->
-          withStdin recursive $
-            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=plausible"] ["40-45-00-00-00-00-00-00"]
-
-      it "writes the recursive call it cuts to the protocol as a call of the object" $
-        recorded "protocolXXXXXX.txt" >>= (`shouldContain` ["      looped 𝜎1 := Φ.down( i ↦ 𝑛·1·6 )  # plausible, repeats 𝑛·0·4"])
-
-      it "writes the recursive call it cuts to the XML protocol with the object and the metas of its arguments" $
-        recorded "protocolXXXXXX.xml" >>= (`shouldContain` ["      <looped symbol=\"𝜎1\" by=\"morph\" match=\"plausible\" at=\"ξ.a\" of=\"𝑛·0·4\" object=\"Φ.down\"><with><meta attr=\"i\">𝑛·1·6</meta></with></looped>"])
-
-    describe "--acyclic at a recursive call through a fork" $ do
-      let recursive = "⟦ if(c, a, b) ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ ξ.c, left🌵 ↦ ξ.a, right🌵 ↦ ξ.b ⟧, wrap(v) ↦ ⟦⟧, down(i) ↦ ⟦ φ ↦ Φ.if( c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ Φ.down( i ↦ Φ.wrap( v ↦ i ) ), b ↦ ⟦ φ ↦ ⟦ λ ⤍ 𝜎2 ⟧ ⟧ ) ⟧, t ↦ Φ.down( i ↦ ⟦ Δ ⤍ 01- ⟧ ) ⟧"
-          forking = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  cast:\n    𝑛5: 𝑛3\n    𝑛6: 𝑛4\n  join:\n    on: 𝛿1\n    left: 𝑛5\n    right: 𝑛6\n    otherwise: L_fork\n"
-          recorded :: String -> String -> IO [String]
-          recorded loops name =
-            withTempFile name $ \(path, stream) -> do
-              hClose stream
-              withLambdasOf forking $ \file ->
-                withStdin recursive $
-                  testCLISucceeded
-                    ["dataize", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=plausible", "--max-loops=" ++ loops, recording path, "--quiet", "--sweet", "--hide-rho"]
-                    []
-              lines <$> readProtocol path
-      it "answers the copy a side of a fork makes again with a fresh symbol and joins" $
-        withLambdasOf forking $ \file ->
-          withStdin recursive $
-            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=plausible", "--max-loops=1"] ["40-45-00-00-00-00-00-00"]
-
-      it "writes the copy it cuts in a side of a fork to the protocol as a call of the object" $
-        recorded "1" "protocolXXXXXX.txt" >>= (`shouldContain` ["        looped 𝜎3 := Φ.down( i ↦ 𝑛·3·6 )  # plausible, repeats 𝑛·0·4"])
-
-      it "writes the copy it cuts in a side of a fork to the XML protocol with the object and the metas of its arguments" $
-        recorded "1" "protocolXXXXXX.xml" >>= (`shouldContain` ["        <looped symbol=\"𝜎3\" by=\"morph\" match=\"plausible\" at=\"ξ.left🌵\" of=\"𝑛·0·4\" object=\"Φ.down\"><with><meta attr=\"i\">𝑛·3·6</meta></with></looped>"])
-
-      it "counts the copies the sides of earlier rounds of a fork made under --max-loops=2" $
-        recorded "2" "protocolXXXXXX.txt" >>= (`shouldContain` ["          looped 𝜎3 := Φ.down( i ↦ 𝑛·6·6 )  # plausible, repeats 𝑛·0·4"])
-
-    describe "--acyclic at a copy holding a λ" $ do
-      let recursive = "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, fork(left, right) ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ ⟦ λ ⤍ 𝜎4 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧, x ↦ Φ.dataized( Φ.fork( Φ.dataized( Φ.x ), ⟦ λ ⤍ 𝜎3 ⟧ ) ) ⟧"
-          forking = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  join:\n    on: 𝛿1\n    left: 𝑛3\n    right: 𝑛4\n    otherwise: L_fork\n- λ: L_dataized\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n"
-          recorded :: String -> IO [String]
-          recorded name =
-            withTempFile name $ \(path, stream) -> do
-              hClose stream
-              withLambdasOf forking $ \file ->
-                withStdin recursive $
-                  testCLISucceeded
-                    ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--partial", recording path, "--quiet", "--sweet", "--hide-rho"]
-                    []
-              lines <$> readProtocol path
-      it "answers the copy holding a λ it cuts with a fresh symbol and goes on" $
-        withLambdasOf forking $ \file ->
-          withStdin recursive $
-            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2"] ["40-45-00-00-00-00-00-00"]
-
-      it "writes the copy holding a λ it cuts to the protocol as a call of the object" $
-        recorded "protocolXXXXXX.txt" >>= (`shouldContain` ["                                looped 𝜎6 := Φ.dataized( target ↦ 𝜎5:λ )  # plausible, repeats 𝑛·9·2"])
-
-    describe "--acyclic at a copy holding a λ that evaluate fires" $ do
-      let recursive = "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, fork(left, right) ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ ⟦ λ ⤍ 𝜎4 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧, num(φ) ↦ ⟦⟧, x ↦ ⟦ φ ↦ Φ.fork( Φ.num( ⟦ λ ⤍ 𝜎3 ⟧ ), Φ.num( Φ.dataized( Φ.x ) ) ) ⟧ ⟧"
-          forking = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  join:\n    on: 𝛿1\n    left: 𝑛3\n    right: 𝑛4\n    otherwise: L_fork\n- λ: L_dataized\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n"
-      it "answers the copy holding a λ that evaluate cuts with a fresh symbol and goes on" $
-        withLambdasOf forking $ \file ->
-          withStdin recursive $
-            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2"] ["40-45-00-00-00-00-00-00"]
-
-    describe "--acyclic at a copy whose call ends with an attribute" $ do
-      let recursive = "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, fork(left, right) ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ ⟦ λ ⤍ 𝜎4 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧, num(φ) ↦ ⟦⟧, x ↦ Φ.fork( Φ.num( ⟦ λ ⤍ 𝜎5 ⟧ ), Φ.fork( Φ.num( ⟦ λ ⤍ 𝜎3 ⟧ ), Φ.num( Φ.dataized( Φ.x.φ ) ) ) ) ⟧"
-          forking = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  join:\n    on: 𝛿1\n    left: 𝑛3\n    right: 𝑛4\n    otherwise: L_fork\n- λ: L_dataized\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n"
-          recorded :: String -> IO [String]
-          recorded name =
-            withTempFile name $ \(path, stream) -> do
-              hClose stream
-              withLambdasOf forking $ \file ->
-                withStdin recursive $
-                  testCLISucceeded
-                    ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--partial", recording path, "--quiet", "--sweet", "--hide-rho"]
-                    []
-              lines <$> readProtocol path
-      it "writes the copy it cuts to the protocol as a call of the object with the attribute it ends with" $
-        recorded "protocolXXXXXX.txt" >>= (`shouldSatisfy` any (isInfixOf "looped 𝜎6 := Φ.fork( left ↦ 𝑛·13·8, right ↦ 𝑛·15·1 ).right🌵.φ  # plausible"))
-
-      it "writes the copy it cuts to the XML protocol with the object, the metas of its arguments and the attribute it ends with" $
-        recorded "protocolXXXXXX.xml" >>= (`shouldSatisfy` any (isInfixOf "object=\"Φ.fork\" dispatch=\"right🌵.φ\"><with><meta attr=\"left\">𝑛·13·8</meta><meta attr=\"right\">𝑛·15·1</meta></with></looped>"))
-
-    describe "--acyclic at a copy whose argument repeats the same loop" $ do
-      let recursive = "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, times(b) ↦ ⟦ λ ⤍ L_times ⟧, x ↦ Φ.times( Φ.dataized( Φ.x ) ) ⟧"
-          atoms = T.pack "- λ: L_times\n  dataize:\n    𝛿1: $.b\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n- λ: L_dataized\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n"
-      it "ends the run with an answer once it cuts the loop" $
-        withLambdasOf atoms $ \file ->
-          withStdin recursive $
-            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--max-seconds=30"] ["40-45-00-00-00-00-00-00"]
-
-      it "writes the cut of the argument inside the cut of the call to the protocol" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withLambdasOf atoms $ \file ->
-            withStdin recursive $
-              testCLISucceeded
-                ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--max-seconds=30", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"]
-                []
-          records <- readProtocol path
-          filter (isInfixOf "looped") (lines records) `shouldBe` ["                          looped 𝜎1 := Φ.dataized( target ↦ Φ.x )  # 𝔼(𝑛·6·2.b), plausible, repeats 𝑛·6·5", "                          looped 𝜎2 := Φ.times( b ↦ 𝜎1:λ )  # plausible, repeats 𝑛·6·2"]
-
-    describe "--acyclic at a copy whose argument raises" $
-      it "writes the copy of the terminator into the call it cuts by its name, never firing it" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withLambdasOf (T.pack "- λ: L_times\n  terminators: [L_throw]\n  dataize:\n    𝛿1: $.b\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n- λ: L_dataized\n  terminators: [L_throw]\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n") $ \file ->
-            withStdin "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, throw(message) ↦ ⟦ λ ⤍ L_throw ⟧, times(b, c) ↦ ⟦ λ ⤍ L_times ⟧, x ↦ Φ.times( Φ.dataized( Φ.x ), Φ.throw( 𝜎1:λ ) ) ⟧" $
-              testCLISucceeded
-                ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--max-seconds=30", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"]
-                []
-          records <- readProtocol path
-          filter (isInfixOf "looped 𝜎3") (lines records) `shouldBe` ["                          looped 𝜎3 := Φ.times( b ↦ 𝜎2:λ, c ↦ 𝑛·6·11 )  # plausible, repeats 𝑛·6·4"]
-
-    describe "--acyclic at a fork the memo fabricated" $ do
-      let recursive = "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, bool(fork) ↦ ⟦ if ↦ ξ.fork ⟧, num(φ) ↦ ⟦⟧, p ↦ ⟦ φ ↦ Φ.bool( ⟦ λ ⤍ L_fork, left ↦ ∅, right ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎4 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧ ).if( Φ.num( ⟦ λ ⤍ 𝜎3 ⟧ ), Φ.num( Φ.dataized( Φ.p ) ) ) ⟧, q ↦ ⟦ φ ↦ Φ.num( ⟦ λ ⤍ 𝜎5 ⟧ ) ⟧, x ↦ Φ.bool( ⟦ λ ⤍ L_fork, left ↦ ∅, right ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎1 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧ ).if( Φ.p, Φ.q ) ⟧"
-          forking = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  join:\n    on: 𝛿1\n    left: 𝑛3\n    right: 𝑛4\n    otherwise: L_fork\n- λ: L_dataized\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n"
-          recorded :: IO [String]
-          recorded =
-            withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-              hClose stream
-              withLambdasOf forking $ \file ->
-                withStdin recursive $
-                  testCLISucceeded
-                    ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"]
-                    []
-              lines <$> readProtocol path
-      it "answers the fork it cuts inside a formation the memo fabricated with a fresh symbol and goes on" $
-        withLambdasOf forking $ \file ->
-          withStdin recursive $
-            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2"] ["40-45-00-00-00-00-00-00"]
-
-      it "writes the fork it cuts inside a fabricated formation by its symbol alone, since no fact names it" $
-        recorded >>= (`shouldSatisfy` any (isInfixOf "looped 𝜎6  # 𝔻("))
-
-      it "answers the fork it cuts inside a formation fabricated from a fork of the world with a fresh symbol and goes on" $
-        withLambdasOf forking $ \file ->
-          withStdin "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, fork(left, right) ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ ⟦ λ ⤍ 𝜎4 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧, num(φ) ↦ ⟦⟧, p ↦ ⟦ φ ↦ Φ.fork( Φ.num( ⟦ λ ⤍ 𝜎3 ⟧ ), Φ.num( Φ.dataized( Φ.p ) ) ) ⟧, q ↦ ⟦ φ ↦ Φ.num( ⟦ λ ⤍ 𝜎5 ⟧ ) ⟧, x ↦ Φ.fork( Φ.p, Φ.q ) ⟧" $
-            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2"] ["40-45-00-00-00-00-00-00"]
-
-    describe "--acyclic at a fork written in place" $ do
-      let recursive = "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, bool(fork) ↦ ⟦ if ↦ ξ.fork ⟧, num(φ) ↦ ⟦⟧, p ↦ ⟦ φ ↦ Φ.bool( ⟦ λ ⤍ L_fork, left ↦ ∅, right ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎4 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧ ).if( Φ.num( ⟦ λ ⤍ 𝜎3 ⟧ ), Φ.num( Φ.dataized( Φ.p ) ) ) ⟧, x ↦ Φ.p ⟧"
-          forking = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  join:\n    on: 𝛿1\n    left: 𝑛3\n    right: 𝑛4\n    otherwise: L_fork\n- λ: L_dataized\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n"
-          recorded :: IO [String]
-          recorded =
-            withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-              hClose stream
-              withLambdasOf forking $ \file ->
-                withStdin recursive $
-                  testCLISucceeded
-                    ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"]
-                    []
-              lines <$> readProtocol path
-      it "answers the fork it cuts with a fresh symbol and goes on" $
-        withLambdasOf forking $ \file ->
-          withStdin recursive $
-            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2"] ["40-45-00-00-00-00-00-00"]
-
-      it "writes the loop it cuts as a call of the object whose bindings the copy repeats exactly" $
-        recorded >>= (`shouldSatisfy` any (isInfixOf "looped 𝜎5 := Φ.p  #"))
-
-      it "dont get stuck above the fork it cuts" $
-        recorded >>= (`shouldNotSatisfy` any (isInfixOf "stuck L_dataized"))
-
-    describe "--acyclic at a fork nested in a side of another fork" $ do
-      let recursive = "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, bool(fork) ↦ ⟦ if ↦ ξ.fork ⟧, num(φ) ↦ ⟦⟧, p ↦ ⟦ φ ↦ Φ.bool( ⟦ λ ⤍ L_fork, left ↦ ∅, right ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎4 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧ ).if( Φ.num( ⟦ λ ⤍ 𝜎5 ⟧ ), Φ.bool( ⟦ λ ⤍ L_fork, left ↦ ∅, right ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎6 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧ ).if( Φ.num( ⟦ λ ⤍ 𝜎3 ⟧ ), Φ.num( Φ.dataized( Φ.p ) ) ) ) ⟧, x ↦ Φ.p ⟧"
-          forking = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  join:\n    on: 𝛿1\n    left: 𝑛3\n    right: 𝑛4\n    otherwise: L_fork\n- λ: L_dataized\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n"
-          recorded :: IO [String]
-          recorded =
-            withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-              hClose stream
-              withLambdasOf forking $ \file ->
-                withStdin recursive $
-                  testCLISucceeded
-                    ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"]
-                    []
-              lines <$> readProtocol path
-      it "writes the loop it cuts inside the nested fork as a call of the object" $
-        recorded >>= (`shouldSatisfy` any (isInfixOf "looped 𝜎7 := Φ.p  # plausible"))
-
-      it "dont get stuck above the nested fork it cuts" $
-        recorded >>= (`shouldNotSatisfy` any (isInfixOf "stuck L_dataized"))
-
-    describe "--acyclic at copies of one atom called from different places" $
-      it "dont cut a copy of an atom that only resembles the copies open above it" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withLambdasOf (T.pack "- λ: L_d\n  dataize:\n    𝛿1: $.t\n  𝑛: Φ.w( φ ↦ ⟦ λ ⤍ 𝜎 ⟧ )\n") $ \file ->
-            withStdin "⟦ w ↦ ⟦ φ ↦ ∅, me ↦ ξ, you ↦ ξ, x ↦ Φ.d( t ↦ ξ ).me.you ⟧, d(t) ↦ ⟦ λ ⤍ L_d ⟧, e ↦ Φ.d( t ↦ Φ.d( t ↦ Φ.d( t ↦ ⟦ φ ↦ Φ.d( t ↦ ⟦ Δ ⤍ 01- ⟧ ).x ⟧ ) ) ) ⟧" $
-              testCLISucceeded
-                ["dataize", "--symbolic=" ++ file, "--locator=Q.e", "--acyclic=plausible", "--max-loops=2", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"]
-                []
-          records <- readProtocol path
-          lines records `shouldNotSatisfy` any (isInfixOf "looped")
-
-    it "dataizes with --sequence" $
-      withStdin "[[ @ -> $.f(y -> [[ ]]), f -> [[ D> 00-, y -> ? ]] ]]" $
-        testCLISucceeded
-          ["dataize", "--sequence", "--output=latex", "--flat", "--sweet"]
-          [ intercalate
-              "\n"
-              [ "\\begin{phiquation}"
-              , "[[ @ -> |f| ( |y| -> [[]] ), |f|(|y|) -> |00-| : D ]] \\phiDataize[\\nameref{r:box}]"
-              , "  \\phiDataize [[ @ -> |f| ( |y| -> [[]] ), |f|(|y|) -> |00-| : D ]] . @ \\phiNormalize[\\nameref{r:dot}]"
-              , "  \\phiNormalize [[ |f|(|y|) -> |00-| : D ]] . |f| ( |y| -> [[]], \\phiTerminal{\\rho} -> Q ) \\phiNormalize[\\nameref{r:dot}]"
-              , "  \\phiNormalize [[ D> |00-|, |y| -> ? ]] ( \\phiTerminal{\\rho} -> [[ |f|(|y|) -> |00-| : D ]], |y| -> [[]], \\phiTerminal{\\rho} -> Q ) \\phiNormalize[\\nameref{r:skip}]"
-              , "  \\phiNormalize [[ D> |00-|, |y| -> ? ]] ( |y| -> [[]], \\phiTerminal{\\rho} -> Q ) \\phiNormalize[\\nameref{r:copy}]"
-              , "  \\phiNormalize [[ D> |00-|, |y| -> [[]] ]] ( \\phiTerminal{\\rho} -> Q ) \\phiNormalize[\\nameref{r:skip}]"
-              , "  \\phiNormalize [[ D> |00-|, |y| -> [[]] ]] \\phiDataize[\\nameref{r:delta}]"
-              , "  \\phiDataize |00-|{.}"
-              , "\\end{phiquation}"
-              , "00-"
-              ]
-          ]
-
-    it "keeps the delta step in --sequence under --quiet" $
-      withStdin "[[ D> 01- ]]" $
-        testCLISucceeded
-          ["dataize", "--sequence", "--quiet", "--output=latex", "--flat", "--sweet"]
-          [ intercalate
-              "\n"
-              [ "|01-| : D \\phiDataize[\\nameref{r:delta}]"
-              , "  \\phiDataize |01-|{.}"
-              , "\\end{phiquation}"
-              ]
-          ]
-
-    it "ends the phi --sequence at the bare data" $
-      withStdin "[[ D> 01- ]]" $
-        testCLISucceeded
-          ["dataize", "--sequence", "--quiet", "--flat", "--sweet"]
-          ["01-:Δ\n01-"]
-
-    it "focuses a compressed sequence whose meet replaces a step root" $
-      withStdin "[[ @ -> [[ @ -> $.c.plus( 32.0 ), c -> 25.0 ]], bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus -> [[ ^ -> ?, x -> ?, L> L_number_plus ]] ]] ]]" $
-        testCLISucceeded
-          ["dataize", symbolic, "--output=latex", "--sweet", "--nonumber", "--compress", "--canonize", "--meet-prefix=dataization", "--sequence", "--flat", "--quiet", "--hide=Q.bytes", "--hide=Q.number", "--locator=Q.@", "--focus=Q.@", "--meet-length=5", "--meet-popularity=1"]
-          ["\\phinoMeet{dataization:1}{ [[ @ -> |c| . |plus| ( |32.0| ), |c| -> |25.0| ]] } \\phiDataize[\\nameref{r:box}]"]
-
-    it "compresses a canonized whole-expression sequence into a meet" $
-      withStdin "[[ @ -> [[ @ -> $.c.plus( 32.0 ), c -> 25.0 ]], bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus -> [[ ^ -> ?, x -> ?, L> L_number_plus ]] ]] ]]" $
-        testCLISucceeded
-          ["dataize", symbolic, "--output=latex", "--sweet", "--nonumber", "--compress", "--canonize", "--meet-prefix=dataization", "--sequence", "--flat", "--quiet", "--meet-length=5", "--meet-popularity=1"]
-          ["\\phinoMeet{dataization:1}"]
-
-    it "canonizes the residue it prints with --partial" $
-      withStdin "[[ @ -> [[ L> Foo ]] ]]" $
-        testCLISucceeded ["dataize", "--partial", "--canonize", "--flat", "--sweet"] ["Fn1:λ"]
-
-    it "hides an object outside the residue --locator aims at with --partial" $
-      withStdin "[[ t -> [[ @ -> [[ L> Foo ]] ]], o -> [[ D> 03- ]] ]]" $
-        testCLISucceeded ["dataize", "--partial", "--locator=Q.t", "--hide=Q.o", "--flat", "--sweet"] ["Foo:λ"]
-
-    it "dataizes with --locator" $
-      withStdin "[[ ex -> [[ @ -> Q.x ]], x -> [[ D> 42- ]] ]]" $
-        testCLISucceeded ["dataize", "--locator=Q.ex"] ["42-"]
-
-    it "does not print bytes with --quiet" $
-      withStdin "[[ D> 01- ]]" $
-        testCLISucceeded ["dataize", "--quiet"] []
-
-    describe "--abridged" $ do
-      let wide = "⟦ t ↦ ⟦ φ ↦ ⟦ Δ ⤍ 01-02 ⟧, anfang ↦ ξ.schluss, mitte ↦ ξ.anfang, schluss ↦ ξ.mitte, rand ↦ ξ.schluss ⟧ ⟧"
-          stuck = "⟦ t ↦ ⟦ λ ⤍ L_weit, anfang ↦ ξ.schluss, mitte ↦ ξ.anfang, schluss ↦ ξ.mitte, rand ↦ ξ.schluss ⟧ ⟧"
-      it "folds a long formation in the text protocol" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin stuck $
-            testCLISucceeded ["dataize", "--locator=Q.t", "--partial", "--minutes=" ++ path, "--abridged", "--sweet", "--hide-rho", "--quiet"] []
-          records <- readProtocol path
-          lines records `shouldContain` ["  unanswered L_weit  # 𝔻(⟦ λ ⤍ L_weit, +4 ⟧)"]
-      it "names a long formation in the XML protocol by its path rather than folding it" $
-        withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-          hClose stream
-          withStdin stuck $
-            testCLISucceeded ["dataize", "--locator=Q.t", "--partial", "--protocol=" ++ path, "--abridged", "--sweet", "--hide-rho", "--quiet"] []
-          records <- readProtocol path
-          lines records `shouldContain` ["  <unanswered λ=\"L_weit\" by=\"dataize\">Φ.t</unanswered>"]
-      forM_
-        [ ("textXXXXXX.txt", "      𝛿·1·1 := 01-02-..(8b)..-0B-0C")
-        , ("XMLXXXXXX.xml", "      <dataized meta=\"𝛿·1·1\">01-02-..(8b)..-0B-0C</dataized>")
-        ]
-        ( \(template, line) ->
-            it ("cuts a long datum a firing came down to under --abridged-data, as " ++ line) $
-              withTempFile template $ \(path, stream) -> do
-                hClose stream
-                withLambdasOf (T.pack "- λ: L_outer\n  dataize:\n    𝛿1: ξ.arg\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n") $ \outer ->
-                  withStdin "⟦ x ↦ ⟦ arg ↦ ⟦ Δ ⤍ 01-02-03-04-05-06-07-08-09-0A-0B-0C ⟧, λ ⤍ L_outer ⟧ ⟧" $
-                    testCLISucceeded ["dataize", "--symbolic=" ++ outer, "--locator=Q.x", "--partial", recording path, "--abridged", "--abridged-data", "--sweet", "--hide-rho", "--quiet"] []
-                records <- readProtocol path
-                lines records `shouldContain` [line]
-        )
-      forM_
-        [ ("textXXXXXX.txt", "      𝛿·1·1 := 30-31-32-33-34-35-36-37-38-39-41-42-43-44-45-46")
-        , ("XMLXXXXXX.xml", "      <dataized meta=\"𝛿·1·1\">30-31-32-33-34-35-36-37-38-39-41-42-43-44-45-46</dataized>")
-        ]
-        ( \(template, line) ->
-            it ("keeps a long datum a firing came down to whole without --abridged-data, as " ++ line) $
-              withTempFile template $ \(path, stream) -> do
-                hClose stream
-                withLambdasOf (T.pack "- λ: L_hex\n  dataize:\n    𝛿1: ξ.arg\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n") $ \hex ->
-                  withStdin "⟦ x ↦ ⟦ arg ↦ ⟦ Δ ⤍ 30-31-32-33-34-35-36-37-38-39-41-42-43-44-45-46 ⟧, λ ⤍ L_hex ⟧ ⟧" $
-                    testCLISucceeded ["dataize", "--symbolic=" ++ hex, "--locator=Q.x", "--partial", recording path, "--abridged", "--sweet", "--hide-rho", "--quiet"] []
-                records <- readProtocol path
-                lines records `shouldContain` [line]
-        )
-      it "folds a long formation under the width given as the value" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin stuck $
-            testCLISucceeded ["dataize", "--locator=Q.t", "--partial", "--minutes=" ++ path, "--abridged=64", "--sweet", "--hide-rho", "--quiet"] []
-          records <- readProtocol path
-          lines records `shouldContain` ["  unanswered L_weit  # 𝔻(⟦ λ ⤍ L_weit, +4 ⟧)"]
-      it "keeps a formation whole under a width it fits in" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin stuck $
-            testCLISucceeded ["dataize", "--locator=Q.t", "--partial", "--minutes=" ++ path, "--abridged=200", "--sweet", "--hide-rho", "--quiet"] []
-          records <- readProtocol path
-          lines records `shouldContain` ["  unanswered L_weit  # 𝔻(⟦ λ ⤍ L_weit, anfang ↦ schluss, mitte ↦ anfang, schluss ↦ mitte, rand ↦ schluss ⟧)"]
-      it "refuses a width that is not a number" $
-        withStdin wide $
-          testCLIFailed ["dataize", "--locator=Q.t", "--protocol=breit.txt", "--abridged=breit"] ["cannot parse value `breit'"]
-      it "leaves the printed result whole" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin wide $
-            testCLISucceeded ["morph", "--locator=Q.t", "--minutes=" ++ path, "--abridged", "--sweet", "--hide-rho", "--flat"] ["anfang ↦ schluss, mitte ↦ anfang"]
-      it "refuses the flag without a protocol" $
-        withStdin wide $
-          testCLIFailed ["dataize", "--locator=Q.t", "--abridged"] ["The option --abridged requires --protocol"]
-      it "refuses to cut the data in dataize without --abridged" $
-        withStdin wide $
-          testCLIFailed ["dataize", "--locator=Q.t", "--protocol=daten.txt", "--abridged-data"] ["The option --abridged-data requires --abridged"]
-      it "refuses to cut the data in morph without --abridged" $
-        withStdin wide $
-          testCLIFailed ["morph", "--locator=Q.t", "--protocol=daten.xml", "--abridged-data"] ["The option --abridged-data requires --abridged"]
-
-    describe "--protocol" $ do
-      let sum' = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> 5.plus(6) ]]"
-          chained = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> 5.plus(6).plus(7) ]]"
-          nested = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> 5.plus(6.plus(7)) ]]"
-          mixed = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]], times(^, x) -> [[ L> L_number_times ]] ]], @ -> 5.plus(6).times(7) ]]"
-      it "opens the protocol with the run it is the protocol of" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin "[[ D> 01- ]]" $
-            testCLISucceeded ["dataize", "--minutes=" ++ path, "--quiet"] []
-          records <- readProtocol path
-          records `shouldBe` "𝔻(Φ):\n  𝛿·0·1 := 01-\n"
-
-      it "opens the protocol with a header naming the phino that wrote it" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin "[[ D> 01- ]]" $
-            testCLISucceeded ["dataize", "--minutes=" ++ path, "--quiet"] []
-          records <- readUtf8 path
-          records `shouldSatisfy` isPrefixOf ("# Written by phino " ++ showVersion version ++ " ")
-
-      it "writes the command line of the run into the header" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin "[[ D> 01- ]]" $
-            testCLISucceeded ["dataize", "--minutes=" ++ takeFileName path, "--quiet"] []
-          records <- readUtf8 path
-          lines records `shouldContain` ["# Command: phino dataize --minutes=" ++ takeFileName path ++ " --quiet"]
-
-      it "writes the world read from the standard input into the header" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $
-            testCLISucceeded ["dataize", "--locator=Q.t", "--minutes=" ++ path, "--quiet"] []
-          records <- readUtf8 path
-          lines records `shouldContain` ["# World: stdin, 1 line, 32 bytes, 1 object at the top, 2 bindings"]
-
-      it "writes the world read from a file into the header" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withTempFileContent "worldXXXXXX.phi" "[[\n  t -> [[ D> 01- ]]\n]]\n" $ \world -> do
-            testCLISucceeded ["dataize", "--locator=Q.t", "--minutes=" ++ path, "--quiet", world] []
-            records <- readUtf8 path
-            lines records `shouldContain` [printf "# World: %s, 3 lines, 26 bytes, 1 object at the top, 2 bindings" world]
-
-      it "writes the λ functions of the run into the header" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin sum' $
-            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet"] []
-          records <- readUtf8 path
-          lines records `shouldContain` [printf "# Symbolic: %s, 5 entries" lambdasFile]
-
-      it "writes the locator of the run into the header" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $
-            testCLISucceeded ["dataize", "--locator=Q.t", "--minutes=" ++ path, "--quiet"] []
-          records <- readUtf8 path
-          lines records `shouldContain` ["# Locator: Φ.t"]
-
-      it "writes the expression the locator points at into the header" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $
-            testCLISucceeded ["dataize", "--locator=Q.t", "--minutes=" ++ path, "--quiet"] []
-          records <- readUtf8 path
-          lines records `shouldContain` ["# Expression: ⟦ Δ ⤍ 01- ⟧"]
-
-      it "writes the expression given to --inside into the header" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $
-            testCLISucceeded ["morph", "--inside=Φ.t", "--minutes=" ++ path, "--quiet"] []
-          records <- readUtf8 path
-          lines records `shouldContain` ["# Expression: Φ.t"]
-
-      it "writes the header into the XML protocol" $
-        withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-          hClose stream
-          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $
-            testCLISucceeded ["dataize", "--locator=Q.t", "--protocol=" ++ path, "--quiet"] []
-          records <- readUtf8 path
-          lines records `shouldContain` ["  <locator>Φ.t</locator>"]
-
-      it "closes the protocol with its msec on the third line from the end" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin sum' $
-            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet"] []
-          records <- readUtf8 path
-          (lines records !! (length (lines records) - 3)) `shouldSatisfy` isPrefixOf "msec "
-
-      it "closes the protocol with the firings it counted" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin sum' $
-            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet"] []
-          records <- readUtf8 path
-          lines records `shouldContain` ["firings 1"]
-
-      it "closes the protocol with its fps on the last line" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin sum' $
-            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet"] []
-          records <- readUtf8 path
-          last (lines records) `shouldSatisfy` isPrefixOf "fps "
-
-      it "closes the protocol with zero firings when the run fires nothing" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin "[[ D> 01- ]]" $
-            testCLISucceeded ["dataize", "--minutes=" ++ path, "--quiet"] []
-          records <- readUtf8 path
-          lines records `shouldContain` ["firings 0"]
-
-      it "writes one line per operand and one per answer of a firing" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin sum' $
-            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-          records <- readProtocol path
-          lines records
-            `shouldBe` [ "𝔻(Φ):"
-                       , "  boxed 𝑛·0·1 := Φ.φ"
-                       , "  𝕄(𝑛·0·1):"
-                       , "    𝑛·0·2 := 5.0"
-                       , "    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                       , "    𝑛·0·4 := 𝑛·0·2.plus( x ↦ 6.0 )"
-                       , "    𝑛·0·5 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"
-                       , "    morphed 𝑛·0·6 := 𝑛·0·5"
-                       , "  𝔼(L_number_plus):  # 𝔻(𝑛·0·1)"
-                       , "    𝔻(ξ.ρ):"
-                       , "      𝕄(ξ.ρ):"
-                       , "        𝑛·1·1 := 5.0"
-                       , "        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                       , "        morphed 𝑛·1·3 := 𝑛·1·2"
-                       , "      boxed 𝑛·1·4 := 𝑛·1·3.φ"
-                       , "      𝕄(𝑛·1·4):"
-                       , "        𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"
-                       , "        𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ"
-                       , "        morphed 𝑛·1·7 := 𝑛·1·6"
-                       , "      boxed 𝑛·1·8 := 𝑛·1·7.φ"
-                       , "      𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"
-                       , "    𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
-                       , "    𝔻(ξ.x):"
-                       , "      𝕄(ξ.x):"
-                       , "        𝑛·1·9 := 6.0"
-                       , "        𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                       , "        morphed 𝑛·1·11 := 𝑛·1·10"
-                       , "      boxed 𝑛·1·12 := 𝑛·1·11.φ"
-                       , "      𝕄(𝑛·1·12):"
-                       , "        𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"
-                       , "        𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ"
-                       , "        morphed 𝑛·1·15 := 𝑛·1·14"
-                       , "      boxed 𝑛·1·16 := 𝑛·1·15.φ"
-                       , "      𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"
-                       , "    𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
-                       , "    𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
-                       , "    𝕄(𝑛·1·17):"
-                       , "      𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )"
-                       , "      𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"
-                       , "      morphed 𝑛·1·20 := 𝑛·1·19"
-                       , "    𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)"
-                       , "  boxed 𝑛·0·7 := 𝑛·1·21.φ"
-                       , "  𝛿·0·1 := 𝔻(𝜎1:λ)"
-                       ]
-
-      it "writes what every morphing a dataization ran came to" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withLambdasOf (T.pack "- λ: L_make\n  𝑛: ⟦ φ ↦ Φ.bytes( φ ↦ ⟦ λ ⤍ 𝜎 ⟧ ) ⟧\n") $ \makes ->
-            withStdin "⟦ bytes ↦ ⟦ φ ↦ ∅ ⟧, make ↦ ⟦ λ ⤍ L_make ⟧, foo ↦ ⟦ φ ↦ Φ.make ⟧, e ↦ Φ.foo ⟧" $
-              testCLISucceeded ["dataize", "--symbolic=" ++ makes, "--locator=Q.e", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-          records <- readProtocol path
-          lines records
-            `shouldBe` [ "𝔻(Φ.e):"
-                       , "  𝕄(Φ.e):"
-                       , "    remembered 𝑛·0·1 ≡ Φ.foo  # Φ.make:φ"
-                       , "    morphed 𝑛·0·2 := 𝑛·0·1"
-                       , "  boxed 𝑛·0·3 := 𝑛·0·2.φ"
-                       , "  𝕄(𝑛·0·3):"
-                       , "    remembered 𝑛·0·4 ≡ Φ.make  # L_make:λ"
-                       , "    morphed 𝑛·0·5 := 𝑛·0·4"
-                       , "  𝔼(L_make):  # 𝔻(𝑛·0·3)"
-                       , "    𝑛·1·1 := Φ.bytes( φ ↦ 𝜎1:λ ):φ  # 𝑛"
-                       , "    𝕄(𝑛·1·1):"
-                       , "      morphed 𝑛·1·2 := Φ.bytes( φ ↦ 𝜎1:λ ):φ"
-                       , "    𝑛·1·3 := 𝑛·1·2  # 𝕄(𝑛·1·1)"
-                       , "    remembered 𝑛·1·3 ≡ 𝑛·0·4"
-                       , "  boxed 𝑛·0·6 := 𝑛·1·3.φ"
-                       , "  𝕄(𝑛·0·6):"
-                       , "    𝑛·0·7 := Φ.bytes( φ ↦ 𝜎1:λ )"
-                       , "    𝑛·0·8 := 𝜎1:λ:φ"
-                       , "    morphed 𝑛·0·9 := 𝑛·0·8"
-                       , "  boxed 𝑛·0·10 := 𝑛·0·9.φ"
-                       , "  𝛿·0·1 := 𝔻(𝜎1:λ)"
-                       ]
-
-      it "numbers the firings of one entry apart and names the symbol between them" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin chained $
-            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-          records <- readProtocol path
-          lines records
-            `shouldBe` [ "𝔻(Φ):"
-                       , "  boxed 𝑛·0·1 := Φ.φ"
-                       , "  𝕄(𝑛·0·1):"
-                       , "    𝑛·0·2 := 5.0"
-                       , "    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                       , "    𝑛·0·4 := 𝑛·0·2.plus( x ↦ 6.0 )"
-                       , "    𝑛·0·5 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"
-                       , "    𝔼(L_number_plus):"
-                       , "      𝔻(ξ.ρ):"
-                       , "        𝕄(ξ.ρ):"
-                       , "          𝑛·1·1 := 5.0"
-                       , "          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                       , "          morphed 𝑛·1·3 := 𝑛·1·2"
-                       , "        boxed 𝑛·1·4 := 𝑛·1·3.φ"
-                       , "        𝕄(𝑛·1·4):"
-                       , "          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"
-                       , "          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ"
-                       , "          morphed 𝑛·1·7 := 𝑛·1·6"
-                       , "        boxed 𝑛·1·8 := 𝑛·1·7.φ"
-                       , "        𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"
-                       , "      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
-                       , "      𝔻(ξ.x):"
-                       , "        𝕄(ξ.x):"
-                       , "          𝑛·1·9 := 6.0"
-                       , "          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                       , "          morphed 𝑛·1·11 := 𝑛·1·10"
-                       , "        boxed 𝑛·1·12 := 𝑛·1·11.φ"
-                       , "        𝕄(𝑛·1·12):"
-                       , "          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"
-                       , "          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ"
-                       , "          morphed 𝑛·1·15 := 𝑛·1·14"
-                       , "        boxed 𝑛·1·16 := 𝑛·1·15.φ"
-                       , "        𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"
-                       , "      𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
-                       , "      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
-                       , "      𝕄(𝑛·1·17):"
-                       , "        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )"
-                       , "        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"
-                       , "        morphed 𝑛·1·20 := 𝑛·1·19"
-                       , "      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)"
-                       , "    𝑛·0·6 := 𝑛·1·18.plus( x ↦ 7.0 )"
-                       , "    𝑛·0·7 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"
-                       , "    morphed 𝑛·0·8 := 𝑛·0·7"
-                       , "  𝔼(L_number_plus):  # 𝔻(𝑛·0·1)"
-                       , "    𝔻(ξ.ρ):"
-                       , "      𝕄(ξ.ρ):"
-                       , "        𝑛·2·1 := Φ.number( φ ↦ 𝜎1:λ )"
-                       , "        𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"
-                       , "        morphed 𝑛·2·3 := 𝑛·1·21"
-                       , "      boxed 𝑛·2·4 := 𝑛·2·3.φ"
-                       , "      𝛿·2·1 := 𝔻(𝜎1:λ)"
-                       , "    𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)"
-                       , "    𝔻(ξ.x):"
-                       , "      𝕄(ξ.x):"
-                       , "        𝑛·2·5 := 7.0"
-                       , "        𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                       , "        morphed 𝑛·2·7 := 𝑛·2·6"
-                       , "      boxed 𝑛·2·8 := 𝑛·2·7.φ"
-                       , "      𝕄(𝑛·2·8):"
-                       , "        𝑛·2·9 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )"
-                       , "        𝑛·2·10 := 40-1C-00-00-00-00-00-00:Δ:φ"
-                       , "        morphed 𝑛·2·11 := 𝑛·2·10"
-                       , "      boxed 𝑛·2·12 := 𝑛·2·11.φ"
-                       , "      𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0"
-                       , "    𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)"
-                       , "    𝑛·2·13 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛"
-                       , "    𝕄(𝑛·2·13):"
-                       , "      𝑛·2·14 := Φ.number( φ ↦ 𝜎2:λ )"
-                       , "      𝑛·2·15 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧"
-                       , "      morphed 𝑛·2·16 := 𝑛·2·15"
-                       , "    𝑛·2·17 := 𝑛·2·16  # 𝕄(𝑛·2·13)"
-                       , "  boxed 𝑛·0·9 := 𝑛·2·17.φ"
-                       , "  𝛿·0·1 := 𝔻(𝜎2:λ)"
-                       ]
-
-      it "numbers the firings of different entries apart" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin mixed $
-            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-          records <- readProtocol path
-          lines records
-            `shouldBe` [ "𝔻(Φ):"
-                       , "  boxed 𝑛·0·1 := Φ.φ"
-                       , "  𝕄(𝑛·0·1):"
-                       , "    𝑛·0·2 := 5.0"
-                       , "    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"
-                       , "    𝑛·0·4 := 𝑛·0·2.plus( x ↦ 6.0 )"
-                       , "    𝑛·0·5 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"
-                       , "    𝔼(L_number_plus):"
-                       , "      𝔻(ξ.ρ):"
-                       , "        𝕄(ξ.ρ):"
-                       , "          𝑛·1·1 := 5.0"
-                       , "          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"
-                       , "          morphed 𝑛·1·3 := 𝑛·1·2"
-                       , "        boxed 𝑛·1·4 := 𝑛·1·3.φ"
-                       , "        𝕄(𝑛·1·4):"
-                       , "          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"
-                       , "          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ"
-                       , "          morphed 𝑛·1·7 := 𝑛·1·6"
-                       , "        boxed 𝑛·1·8 := 𝑛·1·7.φ"
-                       , "        𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"
-                       , "      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
-                       , "      𝔻(ξ.x):"
-                       , "        𝕄(ξ.x):"
-                       , "          𝑛·1·9 := 6.0"
-                       , "          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"
-                       , "          morphed 𝑛·1·11 := 𝑛·1·10"
-                       , "        boxed 𝑛·1·12 := 𝑛·1·11.φ"
-                       , "        𝕄(𝑛·1·12):"
-                       , "          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"
-                       , "          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ"
-                       , "          morphed 𝑛·1·15 := 𝑛·1·14"
-                       , "        boxed 𝑛·1·16 := 𝑛·1·15.φ"
-                       , "        𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"
-                       , "      𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
-                       , "      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
-                       , "      𝕄(𝑛·1·17):"
-                       , "        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )"
-                       , "        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"
-                       , "        morphed 𝑛·1·20 := 𝑛·1·19"
-                       , "      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)"
-                       , "    𝑛·0·6 := 𝑛·1·18.times( x ↦ 7.0 )"
-                       , "    𝑛·0·7 := ⟦ x ↦ 7.0, λ ⤍ L_number_times ⟧"
-                       , "    morphed 𝑛·0·8 := 𝑛·0·7"
-                       , "  𝔼(L_number_times):  # 𝔻(𝑛·0·1)"
-                       , "    𝔻(ξ.ρ):"
-                       , "      𝕄(ξ.ρ):"
-                       , "        𝑛·2·1 := Φ.number( φ ↦ 𝜎1:λ )"
-                       , "        𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"
-                       , "        morphed 𝑛·2·3 := 𝑛·1·21"
-                       , "      boxed 𝑛·2·4 := 𝑛·2·3.φ"
-                       , "      𝛿·2·1 := 𝔻(𝜎1:λ)"
-                       , "    𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)"
-                       , "    𝔻(ξ.x):"
-                       , "      𝕄(ξ.x):"
-                       , "        𝑛·2·5 := 7.0"
-                       , "        𝑛·2·6 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"
-                       , "        morphed 𝑛·2·7 := 𝑛·2·6"
-                       , "      boxed 𝑛·2·8 := 𝑛·2·7.φ"
-                       , "      𝕄(𝑛·2·8):"
-                       , "        𝑛·2·9 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )"
-                       , "        𝑛·2·10 := 40-1C-00-00-00-00-00-00:Δ:φ"
-                       , "        morphed 𝑛·2·11 := 𝑛·2·10"
-                       , "      boxed 𝑛·2·12 := 𝑛·2·11.φ"
-                       , "      𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0"
-                       , "    𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)"
-                       , "    𝑛·2·13 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛"
-                       , "    𝕄(𝑛·2·13):"
-                       , "      𝑛·2·14 := Φ.number( φ ↦ 𝜎2:λ )"
-                       , "      𝑛·2·15 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"
-                       , "      morphed 𝑛·2·16 := 𝑛·2·15"
-                       , "    𝑛·2·17 := 𝑛·2·16  # 𝕄(𝑛·2·13)"
-                       , "  boxed 𝑛·0·9 := 𝑛·2·17.φ"
-                       , "  𝛿·0·1 := 𝔻(𝜎2:λ)"
-                       ]
-
-      it "nests the firing an operand of another firing brought down" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin nested $
-            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-          records <- readProtocol path
-          lines records
-            `shouldBe` [ "𝔻(Φ):"
-                       , "  boxed 𝑛·0·1 := Φ.φ"
-                       , "  𝕄(𝑛·0·1):"
-                       , "    𝑛·0·2 := 5.0"
-                       , "    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                       , "    𝑛·0·4 := 𝑛·0·2.plus( x ↦ 6.0.plus( 7.0 ) )"
-                       , "    𝑛·0·5 := ⟦ x ↦ 6.0.plus( 7.0 ), λ ⤍ L_number_plus ⟧"
-                       , "    morphed 𝑛·0·6 := 𝑛·0·5"
-                       , "  𝔼(L_number_plus):  # 𝔻(𝑛·0·1)"
-                       , "    𝔻(ξ.ρ):"
-                       , "      𝕄(ξ.ρ):"
-                       , "        𝑛·1·1 := 5.0"
-                       , "        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                       , "        morphed 𝑛·1·3 := 𝑛·1·2"
-                       , "      boxed 𝑛·1·4 := 𝑛·1·3.φ"
-                       , "      𝕄(𝑛·1·4):"
-                       , "        𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"
-                       , "        𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ"
-                       , "        morphed 𝑛·1·7 := 𝑛·1·6"
-                       , "      boxed 𝑛·1·8 := 𝑛·1·7.φ"
-                       , "      𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"
-                       , "    𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
-                       , "    𝔻(ξ.x):"
-                       , "      𝕄(ξ.x):"
-                       , "        𝑛·1·9 := 6.0"
-                       , "        𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                       , "        𝑛·1·11 := 𝑛·1·9.plus( x ↦ 7.0 )"
-                       , "        𝑛·1·12 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"
-                       , "        morphed 𝑛·1·13 := 𝑛·1·12"
-                       , "      𝔼(L_number_plus):"
-                       , "        𝔻(ξ.ρ):"
-                       , "          𝕄(ξ.ρ):"
-                       , "            𝑛·2·1 := 6.0"
-                       , "            𝑛·2·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                       , "            morphed 𝑛·2·3 := 𝑛·2·2"
-                       , "          boxed 𝑛·2·4 := 𝑛·2·3.φ"
-                       , "          𝕄(𝑛·2·4):"
-                       , "            𝑛·2·5 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"
-                       , "            𝑛·2·6 := 40-18-00-00-00-00-00-00:Δ:φ"
-                       , "            morphed 𝑛·2·7 := 𝑛·2·6"
-                       , "          boxed 𝑛·2·8 := 𝑛·2·7.φ"
-                       , "          𝛿·2·1 := 40-18-00-00-00-00-00-00  # 6.0"
-                       , "        𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)"
-                       , "        𝔻(ξ.x):"
-                       , "          𝕄(ξ.x):"
-                       , "            𝑛·2·9 := 7.0"
-                       , "            𝑛·2·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                       , "            morphed 𝑛·2·11 := 𝑛·2·10"
-                       , "          boxed 𝑛·2·12 := 𝑛·2·11.φ"
-                       , "          𝕄(𝑛·2·12):"
-                       , "            𝑛·2·13 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )"
-                       , "            𝑛·2·14 := 40-1C-00-00-00-00-00-00:Δ:φ"
-                       , "            morphed 𝑛·2·15 := 𝑛·2·14"
-                       , "          boxed 𝑛·2·16 := 𝑛·2·15.φ"
-                       , "          𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0"
-                       , "        𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)"
-                       , "        𝑛·2·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
-                       , "        𝕄(𝑛·2·17):"
-                       , "          𝑛·2·18 := Φ.number( φ ↦ 𝜎1:λ )"
-                       , "          𝑛·2·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"
-                       , "          morphed 𝑛·2·20 := 𝑛·2·19"
-                       , "        𝑛·2·21 := 𝑛·2·20  # 𝕄(𝑛·2·17)"
-                       , "      boxed 𝑛·1·14 := 𝑛·2·21.φ"
-                       , "      𝛿·1·2 := 𝔻(𝜎1:λ)"
-                       , "    𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
-                       , "    𝑛·1·15 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛"
-                       , "    𝕄(𝑛·1·15):"
-                       , "      𝑛·1·16 := Φ.number( φ ↦ 𝜎2:λ )"
-                       , "      𝑛·1·17 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧"
-                       , "      morphed 𝑛·1·18 := 𝑛·1·17"
-                       , "    𝑛·1·19 := 𝑛·1·18  # 𝕄(𝑛·1·15)"
-                       , "  boxed 𝑛·0·7 := 𝑛·1·19.φ"
-                       , "  𝛿·0·1 := 𝔻(𝜎2:λ)"
-                       ]
-
-      it "writes a stuck firing to the XML protocol" $
-        withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-          hClose stream
-          withLambdasOf (T.pack "- λ: L_outer\n  dataize:\n    𝛿1: ξ.arg\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n") $ \outer ->
-            withStdin "⟦ x ↦ ⟦ arg ↦ ⟦ λ ⤍ L_absent ⟧, λ ⤍ L_outer ⟧.φ ⟧" $
-              testCLISucceeded ["morph", "--symbolic=" ++ outer, "--locator=Q.x", "--partial", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-          records <- readProtocol path
-          lines records `shouldContain` ["    <stuck λ=\"L_absent\"/>"]
-
-      it "writes a starved step budget to the XML protocol" $
-        withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-          hClose stream
-          withLambdasOf (T.pack "- λ: L_outer\n  dataize:\n    𝛿1: ξ.arg\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n") $ \outer ->
-            withStdin "⟦ x ↦ ⟦ arg ↦ ⟦ φ ↦ ⟦ φ ↦ ⟦ Δ ⤍ 07- ⟧ ⟧ ⟧, λ ⤍ L_outer ⟧ ⟧" $
-              testCLISucceeded ["dataize", "--symbolic=" ++ outer, "--locator=Q.x", "--partial", "--max-steps=3", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho", "--flat"] []
-          records <- readProtocol path
-          lines records `shouldContain` ["      <starved limit=\"3\" by=\"dataize\" at=\"𝑛·1·2\"/>"]
-
-      forM_
-        [("XMLXXXXXX.xml", "<exceeded limit=\"7\" by=\"dataize\" at="), ("textXXXXXX.txt", "exceeded 7  # 𝔻(")]
-        $ \(template, record) ->
-          it ("writes the reached --max-cycles to the protocol " ++ template) $
-            withTempFile template $ \(path, stream) -> do
-              hClose stream
-              withStdin "⟦ m(p) ↦ ⟦ φ ↦ ξ.a( ξ.p ).φ, a(ρ, tup) ↦ ⟦ φ ↦ ρ.a( ξ.tup.tail ).φ ⟧ ⟧, x ↦ Φ.m( 𝜎1:λ ) ⟧" $
-                testCLISucceeded ["dataize", "--acyclic=plausible", "--max-loops=2", "--max-cycles=7", "--partial", "--locator=Q.x", recording path, "--quiet", "--sweet", "--hide-rho"] []
-              records <- readProtocol path
-              any (isPrefixOf record . dropWhile (== ' ')) (lines records) `shouldBe` True
-
-      forM_
-        [("XMLXXXXXX.xml", "<oversized limit=\"60\" by=\"morph\" at="), ("textXXXXXX.txt", "oversized 60")]
-        $ \(template, record) ->
-          it ("writes the reached --max-nodes to the protocol " ++ template) $
-            withTempFile template $ \(path, stream) -> do
-              hClose stream
-              withStdin "⟦ m(p) ↦ ⟦ φ ↦ ξ.a( ξ.p ).φ, a(ρ, tup) ↦ ⟦ φ ↦ ρ.a( ξ.tup.tail ).φ ⟧ ⟧, x ↦ Φ.m( 𝜎1:λ ) ⟧" $
-                testCLISucceeded ["dataize", "--acyclic=plausible", "--max-loops=2", "--max-nodes=60", "--partial", "--locator=Q.x", recording path, "--quiet", "--sweet", "--hide-rho"] []
-              records <- readProtocol path
-              any (isPrefixOf record . dropWhile (== ' ')) (lines records) `shouldBe` True
-
-      forM_
-        [("XMLXXXXXX.xml", "<blown limit=\"1K\" by="), ("textXXXXXX.txt", "blown 1K")]
-        $ \(template, record) ->
-          it ("writes the reached --max-memory to the protocol " ++ template) $
-            withTempFile template $ \(path, stream) -> do
-              hClose stream
-              withStdin "⟦ m(p) ↦ ⟦ φ ↦ ξ.a( ξ.p ).φ, a(ρ, tup) ↦ ⟦ φ ↦ ρ.a( ξ.tup.tail ).φ ⟧ ⟧, x ↦ Φ.m( 𝜎1:λ ) ⟧" $
-                testCLISucceeded ["dataize", "--acyclic=plausible", "--max-loops=2", "--max-memory=1K", "--partial", "--locator=Q.x", recording path, "--quiet", "--sweet", "--hide-rho"] []
-              records <- readProtocol path
-              any (isPrefixOf record . dropWhile (== ' ')) (lines records) `shouldBe` True
-
-      forM_
-        [("XMLXXXXXX.xml", "<spent limit=\"5\" by="), ("textXXXXXX.txt", "  spent 5")]
-        ( \(template, record) ->
-            it ("writes a spent firing budget to the protocol as " ++ record) $
-              withTempFile template $ \(path, stream) -> do
-                hClose stream
-                loopingLambdas $ \endless ->
-                  withStdin "⟦ @ ↦ ⟦ λ ⤍ L_loop ⟧ ⟧" $
-                    testCLIFailed ["dataize", "--symbolic=" ++ endless, "--max-steps=400", "--max-firings=5", recording path] ["--max-firings=5"]
-                records <- readProtocol path
-                any (record `isInfixOf`) (lines records) `shouldBe` True
-        )
-
-      it "keeps the lines of a run that fails" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]], nope -> [[ ^ -> ?, L> L_number_nope ]] ]], @ -> 5.plus(6).nope ]]" $
-            testCLIFailed
-              ["dataize", symbolic, "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"]
-              ["No entry of --symbolic answers the λ function 'L_number_nope'"]
-          records <- readProtocol path
-          lines records
-            `shouldBe` [ "𝔻(Φ):"
-                       , "  boxed 𝑛·0·1 := Φ.φ"
-                       , "  𝕄(𝑛·0·1):"
-                       , "    𝑛·0·2 := 5.0"
-                       , "    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, nope ↦ L_number_nope:λ ⟧"
-                       , "    𝑛·0·4 := 𝑛·0·2.plus( x ↦ 6.0 )"
-                       , "    𝑛·0·5 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"
-                       , "    𝔼(L_number_plus):"
-                       , "      𝔻(ξ.ρ):"
-                       , "        𝕄(ξ.ρ):"
-                       , "          𝑛·1·1 := 5.0"
-                       , "          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, nope ↦ L_number_nope:λ ⟧"
-                       , "          morphed 𝑛·1·3 := 𝑛·1·2"
-                       , "        boxed 𝑛·1·4 := 𝑛·1·3.φ"
-                       , "        𝕄(𝑛·1·4):"
-                       , "          𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"
-                       , "          𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ"
-                       , "          morphed 𝑛·1·7 := 𝑛·1·6"
-                       , "        boxed 𝑛·1·8 := 𝑛·1·7.φ"
-                       , "        𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"
-                       , "      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
-                       , "      𝔻(ξ.x):"
-                       , "        𝕄(ξ.x):"
-                       , "          𝑛·1·9 := 6.0"
-                       , "          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, nope ↦ L_number_nope:λ ⟧"
-                       , "          morphed 𝑛·1·11 := 𝑛·1·10"
-                       , "        boxed 𝑛·1·12 := 𝑛·1·11.φ"
-                       , "        𝕄(𝑛·1·12):"
-                       , "          𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"
-                       , "          𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ"
-                       , "          morphed 𝑛·1·15 := 𝑛·1·14"
-                       , "        boxed 𝑛·1·16 := 𝑛·1·15.φ"
-                       , "        𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"
-                       , "      𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
-                       , "      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
-                       , "      𝕄(𝑛·1·17):"
-                       , "        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )"
-                       , "        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ, nope ↦ L_number_nope:λ ⟧"
-                       , "        morphed 𝑛·1·20 := 𝑛·1·19"
-                       , "      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)"
-                       , "    morphed 𝑛·0·6 := L_number_nope:λ"
-                       , "  unanswered L_number_nope  # 𝔻(L_number_nope:λ)"
-                       ]
-
-      it "truncates the lines left over from the previous run" $
-        withTempFileContent "protocolXXXXXX.txt" "𝔼(L_number_gt)\n" $ \path -> do
-          withStdin "[[ D> 01- ]]" $
-            testCLISucceeded ["dataize", "--minutes=" ++ path, "--quiet"] []
-          records <- readProtocol path
-          records `shouldBe` "𝔻(Φ):\n  𝛿·0·1 := 01-\n"
-
-      it "writes the lines in 𝜑 even with --output=xmir" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin sum' $
-            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--output=xmir", "--quiet", "--sweet", "--hide-rho"] []
-          records <- readProtocol path
-          records `shouldEndWith` "    𝕄(𝑛·1·17):\n      𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )\n      𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧\n      morphed 𝑛·1·20 := 𝑛·1·19\n    𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)\n  boxed 𝑛·0·7 := 𝑛·1·21.φ\n  𝛿·0·1 := 𝔻(𝜎1:λ)\n"
-
-      it "numbers every step in the text as the XML of the same run numbers it" $
-        withTempFile "protocolXXXXXX.txt" $ \(text, one) ->
-          withTempFile "protocolXXXXXX.xml" $ \(xml, two) -> do
-            hClose one
-            hClose two
-            withStdin nested $
-              testCLISucceeded ["dataize", symbolic, "--minutes=" ++ text, "--quiet", "--sweet", "--hide-rho"] []
-            withStdin nested $
-              testCLISucceeded ["dataize", symbolic, "--protocol=" ++ xml, "--quiet", "--sweet", "--hide-rho"] []
-            lined <- readProtocol text
-            marked <- readProtocol xml
-            [meta | meta : ":=" : _ <- map (dropWhile (`elem` ["boxed", "morphed", "fabricated"]) . words) (lines lined), "𝑛·" `isPrefixOf` meta]
-              `shouldBe` [takeWhile (/= '"') (drop 6 token) | token <- words marked, "meta=\"𝑛·" `isPrefixOf` token]
-
-      describe "as XML" $ do
-        it "writes the document when the file is named .xml" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withStdin sum' $
-              testCLISucceeded ["dataize", symbolic, "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-            records <- readProtocol path
-            lines records
-              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                         , "<dataize at=\"Φ\">"
-                         , "  <boxed meta=\"𝑛·0·1\">Φ.φ</boxed>"
-                         , "  <morph at=\"𝑛·0·1\">"
-                         , "    <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"
-                         , "    <applied meta=\"𝑛·0·2\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
-                         , "    <formed meta=\"𝑛·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
-                         , "    <applied meta=\"𝑒·0·2\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"
-                         , "    <applied meta=\"𝑒·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"
-                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·3</meta></applied>"
-                         , "    <formed meta=\"𝑛·0·5\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·3</meta></formed>"
-                         , "    <morphed meta=\"𝑛·0·6\">𝑛·0·5</morphed>"
-                         , "  </morph>"
-                         , "  <evaluate λ=\"L_number_plus\" by=\"dataize\" at=\"𝑛·0·1\">"
-                         , "    <dataize at=\"ξ.ρ\">"
-                         , "      <morph at=\"ξ.ρ\">"
-                         , "        <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
-                         , "        <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
-                         , "        <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"
-                         , "      </morph>"
-                         , "      <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"
-                         , "      <morph at=\"𝑛·1·4\">"
-                         , "        <applied meta=\"𝑛·1·5\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"
-                         , "        <formed meta=\"𝑛·1·6\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></formed>"
-                         , "        <morphed meta=\"𝑛·1·7\">𝑛·1·6</morphed>"
-                         , "      </morph>"
-                         , "      <boxed meta=\"𝑛·1·8\">𝑛·1·7.φ</boxed>"
-                         , "      <dataized meta=\"𝛿·1·1\" number=\"5.0\">40-14-00-00-00-00-00-00</dataized>"
-                         , "    </dataize>"
-                         , "    <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
-                         , "    <dataize at=\"ξ.x\">"
-                         , "      <morph at=\"ξ.x\">"
-                         , "        <applied meta=\"𝑛·1·9\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"
-                         , "        <formed meta=\"𝑛·1·10\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></formed>"
-                         , "        <morphed meta=\"𝑛·1·11\">𝑛·1·10</morphed>"
-                         , "      </morph>"
-                         , "      <boxed meta=\"𝑛·1·12\">𝑛·1·11.φ</boxed>"
-                         , "      <morph at=\"𝑛·1·12\">"
-                         , "        <applied meta=\"𝑛·1·13\" by=\"morph\" at=\"𝑛·1·12\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"
-                         , "        <formed meta=\"𝑛·1·14\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></formed>"
-                         , "        <morphed meta=\"𝑛·1·15\">𝑛·1·14</morphed>"
-                         , "      </morph>"
-                         , "      <boxed meta=\"𝑛·1·16\">𝑛·1·15.φ</boxed>"
-                         , "      <dataized meta=\"𝛿·1·2\" number=\"6.0\">40-18-00-00-00-00-00-00</dataized>"
-                         , "    </dataize>"
-                         , "    <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"
-                         , "    <minted symbol=\"𝜎1\">40-14-00-00-00-00-00-00 40-18-00-00-00-00-00-00</minted>"
-                         , "    <applied meta=\"𝑒·1·1\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
-                         , "    <built meta=\"𝑛·1·17\">𝑒·1·1</built>"
-                         , "    <morph at=\"𝑛·1·17\">"
-                         , "      <applied meta=\"𝑛·1·18\" by=\"morph\" at=\"𝑛·1·17\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
-                         , "      <formed meta=\"𝑛·1·19\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"
-                         , "      <morphed meta=\"𝑛·1·20\">𝑛·1·19</morphed>"
-                         , "    </morph>"
-                         , "    <answered meta=\"𝑛·1·21\">𝑛·1·20</answered>"
-                         , "  </evaluate>"
-                         , "  <boxed meta=\"𝑛·0·7\">𝑛·1·21.φ</boxed>"
-                         , "  <manufactured meta=\"𝛿·0·1\">𝜎1</manufactured>"
-                         , "</dataize>"
-                         ]
-
-        it "nests the judgment right inside the '<protocol>' root" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withStdin "[[ D> 01- ]]" $
-              testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []
-            records <- readUtf8 path
-            take 2 (dropWhile (not . isPrefixOf "  <dataize ") (lines records))
-              `shouldBe` [ "  <dataize at=\"Φ\">"
-                         , "    <dataized meta=\"𝛿·0·1\">01-</dataized>"
-                         ]
-
-        it "opens the '<protocol>' root right under the declaration" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withStdin "[[ D> 01- ]]" $
-              testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []
-            records <- readUtf8 path
-            take 2 (lines records) `shouldBe` ["<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "<protocol>"]
-
-        it "closes the '<protocol>' root with its msec" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withStdin "[[ D> 01- ]]" $
-              testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []
-            records <- readUtf8 path
-            (reverse (lines records) !! 3) `shouldSatisfy` isPrefixOf "  <msec>"
-
-        it "closes the '<protocol>' root with its firings" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withStdin "[[ D> 01- ]]" $
-              testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []
-            records <- readUtf8 path
-            lines records `shouldContain` ["  <firings>0</firings>"]
-
-        it "closes the '<protocol>' root with its fps, then '</protocol>' itself" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withStdin "[[ D> 01- ]]" $
-              testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []
-            records <- readUtf8 path
-            reverse (take 2 (reverse (lines records))) `shouldBe` ["  <fps>0</fps>", "</protocol>"]
-
-        it "nests what a φ body dataizes inside the element of the box rule that entered it" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withStdin sum' $
-              testCLISucceeded ["dataize", symbolic, "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-            records <- readProtocol path
-            filter (\line -> not (any (`isInfixOf` line) ["<applied ", "<formed ", "<morph ", "<morphed ", "</morph>"])) (lines records)
-              `shouldContain` [ "    <dataize at=\"ξ.ρ\">"
-                              , "      <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"
-                              , "      <boxed meta=\"𝑛·1·8\">𝑛·1·7.φ</boxed>"
-                              , "      <dataized meta=\"𝛿·1·1\" number=\"5.0\">40-14-00-00-00-00-00-00</dataized>"
-                              , "    </dataize>"
-                              ]
-
-        it "closes the document even when nothing fires" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withStdin "[[ D> 01- ]]" $
-              testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []
-            records <- readProtocol path
-            lines records
-              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                         , "<dataize at=\"Φ\">"
-                         , "  <dataized meta=\"𝛿·0·1\">01-</dataized>"
-                         , "</dataize>"
-                         ]
-
-        it "tells a manufactured datum from data by the name of the element" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withStdin chained $
-              testCLISucceeded ["dataize", symbolic, "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-            records <- readProtocol path
-            lines records
-              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                         , "<dataize at=\"Φ\">"
-                         , "  <boxed meta=\"𝑛·0·1\">Φ.φ</boxed>"
-                         , "  <morph at=\"𝑛·0·1\">"
-                         , "    <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"
-                         , "    <applied meta=\"𝑛·0·2\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
-                         , "    <formed meta=\"𝑛·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
-                         , "    <applied meta=\"𝑒·0·2\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"
-                         , "    <applied meta=\"𝑒·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"
-                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·3</meta></applied>"
-                         , "    <formed meta=\"𝑛·0·5\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·3</meta></formed>"
-                         , "    <evaluate λ=\"L_number_plus\" by=\"morph\" at=\"𝑛·0·1\">"
-                         , "      <dataize at=\"ξ.ρ\">"
-                         , "        <morph at=\"ξ.ρ\">"
-                         , "          <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
-                         , "          <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
-                         , "          <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"
-                         , "        </morph>"
-                         , "        <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"
-                         , "        <morph at=\"𝑛·1·4\">"
-                         , "          <applied meta=\"𝑛·1·5\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"
-                         , "          <formed meta=\"𝑛·1·6\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></formed>"
-                         , "          <morphed meta=\"𝑛·1·7\">𝑛·1·6</morphed>"
-                         , "        </morph>"
-                         , "        <boxed meta=\"𝑛·1·8\">𝑛·1·7.φ</boxed>"
-                         , "        <dataized meta=\"𝛿·1·1\" number=\"5.0\">40-14-00-00-00-00-00-00</dataized>"
-                         , "      </dataize>"
-                         , "      <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
-                         , "      <dataize at=\"ξ.x\">"
-                         , "        <morph at=\"ξ.x\">"
-                         , "          <applied meta=\"𝑛·1·9\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"
-                         , "          <formed meta=\"𝑛·1·10\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></formed>"
-                         , "          <morphed meta=\"𝑛·1·11\">𝑛·1·10</morphed>"
-                         , "        </morph>"
-                         , "        <boxed meta=\"𝑛·1·12\">𝑛·1·11.φ</boxed>"
-                         , "        <morph at=\"𝑛·1·12\">"
-                         , "          <applied meta=\"𝑛·1·13\" by=\"morph\" at=\"𝑛·1·12\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"
-                         , "          <formed meta=\"𝑛·1·14\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></formed>"
-                         , "          <morphed meta=\"𝑛·1·15\">𝑛·1·14</morphed>"
-                         , "        </morph>"
-                         , "        <boxed meta=\"𝑛·1·16\">𝑛·1·15.φ</boxed>"
-                         , "        <dataized meta=\"𝛿·1·2\" number=\"6.0\">40-18-00-00-00-00-00-00</dataized>"
-                         , "      </dataize>"
-                         , "      <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"
-                         , "      <minted symbol=\"𝜎1\">40-14-00-00-00-00-00-00 40-18-00-00-00-00-00-00</minted>"
-                         , "      <applied meta=\"𝑒·1·1\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
-                         , "      <built meta=\"𝑛·1·17\">𝑒·1·1</built>"
-                         , "      <morph at=\"𝑛·1·17\">"
-                         , "        <applied meta=\"𝑛·1·18\" by=\"morph\" at=\"𝑛·1·17\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
-                         , "        <formed meta=\"𝑛·1·19\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"
-                         , "        <morphed meta=\"𝑛·1·20\">𝑛·1·19</morphed>"
-                         , "      </morph>"
-                         , "      <answered meta=\"𝑛·1·21\">𝑛·1·20</answered>"
-                         , "    </evaluate>"
-                         , "    <applied meta=\"𝑒·0·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></applied>"
-                         , "    <applied meta=\"𝑒·0·5\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·4</meta></applied>"
-                         , "    <applied meta=\"𝑛·0·6\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·1·18.plus\"><meta attr=\"x\">𝑒·0·5</meta></applied>"
-                         , "    <formed meta=\"𝑛·0·7\" of=\"𝑛·1·18.plus\"><meta attr=\"x\">𝑒·0·5</meta></formed>"
-                         , "    <morphed meta=\"𝑛·0·8\">𝑛·0·7</morphed>"
-                         , "  </morph>"
-                         , "  <evaluate λ=\"L_number_plus\" by=\"dataize\" at=\"𝑛·0·1\">"
-                         , "    <dataize at=\"ξ.ρ\">"
-                         , "      <morph at=\"ξ.ρ\">"
-                         , "        <applied meta=\"𝑛·2·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
-                         , "        <formed meta=\"𝑛·2·2\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"
-                         , "        <morphed meta=\"𝑛·2·3\">𝑛·2·2</morphed>"
-                         , "      </morph>"
-                         , "      <boxed meta=\"𝑛·2·4\">𝑛·2·3.φ</boxed>"
-                         , "      <manufactured meta=\"𝛿·2·1\">𝜎1</manufactured>"
-                         , "    </dataize>"
-                         , "    <bound meta=\"𝛿1·2\">𝛿·2·1</bound>"
-                         , "    <dataize at=\"ξ.x\">"
-                         , "      <morph at=\"ξ.x\">"
-                         , "        <applied meta=\"𝑛·2·5\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·4</meta></applied>"
-                         , "        <formed meta=\"𝑛·2·6\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·4</meta></formed>"
-                         , "        <morphed meta=\"𝑛·2·7\">𝑛·2·6</morphed>"
-                         , "      </morph>"
-                         , "      <boxed meta=\"𝑛·2·8\">𝑛·2·7.φ</boxed>"
-                         , "      <morph at=\"𝑛·2·8\">"
-                         , "        <applied meta=\"𝑛·2·9\" by=\"morph\" at=\"𝑛·2·8\" of=\"Φ.bytes\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></applied>"
-                         , "        <formed meta=\"𝑛·2·10\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></formed>"
-                         , "        <morphed meta=\"𝑛·2·11\">𝑛·2·10</morphed>"
-                         , "      </morph>"
-                         , "      <boxed meta=\"𝑛·2·12\">𝑛·2·11.φ</boxed>"
-                         , "      <dataized meta=\"𝛿·2·2\" number=\"7.0\">40-1C-00-00-00-00-00-00</dataized>"
-                         , "    </dataize>"
-                         , "    <bound meta=\"𝛿2·2\">𝛿·2·2</bound>"
-                         , "    <minted symbol=\"𝜎2\">𝜎1 40-1C-00-00-00-00-00-00</minted>"
-                         , "    <applied meta=\"𝑒·2·1\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></applied>"
-                         , "    <built meta=\"𝑛·2·13\">𝑒·2·1</built>"
-                         , "    <morph at=\"𝑛·2·13\">"
-                         , "      <applied meta=\"𝑛·2·14\" by=\"morph\" at=\"𝑛·2·13\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></applied>"
-                         , "      <formed meta=\"𝑛·2·15\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></formed>"
-                         , "      <morphed meta=\"𝑛·2·16\">𝑛·2·15</morphed>"
-                         , "    </morph>"
-                         , "    <answered meta=\"𝑛·2·17\">𝑛·2·16</answered>"
-                         , "  </evaluate>"
-                         , "  <boxed meta=\"𝑛·0·9\">𝑛·2·17.φ</boxed>"
-                         , "  <manufactured meta=\"𝛿·0·1\">𝜎2</manufactured>"
-                         , "</dataize>"
-                         ]
-
-        it "writes a firing whose two sides do not join as diverged, naming both sides" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withLambdasOf (T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  join:\n    on: 𝛿1\n    left: $.a\n    right: $.b\n") $ \joins ->
-              withStdin "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ φ ↦ ⟦ Δ ⤍ 01- ⟧ ⟧, b ↦ ⟦ φ ↦ ⟦ Δ ⤍ 02- ⟧ ⟧, λ ⤍ L_fork ⟧.φ ⟧" $
-                testCLIFailed ["morph", "--symbolic=" ++ joins, "--locator=Q.y", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] ["No entry of --symbolic answers the λ function 'L_fork'"]
-            records <- readProtocol path
-            lines records
-              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                         , "<morph at=\"Φ.y\">"
-                         , "  <evaluate λ=\"L_fork\" by=\"morph\" at=\"Φ.y\">"
-                         , "    <dataize at=\"ξ.c\">"
-                         , "      <manufactured meta=\"𝛿·1·1\">𝜎1</manufactured>"
-                         , "    </dataize>"
-                         , "    <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
-                         , "    <morph at=\"ξ.a\">"
-                         , "      <formed meta=\"𝑒·1·1\"><datum attr=\"φ\">01-</datum></formed>"
-                         , "      <morphed meta=\"𝑛·1·1\">𝑒·1·1</morphed>"
-                         , "    </morph>"
-                         , "    <morph at=\"ξ.b\">"
-                         , "      <formed meta=\"𝑒·1·2\"><datum attr=\"φ\">02-</datum></formed>"
-                         , "      <morphed meta=\"𝑛·1·2\">𝑒·1·2</morphed>"
-                         , "    </morph>"
-                         , "    <diverged left=\"𝑛·1·1\" right=\"𝑛·1·2\" at=\".φ.Δ\" reason=\"the join names no otherwise\"><left Δ=\"01-\"/><right Δ=\"02-\"/></diverged>"
-                         , "  </evaluate>"
-                         , "</morph>"
-                         ]
-
-        it "writes the symbol a join minted for two sides that differ only in their symbols as an element of its own" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withLambdasOf (T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  join:\n    on: 𝛿1\n    left: $.a\n    right: $.b\n") $ \joins ->
-              withStdin "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ φ ↦ ⟦ λ ⤍ 𝜎2 ⟧ ⟧, b ↦ ⟦ φ ↦ ⟦ λ ⤍ 𝜎3 ⟧ ⟧, λ ⤍ L_fork ⟧.φ ⟧" $
-                testCLISucceeded ["morph", "--symbolic=" ++ joins, "--locator=Q.y", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-            records <- readProtocol path
-            lines records
-              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                         , "<morph at=\"Φ.y\">"
-                         , "  <evaluate λ=\"L_fork\" by=\"morph\" at=\"Φ.y\">"
-                         , "    <dataize at=\"ξ.c\">"
-                         , "      <manufactured meta=\"𝛿·1·1\">𝜎1</manufactured>"
-                         , "    </dataize>"
-                         , "    <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
-                         , "    <morph at=\"ξ.a\">"
-                         , "      <formed meta=\"𝑒·1·1\"><symbol attr=\"φ\">𝜎2</symbol></formed>"
-                         , "      <morphed meta=\"𝑛·1·1\">𝑒·1·1</morphed>"
-                         , "    </morph>"
-                         , "    <morph at=\"ξ.b\">"
-                         , "      <formed meta=\"𝑒·1·2\"><symbol attr=\"φ\">𝜎3</symbol></formed>"
-                         , "      <morphed meta=\"𝑛·1·2\">𝑒·1·2</morphed>"
-                         , "    </morph>"
-                         , "    <joined symbol=\"𝜎4\" on=\"𝛿1·1\" left=\"𝜎2\" right=\"𝜎3\"/>"
-                         , "    <formed meta=\"𝑒·1·3\"><symbol attr=\"φ\">𝜎4</symbol></formed>"
-                         , "    <answered meta=\"𝑛·1·3\">𝑒·1·3</answered>"
-                         , "  </evaluate>"
-                         , "  <morphed meta=\"𝑛·0·1\">𝜎4</morphed>"
-                         , "</morph>"
-                         ]
-
-        it "writes one 'minted' element per symbol the answer asked for" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withLambdasOf (T.pack "- λ: L_pair\n  morph:\n    𝑛1: $.x\n  𝑛: ⟦ left ↦ ⟦ λ ⤍ 𝜎 ⟧, right ↦ ⟦ λ ⤍ 𝜎 ⟧ ⟧\n") $ \pairs ->
-              withStdin "⟦ y ↦ ⟦ x ↦ ⟦ Δ ⤍ 01- ⟧, λ ⤍ L_pair ⟧.left ⟧" $
-                testCLISucceeded ["morph", "--symbolic=" ++ pairs, "--locator=Q.y", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-            records <- readProtocol path
-            lines records
-              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                         , "<morph at=\"Φ.y\">"
-                         , "  <evaluate λ=\"L_pair\" by=\"morph\" at=\"Φ.y\">"
-                         , "    <morph at=\"ξ.x\">"
-                         , "      <morphed meta=\"𝑛·1·1\">01-</morphed>"
-                         , "    </morph>"
-                         , "    <bound meta=\"𝑛1·1\">01-</bound>"
-                         , "    <minted symbol=\"𝜎1\"/>"
-                         , "    <minted symbol=\"𝜎2\"/>"
-                         , "    <formed meta=\"𝑒·1·1\"><symbol attr=\"left\">𝜎1</symbol><symbol attr=\"right\">𝜎2</symbol></formed>"
-                         , "    <built meta=\"𝑛·1·2\">𝑒·1·1</built>"
-                         , "    <morph at=\"𝑛·1·2\">"
-                         , "      <morphed meta=\"𝑛·1·3\">𝑒·1·1</morphed>"
-                         , "    </morph>"
-                         , "    <answered meta=\"𝑛·1·4\">𝑛·1·3</answered>"
-                         , "  </evaluate>"
-                         , "  <morphed meta=\"𝑛·0·1\">𝜎1</morphed>"
-                         , "</morph>"
-                         ]
-
-        it "writes no 'minted' element for a firing minting nothing" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withLambdasOf (T.pack "- λ: L_keep\n  morph:\n    𝑛1: $.x\n  𝑛: ⟦ z ↦ 𝑛1 ⟧\n") $ \keeps ->
-              withStdin "⟦ y ↦ ⟦ x ↦ ⟦ Δ ⤍ 01- ⟧, λ ⤍ L_keep ⟧.z ⟧" $
-                testCLISucceeded ["morph", "--symbolic=" ++ keeps, "--locator=Q.y", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-            records <- readProtocol path
-            lines records
-              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                         , "<morph at=\"Φ.y\">"
-                         , "  <evaluate λ=\"L_keep\" by=\"morph\" at=\"Φ.y\">"
-                         , "    <morph at=\"ξ.x\">"
-                         , "      <morphed meta=\"𝑛·1·1\">01-</morphed>"
-                         , "    </morph>"
-                         , "    <bound meta=\"𝑛1·1\">01-</bound>"
-                         , "    <formed meta=\"𝑒·1·1\"><datum attr=\"z\">01-</datum></formed>"
-                         , "    <built meta=\"𝑛·1·2\">𝑒·1·1</built>"
-                         , "    <morph at=\"𝑛·1·2\">"
-                         , "      <morphed meta=\"𝑛·1·3\">𝑒·1·1</morphed>"
-                         , "    </morph>"
-                         , "    <answered meta=\"𝑛·1·4\">𝑛·1·3</answered>"
-                         , "  </evaluate>"
-                         , "  <morphed meta=\"𝑛·0·1\">01-</morphed>"
-                         , "</morph>"
-                         ]
-
-        it "nests a firing an operand took inside the firing that asked" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withStdin nested $
-              testCLISucceeded ["dataize", symbolic, "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-            records <- readProtocol path
-            lines records
-              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                         , "<dataize at=\"Φ\">"
-                         , "  <boxed meta=\"𝑛·0·1\">Φ.φ</boxed>"
-                         , "  <morph at=\"𝑛·0·1\">"
-                         , "    <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"
-                         , "    <applied meta=\"𝑛·0·2\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
-                         , "    <formed meta=\"𝑛·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
-                         , "    <applied meta=\"𝑒·0·2\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"
-                         , "    <applied meta=\"𝑒·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"
-                         , "    <applied meta=\"𝑒·0·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></applied>"
-                         , "    <applied meta=\"𝑒·0·5\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·4</meta></applied>"
-                         , "    <applied meta=\"𝑒·0·6\" of=\"𝑒·0·3.plus\"><meta attr=\"α0\">𝑒·0·5</meta></applied>"
-                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·6</meta></applied>"
-                         , "    <formed meta=\"𝑛·0·5\" of=\"𝑛·0·2.plus\"><meta attr=\"x\">𝑒·0·6</meta></formed>"
-                         , "    <morphed meta=\"𝑛·0·6\">𝑛·0·5</morphed>"
-                         , "  </morph>"
-                         , "  <evaluate λ=\"L_number_plus\" by=\"dataize\" at=\"𝑛·0·1\">"
-                         , "    <dataize at=\"ξ.ρ\">"
-                         , "      <morph at=\"ξ.ρ\">"
-                         , "        <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
-                         , "        <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
-                         , "        <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"
-                         , "      </morph>"
-                         , "      <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"
-                         , "      <morph at=\"𝑛·1·4\">"
-                         , "        <applied meta=\"𝑛·1·5\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"
-                         , "        <formed meta=\"𝑛·1·6\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></formed>"
-                         , "        <morphed meta=\"𝑛·1·7\">𝑛·1·6</morphed>"
-                         , "      </morph>"
-                         , "      <boxed meta=\"𝑛·1·8\">𝑛·1·7.φ</boxed>"
-                         , "      <dataized meta=\"𝛿·1·1\" number=\"5.0\">40-14-00-00-00-00-00-00</dataized>"
-                         , "    </dataize>"
-                         , "    <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
-                         , "    <dataize at=\"ξ.x\">"
-                         , "      <morph at=\"ξ.x\">"
-                         , "        <applied meta=\"𝑛·1·9\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"
-                         , "        <formed meta=\"𝑛·1·10\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></formed>"
-                         , "        <applied meta=\"𝑛·1·11\" by=\"morph\" at=\"ξ.x\" of=\"𝑛·1·9.plus\"><meta attr=\"x\">𝑒·0·5</meta></applied>"
-                         , "        <formed meta=\"𝑛·1·12\" of=\"𝑛·1·9.plus\"><meta attr=\"x\">𝑒·0·5</meta></formed>"
-                         , "        <morphed meta=\"𝑛·1·13\">𝑛·1·12</morphed>"
-                         , "      </morph>"
-                         , "      <evaluate λ=\"L_number_plus\" by=\"dataize\" at=\"ξ.x\">"
-                         , "        <dataize at=\"ξ.ρ\">"
-                         , "          <morph at=\"ξ.ρ\">"
-                         , "            <applied meta=\"𝑛·2·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"
-                         , "            <formed meta=\"𝑛·2·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></formed>"
-                         , "            <morphed meta=\"𝑛·2·3\">𝑛·2·2</morphed>"
-                         , "          </morph>"
-                         , "          <boxed meta=\"𝑛·2·4\">𝑛·2·3.φ</boxed>"
-                         , "          <morph at=\"𝑛·2·4\">"
-                         , "            <applied meta=\"𝑛·2·5\" by=\"morph\" at=\"𝑛·2·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"
-                         , "            <formed meta=\"𝑛·2·6\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></formed>"
-                         , "            <morphed meta=\"𝑛·2·7\">𝑛·2·6</morphed>"
-                         , "          </morph>"
-                         , "          <boxed meta=\"𝑛·2·8\">𝑛·2·7.φ</boxed>"
-                         , "          <dataized meta=\"𝛿·2·1\" number=\"6.0\">40-18-00-00-00-00-00-00</dataized>"
-                         , "        </dataize>"
-                         , "        <bound meta=\"𝛿1·2\">𝛿·2·1</bound>"
-                         , "        <dataize at=\"ξ.x\">"
-                         , "          <morph at=\"ξ.x\">"
-                         , "            <applied meta=\"𝑛·2·9\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·4</meta></applied>"
-                         , "            <formed meta=\"𝑛·2·10\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·4</meta></formed>"
-                         , "            <morphed meta=\"𝑛·2·11\">𝑛·2·10</morphed>"
-                         , "          </morph>"
-                         , "          <boxed meta=\"𝑛·2·12\">𝑛·2·11.φ</boxed>"
-                         , "          <morph at=\"𝑛·2·12\">"
-                         , "            <applied meta=\"𝑛·2·13\" by=\"morph\" at=\"𝑛·2·12\" of=\"Φ.bytes\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></applied>"
-                         , "            <formed meta=\"𝑛·2·14\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></formed>"
-                         , "            <morphed meta=\"𝑛·2·15\">𝑛·2·14</morphed>"
-                         , "          </morph>"
-                         , "          <boxed meta=\"𝑛·2·16\">𝑛·2·15.φ</boxed>"
-                         , "          <dataized meta=\"𝛿·2·2\" number=\"7.0\">40-1C-00-00-00-00-00-00</dataized>"
-                         , "        </dataize>"
-                         , "        <bound meta=\"𝛿2·2\">𝛿·2·2</bound>"
-                         , "        <minted symbol=\"𝜎1\">40-18-00-00-00-00-00-00 40-1C-00-00-00-00-00-00</minted>"
-                         , "        <applied meta=\"𝑒·2·1\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
-                         , "        <built meta=\"𝑛·2·17\">𝑒·2·1</built>"
-                         , "        <morph at=\"𝑛·2·17\">"
-                         , "          <applied meta=\"𝑛·2·18\" by=\"morph\" at=\"𝑛·2·17\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
-                         , "          <formed meta=\"𝑛·2·19\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"
-                         , "          <morphed meta=\"𝑛·2·20\">𝑛·2·19</morphed>"
-                         , "        </morph>"
-                         , "        <answered meta=\"𝑛·2·21\">𝑛·2·20</answered>"
-                         , "      </evaluate>"
-                         , "      <boxed meta=\"𝑛·1·14\">𝑛·2·21.φ</boxed>"
-                         , "      <manufactured meta=\"𝛿·1·2\">𝜎1</manufactured>"
-                         , "    </dataize>"
-                         , "    <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"
-                         , "    <minted symbol=\"𝜎2\">40-14-00-00-00-00-00-00 𝜎1</minted>"
-                         , "    <applied meta=\"𝑒·1·1\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></applied>"
-                         , "    <built meta=\"𝑛·1·15\">𝑒·1·1</built>"
-                         , "    <morph at=\"𝑛·1·15\">"
-                         , "      <applied meta=\"𝑛·1·16\" by=\"morph\" at=\"𝑛·1·15\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></applied>"
-                         , "      <formed meta=\"𝑛·1·17\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></formed>"
-                         , "      <morphed meta=\"𝑛·1·18\">𝑛·1·17</morphed>"
-                         , "    </morph>"
-                         , "    <answered meta=\"𝑛·1·19\">𝑛·1·18</answered>"
-                         , "  </evaluate>"
-                         , "  <boxed meta=\"𝑛·0·7\">𝑛·1·19.φ</boxed>"
-                         , "  <manufactured meta=\"𝛿·0·1\">𝜎2</manufactured>"
-                         , "</dataize>"
-                         ]
-
-        it "records a λ function no entry answers as a childless element" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withStdin "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ times(^, x) -> [[ L> L_number_times ]], nope -> [[ ^ -> ?, L> L_number_nope ]] ]], @ -> 2.times(3).nope ]]" $
-              testCLISucceeded ["dataize", symbolic, "--partial", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-            records <- readProtocol path
-            lines records
-              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                         , "<dataize at=\"Φ\">"
-                         , "  <boxed meta=\"𝑛·0·1\">Φ.φ</boxed>"
-                         , "  <morph at=\"𝑛·0·1\">"
-                         , "    <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></applied>"
-                         , "    <applied meta=\"𝑛·0·2\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
-                         , "    <formed meta=\"𝑛·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
-                         , "    <applied meta=\"𝑒·0·2\" of=\"Φ.bytes\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></applied>"
-                         , "    <applied meta=\"𝑒·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"
-                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.times\"><meta attr=\"x\">𝑒·0·3</meta></applied>"
-                         , "    <formed meta=\"𝑛·0·5\" of=\"𝑛·0·2.times\"><meta attr=\"x\">𝑒·0·3</meta></formed>"
-                         , "    <evaluate λ=\"L_number_times\" by=\"morph\" at=\"𝑛·0·1\">"
-                         , "      <dataize at=\"ξ.ρ\">"
-                         , "        <morph at=\"ξ.ρ\">"
-                         , "          <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
-                         , "          <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
-                         , "          <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"
-                         , "        </morph>"
-                         , "        <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"
-                         , "        <morph at=\"𝑛·1·4\">"
-                         , "          <applied meta=\"𝑛·1·5\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></applied>"
-                         , "          <formed meta=\"𝑛·1·6\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></formed>"
-                         , "          <morphed meta=\"𝑛·1·7\">𝑛·1·6</morphed>"
-                         , "        </morph>"
-                         , "        <boxed meta=\"𝑛·1·8\">𝑛·1·7.φ</boxed>"
-                         , "        <dataized meta=\"𝛿·1·1\" number=\"2.0\">40-00-00-00-00-00-00-00</dataized>"
-                         , "      </dataize>"
-                         , "      <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
-                         , "      <dataize at=\"ξ.x\">"
-                         , "        <morph at=\"ξ.x\">"
-                         , "          <applied meta=\"𝑛·1·9\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"
-                         , "          <formed meta=\"𝑛·1·10\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></formed>"
-                         , "          <morphed meta=\"𝑛·1·11\">𝑛·1·10</morphed>"
-                         , "        </morph>"
-                         , "        <boxed meta=\"𝑛·1·12\">𝑛·1·11.φ</boxed>"
-                         , "        <morph at=\"𝑛·1·12\">"
-                         , "          <applied meta=\"𝑛·1·13\" by=\"morph\" at=\"𝑛·1·12\" of=\"Φ.bytes\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></applied>"
-                         , "          <formed meta=\"𝑛·1·14\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></formed>"
-                         , "          <morphed meta=\"𝑛·1·15\">𝑛·1·14</morphed>"
-                         , "        </morph>"
-                         , "        <boxed meta=\"𝑛·1·16\">𝑛·1·15.φ</boxed>"
-                         , "        <dataized meta=\"𝛿·1·2\" number=\"3.0\">40-08-00-00-00-00-00-00</dataized>"
-                         , "      </dataize>"
-                         , "      <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"
-                         , "      <minted symbol=\"𝜎1\">40-00-00-00-00-00-00-00 40-08-00-00-00-00-00-00</minted>"
-                         , "      <applied meta=\"𝑒·1·1\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
-                         , "      <built meta=\"𝑛·1·17\">𝑒·1·1</built>"
-                         , "      <morph at=\"𝑛·1·17\">"
-                         , "        <applied meta=\"𝑛·1·18\" by=\"morph\" at=\"𝑛·1·17\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
-                         , "        <formed meta=\"𝑛·1·19\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"
-                         , "        <morphed meta=\"𝑛·1·20\">𝑛·1·19</morphed>"
-                         , "      </morph>"
-                         , "      <answered meta=\"𝑛·1·21\">𝑛·1·20</answered>"
-                         , "    </evaluate>"
-                         , "    <morphed meta=\"𝑛·0·6\">𝑛·1·18.nope</morphed>"
-                         , "  </morph>"
-                         , "  <unanswered λ=\"L_number_nope\" by=\"dataize\">𝑛·1·18.nope</unanswered>"
-                         , "</dataize>"
-                         ]
-
-        it "names the root after the judgment a morphing ran" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withStdin "[[ x -> [[ L> L_number_nope ]].foo ]]" $
-              testCLISucceeded ["morph", "--locator=Q.x", "--partial", "--protocol=" ++ path, "--quiet"] []
-            records <- readProtocol path
-            lines records
-              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                         , "<morph at=\"Φ.x\">"
-                         , "  <formed meta=\"𝑒·0·1\" λ=\"L_number_nope\"/>"
-                         , "  <unanswered λ=\"L_number_nope\" by=\"morph\">𝑒·0·1</unanswered>"
-                         , "</morph>"
-                         ]
-
-        it "closes the document even when the run fails" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withStdin "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ times(^, x) -> [[ L> L_number_times ]], nope -> [[ ^ -> ?, L> L_number_nope ]] ]], @ -> 2.times(3).nope ]]" $
-              testCLIFailed ["dataize", symbolic, "--protocol=" ++ path] ["No entry of --symbolic answers"]
-            records <- readProtocol path
-            lines records
-              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                         , "<dataize at=\"Φ\">"
-                         , "  <boxed meta=\"𝑛·0·1\">Φ.φ</boxed>"
-                         , "  <morph at=\"𝑛·0·1\">"
-                         , "    <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></applied>"
-                         , "    <applied meta=\"𝑛·0·2\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
-                         , "    <formed meta=\"𝑛·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
-                         , "    <applied meta=\"𝑒·0·2\" of=\"Φ.bytes\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></applied>"
-                         , "    <applied meta=\"𝑒·0·3\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"
-                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·2.times\"><meta attr=\"x\">𝑒·0·3</meta></applied>"
-                         , "    <formed meta=\"𝑛·0·5\" of=\"𝑛·0·2.times\"><meta attr=\"x\">𝑒·0·3</meta></formed>"
-                         , "    <evaluate λ=\"L_number_times\" by=\"morph\" at=\"𝑛·0·1\">"
-                         , "      <dataize at=\"ξ.ρ\">"
-                         , "        <morph at=\"ξ.ρ\">"
-                         , "          <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
-                         , "          <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
-                         , "          <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"
-                         , "        </morph>"
-                         , "        <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"
-                         , "        <morph at=\"𝑛·1·4\">"
-                         , "          <applied meta=\"𝑛·1·5\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></applied>"
-                         , "          <formed meta=\"𝑛·1·6\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></formed>"
-                         , "          <morphed meta=\"𝑛·1·7\">𝑛·1·6</morphed>"
-                         , "        </morph>"
-                         , "        <boxed meta=\"𝑛·1·8\">𝑛·1·7.φ</boxed>"
-                         , "        <dataized meta=\"𝛿·1·1\" number=\"2.0\">40-00-00-00-00-00-00-00</dataized>"
-                         , "      </dataize>"
-                         , "      <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
-                         , "      <dataize at=\"ξ.x\">"
-                         , "        <morph at=\"ξ.x\">"
-                         , "          <applied meta=\"𝑛·1·9\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></applied>"
-                         , "          <formed meta=\"𝑛·1·10\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·2</meta></formed>"
-                         , "          <morphed meta=\"𝑛·1·11\">𝑛·1·10</morphed>"
-                         , "        </morph>"
-                         , "        <boxed meta=\"𝑛·1·12\">𝑛·1·11.φ</boxed>"
-                         , "        <morph at=\"𝑛·1·12\">"
-                         , "          <applied meta=\"𝑛·1·13\" by=\"morph\" at=\"𝑛·1·12\" of=\"Φ.bytes\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></applied>"
-                         , "          <formed meta=\"𝑛·1·14\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></formed>"
-                         , "          <morphed meta=\"𝑛·1·15\">𝑛·1·14</morphed>"
-                         , "        </morph>"
-                         , "        <boxed meta=\"𝑛·1·16\">𝑛·1·15.φ</boxed>"
-                         , "        <dataized meta=\"𝛿·1·2\" number=\"3.0\">40-08-00-00-00-00-00-00</dataized>"
-                         , "      </dataize>"
-                         , "      <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"
-                         , "      <minted symbol=\"𝜎1\">40-00-00-00-00-00-00-00 40-08-00-00-00-00-00-00</minted>"
-                         , "      <applied meta=\"𝑒·1·1\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
-                         , "      <built meta=\"𝑛·1·17\">𝑒·1·1</built>"
-                         , "      <morph at=\"𝑛·1·17\">"
-                         , "        <applied meta=\"𝑛·1·18\" by=\"morph\" at=\"𝑛·1·17\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
-                         , "        <formed meta=\"𝑛·1·19\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"
-                         , "        <morphed meta=\"𝑛·1·20\">𝑛·1·19</morphed>"
-                         , "      </morph>"
-                         , "      <answered meta=\"𝑛·1·21\">𝑛·1·20</answered>"
-                         , "    </evaluate>"
-                         , "    <morphed meta=\"𝑛·0·6\">𝑛·1·18.nope</morphed>"
-                         , "  </morph>"
-                         , "  <unanswered λ=\"L_number_nope\" by=\"dataize\">𝑛·1·18.nope</unanswered>"
-                         , "</dataize>"
-                         ]
-
-        it "writes the terminator as the term a meta was bound to" $
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            withLambdasOf (T.pack "- λ: L_pick\n  morph:\n    𝑛1: ξ.absent\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n") $ \picks ->
-              withStdin "[[ x -> [[ here -> [[ ]], L> L_pick ]].foo ]]" $
-                testCLIFailed ["morph", "--symbolic=" ++ picks, "--locator=Q.x", "--protocol=" ++ path, "--quiet", "--hide-rho"] ["No entry of --symbolic answers the λ function '𝜎1'"]
-            records <- readProtocol path
-            lines records
-              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                         , "<morph at=\"Φ.x\">"
-                         , "  <evaluate λ=\"L_pick\" by=\"morph\" at=\"Φ.x\">"
-                         , "    <morph at=\"ξ.absent\">"
-                         , "      <morphed meta=\"𝑛·1·1\">⊥</morphed>"
-                         , "    </morph>"
-                         , "    <bound meta=\"𝑛1·1\">⊥</bound>"
-                         , "    <minted symbol=\"𝜎1\"/>"
-                         , "    <built meta=\"𝑛·1·2\">𝜎1</built>"
-                         , "    <morph at=\"𝑛·1·2\">"
-                         , "      <morphed meta=\"𝑛·1·3\">𝜎1</morphed>"
-                         , "    </morph>"
-                         , "    <answered meta=\"𝑛·1·4\">𝜎1</answered>"
-                         , "  </evaluate>"
-                         , "  <unanswered λ=\"𝜎1\" by=\"morph\">𝜎1</unanswered>"
-                         , "</morph>"
-                         ]
-
-      it "writes XML into a file named .txt" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin "[[ D> 01- ]]" $
-            testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []
-          records <- readUtf8 path
-          records `shouldSatisfy` isPrefixOf "<?xml"
-
-    describe "--minutes" $ do
-      let sum' = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> 5.plus(6) ]]"
-      it "writes the indented text into a file named .xml" $
-        withTempFile "minutesXXXXXX.xml" $ \(path, stream) -> do
-          hClose stream
-          withStdin "[[ D> 01- ]]" $
-            testCLISucceeded ["dataize", "--minutes=" ++ path, "--quiet"] []
-          records <- readProtocol path
-          records `shouldBe` "𝔻(Φ):\n  𝛿·0·1 := 01-\n"
-
-      it "writes the same text beside --protocol as alone" $
-        withTempFile "minutesXXXXXX.txt" $ \(alone, one) ->
-          withTempFile "minutesXXXXXX.txt" $ \(beside, two) ->
-            withTempFile "protocolXXXXXX.xml" $ \(xml, three) -> do
-              mapM_ hClose [one, two, three]
-              withStdin sum' $
-                testCLISucceeded ["dataize", symbolic, "--minutes=" ++ alone, "--quiet", "--sweet", "--hide-rho"] []
-              withStdin sum' $
-                testCLISucceeded ["dataize", symbolic, "--protocol=" ++ xml, "--minutes=" ++ beside, "--quiet", "--sweet", "--hide-rho"] []
-              first <- readProtocol alone
-              second <- readProtocol beside
-              second `shouldBe` first
-
-      it "writes the same XML beside --minutes as alone" $
-        withTempFile "protocolXXXXXX.xml" $ \(alone, one) ->
-          withTempFile "protocolXXXXXX.xml" $ \(beside, two) ->
-            withTempFile "minutesXXXXXX.txt" $ \(text, three) -> do
-              mapM_ hClose [one, two, three]
-              withStdin sum' $
-                testCLISucceeded ["dataize", symbolic, "--protocol=" ++ alone, "--quiet", "--sweet", "--hide-rho"] []
-              withStdin sum' $
-                testCLISucceeded ["dataize", symbolic, "--protocol=" ++ beside, "--minutes=" ++ text, "--quiet", "--sweet", "--hide-rho"] []
-              first <- readProtocol alone
-              second <- readProtocol beside
-              second `shouldBe` first
-
-      it "abridges the text without --protocol" $
-        withTempFile "minutesXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin "[[ D> 01- ]]" $
-            testCLISucceeded ["dataize", "--minutes=" ++ path, "--abridged", "--quiet"] []
-          records <- readProtocol path
-          records `shouldBe` "𝔻(Φ):\n  𝛿·0·1 := 01-\n"
-
-    describe "--partial" $ do
-      let stuck = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ times(^, x) -> [[ L> L_number_times ]], nope -> [[ ^ -> ?, L> L_number_nope ]] ]], @ -> 2.times(3).nope ]]"
-          dispatched = "[[ foo -> [[ bar -> [[ ^ -> ?, L> L_number_nope ]] ]], @ -> Q.foo.bar ]]"
-          wrapped = "[[ app -> [[ foo -> [[ bar -> [[ ^ -> ?, L> L_number_nope ]] ]], @ -> Q.app.foo.bar ]] ]]"
-      it "fails on a λ function that cannot fire without the flag" $
-        withStdin stuck $
-          testCLIFailed
-            ["dataize", symbolic, "--sweet", "--hide-rho"]
-            ["No entry of --symbolic answers the λ function 'L_number_nope'"]
-
-      it "prints the residue with the stuck application intact and exits successfully" $
-        withStdin stuck $
-          testCLISucceeded
-            ["dataize", symbolic, "--partial", "--sweet", "--hide-rho"]
-            ["L_number_nope:λ"]
-
-      it "keeps what was evaluated before the stuck site in the residue" $
-        withStdin stuck $
-          testCLISucceeded
-            ["dataize", symbolic, "--partial", "--sweet"]
-            ["φ ↦ 𝜎1:λ"]
-
-      it "records every firing before the stuck site in --protocol" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin stuck $
-            testCLISucceeded ["dataize", symbolic, "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-          records <- readProtocol path
-          lines records
-            `shouldBe` [ "𝔻(Φ):"
-                       , "  boxed 𝑛·0·1 := Φ.φ"
-                       , "  𝕄(𝑛·0·1):"
-                       , "    𝑛·0·2 := 2.0"
-                       , "    𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), times(x) ↦ L_number_times:λ, nope ↦ L_number_nope:λ ⟧"
-                       , "    𝑛·0·4 := 𝑛·0·2.times( x ↦ 3.0 )"
-                       , "    𝑛·0·5 := ⟦ x ↦ 3.0, λ ⤍ L_number_times ⟧"
-                       , "    𝔼(L_number_times):"
-                       , "      𝔻(ξ.ρ):"
-                       , "        𝕄(ξ.ρ):"
-                       , "          𝑛·1·1 := 2.0"
-                       , "          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), times(x) ↦ L_number_times:λ, nope ↦ L_number_nope:λ ⟧"
-                       , "          morphed 𝑛·1·3 := 𝑛·1·2"
-                       , "        boxed 𝑛·1·4 := 𝑛·1·3.φ"
-                       , "        𝕄(𝑛·1·4):"
-                       , "          𝑛·1·5 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )"
-                       , "          𝑛·1·6 := 40-00-00-00-00-00-00-00:Δ:φ"
-                       , "          morphed 𝑛·1·7 := 𝑛·1·6"
-                       , "        boxed 𝑛·1·8 := 𝑛·1·7.φ"
-                       , "        𝛿·1·1 := 40-00-00-00-00-00-00-00  # 2.0"
-                       , "      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
-                       , "      𝔻(ξ.x):"
-                       , "        𝕄(ξ.x):"
-                       , "          𝑛·1·9 := 3.0"
-                       , "          𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), times(x) ↦ L_number_times:λ, nope ↦ L_number_nope:λ ⟧"
-                       , "          morphed 𝑛·1·11 := 𝑛·1·10"
-                       , "        boxed 𝑛·1·12 := 𝑛·1·11.φ"
-                       , "        𝕄(𝑛·1·12):"
-                       , "          𝑛·1·13 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )"
-                       , "          𝑛·1·14 := 40-08-00-00-00-00-00-00:Δ:φ"
-                       , "          morphed 𝑛·1·15 := 𝑛·1·14"
-                       , "        boxed 𝑛·1·16 := 𝑛·1·15.φ"
-                       , "        𝛿·1·2 := 40-08-00-00-00-00-00-00  # 3.0"
-                       , "      𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
-                       , "      𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
-                       , "      𝕄(𝑛·1·17):"
-                       , "        𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )"
-                       , "        𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, times(x) ↦ L_number_times:λ, nope ↦ L_number_nope:λ ⟧"
-                       , "        morphed 𝑛·1·20 := 𝑛·1·19"
-                       , "      𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)"
-                       , "    morphed 𝑛·0·6 := L_number_nope:λ"
-                       , "  unanswered L_number_nope  # 𝔻(L_number_nope:λ)"
-                       ]
-
-      it "still prints bytes when nothing gets stuck" $
-        withStdin "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> 5.plus(6) ]]" $
-          testCLISucceeded ["dataize", symbolic, "--partial"] ["40-45-00-00-00-00-00-00"]
-
-      it "prints the residual at --locator as XMIR, with ρ hidden" $
-        withStdin wrapped $
-          testCLISucceeded
-            ["dataize", symbolic, "--partial", "--locator=Q.app", "--output=xmir", "--hide-rho"]
-            ["<o name=\"λ\">L_number_nope</o>"]
-
-      it "prints the residual at --locator, not the whole program" $
-        withStdin wrapped $ do
-          (out, _) <- withStdout (runCLI ["dataize", symbolic, "--partial", "--locator=Q.app", "--hide-rho", "--flat"])
-          lines out `shouldBe` ["⟦ λ ⤍ L_number_nope ⟧"]
-
-      it "prints a residual of several top bindings as XMIR" $
-        withStdin dispatched $
-          testCLISucceeded
-            ["dataize", symbolic, "--partial", "--output=xmir"]
-            ["<o base=\"Φ.foo\" name=\"ρ\"/>", "<o name=\"λ\">L_number_nope</o>"]
-
-      it "prints the chain of steps ending in the residue with --sequence" $
-        withStdin stuck $
-          testCLISucceeded
-            ["dataize", symbolic, "--partial", "--sequence", "--sweet", "--hide-rho", "--flat"]
-            ["2.0.times( 3.0 ).nope", "L_number_nope:λ"]
-
-      it "prints the terminator ⊥ the object reduces to as the residue" $
-        withStdin "[[ ]]" $
-          testCLISucceeded ["dataize", "--partial"] ["⊥"]
-
-    describe "--symbolic" $ do
-      let sum' = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> 5.plus(6) ]]"
-      it "fires the λ function an entry of the file answers" $
-        withStdin sum' $
-          testCLISucceeded ["dataize", symbolic] ["40-45-00-00-00-00-00-00"]
-
-      it "reports the progress of the run with --log-level=INFO" $
-        withStdin sum' $
-          testCLISucceeded ["dataize", symbolic, "--log-level=INFO", "--quiet"] ["[INFO]: Started "]
-
-      it "gets stuck on every λ function when it is not given" $
-        withStdin sum' $
-          testCLIFailed ["dataize"] ["No entry of --symbolic answers the λ function 'L_number_plus'"]
-
-      it "fails when the file is not there" $
-        withStdin sum' $
-          testCLIFailed ["dataize", "--symbolic=no-such-file.yaml"] ["no-such-file.yaml"]
-
-      it "fails on a file that carries no entries at all, before dataizing anything" $
-        withTempFileContent "symbolicXXXXXX.yaml" "nope: true\n" $ \path ->
-          withStdin sum' $
-            testCLIFailed ["dataize", "--symbolic=" ++ path] ["cannot be read"]
-
-    describe "a join on a condition nobody decided" $ do
-      let joining = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  join:\n    on: 𝛿1\n    left: $.a\n    right: $.b\n"
-          dataized :: String -> IO String
-          dataized program =
-            withLambdasOf joining $ \joins ->
-              withStdin program $
-                fst <$> withStdout (runCLI ["dataize", "--symbolic=" ++ joins, "--locator=Q.y"])
-      it "gets stuck on two sides that do not join, instead of splitting the run" $
-        withLambdasOf joining $ \joins ->
-          withStdin "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ ⟦ Δ ⤍ 02- ⟧, λ ⤍ L_fork ⟧ ⟧" $
-            testCLIFailed ["dataize", "--symbolic=" ++ joins, "--locator=Q.y"] ["No entry of --symbolic answers the λ function 'L_fork'"]
-
-      it "gets stuck on a side whose morph got stuck" $
-        withLambdasOf joining $ \joins ->
-          withStdin "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ Δ ⤍ 05- ⟧, b ↦ ⟦ λ ⤍ L_none ⟧.x, λ ⤍ L_fork ⟧ ⟧" $
-            testCLIFailed ["dataize", "--symbolic=" ++ joins, "--locator=Q.y"] ["No entry of --symbolic answers the λ function 'L_none'"]
-
-      it "dataizes two sides that come to the same term" $ do
-        printed <- dataized "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ Δ ⤍ 07- ⟧, b ↦ ⟦ Δ ⤍ 07- ⟧, λ ⤍ L_fork ⟧ ⟧"
-        lines printed `shouldBe` ["07-"]
-
-      it "dataizes two sides that differ only in their symbols" $ do
-        printed <- dataized "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ φ ↦ ⟦ λ ⤍ 𝜎2 ⟧ ⟧, b ↦ ⟦ φ ↦ ⟦ λ ⤍ 𝜎3 ⟧ ⟧, λ ⤍ L_fork ⟧ ⟧"
-        length (lines printed) `shouldBe` 1
-
-      it "dataizes a side and ⊥ into the symbol the join minted for both" $ do
-        printed <- dataized "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ λ ⤍ 𝜎2 ⟧, b ↦ ⊥, λ ⤍ L_fork ⟧ ⟧"
-        lines printed `shouldBe` ["40-45-00-00-00-00-00-00"]
-
-      it "writes the symbol a join minted for a side and ⊥ beside a symbol standing for ⊥" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withLambdasOf joining $ \joins ->
-            withStdin "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ λ ⤍ 𝜎2 ⟧, b ↦ ⊥, λ ⤍ L_fork ⟧ ⟧" $
-              testCLISucceeded ["dataize", "--symbolic=" ++ joins, "--locator=Q.y", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-          records <- readProtocol path
-          lines records `shouldContain` ["    joined 𝜎4 := 𝛿1·1 ? 𝜎2 : 𝜎3  # where 𝜎3 is ⊥"]
-
-    describe "--inside" $ do
-      let universe = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> [[ D> 01- ]] ]]"
-      it "dataizes an expression the input does not contain" $
-        withStdin universe $
-          testCLISucceeded ["dataize", symbolic, "--inside=5.plus( 6 )"] ["40-45-00-00-00-00-00-00"]
-
-      it "normalizes what it is handed before dataizing it" $
-        withStdin universe $
-          testCLISucceeded ["dataize", "--inside=[[ x -> [[ D> 2A- ]] ]].x"] ["2A-"]
-
-      it "hides an object of the universe from the answer it morphs inside it" $
-        withStdin universe $
-          testCLISucceeded ["morph", "--inside=[[ x -> [[ D> 2A- ]] ]].x", "--hide=Q.bytes", "--flat", "--hide-rho"] ["⟦ Δ ⤍ 2A- ⟧"]
-
-      it "morphs inside the universe just as it dataizes inside it" $
-        withStdin universe $
-          testCLISucceeded ["morph", symbolic, "--inside=5.plus( 6 )", "--sweet", "--hide-rho", "--flat"] ["⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"]
-
-      it "opens the text protocol before the objects it made while aiming" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin universe $
-            testCLISucceeded ["morph", symbolic, "--inside=5.plus( 6 )", "--minutes=" ++ path, "--sweet", "--hide-rho", "--quiet"] []
-          records <- readProtocol path
-          takeWhile (/= '(') (concat (take 1 (lines records))) `shouldBe` "𝕄"
-
-      it "opens the XML protocol before the objects it made while aiming" $
-        withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-          hClose stream
-          withStdin universe $
-            testCLISucceeded ["dataize", symbolic, "--inside=5.plus( 6 )", "--protocol=" ++ path, "--sweet", "--hide-rho", "--quiet"] []
-          records <- readProtocol path
-          take 1 (lines records) `shouldBe` ["<?xml version=\"1.0\" encoding=\"UTF-8\"?>"]
-
-      it "sites what it made while aiming at the place it put the expression at" $
-        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-          hClose stream
-          withStdin universe $
-            testCLISucceeded ["dataize", "--inside=[[ x -> ? ]]( x -> [[ D> 2A- ]] ).x", "--minutes=" ++ path, "--sweet", "--quiet"] []
-          records <- readProtocol path
-          take 2 (lines records) `shouldBe` ["𝔻(Φ.a🌵0):", "  𝑛·0·1 := ∅:x( x ↦ 2A-:Δ )"]
-
-      it "cannot be used together with --locator" $
-        withStdin universe $
-          testCLIFailed ["dataize", "--inside=Q.@", "--locator=Q.@"] ["--inside and --locator cannot be used together"]
-
-      it "accepts --locator=Φ with --inside, since Φ and Q both name the root" $
-        withStdin universe $
-          testCLISucceeded ["dataize", "--inside=[[ x -> [[ D> 2A- ]] ]].x", "--locator=Φ"] ["2A-"]
-
-      it "accepts --locator=Φ with morph --inside, since Φ and Q both name the root" $
-        withStdin universe $
-          testCLISucceeded ["morph", symbolic, "--inside=5.plus( 6 )", "--locator=Φ", "--sweet", "--hide-rho", "--flat"] ["⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"]
-
-      it "fails when the input expression is not a formation" $
-        withStdin "Q.x" $
-          testCLIFailed ["dataize", "--inside=Q.x"] ["--inside requires the input expression to be a formation"]
-
-    describe "fails" $ do
-      it "with --output != latex and --nonumber" $
-        withStdin "" $
-          testCLIFailed
-            ["dataize", "--nonumber", "--output=xmir"]
-            ["The --nonumber option can stay together with --output=latex only"]
-
-      it "with --omit-listing and --output != xmir" $
-        withStdin "" $
-          testCLIFailed
-            ["dataize", "--omit-listing", "--output=phi"]
-            ["--omit-listing"]
-
-      it "with --omit-comments and --output != xmir" $
-        withStdin "" $
-          testCLIFailed
-            ["dataize", "--omit-comments", "--output=phi"]
-            ["--omit-comments"]
-
-      it "with --expression and --output != latex" $
-        withStdin "" $
-          testCLIFailed
-            ["dataize", "--expression=foo", "--output=phi"]
-            ["--expression option can stay together with --output=latex only"]
-
-      it "with --label and --output != latex" $
-        withStdin "" $
-          testCLIFailed
-            ["dataize", "--label=foo", "--output=phi"]
-            ["--label option can stay together with --output=latex only"]
-
-      it "with wrong --hide option" $
-        withStdin "" $
-          testCLIFailed
-            ["dataize", "--hide=Q.x(Q.y)"]
-            ["[ERROR]: Invalid set of arguments: Only dispatch expression", "but given: Φ.x( Φ.y )"]
-
-      it "with wrong --show option" $
-        withStdin "" $
-          testCLIFailed
-            ["dataize", "--show=Q.x(Q.y)"]
-            ["[ERROR]:", "Only dispatch expression started with Φ (or Q) can be used in --show"]
-
-      it "with wrong --locator option" $
-        withStdin "" $
-          testCLIFailed
-            ["dataize", "--locator=Q.x(Q.y)"]
-            ["[ERROR]:", "Only dispatch expression started with Φ (or Q) can be used in --locator"]
-
-      it "with wrong --focus option" $
-        withStdin "" $
-          testCLIFailed
-            ["dataize", "--focus=Q.x(Q.y)"]
-            ["[ERROR]:", "Only dispatch expression started with Φ (or Q) can be used in --focus"]
-
-      it "with wrong --locator option written through ξ, keeping ξ in the error" $
-        withStdin "" $
-          testCLIFailed
-            ["dataize", "--locator=ξ.x"]
-            ["[ERROR]:", "but given: ξ.x"]
-
-    it "accepts --depth-sensitive" $
-      withStdin "[[ D> 01- ]]" $
-        testCLISucceeded ["dataize", "--depth-sensitive"] ["01-"]
-
-    it "finishes exactly on --max-cycles without reporting the limit" $
-      withStdin "⟦ φ ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $
-        testCLISucceeded ["dataize", "--max-cycles=1"] ["01-"]
-
-    it "reports --max-cycles exceeded when a rule still applies at the limit" $
-      withStdin "[[ @ -> $.f(y -> [[ ]]), f -> [[ D> 00-, y -> ? ]] ]]" $
-        testCLIFailed
-          ["dataize", "--max-cycles=1"]
-          ["[ERROR]: Normalization did not finish before reaching the limit of cycles: --max-cycles=1"]
-
-  describe "morph" $ do
-    let chained = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> 5.plus(6).plus(7) ]]"
-    it "prints help" $
-      testCLISucceeded ["morph", "--help"] ["Morph the 𝜑-expression"]
-
-    it "hands the top formation back untouched under the default locator" $
-      withStdin "[[ D> 01- ]]" $
-        testCLISucceeded ["morph", "--flat", "--hide-rho"] ["⟦ Δ ⤍ 01- ⟧"]
-
-    it "stops at the bare saturated λ-formation" $
-      withStdin chained $
-        testCLISucceeded
-          ["morph", symbolic, "--locator=Q.@", "--sweet", "--hide-rho", "--flat"]
-          ["⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"]
-
-    it "leaves to dataize the firing that takes the same term to bytes" $
-      withStdin chained $
-        testCLISucceeded ["dataize", symbolic] ["40-45-00-00-00-00-00-00"]
-
-    it "morphs the subterm --locator aims at" $
-      withStdin "[[ ex -> Q.x, x -> [[ D> 42- ]] ]]" $
-        testCLISucceeded ["morph", "--locator=Q.ex", "--flat", "--hide-rho"] ["⟦ Δ ⤍ 42- ⟧"]
-
-    it "canonizes the answer it prints" $
-      withStdin "[[ x -> [[ L> Foo ]], y -> [[ L> Bar ]] ]]" $
-        testCLISucceeded ["morph", "--canonize", "--flat", "--sweet"] ["⟦ x ↦ Fn1:λ, y ↦ Fn2:λ ⟧"]
-
-    it "hides a binding of the answer it prints" $
-      withStdin "[[ x -> [[ L> Foo ]], y -> [[ L> Bar ]] ]]" $
-        testCLISucceeded ["morph", "--hide=Q.x", "--flat", "--sweet"] ["Bar:λ:y"]
-
-    it "shows only one binding of the answer it prints" $
-      withStdin "[[ x -> [[ L> Foo ]], y -> [[ L> Bar ]] ]]" $
-        testCLISucceeded ["morph", "--show=Q.x", "--flat", "--sweet"] ["Foo:λ:x"]
-
-    it "hides an object outside the answer --locator aims at" $
-      withStdin "[[ t -> [[ a -> [[ D> 01- ]], b -> [[ D> 02- ]] ]], o -> [[ D> 03- ]] ]]" $
-        testCLISucceeded ["morph", "--locator=Q.t", "--hide=Q.o", "--flat", "--hide-rho"] ["⟦ a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ ⟦ Δ ⤍ 02- ⟧ ⟧"]
-
-    it "hides a binding of the answer --locator aims at" $
-      withStdin "[[ t -> [[ a -> [[ D> 01- ]], b -> [[ D> 02- ]] ]], o -> [[ D> 03- ]] ]]" $
-        testCLISucceeded ["morph", "--locator=Q.t", "--hide=Q.t.a", "--flat", "--hide-rho"] ["⟦ b ↦ ⟦ Δ ⤍ 02- ⟧ ⟧"]
-
-    it "shows only one binding of the answer --locator aims at" $
-      withStdin "[[ t -> [[ a -> [[ D> 01- ]], b -> [[ D> 02- ]] ]], o -> [[ D> 03- ]] ]]" $
-        testCLISucceeded ["morph", "--locator=Q.t", "--show=Q.t.b", "--flat", "--hide-rho"] ["⟦ b ↦ ⟦ Δ ⤍ 02- ⟧ ⟧"]
-
-    it "prints ⊥ instead of failing the run" $
-      withStdin "[[ x -> $ ]]" $
-        testCLISucceeded ["morph", "--locator=Q.x"] ["⊥"]
-
-    it "fails to dataize what it morphs to ⊥" $
-      withStdin "[[ x -> $ ]]" $
-        testCLIFailed ["dataize", "--locator=Q.x"] ["terminator ⊥"]
-
-    it "prints the chain of morphing steps with --sequence" $
-      withStdin chained $
-        testCLISucceeded
-          ["morph", symbolic, "--locator=Q.@", "--sequence", "--headers", "--sweet", "--hide-rho", "--flat"]
-          [ "Rule 'maa'"
-          , "Rule 'alpha'"
-          , "Rule 'copy'"
-          , "Rule 'mf'"
-          , "⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"
-          ]
-
-    it "writes every step of a LaTeX --sequence with the arrow of its judgment" $
-      withStdin "[[ q -> [[ ]], k -> Q.q ]]" $
-        testCLISucceeded
-          ["morph", "--locator=Q.k", "--sequence", "--output=latex", "--flat", "--sweet", "--quiet"]
-          [ intercalate
-              "\n"
-              [ "\\begin{phiquation}"
-              , "[[ |q| -> [[]], |k| -> Q . |q| ]] \\phiMorph[\\nameref{r:md}]"
-              , "  \\phiMorph [[ |q| -> [[]], |k| -> [[ |q| -> [[]], |k| -> Q . |q| ]] . |q| ]] \\phiNormalize[\\nameref{r:dot}]"
-              , "  \\phiNormalize [[ |q| -> [[]], |k| -> [[]] ( \\phiTerminal{\\rho} -> Q ) ]] \\phiNormalize[\\nameref{r:skip}]"
-              , "  \\phiNormalize [[ |q| -> [[]], |k| -> [[]] ]] \\phiMorph[\\nameref{r:mf}]"
-              , "  \\phiMorph [[ |q| -> [[]], |k| -> [[]] ]]{.}"
-              , "\\end{phiquation}"
-              ]
-          ]
-
-    it "does not print the result with --quiet" $
-      withStdin "[[ D> 01- ]]" $
-        testCLISucceeded ["morph", "--quiet"] []
-
-    it "records the λ functions it fires with --protocol" $
-      withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-        hClose stream
-        withStdin chained $
-          testCLISucceeded ["morph", symbolic, "--locator=Q.@", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
-        records <- readProtocol path
-        lines records
-          `shouldBe` [ "𝕄(Φ.φ):"
-                     , "  𝑛·0·1 := 5.0"
-                     , "  𝑛·0·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                     , "  𝑛·0·3 := 𝑛·0·1.plus( x ↦ 6.0 )"
-                     , "  𝑛·0·4 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"
-                     , "  𝔼(L_number_plus):"
-                     , "    𝔻(ξ.ρ):"
-                     , "      𝕄(ξ.ρ):"
-                     , "        𝑛·1·1 := 5.0"
-                     , "        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                     , "        morphed 𝑛·1·3 := 𝑛·1·2"
-                     , "      boxed 𝑛·1·4 := 𝑛·1·3.φ"
-                     , "      𝕄(𝑛·1·4):"
-                     , "        𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"
-                     , "        𝑛·1·6 := 40-14-00-00-00-00-00-00:Δ:φ"
-                     , "        morphed 𝑛·1·7 := 𝑛·1·6"
-                     , "      boxed 𝑛·1·8 := 𝑛·1·7.φ"
-                     , "      𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"
-                     , "    𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
-                     , "    𝔻(ξ.x):"
-                     , "      𝕄(ξ.x):"
-                     , "        𝑛·1·9 := 6.0"
-                     , "        𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
-                     , "        morphed 𝑛·1·11 := 𝑛·1·10"
-                     , "      boxed 𝑛·1·12 := 𝑛·1·11.φ"
-                     , "      𝕄(𝑛·1·12):"
-                     , "        𝑛·1·13 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"
-                     , "        𝑛·1·14 := 40-18-00-00-00-00-00-00:Δ:φ"
-                     , "        morphed 𝑛·1·15 := 𝑛·1·14"
-                     , "      boxed 𝑛·1·16 := 𝑛·1·15.φ"
-                     , "      𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"
-                     , "    𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
-                     , "    𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
-                     , "    𝕄(𝑛·1·17):"
-                     , "      𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )"
-                     , "      𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"
-                     , "      morphed 𝑛·1·20 := 𝑛·1·19"
-                     , "    𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)"
-                     , "  𝑛·0·5 := 𝑛·1·18.plus( x ↦ 7.0 )"
-                     , "  𝑛·0·6 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"
-                     , "  morphed 𝑛·0·7 := 𝑛·0·6"
-                     ]
-
-    it "saves morphing steps to dir with --steps-dir" $
-      withTempDirectory "phino-steps-morph" $ \dir ->
-        withStdin chained $ do
-          testCLISucceeded
-            ["morph", symbolic, "--locator=Q.@", "--steps-dir=" ++ dir, "--sweet", "--hide-rho", "--flat"]
-            ["⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"]
-          steps <- sort <$> listDirectory dir
-          steps `shouldBe` map (\n -> printf "%05d.phi" (n :: Int)) [1 .. length steps]
-          length steps `shouldSatisfy` (> 0)
-
-    it "accepts --seed, --shuffle and --depth-sensitive" $
-      withStdin "[[ D> 01- ]]" $
-        testCLISucceeded ["morph", "--seed=7", "--shuffle", "--depth-sensitive", "--flat", "--hide-rho"] ["⟦ Δ ⤍ 01- ⟧"]
-
-    it "returns the λ-formation dataize cannot finish on" $
-      withStdin "⟦ @ ↦ ⟦ λ ⤍ L_number_div, ρ ↦ ⟦ Δ ⤍ 40-45-00-00-00-00-00-00 ⟧, x ↦ ⟦ Δ ⤍ 40-00-00-00-00-00-00-00 ⟧ ⟧ ⟧" $
-        testCLISucceeded
-          ["morph", "--locator=Q.@", "--max-steps=40", "--flat", "--hide-rho"]
-          ["⟦ λ ⤍ L_number_div"]
-
-    it "fails once the --max-steps budget is spent" $
-      withStdin chained $
-        testCLIFailed
-          ["morph", "--locator=Q.@", "--max-steps=3"]
-          ["[ERROR]: Morphing did not finish before reaching the limit of steps: --max-steps=3"]
-
-    it "names morphing, not dataization, when the budget is spent before dataization starts" $
-      withStdin "⟦ x ↦ Φ.x.y ⟧" $
-        testCLIFailed
-          ["morph", "--locator=Q.x", "--max-steps=5"]
-          ["[ERROR]: Morphing did not finish before reaching the limit of steps: --max-steps=5"]
-
-    describe "--max-firings" $ do
-      let splitting = withLambdasOf (T.pack "- λ: L_split\n  morph:\n    𝑛1: Φ.s.foo\n    𝑛2: Φ.s.foo\n  𝑛: ⟦ l ↦ 𝑛1, r ↦ 𝑛2 ⟧\n")
-          split = "⟦ s ↦ ⟦ λ ⤍ L_split ⟧, x ↦ Φ.s.foo ⟧"
-      it "fails with non-positive --max-firings" $
-        withStdin split $
-          testCLIFailed ["morph", "--max-firings=0"] ["--max-firings must be positive"]
-
-      it "fails once the --max-firings budget is spent on a widening recursion" $
-        splitting $ \table ->
-          withStdin split $
-            testCLIFailed
-              ["morph", "--symbolic=" ++ table, "--locator=Q.x", "--max-firings=64"]
-              ["[ERROR]: Evaluation did not finish before reaching the limit of firings: --max-firings=64"]
-
-      it "ends the widening recursion with --partial" $
-        splitting $ \table ->
-          withStdin split $
-            testCLISucceeded
-              ["morph", "--symbolic=" ++ table, "--locator=Q.x", "--max-firings=64", "--partial", "--flat", "--hide-rho", "--sweet"]
-              ["L_split:λ.foo"]
-
-      it "fires no more λ functions than --max-firings allows" $
-        splitting $ \table ->
-          withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-            hClose stream
-            withStdin split $
-              testCLISucceeded
-                ["morph", "--symbolic=" ++ table, "--locator=Q.x", "--max-firings=64", "--partial", "--minutes=" ++ path, "--quiet"]
-                []
-            records <- readProtocol path
-            length (filter (isInfixOf "𝔼(L_split)") (lines records)) `shouldBe` 64
-
-    describe "--max-nodes" $ do
-      let growing = "⟦ m(p) ↦ ⟦ φ ↦ ξ.a( ξ.p ).φ, a(ρ, tup) ↦ ⟦ φ ↦ ρ.a( ξ.tup.tail ).φ ⟧ ⟧, x ↦ Φ.m( 𝜎1:λ ) ⟧"
-      it "fails with non-positive --max-nodes" $
-        withStdin growing $
-          testCLIFailed ["dataize", "--max-nodes=0"] ["--max-nodes must be positive"]
-
-      it "fails once the term grows over --max-nodes" $
-        withStdin growing $
-          testCLIFailed
-            ["dataize", "--acyclic=plausible", "--max-loops=2", "--max-nodes=60", "--locator=Q.x"]
-            ["[ERROR]: Evaluation did not finish before reaching the limit of nodes: --max-nodes=60"]
-
-      it "ends the growing term with --partial" $
-        withStdin growing $
-          testCLISucceeded
-            ["morph", "--acyclic=plausible", "--max-loops=2", "--max-nodes=60", "--partial", "--locator=Q.x", "--flat", "--hide-rho", "--sweet"]
-            ["Φ.m( 𝜎1:λ )"]
-
-      it "passes a small run in a large program under --max-nodes" $
-        withStdin ("⟦ x ↦ ⟦ φ ↦ ξ.y, y ↦ ⟦ Δ ⤍ 05- ⟧ ⟧, junk ↦ ⟦ " ++ intercalate ", " [printf "a%d ↦ ⟦ b ↦ ⟦ c ↦ ⟦ Δ ⤍ 01- ⟧ ⟧ ⟧" index | index <- [0 .. 999 :: Int]] ++ " ⟧ ⟧") $
-          testCLISucceeded ["dataize", "--max-nodes=50", "--locator=Q.x"] ["05-"]
-
-    describe "--max-memory" $ do
-      let growing = "⟦ m(p) ↦ ⟦ φ ↦ ξ.a( ξ.p ).φ, a(ρ, tup) ↦ ⟦ φ ↦ ρ.a( ξ.tup.tail ).φ ⟧ ⟧, x ↦ Φ.m( 𝜎1:λ ) ⟧"
-      it "fails with non-positive --max-memory" $
-        withStdin growing $
-          testCLIFailed ["dataize", "--max-memory=0G"] ["--max-memory must be positive"]
-
-      it "fails with --max-memory of an unknown unit" $
-        withStdin growing $
-          testCLIFailed ["dataize", "--max-memory=8Q"] ["--max-memory must be a number of bytes, optionally ending with K, M, G or T"]
-
-      it "fails once the heap grows over --max-memory" $
-        withStdin growing $
-          testCLIFailed
-            ["dataize", "--acyclic=plausible", "--max-loops=2", "--max-memory=1K", "--locator=Q.x"]
-            ["[ERROR]: Evaluation did not finish before reaching the limit of memory: --max-memory=1K"]
-
-      it "ends the growing term with --partial under --max-memory" $
-        withStdin growing $
-          testCLISucceeded
-            ["morph", "--acyclic=plausible", "--max-loops=2", "--max-memory=1K", "--partial", "--locator=Q.x", "--flat", "--hide-rho", "--sweet"]
-            ["Φ.m( 𝜎1:λ )"]
-
-      it "passes a small run in a large program under --max-memory" $
-        withStdin ("⟦ x ↦ ⟦ φ ↦ ξ.y, y ↦ ⟦ Δ ⤍ 05- ⟧ ⟧, junk ↦ ⟦ " ++ intercalate ", " [printf "a%d ↦ ⟦ b ↦ ⟦ c ↦ ⟦ Δ ⤍ 01- ⟧ ⟧ ⟧" index | index <- [0 .. 999 :: Int]] ++ " ⟧ ⟧") $
-          testCLISucceeded ["dataize", "--max-memory=1G", "--locator=Q.x"] ["05-"]
-
-    describe "--max-seconds" $ do
-      let ladder = withLambdasOf (T.pack "- λ: L_split\n  morph:\n    𝑛1: ξ.n.foo\n    𝑛2: ξ.n.foo\n  𝑛: ⟦ l ↦ 𝑛1, r ↦ 𝑛2 ⟧\n")
-          rungs = "⟦ " ++ intercalate ", " [printf "l%d ↦ ⟦ λ ⤍ L_split, n ↦ Φ.l%d ⟧" rung (rung + 1) | rung <- [0 .. 23 :: Int]] ++ ", l24 ↦ ⟦⟧, x ↦ Φ.l0.foo ⟧"
-          bounded :: Expectation -> Expectation
-          bounded check = timeout 60000000 check >>= (`shouldBe` Just ())
-      it "fails with non-positive --max-seconds" $
-        withStdin rungs $
-          testCLIFailed ["morph", "--max-seconds=0"] ["--max-seconds must be positive"]
-
-      it "fails with a --max-seconds value above maxBound Int, naming the limit" $
-        withStdin rungs $
-          testCLIFailed
-            ["morph", "--max-seconds=9223372036854775808"]
-            ["value must be between", "9223372036854775807"]
-
-      it "fails once the --max-seconds budget is spent" $
-        ladder $ \table ->
-          bounded $
-            withStdin rungs $
-              testCLIFailed
-                ["morph", "--symbolic=" ++ table, "--locator=Q.x", "--max-seconds=1"]
-                ["[ERROR]: Evaluation did not finish before reaching the limit of seconds: --max-seconds=1"]
-
-      it "fails dataize once the --max-seconds budget is spent" $
-        ladder $ \table ->
-          bounded $
-            withStdin rungs $
-              testCLIFailed
-                ["dataize", "--symbolic=" ++ table, "--locator=Q.x", "--max-seconds=1"]
-                ["[ERROR]: Evaluation did not finish before reaching the limit of seconds: --max-seconds=1"]
-
-      it "prints the residue once the --max-seconds budget is spent with --partial" $
-        ladder $ \table ->
-          bounded $
-            withStdin rungs $
-              testCLISucceeded
-                ["morph", "--symbolic=" ++ table, "--max-seconds=1", "--locator=Q.x", "--partial", "--flat", "--hide-rho", "--sweet"]
-                ["⟦ λ ⤍ L_split, n ↦ Φ.l1 ⟧.foo"]
-
-      it "prints the residue of a dataization once the --max-seconds budget is spent with --partial" $
-        ladder $ \table ->
-          bounded $
-            withStdin rungs $
-              testCLISucceeded
-                ["dataize", "--symbolic=" ++ table, "--max-seconds=1", "--locator=Q.x", "--partial", "--flat", "--hide-rho", "--sweet"]
-                ["⟦ λ ⤍ L_split, n ↦ Φ.l1 ⟧.foo"]
-
-      forM_ [(testCLIFailed, ["--max-seconds=1"], ["--locator=Q.x"]), (testCLISucceeded, [], ["--locator=Q.x", "--partial"])] $ \(run, outputs, opts) ->
-        it ("writes the timeout as the last line of the protocol with " ++ unwords opts) $
-          ladder $ \table ->
-            withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-              hClose stream
-              bounded $
-                withStdin rungs $
-                  run
-                    (["morph", "--symbolic=" ++ table, "--max-seconds=1", "--minutes=" ++ path, "--quiet"] ++ opts)
-                    outputs
-              records <- readProtocol path
-              dropWhile (== ' ') (last (lines records)) `shouldBe` "timeout 1"
-
-      it "writes the timeout once to the XML protocol" $
-        ladder $ \table ->
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            bounded $
-              withStdin rungs $
-                testCLISucceeded
-                  ["morph", "--symbolic=" ++ table, "--locator=Q.x", "--partial", "--max-seconds=1", "--protocol=" ++ path, "--quiet"]
-                  []
-            records <- readProtocol path
-            length (filter (isInfixOf "<timeout limit=\"1\" by=\"morph\" at=\"") (lines records)) `shouldBe` 1
-
-      it "closes the XML protocol of a run out of time" $
-        ladder $ \table ->
-          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-            hClose stream
-            bounded $
-              withStdin rungs $
-                testCLIFailed
-                  ["morph", "--symbolic=" ++ table, "--locator=Q.x", "--max-seconds=1", "--protocol=" ++ path, "--quiet"]
-                  ["--max-seconds=1"]
-            document <- X.readFile X.def path
-            X.nameLocalName (X.elementName (X.documentRoot document)) `shouldBe` T.pack "protocol"
-
-    it "parks the spent budget as a residual with --partial" $
-      withStdin "⟦ φ ↦ 5.gt(Φ.nan) ⟧" $
-        testCLISucceeded
-          ["morph", "--locator=Q.@", "--max-steps=10", "--partial", "--flat", "--hide-rho", "--sweet"]
-          ["5.0.gt( Φ.nan )"]
-
-    describe "--partial" $ do
-      let stuck = "[[ @ -> [[ L> Sym_arg_0 ]].foo ]]"
-      it "fails on a λ function that cannot fire without the flag" $
-        withStdin stuck $
-          testCLIFailed ["morph", "--locator=Q.@"] ["No entry of --symbolic answers the λ function 'Sym_arg_0'"]
-
-      it "prints the residue with the stuck application intact and exits successfully" $
-        withStdin stuck $
-          testCLISucceeded
-            ["morph", "--locator=Q.@", "--partial", "--flat", "--hide-rho"]
-            ["⟦ λ ⤍ Sym_arg_0 ⟧.foo"]
-
-    describe "a copy a 'defer' line of a join defers" $ do
-      let joining = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  morph:\n    𝑛1: $.a\n    𝑛2: $.b\n  defer:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  join:\n    on: 𝛿1\n    left: 𝑛3\n    right: 𝑛4\n"
-          counting = T.pack "- λ: L_inc\n  dataize:\n    𝛿1: $.x\n  𝑛: Φ.num( φ ↦ ⟦ λ ⤍ 𝜎 ⟧ )\n"
-          recordedWith :: T.Text -> [String] -> String -> IO [String]
-          recordedWith entries options program =
-            withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
-              hClose stream
-              withLambdasOf entries $ \joins ->
-                withStdin program $
-                  testCLIFailed (["dataize", "--symbolic=" ++ joins, "--locator=Q.y", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] ++ options) ["No entry of --symbolic answers the λ function 'L_fork'"]
-              lines <$> readProtocol path
-          deferred :: [String] -> String -> IO [String]
-          deferred = recordedWith joining
-      it "writes the copy it deferred to the XML protocol as a call of the object it was made of" $ do
-        records <- deferred [] "⟦ step(tup) ↦ ⟦ φ ↦ tup.next ⟧, items ↦ ⟦ tail ↦ ⟦ λ ⤍ 𝜎1 ⟧ ⟧, y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎2 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ Φ.step( tup ↦ Φ.items.tail ), λ ⤍ L_fork ⟧ ⟧"
-        records
-          `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                     , "<dataize at=\"Φ.y\">"
-                     , "  <evaluate λ=\"L_fork\" by=\"dataize\" at=\"Φ.y\">"
-                     , "    <dataize at=\"ξ.c\">"
-                     , "      <manufactured meta=\"𝛿·1·1\">𝜎2</manufactured>"
-                     , "    </dataize>"
-                     , "    <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
-                     , "    <morph at=\"ξ.a\">"
-                     , "      <morphed meta=\"𝑛·1·1\">01-</morphed>"
-                     , "    </morph>"
-                     , "    <bound meta=\"𝑛1·1\">01-</bound>"
-                     , "    <morph at=\"ξ.b\">"
-                     , "      <remembered meta=\"𝑛·1·2\" as=\"Φ.step\"/>"
-                     , "      <applied meta=\"𝑛·1·3\" by=\"morph\" at=\"ξ.b\" of=\"Φ.step\"><ref attr=\"tup\">Φ.items.tail</ref></applied>"
-                     , "      <formed meta=\"𝑛·1·4\" of=\"Φ.step\"><ref attr=\"tup\">Φ.items.tail</ref></formed>"
-                     , "      <applied meta=\"𝑒·1·1\" of=\"𝑛·1·2\"><ref attr=\"tup\">Φ.items.tail</ref></applied>"
-                     , "      <remembered of=\"𝑛·1·4\" as=\"𝑒·1·1\"/>"
-                     , "      <morphed meta=\"𝑛·1·5\">𝑛·1·4</morphed>"
-                     , "    </morph>"
-                     , "    <bound meta=\"𝑛2·1\">𝑛·1·5</bound>"
-                     , "    <recalled of=\"𝑛·1·4\" as=\"𝑒·1·1\"/>"
-                     , "    <recalled of=\"𝑛·1·2\" as=\"Φ.step\"/>"
-                     , "    <deferred symbol=\"𝜎3\" by=\"morph\" at=\"𝑛2.φ\" of=\"Φ.step\"><with><symbol attr=\"tup\">𝜎1</symbol></with></deferred>"
-                     , "    <diverged left=\"01-\" right=\"𝜎3\" at=\".Δ\" reason=\"the join names no otherwise\"><left Δ=\"01-\"/><right/></diverged>"
-                     , "  </evaluate>"
-                     , "</dataize>"
-                     ]
-
-      it "names the object a deferred copy was made of through the formation its ρ holds" $ do
-        records <- deferred [] "⟦ joined(items) ↦ ⟦ φ ↦ step( tup ↦ items ), step(ρ, tup) ↦ ⟦ φ ↦ tup.next ⟧ ⟧, items ↦ ⟦ tail ↦ ⟦ λ ⤍ 𝜎1 ⟧ ⟧, y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎2 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ Φ.joined( items ↦ Φ.items.tail ).φ, λ ⤍ L_fork ⟧ ⟧"
-        records `shouldContain` ["    <deferred symbol=\"𝜎3\" by=\"morph\" at=\"𝑛2.φ\" of=\"Φ.joined.step\"><with><symbol attr=\"tup\">𝜎1</symbol></with></deferred>"]
-
-      it "names an argument of a deferred copy that is no bare symbol by the meta its morph bound, though an element formed it" $ do
-        records <- deferred [] "⟦ box(x, w) ↦ ⟦ φ ↦ x.next ⟧, items ↦ ⟦ tail ↦ ⟦ λ ⤍ 𝜎1 ⟧ ⟧, y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎2 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ Φ.box( x ↦ Φ.items.tail, w ↦ ⟦ z ↦ Φ ⟧ ), λ ⤍ L_fork ⟧ ⟧"
-        records `shouldContain` ["    <deferred symbol=\"𝜎3\" by=\"morph\" at=\"𝑛2.φ\" of=\"Φ.box\"><with><symbol attr=\"x\">𝜎1</symbol><meta attr=\"w\">𝑛·1·8</meta></with></deferred>"]
-
-      it "names a deferred copy of a formation the world does not declare by the element that formed it" $ do
-        records <- deferred [] "⟦ wrap(v) ↦ ⟦⟧, items ↦ ⟦ tail ↦ ⟦ λ ⤍ 𝜎1 ⟧ ⟧, y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎2 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ Φ.wrap( v ↦ ⟦ inner(x) ↦ ⟦ φ ↦ x.next ⟧ ⟧ ).v.inner( x ↦ Φ.items.tail ), λ ⤍ L_fork ⟧ ⟧"
-        records `shouldContain` ["    <formed meta=\"𝑒·1·3\"><symbol attr=\"x\">𝜎1</symbol><ref attr=\"φ\">x.next</ref></formed>", "    <deferred symbol=\"𝜎3\" by=\"morph\" at=\"𝑛2.φ\" of=\"𝑒·1·3\"/>"]
-
-      it "names an argument of a deferred copy by the object its morph answered" $ do
-        records <- recordedWith (joining <> counting) [] "⟦ box(x, w) ↦ ⟦ φ ↦ x.next ⟧, num(φ) ↦ ⟦⟧, inc(x) ↦ ⟦ λ ⤍ L_inc ⟧, items ↦ ⟦ tail ↦ ⟦ λ ⤍ 𝜎1 ⟧ ⟧, y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎2 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ Φ.box( x ↦ Φ.items.tail, w ↦ Φ.inc( ⟦ Δ ⤍ 2A- ⟧ ) ), λ ⤍ L_fork ⟧ ⟧"
-        filter (isInfixOf "<deferred") records `shouldBe` ["    <deferred symbol=\"𝜎4\" by=\"morph\" at=\"𝑛2.φ\" of=\"Φ.box\"><with><symbol attr=\"x\">𝜎1</symbol><meta attr=\"w\">𝑛·2·5</meta></with></deferred>"]
-
-    describe "--acyclic=plausible" $ do
-      let twins = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], pair(a, b) -> [[ L> L_pair ]], t -> Φ.pair( 7.plus( 5.plus( 6 ) ), 7.plus( 5.plus( 6 ) ) ).φ ]]"
-          pairs = T.pack "- λ: L_number_plus\n  dataize:\n    𝛿1: $.ρ\n    𝛿2: $.x\n  𝑛: Φ.number( φ ↦ ⟦ λ ⤍ 𝜎 ⟧ )\n- λ: L_pair\n  morph:\n    𝑛1: $.a\n    𝑛2: $.b\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  𝑛: ⟦ φ ↦ ⟦ a ↦ 𝑛3, b ↦ 𝑛4 ⟧ ⟧\n"
-          recorded :: String -> IO [String]
-          recorded mode =
-            withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
-              hClose stream
-              withLambdasOf pairs $ \file ->
-                withStdin twins $
-                  testCLISucceeded
-                    ["morph", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=" ++ mode, "--minutes=" ++ path, "--quiet"]
-                    []
-              lines <$> readProtocol path
-      it "charges a formation once per argument spelling it under proven" $
-        withLambdasOf pairs $ \file ->
-          withStdin twins $
-            testCLIFailed
-              ["morph", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=proven", "--max-firings=4"]
-              ["[ERROR]: Evaluation did not finish before reaching the limit of firings: --max-firings=4"]
-
-      it "charges a firing the memo answers under plausible" $
-        withLambdasOf pairs $ \file ->
-          withStdin twins $
-            testCLIFailed
-              ["morph", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=plausible", "--max-firings=3"]
-              ["[ERROR]: Evaluation did not finish before reaching the limit of firings: --max-firings=3"]
-
-      it "answers every firing within the budget under plausible" $
-        withLambdasOf pairs $ \file ->
-          withStdin twins $
-            testCLISucceeded
-              ["morph", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=plausible", "--max-firings=4", "--flat", "--hide-rho", "--sweet"]
-              ["b ↦ ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧"]
-
-      it "reduces the operands of a formation once per argument spelling it under proven" $
-        recorded "proven" >>= (`shouldSatisfy` ((== 4) . length . filter (isInfixOf "𝛿1·")))
-
-      it "reduces the operands of a formation once for the run under plausible" $
-        recorded "plausible" >>= (`shouldSatisfy` ((== 2) . length . filter (isInfixOf "𝛿1·")))
-
-      it "writes a recalled firing at its own site under plausible" $
-        recorded "plausible" >>= (`shouldSatisfy` ((== 3) . length . filter (isInfixOf "𝔼(L_number_plus)")))
-
-      it "answers a recalled firing with the line of the first under plausible" $
-        recorded "plausible" >>= (`shouldContain` ["      𝑛·4·1 := 𝑛·2·16  # 𝑛"])
+                       , "  normalized 𝑛·0·6 := Φ.cyc( ⟦⟧ )  # 𝑛·0·5"
+                       , "  𝕄(𝑛·0·5):"
+                       , "    𝑛·0·7 := Φ.cyc( x ↦ ⟦⟧ )"
+                       , "    𝑛·0·8 := ⟦ x ↦ ⟦⟧, φ ↦ Φ.cyc( x ) ⟧"
+                       , "    morphed 𝑛·0·9 := 𝑛·0·8"
+                       , "  recalled 𝑛·0·3 ⇒ 𝑛·0·1( x ↦ ⟦⟧ )"
+                       , "  recalled 𝑛·0·1 ⇒ Φ.cyc"
+                       , "  𝕄(𝑛·0·9.x):"
+                       , "    morphed 𝑛·0·10 := ⟦⟧"
+                       , "  looped 𝜎1 := Φ.cyc( x ↦ 𝑛·0·10 )  # 𝔻(𝑛·0·5), proven, repeats 𝑛·0·9"
+                       , "  𝛿·0·1 := 𝔻(𝜎1:λ)"
+                       ]
+
+      it "writes the cut to the XML protocol with the formation in an element of its own" $
+        withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+          hClose stream
+          withStdin circling $
+            testCLISucceeded
+              ["dataize", "--locator=Q.t", "--acyclic=proven", "--partial", "--protocol=" ++ path, "--sweet", "--hide-rho", "--flat", "--quiet"]
+              []
+          records <- readProtocol path
+          lines records
+            `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                       , "<dataize at=\"Φ.t\">"
+                       , "  <morph at=\"Φ.t\">"
+                       , "    <remembered meta=\"𝑛·0·1\" as=\"Φ.cyc\"/>"
+                       , "    <formed meta=\"𝑒·0·1\"/>"
+                       , "    <applied meta=\"𝑛·0·2\" by=\"morph\" at=\"Φ.t\" of=\"Φ.cyc\"><meta attr=\"x\">𝑒·0·1</meta></applied>"
+                       , "    <formed meta=\"𝑛·0·3\" of=\"Φ.cyc\"><meta attr=\"x\">𝑒·0·1</meta></formed>"
+                       , "    <applied meta=\"𝑒·0·2\" of=\"𝑛·0·1\"><meta attr=\"x\">𝑒·0·1</meta></applied>"
+                       , "    <remembered of=\"𝑛·0·3\" as=\"𝑒·0·2\"/>"
+                       , "    <morphed meta=\"𝑛·0·4\">𝑛·0·3</morphed>"
+                       , "  </morph>"
+                       , "  <boxed meta=\"𝑛·0·5\">𝑛·0·4.φ</boxed>"
+                       , "  <applied meta=\"𝑒·0·3\" of=\"Φ.cyc\"><meta attr=\"α0\">𝑒·0·1</meta><meta attr=\"ρ\">𝑛·0·2</meta></applied>"
+                       , "  <normalized meta=\"𝑛·0·6\" of=\"𝑛·0·5\">𝑒·0·3</normalized>"
+                       , "  <morph at=\"𝑛·0·5\">"
+                       , "    <applied meta=\"𝑛·0·7\" by=\"morph\" at=\"𝑛·0·5\" of=\"Φ.cyc\"><meta attr=\"x\">𝑒·0·1</meta></applied>"
+                       , "    <formed meta=\"𝑛·0·8\" of=\"Φ.cyc\"><meta attr=\"x\">𝑒·0·1</meta></formed>"
+                       , "    <morphed meta=\"𝑛·0·9\">𝑛·0·8</morphed>"
+                       , "  </morph>"
+                       , "  <recalled of=\"𝑛·0·3\" as=\"𝑒·0·2\"/>"
+                       , "  <recalled of=\"𝑛·0·1\" as=\"Φ.cyc\"/>"
+                       , "  <morph at=\"𝑛·0·9.x\">"
+                       , "    <morphed meta=\"𝑛·0·10\">𝑒·0·1</morphed>"
+                       , "  </morph>"
+                       , "  <looped symbol=\"𝜎1\" by=\"dataize\" match=\"proven\" at=\"𝑛·0·5\" of=\"𝑛·0·9\" object=\"Φ.cyc\"><with><meta attr=\"x\">𝑛·0·10</meta></with></looped>"
+                       , "  <manufactured meta=\"𝛿·0·1\">𝜎1</manufactured>"
+                       , "</dataize>"
+                       ]
+
+      it "writes a plausible cut to the protocol as plausible" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin circling $
+            testCLISucceeded
+              ["dataize", "--locator=Q.t", "--acyclic=plausible", "--partial", "--minutes=" ++ path, "--sweet", "--hide-rho", "--flat", "--quiet"]
+              []
+          records <- readProtocol path
+          lines records `shouldContain` ["  looped 𝜎1 := Φ.cyc( x ↦ 𝑛·0·10 )  # 𝔻(𝑛·0·5), plausible, repeats 𝑛·0·9"]
+
+      it "refuses the flag without a mode" $
+        withStdin "⟦ t ↦ ⟦ Δ ⤍ 01-02 ⟧ ⟧" $
+          testCLIFailed ["dataize", "--locator=Q.t", "--acyclic"] ["The option `--acyclic` expects an argument"]
+
+      it "refuses a mode it does not know" $
+        withStdin "⟦ t ↦ ⟦ Δ ⤍ 01-02 ⟧ ⟧" $
+          testCLIFailed ["dataize", "--locator=Q.t", "--acyclic=sure"] ["The value 'sure' can't be used for '--acyclic' option"]
+
+      it "answers a terminating program the same way with the flag" $
+        withStdin "⟦ t ↦ ⟦ Δ ⤍ 01-02 ⟧ ⟧" $
+          testCLISucceeded ["dataize", "--locator=Q.t", "--acyclic=proven"] ["01-02"]
+
+    describe "--max-loops" $ do
+      let once = "⟦ f ↦ ⟦ x ↦ ∅, φ ↦ ξ.x.again ⟧, start ↦ ⟦ again ↦ Φ.f( x ↦ Φ.stop( v ↦ Φ.start ) ) ⟧, stop ↦ ⟦ v ↦ ∅, again ↦ ⟦ Δ ⤍ 01- ⟧ ⟧, t ↦ Φ.f( x ↦ Φ.start ) ⟧"
+      it "cuts a recursion that stops after one round without the flag" $
+        withStdin once $
+          testCLISucceeded
+            ["dataize", "--locator=Q.t", "--acyclic=plausible"]
+            ["40-45-00-00-00-00-00-00"]
+
+      it "dataizes a recursion that stops after one round with --max-loops=1" $
+        withStdin once $
+          testCLISucceeded ["dataize", "--locator=Q.t", "--acyclic=plausible", "--max-loops=1"] ["01-"]
+
+      it "cuts a recursion that never stops with --max-loops=1" $
+        withStdin "⟦ cyc ↦ ⟦ x ↦ ∅, φ ↦ Φ.cyc( ξ.x ) ⟧, t ↦ Φ.cyc( ⟦⟧ ) ⟧" $
+          testCLISucceeded
+            ["dataize", "--locator=Q.t", "--acyclic=proven", "--max-loops=1", "--max-steps=4000"]
+            ["40-45-00-00-00-00-00-00"]
+
+      it "refuses a negative count" $
+        withStdin once $
+          testCLIFailed ["dataize", "--locator=Q.t", "--acyclic=plausible", "--max-loops=-1"] ["--max-loops must be >= 0"]
+
+      it "refuses the flag without --acyclic" $
+        withStdin once $
+          testCLIFailed ["dataize", "--locator=Q.t", "--max-loops=1"] ["The option --max-loops requires --acyclic, since only --acyclic cuts a loop"]
+
+    describe "--acyclic at a recursive call" $ do
+      let recursive = "⟦ call(a) ↦ ⟦ λ ⤍ L_call ⟧, wrap(v) ↦ ⟦⟧, down(i) ↦ ⟦ φ ↦ Φ.call( a ↦ Φ.down( i ↦ Φ.wrap( v ↦ i ) ) ) ⟧, t ↦ Φ.down( i ↦ ⟦ Δ ⤍ 01- ⟧ ) ⟧"
+          calling = T.pack "- λ: L_call\n  morph:\n    𝑛1: $.a\n  evaluate:\n    𝑛2: 𝑛1\n  𝑛: 𝑛2\n"
+          recorded :: String -> IO [String]
+          recorded name =
+            withTempFile name $ \(path, stream) -> do
+              hClose stream
+              withLambdasOf calling $ \file ->
+                withStdin recursive $
+                  testCLISucceeded
+                    ["dataize", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=plausible", recording path, "--quiet", "--sweet", "--hide-rho"]
+                    []
+              lines <$> readProtocol path
+      it "answers the recursive call it cuts with a fresh symbol and goes on" $
+        withLambdasOf calling $ \file ->
+          withStdin recursive $
+            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=plausible"] ["40-45-00-00-00-00-00-00"]
+
+      it "writes the recursive call it cuts to the protocol as a call of the object" $
+        recorded "protocolXXXXXX.txt" >>= (`shouldContain` ["      looped 𝜎1 := Φ.down( i ↦ 𝑛·1·7 )  # plausible, repeats 𝑛·0·4"])
+
+      it "writes the recursive call it cuts to the XML protocol with the object and the metas of its arguments" $
+        recorded "protocolXXXXXX.xml" >>= (`shouldContain` ["      <looped symbol=\"𝜎1\" by=\"morph\" match=\"plausible\" at=\"ξ.a\" of=\"𝑛·0·4\" object=\"Φ.down\"><with><meta attr=\"i\">𝑛·1·7</meta></with></looped>"])
+
+    describe "--acyclic at a recursive call through a fork" $ do
+      let recursive = "⟦ if(c, a, b) ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ ξ.c, left🌵 ↦ ξ.a, right🌵 ↦ ξ.b ⟧, wrap(v) ↦ ⟦⟧, down(i) ↦ ⟦ φ ↦ Φ.if( c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ Φ.down( i ↦ Φ.wrap( v ↦ i ) ), b ↦ ⟦ φ ↦ ⟦ λ ⤍ 𝜎2 ⟧ ⟧ ) ⟧, t ↦ Φ.down( i ↦ ⟦ Δ ⤍ 01- ⟧ ) ⟧"
+          forking = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  cast:\n    𝑛5: 𝑛3\n    𝑛6: 𝑛4\n  join:\n    on: 𝛿1\n    left: 𝑛5\n    right: 𝑛6\n    otherwise: L_fork\n"
+          recorded :: String -> String -> IO [String]
+          recorded loops name =
+            withTempFile name $ \(path, stream) -> do
+              hClose stream
+              withLambdasOf forking $ \file ->
+                withStdin recursive $
+                  testCLISucceeded
+                    ["dataize", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=plausible", "--max-loops=" ++ loops, recording path, "--quiet", "--sweet", "--hide-rho"]
+                    []
+              lines <$> readProtocol path
+      it "answers the copy a side of a fork makes again with a fresh symbol and joins" $
+        withLambdasOf forking $ \file ->
+          withStdin recursive $
+            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=plausible", "--max-loops=1"] ["40-45-00-00-00-00-00-00"]
+
+      it "writes the copy it cuts in a side of a fork to the protocol as a call of the object" $
+        recorded "1" "protocolXXXXXX.txt" >>= (`shouldContain` ["        looped 𝜎3 := Φ.down( i ↦ 𝑛·3·7 )  # plausible, repeats 𝑛·0·4"])
+
+      it "writes the copy it cuts in a side of a fork to the XML protocol with the object and the metas of its arguments" $
+        recorded "1" "protocolXXXXXX.xml" >>= (`shouldContain` ["        <looped symbol=\"𝜎3\" by=\"morph\" match=\"plausible\" at=\"ξ.left🌵\" of=\"𝑛·0·4\" object=\"Φ.down\"><with><meta attr=\"i\">𝑛·3·7</meta></with></looped>"])
+
+      it "counts the copies the sides of earlier rounds of a fork made under --max-loops=2" $
+        recorded "2" "protocolXXXXXX.txt" >>= (`shouldContain` ["          looped 𝜎3 := Φ.down( i ↦ 𝑛·6·7 )  # plausible, repeats 𝑛·0·4"])
+
+    describe "--acyclic at a copy holding a λ" $ do
+      let recursive = "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, fork(left, right) ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ ⟦ λ ⤍ 𝜎4 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧, x ↦ Φ.dataized( Φ.fork( Φ.dataized( Φ.x ), ⟦ λ ⤍ 𝜎3 ⟧ ) ) ⟧"
+          forking = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  join:\n    on: 𝛿1\n    left: 𝑛3\n    right: 𝑛4\n    otherwise: L_fork\n- λ: L_dataized\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n"
+          recorded :: String -> IO [String]
+          recorded name =
+            withTempFile name $ \(path, stream) -> do
+              hClose stream
+              withLambdasOf forking $ \file ->
+                withStdin recursive $
+                  testCLISucceeded
+                    ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--partial", recording path, "--quiet", "--sweet", "--hide-rho"]
+                    []
+              lines <$> readProtocol path
+      it "answers the copy holding a λ it cuts with a fresh symbol and goes on" $
+        withLambdasOf forking $ \file ->
+          withStdin recursive $
+            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2"] ["40-45-00-00-00-00-00-00"]
+
+      it "writes the copy holding a λ it cuts to the protocol as a call of the object" $
+        recorded "protocolXXXXXX.txt" >>= (`shouldContain` ["                                looped 𝜎6 := Φ.dataized( target ↦ 𝜎5:λ )  # plausible, repeats 𝑛·9·3"])
+
+    describe "--acyclic at a copy holding a λ that evaluate fires" $ do
+      let recursive = "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, fork(left, right) ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ ⟦ λ ⤍ 𝜎4 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧, num(φ) ↦ ⟦⟧, x ↦ ⟦ φ ↦ Φ.fork( Φ.num( ⟦ λ ⤍ 𝜎3 ⟧ ), Φ.num( Φ.dataized( Φ.x ) ) ) ⟧ ⟧"
+          forking = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  join:\n    on: 𝛿1\n    left: 𝑛3\n    right: 𝑛4\n    otherwise: L_fork\n- λ: L_dataized\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n"
+      it "answers the copy holding a λ that evaluate cuts with a fresh symbol and goes on" $
+        withLambdasOf forking $ \file ->
+          withStdin recursive $
+            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2"] ["40-45-00-00-00-00-00-00"]
+
+    describe "--acyclic at a copy whose call ends with an attribute" $ do
+      let recursive = "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, fork(left, right) ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ ⟦ λ ⤍ 𝜎4 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧, num(φ) ↦ ⟦⟧, x ↦ Φ.fork( Φ.num( ⟦ λ ⤍ 𝜎5 ⟧ ), Φ.fork( Φ.num( ⟦ λ ⤍ 𝜎3 ⟧ ), Φ.num( Φ.dataized( Φ.x.φ ) ) ) ) ⟧"
+          forking = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  join:\n    on: 𝛿1\n    left: 𝑛3\n    right: 𝑛4\n    otherwise: L_fork\n- λ: L_dataized\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n"
+          recorded :: String -> IO [String]
+          recorded name =
+            withTempFile name $ \(path, stream) -> do
+              hClose stream
+              withLambdasOf forking $ \file ->
+                withStdin recursive $
+                  testCLISucceeded
+                    ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--partial", recording path, "--quiet", "--sweet", "--hide-rho"]
+                    []
+              lines <$> readProtocol path
+      it "writes the copy it cuts to the protocol as a call of the object with the attribute it ends with" $
+        recorded "protocolXXXXXX.txt" >>= (`shouldSatisfy` any (isInfixOf "looped 𝜎6 := Φ.fork( left ↦ 𝑛·9·9, right ↦ 𝑛·11·1 ).right🌵.φ  # plausible"))
+
+      it "writes the copy it cuts to the XML protocol with the object, the metas of its arguments and the attribute it ends with" $
+        recorded "protocolXXXXXX.xml" >>= (`shouldSatisfy` any (isInfixOf "object=\"Φ.fork\" dispatch=\"right🌵.φ\"><with><meta attr=\"left\">𝑛·9·9</meta><meta attr=\"right\">𝑛·11·1</meta></with></looped>"))
+
+    describe "--acyclic at a copy whose argument repeats the same loop" $ do
+      let recursive = "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, times(b) ↦ ⟦ λ ⤍ L_times ⟧, x ↦ Φ.times( Φ.dataized( Φ.x ) ) ⟧"
+          atoms = T.pack "- λ: L_times\n  dataize:\n    𝛿1: $.b\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n- λ: L_dataized\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n"
+      it "ends the run with an answer once it cuts the loop" $
+        withLambdasOf atoms $ \file ->
+          withStdin recursive $
+            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--max-seconds=30"] ["40-45-00-00-00-00-00-00"]
+
+      it "writes the cut of the argument inside the cut of the call to the protocol" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withLambdasOf atoms $ \file ->
+            withStdin recursive $
+              testCLISucceeded
+                ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--max-seconds=30", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"]
+                []
+          records <- readProtocol path
+          filter (isInfixOf "looped") (lines records) `shouldBe` ["                          looped 𝜎1 := Φ.dataized( target ↦ Φ.x )  # 𝔼(𝑛·6·3.b), plausible, repeats 𝑛·6·6", "                          looped 𝜎2 := Φ.times( b ↦ 𝜎1:λ )  # plausible, repeats 𝑛·6·3"]
+
+    describe "--acyclic at a copy whose argument raises" $
+      it "writes the copy of the terminator into the call it cuts by its name, never firing it" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withLambdasOf (T.pack "- λ: L_times\n  terminators: [L_throw]\n  dataize:\n    𝛿1: $.b\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n- λ: L_dataized\n  terminators: [L_throw]\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n") $ \file ->
+            withStdin "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, throw(message) ↦ ⟦ λ ⤍ L_throw ⟧, times(b, c) ↦ ⟦ λ ⤍ L_times ⟧, x ↦ Φ.times( Φ.dataized( Φ.x ), Φ.throw( 𝜎1:λ ) ) ⟧" $
+              testCLISucceeded
+                ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--max-seconds=30", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"]
+                []
+          records <- readProtocol path
+          filter (isInfixOf "looped 𝜎3") (lines records) `shouldBe` ["                          looped 𝜎3 := Φ.times( b ↦ 𝜎2:λ, c ↦ 𝑛·6·12 )  # plausible, repeats 𝑛·6·5"]
+
+    describe "--acyclic at a fork the memo fabricated" $ do
+      let recursive = "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, bool(fork) ↦ ⟦ if ↦ ξ.fork ⟧, num(φ) ↦ ⟦⟧, p ↦ ⟦ φ ↦ Φ.bool( ⟦ λ ⤍ L_fork, left ↦ ∅, right ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎4 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧ ).if( Φ.num( ⟦ λ ⤍ 𝜎3 ⟧ ), Φ.num( Φ.dataized( Φ.p ) ) ) ⟧, q ↦ ⟦ φ ↦ Φ.num( ⟦ λ ⤍ 𝜎5 ⟧ ) ⟧, x ↦ Φ.bool( ⟦ λ ⤍ L_fork, left ↦ ∅, right ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎1 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧ ).if( Φ.p, Φ.q ) ⟧"
+          forking = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  join:\n    on: 𝛿1\n    left: 𝑛3\n    right: 𝑛4\n    otherwise: L_fork\n- λ: L_dataized\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n"
+          recorded :: IO [String]
+          recorded =
+            withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+              hClose stream
+              withLambdasOf forking $ \file ->
+                withStdin recursive $
+                  testCLISucceeded
+                    ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"]
+                    []
+              lines <$> readProtocol path
+      it "answers the fork it cuts inside a formation the memo fabricated with a fresh symbol and goes on" $
+        withLambdasOf forking $ \file ->
+          withStdin recursive $
+            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2"] ["40-45-00-00-00-00-00-00"]
+
+      it "writes the fork it cuts inside a fabricated formation by its symbol alone, since no fact names it" $
+        recorded >>= (`shouldSatisfy` any (isInfixOf "looped 𝜎6  # 𝔻("))
+
+      it "answers the fork it cuts inside a formation fabricated from a fork of the world with a fresh symbol and goes on" $
+        withLambdasOf forking $ \file ->
+          withStdin "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, fork(left, right) ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ ⟦ λ ⤍ 𝜎4 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧, num(φ) ↦ ⟦⟧, p ↦ ⟦ φ ↦ Φ.fork( Φ.num( ⟦ λ ⤍ 𝜎3 ⟧ ), Φ.num( Φ.dataized( Φ.p ) ) ) ⟧, q ↦ ⟦ φ ↦ Φ.num( ⟦ λ ⤍ 𝜎5 ⟧ ) ⟧, x ↦ Φ.fork( Φ.p, Φ.q ) ⟧" $
+            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2"] ["40-45-00-00-00-00-00-00"]
+
+    describe "--acyclic at a fork written in place" $ do
+      let recursive = "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, bool(fork) ↦ ⟦ if ↦ ξ.fork ⟧, num(φ) ↦ ⟦⟧, p ↦ ⟦ φ ↦ Φ.bool( ⟦ λ ⤍ L_fork, left ↦ ∅, right ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎4 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧ ).if( Φ.num( ⟦ λ ⤍ 𝜎3 ⟧ ), Φ.num( Φ.dataized( Φ.p ) ) ) ⟧, x ↦ Φ.p ⟧"
+          forking = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  join:\n    on: 𝛿1\n    left: 𝑛3\n    right: 𝑛4\n    otherwise: L_fork\n- λ: L_dataized\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n"
+          recorded :: IO [String]
+          recorded =
+            withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+              hClose stream
+              withLambdasOf forking $ \file ->
+                withStdin recursive $
+                  testCLISucceeded
+                    ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"]
+                    []
+              lines <$> readProtocol path
+      it "answers the fork it cuts with a fresh symbol and goes on" $
+        withLambdasOf forking $ \file ->
+          withStdin recursive $
+            testCLISucceeded ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2"] ["40-45-00-00-00-00-00-00"]
+
+      it "writes the loop it cuts as a call of the object whose bindings the copy repeats exactly" $
+        recorded >>= (`shouldSatisfy` any (isInfixOf "looped 𝜎5 := Φ.p  #"))
+
+      it "dont get stuck above the fork it cuts" $
+        recorded >>= (`shouldNotSatisfy` any (isInfixOf "stuck L_dataized"))
+
+    describe "--acyclic at a fork nested in a side of another fork" $ do
+      let recursive = "⟦ dataized(target) ↦ ⟦ λ ⤍ L_dataized ⟧, bool(fork) ↦ ⟦ if ↦ ξ.fork ⟧, num(φ) ↦ ⟦⟧, p ↦ ⟦ φ ↦ Φ.bool( ⟦ λ ⤍ L_fork, left ↦ ∅, right ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎4 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧ ).if( Φ.num( ⟦ λ ⤍ 𝜎5 ⟧ ), Φ.bool( ⟦ λ ⤍ L_fork, left ↦ ∅, right ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎6 ⟧, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧ ).if( Φ.num( ⟦ λ ⤍ 𝜎3 ⟧ ), Φ.num( Φ.dataized( Φ.p ) ) ) ) ⟧, x ↦ Φ.p ⟧"
+          forking = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  join:\n    on: 𝛿1\n    left: 𝑛3\n    right: 𝑛4\n    otherwise: L_fork\n- λ: L_dataized\n  dataize:\n    𝛿1: $.target\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n"
+          recorded :: IO [String]
+          recorded =
+            withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+              hClose stream
+              withLambdasOf forking $ \file ->
+                withStdin recursive $
+                  testCLISucceeded
+                    ["dataize", "--symbolic=" ++ file, "--locator=Q.x", "--acyclic=plausible", "--max-loops=2", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"]
+                    []
+              lines <$> readProtocol path
+      it "writes the loop it cuts at the fabricated fork by its symbol alone, since no fact names it" $
+        recorded >>= (`shouldSatisfy` any (isInfixOf "looped 𝜎7  # 𝔻(𝑛·9·12), plausible"))
+
+      it "dont get stuck above the nested fork it cuts" $
+        recorded >>= (`shouldNotSatisfy` any (isInfixOf "stuck L_dataized"))
+
+    describe "--acyclic at copies of one atom called from different places" $
+      it "dont cut a copy of an atom that only resembles the copies open above it" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withLambdasOf (T.pack "- λ: L_d\n  dataize:\n    𝛿1: $.t\n  𝑛: Φ.w( φ ↦ ⟦ λ ⤍ 𝜎 ⟧ )\n") $ \file ->
+            withStdin "⟦ w ↦ ⟦ φ ↦ ∅, me ↦ ξ, you ↦ ξ, x ↦ Φ.d( t ↦ ξ ).me.you ⟧, d(t) ↦ ⟦ λ ⤍ L_d ⟧, e ↦ Φ.d( t ↦ Φ.d( t ↦ Φ.d( t ↦ ⟦ φ ↦ Φ.d( t ↦ ⟦ Δ ⤍ 01- ⟧ ).x ⟧ ) ) ) ⟧" $
+              testCLISucceeded
+                ["dataize", "--symbolic=" ++ file, "--locator=Q.e", "--acyclic=plausible", "--max-loops=2", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"]
+                []
+          records <- readProtocol path
+          lines records `shouldNotSatisfy` any (isInfixOf "looped")
+
+    describe "--acyclic at a fork whose side grows the argument of a copy" $
+      it "cuts the recursion that the side of the fork runs" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withLambdasOf (T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.on🌵\n  morph:\n    𝑛1: $.left🌵\n    𝑛2: $.right🌵\n  stay:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  evaluate:\n    𝑛5: 𝑛3\n    𝑛6: 𝑛4\n  undress:\n    𝑛15: 𝑛5\n    𝑛16: 𝑛6\n  symbolize:\n    𝑛11: 𝑛15\n    𝑛12: 𝑛16\n  defer:\n    𝑛13: 𝑛11\n    𝑛14: 𝑛12\n  cast:\n    𝑛19: 𝑛13\n    𝑛20: 𝑛14\n  join:\n    on: 𝛿1\n    left: 𝑛19\n    right: 𝑛20\n    otherwise: L_fork\n") $ \file ->
+            withStdin "⟦ bit(fork) ↦ ⟦ if ↦ ξ.fork, φ ↦ ξ.fork( FF-:Δ, 00-:Δ ) ⟧, no ↦ Φ.bit( ⟦ λ ⤍ L_fork, left ↦ ∅, right ↦ ∅, on🌵 ↦ 00-:Δ, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧ ), maybe ↦ Φ.bit( ⟦ λ ⤍ L_fork, left ↦ ∅, right ↦ ∅, on🌵 ↦ 𝜎1:λ, left🌵 ↦ ξ.left, right🌵 ↦ ξ.right ⟧ ), next(x) ↦ ⟦ φ ↦ ξ.x ⟧, down(i) ↦ ⟦ φ ↦ Φ.maybe.if( Φ.no, Φ.down( Φ.next( ξ.i ) ) ) ⟧, l🌵 ↦ ⟦ e1 ↦ Φ.down( i ↦ 𝜎3:λ ).if( FF-:Δ, 00-:Δ ) ⟧ ⟧" $
+              testCLISucceeded
+                ["dataize", "--symbolic=" ++ file, "--locator=Q.l🌵.e1", "--acyclic=plausible", "--max-loops=2", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho", "--max-steps=1000", "--max-seconds=10"]
+                []
+          records <- readProtocol path
+          lines records `shouldSatisfy` any (isInfixOf "looped")
+
+    it "dataizes with --sequence" $
+      withStdin "[[ @ -> $.f(y -> [[ ]]), f -> [[ D> 00-, y -> ? ]] ]]" $
+        testCLISucceeded
+          ["dataize", "--sequence", "--output=latex", "--flat", "--sweet"]
+          [ intercalate
+              "\n"
+              [ "\\begin{phiquation}"
+              , "[[ @ -> |f| ( |y| -> [[]] ), |f|(|y|) -> |00-| : D ]] \\phiDataize[\\nameref{r:box}]"
+              , "  \\phiDataize [[ @ -> |f| ( |y| -> [[]] ), |f|(|y|) -> |00-| : D ]] . @ \\phiNormalize[\\nameref{r:dot}]"
+              , "  \\phiNormalize [[ |f|(|y|) -> |00-| : D ]] . |f| ( |y| -> [[]], \\phiTerminal{\\rho} -> Q ) \\phiNormalize[\\nameref{r:dot}]"
+              , "  \\phiNormalize [[ D> |00-|, |y| -> ? ]] ( \\phiTerminal{\\rho} -> [[ |f|(|y|) -> |00-| : D ]], |y| -> [[]], \\phiTerminal{\\rho} -> Q ) \\phiNormalize[\\nameref{r:skip}]"
+              , "  \\phiNormalize [[ D> |00-|, |y| -> ? ]] ( |y| -> [[]], \\phiTerminal{\\rho} -> Q ) \\phiNormalize[\\nameref{r:copy}]"
+              , "  \\phiNormalize [[ D> |00-|, |y| -> [[]] ]] ( \\phiTerminal{\\rho} -> Q ) \\phiNormalize[\\nameref{r:skip}]"
+              , "  \\phiNormalize [[ D> |00-|, |y| -> [[]] ]] \\phiDataize[\\nameref{r:delta}]"
+              , "  \\phiDataize |00-|{.}"
+              , "\\end{phiquation}"
+              , "00-"
+              ]
+          ]
+
+    it "keeps the delta step in --sequence under --quiet" $
+      withStdin "[[ D> 01- ]]" $
+        testCLISucceeded
+          ["dataize", "--sequence", "--quiet", "--output=latex", "--flat", "--sweet"]
+          [ intercalate
+              "\n"
+              [ "|01-| : D \\phiDataize[\\nameref{r:delta}]"
+              , "  \\phiDataize |01-|{.}"
+              , "\\end{phiquation}"
+              ]
+          ]
+
+    it "ends the phi --sequence at the bare data" $
+      withStdin "[[ D> 01- ]]" $
+        testCLISucceeded
+          ["dataize", "--sequence", "--quiet", "--flat", "--sweet"]
+          ["01-:Δ\n01-"]
+
+    it "focuses a compressed sequence whose meet replaces a step root" $
+      withStdin "[[ @ -> [[ @ -> $.c.plus( 32.0 ), c -> 25.0 ]], bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus -> [[ ^ -> ?, x -> ?, L> L_number_plus ]] ]] ]]" $
+        testCLISucceeded
+          ["dataize", symbolic, "--output=latex", "--sweet", "--nonumber", "--compress", "--canonize", "--meet-prefix=dataization", "--sequence", "--flat", "--quiet", "--hide=Q.bytes", "--hide=Q.number", "--locator=Q.@", "--focus=Q.@", "--meet-length=5", "--meet-popularity=1"]
+          ["\\phinoMeet{dataization:1}{ [[ @ -> |c| . |plus| ( |32.0| ), |c| -> |25.0| ]] } \\phiDataize[\\nameref{r:box}]"]
+
+    it "compresses a canonized whole-expression sequence into a meet" $
+      withStdin "[[ @ -> [[ @ -> $.c.plus( 32.0 ), c -> 25.0 ]], bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus -> [[ ^ -> ?, x -> ?, L> L_number_plus ]] ]] ]]" $
+        testCLISucceeded
+          ["dataize", symbolic, "--output=latex", "--sweet", "--nonumber", "--compress", "--canonize", "--meet-prefix=dataization", "--sequence", "--flat", "--quiet", "--meet-length=5", "--meet-popularity=1"]
+          ["\\phinoMeet{dataization:1}"]
+
+    it "canonizes the residue it prints with --partial" $
+      withStdin "[[ @ -> [[ L> Foo ]] ]]" $
+        testCLISucceeded ["dataize", "--partial", "--canonize", "--flat", "--sweet"] ["Fn1:λ"]
+
+    it "hides an object outside the residue --locator aims at with --partial" $
+      withStdin "[[ t -> [[ @ -> [[ L> Foo ]] ]], o -> [[ D> 03- ]] ]]" $
+        testCLISucceeded ["dataize", "--partial", "--locator=Q.t", "--hide=Q.o", "--flat", "--sweet"] ["Foo:λ"]
+
+    it "dataizes with --locator" $
+      withStdin "[[ ex -> [[ @ -> Q.x ]], x -> [[ D> 42- ]] ]]" $
+        testCLISucceeded ["dataize", "--locator=Q.ex"] ["42-"]
+
+    it "does not print bytes with --quiet" $
+      withStdin "[[ D> 01- ]]" $
+        testCLISucceeded ["dataize", "--quiet"] []
+
+    describe "--abridged" $ do
+      let wide = "⟦ t ↦ ⟦ φ ↦ ⟦ Δ ⤍ 01-02 ⟧, anfang ↦ ξ.schluss, mitte ↦ ξ.anfang, schluss ↦ ξ.mitte, rand ↦ ξ.schluss ⟧ ⟧"
+          stuck = "⟦ t ↦ ⟦ λ ⤍ L_weit, anfang ↦ ξ.schluss, mitte ↦ ξ.anfang, schluss ↦ ξ.mitte, rand ↦ ξ.schluss ⟧ ⟧"
+      it "folds a long formation in the text protocol" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin stuck $
+            testCLISucceeded ["dataize", "--locator=Q.t", "--partial", "--minutes=" ++ path, "--abridged", "--sweet", "--hide-rho", "--quiet"] []
+          records <- readProtocol path
+          lines records `shouldContain` ["  unanswered L_weit  # 𝔻(⟦ λ ⤍ L_weit, +4 ⟧)"]
+      it "names a long formation in the XML protocol by its path rather than folding it" $
+        withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+          hClose stream
+          withStdin stuck $
+            testCLISucceeded ["dataize", "--locator=Q.t", "--partial", "--protocol=" ++ path, "--abridged", "--sweet", "--hide-rho", "--quiet"] []
+          records <- readProtocol path
+          lines records `shouldContain` ["  <unanswered λ=\"L_weit\" by=\"dataize\">Φ.t</unanswered>"]
+      forM_
+        [ ("textXXXXXX.txt", "      𝛿·1·1 := 01-02-..(8b)..-0B-0C")
+        , ("XMLXXXXXX.xml", "      <dataized meta=\"𝛿·1·1\">01-02-..(8b)..-0B-0C</dataized>")
+        ]
+        ( \(template, line) ->
+            it ("cuts a long datum a firing came down to under --abridged-data, as " ++ line) $
+              withTempFile template $ \(path, stream) -> do
+                hClose stream
+                withLambdasOf (T.pack "- λ: L_outer\n  dataize:\n    𝛿1: ξ.arg\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n") $ \outer ->
+                  withStdin "⟦ x ↦ ⟦ arg ↦ ⟦ Δ ⤍ 01-02-03-04-05-06-07-08-09-0A-0B-0C ⟧, λ ⤍ L_outer ⟧ ⟧" $
+                    testCLISucceeded ["dataize", "--symbolic=" ++ outer, "--locator=Q.x", "--partial", recording path, "--abridged", "--abridged-data", "--sweet", "--hide-rho", "--quiet"] []
+                records <- readProtocol path
+                lines records `shouldContain` [line]
+        )
+      forM_
+        [ ("textXXXXXX.txt", "      𝛿·1·1 := 30-31-32-33-34-35-36-37-38-39-41-42-43-44-45-46")
+        , ("XMLXXXXXX.xml", "      <dataized meta=\"𝛿·1·1\">30-31-32-33-34-35-36-37-38-39-41-42-43-44-45-46</dataized>")
+        ]
+        ( \(template, line) ->
+            it ("keeps a long datum a firing came down to whole without --abridged-data, as " ++ line) $
+              withTempFile template $ \(path, stream) -> do
+                hClose stream
+                withLambdasOf (T.pack "- λ: L_hex\n  dataize:\n    𝛿1: ξ.arg\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n") $ \hex ->
+                  withStdin "⟦ x ↦ ⟦ arg ↦ ⟦ Δ ⤍ 30-31-32-33-34-35-36-37-38-39-41-42-43-44-45-46 ⟧, λ ⤍ L_hex ⟧ ⟧" $
+                    testCLISucceeded ["dataize", "--symbolic=" ++ hex, "--locator=Q.x", "--partial", recording path, "--abridged", "--sweet", "--hide-rho", "--quiet"] []
+                records <- readProtocol path
+                lines records `shouldContain` [line]
+        )
+      it "folds a long formation under the width given as the value" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin stuck $
+            testCLISucceeded ["dataize", "--locator=Q.t", "--partial", "--minutes=" ++ path, "--abridged=64", "--sweet", "--hide-rho", "--quiet"] []
+          records <- readProtocol path
+          lines records `shouldContain` ["  unanswered L_weit  # 𝔻(⟦ λ ⤍ L_weit, +4 ⟧)"]
+      it "keeps a formation whole under a width it fits in" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin stuck $
+            testCLISucceeded ["dataize", "--locator=Q.t", "--partial", "--minutes=" ++ path, "--abridged=200", "--sweet", "--hide-rho", "--quiet"] []
+          records <- readProtocol path
+          lines records `shouldContain` ["  unanswered L_weit  # 𝔻(⟦ λ ⤍ L_weit, anfang ↦ schluss, mitte ↦ anfang, schluss ↦ mitte, rand ↦ schluss ⟧)"]
+      it "refuses a width that is not a number" $
+        withStdin wide $
+          testCLIFailed ["dataize", "--locator=Q.t", "--protocol=breit.txt", "--abridged=breit"] ["cannot parse value `breit'"]
+      it "leaves the printed result whole" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin wide $
+            testCLISucceeded ["morph", "--locator=Q.t", "--minutes=" ++ path, "--abridged", "--sweet", "--hide-rho", "--flat"] ["anfang ↦ schluss, mitte ↦ anfang"]
+      it "refuses the flag without a protocol" $
+        withStdin wide $
+          testCLIFailed ["dataize", "--locator=Q.t", "--abridged"] ["The option --abridged requires --protocol"]
+      it "refuses to cut the data in dataize without --abridged" $
+        withStdin wide $
+          testCLIFailed ["dataize", "--locator=Q.t", "--protocol=daten.txt", "--abridged-data"] ["The option --abridged-data requires --abridged"]
+      it "refuses to cut the data in morph without --abridged" $
+        withStdin wide $
+          testCLIFailed ["morph", "--locator=Q.t", "--protocol=daten.xml", "--abridged-data"] ["The option --abridged-data requires --abridged"]
+
+    describe "--protocol" $ do
+      let sum' = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> 5.plus(6) ]]"
+          chained = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> 5.plus(6).plus(7) ]]"
+          nested = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> 5.plus(6.plus(7)) ]]"
+          mixed = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]], times(^, x) -> [[ L> L_number_times ]] ]], @ -> 5.plus(6).times(7) ]]"
+      it "opens the protocol with the run it is the protocol of" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin "[[ D> 01- ]]" $
+            testCLISucceeded ["dataize", "--minutes=" ++ path, "--quiet"] []
+          records <- readProtocol path
+          records `shouldBe` "𝔻(Φ):\n  𝛿·0·1 := 01-\n"
+
+      it "opens the protocol with a header naming the phino that wrote it" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin "[[ D> 01- ]]" $
+            testCLISucceeded ["dataize", "--minutes=" ++ path, "--quiet"] []
+          records <- readUtf8 path
+          records `shouldSatisfy` isPrefixOf ("# Written by phino " ++ showVersion version ++ " ")
+
+      it "writes the command line of the run into the header" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin "[[ D> 01- ]]" $
+            testCLISucceeded ["dataize", "--minutes=" ++ takeFileName path, "--quiet"] []
+          records <- readUtf8 path
+          lines records `shouldContain` ["# Command: phino dataize --minutes=" ++ takeFileName path ++ " --quiet"]
+
+      it "writes the world read from the standard input into the header" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $
+            testCLISucceeded ["dataize", "--locator=Q.t", "--minutes=" ++ path, "--quiet"] []
+          records <- readUtf8 path
+          lines records `shouldContain` ["# World: stdin, 1 line, 32 bytes, 1 object at the top, 2 bindings"]
+
+      it "writes the world read from a file into the header" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withTempFileContent "worldXXXXXX.phi" "[[\n  t -> [[ D> 01- ]]\n]]\n" $ \world -> do
+            testCLISucceeded ["dataize", "--locator=Q.t", "--minutes=" ++ path, "--quiet", world] []
+            records <- readUtf8 path
+            lines records `shouldContain` [printf "# World: %s, 3 lines, 26 bytes, 1 object at the top, 2 bindings" world]
+
+      it "writes the λ functions of the run into the header" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin sum' $
+            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet"] []
+          records <- readUtf8 path
+          lines records `shouldContain` [printf "# Symbolic: %s, 5 entries" lambdasFile]
+
+      it "writes the locator of the run into the header" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $
+            testCLISucceeded ["dataize", "--locator=Q.t", "--minutes=" ++ path, "--quiet"] []
+          records <- readUtf8 path
+          lines records `shouldContain` ["# Locator: Φ.t"]
+
+      it "writes the expression the locator points at into the header" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $
+            testCLISucceeded ["dataize", "--locator=Q.t", "--minutes=" ++ path, "--quiet"] []
+          records <- readUtf8 path
+          lines records `shouldContain` ["# Expression: ⟦ Δ ⤍ 01- ⟧"]
+
+      it "writes the expression given to --inside into the header" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $
+            testCLISucceeded ["morph", "--inside=Φ.t", "--minutes=" ++ path, "--quiet"] []
+          records <- readUtf8 path
+          lines records `shouldContain` ["# Expression: Φ.t"]
+
+      it "writes the header into the XML protocol" $
+        withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+          hClose stream
+          withStdin "⟦ t ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $
+            testCLISucceeded ["dataize", "--locator=Q.t", "--protocol=" ++ path, "--quiet"] []
+          records <- readUtf8 path
+          lines records `shouldContain` ["  <locator>Φ.t</locator>"]
+
+      it "closes the protocol with its msec on the third line from the end" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin sum' $
+            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet"] []
+          records <- readUtf8 path
+          (lines records !! (length (lines records) - 3)) `shouldSatisfy` isPrefixOf "msec "
+
+      it "closes the protocol with the firings it counted" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin sum' $
+            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet"] []
+          records <- readUtf8 path
+          lines records `shouldContain` ["firings 1"]
+
+      it "closes the protocol with its fps on the last line" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin sum' $
+            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet"] []
+          records <- readUtf8 path
+          last (lines records) `shouldSatisfy` isPrefixOf "fps "
+
+      it "closes the protocol with zero firings when the run fires nothing" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin "[[ D> 01- ]]" $
+            testCLISucceeded ["dataize", "--minutes=" ++ path, "--quiet"] []
+          records <- readUtf8 path
+          lines records `shouldContain` ["firings 0"]
+
+      it "writes one line per operand and one per answer of a firing" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin sum' $
+            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+          records <- readProtocol path
+          lines records
+            `shouldBe` [ "𝔻(Φ):"
+                       , "  boxed 𝑛·0·1 := Φ.φ"
+                       , "  normalized 𝑛·0·2 := 5.0.plus( 6.0 )  # Φ.φ"
+                       , "  𝕄(𝑛·0·1):"
+                       , "    normalized 𝑛·0·3 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number"
+                       , "    𝑛·0·4 := 5.0"
+                       , "    𝑛·0·5 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                       , "    normalized 𝑛·0·6 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·5.plus"
+                       , "    𝑛·0·7 := 𝑛·0·4.plus( x ↦ 6.0 )"
+                       , "    𝑛·0·8 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"
+                       , "    morphed 𝑛·0·9 := 𝑛·0·8"
+                       , "  𝔼(L_number_plus):  # 𝔻(𝑛·0·1)"
+                       , "    𝔻(ξ.ρ):"
+                       , "      𝕄(ξ.ρ):"
+                       , "        𝑛·1·1 := 5.0"
+                       , "        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                       , "        morphed 𝑛·1·3 := 𝑛·1·2"
+                       , "      boxed 𝑛·1·4 := 𝑛·1·3.φ"
+                       , "      normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4"
+                       , "      𝕄(𝑛·1·4):"
+                       , "        normalized 𝑛·1·6 := ∅:φ  # Φ.bytes"
+                       , "        𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"
+                       , "        𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ"
+                       , "        morphed 𝑛·1·9 := 𝑛·1·8"
+                       , "      boxed 𝑛·1·10 := 𝑛·1·9.φ"
+                       , "      normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10"
+                       , "      𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"
+                       , "    𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
+                       , "    𝔻(ξ.x):"
+                       , "      𝕄(ξ.x):"
+                       , "        𝑛·1·12 := 6.0"
+                       , "        𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                       , "        morphed 𝑛·1·14 := 𝑛·1·13"
+                       , "      boxed 𝑛·1·15 := 𝑛·1·14.φ"
+                       , "      normalized 𝑛·1·16 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )  # 𝑛·1·15"
+                       , "      𝕄(𝑛·1·15):"
+                       , "        𝑛·1·17 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"
+                       , "        𝑛·1·18 := 40-18-00-00-00-00-00-00:Δ:φ"
+                       , "        morphed 𝑛·1·19 := 𝑛·1·18"
+                       , "      boxed 𝑛·1·20 := 𝑛·1·19.φ"
+                       , "      normalized 𝑛·1·21 := 40-18-00-00-00-00-00-00:Δ  # 𝑛·1·20"
+                       , "      𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"
+                       , "    𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
+                       , "    𝑛·1·22 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
+                       , "    𝕄(𝑛·1·22):"
+                       , "      𝑛·1·23 := Φ.number( φ ↦ 𝜎1:λ )"
+                       , "      𝑛·1·24 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"
+                       , "      morphed 𝑛·1·25 := 𝑛·1·24"
+                       , "    𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·22)"
+                       , "  boxed 𝑛·0·10 := 𝑛·1·26.φ"
+                       , "  normalized 𝑛·0·11 := 𝜎1:λ  # 𝑛·0·10"
+                       , "  𝛿·0·1 := 𝔻(𝜎1:λ)"
+                       ]
+
+      it "writes what every morphing a dataization ran came to" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withLambdasOf (T.pack "- λ: L_make\n  𝑛: ⟦ φ ↦ Φ.bytes( φ ↦ ⟦ λ ⤍ 𝜎 ⟧ ) ⟧\n") $ \makes ->
+            withStdin "⟦ bytes ↦ ⟦ φ ↦ ∅ ⟧, make ↦ ⟦ λ ⤍ L_make ⟧, foo ↦ ⟦ φ ↦ Φ.make ⟧, e ↦ Φ.foo ⟧" $
+              testCLISucceeded ["dataize", "--symbolic=" ++ makes, "--locator=Q.e", "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+          records <- readProtocol path
+          lines records
+            `shouldBe` [ "𝔻(Φ.e):"
+                       , "  𝕄(Φ.e):"
+                       , "    remembered 𝑛·0·1 ≡ Φ.foo  # Φ.make:φ"
+                       , "    morphed 𝑛·0·2 := 𝑛·0·1"
+                       , "  boxed 𝑛·0·3 := 𝑛·0·2.φ"
+                       , "  normalized 𝑛·0·4 := Φ.make  # 𝑛·0·3"
+                       , "  𝕄(𝑛·0·3):"
+                       , "    remembered 𝑛·0·5 ≡ Φ.make  # L_make:λ"
+                       , "    morphed 𝑛·0·6 := 𝑛·0·5"
+                       , "  𝔼(L_make):  # 𝔻(𝑛·0·3)"
+                       , "    𝑛·1·1 := Φ.bytes( φ ↦ 𝜎1:λ ):φ  # 𝑛"
+                       , "    𝕄(𝑛·1·1):"
+                       , "      morphed 𝑛·1·2 := Φ.bytes( φ ↦ 𝜎1:λ ):φ"
+                       , "    𝑛·1·3 := 𝑛·1·2  # 𝕄(𝑛·1·1)"
+                       , "    remembered 𝑛·1·3 ≡ 𝑛·0·5"
+                       , "  boxed 𝑛·0·7 := 𝑛·1·3.φ"
+                       , "  normalized 𝑛·0·8 := Φ.bytes( φ ↦ 𝜎1:λ )  # 𝑛·0·7"
+                       , "  𝕄(𝑛·0·7):"
+                       , "    normalized 𝑛·0·9 := ∅:φ  # Φ.bytes"
+                       , "    𝑛·0·10 := Φ.bytes( φ ↦ 𝜎1:λ )"
+                       , "    𝑛·0·11 := 𝜎1:λ:φ"
+                       , "    morphed 𝑛·0·12 := 𝑛·0·11"
+                       , "  boxed 𝑛·0·13 := 𝑛·0·12.φ"
+                       , "  normalized 𝑛·0·14 := 𝜎1:λ  # 𝑛·0·13"
+                       , "  𝛿·0·1 := 𝔻(𝜎1:λ)"
+                       ]
+
+      it "numbers the firings of one entry apart and names the symbol between them" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin chained $
+            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+          records <- readProtocol path
+          lines records
+            `shouldBe` [ "𝔻(Φ):"
+                       , "  boxed 𝑛·0·1 := Φ.φ"
+                       , "  normalized 𝑛·0·2 := 5.0.plus( 6.0 ).plus( 7.0 )  # Φ.φ"
+                       , "  𝕄(𝑛·0·1):"
+                       , "    normalized 𝑛·0·3 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number"
+                       , "    𝑛·0·4 := 5.0"
+                       , "    𝑛·0·5 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                       , "    normalized 𝑛·0·6 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·5.plus"
+                       , "    𝑛·0·7 := 𝑛·0·4.plus( x ↦ 6.0 )"
+                       , "    𝑛·0·8 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"
+                       , "    𝔼(L_number_plus):"
+                       , "      𝔻(ξ.ρ):"
+                       , "        𝕄(ξ.ρ):"
+                       , "          𝑛·1·1 := 5.0"
+                       , "          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                       , "          morphed 𝑛·1·3 := 𝑛·1·2"
+                       , "        boxed 𝑛·1·4 := 𝑛·1·3.φ"
+                       , "        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4"
+                       , "        𝕄(𝑛·1·4):"
+                       , "          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes"
+                       , "          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"
+                       , "          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ"
+                       , "          morphed 𝑛·1·9 := 𝑛·1·8"
+                       , "        boxed 𝑛·1·10 := 𝑛·1·9.φ"
+                       , "        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10"
+                       , "        𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"
+                       , "      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
+                       , "      𝔻(ξ.x):"
+                       , "        𝕄(ξ.x):"
+                       , "          𝑛·1·12 := 6.0"
+                       , "          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                       , "          morphed 𝑛·1·14 := 𝑛·1·13"
+                       , "        boxed 𝑛·1·15 := 𝑛·1·14.φ"
+                       , "        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )  # 𝑛·1·15"
+                       , "        𝕄(𝑛·1·15):"
+                       , "          𝑛·1·17 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"
+                       , "          𝑛·1·18 := 40-18-00-00-00-00-00-00:Δ:φ"
+                       , "          morphed 𝑛·1·19 := 𝑛·1·18"
+                       , "        boxed 𝑛·1·20 := 𝑛·1·19.φ"
+                       , "        normalized 𝑛·1·21 := 40-18-00-00-00-00-00-00:Δ  # 𝑛·1·20"
+                       , "        𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"
+                       , "      𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
+                       , "      𝑛·1·22 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
+                       , "      𝕄(𝑛·1·22):"
+                       , "        𝑛·1·23 := Φ.number( φ ↦ 𝜎1:λ )"
+                       , "        𝑛·1·24 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"
+                       , "        morphed 𝑛·1·25 := 𝑛·1·24"
+                       , "      𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·22)"
+                       , "    normalized 𝑛·0·9 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·1·26.plus"
+                       , "    𝑛·0·10 := 𝑛·1·23.plus( x ↦ 7.0 )"
+                       , "    𝑛·0·11 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"
+                       , "    morphed 𝑛·0·12 := 𝑛·0·11"
+                       , "  𝔼(L_number_plus):  # 𝔻(𝑛·0·1)"
+                       , "    𝔻(ξ.ρ):"
+                       , "      𝕄(ξ.ρ):"
+                       , "        𝑛·2·1 := Φ.number( φ ↦ 𝜎1:λ )"
+                       , "        𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"
+                       , "        morphed 𝑛·2·3 := 𝑛·1·26"
+                       , "      boxed 𝑛·2·4 := 𝑛·2·3.φ"
+                       , "      normalized 𝑛·2·5 := 𝜎1:λ  # 𝑛·2·4"
+                       , "      𝛿·2·1 := 𝔻(𝜎1:λ)"
+                       , "    𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)"
+                       , "    𝔻(ξ.x):"
+                       , "      𝕄(ξ.x):"
+                       , "        𝑛·2·6 := 7.0"
+                       , "        𝑛·2·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                       , "        morphed 𝑛·2·8 := 𝑛·2·7"
+                       , "      boxed 𝑛·2·9 := 𝑛·2·8.φ"
+                       , "      normalized 𝑛·2·10 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )  # 𝑛·2·9"
+                       , "      𝕄(𝑛·2·9):"
+                       , "        𝑛·2·11 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )"
+                       , "        𝑛·2·12 := 40-1C-00-00-00-00-00-00:Δ:φ"
+                       , "        morphed 𝑛·2·13 := 𝑛·2·12"
+                       , "      boxed 𝑛·2·14 := 𝑛·2·13.φ"
+                       , "      normalized 𝑛·2·15 := 40-1C-00-00-00-00-00-00:Δ  # 𝑛·2·14"
+                       , "      𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0"
+                       , "    𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)"
+                       , "    𝑛·2·16 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛"
+                       , "    𝕄(𝑛·2·16):"
+                       , "      𝑛·2·17 := Φ.number( φ ↦ 𝜎2:λ )"
+                       , "      𝑛·2·18 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧"
+                       , "      morphed 𝑛·2·19 := 𝑛·2·18"
+                       , "    𝑛·2·20 := 𝑛·2·19  # 𝕄(𝑛·2·16)"
+                       , "  boxed 𝑛·0·13 := 𝑛·2·20.φ"
+                       , "  normalized 𝑛·0·14 := 𝜎2:λ  # 𝑛·0·13"
+                       , "  𝛿·0·1 := 𝔻(𝜎2:λ)"
+                       ]
+
+      it "numbers the firings of different entries apart" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin mixed $
+            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+          records <- readProtocol path
+          lines records
+            `shouldBe` [ "𝔻(Φ):"
+                       , "  boxed 𝑛·0·1 := Φ.φ"
+                       , "  normalized 𝑛·0·2 := 5.0.plus( 6.0 ).times( 7.0 )  # Φ.φ"
+                       , "  𝕄(𝑛·0·1):"
+                       , "    normalized 𝑛·0·3 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧  # Φ.number"
+                       , "    𝑛·0·4 := 5.0"
+                       , "    𝑛·0·5 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"
+                       , "    normalized 𝑛·0·6 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·5.plus"
+                       , "    𝑛·0·7 := 𝑛·0·4.plus( x ↦ 6.0 )"
+                       , "    𝑛·0·8 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"
+                       , "    𝔼(L_number_plus):"
+                       , "      𝔻(ξ.ρ):"
+                       , "        𝕄(ξ.ρ):"
+                       , "          𝑛·1·1 := 5.0"
+                       , "          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"
+                       , "          morphed 𝑛·1·3 := 𝑛·1·2"
+                       , "        boxed 𝑛·1·4 := 𝑛·1·3.φ"
+                       , "        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4"
+                       , "        𝕄(𝑛·1·4):"
+                       , "          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes"
+                       , "          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"
+                       , "          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ"
+                       , "          morphed 𝑛·1·9 := 𝑛·1·8"
+                       , "        boxed 𝑛·1·10 := 𝑛·1·9.φ"
+                       , "        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10"
+                       , "        𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"
+                       , "      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
+                       , "      𝔻(ξ.x):"
+                       , "        𝕄(ξ.x):"
+                       , "          𝑛·1·12 := 6.0"
+                       , "          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"
+                       , "          morphed 𝑛·1·14 := 𝑛·1·13"
+                       , "        boxed 𝑛·1·15 := 𝑛·1·14.φ"
+                       , "        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )  # 𝑛·1·15"
+                       , "        𝕄(𝑛·1·15):"
+                       , "          𝑛·1·17 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"
+                       , "          𝑛·1·18 := 40-18-00-00-00-00-00-00:Δ:φ"
+                       , "          morphed 𝑛·1·19 := 𝑛·1·18"
+                       , "        boxed 𝑛·1·20 := 𝑛·1·19.φ"
+                       , "        normalized 𝑛·1·21 := 40-18-00-00-00-00-00-00:Δ  # 𝑛·1·20"
+                       , "        𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"
+                       , "      𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
+                       , "      𝑛·1·22 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
+                       , "      𝕄(𝑛·1·22):"
+                       , "        𝑛·1·23 := Φ.number( φ ↦ 𝜎1:λ )"
+                       , "        𝑛·1·24 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"
+                       , "        morphed 𝑛·1·25 := 𝑛·1·24"
+                       , "      𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·22)"
+                       , "    normalized 𝑛·0·9 := ⟦ x ↦ ∅, λ ⤍ L_number_times ⟧  # 𝑛·1·26.times"
+                       , "    𝑛·0·10 := 𝑛·1·23.times( x ↦ 7.0 )"
+                       , "    𝑛·0·11 := ⟦ x ↦ 7.0, λ ⤍ L_number_times ⟧"
+                       , "    morphed 𝑛·0·12 := 𝑛·0·11"
+                       , "  𝔼(L_number_times):  # 𝔻(𝑛·0·1)"
+                       , "    𝔻(ξ.ρ):"
+                       , "      𝕄(ξ.ρ):"
+                       , "        𝑛·2·1 := Φ.number( φ ↦ 𝜎1:λ )"
+                       , "        𝑛·2·2 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"
+                       , "        morphed 𝑛·2·3 := 𝑛·1·26"
+                       , "      boxed 𝑛·2·4 := 𝑛·2·3.φ"
+                       , "      normalized 𝑛·2·5 := 𝜎1:λ  # 𝑛·2·4"
+                       , "      𝛿·2·1 := 𝔻(𝜎1:λ)"
+                       , "    𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)"
+                       , "    𝔻(ξ.x):"
+                       , "      𝕄(ξ.x):"
+                       , "        𝑛·2·6 := 7.0"
+                       , "        𝑛·2·7 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"
+                       , "        morphed 𝑛·2·8 := 𝑛·2·7"
+                       , "      boxed 𝑛·2·9 := 𝑛·2·8.φ"
+                       , "      normalized 𝑛·2·10 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )  # 𝑛·2·9"
+                       , "      𝕄(𝑛·2·9):"
+                       , "        𝑛·2·11 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )"
+                       , "        𝑛·2·12 := 40-1C-00-00-00-00-00-00:Δ:φ"
+                       , "        morphed 𝑛·2·13 := 𝑛·2·12"
+                       , "      boxed 𝑛·2·14 := 𝑛·2·13.φ"
+                       , "      normalized 𝑛·2·15 := 40-1C-00-00-00-00-00-00:Δ  # 𝑛·2·14"
+                       , "      𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0"
+                       , "    𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)"
+                       , "    𝑛·2·16 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛"
+                       , "    𝕄(𝑛·2·16):"
+                       , "      𝑛·2·17 := Φ.number( φ ↦ 𝜎2:λ )"
+                       , "      𝑛·2·18 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ, times(x) ↦ L_number_times:λ ⟧"
+                       , "      morphed 𝑛·2·19 := 𝑛·2·18"
+                       , "    𝑛·2·20 := 𝑛·2·19  # 𝕄(𝑛·2·16)"
+                       , "  boxed 𝑛·0·13 := 𝑛·2·20.φ"
+                       , "  normalized 𝑛·0·14 := 𝜎2:λ  # 𝑛·0·13"
+                       , "  𝛿·0·1 := 𝔻(𝜎2:λ)"
+                       ]
+
+      it "nests the firing an operand of another firing brought down" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin nested $
+            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+          records <- readProtocol path
+          lines records
+            `shouldBe` [ "𝔻(Φ):"
+                       , "  boxed 𝑛·0·1 := Φ.φ"
+                       , "  normalized 𝑛·0·2 := 5.0.plus( 6.0.plus( 7.0 ) )  # Φ.φ"
+                       , "  𝕄(𝑛·0·1):"
+                       , "    normalized 𝑛·0·3 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number"
+                       , "    𝑛·0·4 := 5.0"
+                       , "    𝑛·0·5 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                       , "    normalized 𝑛·0·6 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·5.plus"
+                       , "    𝑛·0·7 := 𝑛·0·4.plus( x ↦ 6.0.plus( 7.0 ) )"
+                       , "    𝑛·0·8 := ⟦ x ↦ 6.0.plus( 7.0 ), λ ⤍ L_number_plus ⟧"
+                       , "    morphed 𝑛·0·9 := 𝑛·0·8"
+                       , "  𝔼(L_number_plus):  # 𝔻(𝑛·0·1)"
+                       , "    𝔻(ξ.ρ):"
+                       , "      𝕄(ξ.ρ):"
+                       , "        𝑛·1·1 := 5.0"
+                       , "        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                       , "        morphed 𝑛·1·3 := 𝑛·1·2"
+                       , "      boxed 𝑛·1·4 := 𝑛·1·3.φ"
+                       , "      normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4"
+                       , "      𝕄(𝑛·1·4):"
+                       , "        normalized 𝑛·1·6 := ∅:φ  # Φ.bytes"
+                       , "        𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"
+                       , "        𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ"
+                       , "        morphed 𝑛·1·9 := 𝑛·1·8"
+                       , "      boxed 𝑛·1·10 := 𝑛·1·9.φ"
+                       , "      normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10"
+                       , "      𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"
+                       , "    𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
+                       , "    𝔻(ξ.x):"
+                       , "      𝕄(ξ.x):"
+                       , "        𝑛·1·12 := 6.0"
+                       , "        𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                       , "        normalized 𝑛·1·14 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·1·13.plus"
+                       , "        𝑛·1·15 := 𝑛·1·12.plus( x ↦ 7.0 )"
+                       , "        𝑛·1·16 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"
+                       , "        morphed 𝑛·1·17 := 𝑛·1·16"
+                       , "      𝔼(L_number_plus):"
+                       , "        𝔻(ξ.ρ):"
+                       , "          𝕄(ξ.ρ):"
+                       , "            𝑛·2·1 := 6.0"
+                       , "            𝑛·2·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                       , "            morphed 𝑛·2·3 := 𝑛·2·2"
+                       , "          boxed 𝑛·2·4 := 𝑛·2·3.φ"
+                       , "          normalized 𝑛·2·5 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )  # 𝑛·2·4"
+                       , "          𝕄(𝑛·2·4):"
+                       , "            𝑛·2·6 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"
+                       , "            𝑛·2·7 := 40-18-00-00-00-00-00-00:Δ:φ"
+                       , "            morphed 𝑛·2·8 := 𝑛·2·7"
+                       , "          boxed 𝑛·2·9 := 𝑛·2·8.φ"
+                       , "          normalized 𝑛·2·10 := 40-18-00-00-00-00-00-00:Δ  # 𝑛·2·9"
+                       , "          𝛿·2·1 := 40-18-00-00-00-00-00-00  # 6.0"
+                       , "        𝛿1·2 := 𝛿·2·1  # 𝔻(ξ.ρ)"
+                       , "        𝔻(ξ.x):"
+                       , "          𝕄(ξ.x):"
+                       , "            𝑛·2·11 := 7.0"
+                       , "            𝑛·2·12 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                       , "            morphed 𝑛·2·13 := 𝑛·2·12"
+                       , "          boxed 𝑛·2·14 := 𝑛·2·13.φ"
+                       , "          normalized 𝑛·2·15 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )  # 𝑛·2·14"
+                       , "          𝕄(𝑛·2·14):"
+                       , "            𝑛·2·16 := Φ.bytes( φ ↦ 40-1C-00-00-00-00-00-00:Δ )"
+                       , "            𝑛·2·17 := 40-1C-00-00-00-00-00-00:Δ:φ"
+                       , "            morphed 𝑛·2·18 := 𝑛·2·17"
+                       , "          boxed 𝑛·2·19 := 𝑛·2·18.φ"
+                       , "          normalized 𝑛·2·20 := 40-1C-00-00-00-00-00-00:Δ  # 𝑛·2·19"
+                       , "          𝛿·2·2 := 40-1C-00-00-00-00-00-00  # 7.0"
+                       , "        𝛿2·2 := 𝛿·2·2  # 𝔻(ξ.x)"
+                       , "        𝑛·2·21 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
+                       , "        𝕄(𝑛·2·21):"
+                       , "          𝑛·2·22 := Φ.number( φ ↦ 𝜎1:λ )"
+                       , "          𝑛·2·23 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"
+                       , "          morphed 𝑛·2·24 := 𝑛·2·23"
+                       , "        𝑛·2·25 := 𝑛·2·24  # 𝕄(𝑛·2·21)"
+                       , "      boxed 𝑛·1·18 := 𝑛·2·25.φ"
+                       , "      normalized 𝑛·1·19 := 𝜎1:λ  # 𝑛·1·18"
+                       , "      𝛿·1·2 := 𝔻(𝜎1:λ)"
+                       , "    𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
+                       , "    𝑛·1·20 := Φ.number( φ ↦ 𝜎2:λ )  # 𝑛"
+                       , "    𝕄(𝑛·1·20):"
+                       , "      𝑛·1·21 := Φ.number( φ ↦ 𝜎2:λ )"
+                       , "      𝑛·1·22 := ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧"
+                       , "      morphed 𝑛·1·23 := 𝑛·1·22"
+                       , "    𝑛·1·24 := 𝑛·1·23  # 𝕄(𝑛·1·20)"
+                       , "  boxed 𝑛·0·10 := 𝑛·1·24.φ"
+                       , "  normalized 𝑛·0·11 := 𝜎2:λ  # 𝑛·0·10"
+                       , "  𝛿·0·1 := 𝔻(𝜎2:λ)"
+                       ]
+
+      it "writes a stuck firing to the XML protocol" $
+        withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+          hClose stream
+          withLambdasOf (T.pack "- λ: L_outer\n  dataize:\n    𝛿1: ξ.arg\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n") $ \outer ->
+            withStdin "⟦ x ↦ ⟦ arg ↦ ⟦ λ ⤍ L_absent ⟧, λ ⤍ L_outer ⟧.φ ⟧" $
+              testCLISucceeded ["morph", "--symbolic=" ++ outer, "--locator=Q.x", "--partial", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+          records <- readProtocol path
+          lines records `shouldContain` ["    <stuck λ=\"L_absent\"/>"]
+
+      it "writes a starved step budget to the XML protocol" $
+        withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+          hClose stream
+          withLambdasOf (T.pack "- λ: L_outer\n  dataize:\n    𝛿1: ξ.arg\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n") $ \outer ->
+            withStdin "⟦ x ↦ ⟦ arg ↦ ⟦ φ ↦ ⟦ φ ↦ ⟦ Δ ⤍ 07- ⟧ ⟧ ⟧, λ ⤍ L_outer ⟧ ⟧" $
+              testCLISucceeded ["dataize", "--symbolic=" ++ outer, "--locator=Q.x", "--partial", "--max-steps=3", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho", "--flat"] []
+          records <- readProtocol path
+          lines records `shouldContain` ["      <starved limit=\"3\" by=\"dataize\" at=\"𝑛·1·3\"/>"]
+
+      forM_
+        [("XMLXXXXXX.xml", "<exceeded limit=\"7\" by=\"dataize\" at="), ("textXXXXXX.txt", "exceeded 7  # 𝔻(")]
+        $ \(template, record) ->
+          it ("writes the reached --max-cycles to the protocol " ++ template) $
+            withTempFile template $ \(path, stream) -> do
+              hClose stream
+              withStdin "⟦ m(p) ↦ ⟦ φ ↦ ξ.a( ξ.p ).φ, a(ρ, tup) ↦ ⟦ φ ↦ ρ.a( ξ.tup.tail ).φ ⟧ ⟧, x ↦ Φ.m( 𝜎1:λ ) ⟧" $
+                testCLISucceeded ["dataize", "--acyclic=plausible", "--max-loops=2", "--max-cycles=7", "--partial", "--locator=Q.x", recording path, "--quiet", "--sweet", "--hide-rho"] []
+              records <- readProtocol path
+              any (isPrefixOf record . dropWhile (== ' ')) (lines records) `shouldBe` True
+
+      forM_
+        [("XMLXXXXXX.xml", "<oversized limit=\"60\" by=\"morph\" at="), ("textXXXXXX.txt", "oversized 60")]
+        $ \(template, record) ->
+          it ("writes the reached --max-nodes to the protocol " ++ template) $
+            withTempFile template $ \(path, stream) -> do
+              hClose stream
+              withStdin "⟦ m(p) ↦ ⟦ φ ↦ ξ.a( ξ.p ).φ, a(ρ, tup) ↦ ⟦ φ ↦ ρ.a( ξ.tup.tail ).φ ⟧ ⟧, x ↦ Φ.m( 𝜎1:λ ) ⟧" $
+                testCLISucceeded ["dataize", "--acyclic=plausible", "--max-loops=2", "--max-nodes=60", "--partial", "--locator=Q.x", recording path, "--quiet", "--sweet", "--hide-rho"] []
+              records <- readProtocol path
+              any (isPrefixOf record . dropWhile (== ' ')) (lines records) `shouldBe` True
+
+      forM_
+        [("XMLXXXXXX.xml", "<blown limit=\"1K\" by="), ("textXXXXXX.txt", "blown 1K")]
+        $ \(template, record) ->
+          it ("writes the reached --max-memory to the protocol " ++ template) $
+            withTempFile template $ \(path, stream) -> do
+              hClose stream
+              withStdin "⟦ m(p) ↦ ⟦ φ ↦ ξ.a( ξ.p ).φ, a(ρ, tup) ↦ ⟦ φ ↦ ρ.a( ξ.tup.tail ).φ ⟧ ⟧, x ↦ Φ.m( 𝜎1:λ ) ⟧" $
+                testCLISucceeded ["dataize", "--acyclic=plausible", "--max-loops=2", "--max-memory=1K", "--partial", "--locator=Q.x", recording path, "--quiet", "--sweet", "--hide-rho"] []
+              records <- readProtocol path
+              any (isPrefixOf record . dropWhile (== ' ')) (lines records) `shouldBe` True
+
+      forM_
+        [("XMLXXXXXX.xml", "<spent limit=\"5\" by="), ("textXXXXXX.txt", "  spent 5")]
+        ( \(template, record) ->
+            it ("writes a spent firing budget to the protocol as " ++ record) $
+              withTempFile template $ \(path, stream) -> do
+                hClose stream
+                loopingLambdas $ \endless ->
+                  withStdin "⟦ @ ↦ ⟦ λ ⤍ L_loop ⟧ ⟧" $
+                    testCLIFailed ["dataize", "--symbolic=" ++ endless, "--max-steps=400", "--max-firings=5", recording path] ["--max-firings=5"]
+                records <- readProtocol path
+                any (record `isInfixOf`) (lines records) `shouldBe` True
+        )
+
+      it "keeps the lines of a run that fails" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]], nope -> [[ ^ -> ?, L> L_number_nope ]] ]], @ -> 5.plus(6).nope ]]" $
+            testCLIFailed
+              ["dataize", symbolic, "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"]
+              ["No entry of --symbolic answers the λ function 'L_number_nope'"]
+          records <- readProtocol path
+          lines records
+            `shouldBe` [ "𝔻(Φ):"
+                       , "  boxed 𝑛·0·1 := Φ.φ"
+                       , "  normalized 𝑛·0·2 := 5.0.plus( 6.0 ).nope  # Φ.φ"
+                       , "  𝕄(𝑛·0·1):"
+                       , "    normalized 𝑛·0·3 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ, nope ↦ L_number_nope:λ ⟧  # Φ.number"
+                       , "    𝑛·0·4 := 5.0"
+                       , "    𝑛·0·5 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, nope ↦ L_number_nope:λ ⟧"
+                       , "    normalized 𝑛·0·6 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·5.plus"
+                       , "    𝑛·0·7 := 𝑛·0·4.plus( x ↦ 6.0 )"
+                       , "    𝑛·0·8 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"
+                       , "    𝔼(L_number_plus):"
+                       , "      𝔻(ξ.ρ):"
+                       , "        𝕄(ξ.ρ):"
+                       , "          𝑛·1·1 := 5.0"
+                       , "          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, nope ↦ L_number_nope:λ ⟧"
+                       , "          morphed 𝑛·1·3 := 𝑛·1·2"
+                       , "        boxed 𝑛·1·4 := 𝑛·1·3.φ"
+                       , "        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4"
+                       , "        𝕄(𝑛·1·4):"
+                       , "          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes"
+                       , "          𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"
+                       , "          𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ"
+                       , "          morphed 𝑛·1·9 := 𝑛·1·8"
+                       , "        boxed 𝑛·1·10 := 𝑛·1·9.φ"
+                       , "        normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10"
+                       , "        𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"
+                       , "      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
+                       , "      𝔻(ξ.x):"
+                       , "        𝕄(ξ.x):"
+                       , "          𝑛·1·12 := 6.0"
+                       , "          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ, nope ↦ L_number_nope:λ ⟧"
+                       , "          morphed 𝑛·1·14 := 𝑛·1·13"
+                       , "        boxed 𝑛·1·15 := 𝑛·1·14.φ"
+                       , "        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )  # 𝑛·1·15"
+                       , "        𝕄(𝑛·1·15):"
+                       , "          𝑛·1·17 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"
+                       , "          𝑛·1·18 := 40-18-00-00-00-00-00-00:Δ:φ"
+                       , "          morphed 𝑛·1·19 := 𝑛·1·18"
+                       , "        boxed 𝑛·1·20 := 𝑛·1·19.φ"
+                       , "        normalized 𝑛·1·21 := 40-18-00-00-00-00-00-00:Δ  # 𝑛·1·20"
+                       , "        𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"
+                       , "      𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
+                       , "      𝑛·1·22 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
+                       , "      𝕄(𝑛·1·22):"
+                       , "        𝑛·1·23 := Φ.number( φ ↦ 𝜎1:λ )"
+                       , "        𝑛·1·24 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ, nope ↦ L_number_nope:λ ⟧"
+                       , "        morphed 𝑛·1·25 := 𝑛·1·24"
+                       , "      𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·22)"
+                       , "    normalized 𝑛·0·9 := L_number_nope:λ  # 𝑛·1·26.nope"
+                       , "    morphed 𝑛·0·10 := L_number_nope:λ"
+                       , "  unanswered L_number_nope  # 𝔻(L_number_nope:λ)"
+                       ]
+
+      it "truncates the lines left over from the previous run" $
+        withTempFileContent "protocolXXXXXX.txt" "𝔼(L_number_gt)\n" $ \path -> do
+          withStdin "[[ D> 01- ]]" $
+            testCLISucceeded ["dataize", "--minutes=" ++ path, "--quiet"] []
+          records <- readProtocol path
+          records `shouldBe` "𝔻(Φ):\n  𝛿·0·1 := 01-\n"
+
+      it "writes the lines in 𝜑 even with --output=xmir" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin sum' $
+            testCLISucceeded ["dataize", symbolic, "--minutes=" ++ path, "--output=xmir", "--quiet", "--sweet", "--hide-rho"] []
+          records <- readProtocol path
+          records `shouldEndWith` "    𝕄(𝑛·1·22):\n      𝑛·1·23 := Φ.number( φ ↦ 𝜎1:λ )\n      𝑛·1·24 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧\n      morphed 𝑛·1·25 := 𝑛·1·24\n    𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·22)\n  boxed 𝑛·0·10 := 𝑛·1·26.φ\n  normalized 𝑛·0·11 := 𝜎1:λ  # 𝑛·0·10\n  𝛿·0·1 := 𝔻(𝜎1:λ)\n"
+
+      it "numbers every step in the text as the XML of the same run numbers it" $
+        withTempFile "protocolXXXXXX.txt" $ \(text, one) ->
+          withTempFile "protocolXXXXXX.xml" $ \(xml, two) -> do
+            hClose one
+            hClose two
+            withStdin nested $
+              testCLISucceeded ["dataize", symbolic, "--minutes=" ++ text, "--quiet", "--sweet", "--hide-rho"] []
+            withStdin nested $
+              testCLISucceeded ["dataize", symbolic, "--protocol=" ++ xml, "--quiet", "--sweet", "--hide-rho"] []
+            lined <- readProtocol text
+            marked <- readProtocol xml
+            [meta | meta : ":=" : _ <- map (dropWhile (`elem` ["boxed", "morphed", "normalized", "fabricated"]) . words) (lines lined), "𝑛·" `isPrefixOf` meta]
+              `shouldBe` [takeWhile (/= '"') (drop 6 token) | token <- words marked, "meta=\"𝑛·" `isPrefixOf` token]
+
+      describe "as XML" $ do
+        it "writes the document when the file is named .xml" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withStdin sum' $
+              testCLISucceeded ["dataize", symbolic, "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+            records <- readProtocol path
+            lines records
+              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                         , "<dataize at=\"Φ\">"
+                         , "  <boxed meta=\"𝑛·0·1\">Φ.φ</boxed>"
+                         , "  <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"
+                         , "  <applied meta=\"𝑒·0·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·3\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"
+                         , "  <applied meta=\"𝑒·0·4\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·5\" of=\"𝑒·0·2.plus\"><meta attr=\"α0\">𝑒·0·4</meta><ref attr=\"ρ\">Φ</ref></applied>"
+                         , "  <normalized meta=\"𝑛·0·2\" of=\"Φ.φ\">𝑒·0·5</normalized>"
+                         , "  <morph at=\"𝑛·0·1\">"
+                         , "    <normalized meta=\"𝑛·0·3\" of=\"Φ.number\">Φ.number</normalized>"
+                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "    <formed meta=\"𝑛·0·5\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
+                         , "    <normalized meta=\"𝑛·0·6\" of=\"𝑛·0·5.plus\">𝑛·0·4.plus</normalized>"
+                         , "    <applied meta=\"𝑛·0·7\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·4.plus\"><meta attr=\"x\">𝑒·0·4</meta></applied>"
+                         , "    <formed meta=\"𝑛·0·8\" of=\"𝑛·0·4.plus\"><meta attr=\"x\">𝑒·0·4</meta></formed>"
+                         , "    <morphed meta=\"𝑛·0·9\">𝑛·0·8</morphed>"
+                         , "  </morph>"
+                         , "  <evaluate λ=\"L_number_plus\" by=\"dataize\" at=\"𝑛·0·1\">"
+                         , "    <dataize at=\"ξ.ρ\">"
+                         , "      <morph at=\"ξ.ρ\">"
+                         , "        <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "        <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
+                         , "        <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"
+                         , "      </morph>"
+                         , "      <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"
+                         , "      <applied meta=\"𝑒·1·1\" of=\"𝑒·0·1\"><meta attr=\"ρ\">𝑛·1·1</meta></applied>"
+                         , "      <normalized meta=\"𝑛·1·5\" of=\"𝑛·1·4\">𝑒·1·1</normalized>"
+                         , "      <morph at=\"𝑛·1·4\">"
+                         , "        <normalized meta=\"𝑛·1·6\" of=\"Φ.bytes\">Φ.bytes</normalized>"
+                         , "        <applied meta=\"𝑛·1·7\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"
+                         , "        <formed meta=\"𝑛·1·8\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></formed>"
+                         , "        <morphed meta=\"𝑛·1·9\">𝑛·1·8</morphed>"
+                         , "      </morph>"
+                         , "      <boxed meta=\"𝑛·1·10\">𝑛·1·9.φ</boxed>"
+                         , "      <normalized meta=\"𝑛·1·11\" of=\"𝑛·1·10\">40-14-00-00-00-00-00-00</normalized>"
+                         , "      <dataized meta=\"𝛿·1·1\" number=\"5.0\">40-14-00-00-00-00-00-00</dataized>"
+                         , "    </dataize>"
+                         , "    <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
+                         , "    <dataize at=\"ξ.x\">"
+                         , "      <morph at=\"ξ.x\">"
+                         , "        <applied meta=\"𝑛·1·12\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></applied>"
+                         , "        <formed meta=\"𝑛·1·13\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></formed>"
+                         , "        <morphed meta=\"𝑛·1·14\">𝑛·1·13</morphed>"
+                         , "      </morph>"
+                         , "      <boxed meta=\"𝑛·1·15\">𝑛·1·14.φ</boxed>"
+                         , "      <applied meta=\"𝑒·1·2\" of=\"𝑒·0·3\"><meta attr=\"ρ\">𝑛·1·12</meta></applied>"
+                         , "      <normalized meta=\"𝑛·1·16\" of=\"𝑛·1·15\">𝑒·1·2</normalized>"
+                         , "      <morph at=\"𝑛·1·15\">"
+                         , "        <applied meta=\"𝑛·1·17\" by=\"morph\" at=\"𝑛·1·15\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"
+                         , "        <formed meta=\"𝑛·1·18\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></formed>"
+                         , "        <morphed meta=\"𝑛·1·19\">𝑛·1·18</morphed>"
+                         , "      </morph>"
+                         , "      <boxed meta=\"𝑛·1·20\">𝑛·1·19.φ</boxed>"
+                         , "      <normalized meta=\"𝑛·1·21\" of=\"𝑛·1·20\">40-18-00-00-00-00-00-00</normalized>"
+                         , "      <dataized meta=\"𝛿·1·2\" number=\"6.0\">40-18-00-00-00-00-00-00</dataized>"
+                         , "    </dataize>"
+                         , "    <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"
+                         , "    <minted symbol=\"𝜎1\">40-14-00-00-00-00-00-00 40-18-00-00-00-00-00-00</minted>"
+                         , "    <applied meta=\"𝑒·1·3\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
+                         , "    <built meta=\"𝑛·1·22\">𝑒·1·3</built>"
+                         , "    <morph at=\"𝑛·1·22\">"
+                         , "      <applied meta=\"𝑛·1·23\" by=\"morph\" at=\"𝑛·1·22\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
+                         , "      <formed meta=\"𝑛·1·24\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"
+                         , "      <morphed meta=\"𝑛·1·25\">𝑛·1·24</morphed>"
+                         , "    </morph>"
+                         , "    <answered meta=\"𝑛·1·26\">𝑛·1·25</answered>"
+                         , "  </evaluate>"
+                         , "  <boxed meta=\"𝑛·0·10\">𝑛·1·26.φ</boxed>"
+                         , "  <normalized meta=\"𝑛·0·11\" of=\"𝑛·0·10\">𝜎1</normalized>"
+                         , "  <manufactured meta=\"𝛿·0·1\">𝜎1</manufactured>"
+                         , "</dataize>"
+                         ]
+
+        it "nests the judgment right inside the '<protocol>' root" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withStdin "[[ D> 01- ]]" $
+              testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []
+            records <- readUtf8 path
+            take 2 (dropWhile (not . isPrefixOf "  <dataize ") (lines records))
+              `shouldBe` [ "  <dataize at=\"Φ\">"
+                         , "    <dataized meta=\"𝛿·0·1\">01-</dataized>"
+                         ]
+
+        it "opens the '<protocol>' root right under the declaration" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withStdin "[[ D> 01- ]]" $
+              testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []
+            records <- readUtf8 path
+            take 2 (lines records) `shouldBe` ["<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "<protocol>"]
+
+        it "closes the '<protocol>' root with its msec" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withStdin "[[ D> 01- ]]" $
+              testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []
+            records <- readUtf8 path
+            (reverse (lines records) !! 3) `shouldSatisfy` isPrefixOf "  <msec>"
+
+        it "closes the '<protocol>' root with its firings" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withStdin "[[ D> 01- ]]" $
+              testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []
+            records <- readUtf8 path
+            lines records `shouldContain` ["  <firings>0</firings>"]
+
+        it "closes the '<protocol>' root with its fps, then '</protocol>' itself" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withStdin "[[ D> 01- ]]" $
+              testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []
+            records <- readUtf8 path
+            reverse (take 2 (reverse (lines records))) `shouldBe` ["  <fps>0</fps>", "</protocol>"]
+
+        it "nests what a φ body dataizes inside the element of the box rule that entered it" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withStdin sum' $
+              testCLISucceeded ["dataize", symbolic, "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+            records <- readProtocol path
+            filter (\line -> not (any (`isInfixOf` line) ["<applied ", "<formed ", "<morph ", "<morphed ", "<normalized ", "</morph>"])) (lines records)
+              `shouldContain` [ "    <dataize at=\"ξ.ρ\">"
+                              , "      <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"
+                              , "      <boxed meta=\"𝑛·1·10\">𝑛·1·9.φ</boxed>"
+                              , "      <dataized meta=\"𝛿·1·1\" number=\"5.0\">40-14-00-00-00-00-00-00</dataized>"
+                              , "    </dataize>"
+                              ]
+
+        it "closes the document even when nothing fires" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withStdin "[[ D> 01- ]]" $
+              testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []
+            records <- readProtocol path
+            lines records
+              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                         , "<dataize at=\"Φ\">"
+                         , "  <dataized meta=\"𝛿·0·1\">01-</dataized>"
+                         , "</dataize>"
+                         ]
+
+        it "tells a manufactured datum from data by the name of the element" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withStdin chained $
+              testCLISucceeded ["dataize", symbolic, "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+            records <- readProtocol path
+            lines records
+              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                         , "<dataize at=\"Φ\">"
+                         , "  <boxed meta=\"𝑛·0·1\">Φ.φ</boxed>"
+                         , "  <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"
+                         , "  <applied meta=\"𝑒·0·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·3\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"
+                         , "  <applied meta=\"𝑒·0·4\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·5\" of=\"𝑒·0·2.plus\"><meta attr=\"α0\">𝑒·0·4</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·6\" of=\"Φ.bytes\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></applied>"
+                         , "  <applied meta=\"𝑒·0·7\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·6</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·8\" of=\"𝑒·0·5.plus\"><meta attr=\"α0\">𝑒·0·7</meta><ref attr=\"ρ\">Φ</ref></applied>"
+                         , "  <normalized meta=\"𝑛·0·2\" of=\"Φ.φ\">𝑒·0·8</normalized>"
+                         , "  <morph at=\"𝑛·0·1\">"
+                         , "    <normalized meta=\"𝑛·0·3\" of=\"Φ.number\">Φ.number</normalized>"
+                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "    <formed meta=\"𝑛·0·5\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
+                         , "    <normalized meta=\"𝑛·0·6\" of=\"𝑛·0·5.plus\">𝑛·0·4.plus</normalized>"
+                         , "    <applied meta=\"𝑛·0·7\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·4.plus\"><meta attr=\"x\">𝑒·0·4</meta></applied>"
+                         , "    <formed meta=\"𝑛·0·8\" of=\"𝑛·0·4.plus\"><meta attr=\"x\">𝑒·0·4</meta></formed>"
+                         , "    <evaluate λ=\"L_number_plus\" by=\"morph\" at=\"𝑛·0·1\">"
+                         , "      <dataize at=\"ξ.ρ\">"
+                         , "        <morph at=\"ξ.ρ\">"
+                         , "          <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "          <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
+                         , "          <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"
+                         , "        </morph>"
+                         , "        <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"
+                         , "        <applied meta=\"𝑒·1·1\" of=\"𝑒·0·1\"><meta attr=\"ρ\">𝑛·1·1</meta></applied>"
+                         , "        <normalized meta=\"𝑛·1·5\" of=\"𝑛·1·4\">𝑒·1·1</normalized>"
+                         , "        <morph at=\"𝑛·1·4\">"
+                         , "          <normalized meta=\"𝑛·1·6\" of=\"Φ.bytes\">Φ.bytes</normalized>"
+                         , "          <applied meta=\"𝑛·1·7\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"
+                         , "          <formed meta=\"𝑛·1·8\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></formed>"
+                         , "          <morphed meta=\"𝑛·1·9\">𝑛·1·8</morphed>"
+                         , "        </morph>"
+                         , "        <boxed meta=\"𝑛·1·10\">𝑛·1·9.φ</boxed>"
+                         , "        <normalized meta=\"𝑛·1·11\" of=\"𝑛·1·10\">40-14-00-00-00-00-00-00</normalized>"
+                         , "        <dataized meta=\"𝛿·1·1\" number=\"5.0\">40-14-00-00-00-00-00-00</dataized>"
+                         , "      </dataize>"
+                         , "      <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
+                         , "      <dataize at=\"ξ.x\">"
+                         , "        <morph at=\"ξ.x\">"
+                         , "          <applied meta=\"𝑛·1·12\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></applied>"
+                         , "          <formed meta=\"𝑛·1·13\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></formed>"
+                         , "          <morphed meta=\"𝑛·1·14\">𝑛·1·13</morphed>"
+                         , "        </morph>"
+                         , "        <boxed meta=\"𝑛·1·15\">𝑛·1·14.φ</boxed>"
+                         , "        <applied meta=\"𝑒·1·2\" of=\"𝑒·0·3\"><meta attr=\"ρ\">𝑛·1·12</meta></applied>"
+                         , "        <normalized meta=\"𝑛·1·16\" of=\"𝑛·1·15\">𝑒·1·2</normalized>"
+                         , "        <morph at=\"𝑛·1·15\">"
+                         , "          <applied meta=\"𝑛·1·17\" by=\"morph\" at=\"𝑛·1·15\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"
+                         , "          <formed meta=\"𝑛·1·18\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></formed>"
+                         , "          <morphed meta=\"𝑛·1·19\">𝑛·1·18</morphed>"
+                         , "        </morph>"
+                         , "        <boxed meta=\"𝑛·1·20\">𝑛·1·19.φ</boxed>"
+                         , "        <normalized meta=\"𝑛·1·21\" of=\"𝑛·1·20\">40-18-00-00-00-00-00-00</normalized>"
+                         , "        <dataized meta=\"𝛿·1·2\" number=\"6.0\">40-18-00-00-00-00-00-00</dataized>"
+                         , "      </dataize>"
+                         , "      <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"
+                         , "      <minted symbol=\"𝜎1\">40-14-00-00-00-00-00-00 40-18-00-00-00-00-00-00</minted>"
+                         , "      <applied meta=\"𝑒·1·3\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
+                         , "      <built meta=\"𝑛·1·22\">𝑒·1·3</built>"
+                         , "      <morph at=\"𝑛·1·22\">"
+                         , "        <applied meta=\"𝑛·1·23\" by=\"morph\" at=\"𝑛·1·22\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
+                         , "        <formed meta=\"𝑛·1·24\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"
+                         , "        <morphed meta=\"𝑛·1·25\">𝑛·1·24</morphed>"
+                         , "      </morph>"
+                         , "      <answered meta=\"𝑛·1·26\">𝑛·1·25</answered>"
+                         , "    </evaluate>"
+                         , "    <normalized meta=\"𝑛·0·9\" of=\"𝑛·1·26.plus\">𝑛·1·23.plus</normalized>"
+                         , "    <applied meta=\"𝑛·0·10\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·1·23.plus\"><meta attr=\"x\">𝑒·0·7</meta></applied>"
+                         , "    <formed meta=\"𝑛·0·11\" of=\"𝑛·1·23.plus\"><meta attr=\"x\">𝑒·0·7</meta></formed>"
+                         , "    <morphed meta=\"𝑛·0·12\">𝑛·0·11</morphed>"
+                         , "  </morph>"
+                         , "  <evaluate λ=\"L_number_plus\" by=\"dataize\" at=\"𝑛·0·1\">"
+                         , "    <dataize at=\"ξ.ρ\">"
+                         , "      <morph at=\"ξ.ρ\">"
+                         , "        <applied meta=\"𝑛·2·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
+                         , "        <formed meta=\"𝑛·2·2\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"
+                         , "        <morphed meta=\"𝑛·2·3\">𝑛·2·2</morphed>"
+                         , "      </morph>"
+                         , "      <boxed meta=\"𝑛·2·4\">𝑛·2·3.φ</boxed>"
+                         , "      <normalized meta=\"𝑛·2·5\" of=\"𝑛·2·4\">𝜎1</normalized>"
+                         , "      <manufactured meta=\"𝛿·2·1\">𝜎1</manufactured>"
+                         , "    </dataize>"
+                         , "    <bound meta=\"𝛿1·2\">𝛿·2·1</bound>"
+                         , "    <dataize at=\"ξ.x\">"
+                         , "      <morph at=\"ξ.x\">"
+                         , "        <applied meta=\"𝑛·2·6\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·6</meta></applied>"
+                         , "        <formed meta=\"𝑛·2·7\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·6</meta></formed>"
+                         , "        <morphed meta=\"𝑛·2·8\">𝑛·2·7</morphed>"
+                         , "      </morph>"
+                         , "      <boxed meta=\"𝑛·2·9\">𝑛·2·8.φ</boxed>"
+                         , "      <applied meta=\"𝑒·2·1\" of=\"𝑒·0·6\"><meta attr=\"ρ\">𝑛·2·6</meta></applied>"
+                         , "      <normalized meta=\"𝑛·2·10\" of=\"𝑛·2·9\">𝑒·2·1</normalized>"
+                         , "      <morph at=\"𝑛·2·9\">"
+                         , "        <applied meta=\"𝑛·2·11\" by=\"morph\" at=\"𝑛·2·9\" of=\"Φ.bytes\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></applied>"
+                         , "        <formed meta=\"𝑛·2·12\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></formed>"
+                         , "        <morphed meta=\"𝑛·2·13\">𝑛·2·12</morphed>"
+                         , "      </morph>"
+                         , "      <boxed meta=\"𝑛·2·14\">𝑛·2·13.φ</boxed>"
+                         , "      <normalized meta=\"𝑛·2·15\" of=\"𝑛·2·14\">40-1C-00-00-00-00-00-00</normalized>"
+                         , "      <dataized meta=\"𝛿·2·2\" number=\"7.0\">40-1C-00-00-00-00-00-00</dataized>"
+                         , "    </dataize>"
+                         , "    <bound meta=\"𝛿2·2\">𝛿·2·2</bound>"
+                         , "    <minted symbol=\"𝜎2\">𝜎1 40-1C-00-00-00-00-00-00</minted>"
+                         , "    <applied meta=\"𝑒·2·2\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></applied>"
+                         , "    <built meta=\"𝑛·2·16\">𝑒·2·2</built>"
+                         , "    <morph at=\"𝑛·2·16\">"
+                         , "      <applied meta=\"𝑛·2·17\" by=\"morph\" at=\"𝑛·2·16\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></applied>"
+                         , "      <formed meta=\"𝑛·2·18\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></formed>"
+                         , "      <morphed meta=\"𝑛·2·19\">𝑛·2·18</morphed>"
+                         , "    </morph>"
+                         , "    <answered meta=\"𝑛·2·20\">𝑛·2·19</answered>"
+                         , "  </evaluate>"
+                         , "  <boxed meta=\"𝑛·0·13\">𝑛·2·20.φ</boxed>"
+                         , "  <normalized meta=\"𝑛·0·14\" of=\"𝑛·0·13\">𝜎2</normalized>"
+                         , "  <manufactured meta=\"𝛿·0·1\">𝜎2</manufactured>"
+                         , "</dataize>"
+                         ]
+
+        it "writes a firing whose two sides do not join as diverged, naming both sides" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withLambdasOf (T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  join:\n    on: 𝛿1\n    left: $.a\n    right: $.b\n") $ \joins ->
+              withStdin "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ φ ↦ ⟦ Δ ⤍ 01- ⟧ ⟧, b ↦ ⟦ φ ↦ ⟦ Δ ⤍ 02- ⟧ ⟧, λ ⤍ L_fork ⟧.φ ⟧" $
+                testCLIFailed ["morph", "--symbolic=" ++ joins, "--locator=Q.y", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] ["No entry of --symbolic answers the λ function 'L_fork'"]
+            records <- readProtocol path
+            lines records
+              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                         , "<morph at=\"Φ.y\">"
+                         , "  <evaluate λ=\"L_fork\" by=\"morph\" at=\"Φ.y\">"
+                         , "    <dataize at=\"ξ.c\">"
+                         , "      <manufactured meta=\"𝛿·1·1\">𝜎1</manufactured>"
+                         , "    </dataize>"
+                         , "    <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
+                         , "    <morph at=\"ξ.a\">"
+                         , "      <formed meta=\"𝑒·1·1\"><datum attr=\"φ\">01-</datum></formed>"
+                         , "      <morphed meta=\"𝑛·1·1\">𝑒·1·1</morphed>"
+                         , "    </morph>"
+                         , "    <morph at=\"ξ.b\">"
+                         , "      <formed meta=\"𝑒·1·2\"><datum attr=\"φ\">02-</datum></formed>"
+                         , "      <morphed meta=\"𝑛·1·2\">𝑒·1·2</morphed>"
+                         , "    </morph>"
+                         , "    <diverged left=\"𝑛·1·1\" right=\"𝑛·1·2\" at=\".φ.Δ\" reason=\"the join names no otherwise\"><left Δ=\"01-\"/><right Δ=\"02-\"/></diverged>"
+                         , "  </evaluate>"
+                         , "</morph>"
+                         ]
+
+        it "writes the symbol a join minted for two sides that differ only in their symbols as an element of its own" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withLambdasOf (T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  join:\n    on: 𝛿1\n    left: $.a\n    right: $.b\n") $ \joins ->
+              withStdin "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ φ ↦ ⟦ λ ⤍ 𝜎2 ⟧ ⟧, b ↦ ⟦ φ ↦ ⟦ λ ⤍ 𝜎3 ⟧ ⟧, λ ⤍ L_fork ⟧.φ ⟧" $
+                testCLISucceeded ["morph", "--symbolic=" ++ joins, "--locator=Q.y", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+            records <- readProtocol path
+            lines records
+              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                         , "<morph at=\"Φ.y\">"
+                         , "  <evaluate λ=\"L_fork\" by=\"morph\" at=\"Φ.y\">"
+                         , "    <dataize at=\"ξ.c\">"
+                         , "      <manufactured meta=\"𝛿·1·1\">𝜎1</manufactured>"
+                         , "    </dataize>"
+                         , "    <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
+                         , "    <morph at=\"ξ.a\">"
+                         , "      <formed meta=\"𝑒·1·1\"><symbol attr=\"φ\">𝜎2</symbol></formed>"
+                         , "      <morphed meta=\"𝑛·1·1\">𝑒·1·1</morphed>"
+                         , "    </morph>"
+                         , "    <morph at=\"ξ.b\">"
+                         , "      <formed meta=\"𝑒·1·2\"><symbol attr=\"φ\">𝜎3</symbol></formed>"
+                         , "      <morphed meta=\"𝑛·1·2\">𝑒·1·2</morphed>"
+                         , "    </morph>"
+                         , "    <joined symbol=\"𝜎4\" on=\"𝛿1·1\" left=\"𝜎2\" right=\"𝜎3\"/>"
+                         , "    <formed meta=\"𝑒·1·3\"><symbol attr=\"φ\">𝜎4</symbol></formed>"
+                         , "    <answered meta=\"𝑛·1·3\">𝑒·1·3</answered>"
+                         , "  </evaluate>"
+                         , "  <normalized meta=\"𝑛·0·1\" of=\"𝑛·1·3.φ\">𝜎4</normalized>"
+                         , "  <morphed meta=\"𝑛·0·2\">𝜎4</morphed>"
+                         , "</morph>"
+                         ]
+
+        it "writes one 'minted' element per symbol the answer asked for" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withLambdasOf (T.pack "- λ: L_pair\n  morph:\n    𝑛1: $.x\n  𝑛: ⟦ left ↦ ⟦ λ ⤍ 𝜎 ⟧, right ↦ ⟦ λ ⤍ 𝜎 ⟧ ⟧\n") $ \pairs ->
+              withStdin "⟦ y ↦ ⟦ x ↦ ⟦ Δ ⤍ 01- ⟧, λ ⤍ L_pair ⟧.left ⟧" $
+                testCLISucceeded ["morph", "--symbolic=" ++ pairs, "--locator=Q.y", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+            records <- readProtocol path
+            lines records
+              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                         , "<morph at=\"Φ.y\">"
+                         , "  <evaluate λ=\"L_pair\" by=\"morph\" at=\"Φ.y\">"
+                         , "    <morph at=\"ξ.x\">"
+                         , "      <morphed meta=\"𝑛·1·1\">01-</morphed>"
+                         , "    </morph>"
+                         , "    <bound meta=\"𝑛1·1\">01-</bound>"
+                         , "    <minted symbol=\"𝜎1\"/>"
+                         , "    <minted symbol=\"𝜎2\"/>"
+                         , "    <formed meta=\"𝑒·1·1\"><symbol attr=\"left\">𝜎1</symbol><symbol attr=\"right\">𝜎2</symbol></formed>"
+                         , "    <built meta=\"𝑛·1·2\">𝑒·1·1</built>"
+                         , "    <morph at=\"𝑛·1·2\">"
+                         , "      <morphed meta=\"𝑛·1·3\">𝑒·1·1</morphed>"
+                         , "    </morph>"
+                         , "    <answered meta=\"𝑛·1·4\">𝑛·1·3</answered>"
+                         , "  </evaluate>"
+                         , "  <normalized meta=\"𝑛·0·1\" of=\"𝑛·1·4.left\">𝜎1</normalized>"
+                         , "  <morphed meta=\"𝑛·0·2\">𝜎1</morphed>"
+                         , "</morph>"
+                         ]
+
+        it "writes no 'minted' element for a firing minting nothing" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withLambdasOf (T.pack "- λ: L_keep\n  morph:\n    𝑛1: $.x\n  𝑛: ⟦ z ↦ 𝑛1 ⟧\n") $ \keeps ->
+              withStdin "⟦ y ↦ ⟦ x ↦ ⟦ Δ ⤍ 01- ⟧, λ ⤍ L_keep ⟧.z ⟧" $
+                testCLISucceeded ["morph", "--symbolic=" ++ keeps, "--locator=Q.y", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+            records <- readProtocol path
+            lines records
+              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                         , "<morph at=\"Φ.y\">"
+                         , "  <evaluate λ=\"L_keep\" by=\"morph\" at=\"Φ.y\">"
+                         , "    <morph at=\"ξ.x\">"
+                         , "      <morphed meta=\"𝑛·1·1\">01-</morphed>"
+                         , "    </morph>"
+                         , "    <bound meta=\"𝑛1·1\">01-</bound>"
+                         , "    <formed meta=\"𝑒·1·1\"><datum attr=\"z\">01-</datum></formed>"
+                         , "    <built meta=\"𝑛·1·2\">𝑒·1·1</built>"
+                         , "    <morph at=\"𝑛·1·2\">"
+                         , "      <morphed meta=\"𝑛·1·3\">𝑒·1·1</morphed>"
+                         , "    </morph>"
+                         , "    <answered meta=\"𝑛·1·4\">𝑛·1·3</answered>"
+                         , "  </evaluate>"
+                         , "  <normalized meta=\"𝑛·0·1\" of=\"𝑛·1·4.z\">01-</normalized>"
+                         , "  <morphed meta=\"𝑛·0·2\">01-</morphed>"
+                         , "</morph>"
+                         ]
+
+        it "nests a firing an operand took inside the firing that asked" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withStdin nested $
+              testCLISucceeded ["dataize", symbolic, "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+            records <- readProtocol path
+            lines records
+              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                         , "<dataize at=\"Φ\">"
+                         , "  <boxed meta=\"𝑛·0·1\">Φ.φ</boxed>"
+                         , "  <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"
+                         , "  <applied meta=\"𝑒·0·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·3\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"
+                         , "  <applied meta=\"𝑒·0·4\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·5\" of=\"Φ.bytes\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></applied>"
+                         , "  <applied meta=\"𝑒·0·6\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·5</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·7\" of=\"𝑒·0·4.plus\"><meta attr=\"α0\">𝑒·0·6</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·8\" of=\"𝑒·0·2.plus\"><meta attr=\"α0\">𝑒·0·7</meta><ref attr=\"ρ\">Φ</ref></applied>"
+                         , "  <normalized meta=\"𝑛·0·2\" of=\"Φ.φ\">𝑒·0·8</normalized>"
+                         , "  <morph at=\"𝑛·0·1\">"
+                         , "    <normalized meta=\"𝑛·0·3\" of=\"Φ.number\">Φ.number</normalized>"
+                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "    <formed meta=\"𝑛·0·5\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
+                         , "    <normalized meta=\"𝑛·0·6\" of=\"𝑛·0·5.plus\">𝑛·0·4.plus</normalized>"
+                         , "    <applied meta=\"𝑛·0·7\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·4.plus\"><meta attr=\"x\">𝑒·0·7</meta></applied>"
+                         , "    <formed meta=\"𝑛·0·8\" of=\"𝑛·0·4.plus\"><meta attr=\"x\">𝑒·0·7</meta></formed>"
+                         , "    <morphed meta=\"𝑛·0·9\">𝑛·0·8</morphed>"
+                         , "  </morph>"
+                         , "  <evaluate λ=\"L_number_plus\" by=\"dataize\" at=\"𝑛·0·1\">"
+                         , "    <dataize at=\"ξ.ρ\">"
+                         , "      <morph at=\"ξ.ρ\">"
+                         , "        <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "        <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
+                         , "        <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"
+                         , "      </morph>"
+                         , "      <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"
+                         , "      <applied meta=\"𝑒·1·1\" of=\"𝑒·0·1\"><meta attr=\"ρ\">𝑛·1·1</meta></applied>"
+                         , "      <normalized meta=\"𝑛·1·5\" of=\"𝑛·1·4\">𝑒·1·1</normalized>"
+                         , "      <morph at=\"𝑛·1·4\">"
+                         , "        <normalized meta=\"𝑛·1·6\" of=\"Φ.bytes\">Φ.bytes</normalized>"
+                         , "        <applied meta=\"𝑛·1·7\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></applied>"
+                         , "        <formed meta=\"𝑛·1·8\"><datum attr=\"φ\">40-14-00-00-00-00-00-00</datum></formed>"
+                         , "        <morphed meta=\"𝑛·1·9\">𝑛·1·8</morphed>"
+                         , "      </morph>"
+                         , "      <boxed meta=\"𝑛·1·10\">𝑛·1·9.φ</boxed>"
+                         , "      <normalized meta=\"𝑛·1·11\" of=\"𝑛·1·10\">40-14-00-00-00-00-00-00</normalized>"
+                         , "      <dataized meta=\"𝛿·1·1\" number=\"5.0\">40-14-00-00-00-00-00-00</dataized>"
+                         , "    </dataize>"
+                         , "    <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
+                         , "    <dataize at=\"ξ.x\">"
+                         , "      <morph at=\"ξ.x\">"
+                         , "        <applied meta=\"𝑛·1·12\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></applied>"
+                         , "        <formed meta=\"𝑛·1·13\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></formed>"
+                         , "        <normalized meta=\"𝑛·1·14\" of=\"𝑛·1·13.plus\">𝑛·1·12.plus</normalized>"
+                         , "        <applied meta=\"𝑛·1·15\" by=\"morph\" at=\"ξ.x\" of=\"𝑛·1·12.plus\"><meta attr=\"x\">𝑒·0·6</meta></applied>"
+                         , "        <formed meta=\"𝑛·1·16\" of=\"𝑛·1·12.plus\"><meta attr=\"x\">𝑒·0·6</meta></formed>"
+                         , "        <morphed meta=\"𝑛·1·17\">𝑛·1·16</morphed>"
+                         , "      </morph>"
+                         , "      <evaluate λ=\"L_number_plus\" by=\"dataize\" at=\"ξ.x\">"
+                         , "        <dataize at=\"ξ.ρ\">"
+                         , "          <morph at=\"ξ.ρ\">"
+                         , "            <applied meta=\"𝑛·2·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></applied>"
+                         , "            <formed meta=\"𝑛·2·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></formed>"
+                         , "            <morphed meta=\"𝑛·2·3\">𝑛·2·2</morphed>"
+                         , "          </morph>"
+                         , "          <boxed meta=\"𝑛·2·4\">𝑛·2·3.φ</boxed>"
+                         , "          <applied meta=\"𝑒·2·1\" of=\"𝑒·0·3\"><meta attr=\"ρ\">𝑛·2·1</meta></applied>"
+                         , "          <normalized meta=\"𝑛·2·5\" of=\"𝑛·2·4\">𝑒·2·1</normalized>"
+                         , "          <morph at=\"𝑛·2·4\">"
+                         , "            <applied meta=\"𝑛·2·6\" by=\"morph\" at=\"𝑛·2·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></applied>"
+                         , "            <formed meta=\"𝑛·2·7\"><datum attr=\"φ\">40-18-00-00-00-00-00-00</datum></formed>"
+                         , "            <morphed meta=\"𝑛·2·8\">𝑛·2·7</morphed>"
+                         , "          </morph>"
+                         , "          <boxed meta=\"𝑛·2·9\">𝑛·2·8.φ</boxed>"
+                         , "          <normalized meta=\"𝑛·2·10\" of=\"𝑛·2·9\">40-18-00-00-00-00-00-00</normalized>"
+                         , "          <dataized meta=\"𝛿·2·1\" number=\"6.0\">40-18-00-00-00-00-00-00</dataized>"
+                         , "        </dataize>"
+                         , "        <bound meta=\"𝛿1·2\">𝛿·2·1</bound>"
+                         , "        <dataize at=\"ξ.x\">"
+                         , "          <morph at=\"ξ.x\">"
+                         , "            <applied meta=\"𝑛·2·11\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·5</meta></applied>"
+                         , "            <formed meta=\"𝑛·2·12\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·5</meta></formed>"
+                         , "            <morphed meta=\"𝑛·2·13\">𝑛·2·12</morphed>"
+                         , "          </morph>"
+                         , "          <boxed meta=\"𝑛·2·14\">𝑛·2·13.φ</boxed>"
+                         , "          <applied meta=\"𝑒·2·2\" of=\"𝑒·0·5\"><meta attr=\"ρ\">𝑛·2·11</meta></applied>"
+                         , "          <normalized meta=\"𝑛·2·15\" of=\"𝑛·2·14\">𝑒·2·2</normalized>"
+                         , "          <morph at=\"𝑛·2·14\">"
+                         , "            <applied meta=\"𝑛·2·16\" by=\"morph\" at=\"𝑛·2·14\" of=\"Φ.bytes\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></applied>"
+                         , "            <formed meta=\"𝑛·2·17\"><datum attr=\"φ\">40-1C-00-00-00-00-00-00</datum></formed>"
+                         , "            <morphed meta=\"𝑛·2·18\">𝑛·2·17</morphed>"
+                         , "          </morph>"
+                         , "          <boxed meta=\"𝑛·2·19\">𝑛·2·18.φ</boxed>"
+                         , "          <normalized meta=\"𝑛·2·20\" of=\"𝑛·2·19\">40-1C-00-00-00-00-00-00</normalized>"
+                         , "          <dataized meta=\"𝛿·2·2\" number=\"7.0\">40-1C-00-00-00-00-00-00</dataized>"
+                         , "        </dataize>"
+                         , "        <bound meta=\"𝛿2·2\">𝛿·2·2</bound>"
+                         , "        <minted symbol=\"𝜎1\">40-18-00-00-00-00-00-00 40-1C-00-00-00-00-00-00</minted>"
+                         , "        <applied meta=\"𝑒·2·3\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
+                         , "        <built meta=\"𝑛·2·21\">𝑒·2·3</built>"
+                         , "        <morph at=\"𝑛·2·21\">"
+                         , "          <applied meta=\"𝑛·2·22\" by=\"morph\" at=\"𝑛·2·21\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
+                         , "          <formed meta=\"𝑛·2·23\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"
+                         , "          <morphed meta=\"𝑛·2·24\">𝑛·2·23</morphed>"
+                         , "        </morph>"
+                         , "        <answered meta=\"𝑛·2·25\">𝑛·2·24</answered>"
+                         , "      </evaluate>"
+                         , "      <boxed meta=\"𝑛·1·18\">𝑛·2·25.φ</boxed>"
+                         , "      <normalized meta=\"𝑛·1·19\" of=\"𝑛·1·18\">𝜎1</normalized>"
+                         , "      <manufactured meta=\"𝛿·1·2\">𝜎1</manufactured>"
+                         , "    </dataize>"
+                         , "    <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"
+                         , "    <minted symbol=\"𝜎2\">40-14-00-00-00-00-00-00 𝜎1</minted>"
+                         , "    <applied meta=\"𝑒·1·2\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></applied>"
+                         , "    <built meta=\"𝑛·1·20\">𝑒·1·2</built>"
+                         , "    <morph at=\"𝑛·1·20\">"
+                         , "      <applied meta=\"𝑛·1·21\" by=\"morph\" at=\"𝑛·1·20\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></applied>"
+                         , "      <formed meta=\"𝑛·1·22\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎2</symbol></formed>"
+                         , "      <morphed meta=\"𝑛·1·23\">𝑛·1·22</morphed>"
+                         , "    </morph>"
+                         , "    <answered meta=\"𝑛·1·24\">𝑛·1·23</answered>"
+                         , "  </evaluate>"
+                         , "  <boxed meta=\"𝑛·0·10\">𝑛·1·24.φ</boxed>"
+                         , "  <normalized meta=\"𝑛·0·11\" of=\"𝑛·0·10\">𝜎2</normalized>"
+                         , "  <manufactured meta=\"𝛿·0·1\">𝜎2</manufactured>"
+                         , "</dataize>"
+                         ]
+
+        it "records a λ function no entry answers as a childless element" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withStdin "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ times(^, x) -> [[ L> L_number_times ]], nope -> [[ ^ -> ?, L> L_number_nope ]] ]], @ -> 2.times(3).nope ]]" $
+              testCLISucceeded ["dataize", symbolic, "--partial", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+            records <- readProtocol path
+            lines records
+              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                         , "<dataize at=\"Φ\">"
+                         , "  <boxed meta=\"𝑛·0·1\">Φ.φ</boxed>"
+                         , "  <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></applied>"
+                         , "  <applied meta=\"𝑒·0·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·3\" of=\"Φ.bytes\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></applied>"
+                         , "  <applied meta=\"𝑒·0·4\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·5\" of=\"𝑒·0·2.times\"><meta attr=\"α0\">𝑒·0·4</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·6\" of=\"𝑒·0·5.nope\"><ref attr=\"ρ\">Φ</ref></applied>"
+                         , "  <normalized meta=\"𝑛·0·2\" of=\"Φ.φ\">𝑒·0·6</normalized>"
+                         , "  <morph at=\"𝑛·0·1\">"
+                         , "    <normalized meta=\"𝑛·0·3\" of=\"Φ.number\">Φ.number</normalized>"
+                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "    <formed meta=\"𝑛·0·5\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
+                         , "    <normalized meta=\"𝑛·0·6\" of=\"𝑛·0·5.times\">𝑛·0·4.times</normalized>"
+                         , "    <applied meta=\"𝑛·0·7\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·4.times\"><meta attr=\"x\">𝑒·0·4</meta></applied>"
+                         , "    <formed meta=\"𝑛·0·8\" of=\"𝑛·0·4.times\"><meta attr=\"x\">𝑒·0·4</meta></formed>"
+                         , "    <evaluate λ=\"L_number_times\" by=\"morph\" at=\"𝑛·0·1\">"
+                         , "      <dataize at=\"ξ.ρ\">"
+                         , "        <morph at=\"ξ.ρ\">"
+                         , "          <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "          <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
+                         , "          <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"
+                         , "        </morph>"
+                         , "        <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"
+                         , "        <applied meta=\"𝑒·1·1\" of=\"𝑒·0·1\"><meta attr=\"ρ\">𝑛·1·1</meta></applied>"
+                         , "        <normalized meta=\"𝑛·1·5\" of=\"𝑛·1·4\">𝑒·1·1</normalized>"
+                         , "        <morph at=\"𝑛·1·4\">"
+                         , "          <normalized meta=\"𝑛·1·6\" of=\"Φ.bytes\">Φ.bytes</normalized>"
+                         , "          <applied meta=\"𝑛·1·7\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></applied>"
+                         , "          <formed meta=\"𝑛·1·8\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></formed>"
+                         , "          <morphed meta=\"𝑛·1·9\">𝑛·1·8</morphed>"
+                         , "        </morph>"
+                         , "        <boxed meta=\"𝑛·1·10\">𝑛·1·9.φ</boxed>"
+                         , "        <normalized meta=\"𝑛·1·11\" of=\"𝑛·1·10\">40-00-00-00-00-00-00-00</normalized>"
+                         , "        <dataized meta=\"𝛿·1·1\" number=\"2.0\">40-00-00-00-00-00-00-00</dataized>"
+                         , "      </dataize>"
+                         , "      <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
+                         , "      <dataize at=\"ξ.x\">"
+                         , "        <morph at=\"ξ.x\">"
+                         , "          <applied meta=\"𝑛·1·12\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></applied>"
+                         , "          <formed meta=\"𝑛·1·13\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></formed>"
+                         , "          <morphed meta=\"𝑛·1·14\">𝑛·1·13</morphed>"
+                         , "        </morph>"
+                         , "        <boxed meta=\"𝑛·1·15\">𝑛·1·14.φ</boxed>"
+                         , "        <applied meta=\"𝑒·1·2\" of=\"𝑒·0·3\"><meta attr=\"ρ\">𝑛·1·12</meta></applied>"
+                         , "        <normalized meta=\"𝑛·1·16\" of=\"𝑛·1·15\">𝑒·1·2</normalized>"
+                         , "        <morph at=\"𝑛·1·15\">"
+                         , "          <applied meta=\"𝑛·1·17\" by=\"morph\" at=\"𝑛·1·15\" of=\"Φ.bytes\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></applied>"
+                         , "          <formed meta=\"𝑛·1·18\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></formed>"
+                         , "          <morphed meta=\"𝑛·1·19\">𝑛·1·18</morphed>"
+                         , "        </morph>"
+                         , "        <boxed meta=\"𝑛·1·20\">𝑛·1·19.φ</boxed>"
+                         , "        <normalized meta=\"𝑛·1·21\" of=\"𝑛·1·20\">40-08-00-00-00-00-00-00</normalized>"
+                         , "        <dataized meta=\"𝛿·1·2\" number=\"3.0\">40-08-00-00-00-00-00-00</dataized>"
+                         , "      </dataize>"
+                         , "      <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"
+                         , "      <minted symbol=\"𝜎1\">40-00-00-00-00-00-00-00 40-08-00-00-00-00-00-00</minted>"
+                         , "      <applied meta=\"𝑒·1·3\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
+                         , "      <built meta=\"𝑛·1·22\">𝑒·1·3</built>"
+                         , "      <morph at=\"𝑛·1·22\">"
+                         , "        <applied meta=\"𝑛·1·23\" by=\"morph\" at=\"𝑛·1·22\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
+                         , "        <formed meta=\"𝑛·1·24\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"
+                         , "        <morphed meta=\"𝑛·1·25\">𝑛·1·24</morphed>"
+                         , "      </morph>"
+                         , "      <answered meta=\"𝑛·1·26\">𝑛·1·25</answered>"
+                         , "    </evaluate>"
+                         , "    <normalized meta=\"𝑛·0·9\" of=\"𝑛·1·26.nope\">𝑛·1·23.nope</normalized>"
+                         , "    <morphed meta=\"𝑛·0·10\">𝑛·1·23.nope</morphed>"
+                         , "  </morph>"
+                         , "  <unanswered λ=\"L_number_nope\" by=\"dataize\">𝑛·1·23.nope</unanswered>"
+                         , "</dataize>"
+                         ]
+
+        it "names the root after the judgment a morphing ran" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withStdin "[[ x -> [[ L> L_number_nope ]].foo ]]" $
+              testCLISucceeded ["morph", "--locator=Q.x", "--partial", "--protocol=" ++ path, "--quiet"] []
+            records <- readProtocol path
+            lines records
+              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                         , "<morph at=\"Φ.x\">"
+                         , "  <formed meta=\"𝑒·0·1\" λ=\"L_number_nope\"/>"
+                         , "  <unanswered λ=\"L_number_nope\" by=\"morph\">𝑒·0·1</unanswered>"
+                         , "</morph>"
+                         ]
+
+        it "closes the document even when the run fails" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withStdin "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ times(^, x) -> [[ L> L_number_times ]], nope -> [[ ^ -> ?, L> L_number_nope ]] ]], @ -> 2.times(3).nope ]]" $
+              testCLIFailed ["dataize", symbolic, "--protocol=" ++ path] ["No entry of --symbolic answers"]
+            records <- readProtocol path
+            lines records
+              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                         , "<dataize at=\"Φ\">"
+                         , "  <boxed meta=\"𝑛·0·1\">Φ.φ</boxed>"
+                         , "  <applied meta=\"𝑒·0·1\" of=\"Φ.bytes\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></applied>"
+                         , "  <applied meta=\"𝑒·0·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·3\" of=\"Φ.bytes\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></applied>"
+                         , "  <applied meta=\"𝑒·0·4\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·5\" of=\"𝑒·0·2.times\"><meta attr=\"α0\">𝑒·0·4</meta></applied>"
+                         , "  <applied meta=\"𝑒·0·6\" of=\"𝑒·0·5.nope\"><ref attr=\"ρ\">Φ</ref></applied>"
+                         , "  <normalized meta=\"𝑛·0·2\" of=\"Φ.φ\">𝑒·0·6</normalized>"
+                         , "  <morph at=\"𝑛·0·1\">"
+                         , "    <normalized meta=\"𝑛·0·3\" of=\"Φ.number\">Φ.number</normalized>"
+                         , "    <applied meta=\"𝑛·0·4\" by=\"morph\" at=\"𝑛·0·1\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "    <formed meta=\"𝑛·0·5\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
+                         , "    <normalized meta=\"𝑛·0·6\" of=\"𝑛·0·5.times\">𝑛·0·4.times</normalized>"
+                         , "    <applied meta=\"𝑛·0·7\" by=\"morph\" at=\"𝑛·0·1\" of=\"𝑛·0·4.times\"><meta attr=\"x\">𝑒·0·4</meta></applied>"
+                         , "    <formed meta=\"𝑛·0·8\" of=\"𝑛·0·4.times\"><meta attr=\"x\">𝑒·0·4</meta></formed>"
+                         , "    <evaluate λ=\"L_number_times\" by=\"morph\" at=\"𝑛·0·1\">"
+                         , "      <dataize at=\"ξ.ρ\">"
+                         , "        <morph at=\"ξ.ρ\">"
+                         , "          <applied meta=\"𝑛·1·1\" by=\"morph\" at=\"ξ.ρ\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></applied>"
+                         , "          <formed meta=\"𝑛·1·2\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·1</meta></formed>"
+                         , "          <morphed meta=\"𝑛·1·3\">𝑛·1·2</morphed>"
+                         , "        </morph>"
+                         , "        <boxed meta=\"𝑛·1·4\">𝑛·1·3.φ</boxed>"
+                         , "        <applied meta=\"𝑒·1·1\" of=\"𝑒·0·1\"><meta attr=\"ρ\">𝑛·1·1</meta></applied>"
+                         , "        <normalized meta=\"𝑛·1·5\" of=\"𝑛·1·4\">𝑒·1·1</normalized>"
+                         , "        <morph at=\"𝑛·1·4\">"
+                         , "          <normalized meta=\"𝑛·1·6\" of=\"Φ.bytes\">Φ.bytes</normalized>"
+                         , "          <applied meta=\"𝑛·1·7\" by=\"morph\" at=\"𝑛·1·4\" of=\"Φ.bytes\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></applied>"
+                         , "          <formed meta=\"𝑛·1·8\"><datum attr=\"φ\">40-00-00-00-00-00-00-00</datum></formed>"
+                         , "          <morphed meta=\"𝑛·1·9\">𝑛·1·8</morphed>"
+                         , "        </morph>"
+                         , "        <boxed meta=\"𝑛·1·10\">𝑛·1·9.φ</boxed>"
+                         , "        <normalized meta=\"𝑛·1·11\" of=\"𝑛·1·10\">40-00-00-00-00-00-00-00</normalized>"
+                         , "        <dataized meta=\"𝛿·1·1\" number=\"2.0\">40-00-00-00-00-00-00-00</dataized>"
+                         , "      </dataize>"
+                         , "      <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
+                         , "      <dataize at=\"ξ.x\">"
+                         , "        <morph at=\"ξ.x\">"
+                         , "          <applied meta=\"𝑛·1·12\" by=\"morph\" at=\"ξ.x\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></applied>"
+                         , "          <formed meta=\"𝑛·1·13\" of=\"Φ.number\"><meta attr=\"φ\">𝑒·0·3</meta></formed>"
+                         , "          <morphed meta=\"𝑛·1·14\">𝑛·1·13</morphed>"
+                         , "        </morph>"
+                         , "        <boxed meta=\"𝑛·1·15\">𝑛·1·14.φ</boxed>"
+                         , "        <applied meta=\"𝑒·1·2\" of=\"𝑒·0·3\"><meta attr=\"ρ\">𝑛·1·12</meta></applied>"
+                         , "        <normalized meta=\"𝑛·1·16\" of=\"𝑛·1·15\">𝑒·1·2</normalized>"
+                         , "        <morph at=\"𝑛·1·15\">"
+                         , "          <applied meta=\"𝑛·1·17\" by=\"morph\" at=\"𝑛·1·15\" of=\"Φ.bytes\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></applied>"
+                         , "          <formed meta=\"𝑛·1·18\"><datum attr=\"φ\">40-08-00-00-00-00-00-00</datum></formed>"
+                         , "          <morphed meta=\"𝑛·1·19\">𝑛·1·18</morphed>"
+                         , "        </morph>"
+                         , "        <boxed meta=\"𝑛·1·20\">𝑛·1·19.φ</boxed>"
+                         , "        <normalized meta=\"𝑛·1·21\" of=\"𝑛·1·20\">40-08-00-00-00-00-00-00</normalized>"
+                         , "        <dataized meta=\"𝛿·1·2\" number=\"3.0\">40-08-00-00-00-00-00-00</dataized>"
+                         , "      </dataize>"
+                         , "      <bound meta=\"𝛿2·1\">𝛿·1·2</bound>"
+                         , "      <minted symbol=\"𝜎1\">40-00-00-00-00-00-00-00 40-08-00-00-00-00-00-00</minted>"
+                         , "      <applied meta=\"𝑒·1·3\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
+                         , "      <built meta=\"𝑛·1·22\">𝑒·1·3</built>"
+                         , "      <morph at=\"𝑛·1·22\">"
+                         , "        <applied meta=\"𝑛·1·23\" by=\"morph\" at=\"𝑛·1·22\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></applied>"
+                         , "        <formed meta=\"𝑛·1·24\" of=\"Φ.number\"><symbol attr=\"φ\">𝜎1</symbol></formed>"
+                         , "        <morphed meta=\"𝑛·1·25\">𝑛·1·24</morphed>"
+                         , "      </morph>"
+                         , "      <answered meta=\"𝑛·1·26\">𝑛·1·25</answered>"
+                         , "    </evaluate>"
+                         , "    <normalized meta=\"𝑛·0·9\" of=\"𝑛·1·26.nope\">𝑛·1·23.nope</normalized>"
+                         , "    <morphed meta=\"𝑛·0·10\">𝑛·1·23.nope</morphed>"
+                         , "  </morph>"
+                         , "  <unanswered λ=\"L_number_nope\" by=\"dataize\">𝑛·1·23.nope</unanswered>"
+                         , "</dataize>"
+                         ]
+
+        it "writes the terminator as the term a meta was bound to" $
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            withLambdasOf (T.pack "- λ: L_pick\n  morph:\n    𝑛1: ξ.absent\n  𝑛: ⟦ λ ⤍ 𝜎 ⟧\n") $ \picks ->
+              withStdin "[[ x -> [[ here -> [[ ]], L> L_pick ]].foo ]]" $
+                testCLIFailed ["morph", "--symbolic=" ++ picks, "--locator=Q.x", "--protocol=" ++ path, "--quiet", "--hide-rho"] ["No entry of --symbolic answers the λ function '𝜎1'"]
+            records <- readProtocol path
+            lines records
+              `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                         , "<morph at=\"Φ.x\">"
+                         , "  <evaluate λ=\"L_pick\" by=\"morph\" at=\"Φ.x\">"
+                         , "    <morph at=\"ξ.absent\">"
+                         , "      <morphed meta=\"𝑛·1·1\">⊥</morphed>"
+                         , "    </morph>"
+                         , "    <bound meta=\"𝑛1·1\">⊥</bound>"
+                         , "    <minted symbol=\"𝜎1\"/>"
+                         , "    <built meta=\"𝑛·1·2\">𝜎1</built>"
+                         , "    <morph at=\"𝑛·1·2\">"
+                         , "      <morphed meta=\"𝑛·1·3\">𝜎1</morphed>"
+                         , "    </morph>"
+                         , "    <answered meta=\"𝑛·1·4\">𝜎1</answered>"
+                         , "  </evaluate>"
+                         , "  <unanswered λ=\"𝜎1\" by=\"morph\">𝜎1</unanswered>"
+                         , "</morph>"
+                         ]
+
+      it "writes XML into a file named .txt" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin "[[ D> 01- ]]" $
+            testCLISucceeded ["dataize", "--protocol=" ++ path, "--quiet"] []
+          records <- readUtf8 path
+          records `shouldSatisfy` isPrefixOf "<?xml"
+
+    describe "--minutes" $ do
+      let sum' = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> 5.plus(6) ]]"
+      it "writes the indented text into a file named .xml" $
+        withTempFile "minutesXXXXXX.xml" $ \(path, stream) -> do
+          hClose stream
+          withStdin "[[ D> 01- ]]" $
+            testCLISucceeded ["dataize", "--minutes=" ++ path, "--quiet"] []
+          records <- readProtocol path
+          records `shouldBe` "𝔻(Φ):\n  𝛿·0·1 := 01-\n"
+
+      it "writes the same text beside --protocol as alone" $
+        withTempFile "minutesXXXXXX.txt" $ \(alone, one) ->
+          withTempFile "minutesXXXXXX.txt" $ \(beside, two) ->
+            withTempFile "protocolXXXXXX.xml" $ \(xml, three) -> do
+              mapM_ hClose [one, two, three]
+              withStdin sum' $
+                testCLISucceeded ["dataize", symbolic, "--minutes=" ++ alone, "--quiet", "--sweet", "--hide-rho"] []
+              withStdin sum' $
+                testCLISucceeded ["dataize", symbolic, "--protocol=" ++ xml, "--minutes=" ++ beside, "--quiet", "--sweet", "--hide-rho"] []
+              first <- readProtocol alone
+              second <- readProtocol beside
+              second `shouldBe` first
+
+      it "writes the same XML beside --minutes as alone" $
+        withTempFile "protocolXXXXXX.xml" $ \(alone, one) ->
+          withTempFile "protocolXXXXXX.xml" $ \(beside, two) ->
+            withTempFile "minutesXXXXXX.txt" $ \(text, three) -> do
+              mapM_ hClose [one, two, three]
+              withStdin sum' $
+                testCLISucceeded ["dataize", symbolic, "--protocol=" ++ alone, "--quiet", "--sweet", "--hide-rho"] []
+              withStdin sum' $
+                testCLISucceeded ["dataize", symbolic, "--protocol=" ++ beside, "--minutes=" ++ text, "--quiet", "--sweet", "--hide-rho"] []
+              first <- readProtocol alone
+              second <- readProtocol beside
+              second `shouldBe` first
+
+      it "abridges the text without --protocol" $
+        withTempFile "minutesXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin "[[ D> 01- ]]" $
+            testCLISucceeded ["dataize", "--minutes=" ++ path, "--abridged", "--quiet"] []
+          records <- readProtocol path
+          records `shouldBe` "𝔻(Φ):\n  𝛿·0·1 := 01-\n"
+
+    describe "--partial" $ do
+      let stuck = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ times(^, x) -> [[ L> L_number_times ]], nope -> [[ ^ -> ?, L> L_number_nope ]] ]], @ -> 2.times(3).nope ]]"
+          dispatched = "[[ foo -> [[ bar -> [[ ^ -> ?, L> L_number_nope ]] ]], @ -> Q.foo.bar ]]"
+          wrapped = "[[ app -> [[ foo -> [[ bar -> [[ ^ -> ?, L> L_number_nope ]] ]], @ -> Q.app.foo.bar ]] ]]"
+      it "fails on a λ function that cannot fire without the flag" $
+        withStdin stuck $
+          testCLIFailed
+            ["dataize", symbolic, "--sweet", "--hide-rho"]
+            ["No entry of --symbolic answers the λ function 'L_number_nope'"]
+
+      it "prints the residue with the stuck application intact and exits successfully" $
+        withStdin stuck $
+          testCLISucceeded
+            ["dataize", symbolic, "--partial", "--sweet", "--hide-rho"]
+            ["L_number_nope:λ"]
+
+      it "keeps what was evaluated before the stuck site in the residue" $
+        withStdin stuck $
+          testCLISucceeded
+            ["dataize", symbolic, "--partial", "--sweet"]
+            ["φ ↦ 𝜎1:λ"]
+
+      it "records every firing before the stuck site in --protocol" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin stuck $
+            testCLISucceeded ["dataize", symbolic, "--partial", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+          records <- readProtocol path
+          lines records
+            `shouldBe` [ "𝔻(Φ):"
+                       , "  boxed 𝑛·0·1 := Φ.φ"
+                       , "  normalized 𝑛·0·2 := 2.0.times( 3.0 ).nope  # Φ.φ"
+                       , "  𝕄(𝑛·0·1):"
+                       , "    normalized 𝑛·0·3 := ⟦ φ ↦ ∅, times(x) ↦ L_number_times:λ, nope ↦ L_number_nope:λ ⟧  # Φ.number"
+                       , "    𝑛·0·4 := 2.0"
+                       , "    𝑛·0·5 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), times(x) ↦ L_number_times:λ, nope ↦ L_number_nope:λ ⟧"
+                       , "    normalized 𝑛·0·6 := ⟦ x ↦ ∅, λ ⤍ L_number_times ⟧  # 𝑛·0·5.times"
+                       , "    𝑛·0·7 := 𝑛·0·4.times( x ↦ 3.0 )"
+                       , "    𝑛·0·8 := ⟦ x ↦ 3.0, λ ⤍ L_number_times ⟧"
+                       , "    𝔼(L_number_times):"
+                       , "      𝔻(ξ.ρ):"
+                       , "        𝕄(ξ.ρ):"
+                       , "          𝑛·1·1 := 2.0"
+                       , "          𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), times(x) ↦ L_number_times:λ, nope ↦ L_number_nope:λ ⟧"
+                       , "          morphed 𝑛·1·3 := 𝑛·1·2"
+                       , "        boxed 𝑛·1·4 := 𝑛·1·3.φ"
+                       , "        normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )  # 𝑛·1·4"
+                       , "        𝕄(𝑛·1·4):"
+                       , "          normalized 𝑛·1·6 := ∅:φ  # Φ.bytes"
+                       , "          𝑛·1·7 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )"
+                       , "          𝑛·1·8 := 40-00-00-00-00-00-00-00:Δ:φ"
+                       , "          morphed 𝑛·1·9 := 𝑛·1·8"
+                       , "        boxed 𝑛·1·10 := 𝑛·1·9.φ"
+                       , "        normalized 𝑛·1·11 := 40-00-00-00-00-00-00-00:Δ  # 𝑛·1·10"
+                       , "        𝛿·1·1 := 40-00-00-00-00-00-00-00  # 2.0"
+                       , "      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
+                       , "      𝔻(ξ.x):"
+                       , "        𝕄(ξ.x):"
+                       , "          𝑛·1·12 := 3.0"
+                       , "          𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), times(x) ↦ L_number_times:λ, nope ↦ L_number_nope:λ ⟧"
+                       , "          morphed 𝑛·1·14 := 𝑛·1·13"
+                       , "        boxed 𝑛·1·15 := 𝑛·1·14.φ"
+                       , "        normalized 𝑛·1·16 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )  # 𝑛·1·15"
+                       , "        𝕄(𝑛·1·15):"
+                       , "          𝑛·1·17 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )"
+                       , "          𝑛·1·18 := 40-08-00-00-00-00-00-00:Δ:φ"
+                       , "          morphed 𝑛·1·19 := 𝑛·1·18"
+                       , "        boxed 𝑛·1·20 := 𝑛·1·19.φ"
+                       , "        normalized 𝑛·1·21 := 40-08-00-00-00-00-00-00:Δ  # 𝑛·1·20"
+                       , "        𝛿·1·2 := 40-08-00-00-00-00-00-00  # 3.0"
+                       , "      𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
+                       , "      𝑛·1·22 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
+                       , "      𝕄(𝑛·1·22):"
+                       , "        𝑛·1·23 := Φ.number( φ ↦ 𝜎1:λ )"
+                       , "        𝑛·1·24 := ⟦ φ ↦ 𝜎1:λ, times(x) ↦ L_number_times:λ, nope ↦ L_number_nope:λ ⟧"
+                       , "        morphed 𝑛·1·25 := 𝑛·1·24"
+                       , "      𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·22)"
+                       , "    normalized 𝑛·0·9 := L_number_nope:λ  # 𝑛·1·26.nope"
+                       , "    morphed 𝑛·0·10 := L_number_nope:λ"
+                       , "  unanswered L_number_nope  # 𝔻(L_number_nope:λ)"
+                       ]
+
+      it "still prints bytes when nothing gets stuck" $
+        withStdin "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> 5.plus(6) ]]" $
+          testCLISucceeded ["dataize", symbolic, "--partial"] ["40-45-00-00-00-00-00-00"]
+
+      it "prints the residual at --locator as XMIR, with ρ hidden" $
+        withStdin wrapped $
+          testCLISucceeded
+            ["dataize", symbolic, "--partial", "--locator=Q.app", "--output=xmir", "--hide-rho"]
+            ["<o name=\"λ\">L_number_nope</o>"]
+
+      it "prints the residual at --locator, not the whole program" $
+        withStdin wrapped $ do
+          (out, _) <- withStdout (runCLI ["dataize", symbolic, "--partial", "--locator=Q.app", "--hide-rho", "--flat"])
+          lines out `shouldBe` ["⟦ λ ⤍ L_number_nope ⟧"]
+
+      it "prints a residual of several top bindings as XMIR" $
+        withStdin dispatched $
+          testCLISucceeded
+            ["dataize", symbolic, "--partial", "--output=xmir"]
+            ["<o base=\"Φ.foo\" name=\"ρ\"/>", "<o name=\"λ\">L_number_nope</o>"]
+
+      it "prints the chain of steps ending in the residue with --sequence" $
+        withStdin stuck $
+          testCLISucceeded
+            ["dataize", symbolic, "--partial", "--sequence", "--sweet", "--hide-rho", "--flat"]
+            ["2.0.times( 3.0 ).nope", "L_number_nope:λ"]
+
+      it "prints the terminator ⊥ the object reduces to as the residue" $
+        withStdin "[[ ]]" $
+          testCLISucceeded ["dataize", "--partial"] ["⊥"]
+
+    describe "--symbolic" $ do
+      let sum' = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> 5.plus(6) ]]"
+      it "fires the λ function an entry of the file answers" $
+        withStdin sum' $
+          testCLISucceeded ["dataize", symbolic] ["40-45-00-00-00-00-00-00"]
+
+      it "reports the progress of the run with --log-level=INFO" $
+        withStdin sum' $
+          testCLISucceeded ["dataize", symbolic, "--log-level=INFO", "--quiet"] ["[INFO]: Started "]
+
+      it "gets stuck on every λ function when it is not given" $
+        withStdin sum' $
+          testCLIFailed ["dataize"] ["No entry of --symbolic answers the λ function 'L_number_plus'"]
+
+      it "fails when the file is not there" $
+        withStdin sum' $
+          testCLIFailed ["dataize", "--symbolic=no-such-file.yaml"] ["no-such-file.yaml"]
+
+      it "fails on a file that carries no entries at all, before dataizing anything" $
+        withTempFileContent "symbolicXXXXXX.yaml" "nope: true\n" $ \path ->
+          withStdin sum' $
+            testCLIFailed ["dataize", "--symbolic=" ++ path] ["cannot be read"]
+
+    describe "a join on a condition nobody decided" $ do
+      let joining = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  join:\n    on: 𝛿1\n    left: $.a\n    right: $.b\n"
+          dataized :: String -> IO String
+          dataized program =
+            withLambdasOf joining $ \joins ->
+              withStdin program $
+                fst <$> withStdout (runCLI ["dataize", "--symbolic=" ++ joins, "--locator=Q.y"])
+      it "gets stuck on two sides that do not join, instead of splitting the run" $
+        withLambdasOf joining $ \joins ->
+          withStdin "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ ⟦ Δ ⤍ 02- ⟧, λ ⤍ L_fork ⟧ ⟧" $
+            testCLIFailed ["dataize", "--symbolic=" ++ joins, "--locator=Q.y"] ["No entry of --symbolic answers the λ function 'L_fork'"]
+
+      it "gets stuck on a side whose morph got stuck" $
+        withLambdasOf joining $ \joins ->
+          withStdin "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ Δ ⤍ 05- ⟧, b ↦ ⟦ λ ⤍ L_none ⟧.x, λ ⤍ L_fork ⟧ ⟧" $
+            testCLIFailed ["dataize", "--symbolic=" ++ joins, "--locator=Q.y"] ["No entry of --symbolic answers the λ function 'L_none'"]
+
+      it "dataizes two sides that come to the same term" $ do
+        printed <- dataized "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ Δ ⤍ 07- ⟧, b ↦ ⟦ Δ ⤍ 07- ⟧, λ ⤍ L_fork ⟧ ⟧"
+        lines printed `shouldBe` ["07-"]
+
+      it "dataizes two sides that differ only in their symbols" $ do
+        printed <- dataized "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ φ ↦ ⟦ λ ⤍ 𝜎2 ⟧ ⟧, b ↦ ⟦ φ ↦ ⟦ λ ⤍ 𝜎3 ⟧ ⟧, λ ⤍ L_fork ⟧ ⟧"
+        length (lines printed) `shouldBe` 1
+
+      it "dataizes a side and ⊥ into the symbol the join minted for both" $ do
+        printed <- dataized "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ λ ⤍ 𝜎2 ⟧, b ↦ ⊥, λ ⤍ L_fork ⟧ ⟧"
+        lines printed `shouldBe` ["40-45-00-00-00-00-00-00"]
+
+      it "writes the symbol a join minted for a side and ⊥ beside a symbol standing for ⊥" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withLambdasOf joining $ \joins ->
+            withStdin "⟦ y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎1 ⟧, a ↦ ⟦ λ ⤍ 𝜎2 ⟧, b ↦ ⊥, λ ⤍ L_fork ⟧ ⟧" $
+              testCLISucceeded ["dataize", "--symbolic=" ++ joins, "--locator=Q.y", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+          records <- readProtocol path
+          lines records `shouldContain` ["    joined 𝜎4 := 𝛿1·1 ? 𝜎2 : 𝜎3  # where 𝜎3 is ⊥"]
+
+    describe "--inside" $ do
+      let universe = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> [[ D> 01- ]] ]]"
+      it "dataizes an expression the input does not contain" $
+        withStdin universe $
+          testCLISucceeded ["dataize", symbolic, "--inside=5.plus( 6 )"] ["40-45-00-00-00-00-00-00"]
+
+      it "normalizes what it is handed before dataizing it" $
+        withStdin universe $
+          testCLISucceeded ["dataize", "--inside=[[ x -> [[ D> 2A- ]] ]].x"] ["2A-"]
+
+      it "hides an object of the universe from the answer it morphs inside it" $
+        withStdin universe $
+          testCLISucceeded ["morph", "--inside=[[ x -> [[ D> 2A- ]] ]].x", "--hide=Q.bytes", "--flat", "--hide-rho"] ["⟦ Δ ⤍ 2A- ⟧"]
+
+      it "morphs inside the universe just as it dataizes inside it" $
+        withStdin universe $
+          testCLISucceeded ["morph", symbolic, "--inside=5.plus( 6 )", "--sweet", "--hide-rho", "--flat"] ["⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"]
+
+      it "opens the text protocol before the objects it made while aiming" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin universe $
+            testCLISucceeded ["morph", symbolic, "--inside=5.plus( 6 )", "--minutes=" ++ path, "--sweet", "--hide-rho", "--quiet"] []
+          records <- readProtocol path
+          takeWhile (/= '(') (concat (take 1 (lines records))) `shouldBe` "𝕄"
+
+      it "opens the XML protocol before the objects it made while aiming" $
+        withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+          hClose stream
+          withStdin universe $
+            testCLISucceeded ["dataize", symbolic, "--inside=5.plus( 6 )", "--protocol=" ++ path, "--sweet", "--hide-rho", "--quiet"] []
+          records <- readProtocol path
+          take 1 (lines records) `shouldBe` ["<?xml version=\"1.0\" encoding=\"UTF-8\"?>"]
+
+      it "sites what it made while aiming at the place it put the expression at" $
+        withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+          hClose stream
+          withStdin universe $
+            testCLISucceeded ["dataize", "--inside=[[ x -> ? ]]( x -> [[ D> 2A- ]] ).x", "--minutes=" ++ path, "--sweet", "--quiet"] []
+          records <- readProtocol path
+          take 2 (lines records) `shouldBe` ["𝔻(Φ.a🌵0):", "  𝑛·0·1 := ∅:x( x ↦ 2A-:Δ )"]
+
+      it "cannot be used together with --locator" $
+        withStdin universe $
+          testCLIFailed ["dataize", "--inside=Q.@", "--locator=Q.@"] ["--inside and --locator cannot be used together"]
+
+      it "accepts --locator=Φ with --inside, since Φ and Q both name the root" $
+        withStdin universe $
+          testCLISucceeded ["dataize", "--inside=[[ x -> [[ D> 2A- ]] ]].x", "--locator=Φ"] ["2A-"]
+
+      it "accepts --locator=Φ with morph --inside, since Φ and Q both name the root" $
+        withStdin universe $
+          testCLISucceeded ["morph", symbolic, "--inside=5.plus( 6 )", "--locator=Φ", "--sweet", "--hide-rho", "--flat"] ["⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"]
+
+      it "fails when the input expression is not a formation" $
+        withStdin "Q.x" $
+          testCLIFailed ["dataize", "--inside=Q.x"] ["--inside requires the input expression to be a formation"]
+
+    describe "fails" $ do
+      it "with --output != latex and --nonumber" $
+        withStdin "" $
+          testCLIFailed
+            ["dataize", "--nonumber", "--output=xmir"]
+            ["The --nonumber option can stay together with --output=latex only"]
+
+      it "with --omit-listing and --output != xmir" $
+        withStdin "" $
+          testCLIFailed
+            ["dataize", "--omit-listing", "--output=phi"]
+            ["--omit-listing"]
+
+      it "with --omit-comments and --output != xmir" $
+        withStdin "" $
+          testCLIFailed
+            ["dataize", "--omit-comments", "--output=phi"]
+            ["--omit-comments"]
+
+      it "with --expression and --output != latex" $
+        withStdin "" $
+          testCLIFailed
+            ["dataize", "--expression=foo", "--output=phi"]
+            ["--expression option can stay together with --output=latex only"]
+
+      it "with --label and --output != latex" $
+        withStdin "" $
+          testCLIFailed
+            ["dataize", "--label=foo", "--output=phi"]
+            ["--label option can stay together with --output=latex only"]
+
+      it "with wrong --hide option" $
+        withStdin "" $
+          testCLIFailed
+            ["dataize", "--hide=Q.x(Q.y)"]
+            ["[ERROR]: Invalid set of arguments: Only dispatch expression", "but given: Φ.x( Φ.y )"]
+
+      it "with wrong --show option" $
+        withStdin "" $
+          testCLIFailed
+            ["dataize", "--show=Q.x(Q.y)"]
+            ["[ERROR]:", "Only dispatch expression started with Φ (or Q) can be used in --show"]
+
+      it "with wrong --locator option" $
+        withStdin "" $
+          testCLIFailed
+            ["dataize", "--locator=Q.x(Q.y)"]
+            ["[ERROR]:", "Only dispatch expression started with Φ (or Q) can be used in --locator"]
+
+      it "with wrong --focus option" $
+        withStdin "" $
+          testCLIFailed
+            ["dataize", "--focus=Q.x(Q.y)"]
+            ["[ERROR]:", "Only dispatch expression started with Φ (or Q) can be used in --focus"]
+
+      it "with wrong --locator option written through ξ, keeping ξ in the error" $
+        withStdin "" $
+          testCLIFailed
+            ["dataize", "--locator=ξ.x"]
+            ["[ERROR]:", "but given: ξ.x"]
+
+    it "accepts --depth-sensitive" $
+      withStdin "[[ D> 01- ]]" $
+        testCLISucceeded ["dataize", "--depth-sensitive"] ["01-"]
+
+    it "finishes exactly on --max-cycles without reporting the limit" $
+      withStdin "⟦ φ ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" $
+        testCLISucceeded ["dataize", "--max-cycles=1"] ["01-"]
+
+    it "reports --max-cycles exceeded when a rule still applies at the limit" $
+      withStdin "[[ @ -> $.f(y -> [[ ]]), f -> [[ D> 00-, y -> ? ]] ]]" $
+        testCLIFailed
+          ["dataize", "--max-cycles=1"]
+          ["[ERROR]: Normalization did not finish before reaching the limit of cycles: --max-cycles=1"]
+
+  describe "morph" $ do
+    let chained = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], @ -> 5.plus(6).plus(7) ]]"
+    it "prints help" $
+      testCLISucceeded ["morph", "--help"] ["Morph the 𝜑-expression"]
+
+    it "hands the top formation back untouched under the default locator" $
+      withStdin "[[ D> 01- ]]" $
+        testCLISucceeded ["morph", "--flat", "--hide-rho"] ["⟦ Δ ⤍ 01- ⟧"]
+
+    it "stops at the bare saturated λ-formation" $
+      withStdin chained $
+        testCLISucceeded
+          ["morph", symbolic, "--locator=Q.@", "--sweet", "--hide-rho", "--flat"]
+          ["⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"]
+
+    it "leaves to dataize the firing that takes the same term to bytes" $
+      withStdin chained $
+        testCLISucceeded ["dataize", symbolic] ["40-45-00-00-00-00-00-00"]
+
+    it "morphs the subterm --locator aims at" $
+      withStdin "[[ ex -> Q.x, x -> [[ D> 42- ]] ]]" $
+        testCLISucceeded ["morph", "--locator=Q.ex", "--flat", "--hide-rho"] ["⟦ Δ ⤍ 42- ⟧"]
+
+    it "canonizes the answer it prints" $
+      withStdin "[[ x -> [[ L> Foo ]], y -> [[ L> Bar ]] ]]" $
+        testCLISucceeded ["morph", "--canonize", "--flat", "--sweet"] ["⟦ x ↦ Fn1:λ, y ↦ Fn2:λ ⟧"]
+
+    it "hides a binding of the answer it prints" $
+      withStdin "[[ x -> [[ L> Foo ]], y -> [[ L> Bar ]] ]]" $
+        testCLISucceeded ["morph", "--hide=Q.x", "--flat", "--sweet"] ["Bar:λ:y"]
+
+    it "shows only one binding of the answer it prints" $
+      withStdin "[[ x -> [[ L> Foo ]], y -> [[ L> Bar ]] ]]" $
+        testCLISucceeded ["morph", "--show=Q.x", "--flat", "--sweet"] ["Foo:λ:x"]
+
+    it "hides an object outside the answer --locator aims at" $
+      withStdin "[[ t -> [[ a -> [[ D> 01- ]], b -> [[ D> 02- ]] ]], o -> [[ D> 03- ]] ]]" $
+        testCLISucceeded ["morph", "--locator=Q.t", "--hide=Q.o", "--flat", "--hide-rho"] ["⟦ a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ ⟦ Δ ⤍ 02- ⟧ ⟧"]
+
+    it "hides a binding of the answer --locator aims at" $
+      withStdin "[[ t -> [[ a -> [[ D> 01- ]], b -> [[ D> 02- ]] ]], o -> [[ D> 03- ]] ]]" $
+        testCLISucceeded ["morph", "--locator=Q.t", "--hide=Q.t.a", "--flat", "--hide-rho"] ["⟦ b ↦ ⟦ Δ ⤍ 02- ⟧ ⟧"]
+
+    it "shows only one binding of the answer --locator aims at" $
+      withStdin "[[ t -> [[ a -> [[ D> 01- ]], b -> [[ D> 02- ]] ]], o -> [[ D> 03- ]] ]]" $
+        testCLISucceeded ["morph", "--locator=Q.t", "--show=Q.t.b", "--flat", "--hide-rho"] ["⟦ b ↦ ⟦ Δ ⤍ 02- ⟧ ⟧"]
+
+    it "prints ⊥ instead of failing the run" $
+      withStdin "[[ x -> $ ]]" $
+        testCLISucceeded ["morph", "--locator=Q.x"] ["⊥"]
+
+    it "fails to dataize what it morphs to ⊥" $
+      withStdin "[[ x -> $ ]]" $
+        testCLIFailed ["dataize", "--locator=Q.x"] ["terminator ⊥"]
+
+    it "prints the chain of morphing steps with --sequence" $
+      withStdin chained $
+        testCLISucceeded
+          ["morph", symbolic, "--locator=Q.@", "--sequence", "--headers", "--sweet", "--hide-rho", "--flat"]
+          [ "Rule 'maa'"
+          , "Rule 'alpha'"
+          , "Rule 'copy'"
+          , "Rule 'mf'"
+          , "⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"
+          ]
+
+    it "writes every step of a LaTeX --sequence with the arrow of its judgment" $
+      withStdin "[[ q -> [[ ]], k -> Q.q ]]" $
+        testCLISucceeded
+          ["morph", "--locator=Q.k", "--sequence", "--output=latex", "--flat", "--sweet", "--quiet"]
+          [ intercalate
+              "\n"
+              [ "\\begin{phiquation}"
+              , "[[ |q| -> [[]], |k| -> Q . |q| ]] \\phiMorph[\\nameref{r:md}]"
+              , "  \\phiMorph [[ |q| -> [[]], |k| -> [[ |q| -> [[]], |k| -> Q . |q| ]] . |q| ]] \\phiNormalize[\\nameref{r:dot}]"
+              , "  \\phiNormalize [[ |q| -> [[]], |k| -> [[]] ( \\phiTerminal{\\rho} -> Q ) ]] \\phiNormalize[\\nameref{r:skip}]"
+              , "  \\phiNormalize [[ |q| -> [[]], |k| -> [[]] ]] \\phiMorph[\\nameref{r:mf}]"
+              , "  \\phiMorph [[ |q| -> [[]], |k| -> [[]] ]]{.}"
+              , "\\end{phiquation}"
+              ]
+          ]
+
+    it "does not print the result with --quiet" $
+      withStdin "[[ D> 01- ]]" $
+        testCLISucceeded ["morph", "--quiet"] []
+
+    it "records the λ functions it fires with --protocol" $
+      withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+        hClose stream
+        withStdin chained $
+          testCLISucceeded ["morph", symbolic, "--locator=Q.@", "--minutes=" ++ path, "--quiet", "--sweet", "--hide-rho"] []
+        records <- readProtocol path
+        lines records
+          `shouldBe` [ "𝕄(Φ.φ):"
+                     , "  normalized 𝑛·0·1 := ⟦ φ ↦ ∅, plus(x) ↦ L_number_plus:λ ⟧  # Φ.number"
+                     , "  𝑛·0·2 := 5.0"
+                     , "  𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                     , "  normalized 𝑛·0·4 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·0·3.plus"
+                     , "  𝑛·0·5 := 𝑛·0·2.plus( x ↦ 6.0 )"
+                     , "  𝑛·0·6 := ⟦ x ↦ 6.0, λ ⤍ L_number_plus ⟧"
+                     , "  𝔼(L_number_plus):"
+                     , "    𝔻(ξ.ρ):"
+                     , "      𝕄(ξ.ρ):"
+                     , "        𝑛·1·1 := 5.0"
+                     , "        𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                     , "        morphed 𝑛·1·3 := 𝑛·1·2"
+                     , "      boxed 𝑛·1·4 := 𝑛·1·3.φ"
+                     , "      normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )  # 𝑛·1·4"
+                     , "      𝕄(𝑛·1·4):"
+                     , "        normalized 𝑛·1·6 := ∅:φ  # Φ.bytes"
+                     , "        𝑛·1·7 := Φ.bytes( φ ↦ 40-14-00-00-00-00-00-00:Δ )"
+                     , "        𝑛·1·8 := 40-14-00-00-00-00-00-00:Δ:φ"
+                     , "        morphed 𝑛·1·9 := 𝑛·1·8"
+                     , "      boxed 𝑛·1·10 := 𝑛·1·9.φ"
+                     , "      normalized 𝑛·1·11 := 40-14-00-00-00-00-00-00:Δ  # 𝑛·1·10"
+                     , "      𝛿·1·1 := 40-14-00-00-00-00-00-00  # 5.0"
+                     , "    𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
+                     , "    𝔻(ξ.x):"
+                     , "      𝕄(ξ.x):"
+                     , "        𝑛·1·12 := 6.0"
+                     , "        𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ ), plus(x) ↦ L_number_plus:λ ⟧"
+                     , "        morphed 𝑛·1·14 := 𝑛·1·13"
+                     , "      boxed 𝑛·1·15 := 𝑛·1·14.φ"
+                     , "      normalized 𝑛·1·16 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )  # 𝑛·1·15"
+                     , "      𝕄(𝑛·1·15):"
+                     , "        𝑛·1·17 := Φ.bytes( φ ↦ 40-18-00-00-00-00-00-00:Δ )"
+                     , "        𝑛·1·18 := 40-18-00-00-00-00-00-00:Δ:φ"
+                     , "        morphed 𝑛·1·19 := 𝑛·1·18"
+                     , "      boxed 𝑛·1·20 := 𝑛·1·19.φ"
+                     , "      normalized 𝑛·1·21 := 40-18-00-00-00-00-00-00:Δ  # 𝑛·1·20"
+                     , "      𝛿·1·2 := 40-18-00-00-00-00-00-00  # 6.0"
+                     , "    𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
+                     , "    𝑛·1·22 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
+                     , "    𝕄(𝑛·1·22):"
+                     , "      𝑛·1·23 := Φ.number( φ ↦ 𝜎1:λ )"
+                     , "      𝑛·1·24 := ⟦ φ ↦ 𝜎1:λ, plus(x) ↦ L_number_plus:λ ⟧"
+                     , "      morphed 𝑛·1·25 := 𝑛·1·24"
+                     , "    𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·22)"
+                     , "  normalized 𝑛·0·7 := ⟦ x ↦ ∅, λ ⤍ L_number_plus ⟧  # 𝑛·1·26.plus"
+                     , "  𝑛·0·8 := 𝑛·1·23.plus( x ↦ 7.0 )"
+                     , "  𝑛·0·9 := ⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"
+                     , "  morphed 𝑛·0·10 := 𝑛·0·9"
+                     ]
+
+    it "saves morphing steps to dir with --steps-dir" $
+      withTempDirectory "phino-steps-morph" $ \dir ->
+        withStdin chained $ do
+          testCLISucceeded
+            ["morph", symbolic, "--locator=Q.@", "--steps-dir=" ++ dir, "--sweet", "--hide-rho", "--flat"]
+            ["⟦ x ↦ 7.0, λ ⤍ L_number_plus ⟧"]
+          steps <- sort <$> listDirectory dir
+          steps `shouldBe` map (\n -> printf "%05d.phi" (n :: Int)) [1 .. length steps]
+          length steps `shouldSatisfy` (> 0)
+
+    it "accepts --seed, --shuffle and --depth-sensitive" $
+      withStdin "[[ D> 01- ]]" $
+        testCLISucceeded ["morph", "--seed=7", "--shuffle", "--depth-sensitive", "--flat", "--hide-rho"] ["⟦ Δ ⤍ 01- ⟧"]
+
+    it "returns the λ-formation dataize cannot finish on" $
+      withStdin "⟦ @ ↦ ⟦ λ ⤍ L_number_div, ρ ↦ ⟦ Δ ⤍ 40-45-00-00-00-00-00-00 ⟧, x ↦ ⟦ Δ ⤍ 40-00-00-00-00-00-00-00 ⟧ ⟧ ⟧" $
+        testCLISucceeded
+          ["morph", "--locator=Q.@", "--max-steps=40", "--flat", "--hide-rho"]
+          ["⟦ λ ⤍ L_number_div"]
+
+    it "fails once the --max-steps budget is spent" $
+      withStdin chained $
+        testCLIFailed
+          ["morph", "--locator=Q.@", "--max-steps=3"]
+          ["[ERROR]: Morphing did not finish before reaching the limit of steps: --max-steps=3"]
+
+    it "names morphing, not dataization, when the budget is spent before dataization starts" $
+      withStdin "⟦ x ↦ Φ.x.y ⟧" $
+        testCLIFailed
+          ["morph", "--locator=Q.x", "--max-steps=5"]
+          ["[ERROR]: Morphing did not finish before reaching the limit of steps: --max-steps=5"]
+
+    describe "--max-firings" $ do
+      let splitting = withLambdasOf (T.pack "- λ: L_split\n  morph:\n    𝑛1: Φ.s.foo\n    𝑛2: Φ.s.foo\n  𝑛: ⟦ l ↦ 𝑛1, r ↦ 𝑛2 ⟧\n")
+          split = "⟦ s ↦ ⟦ λ ⤍ L_split ⟧, x ↦ Φ.s.foo ⟧"
+      it "fails with non-positive --max-firings" $
+        withStdin split $
+          testCLIFailed ["morph", "--max-firings=0"] ["--max-firings must be positive"]
+
+      it "fails once the --max-firings budget is spent on a widening recursion" $
+        splitting $ \table ->
+          withStdin split $
+            testCLIFailed
+              ["morph", "--symbolic=" ++ table, "--locator=Q.x", "--max-firings=64"]
+              ["[ERROR]: Evaluation did not finish before reaching the limit of firings: --max-firings=64"]
+
+      it "ends the widening recursion with --partial" $
+        splitting $ \table ->
+          withStdin split $
+            testCLISucceeded
+              ["morph", "--symbolic=" ++ table, "--locator=Q.x", "--max-firings=64", "--partial", "--flat", "--hide-rho", "--sweet"]
+              ["L_split:λ.foo"]
+
+      it "fires no more λ functions than --max-firings allows" $
+        splitting $ \table ->
+          withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+            hClose stream
+            withStdin split $
+              testCLISucceeded
+                ["morph", "--symbolic=" ++ table, "--locator=Q.x", "--max-firings=64", "--partial", "--minutes=" ++ path, "--quiet"]
+                []
+            records <- readProtocol path
+            length (filter (isInfixOf "𝔼(L_split)") (lines records)) `shouldBe` 64
+
+    describe "--max-nodes" $ do
+      let growing = "⟦ m(p) ↦ ⟦ φ ↦ ξ.a( ξ.p ).φ, a(ρ, tup) ↦ ⟦ φ ↦ ρ.a( ξ.tup.tail ).φ ⟧ ⟧, x ↦ Φ.m( 𝜎1:λ ) ⟧"
+      it "fails with non-positive --max-nodes" $
+        withStdin growing $
+          testCLIFailed ["dataize", "--max-nodes=0"] ["--max-nodes must be positive"]
+
+      it "fails once the term grows over --max-nodes" $
+        withStdin growing $
+          testCLIFailed
+            ["dataize", "--acyclic=plausible", "--max-loops=2", "--max-nodes=60", "--locator=Q.x"]
+            ["[ERROR]: Evaluation did not finish before reaching the limit of nodes: --max-nodes=60"]
+
+      it "ends the growing term with --partial" $
+        withStdin growing $
+          testCLISucceeded
+            ["morph", "--acyclic=plausible", "--max-loops=2", "--max-nodes=60", "--partial", "--locator=Q.x", "--flat", "--hide-rho", "--sweet"]
+            ["Φ.m( 𝜎1:λ )"]
+
+      it "passes a small run in a large program under --max-nodes" $
+        withStdin ("⟦ x ↦ ⟦ φ ↦ ξ.y, y ↦ ⟦ Δ ⤍ 05- ⟧ ⟧, junk ↦ ⟦ " ++ intercalate ", " [printf "a%d ↦ ⟦ b ↦ ⟦ c ↦ ⟦ Δ ⤍ 01- ⟧ ⟧ ⟧" index | index <- [0 .. 999 :: Int]] ++ " ⟧ ⟧") $
+          testCLISucceeded ["dataize", "--max-nodes=50", "--locator=Q.x"] ["05-"]
+
+    describe "--max-memory" $ do
+      let growing = "⟦ m(p) ↦ ⟦ φ ↦ ξ.a( ξ.p ).φ, a(ρ, tup) ↦ ⟦ φ ↦ ρ.a( ξ.tup.tail ).φ ⟧ ⟧, x ↦ Φ.m( 𝜎1:λ ) ⟧"
+      it "fails with non-positive --max-memory" $
+        withStdin growing $
+          testCLIFailed ["dataize", "--max-memory=0G"] ["--max-memory must be positive"]
+
+      it "fails with --max-memory of an unknown unit" $
+        withStdin growing $
+          testCLIFailed ["dataize", "--max-memory=8Q"] ["--max-memory must be a number of bytes, optionally ending with K, M, G or T"]
+
+      it "fails once the heap grows over --max-memory" $
+        withStdin growing $
+          testCLIFailed
+            ["dataize", "--acyclic=plausible", "--max-loops=2", "--max-memory=1K", "--locator=Q.x"]
+            ["[ERROR]: Evaluation did not finish before reaching the limit of memory: --max-memory=1K"]
+
+      it "ends the growing term with --partial under --max-memory" $
+        withStdin growing $
+          testCLISucceeded
+            ["morph", "--acyclic=plausible", "--max-loops=2", "--max-memory=1K", "--partial", "--locator=Q.x", "--flat", "--hide-rho", "--sweet"]
+            ["Φ.m( 𝜎1:λ )"]
+
+      it "passes a small run in a large program under --max-memory" $
+        withStdin ("⟦ x ↦ ⟦ φ ↦ ξ.y, y ↦ ⟦ Δ ⤍ 05- ⟧ ⟧, junk ↦ ⟦ " ++ intercalate ", " [printf "a%d ↦ ⟦ b ↦ ⟦ c ↦ ⟦ Δ ⤍ 01- ⟧ ⟧ ⟧" index | index <- [0 .. 999 :: Int]] ++ " ⟧ ⟧") $
+          testCLISucceeded ["dataize", "--max-memory=1G", "--locator=Q.x"] ["05-"]
+
+    describe "--max-seconds" $ do
+      let ladder = withLambdasOf (T.pack "- λ: L_split\n  morph:\n    𝑛1: ξ.n.foo\n    𝑛2: ξ.n.foo\n  𝑛: ⟦ l ↦ 𝑛1, r ↦ 𝑛2 ⟧\n")
+          rungs = "⟦ " ++ intercalate ", " [printf "l%d ↦ ⟦ λ ⤍ L_split, n ↦ Φ.l%d ⟧" rung (rung + 1) | rung <- [0 .. 23 :: Int]] ++ ", l24 ↦ ⟦⟧, x ↦ Φ.l0.foo ⟧"
+          bounded :: Expectation -> Expectation
+          bounded check = timeout 60000000 check >>= (`shouldBe` Just ())
+      it "fails with non-positive --max-seconds" $
+        withStdin rungs $
+          testCLIFailed ["morph", "--max-seconds=0"] ["--max-seconds must be positive"]
+
+      it "fails with a --max-seconds value above maxBound Int, naming the limit" $
+        withStdin rungs $
+          testCLIFailed
+            ["morph", "--max-seconds=9223372036854775808"]
+            ["value must be between", "9223372036854775807"]
+
+      it "fails once the --max-seconds budget is spent" $
+        ladder $ \table ->
+          bounded $
+            withStdin rungs $
+              testCLIFailed
+                ["morph", "--symbolic=" ++ table, "--locator=Q.x", "--max-seconds=1"]
+                ["[ERROR]: Evaluation did not finish before reaching the limit of seconds: --max-seconds=1"]
+
+      it "fails dataize once the --max-seconds budget is spent" $
+        ladder $ \table ->
+          bounded $
+            withStdin rungs $
+              testCLIFailed
+                ["dataize", "--symbolic=" ++ table, "--locator=Q.x", "--max-seconds=1"]
+                ["[ERROR]: Evaluation did not finish before reaching the limit of seconds: --max-seconds=1"]
+
+      it "prints the residue once the --max-seconds budget is spent with --partial" $
+        ladder $ \table ->
+          bounded $
+            withStdin rungs $
+              testCLISucceeded
+                ["morph", "--symbolic=" ++ table, "--max-seconds=1", "--locator=Q.x", "--partial", "--flat", "--hide-rho", "--sweet"]
+                ["⟦ λ ⤍ L_split, n ↦ Φ.l1 ⟧.foo"]
+
+      it "prints the residue of a dataization once the --max-seconds budget is spent with --partial" $
+        ladder $ \table ->
+          bounded $
+            withStdin rungs $
+              testCLISucceeded
+                ["dataize", "--symbolic=" ++ table, "--max-seconds=1", "--locator=Q.x", "--partial", "--flat", "--hide-rho", "--sweet"]
+                ["⟦ λ ⤍ L_split, n ↦ Φ.l1 ⟧.foo"]
+
+      forM_ [(testCLIFailed, ["--max-seconds=1"], ["--locator=Q.x"]), (testCLISucceeded, [], ["--locator=Q.x", "--partial"])] $ \(run, outputs, opts) ->
+        it ("writes the timeout as the last line of the protocol with " ++ unwords opts) $
+          ladder $ \table ->
+            withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+              hClose stream
+              bounded $
+                withStdin rungs $
+                  run
+                    (["morph", "--symbolic=" ++ table, "--max-seconds=1", "--minutes=" ++ path, "--quiet"] ++ opts)
+                    outputs
+              records <- readProtocol path
+              dropWhile (== ' ') (last (lines records)) `shouldBe` "timeout 1"
+
+      it "writes the timeout once to the XML protocol" $
+        ladder $ \table ->
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            bounded $
+              withStdin rungs $
+                testCLISucceeded
+                  ["morph", "--symbolic=" ++ table, "--locator=Q.x", "--partial", "--max-seconds=1", "--protocol=" ++ path, "--quiet"]
+                  []
+            records <- readProtocol path
+            length (filter (isInfixOf "<timeout limit=\"1\" by=\"morph\" at=\"") (lines records)) `shouldBe` 1
+
+      it "closes the XML protocol of a run out of time" $
+        ladder $ \table ->
+          withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+            hClose stream
+            bounded $
+              withStdin rungs $
+                testCLIFailed
+                  ["morph", "--symbolic=" ++ table, "--locator=Q.x", "--max-seconds=1", "--protocol=" ++ path, "--quiet"]
+                  ["--max-seconds=1"]
+            document <- X.readFile X.def path
+            X.nameLocalName (X.elementName (X.documentRoot document)) `shouldBe` T.pack "protocol"
+
+    it "parks the spent budget as a residual with --partial" $
+      withStdin "⟦ φ ↦ 5.gt(Φ.nan) ⟧" $
+        testCLISucceeded
+          ["morph", "--locator=Q.@", "--max-steps=10", "--partial", "--flat", "--hide-rho", "--sweet"]
+          ["5.0.gt( Φ.nan )"]
+
+    describe "--partial" $ do
+      let stuck = "[[ @ -> [[ L> Sym_arg_0 ]].foo ]]"
+      it "fails on a λ function that cannot fire without the flag" $
+        withStdin stuck $
+          testCLIFailed ["morph", "--locator=Q.@"] ["No entry of --symbolic answers the λ function 'Sym_arg_0'"]
+
+      it "prints the residue with the stuck application intact and exits successfully" $
+        withStdin stuck $
+          testCLISucceeded
+            ["morph", "--locator=Q.@", "--partial", "--flat", "--hide-rho"]
+            ["⟦ λ ⤍ Sym_arg_0 ⟧.foo"]
+
+    describe "a copy a 'defer' line of a join defers" $ do
+      let joining = T.pack "- λ: L_fork\n  dataize:\n    𝛿1: $.c\n  morph:\n    𝑛1: $.a\n    𝑛2: $.b\n  defer:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  join:\n    on: 𝛿1\n    left: 𝑛3\n    right: 𝑛4\n"
+          counting = T.pack "- λ: L_inc\n  dataize:\n    𝛿1: $.x\n  𝑛: Φ.num( φ ↦ ⟦ λ ⤍ 𝜎 ⟧ )\n"
+          recordedWith :: T.Text -> [String] -> String -> IO [String]
+          recordedWith entries options program =
+            withTempFile "protocolXXXXXX.xml" $ \(path, stream) -> do
+              hClose stream
+              withLambdasOf entries $ \joins ->
+                withStdin program $
+                  testCLIFailed (["dataize", "--symbolic=" ++ joins, "--locator=Q.y", "--protocol=" ++ path, "--quiet", "--sweet", "--hide-rho"] ++ options) ["No entry of --symbolic answers the λ function 'L_fork'"]
+              lines <$> readProtocol path
+          deferred :: [String] -> String -> IO [String]
+          deferred = recordedWith joining
+      it "writes the copy it deferred to the XML protocol as a call of the object it was made of" $ do
+        records <- deferred [] "⟦ step(tup) ↦ ⟦ φ ↦ tup.next ⟧, items ↦ ⟦ tail ↦ ⟦ λ ⤍ 𝜎1 ⟧ ⟧, y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎2 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ Φ.step( tup ↦ Φ.items.tail ), λ ⤍ L_fork ⟧ ⟧"
+        records
+          `shouldBe` [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                     , "<dataize at=\"Φ.y\">"
+                     , "  <evaluate λ=\"L_fork\" by=\"dataize\" at=\"Φ.y\">"
+                     , "    <dataize at=\"ξ.c\">"
+                     , "      <manufactured meta=\"𝛿·1·1\">𝜎2</manufactured>"
+                     , "    </dataize>"
+                     , "    <bound meta=\"𝛿1·1\">𝛿·1·1</bound>"
+                     , "    <morph at=\"ξ.a\">"
+                     , "      <morphed meta=\"𝑛·1·1\">01-</morphed>"
+                     , "    </morph>"
+                     , "    <bound meta=\"𝑛1·1\">01-</bound>"
+                     , "    <morph at=\"ξ.b\">"
+                     , "      <remembered meta=\"𝑛·1·2\" as=\"Φ.step\"/>"
+                     , "      <applied meta=\"𝑛·1·3\" by=\"morph\" at=\"ξ.b\" of=\"Φ.step\"><ref attr=\"tup\">Φ.items.tail</ref></applied>"
+                     , "      <formed meta=\"𝑛·1·4\" of=\"Φ.step\"><ref attr=\"tup\">Φ.items.tail</ref></formed>"
+                     , "      <applied meta=\"𝑒·1·1\" of=\"𝑛·1·2\"><ref attr=\"tup\">Φ.items.tail</ref></applied>"
+                     , "      <remembered of=\"𝑛·1·4\" as=\"𝑒·1·1\"/>"
+                     , "      <morphed meta=\"𝑛·1·5\">𝑛·1·4</morphed>"
+                     , "    </morph>"
+                     , "    <bound meta=\"𝑛2·1\">𝑛·1·5</bound>"
+                     , "    <recalled of=\"𝑛·1·4\" as=\"𝑒·1·1\"/>"
+                     , "    <recalled of=\"𝑛·1·2\" as=\"Φ.step\"/>"
+                     , "    <deferred symbol=\"𝜎3\" by=\"morph\" at=\"𝑛2.φ\" of=\"Φ.step\"><with><symbol attr=\"tup\">𝜎1</symbol></with></deferred>"
+                     , "    <diverged left=\"01-\" right=\"𝜎3\" at=\".Δ\" reason=\"the join names no otherwise\"><left Δ=\"01-\"/><right/></diverged>"
+                     , "  </evaluate>"
+                     , "</dataize>"
+                     ]
+
+      it "names the object a deferred copy was made of through the formation its ρ holds" $ do
+        records <- deferred [] "⟦ joined(items) ↦ ⟦ φ ↦ step( tup ↦ items ), step(ρ, tup) ↦ ⟦ φ ↦ tup.next ⟧ ⟧, items ↦ ⟦ tail ↦ ⟦ λ ⤍ 𝜎1 ⟧ ⟧, y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎2 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ Φ.joined( items ↦ Φ.items.tail ).φ, λ ⤍ L_fork ⟧ ⟧"
+        records `shouldContain` ["    <deferred symbol=\"𝜎3\" by=\"morph\" at=\"𝑛2.φ\" of=\"Φ.joined.step\"><with><symbol attr=\"tup\">𝜎1</symbol></with></deferred>"]
+
+      it "names an argument of a deferred copy that is no bare symbol by the meta its morph bound, though an element formed it" $ do
+        records <- deferred [] "⟦ box(x, w) ↦ ⟦ φ ↦ x.next ⟧, items ↦ ⟦ tail ↦ ⟦ λ ⤍ 𝜎1 ⟧ ⟧, y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎2 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ Φ.box( x ↦ Φ.items.tail, w ↦ ⟦ z ↦ Φ ⟧ ), λ ⤍ L_fork ⟧ ⟧"
+        records `shouldContain` ["    <deferred symbol=\"𝜎3\" by=\"morph\" at=\"𝑛2.φ\" of=\"Φ.box\"><with><symbol attr=\"x\">𝜎1</symbol><meta attr=\"w\">𝑛·1·8</meta></with></deferred>"]
+
+      it "names a deferred copy of a formation the world does not declare by the element that formed it" $ do
+        records <- deferred [] "⟦ wrap(v) ↦ ⟦⟧, items ↦ ⟦ tail ↦ ⟦ λ ⤍ 𝜎1 ⟧ ⟧, y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎2 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ Φ.wrap( v ↦ ⟦ inner(x) ↦ ⟦ φ ↦ x.next ⟧ ⟧ ).v.inner( x ↦ Φ.items.tail ), λ ⤍ L_fork ⟧ ⟧"
+        records `shouldContain` ["    <formed meta=\"𝑒·1·3\"><symbol attr=\"x\">𝜎1</symbol><ref attr=\"φ\">x.next</ref></formed>", "    <deferred symbol=\"𝜎3\" by=\"morph\" at=\"𝑛2.φ\" of=\"𝑒·1·3\"/>"]
+
+      it "names an argument of a deferred copy by the object its morph answered" $ do
+        records <- recordedWith (joining <> counting) [] "⟦ box(x, w) ↦ ⟦ φ ↦ x.next ⟧, num(φ) ↦ ⟦⟧, inc(x) ↦ ⟦ λ ⤍ L_inc ⟧, items ↦ ⟦ tail ↦ ⟦ λ ⤍ 𝜎1 ⟧ ⟧, y ↦ ⟦ c ↦ ⟦ λ ⤍ 𝜎2 ⟧, a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ Φ.box( x ↦ Φ.items.tail, w ↦ Φ.inc( ⟦ Δ ⤍ 2A- ⟧ ) ), λ ⤍ L_fork ⟧ ⟧"
+        filter (isInfixOf "<deferred") records `shouldBe` ["    <deferred symbol=\"𝜎4\" by=\"morph\" at=\"𝑛2.φ\" of=\"Φ.box\"><with><symbol attr=\"x\">𝜎1</symbol><meta attr=\"w\">𝑛·2·6</meta></with></deferred>"]
+
+    describe "--acyclic=plausible" $ do
+      let twins = "[[ bytes ↦ ⟦ φ ↦ ∅ ⟧, number(φ) -> [[ plus(^, x) -> [[ L> L_number_plus ]] ]], pair(a, b) -> [[ L> L_pair ]], t -> Φ.pair( 7.plus( 5.plus( 6 ) ), 7.plus( 5.plus( 6 ) ) ).φ ]]"
+          pairs = T.pack "- λ: L_number_plus\n  dataize:\n    𝛿1: $.ρ\n    𝛿2: $.x\n  𝑛: Φ.number( φ ↦ ⟦ λ ⤍ 𝜎 ⟧ )\n- λ: L_pair\n  morph:\n    𝑛1: $.a\n    𝑛2: $.b\n  evaluate:\n    𝑛3: 𝑛1\n    𝑛4: 𝑛2\n  𝑛: ⟦ φ ↦ ⟦ a ↦ 𝑛3, b ↦ 𝑛4 ⟧ ⟧\n"
+          recorded :: String -> IO [String]
+          recorded mode =
+            withTempFile "protocolXXXXXX.txt" $ \(path, stream) -> do
+              hClose stream
+              withLambdasOf pairs $ \file ->
+                withStdin twins $
+                  testCLISucceeded
+                    ["morph", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=" ++ mode, "--minutes=" ++ path, "--quiet"]
+                    []
+              lines <$> readProtocol path
+      it "charges a formation once per argument spelling it under proven" $
+        withLambdasOf pairs $ \file ->
+          withStdin twins $
+            testCLIFailed
+              ["morph", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=proven", "--max-firings=4"]
+              ["[ERROR]: Evaluation did not finish before reaching the limit of firings: --max-firings=4"]
+
+      it "charges a firing the memo answers under plausible" $
+        withLambdasOf pairs $ \file ->
+          withStdin twins $
+            testCLIFailed
+              ["morph", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=plausible", "--max-firings=3"]
+              ["[ERROR]: Evaluation did not finish before reaching the limit of firings: --max-firings=3"]
+
+      it "answers every firing within the budget under plausible" $
+        withLambdasOf pairs $ \file ->
+          withStdin twins $
+            testCLISucceeded
+              ["morph", "--symbolic=" ++ file, "--locator=Q.t", "--acyclic=plausible", "--max-firings=4", "--flat", "--hide-rho", "--sweet"]
+              ["b ↦ ⟦ φ ↦ 𝜎2:λ, plus(x) ↦ L_number_plus:λ ⟧"]
+
+      it "reduces the operands of a formation once per argument spelling it under proven" $
+        recorded "proven" >>= (`shouldSatisfy` ((== 4) . length . filter (isInfixOf "𝛿1·")))
+
+      it "reduces the operands of a formation once for the run under plausible" $
+        recorded "plausible" >>= (`shouldSatisfy` ((== 2) . length . filter (isInfixOf "𝛿1·")))
+
+      it "writes a recalled firing at its own site under plausible" $
+        recorded "plausible" >>= (`shouldSatisfy` ((== 3) . length . filter (isInfixOf "𝔼(L_number_plus)")))
+
+      it "answers a recalled firing with the line of the first under plausible" $
+        recorded "plausible" >>= (`shouldContain` ["      𝑛·4·1 := 𝑛·2·21  # 𝑛"])
 
       it "dataizes to the same datum under plausible" $
         withStdin chained $
diff --git a/test/DataizeSpec.hs b/test/DataizeSpec.hs
--- a/test/DataizeSpec.hs
+++ b/test/DataizeSpec.hs
@@ -220,11 +220,14 @@
         `shouldBe` unlines
           [ "  𝔻(Φ):"
           , "    boxed 𝑛·0·1 := Φ.φ"
+          , "    normalized 𝑛·0·2 := 2.0.times( 3.0 ).nope( ρ ↦ Φ )  # Φ.φ"
           , "    𝕄(𝑛·0·1):"
-          , "      𝑛·0·2 := 2.0"
-          , "      𝑛·0·3 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), as-bytes ↦ φ, plus(ρ, x) ↦ L_number_plus:λ, times(ρ, x) ↦ L_number_times:λ, div(ρ, x) ↦ L_number_div:λ, gt(ρ, x) ↦ L_number_gt:λ, eq(ρ, x) ↦ ρ.as-bytes.eq( x.as-bytes ):φ, nope(ρ) ↦ L_number_nope:λ ⟧"
-          , "      𝑛·0·4 := 𝑛·0·2.times( x ↦ 3.0 )"
-          , "      𝑛·0·5 := ⟦ ρ ↦ 𝑛·0·2, x ↦ 3.0, λ ⤍ L_number_times ⟧"
+          , "      normalized 𝑛·0·3 := ⟦ φ ↦ ∅, as-bytes ↦ φ, plus(ρ, x) ↦ L_number_plus:λ, times(ρ, x) ↦ L_number_times:λ, div(ρ, x) ↦ L_number_div:λ, gt(ρ, x) ↦ L_number_gt:λ, eq(ρ, x) ↦ ρ.as-bytes.eq( x.as-bytes ):φ, nope(ρ) ↦ L_number_nope:λ ⟧  # Φ.number"
+          , "      𝑛·0·4 := 2.0"
+          , "      𝑛·0·5 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), as-bytes ↦ φ, plus(ρ, x) ↦ L_number_plus:λ, times(ρ, x) ↦ L_number_times:λ, div(ρ, x) ↦ L_number_div:λ, gt(ρ, x) ↦ L_number_gt:λ, eq(ρ, x) ↦ ρ.as-bytes.eq( x.as-bytes ):φ, nope(ρ) ↦ L_number_nope:λ ⟧"
+          , "      normalized 𝑛·0·6 := ⟦ ρ ↦ 𝑛·0·4, x ↦ ∅, λ ⤍ L_number_times ⟧  # 𝑛·0·5.times"
+          , "      𝑛·0·7 := 𝑛·0·4.times( x ↦ 3.0 )"
+          , "      𝑛·0·8 := ⟦ ρ ↦ 𝑛·0·4, x ↦ 3.0, λ ⤍ L_number_times ⟧"
           , "      𝔼(L_number_times):"
           , "        𝔻(ξ.ρ):"
           , "          𝕄(ξ.ρ):"
@@ -232,55 +235,61 @@
           , "            𝑛·1·2 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ ), as-bytes ↦ φ, plus(ρ, x) ↦ L_number_plus:λ, times(ρ, x) ↦ L_number_times:λ, div(ρ, x) ↦ L_number_div:λ, gt(ρ, x) ↦ L_number_gt:λ, eq(ρ, x) ↦ ρ.as-bytes.eq( x.as-bytes ):φ, nope(ρ) ↦ L_number_nope:λ ⟧"
           , "            morphed 𝑛·1·3 := 𝑛·1·2"
           , "          boxed 𝑛·1·4 := 𝑛·1·3.φ"
+          , "          normalized 𝑛·1·5 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ, ρ ↦ 𝑛·1·1 )  # 𝑛·1·4"
           , "          𝕄(𝑛·1·4):"
-          , "            𝑛·1·5 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )"
-          , "            𝑛·1·6 := ⟦ φ ↦ 40-00-00-00-00-00-00-00:Δ, not(ρ) ↦ L_bytes_not:λ, eq(ρ, b) ↦ L_bytes_eq:λ ⟧"
-          , "            morphed 𝑛·1·7 := 𝑛·1·6"
-          , "          boxed 𝑛·1·8 := 𝑛·1·7.φ"
+          , "            normalized 𝑛·1·6 := ⟦ φ ↦ ∅, not(ρ) ↦ L_bytes_not:λ, eq(ρ, b) ↦ L_bytes_eq:λ ⟧  # Φ.bytes"
+          , "            𝑛·1·7 := Φ.bytes( φ ↦ 40-00-00-00-00-00-00-00:Δ )"
+          , "            𝑛·1·8 := ⟦ φ ↦ 40-00-00-00-00-00-00-00:Δ, not(ρ) ↦ L_bytes_not:λ, eq(ρ, b) ↦ L_bytes_eq:λ ⟧"
+          , "            morphed 𝑛·1·9 := 𝑛·1·8"
+          , "          boxed 𝑛·1·10 := 𝑛·1·9.φ"
+          , "          normalized 𝑛·1·11 := 40-00-00-00-00-00-00-00:Δ  # 𝑛·1·10"
           , "          𝛿·1·1 := 40-00-00-00-00-00-00-00  # 2.0"
           , "        𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.ρ)"
           , "        𝔻(ξ.x):"
           , "          𝕄(ξ.x):"
-          , "            𝑛·1·9 := 3.0"
-          , "            𝑛·1·10 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), as-bytes ↦ φ, plus(ρ, x) ↦ L_number_plus:λ, times(ρ, x) ↦ L_number_times:λ, div(ρ, x) ↦ L_number_div:λ, gt(ρ, x) ↦ L_number_gt:λ, eq(ρ, x) ↦ ρ.as-bytes.eq( x.as-bytes ):φ, nope(ρ) ↦ L_number_nope:λ ⟧"
-          , "            morphed 𝑛·1·11 := 𝑛·1·10"
-          , "          boxed 𝑛·1·12 := 𝑛·1·11.φ"
-          , "          𝕄(𝑛·1·12):"
-          , "            𝑛·1·13 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )"
-          , "            𝑛·1·14 := ⟦ φ ↦ 40-08-00-00-00-00-00-00:Δ, not(ρ) ↦ L_bytes_not:λ, eq(ρ, b) ↦ L_bytes_eq:λ ⟧"
-          , "            morphed 𝑛·1·15 := 𝑛·1·14"
-          , "          boxed 𝑛·1·16 := 𝑛·1·15.φ"
+          , "            𝑛·1·12 := 3.0"
+          , "            𝑛·1·13 := ⟦ φ ↦ Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ ), as-bytes ↦ φ, plus(ρ, x) ↦ L_number_plus:λ, times(ρ, x) ↦ L_number_times:λ, div(ρ, x) ↦ L_number_div:λ, gt(ρ, x) ↦ L_number_gt:λ, eq(ρ, x) ↦ ρ.as-bytes.eq( x.as-bytes ):φ, nope(ρ) ↦ L_number_nope:λ ⟧"
+          , "            morphed 𝑛·1·14 := 𝑛·1·13"
+          , "          boxed 𝑛·1·15 := 𝑛·1·14.φ"
+          , "          normalized 𝑛·1·16 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ, ρ ↦ 𝑛·1·12 )  # 𝑛·1·15"
+          , "          𝕄(𝑛·1·15):"
+          , "            𝑛·1·17 := Φ.bytes( φ ↦ 40-08-00-00-00-00-00-00:Δ )"
+          , "            𝑛·1·18 := ⟦ φ ↦ 40-08-00-00-00-00-00-00:Δ, not(ρ) ↦ L_bytes_not:λ, eq(ρ, b) ↦ L_bytes_eq:λ ⟧"
+          , "            morphed 𝑛·1·19 := 𝑛·1·18"
+          , "          boxed 𝑛·1·20 := 𝑛·1·19.φ"
+          , "          normalized 𝑛·1·21 := 40-08-00-00-00-00-00-00:Δ  # 𝑛·1·20"
           , "          𝛿·1·2 := 40-08-00-00-00-00-00-00  # 3.0"
           , "        𝛿2·1 := 𝛿·1·2  # 𝔻(ξ.x)"
-          , "        𝑛·1·17 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
-          , "        𝕄(𝑛·1·17):"
-          , "          𝑛·1·18 := Φ.number( φ ↦ 𝜎1:λ )"
-          , "          𝑛·1·19 := ⟦ φ ↦ 𝜎1:λ, as-bytes ↦ φ, plus(ρ, x) ↦ L_number_plus:λ, times(ρ, x) ↦ L_number_times:λ, div(ρ, x) ↦ L_number_div:λ, gt(ρ, x) ↦ L_number_gt:λ, eq(ρ, x) ↦ ρ.as-bytes.eq( x.as-bytes ):φ, nope(ρ) ↦ L_number_nope:λ ⟧"
-          , "          morphed 𝑛·1·20 := 𝑛·1·19"
-          , "        𝑛·1·21 := 𝑛·1·20  # 𝕄(𝑛·1·17)"
-          , "      morphed 𝑛·0·6 := ⟦ ρ ↦ 𝑛·1·18, λ ⤍ L_number_nope ⟧"
-          , "    unanswered L_number_nope  # 𝔻(⟦ ρ ↦ 𝑛·1·18, λ ⤍ L_number_nope ⟧)"
+          , "        𝑛·1·22 := Φ.number( φ ↦ 𝜎1:λ )  # 𝑛"
+          , "        𝕄(𝑛·1·22):"
+          , "          𝑛·1·23 := Φ.number( φ ↦ 𝜎1:λ )"
+          , "          𝑛·1·24 := ⟦ φ ↦ 𝜎1:λ, as-bytes ↦ φ, plus(ρ, x) ↦ L_number_plus:λ, times(ρ, x) ↦ L_number_times:λ, div(ρ, x) ↦ L_number_div:λ, gt(ρ, x) ↦ L_number_gt:λ, eq(ρ, x) ↦ ρ.as-bytes.eq( x.as-bytes ):φ, nope(ρ) ↦ L_number_nope:λ ⟧"
+          , "          morphed 𝑛·1·25 := 𝑛·1·24"
+          , "        𝑛·1·26 := 𝑛·1·25  # 𝕄(𝑛·1·22)"
+          , "      normalized 𝑛·0·9 := ⟦ ρ ↦ 𝑛·1·23, λ ⤍ L_number_nope ⟧  # 𝑛·1·26.nope"
+          , "      morphed 𝑛·0·10 := ⟦ ρ ↦ 𝑛·1·23, λ ⤍ L_number_nope ⟧"
+          , "    unanswered L_number_nope  # 𝔻(⟦ ρ ↦ 𝑛·1·23, λ ⤍ L_number_nope ⟧)"
           ]
     it "leaves an unanswered λ function dataized directly as the whole residue" $ do
       ((outcome, chain), protocol) <- partially known "[[ L> Sym_arg_0 ]]"
       outcome `shouldBe` Residual placeholder
-      protocol `shouldBe` "  𝔻(Φ):\n    boxed 𝑛·0·1 := Φ.φ\n    unanswered Sym_arg_0  # 𝔻(Sym_arg_0:λ)\n"
+      protocol `shouldBe` "  𝔻(Φ):\n    boxed 𝑛·0·1 := Φ.φ\n    normalized 𝑛·0·2 := Sym_arg_0:λ  # Φ.φ\n    unanswered Sym_arg_0  # 𝔻(Sym_arg_0:λ)\n"
       map fst chain `shouldEndWith` [placeholder]
     it "closes a dataization with the datum the delta rule found" $ do
       (_, protocol) <- partially known "[[ @ -> [[ D> 01-02 ]] ]]"
-      protocol `shouldBe` "  𝔻(Φ):\n    boxed 𝑛·0·1 := Φ.φ\n    boxed 𝑛·0·2 := 01-02:Δ:φ.φ\n    𝛿·0·1 := 01-02\n"
+      protocol `shouldBe` "  𝔻(Φ):\n    boxed 𝑛·0·1 := Φ.φ\n    normalized 𝑛·0·2 := 01-02:Δ:φ  # Φ.φ\n    boxed 𝑛·0·3 := 𝑛·0·2.φ\n    normalized 𝑛·0·4 := 01-02:Δ  # 𝑛·0·3\n    𝛿·0·1 := 01-02\n"
     it "continues the block of a dataization the box rule enters again at the same site" $ do
       (_, protocol) <- partially known "[[ @ -> [[ @ -> [[ D> 0A- ]] ]] ]]"
-      protocol `shouldBe` "  𝔻(Φ):\n    boxed 𝑛·0·1 := Φ.φ\n    boxed 𝑛·0·2 := 0A-:Δ:φ:φ.φ\n    boxed 𝑛·0·3 := 0A-:Δ:φ.φ\n    𝛿·0·1 := 0A-\n"
+      protocol `shouldBe` "  𝔻(Φ):\n    boxed 𝑛·0·1 := Φ.φ\n    normalized 𝑛·0·2 := 0A-:Δ:φ:φ  # Φ.φ\n    boxed 𝑛·0·3 := 𝑛·0·2.φ\n    normalized 𝑛·0·4 := 0A-:Δ:φ  # 𝑛·0·3\n    boxed 𝑛·0·5 := 𝑛·0·4.φ\n    normalized 𝑛·0·6 := 0A-:Δ  # 𝑛·0·5\n    𝛿·0·1 := 0A-\n"
     it "writes the two morphings of one dataization as two blocks" $ do
       (_, protocol) <- partially known "73.25"
       length (filter (isPrefixOf "    𝕄(") (lines protocol)) `shouldBe` 2
     it "writes every box step of a dataization into the protocol" $ do
       (_, protocol) <- partially known "73.25"
-      filter (isInfixOf "boxed") (lines protocol) `shouldBe` ["    boxed 𝑛·0·1 := Φ.φ", "    boxed 𝑛·0·5 := 𝑛·0·4.φ", "    boxed 𝑛·0·9 := 𝑛·0·8.φ"]
+      filter (isInfixOf "boxed") (lines protocol) `shouldBe` ["    boxed 𝑛·0·1 := Φ.φ", "    boxed 𝑛·0·7 := 𝑛·0·6.φ", "    boxed 𝑛·0·13 := 𝑛·0·12.φ"]
     it "names the morphing that follows a box step by the meta the box step bound" $ do
       (_, protocol) <- partially known "73.25"
-      lines protocol `shouldContain` ["    boxed 𝑛·0·1 := Φ.φ", "    𝕄(𝑛·0·1):"]
+      lines protocol `shouldContain` ["    boxed 𝑛·0·1 := Φ.φ", "    normalized 𝑛·0·2 := 73.25  # Φ.φ", "    𝕄(𝑛·0·1):"]
     it "still reaches the manufactured datum when nothing is stuck" $ do
       ((outcome, _), _) <- partially known "2.times(3)"
       outcome `shouldBe` Dataized (BtMany ["40", "45", "00", "00", "00", "00", "00", "00"])
@@ -295,10 +304,10 @@
       outcome `shouldBe` Residual ExTermination
     it "writes the terminator ⊥ the object reduces to into the protocol" $ do
       (_, protocol) <- partially known "⊥"
-      protocol `shouldBe` "  𝔻(Φ):\n    boxed 𝑛·0·1 := Φ.φ\n  unanswered ⊥  # 𝔻(⊥)\n"
+      protocol `shouldBe` "  𝔻(Φ):\n    boxed 𝑛·0·1 := Φ.φ\n    normalized 𝑛·0·2 := ⊥  # Φ.φ\n  unanswered ⊥  # 𝔻(⊥)\n"
 
   describe "ReduceContext's --max-depth/--max-cycles reach into the normalization it splices in" $ do
-    let boxed = "[[ @ -> [[ D> 00- ]] ]]"
+    let wrapped = "[[ @ -> [[ D> 00- ]] ]]"
     forM_
       [
         ( "--max-cycles"
@@ -318,12 +327,12 @@
             dataize expr emptyState ctx `shouldThrow` (\e -> message `isInfixOf` show (e :: SomeException))
       )
     it "does not throw without --depth-sensitive even once --max-depth is exhausted" $ do
-      expr <- parseExpressionThrows boxed
+      expr <- parseExpressionThrows wrapped
       minted <- newIORef 0
       (value, _, _) <- dataize expr emptyState (ReduceContext ExRoot ExRoot Nothing 1 25 Nothing Nothing (Steps 250 0) Nothing minted Nothing Nothing 1 Nothing False True False Nothing 0 Dataization [] Map.empty Nothing emptyLambdas [] False (building linked) reduction evaluation dontSaveStep dontSaveEval linked)
       value `shouldBe` Dataized (BtOne "00")
     it "throws once --max-cycles is exhausted even without --depth-sensitive" $ do
-      expr <- parseExpressionThrows boxed
+      expr <- parseExpressionThrows wrapped
       minted <- newIORef 0
       dataize expr emptyState (ReduceContext ExRoot ExRoot Nothing 25 0 Nothing Nothing (Steps 250 0) Nothing minted Nothing Nothing 1 Nothing False True False Nothing 0 Dataization [] Map.empty Nothing emptyLambdas [] False (building linked) reduction evaluation dontSaveStep dontSaveEval linked)
         `shouldThrow` (\e -> "--max-cycles=0" `isInfixOf` show (e :: SomeException))
diff --git a/test/DepsSpec.hs b/test/DepsSpec.hs
--- a/test/DepsSpec.hs
+++ b/test/DepsSpec.hs
@@ -12,7 +12,7 @@
 import Data.List (isInfixOf, isPrefixOf)
 import Data.Time (LocalTime (LocalTime), TimeOfDay (TimeOfDay), ZonedTime (ZonedTime), fromGregorian, hoursToTimeZone)
 import Data.Time.Clock.POSIX (getPOSIXTime)
-import Deps (Acyclic (Proven), Evaluation (EvAnswer, EvApplied, EvBound, EvBoxed, EvBuilt, EvCast, EvData, EvDeferred, EvDelta, EvDiverged, EvFabricated, EvFiring, EvHeader, EvJoined, EvLooped, EvManufactured, EvMemoized, EvMorphed, EvRecalled, EvRemembered, EvReshaped, EvRun, EvStarted, EvStuck, EvStuckOn, EvSymbolized, EvTaken, EvTerm, EvUndressed, EvUnripe, EvWorld), Header (Header), Judgment (Dataization, Evaluation, Morphing), Nesting (..), Protocol (..), World (World), dontSaveEval, dontSaveStep, emptyNesting, emptyProgress, emptyProtocol, endEval, endEvalXml, perSecond, progressed, resited, saveStep)
+import Deps (Acyclic (Proven), Evaluation (EvAnswer, EvApplied, EvBound, EvBoxed, EvBuilt, EvCast, EvData, EvDeferred, EvDelta, EvDiverged, EvFabricated, EvFiring, EvGuarded, EvHeader, EvJoined, EvLooped, EvManufactured, EvMemoized, EvMorphed, EvNormalized, EvRecalled, EvRemembered, EvReshaped, EvRun, EvStarted, EvStuck, EvStuckOn, EvSymbolized, EvTaken, EvTerm, EvUndressed, EvUnripe, EvWorld), Header (Header), Judgment (Dataization, Evaluation, Morphing), Nesting (..), Protocol (..), World (World), dontSaveEval, dontSaveStep, emptyNesting, emptyProgress, emptyProtocol, endEval, endEvalXml, perSecond, progressed, resited, saveStep)
 import Fixtures (readUtf8, recorded, recordedWhole, recordedXml)
 import Forks (Refusal (..), Side (..))
 import GHC.Clock (getMonotonicTime)
@@ -183,6 +183,15 @@
     it "writes the term a morphing came to as a line binding it to a fresh 𝑛 under the heading of the morphing" $ do
       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "жук")), EvMorphed 2 (ExDispatch ExRoot (AtLabel "щука"))])
       lines written `shouldBe` ["𝕄(Φ):", "  𝕄(Φ.жук):", "    morphed 𝑛·0·1 := Φ.щука"]
+    it "writes the term a normalization came to as a line binding it to a fresh 𝑛 and naming what it came from" $ do
+      (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "лось")), EvNormalized 2 (ExDispatch (ExDispatch ExRoot (AtLabel "кедр")) (AtLabel "шишка")) (ExDispatch ExRoot (AtLabel "выпь"))])
+      lines written `shouldBe` ["𝕄(Φ):", "  𝕄(Φ.лось):", "    normalized 𝑛·0·1 := Φ.выпь  # Φ.кедр.шишка"]
+    it "names the term a normalization came from by the line that wrote it" $ do
+      (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "ива")), EvMorphed 2 (ExFormation [BiTau (AtLabel "лист") (ExFormation [])]), EvNormalized 2 (ExApplication (ExFormation [BiTau (AtLabel "лист") (ExFormation [])]) (ArTau (AtLabel "сок") (ExDispatch ExRoot (AtLabel "клён")))) ExTermination])
+      last (lines written) `shouldBe` "    normalized 𝑛·0·2 := ⊥  # 𝑛·0·1( сок ↦ Φ.клён )"
+    it "writes no line for a normalization that came to a term an earlier line named" $ do
+      (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "ель")), EvMorphed 2 (ExFormation [BiTau (AtLabel "хвоя") (ExFormation [])]), EvNormalized 2 (ExApplication (ExFormation [BiTau (AtLabel "хвоя") (ExFormation [])]) (ArTau AtRho ExRoot)) (ExFormation [BiTau (AtLabel "хвоя") (ExFormation [])])])
+      lines written `shouldBe` ["𝕄(Φ):", "  𝕄(Φ.ель):", "    morphed 𝑛·0·1 := ⟦⟧:хвоя"]
     it "spells the term a morphing came to by the name of the formation an application made" $ do
       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvStarted 1 Morphing (ExDispatch ExRoot (AtLabel "w")), EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) (ExDispatch ExRoot (AtLabel "w")), EvMorphed 2 (ExFormation [BiTau (AtLabel "q") (ExFormation [])])])
       last (lines written) `shouldBe` "    morphed 𝑛·0·3 := 𝑛·0·2"
@@ -303,6 +312,15 @@
     it "writes the double eight bytes hold beside the symbol a symbolize line minted for them" $ do
       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvSymbolized 2 6 (BtMany ["C0", "09", "1E", "B8", "51", "EB", "85", "1F"])])
       last (lines written) `shouldBe` "    symbolized 𝜎6 := C0-09-1E-B8-51-EB-85-1F  # -3.14"
+    it "names the data line of the firing holding the datum a symbolize line minted a symbol for" $ do
+      (_, written) <- recorded (\record -> mapM_ record [EvRun Dataization "Φ", EvFiring 1 "L_ж" Dataization ExRoot, EvDelta 3 (BtOne "E7"), EvData 2 "𝛿3" (ExDispatch ExXi (AtLabel "щ")) (Right (BtOne "E7")), EvSymbolized 2 9 (BtOne "E7")])
+      last (lines written) `shouldBe` "    symbolized 𝜎9 := E7-  # 𝛿3·1"
+    it "names the data line before the double eight bytes hold beside the symbol a symbolize line minted" $ do
+      (_, written) <- recorded (\record -> mapM_ record [EvRun Dataization "Φ", EvFiring 1 "L_ж" Dataization ExRoot, EvDelta 3 (BtMany ["C0", "09", "1E", "B8", "51", "EB", "85", "1F"]), EvData 2 "𝛿2" (ExDispatch ExXi (AtLabel "ё")) (Right (BtMany ["C0", "09", "1E", "B8", "51", "EB", "85", "1F"])), EvSymbolized 2 4 (BtMany ["C0", "09", "1E", "B8", "51", "EB", "85", "1F"])])
+      last (lines written) `shouldBe` "    symbolized 𝜎4 := C0-09-1E-B8-51-EB-85-1F  # 𝛿2·1, -3.14"
+    it "dont name a data line of another firing beside the symbol a symbolize line minted" $ do
+      (_, written) <- recorded (\record -> mapM_ record [EvRun Dataization "Φ", EvFiring 1 "L_ж" Dataization ExRoot, EvDelta 3 (BtOne "5C"), EvData 2 "𝛿1" (ExDispatch ExXi (AtLabel "щ")) (Right (BtOne "5C")), EvFiring 1 "L_з" Dataization ExRoot, EvSymbolized 2 7 (BtOne "5C")])
+      last (lines written) `shouldBe` "    symbolized 𝜎7 := 5C-"
     it "writes the meta a cast bound beside the meta it read and the meta whose shape it took" $ do
       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvCast 2 "𝑛9" (ExMeta "n2") (ExMeta "n4") (ExFormation [BiTau AtPhi (ExFormation [BiLambda (FnSymbol 7)]), BiTau (AtLabel "щ") (ExDispatch ExRoot (AtLabel "ёж"))])])
       last (lines written) `shouldBe` "    cast 𝑛9·1 := ⟦ φ ↦ 𝜎7:λ, щ ↦ Φ.ёж ⟧  # 𝑛2·1 up to 𝑛4·1"
@@ -336,6 +354,12 @@
     it "writes the object a side raises with beside the symbol standing for ⊥ in a join" $ do
       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "бросок")) (ArTau (AtLabel "весть") (ExFormation []))) (ExFormation [BiTau (AtLabel "весть") (ExFormation []), BiLambda (Function "L_бросок")]) ExRoot, EvJoined 2 (Left "𝛿1") 4 (2, 3) (Just 3) (Just (ExFormation [BiTau (AtLabel "весть") (ExFormation []), BiLambda (Function "L_бросок")]))])
       last (lines written) `shouldBe` "    joined 𝜎4 := 𝛿1·1 ? 𝜎2 : 𝜎3  # where 𝜎3 is ⊥ raised by 𝑛·1·2"
+    it "writes a side a join kept since the other one is ⊥ beside the condition guarding it" $ do
+      (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvGuarded 2 (Left "𝛿1") (ExMeta "n1", ExDispatch ExRoot (AtLabel "ёж")) (ExMeta "n2", ExTermination) Righthand Nothing])
+      last (lines written) `shouldBe` "    guarded 𝛿1·1 ? 𝑛1·1 : 𝑛2·1  # where 𝑛2·1 is ⊥"
+    it "writes a side a join kept since the left one is ⊥ with the object it raises with" $ do
+      (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "бросок")) (ArTau (AtLabel "весть") (ExFormation []))) (ExFormation [BiTau (AtLabel "весть") (ExFormation []), BiLambda (Function "L_бросок")]) ExRoot, EvGuarded 2 (Right (ExDispatch ExXi (AtLabel "щит"))) (ExMeta "n3", ExTermination) (ExMeta "n4", ExDispatch ExRoot (AtLabel "ёж")) Lefthand (Just (ExFormation [BiTau (AtLabel "весть") (ExFormation []), BiLambda (Function "L_бросок")]))])
+      last (lines written) `shouldBe` "    guarded ξ.щит ? 𝑛3·1 : 𝑛4·1  # where 𝑛3·1 is ⊥ raised by 𝑛·1·2"
     it "writes two sides a join could not join by the formations applications made" $ do
       (_, written) <- recorded (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExFormation []))) (ExFormation [BiTau (AtLabel "q") (ExFormation [])]) ExRoot, EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "жук")) (ArTau (AtLabel "w") (ExFormation []))) (ExFormation [BiTau (AtLabel "w") (ExFormation [])]) ExRoot, EvDiverged 2 (ExDispatch ExXi (AtLabel "then"), ExFormation [BiTau (AtLabel "q") (ExFormation [])]) (ExDispatch ExXi (AtLabel "else"), ExFormation [BiTau (AtLabel "w") (ExFormation [])]) [AtLabel "q"] Unnamed])
       last (lines written) `shouldBe` "    diverged 𝑛·1·2 vs 𝑛·1·4  # cannot join: at .q the left side has q ↦ ⟦⟧ and the right side has no q; cannot fabricate: the join names no otherwise"
@@ -547,6 +571,12 @@
     it "writes the term a morphing came to as an element with its name" $ do
       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvMorphed 1 (ExDispatch ExRoot (AtLabel "щука"))])
       lines written `shouldContain` ["  <morphed meta=\"𝑛·0·1\">Φ.щука</morphed>"]
+    it "writes the term a normalization came to as an element with its name and what it came from" $ do
+      (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvNormalized 1 (ExDispatch (ExDispatch ExRoot (AtLabel "бор")) (AtLabel "пень")) (ExDispatch ExRoot (AtLabel "сыч"))])
+      lines written `shouldContain` ["  <normalized meta=\"𝑛·0·1\" of=\"Φ.бор.пень\">Φ.сыч</normalized>"]
+    it "writes no element for a normalization that came to a term an earlier element named" $ do
+      (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvMorphed 1 (ExFormation [BiTau (AtLabel "мох") (ExFormation [])]), EvNormalized 1 (ExApplication (ExFormation [BiTau (AtLabel "мох") (ExFormation [])]) (ArTau AtRho ExRoot)) (ExFormation [BiTau (AtLabel "мох") (ExFormation [])])])
+      length [line | line <- lines written, "<normalized" `isInfixOf` line] `shouldBe` 0
     it "writes a morphing that came to a termination as an element holding it" $ do
       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvMorphed 1 ExTermination])
       lines written `shouldContain` ["  <morphed meta=\"𝑛·0·1\">⊥</morphed>"]
@@ -676,6 +706,12 @@
     it "writes no terminator in the markup for a pair of a join that met ⊥ elsewhere" $ do
       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvJoined 2 (Left "𝛿2") 23 (8, 14) (Just 21) Nothing])
       lines written `shouldContain` ["    <joined symbol=\"𝜎23\" on=\"𝛿2·1\" left=\"𝜎8\" right=\"𝜎14\"/>"]
+    it "writes a side a join kept since the other one is ⊥ as an element naming the side that raises" $ do
+      (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvGuarded 2 (Left "𝛿4") (ExMeta "n1", ExDispatch ExRoot (AtLabel "ёж")) (ExMeta "n2", ExTermination) Righthand Nothing])
+      lines written `shouldContain` ["    <guarded on=\"𝛿4·1\" left=\"𝑛1·1\" right=\"𝑛2·1\" terminator=\"right\"/>"]
+    it "names in the markup the object the side a guard kept away raises with" $ do
+      (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "бросок")) (ArTau (AtLabel "весть") (ExFormation []))) (ExFormation [BiTau (AtLabel "весть") (ExFormation []), BiLambda (Function "L_бросок")]) ExRoot, EvGuarded 2 (Right (ExDispatch ExXi (AtLabel "щит"))) (ExMeta "n3", ExTermination) (ExMeta "n4", ExDispatch ExRoot (AtLabel "ёж")) Lefthand (Just (ExFormation [BiTau (AtLabel "весть") (ExFormation []), BiLambda (Function "L_бросок")]))])
+      lines written `shouldContain` ["    <guarded on=\"ξ.щит\" left=\"𝑛3·1\" right=\"𝑛4·1\" terminator=\"left\" raised=\"𝑛·1·2\"/>"]
     it "writes two sides a join could not join as an element naming both" $ do
       (_, written) <- recordedXml (\record -> mapM_ record [EvRun Morphing "Φ", EvFiring 1 "L_ф" Morphing ExRoot, EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "ёж")) (ArTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю")))) (ExFormation [BiTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю"))]) ExRoot, EvApplied 2 Morphing (ExApplication (ExDispatch ExRoot (AtLabel "жук")) (ArTau (AtLabel "w") (ExDispatch ExRoot (AtLabel "ю")))) (ExFormation [BiTau (AtLabel "w") (ExDispatch ExRoot (AtLabel "ю"))]) ExRoot, EvDiverged 2 (ExDispatch ExXi (AtLabel "then"), ExFormation [BiTau (AtLabel "q") (ExDispatch ExRoot (AtLabel "ю"))]) (ExDispatch ExXi (AtLabel "else"), ExFormation [BiTau (AtLabel "w") (ExDispatch ExRoot (AtLabel "ю"))]) [AtLabel "q"] Unnamed])
       lines written `shouldContain` ["    <diverged left=\"𝑛·1·2\" right=\"𝑛·1·4\" at=\".q\" reason=\"the join names no otherwise\"><left><ref attr=\"q\">Φ.ю</ref></left><right/></diverged>"]
diff --git a/test/ForksSpec.hs b/test/ForksSpec.hs
--- a/test/ForksSpec.hs
+++ b/test/ForksSpec.hs
@@ -70,8 +70,12 @@
       apart "⟦ ub ↦ ⊥, xe ↦ ⊥ ⟧" "⟦ ub ↦ ⟦ λ ⤍ 𝜎5 ⟧, xe ↦ ⟦ λ ⤍ 𝜎6 ⟧ ⟧" >>= (`shouldBe` Right (expected, [(43, (42, 5)), (44, (42, 6))], Just 42, 44))
     it "mints nothing for two sides of ⊥" $
       joined ExTermination ExTermination 4 `shouldBe` Right (ExTermination, [], Nothing, 4)
-    it "tells no attribute of ⊥ and a side holding no symbol to stand for ⊥" $
-      apart "⟦ φ ↦ Φ.ab, ko ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" "⊥" >>= (`shouldBe` Left [])
+    it "keeps as it is a side facing ⊥ that holds no symbol to stand for ⊥" $ do
+      expected <- parseExpressionThrows "⟦ φ ↦ Φ.ab, ko ↦ ⟦ Δ ⤍ 01- ⟧ ⟧"
+      apart "⟦ φ ↦ Φ.ab, ko ↦ ⟦ Δ ⤍ 01- ⟧ ⟧" "⊥" >>= (`shouldBe` Right (expected, [], Nothing, 41))
+    it "keeps as it is a side holding no symbol that ⊥ faces from the left" $ do
+      expected <- parseExpressionThrows "⟦ x ↦ ∅, φ ↦ ξ.x.yu ⟧"
+      apart "⊥" "⟦ x ↦ ∅, φ ↦ ξ.x.yu ⟧" >>= (`shouldBe` Right (expected, [], Nothing, 41))
     it "tells the attribute of a formation binding ⊥ where the other one binds no symbol" $
       apart "⟦ φ ↦ ⊥ ⟧" "⟦ φ ↦ Φ.ix ⟧" >>= (`shouldBe` Left [AtPhi])
 
@@ -135,9 +139,18 @@
     it "hands the voids of a copy of the function to a side that does not bind its attribute" $ do
       expected <- parseExpressionThrows "⟦ left🌵 ↦ ⟦ ke ↦ ⟦ ev ↦ ∅, jo ↦ ∅ ⟧ ⟧, right🌵 ↦ ⟦ φ ↦ Φ.ty ⟧, ke ↦ ⟦ ρ ↦ ∅, λ ⤍ L_pu, ev ↦ ∅, jo ↦ ∅, on🌵 ↦ ⟦ Δ ⤍ 5C- ⟧, left🌵 ↦ ξ.ρ.left🌵.ke( ev ↦ ξ.ev, jo ↦ ξ.jo ), right🌵 ↦ ξ.ρ.right🌵.ke( ev ↦ ξ.ev, jo ↦ ξ.jo ) ⟧, φ ↦ ⟦ ρ ↦ ∅, λ ⤍ L_pu, on🌵 ↦ ⟦ Δ ⤍ 5C- ⟧, left🌵 ↦ ξ.ρ.left🌵.φ, right🌵 ↦ ξ.ρ.right🌵.φ ⟧ ⟧"
       fork "L_pu" (Right (BtOne "5C")) "⟦ ke ↦ ⟦ ev ↦ ∅, jo ↦ ∅ ⟧ ⟧" "⟦ φ ↦ Φ.ty ⟧" >>= (`shouldBe` Right expected)
-    it "keeps an attribute both sides bind to the same attribute of the fabricated formation" $ do
-      expected <- parseExpressionThrows "⟦ left🌵 ↦ ⟦ wa ↦ ⟦ ov ↦ ∅, φ ↦ ξ.ov ⟧, ky ↦ ξ.wa ⟧, right🌵 ↦ ⟦ wa ↦ ⟦ ov ↦ ∅, ip ↦ ∅, φ ↦ ξ.ip ⟧, ky ↦ ξ.wa ⟧, wa ↦ ⟦ ρ ↦ ∅, λ ⤍ L_ko, ov ↦ ∅, ip ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎14 ⟧, left🌵 ↦ ξ.ρ.left🌵.wa( ov ↦ ξ.ov ), right🌵 ↦ ξ.ρ.right🌵.wa( ov ↦ ξ.ov, ip ↦ ξ.ip ) ⟧, ky ↦ ξ.wa ⟧"
+    it "takes the voids of the formation an attribute both sides alias as voids of its copy of the function" $ do
+      expected <- parseExpressionThrows "⟦ left🌵 ↦ ⟦ wa ↦ ⟦ ov ↦ ∅, φ ↦ ξ.ov ⟧, ky ↦ ξ.wa ⟧, right🌵 ↦ ⟦ wa ↦ ⟦ ov ↦ ∅, ip ↦ ∅, φ ↦ ξ.ip ⟧, ky ↦ ξ.wa ⟧, wa ↦ ⟦ ρ ↦ ∅, λ ⤍ L_ko, ov ↦ ∅, ip ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎14 ⟧, left🌵 ↦ ξ.ρ.left🌵.wa( ov ↦ ξ.ov ), right🌵 ↦ ξ.ρ.right🌵.wa( ov ↦ ξ.ov, ip ↦ ξ.ip ) ⟧, ky ↦ ⟦ ρ ↦ ∅, λ ⤍ L_ko, ov ↦ ∅, ip ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎14 ⟧, left🌵 ↦ ξ.ρ.left🌵.ky( ov ↦ ξ.ov ), right🌵 ↦ ξ.ρ.right🌵.ky( ov ↦ ξ.ov, ip ↦ ξ.ip ) ⟧ ⟧"
       fork "L_ko" (Left 14) "⟦ wa ↦ ⟦ ov ↦ ∅, φ ↦ ξ.ov ⟧, ky ↦ ξ.wa ⟧" "⟦ wa ↦ ⟦ ov ↦ ∅, ip ↦ ∅, φ ↦ ξ.ip ⟧, ky ↦ ξ.wa ⟧" >>= (`shouldBe` Right expected)
+    it "takes the voids of the formation an attribute only the left side aliases as voids of its copy of the function" $ do
+      expected <- parseExpressionThrows "⟦ left🌵 ↦ ⟦ fk ↦ ⟦ le ↦ ∅, ri ↦ ∅ ⟧, ik ↦ ξ.fk ⟧, right🌵 ↦ ⟦ φ ↦ Φ.dw ⟧, fk ↦ ⟦ ρ ↦ ∅, λ ⤍ L_vo, le ↦ ∅, ri ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎22 ⟧, left🌵 ↦ ξ.ρ.left🌵.fk( le ↦ ξ.le, ri ↦ ξ.ri ), right🌵 ↦ ξ.ρ.right🌵.fk( le ↦ ξ.le, ri ↦ ξ.ri ) ⟧, ik ↦ ⟦ ρ ↦ ∅, λ ⤍ L_vo, le ↦ ∅, ri ↦ ∅, on🌵 ↦ ⟦ λ ⤍ 𝜎22 ⟧, left🌵 ↦ ξ.ρ.left🌵.ik( le ↦ ξ.le, ri ↦ ξ.ri ), right🌵 ↦ ξ.ρ.right🌵.ik( le ↦ ξ.le, ri ↦ ξ.ri ) ⟧, φ ↦ ⟦ ρ ↦ ∅, λ ⤍ L_vo, on🌵 ↦ ⟦ λ ⤍ 𝜎22 ⟧, left🌵 ↦ ξ.ρ.left🌵.φ, right🌵 ↦ ξ.ρ.right🌵.φ ⟧ ⟧"
+      fork "L_vo" (Left 22) "⟦ fk ↦ ⟦ le ↦ ∅, ri ↦ ∅ ⟧, ik ↦ ξ.fk ⟧" "⟦ φ ↦ Φ.dw ⟧" >>= (`shouldBe` Right expected)
+    it "follows a chain of aliases down to the formation it ends in" $ do
+      expected <- parseExpressionThrows "⟦ left🌵 ↦ ⟦ φ ↦ Φ.gu ⟧, right🌵 ↦ ⟦ oq ↦ ξ.ha, ha ↦ ξ.ym, ym ↦ ⟦ qe ↦ ∅ ⟧ ⟧, φ ↦ ⟦ ρ ↦ ∅, λ ⤍ L_bx, on🌵 ↦ ⟦ Δ ⤍ 4D- ⟧, left🌵 ↦ ξ.ρ.left🌵.φ, right🌵 ↦ ξ.ρ.right🌵.φ ⟧, oq ↦ ⟦ ρ ↦ ∅, λ ⤍ L_bx, qe ↦ ∅, on🌵 ↦ ⟦ Δ ⤍ 4D- ⟧, left🌵 ↦ ξ.ρ.left🌵.oq( qe ↦ ξ.qe ), right🌵 ↦ ξ.ρ.right🌵.oq( qe ↦ ξ.qe ) ⟧, ha ↦ ⟦ ρ ↦ ∅, λ ⤍ L_bx, qe ↦ ∅, on🌵 ↦ ⟦ Δ ⤍ 4D- ⟧, left🌵 ↦ ξ.ρ.left🌵.ha( qe ↦ ξ.qe ), right🌵 ↦ ξ.ρ.right🌵.ha( qe ↦ ξ.qe ) ⟧, ym ↦ ⟦ ρ ↦ ∅, λ ⤍ L_bx, qe ↦ ∅, on🌵 ↦ ⟦ Δ ⤍ 4D- ⟧, left🌵 ↦ ξ.ρ.left🌵.ym( qe ↦ ξ.qe ), right🌵 ↦ ξ.ρ.right🌵.ym( qe ↦ ξ.qe ) ⟧ ⟧"
+      fork "L_bx" (Right (BtOne "4D")) "⟦ φ ↦ Φ.gu ⟧" "⟦ oq ↦ ξ.ha, ha ↦ ξ.ym, ym ↦ ⟦ qe ↦ ∅ ⟧ ⟧" >>= (`shouldBe` Right expected)
+    it "leaves a circle of aliases as it is" $ do
+      expected <- parseExpressionThrows "⟦ left🌵 ↦ ⟦ ec ↦ ξ.ul, ul ↦ ξ.ec ⟧, right🌵 ↦ ⟦ ec ↦ ⟦ ah ↦ ∅ ⟧ ⟧, ec ↦ ⟦ ρ ↦ ∅, λ ⤍ L_jt, ah ↦ ∅, on🌵 ↦ ⟦ Δ ⤍ 0E- ⟧, left🌵 ↦ ξ.ρ.left🌵.ec( ah ↦ ξ.ah ), right🌵 ↦ ξ.ρ.right🌵.ec( ah ↦ ξ.ah ) ⟧, ul ↦ ⟦ ρ ↦ ∅, λ ⤍ L_jt, on🌵 ↦ ⟦ Δ ⤍ 0E- ⟧, left🌵 ↦ ξ.ρ.left🌵.ul, right🌵 ↦ ξ.ρ.right🌵.ul ⟧ ⟧"
+      fork "L_jt" (Right (BtOne "0E")) "⟦ ec ↦ ξ.ul, ul ↦ ξ.ec ⟧" "⟦ ec ↦ ⟦ ah ↦ ∅ ⟧ ⟧" >>= (`shouldBe` Right expected)
     it "asks the copies of both sides for an attribute both bind to an attribute the fabricated formation lacks" $ do
       expected <- parseExpressionThrows "⟦ left🌵 ↦ ⟦ ky ↦ ξ.ub ⟧, right🌵 ↦ ⟦ ky ↦ ξ.ub ⟧, ky ↦ ⟦ ρ ↦ ∅, λ ⤍ L_ex, on🌵 ↦ ⟦ Δ ⤍ 2A- ⟧, left🌵 ↦ ξ.ρ.left🌵.ky, right🌵 ↦ ξ.ρ.right🌵.ky ⟧ ⟧"
       fork "L_ex" (Right (BtOne "2A")) "⟦ ky ↦ ξ.ub ⟧" "⟦ ky ↦ ξ.ub ⟧" >>= (`shouldBe` Right expected)
diff --git a/test/MorphSpec.hs b/test/MorphSpec.hs
--- a/test/MorphSpec.hs
+++ b/test/MorphSpec.hs
@@ -21,7 +21,7 @@
 import Data.Text qualified as T
 import Data.Yaml qualified as Decode
 import Dataize (Outcome (..), dataize)
-import Deps (Acyclic (..), Evaluation (EvLooped, EvMorphed, EvRecalled, EvWorld), Judgment (..), State, Term (TeExpression))
+import Deps (Acyclic (..), Evaluation (EvLooped, EvMorphed, EvNormalized, EvRecalled, EvWorld), Judgment (..), State, Term (TeExpression))
 import Engine (Engine (_normal))
 import Files (allPathsIn)
 import Fixtures (defaultReduceContext, fixtureLambdas, linked, overdue, primitives)
@@ -130,6 +130,25 @@
       records <- readIORef told
       length [term | EvMorphed _ term <- records] `shouldBe` 1
 
+    it "tells the protocol the term a normalize premise came from beside the term it came to" $ do
+      expr <- parseExpressionThrows "⟦ wy ↦ ⟦ kx ↦ ∅ ⟧, y ↦ Φ.wy( kx ↦ Φ.vu ) ⟧"
+      loc <- parseExpressionThrows "Q.y"
+      told <- newIORef []
+      ctx <- defaultReduceContext loc
+      _ <- morph expr emptyState ctx{_saveEval = \record -> modifyIORef' told (record :)}
+      records <- readIORef told
+      head' <- parseExpressionThrows "⟦ kx ↦ ∅ ⟧( kx ↦ Φ.vu )"
+      [source | EvNormalized _ source _ <- records] `shouldContain` [head']
+
+    it "tells the protocol nothing of a normalize premise that only dropped the arguments of the term it came to" $ do
+      expr <- parseExpressionThrows "⟦ zq ↦ ⊥, y ↦ Φ.zq( ab ↦ Φ.zq ) ⟧"
+      loc <- parseExpressionThrows "Q.y"
+      told <- newIORef []
+      ctx <- defaultReduceContext loc
+      _ <- morph expr emptyState ctx{_saveEval = \record -> modifyIORef' told (record :)}
+      records <- readIORef told
+      [source | EvNormalized _ source@(ExApplication _ _) _ <- records] `shouldBe` []
+
   describe "morph'" $
     test'
       morph'
@@ -320,6 +339,12 @@
       base <- defaultReduceContext ExRoot
       ctx <- enter (ExFormation [BiTau (AtLabel "t") (ExFormation [BiLambda (FnSymbol 4)]), BiLambda (Function "L_vo")]) =<< enter (ExFormation [BiTau (AtLabel "t") (ExDispatch ExRoot (AtLabel "pu")), BiLambda (Function "L_vo")]) base{_acyclic = Just Plausible, _maxLoops = 0}
       length (concat ctx._entered) `shouldBe` 2
+    it "cuts a copy of an atom whose boxed formation grows on every round" $ do
+      let formation :: Int -> Expression
+          formation depth = ExFormation [BiTau (AtLabel "sa") (ExFormation [BiTau (AtLabel "i") (iterate (`ExDispatch` AtLabel "nu") ExRoot !! depth), BiTau AtPhi ExXi]), BiLambda (Function "L_te")]
+      base <- defaultReduceContext ExRoot
+      (enter (formation 3) =<< enter (formation 2) base{_acyclic = Just Plausible, _maxLoops = 0})
+        `shouldThrow` (\e -> "already inside" `isInfixOf` show (e :: SomeException))
     it "cuts a copy of an atom that repeats the copy entered above it exactly" $ do
       let formation :: Expression
           formation = ExFormation [BiTau (AtLabel "ka") (ExDispatch ExRoot (AtLabel "mi")), BiLambda (Function "L_ru")]
diff --git a/test/PrinterSpec.hs b/test/PrinterSpec.hs
--- a/test/PrinterSpec.hs
+++ b/test/PrinterSpec.hs
@@ -186,6 +186,20 @@
       Right deep -> maximum (map length (lines (printExpression' deep (SALTY, UNICODE, MULTILINE, 36)))) `shouldSatisfy` (<= 36)
       Left err -> expectationFailure err
 
+  describe "printExpression counts the width of :attr only on the last line of the asset" $ do
+    let program name = either error id (parseExpression ("⟦ " ++ name ++ " ↦ Φ.f(a ↦ Φ.g(b ↦ Φ.cccccccc, d ↦ Φ.eeeeeeee)) ⟧"))
+        long = replicate 30 'k'
+        printed name = printExpression' (program name) (SWEET, UNICODE, MULTILINE, 48)
+    it "splits the asset of a long name the same way as of a short one" $
+      printed long `shouldBe` "Φ.f(\n  a ↦ Φ.g( b ↦ Φ.cccccccc, d ↦ Φ.eeeeeeee )\n):" ++ long
+    it "keeps the layout of a short name" $
+      printed "k" `shouldBe` "Φ.f(\n  a ↦ Φ.g( b ↦ Φ.cccccccc, d ↦ Φ.eeeeeeee )\n):k"
+    it "keeps every line of a long name within the margin" $
+      maximum (map length (lines (printed long))) `shouldSatisfy` (<= 48)
+    it "still splits an asset that fits alone but not with its name" $
+      printExpression' (either error id (parseExpression "⟦ kkkkkkkkkkkkkkkkkkkk ↦ Φ.f(a ↦ Φ.ggggggg) ⟧")) (SWEET, UNICODE, MULTILINE, 30)
+        `shouldBe` "Φ.f(\n  a ↦ Φ.ggggggg\n):kkkkkkkkkkkkkkkkkkkk"
+
   describe "printExpression keeps a compressed meet atomic under a narrow margin" $
     it "renders the meet body on a single line even when the margin wraps its parent" $ do
       let body = ExFormation [BiTau (AtLabel "alpha") ExRoot, BiTau (AtLabel "beta") ExRoot, BiTau (AtLabel "gamma") ExRoot]
