root:
             product   file:plan.py
             product   step:./plan.py

file:plan.py
               state = CONFIRMED
             creator   root:
                sink   step:./plan.py

step:./plan.py
               state = SUCCEEDED
                need = PLAN
           using_env = ENV_VAR_TEST_STEPUP_IDX [dynamic]
                     = STEPUP_PATH_FILTER [dynamic]
               nglob = raw*.txt
           explained = yes
             creator   root:
              source   file:plan.py
             product   file:raw1.txt
             product   file:raw2.txt
             product   file:raw3.txt
             product   file:raw4.txt
             product   step:cp -p converted1.txt used.txt
             product   step:cp -p raw1.txt converted1.txt
             product   step:cp -p raw2.txt converted2.txt
             product   step:cp -p raw3.txt converted3.txt
             product   step:cp -p raw4.txt converted4.txt

file:raw1.txt
               state = CONFIRMED
             creator   step:./plan.py
                sink   step:cp -p raw1.txt converted1.txt

file:raw2.txt
               state = CONFIRMED
             creator   step:./plan.py
                sink   step:cp -p raw2.txt converted2.txt

file:raw3.txt
               state = CONFIRMED
             creator   step:./plan.py
                sink   step:cp -p raw3.txt converted3.txt

file:raw4.txt
               state = CONFIRMED
             creator   step:./plan.py
                sink   step:cp -p raw4.txt converted4.txt

step:cp -p raw1.txt converted1.txt
               state = SUCCEEDED
                need = DEFAULT (implied by sinks > OPTIONAL)
           explained = yes
             creator   step:./plan.py
              source   file:raw1.txt
             product   file:converted1.txt
                sink   file:converted1.txt

file:converted1.txt
               state = BUILT
             creator   step:cp -p raw1.txt converted1.txt
              source   step:cp -p raw1.txt converted1.txt
                sink   step:cp -p converted1.txt used.txt

step:cp -p raw2.txt converted2.txt
               state = PENDING
                need = OPTIONAL
             creator   step:./plan.py
              source   file:raw2.txt
             product   file:converted2.txt
                sink   file:converted2.txt

file:converted2.txt
               state = PLANNED
             creator   step:cp -p raw2.txt converted2.txt
              source   step:cp -p raw2.txt converted2.txt

step:cp -p raw3.txt converted3.txt
               state = PENDING
                need = OPTIONAL
           explained = yes
             creator   step:./plan.py
              source   file:raw3.txt
             product   file:converted3.txt
                sink   file:converted3.txt

file:converted3.txt
               state = PLANNED
             creator   step:cp -p raw3.txt converted3.txt
              source   step:cp -p raw3.txt converted3.txt

step:cp -p raw4.txt converted4.txt
               state = PENDING
                need = OPTIONAL
             creator   step:./plan.py
              source   file:raw4.txt
             product   file:converted4.txt
                sink   file:converted4.txt

file:converted4.txt
               state = PLANNED
             creator   step:cp -p raw4.txt converted4.txt
              source   step:cp -p raw4.txt converted4.txt

file:used.txt
               state = BUILT
             creator   step:cp -p converted1.txt used.txt
              source   step:cp -p converted1.txt used.txt

step:cp -p converted1.txt used.txt
               state = SUCCEEDED
                need = DEFAULT
           explained = yes
             creator   step:./plan.py
              source   file:converted1.txt
             product   file:used.txt
                sink   file:used.txt
