Index: doc/theses/mike_brooks_MMath/benchmarks/list/Makefile
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/Makefile	(revision fb7c9168020b02d618a22359fcb8d3dac8bc710a)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/Makefile	(revision 9d3dc40802c6c907e049db489ed4c138c3298158)
@@ -13,5 +13,5 @@
 CC = gcc-11
 CXX = g++-11
-UXX ?=  ~/u++/u++-7.0.0/bin/u++
+UXX ?=  ~/usys1/uCPP/source/bin/u++
 
 hi:
@@ -412,6 +412,23 @@
 	$(MAKE) results-latest.csv RUN_DURATION_SEC=5 RUN_REP_IDS=4 RUN_DATA_SIZE_MODE=sweetspot RUN_INTERLEAVE_PCTS='0' FX_SOLUTIONS='lq-tailq lq-list cfa-cfa cfa-mandHead cfa-noListed cfa-noIter cfa-likeLq cfa-strip upp-upp cpp-stlref' MAKE_DISABLE_OBSERVATION=yes EXTRA_COMP_FLAGS=-DDISABLE_INTERLEAVING
 	cat results-latest.csv >> $@
-	$(MAKE) results-latest.csv RUN_DURATION_SEC=5 RUN_REP_IDS=4 RUN_DATA_SIZE_MODE=sweetspot RUN_INTERLEAVE_PCTS='0' FX_SOLUTIONS='lq-tailq lq-list cfa-cfa cfa-mandHead cfa-noListed cfa-noIter cfa-likeLq cfa-strip upp-upp cpp-stlref' MAKE_DISABLE_OBSERVATION=yes EXTRA_COMP_FLAGS=-DDISABLE_INTERLEAVING
+	$(MAKE) results-latest.csv RUN_DURATION_SEC=5 RUN_REP_IDS=5 RUN_DATA_SIZE_MODE=sweetspot RUN_INTERLEAVE_PCTS='0' FX_SOLUTIONS='lq-tailq lq-list cfa-cfa cfa-mandHead cfa-noListed cfa-noIter cfa-likeLq cfa-strip upp-upp cpp-stlref' MAKE_DISABLE_OBSERVATION=yes EXTRA_COMP_FLAGS=-DDISABLE_INTERLEAVING
 	cat results-latest.csv >> $@
+
+SHORT_SEMIPERIM=7
+
+results-short-once.phony: MAKE_DISABLE_OBSERVATION=yes
+results-short-once.phony: LEN_LIMIT=$(strip $(shell echo $$(($(SHORT_SEMIPERIM)-$(WIDTH)+1))))
+results-short-once.phony: LEN_VALS=$(strip $(shell echo {1..$(LEN_LIMIT)}))
+results-short-once.phony: RUN_DATA_SIZES= $(call cross,-,$(LEN_VALS),1000000)
+results-short-once.phony: EXTRA_COMP_FLAGS+= -DDISABLE_INTERLEAVING -DWIDTH=$(WIDTH)
+results-short-once.phony: FX_SOLUTIONS=lq-tailq cfa-cfa
+results-short-once.phony: OP_MOVEMENTS=queue
+results-short-once.phony: OP_ACCESSORS=allhead
+results-short-once.phony: FORCE cleanbuild
+	$(MAKE) results-latest.csv RUN_DATA_SIZE_MODE=manual RUN_DATA_SIZES="$(RUN_DATA_SIZES)" RUN_INTERLEAVE_PCTS='0' FX_SOLUTIONS='lq-tailq cfa-cfa' EXTRA_COMP_FLAGS=-DDISABLE_INTERLEAVING OP_MOVEMENTS=queue OP_ACCESSORS=allhead MAKE_DISABLE_OBSERVATION=yes
+
+results-short.csv: FORCE
+	rm -f $@
+	for i in {1..$(SHORT_SEMIPERIM)}; do	$(MAKE) results-short-once.phony WIDTH=$$i; cat results-latest.csv >> $@; done
 
 results-zoomout-noshuf.csv: MAKE_DISABLE_OBSERVATION=yes
@@ -455,4 +472,5 @@
 results-smoketest.csv: OP_POLARITIES=insfirst
 results-smoketest.csv: OP_ACCESSORS=allhead
+results-smoketest.csv: EXTRA_COMP_FLAGS+= -DDISABLE_INTERLEAVING
 results-smoketest.csv: $(RESULT)
 	mv $< $@
@@ -469,4 +487,6 @@
 export FX_SOLUTIONS
 export MAKE_DISABLE_OBSERVATION
+export WIDTH
+export EXTRA_COMP_FLAGS
 
 cleanbuild: FORCE clean
Index: doc/theses/mike_brooks_MMath/benchmarks/list/driver.c
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/driver.c	(revision fb7c9168020b02d618a22359fcb8d3dac8bc710a)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/driver.c	(revision 9d3dc40802c6c907e049db489ed4c138c3298158)
@@ -5,4 +5,7 @@
 #include <stdint.h>
 #include <assert.h>
+#include <signal.h>                                                                             // signal
+#include <unistd.h>                                                                             // alarm
+#include <sys/param.h> // MIN
 
 #ifdef DISABLE_OBSERVATION
@@ -16,4 +19,8 @@
   #define UDATA_T float
   #define UDATA_LEN 17
+#endif
+
+#ifndef DISABLE_INTERLEAVING
+#error You must disable interleaving---no longer maintained
 #endif
 
@@ -55,9 +62,9 @@
 
 #if defined(NDEBUG) || (defined(__cforall) && !defined(__CFA_DEBUG__))
-    enum { DefaultNumNodes = 1000, DefaultExperimentDurSec = 1, DefaultCheckDonePeriod = 1000, DefaultExperimentDurOpCount = -1, DefaultSeed = 5 };
+    enum { DefaultListLen = 1000, DefaultExperimentDurSec = 1, DefaultCheckDonePeriod = 1000, DefaultExperimentDurOpCount = -1, DefaultSeed = 5 };
     const double DefaultInterleaveFrac = 0.0;
     #define TRACE(tp)
 #else 
-    enum { DefaultNumNodes = 10, DefaultExperimentDurSec = 1, DefaultCheckDonePeriod = 2, DefaultExperimentDurOpCount = 20, DefaultSeed = 5 };
+    enum { DefaultListLen = 10, DefaultExperimentDurSec = 1, DefaultCheckDonePeriod = 2, DefaultExperimentDurOpCount = 20, DefaultSeed = 5 };
     const double DefaultInterleaveFrac = 0.0;
     static const char * tp_filter
@@ -72,9 +79,17 @@
 #endif
 
+// Number of lists used in experiment
+// General tests use one
+// Greater values help explain away poor len-1 IPC
+// Value always compiled in
+#ifndef WIDTH
+#define WIDTH 1
+#endif
+
 static B_UserItem *ui = NULL;
 
 static BFX_LISTED_ELEM_T(B_UserItem) observedItem;
 
-static BFX_LIST_HEAD_T(B_UserItem) lst;
+static BFX_LIST_HEAD_T(B_UserItem) lst[ WIDTH ];
 
 B_UserItem * seekUi( size_t i ) {
@@ -104,10 +119,13 @@
 MAYBE_EXTERN_C (
 
-    volatile size_t       bobs_ops_completed      = 0;
+    volatile size_t bobs_ops_completed      = 0;
     volatile size_t bobs_prog_inserting     = 0;
     volatile size_t bobs_prog_removing      = 0;
     volatile size_t bobs_prog_removing_end  = 0;
     volatile size_t bobs_prog_rollover_flag = 0;
-    //                    bobs_prog_rem_pos         (defined after BOP_REMPROGEND_IS_REMNO_BASED)
+    //              bobs_prog_rem_pos         (declared obs.h; defined after BOP_REMPROGEND_IS_REMNO_BASED)
+
+    volatile size_t bobs_priv_active_list_no = -1;
+    volatile size_t bobs_priv_list_len = -1;
 
     void bobs_seek(size_t i) {
@@ -118,20 +136,20 @@
 
     void bobs_moveNext() {
-        observedItem = BFX_GET_AFTER(B_UserItem, lst, observedItem);
+        observedItem = BFX_GET_AFTER(B_UserItem, lst[bobs_priv_active_list_no], observedItem);
     }
 
     void bobs_movePrev() {
-        observedItem = BFX_GET_BEFORE(B_UserItem, lst, observedItem);
+        observedItem = BFX_GET_BEFORE(B_UserItem, lst[bobs_priv_active_list_no], observedItem);
     }
 
     bool bobs_hasCurrent() {
-        return BFX_IS_VALID_POS(B_UserItem, lst, observedItem);
+        return BFX_IS_VALID_POS(B_UserItem, lst[bobs_priv_active_list_no], observedItem);
     }
 
     void * bobs_getCurrentLoc() {
-        return BFX_DEREF_POS(B_UserItem, lst, observedItem);
+        return BFX_DEREF_POS(B_UserItem, lst[bobs_priv_active_list_no], observedItem);
     }
     size_t bobs_getCurrentVal() {
-        B_UserItem * curUI = BFX_DEREF_POS(B_UserItem, lst, observedItem);
+        B_UserItem * curUI = BFX_DEREF_POS(B_UserItem, lst[bobs_priv_active_list_no], observedItem);
         return curUI->self_ord;
     }
@@ -139,4 +157,60 @@
     enum bobs_op_movement_t bobs_op_movement = OP_MOVEMENT;
     enum bobs_op_polarity_t bobs_op_polarity = OP_POLARITY;
+
+     static inline ssize_t signDiv( ssize_t num, size_t denom ) {
+      if ( num >= 0 ) return num / denom;
+      else return -1 - ( ((-num)-1) / denom );
+    }
+
+    // Abstracts progress on all insertions and on queue removals into one treatment.
+    // `nodeProgress` is a count of nodes inserted or removed, stepping (quickly) through [0..NumNodes]
+    // (rather than steppling slowly through [0..Length]).
+    // Returns the position congruent to the active list number (mod WIDTH)
+    // that is maximally less than `nodeProgress`.
+    // A negative return means no such position is yet reached.
+    // Interpreting this result as last listed (last inserted) vs first unlisted (last removed),
+    // and interpreting `nodeProgress` as advancing from 0 (eg inslast-stack remove) vs
+    // receding from NumNodes-1 (eg insfirst-stack remove), are left to the caller.
+    static ssize_t lastActiveNodeReached( size_t nodeProgress ) {
+        assert( signDiv(  20, 5 ) ==  4 );
+        assert( signDiv(  19, 5 ) ==  3 );
+        assert( signDiv(   6, 5 ) ==  1 );
+        assert( signDiv(   5, 5 ) ==  1 );
+        assert( signDiv(   4, 5 ) ==  0 );
+        assert( signDiv(   3, 5 ) ==  0 );
+        assert( signDiv(   2, 5 ) ==  0 );
+        assert( signDiv(   1, 5 ) ==  0 );
+        assert( signDiv(   0, 5 ) ==  0 );
+        assert( signDiv(  -1, 5 ) == -1 );
+        assert( signDiv(  -2, 5 ) == -1 );
+        assert( signDiv(  -2, 5 ) == -1 );
+        assert( signDiv(  -3, 5 ) == -1 );
+        assert( signDiv(  -4, 5 ) == -1 );
+        assert( signDiv(  -6, 5 ) == -2 );
+        assert( signDiv(  -7, 5 ) == -2 );
+        assert( signDiv( -20, 5 ) == -4 );
+        assert( signDiv( -21, 5 ) == -5 );
+        ssize_t activeLenProgress = signDiv( (ssize_t)nodeProgress - (ssize_t)bobs_priv_active_list_no, WIDTH ); // IDW
+        ssize_t activeNodeProgress = activeLenProgress * WIDTH + (ssize_t)bobs_priv_active_list_no; // IWA
+        if ( activeNodeProgress == nodeProgress ) return activeNodeProgress - WIDTH;
+        else return activeNodeProgress;
+    }
+
+    ssize_t bobs_first_valid() {
+        switch(bobs_op_movement) {
+            case stack: return (ssize_t)bobs_priv_active_list_no;
+            case queue: return lastActiveNodeReached( *bobs_prog_rem_pos ) + WIDTH;
+        }
+        assert(0 && "unsupported bobs_op_movement value");
+        return -1;
+    }
+    ssize_t bobs_last_valid() {
+        switch(bobs_op_movement) {
+            case stack: return lastActiveNodeReached( MIN( (ssize_t)bobs_prog_inserting - (ssize_t)WIDTH, (ssize_t)bobs_priv_list_len - (ssize_t)*bobs_prog_rem_pos - (ssize_t)WIDTH ) )  + WIDTH;
+            case queue: return lastActiveNodeReached( bobs_prog_inserting );
+        }
+        assert(0 && "unsupported bobs_op_movement value");
+        return -1;
+    }
 )
 #endif
@@ -192,21 +266,23 @@
 // end: copied from https://stackoverflow.com/a/33021408
 
+#ifdef DISABLE_OBSERVATION
+#define OBS(...)
+#else
+#define OBS(...) __VA_ARGS__
+#endif
+
+static volatile bool stop = false;
+static void sigAlarm( int p __attribute__(( unused )) ) { stop = true; }
+
+void runtest(const char * argv0, size_t NumNodes, size_t ExperimentDurOpCount );
+
 int main(int argc, const char *argv[]) {
 
-  #ifdef DISABLE_OBSERVATION
-    // define the outbound dependencies as locals, for compiling into nops
-    size_t       bobs_ops_completed      = 0;
-    size_t bobs_prog_inserting     = 0;
-    size_t bobs_prog_removing      = 0;
-    size_t bobs_prog_removing_end  = 0;
-    size_t bobs_prog_rollover_flag = 0;
-  #endif
-
-    const char * usage_args = "[ExperimentDurSec [CheckDonePeriod [NumNodes [ExperimentDurOpCount [Seed [InterleaveFrac]]]]]]";
+    const char * usage_args = "[ExperimentDurSec [CheckDonePeriod [ListLen [ExperimentDurOpCount [Seed [InterleaveFrac]]]]]]";
     const int static_arg_posns = 6;
 
     size_t ExperimentDurSec     = DefaultExperimentDurSec;
     size_t CheckDonePeriod      = DefaultCheckDonePeriod;
-    size_t NumNodes             = DefaultNumNodes;
+    size_t ListLen             = DefaultListLen;
     size_t ExperimentDurOpCount = DefaultExperimentDurOpCount;
     size_t Seed                 = DefaultSeed;
@@ -217,13 +293,13 @@
       case 5: Seed = atoi(argv[5]);
       case 4: ExperimentDurOpCount = atol(argv[4]);
-      case 3: NumNodes = atoi(argv[3]);
+      case 3: ListLen = atoi(argv[3]);
       case 2: CheckDonePeriod = atoi(argv[2]);
       case 1: ExperimentDurSec = atoi(argv[1]);
     }
 
-    // printf("ExperimentDurSec=%d, CheckDonePeriod=%d, NumNodes=%d, ExperimentDurOpCount=%zd, Seed=%d,\n",
-    //     ExperimentDurSec, CheckDonePeriod, NumNodes, ExperimentDurOpCount, Seed );
-
-    if (ExperimentDurSec == 0 || CheckDonePeriod == 0 || NumNodes == 0 || ExperimentDurOpCount == 0 || Seed == 0 ) {
+    // printf("ExperimentDurSec=%d, CheckDonePeriod=%d, ListLen=%d, ExperimentDurOpCount=%zd, Seed=%d,\n",
+    //     ExperimentDurSec, CheckDonePeriod, ListLen, ExperimentDurOpCount, Seed );
+
+    if (ExperimentDurSec == 0 || CheckDonePeriod == 0 || ListLen == 0 || ExperimentDurOpCount == 0 || Seed == 0 ) {
         printf("usage: %s %s\n", argv[0], usage_args);
         return -1;
@@ -236,4 +312,7 @@
     }
   #endif
+
+    OBS( bobs_priv_list_len = ListLen );
+    const size_t NumNodes = ListLen * WIDTH;
 
     ui = (B_UserItem*) malloc( (size_t)NumNodes * (size_t)sizeof(B_UserItem) );
@@ -436,8 +515,10 @@
 
   #ifndef DISABLE_ITERS
-    #define ITERS_SAVE(lastInsertedElemPtr, lastInsertedIter) (lastInsertedElemPtr)->selfListed = lastInsertedIter
-  #endif
-
-    BFX_INIT(B_UserItem, lst);
+    #define ITERS_SAVE(lastInsertedElemPtr, lastInsertedIter) \
+        lastInserted[listno] = (lastInsertedElemPtr)->selfListed = lastInsertedIter
+  #endif
+
+    for ( size_t listno = 0; listno < WIDTH; listno ++ )
+        BFX_INIT(B_UserItem, lst[ listno ]);
 
     bobs_init(NumNodes);
@@ -465,4 +546,32 @@
     #endif
 
+  #ifdef __U_CPLUSPLUS__
+    // uC++ doesn't implement `alarm`---it crashes with "not implemented" at runtime
+    // so, here is an equivalent timer task
+    _Task timer_t {
+        size_t alarmDurSec;
+        void main() {
+          _Accept( ~timer_t );
+          or _Timeout( uDuration( alarmDurSec ) ) { sigAlarm(0); }
+        }
+      public:
+        timer_t( size_t alarmDurSec ) : alarmDurSec(alarmDurSec) {}
+    };
+    timer_t timer ( ExperimentDurSec );
+  #else
+    signal( SIGALRM, sigAlarm );      // setup signal handler
+    alarm( ExperimentDurSec );        // trigger in N seconds
+  #endif
+
+    runtest( argv[0], NumNodes, ExperimentDurOpCount );
+
+    free(ui);
+}
+
+
+void runtest(const char * argv0, const size_t NumNodes, size_t ExperimentDurOpCount ) {
+
+  assert( NumNodes >= WIDTH );
+  assert( NumNodes % WIDTH == 0 );
 
     size_t privateOpsCompleted = 0;
@@ -471,121 +580,91 @@
     clock_t start = clock();
 
-    while (elapsed_sec <= (double) ExperimentDurSec && privateOpsCompleted < ExperimentDurOpCount) {
-        for ( size_t t = 0; t < CheckDonePeriod; t += 1 ) {
-            TRACE('a')              // insert special first
-            ITERS_SAVE( &ui[0],
-                BOP_INIT(lst, ui[0]) );
-            TRACE('b')              // insert general
-            // Keep lastInserted even on DISABLE_ITERS because it's communication to the remove phase
-            BFX_LISTED_ELEM_T(B_UserItem) lastInserted = BFX_GET_FIRST(B_UserItem, lst);
-            B_UserItem * insertNow = seekUi(1);
-            for ( size_t privateCurInsert = 1;
-                  (bobs_prog_inserting = privateCurInsert, privateCurInsert < NumNodes);
-                  privateCurInsert += 1
-                ) {
-                assert( insertNow->self_ord == privateCurInsert );
+    while ( ! stop && privateOpsCompleted < ExperimentDurOpCount ) {
+
+            B_UserItem * insertNow = & ui[ 0 ];
+
+              #ifdef DISABLE_ITERS
+            #define INSERTION_NEIGHBOUR NOT_SUPPORTED
+              #else
+            BFX_LISTED_ELEM_T(B_UserItem) lastInserted[ WIDTH ];
+            #define INSERTION_NEIGHBOUR lastInserted[ listno ]
+              #endif
+
+              #ifdef DISABLE_SHUFFLING_INDIRECTION
+            #define HAS_NEXT  ( (void*)insertNow < (void*)&ui[NumNodes] )
+            #define MOVE_NEXT ( insertNow++ )
+              #else
+            #define HAS_NEXT  ( insertNow->self_ord != 0 )
+            #define MOVE_NEXT ( insertNow = & ui[ insertNow->succ_pos ] )
+              #endif
+
+            // insert special first
+            for ( size_t listno = 0; listno < WIDTH; listno ++ ) {
+                OBS( bobs_priv_active_list_no = bobs_prog_inserting = listno; )
+                TRACE('a')
+                ITERS_SAVE( insertNow,
+                    BOP_INIT( lst[listno], (*insertNow) ) );
+                MOVE_NEXT;
+                TRACE('b')
+            }
+            // insert general
+            for ( OBS( size_t privateCurInsert = WIDTH ); HAS_NEXT; ) {
+              for ( size_t listno = 0; listno < WIDTH; (listno ++) ) {
+                OBS( bobs_prog_inserting = privateCurInsert; )
+                OBS( bobs_priv_active_list_no = listno; )
                 TRACE('-')
-                lastInserted =
-                    BOP_INSERT( lst, lastInserted, (*insertNow) );
+                ITERS_SAVE( insertNow,
+                    BOP_INSERT( lst[listno], INSERTION_NEIGHBOUR, (*insertNow) ) );
                 TRACE('+')
-                ITERS_SAVE( insertNow, lastInserted );
-              #ifdef DISABLE_SHUFFLING_INDIRECTION
-                insertNow++;
-              #else
-                insertNow = & ui[ insertNow->succ_pos ];
+                OBS( privateCurInsert += 1; )
+                MOVE_NEXT;
+              }
+              OBS( bobs_prog_inserting = privateCurInsert; )
+            }
+              #ifndef DISABLE_ITERS
+            BFX_LISTED_ELEM_T(B_UserItem) nextRemoval = BOP_SWITCH_REMDIR (
+                ui[0].selfListed,           // forward starts from first insert
+                lastInserted[ WIDTH - 1 ]   // backward starts from last insert
+            );
               #endif
-            }
-          #ifdef DISABLE_INTERLEAVING
-            // interleaving off, simple removes
-            // (remove logic of 2b01f8eb0956)
-          #ifndef DISABLE_ITERS
-            BFX_LISTED_ELEM_T(B_UserItem) nextRemoval = BOP_SWITCH_REMDIR (
-                ui[0].selfListed,  // forward starts from first insert
-                lastInserted       // backward starts from last insert
-            );
-          #endif
-            TRACE('c')
-            for ( size_t privateCurRemove = 1;
-                  (bobs_prog_removing = privateCurRemove, privateCurRemove < NumNodes);
-                  privateCurRemove += 1
-                ) {
-              #ifdef DISABLE_ITERS
-                #define curRemovalI ERROR_REQD_ITER_NOT_PROVIDED
-              #else
-                BFX_LISTED_ELEM_T(B_UserItem) curRemovalI = nextRemoval;
-                B_UserItem * curRemovalE = BFX_DEREF_POS(B_UserItem, lst, nextRemoval);
-               #ifdef DISABLE_SHUFFLING_INDIRECTION
-                nextRemoval = (BOP_SWITCH_REMDIR( curRemovalE + 1, curRemovalE - 1 ))->selfListed;
-               #else
-                nextRemoval = ui[ curRemovalE->BOP_SWITCH_REMDIR(succ_pos, pred_pos) ].selfListed;
-               #endif
-              #endif
-                TRACE('-')
-                BOP_REMOVE( lst, curRemovalI );
-                TRACE('+')
-            }
-          #else
-            // interleaving on, complex removes
-            TRACE('c')              // remove general
-            size_t removeProgress  [N_INTERLEAVE_ACTION] = { 0, 0 };
-            #define startItem BOP_SWITCH_REMDIR( iactFwdStartItem, iactRevStartItem )
-            B_UserItem * removeItem[N_INTERLEAVE_ACTION] = 
-                { startItem[OuterActn], startItem[InnerActn] };
-            for ( InterleaveAction flip = OuterActn
-                ; (bobs_prog_removing = removeProgress[0] + removeProgress[1] + 1,
-                     bobs_prog_removing_end = removeProgress[0] + 1,
-                     removeProgress[0] + removeProgress[1] < NumNodes - 1 )
-                ;
-                ) {
-//printf("--- flip=%d removeProgress[0]=%zd removeProgress[1]=%zd removeItem[flip]->self_ord=%zd\n", flip, removeProgress[0], removeProgress[1], removeItem[flip]->self_ord);
-                TRACE('-')
-                BOP_REMOVE( lst, removeItem[flip]->selfListed );
-                TRACE('+')
-
-                InterleaveAction nextFlip = removeItem[flip]->later_flip;
-                removeProgress[flip] += 1;
-                removeItem[flip] = & ui[ removeItem[flip]-> BOP_SWITCH_REMDIR(succ_pos, pred_pos) ];
-                flip = nextFlip;
-            }
-
-//             for ( InterleaveAction flip = OuterActn;
-//                   (bobs_prog_removing = removeProgress[0] + removeProgress[1] + 1,
-//                      bobs_prog_removing_end = removeProgress[0] + 1,
-//                      removeProgress[0] < numNodesItlv[0] && removeProgress[1] < numNodesItlv[1] );
-//                 ) {
-//                 TRACE('-')
-//                 BOP_REMOVE( lst, removeItem[flip]->selfListed );
-//                 TRACE('+')
-
-//                 InterleaveAction nextFlip = removeItem[flip]->later_flip;
-//                 removeProgress[flip] += 1;
-//                 removeItem[flip] = & ui[ removeItem[flip]-> BOP_SWITCH_REMDIR(succ_pos, pred_pos) ];
-//                 flip = nextFlip;
-//             }
-//             TRACE('X')              // remove imbalanced
-//             // most work done under general; it stops when either flip-side's work finishes
-//             // now drain any any stragglers so both flip-sides' work finishes
-//             for ( InterleaveAction flip = 0; flip < N_INTERLEAVE_ACTION; flip ++ ) {
-//                 for ( ; (bobs_prog_removing = removeProgress[0] + removeProgress[1] + 1,
-//                          bobs_prog_removing_end = removeProgress[0] + 1,
-//                          removeProgress[flip] < numNodesItlv[flip] )
-//                       ;
-//                     ) {
-// //printf("--- flip=%d removeProgress[flip]=%zd numNodesItlv[flip]=%zd removeItem[flip]->self_ord=%zd\n", flip, removeProgress[flip], numNodesItlv[flip], removeItem[flip]->self_ord);
-//                     TRACE('-')
-//                     BOP_REMOVE( lst, removeItem[flip]->selfListed );
-//                     TRACE('+')
-
-//                     removeProgress[flip] += 1;
-//                     removeItem[flip] = & ui[ removeItem[flip]-> BOP_SWITCH_REMDIR(succ_pos, pred_pos) ];
-//                 }
-//             }
-          #endif // DISABLE_INTERLEAVING
-            TRACE('D')              // remove special last
-            BOP_TEARDOWN(lst);
-            TRACE('d')
+            for ( size_t listno = 0; listno < WIDTH; listno += 1 ) {
+                OBS( bobs_priv_active_list_no = listno; )
+                TRACE('c')
+            }
+            // remove general
+            size_t privateCurRemove = 1; // count 1/<= to observe from the item not yet being removed
+            while ( privateCurRemove <= NumNodes - WIDTH ) // -WIDTH to stop before special last
+                for ( size_t listno = 0; listno < WIDTH; listno += 1 ) {
+                    OBS( bobs_prog_removing = privateCurRemove;  )
+                    OBS( bobs_priv_active_list_no = listno; )
+                  #ifdef DISABLE_ITERS
+                    #define curRemovalI ERROR_REQD_ITER_NOT_PROVIDED
+                  #else
+                    BFX_LISTED_ELEM_T(B_UserItem) curRemovalI = nextRemoval;
+                    B_UserItem * curRemovalE = BFX_DEREF_POS(B_UserItem, lst[listno], nextRemoval);
+                  #ifdef DISABLE_SHUFFLING_INDIRECTION
+                    nextRemoval = (BOP_SWITCH_REMDIR( curRemovalE + 1, curRemovalE - 1 ))->selfListed;
+                  #else
+                    nextRemoval = ui[ curRemovalE->BOP_SWITCH_REMDIR(succ_pos, pred_pos) ].selfListed;
+                  #endif
+                  #endif
+                    TRACE('-')
+                    BOP_REMOVE( lst[listno], curRemovalI );
+                    TRACE('+')
+                    privateCurRemove += 1;
+                }
+            // remove special last
+            for ( size_t listno = 0; listno < WIDTH; listno += 1 ) {
+                OBS( bobs_prog_removing = privateCurRemove; )
+                OBS( bobs_priv_active_list_no = listno; )
+                TRACE('D')
+                BOP_TEARDOWN(lst[listno]);
+                TRACE('d')
+                privateCurRemove += 1;
+            }
+            OBS( bobs_prog_removing = privateCurRemove;  )
 
             privateOpsCompleted += NumNodes;
-
+          OBS(
             bobs_prog_rollover_flag = 1;
             TRACE('e')
@@ -596,21 +675,11 @@
             TRACE('f')
             bobs_prog_rollover_flag = 0;
-            TRACE('g')
-        }
-      #ifndef DISABLE_CLOCK_RECHECK
-        clock_t end = clock();
-        elapsed_sec = ((double)(end - start)) / ((double)CLOCKS_PER_SEC);
-      #endif
-    }
-    #ifdef DISABLE_CLOCK_RECHECK
-    {
-        clock_t end = clock();
-        elapsed_sec = ((double)(end - start)) / ((double)CLOCKS_PER_SEC);
-    }
-    #endif
-
-    double mean_op_dur_ns = elapsed_sec / ((double)bobs_ops_completed) * 1000 * 1000 * 1000;
-    printf("%s,%zd,%f,%f\n", argv[0], bobs_ops_completed, elapsed_sec, mean_op_dur_ns);
-
-    free(ui);
+            TRACE('g') )
+    }
+
+    clock_t end = clock();
+    elapsed_sec = ((double)(end - start)) / ((double)CLOCKS_PER_SEC);
+
+    double mean_op_dur_ns = elapsed_sec / ((double)privateOpsCompleted) * 1000 * 1000 * 1000;
+    printf("%s,%d,%zd,%f,%f\n", argv0, WIDTH, privateOpsCompleted, elapsed_sec, mean_op_dur_ns);
 }
Index: doc/theses/mike_brooks_MMath/benchmarks/list/fx-cfa-GENERAL.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/fx-cfa-GENERAL.h	(revision fb7c9168020b02d618a22359fcb8d3dac8bc710a)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/fx-cfa-GENERAL.h	(revision 9d3dc40802c6c907e049db489ed4c138c3298158)
@@ -37,4 +37,12 @@
 #define BFX_GET_AFTER(S, lst, iter)              ( & next( * (iter) ) )
 #define BFX_GET_BEFORE(S, lst, iter)             ( & prev( * (iter) ) )
+#define BFX_DEREF_POS(S, lst, iter)              (iter)
+
+#ifdef __EXPERIMENTAL_DISABLE_OTAG__
+// alt list impl, no tagging: next/prev accessors don't known when "no more elems"
+// so hack around it in harness: look for leaked abstraction of list head being reported as a regular neighbour
+#define BFX_IS_VALID_POS(S, lst, iter)           ((void*)(iter)!=(void*)(&lst))
+#else
+// normal list impl: next/prev accessors return *0p on "no more elems"
 #define BFX_IS_VALID_POS(S, lst, iter)           ((iter)!=NULL)
-#define BFX_DEREF_POS(S, lst, iter)              (iter)
+#endif
Index: doc/theses/mike_brooks_MMath/benchmarks/list/observation.c
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/observation.c	(revision fb7c9168020b02d618a22359fcb8d3dac8bc710a)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/observation.c	(revision 9d3dc40802c6c907e049db489ed4c138c3298158)
@@ -7,5 +7,4 @@
 #include <stdio.h>
 #include <stddef.h>
-#include <sys/param.h>
 
 #include "observation.h"
@@ -113,18 +112,6 @@
         printf("%8zd + %6zd/2 + %6zd/2, %6zd@e %6zd_u", bobs_ops_completed, bobs_prog_inserting, bobs_prog_removing, bobs_prog_removing_end, *bobs_prog_rem_pos);
 
-        // signed arithmetic allows representating empty range as from=0, to=-1
-        ptrdiff_t validFrom, validTo;
-        switch(bobs_op_movement) {
-            case stack:
-                validFrom = 0;
-                validTo = MIN( (ptrdiff_t)bobs_prog_inserting  -1, (ptrdiff_t)NumNodes - (ptrdiff_t)*bobs_prog_rem_pos - 1 );
-                break;
-            case queue:
-                validFrom = (ptrdiff_t)*bobs_prog_rem_pos;
-                validTo = (ptrdiff_t)bobs_prog_inserting-1;
-                break;
-            default:
-                assert(0 && "unsupported bobs_op_movement value");
-        }
+        ptrdiff_t validFrom = bobs_first_valid();
+        ptrdiff_t validTo = bobs_last_valid();
 
         printf("  ");
Index: doc/theses/mike_brooks_MMath/benchmarks/list/observation.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/observation.h	(revision fb7c9168020b02d618a22359fcb8d3dac8bc710a)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/observation.h	(revision 9d3dc40802c6c907e049db489ed4c138c3298158)
@@ -1,4 +1,5 @@
 #include "proglang.h"
 #include <stdbool.h>
+#include <stddef.h>
 
 
@@ -24,4 +25,8 @@
     extern volatile size_t const * bobs_prog_rem_pos;
 
+    // signed values allows representating empty range as from=0, to=-1
+    ptrdiff_t bobs_first_valid();
+    ptrdiff_t bobs_last_valid();
+
     // observation.c defines
 
Index: doc/theses/mike_brooks_MMath/benchmarks/list/results-smoketest.csv
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/results-smoketest.csv	(revision fb7c9168020b02d618a22359fcb8d3dac8bc710a)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/results-smoketest.csv	(revision 9d3dc40802c6c907e049db489ed4c138c3298158)
@@ -1,90 +1,90 @@
-2025-07-25 14:33:37,1,1 10 289637 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,14481850,1.124100,77.621298
-2025-07-25 14:33:38,1,1 10000 283 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,127350000,1.001588,7.864845
-2025-07-25 14:33:39,1,1 1000 3203 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,73669000,1.031389,14.000312
-2025-07-25 14:33:40,1,1 10000 283 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,124520000,1.002236,8.048795
-2025-07-25 14:33:41,1,1 1 1000000 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,11000000,1.074396,97.672364
-2025-07-25 14:33:42,1,1 1000000 3 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,150000000,1.018578,6.790520
-2025-07-25 14:33:43,1,1 1 1000000 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,11000000,1.058028,96.184364
-2025-07-25 14:33:45,1,1 100 25601 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,51202000,1.008144,19.689543
-2025-07-25 14:33:46,1,1 10 289637 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,28963700,1.083887,37.422256
-2025-07-25 14:33:47,1,1 10000 283 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,124520000,1.012447,8.130798
-2025-07-25 14:33:48,1,1 1 1000000 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,26000000,1.011152,38.890462
-2025-07-25 14:33:49,1,1 1 1000000 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,11000000,1.071608,97.418909
-2025-07-25 14:33:50,1,1 1000 3203 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,32030000,1.022850,31.934124
-2025-07-25 14:33:52,1,1 10 289637 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,14481850,1.096347,75.704900
-2025-07-25 14:33:53,1,1 100000 29 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,162400000,1.009615,6.216841
-2025-07-25 14:33:54,1,1 100000 29 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,139200000,1.009525,7.252335
-2025-07-25 14:33:55,1,1 1 1000000 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,11000000,1.055844,95.985818
-2025-07-25 14:33:56,1,1 100 25601 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,33281300,1.054635,31.688516
-2025-07-25 14:33:57,1,1 1 3276803 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,9830409,1.156687,117.664179
-2025-07-25 14:33:59,1,1 100000 29 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,171100000,1.010629,5.906657
-2025-07-25 14:34:00,1,1 10 289637 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,14481850,1.068056,73.751351
-2025-07-25 14:34:01,1,1 1 10000000 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,10000000,1.513156,151.315600
-2025-07-25 14:34:05,1,1 1000000 3 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,120000000,1.005410,8.378417
-2025-07-25 14:34:06,1,1 1000 3203 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,73669000,1.027758,13.951024
-2025-07-25 14:34:07,1,1 1 10000000 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,10000000,1.528870,152.887000
-2025-07-25 14:34:11,1,1 100 25601 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,51202000,1.006337,19.654252
-2025-07-25 14:34:12,1,1 10000 283 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,124520000,1.017963,8.175096
-2025-07-25 14:34:13,1,1 1 3276803 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,9830409,1.149980,116.981908
-2025-07-25 14:34:15,1,1 100000 29 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,150800000,1.014836,6.729682
-2025-07-25 14:34:16,1,1 1 3276803 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,9830409,1.132979,115.252478
-2025-07-25 14:34:18,1,1 10 289637 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,14481850,1.067593,73.719380
-2025-07-25 14:34:19,1,1 1 1000000 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,11000000,1.057079,96.098091
-2025-07-25 14:34:20,1,1 1000 3203 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,73669000,1.005406,13.647613
-2025-07-25 14:34:21,1,1 1000000 3 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,129000000,1.010534,7.833597
-2025-07-25 14:34:22,1,1 1000000 3 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,162000000,1.005930,6.209444
-2025-07-25 14:34:23,1,1 1 3276803 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,9830409,1.135083,115.466508
-2025-07-25 14:34:25,1,1 10 289637 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,14481850,1.067839,73.736367
-2025-07-25 14:34:26,1,1 100000 29 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,156600000,1.002060,6.398851
-2025-07-25 14:34:27,1,1 100 25601 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,48641900,1.005337,20.668128
-2025-07-25 14:34:28,1,1 1000 3203 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,76872000,1.016555,13.223996
-2025-07-25 14:34:29,1,1 1 3276803 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,9830409,1.136574,115.618180
-2025-07-25 14:34:31,1,1 1000000 3 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,123000000,1.004886,8.169805
-2025-07-25 14:34:32,1,1 10 289637 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,14481850,1.089222,75.212904
-2025-07-25 14:34:33,1,1 1 3276803 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,9830409,1.191476,121.203095
-2025-07-25 14:34:35,1,1 10000 283 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,110370000,1.002689,9.084797
-2025-07-25 14:34:36,1,1 10 289637 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,14481850,1.071031,73.956780
-2025-07-25 14:34:37,1,1 100 25601 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,48641900,1.022545,21.021897
-2025-07-25 14:34:38,1,1 10 289637 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,14481850,1.101408,76.054372
-2025-07-25 14:34:40,1,1 1 3276803 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,9830409,1.151480,117.134496
-2025-07-25 14:34:41,1,1 10000 283 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,124520000,1.007859,8.093953
-2025-07-25 14:34:42,1,1 10 289637 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,14481850,1.101968,76.093041
-2025-07-25 14:34:44,1,1 10000 283 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,124520000,1.018063,8.175899
-2025-07-25 14:34:45,1,1 1 3276803 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,9830409,1.137307,115.692745
-2025-07-25 14:34:46,1,1 100 25601 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,53762100,1.044294,19.424353
-2025-07-25 14:34:48,1,1 100000 29 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,34800000,1.009267,29.001925
-2025-07-25 14:34:49,1,1 100 25601 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,51202000,1.037505,20.262978
-2025-07-25 14:34:50,1,1 1 3276803 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,9830409,1.150686,117.053726
-2025-07-25 14:34:51,1,1 1 10000000 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,10000000,1.570977,157.097700
-2025-07-25 14:34:55,1,1 1000 3203 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,73669000,1.004851,13.640079
-2025-07-25 14:34:56,1,1 100 25601 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,48641900,1.007154,20.705482
-2025-07-25 14:34:57,1,1 100 25601 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,51202000,1.021808,19.956408
-2025-07-25 14:34:58,1,1 1000000 3 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,162000000,1.018332,6.286000
-2025-07-25 14:34:59,1,1 100000 29 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,139200000,1.001096,7.191782
-2025-07-25 14:35:00,1,1 1 10000000 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,10000000,1.509163,150.916300
-2025-07-25 14:35:04,1,1 1 10000000 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,10000000,1.523187,152.318700
-2025-07-25 14:35:08,1,1 1 10000000 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,30000000,1.291843,43.061433
-2025-07-25 14:35:12,1,1 100000 29 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,133400000,1.017233,7.625435
-2025-07-25 14:35:13,1,1 1 10000000 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,10000000,1.529335,152.933500
-2025-07-25 14:35:17,1,1 1000000 3 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,153000000,1.013427,6.623706
-2025-07-25 14:35:18,1,1 100 25601 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,51202000,1.019527,19.911859
-2025-07-25 14:35:19,1,1 100000 29 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,147900000,1.009347,6.824523
-2025-07-25 14:35:20,1,1 1 10000000 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,10000000,1.529478,152.947800
-2025-07-25 14:35:24,1,1 1 1000000 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,10000000,1.009042,100.904200
-2025-07-25 14:35:25,1,1 1000 3203 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,70466000,1.008914,14.317742
-2025-07-25 14:35:26,1,1 1000 3203 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,73669000,1.007051,13.669943
-2025-07-25 14:35:27,1,1 1 10000000 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,10000000,1.508540,150.854000
-2025-07-25 14:35:31,1,1 10000 283 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,36790000,1.070702,29.103071
-2025-07-25 14:35:32,1,1 10000 283 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,124520000,1.007902,8.094298
-2025-07-25 14:35:33,1,1 1 10000000 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,10000000,1.514299,151.429900
-2025-07-25 14:35:37,1,1 1 1000000 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,11000000,1.080953,98.268455
-2025-07-25 14:35:38,1,1 1 1000000 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,11000000,1.055062,95.914727
-2025-07-25 14:35:39,1,1 1000 3203 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,73669000,1.038104,14.091463
-2025-07-25 14:35:40,1,1 1000 3203 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,76872000,1.023905,13.319609
-2025-07-25 14:35:41,1,1 100000 29 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,153700000,1.018344,6.625530
-2025-07-25 14:35:42,1,1 1000000 3 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,123000000,1.015098,8.252829
-2025-07-25 14:35:44,1,1 1 3276803 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,26214424,1.063951,40.586473
-2025-07-25 14:35:45,1,1 1000000 3 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,42000000,1.048904,24.973905
-2025-07-25 14:35:46,1,1 1 1000000 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,11000000,1.077116,97.919636
-2025-07-25 14:35:48,1,1 1000000 3 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,123000000,1.016081,8.260821
-2025-07-25 14:35:49,1,1 10000 283 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,113200000,1.017333,8.987041
+2026-01-14 13:31:15,1,1 10000 283 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,1,218531185,0.997842,4.566131
+2026-01-14 13:31:16,1,1 1000000 3 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,1,254103891,0.997786,3.926685
+2026-01-14 13:31:18,1,1 10 289637 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,1,10137295,1.005258,99.164323
+2026-01-14 13:31:19,1,1 100000 29 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,1,240960565,0.997563,4.139943
+2026-01-14 13:31:20,1,1 10000 283 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,1,190404381,0.997883,5.240862
+2026-01-14 13:31:21,1,1 1 10000000 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,1,10000000,2.755017,275.501700
+2026-01-14 13:31:26,1,1 1 1000000 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,1,8000000,1.042393,130.299125
+2026-01-14 13:31:27,1,1 1 10000000 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,1,10000000,2.772334,277.233400
+2026-01-14 13:31:32,1,1 1000000 3 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,1,257335470,0.997170,3.874981
+2026-01-14 13:31:33,1,1 100 25601 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,1,48539496,0.996439,20.528417
+2026-01-14 13:31:34,1,1 1000 3203 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,1,105990473,0.997352,9.409827
+2026-01-14 13:31:35,1,1 1000000 3 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,1,220198293,0.997419,4.529640
+2026-01-14 13:31:36,1,1 100000 29 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,1,56787974,0.997062,17.557626
+2026-01-14 13:31:37,1,1 10 289637 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,1,15350761,1.013997,66.055162
+2026-01-14 13:31:39,1,1 1000 3203 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,1,102092422,0.997564,9.771186
+2026-01-14 13:31:40,1,1 100000 29 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,1,220075548,0.997592,4.532952
+2026-01-14 13:31:41,1,1 100000 29 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,1,225015408,0.997433,4.432732
+2026-01-14 13:31:42,1,1 1 10000000 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,1,10000000,2.766565,276.656500
+2026-01-14 13:31:47,1,1 1000 3203 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,1,59710326,0.996931,16.696124
+2026-01-14 13:31:48,1,1 1 10000000 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,1,10000000,2.769569,276.956900
+2026-01-14 13:31:53,1,1 1 1000000 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,1,5000000,0.999754,199.950800
+2026-01-14 13:31:54,1,1 1 10000000 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,1,10000000,2.798025,279.802500
+2026-01-14 13:31:59,1,1 1 1000000 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,1,5000000,1.114745,222.949000
+2026-01-14 13:32:00,1,1 1 3276803 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,1,6553606,1.652167,252.100447
+2026-01-14 13:32:03,1,1 1 1000000 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,1,5000000,1.010957,202.191400
+2026-01-14 13:32:04,1,1 100 25601 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,1,49589137,0.997162,20.108477
+2026-01-14 13:32:05,1,1 1 1000000 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,1,5000000,1.027244,205.448800
+2026-01-14 13:32:06,1,1 1 1000000 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,1,5000000,1.097968,219.593600
+2026-01-14 13:32:08,1,1 1000 3203 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,1,102355068,0.997254,9.743084
+2026-01-14 13:32:09,1,1 100 25601 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,1,40423979,0.997596,24.678323
+2026-01-14 13:32:10,1,1 1 1000000 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,1,5000000,1.095872,219.174400
+2026-01-14 13:32:11,1,1 10000 283 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,1,229888258,0.996748,4.335793
+2026-01-14 13:32:12,1,1 100 25601 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,1,48129880,0.997287,20.720746
+2026-01-14 13:32:13,1,1 1 1000000 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,1,5000000,1.016024,203.204800
+2026-01-14 13:32:14,1,1 100 25601 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,1,40167969,0.996992,24.820573
+2026-01-14 13:32:15,1,1 1 3276803 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,1,6553606,1.701438,259.618598
+2026-01-14 13:32:18,1,1 1 3276803 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,1,6553606,1.659565,253.229291
+2026-01-14 13:32:20,1,1 1 10000000 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,1,10000000,1.712096,171.209600
+2026-01-14 13:32:24,1,1 1 1000000 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,1,5000000,1.010222,202.044400
+2026-01-14 13:32:25,1,1 1 3276803 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,1,6553606,1.652375,252.132185
+2026-01-14 13:32:28,1,1 1 10000000 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,1,10000000,2.800626,280.062600
+2026-01-14 13:32:33,1,1 1 3276803 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,1,9830409,1.457078,148.221503
+2026-01-14 13:32:35,1,1 1000 3203 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,1,102367880,0.996927,9.738670
+2026-01-14 13:32:36,1,1 1 10000000 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,1,10000000,2.776255,277.625500
+2026-01-14 13:32:41,1,1 10000 283 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,1,210731705,0.997105,4.731633
+2026-01-14 13:32:42,1,1 10000 283 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,1,183331079,1.007402,5.494988
+2026-01-14 13:32:43,1,1 1 3276803 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,1,6553606,1.659047,253.150250
+2026-01-14 13:32:45,1,1 10 289637 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,1,11295843,1.001223,88.636413
+2026-01-14 13:32:46,1,1 100000 29 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,1,257539111,0.996702,3.870100
+2026-01-14 13:32:48,1,1 10 289637 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,1,17378220,1.013402,58.314488
+2026-01-14 13:32:49,1,1 100000 29 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,1,193986481,1.007222,5.192228
+2026-01-14 13:32:50,1,1 1 3276803 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,1,6553606,1.694047,258.490822
+2026-01-14 13:32:52,1,1 1000 3203 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,1,106320382,0.997101,9.378268
+2026-01-14 13:32:53,1,1 1 10000000 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,1,10000000,2.826834,282.683400
+2026-01-14 13:32:58,1,1 10 289637 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,1,15930035,1.008439,63.304255
+2026-01-14 13:32:59,1,1 1000000 3 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,1,218307684,0.997486,4.569175
+2026-01-14 13:33:01,1,1 1000 3203 -1 1 0  ,./perfexp--lq-list--stack-insfirst-allhead,1,108383114,0.997610,9.204478
+2026-01-14 13:33:02,1,1 100000 29 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,1,202317746,0.997714,4.931421
+2026-01-14 13:33:03,1,1 10000 283 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,1,224146754,0.997379,4.449670
+2026-01-14 13:33:04,1,1 1000000 3 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,1,278978787,0.997312,3.574867
+2026-01-14 13:33:05,1,1 100000 29 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,1,220330197,0.997615,4.527818
+2026-01-14 13:33:06,1,1 1 3276803 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,1,6553606,1.651677,252.025679
+2026-01-14 13:33:08,1,1 10 289637 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,1,17667857,1.006085,56.944371
+2026-01-14 13:33:09,1,1 10 289637 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,1,10426932,1.028608,98.649152
+2026-01-14 13:33:10,1,1 10 289637 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,1,10137295,1.004726,99.111844
+2026-01-14 13:33:11,1,1 1000000 3 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,1,183649596,0.996584,5.426552
+2026-01-14 13:33:13,1,1 1000000 3 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,1,257244321,0.997290,3.876820
+2026-01-14 13:33:14,1,1 1000000 3 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,1,232135437,1.007686,4.340940
+2026-01-14 13:33:15,1,1 1000000 3 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,1,188214108,0.996753,5.295846
+2026-01-14 13:33:16,1,1 100 25601 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,1,46824229,0.998110,21.316101
+2026-01-14 13:33:17,1,1 10000 283 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,1,235627498,0.997451,4.233169
+2026-01-14 13:33:18,1,1 100 25601 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,1,38196692,1.005921,26.335291
+2026-01-14 13:33:19,1,1 10 289637 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,1,16219672,1.000400,61.678189
+2026-01-14 13:33:20,1,1 1 1000000 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,1,5000000,1.004890,200.978000
+2026-01-14 13:33:21,1,1 10000 283 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,1,218309030,0.997505,4.569234
+2026-01-14 13:33:23,1,1 1000 3203 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,1,106051330,0.997313,9.404059
+2026-01-14 13:33:24,1,1 1 3276803 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,1,6553606,1.650389,251.829146
+2026-01-14 13:33:26,1,1 1000000 3 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,1,59182548,0.996826,16.843242
+2026-01-14 13:33:27,1,1 1000 3203 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,1,108770677,0.997598,9.171571
+2026-01-14 13:33:28,1,1 100 25601 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,1,38094288,0.996921,26.169829
+2026-01-14 13:33:29,1,1 1 3276803 -1 1 0  ,./perfexp--lq-tailq--stack-insfirst-allhead,1,6553606,1.694205,258.514931
+2026-01-14 13:33:31,1,1 100000 29 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,1,252794392,0.997021,3.944000
+2026-01-14 13:33:32,1,1 100 25601 -1 1 0  ,./perfexp--cfa-strip--stack-insfirst-allhead,1,49000314,0.997295,20.352829
+2026-01-14 13:33:34,1,1 100000 29 -1 1 0  ,./perfexp--cfa-cfa--stack-insfirst-allhead,1,240746864,0.997096,4.141678
+2026-01-14 13:33:35,1,1 1 10000000 -1 1 0  ,./perfexp--cfa-noIter--stack-insfirst-allhead,1,10000000,2.761402,276.140200
+2026-01-14 13:33:40,1,1 10000 283 -1 1 0  ,./perfexp--cpp-stlref--stack-insfirst-allhead,1,58884942,0.997327,16.936877
+2026-01-14 13:33:41,1,1 100 25601 -1 1 0  ,./perfexp--cfa-noListed--stack-insfirst-allhead,1,49307526,0.996337,20.206591
+2026-01-14 13:33:42,1,1 1000 3203 -1 1 0  ,./perfexp--upp-upp--stack-insfirst-allhead,1,100151404,1.007291,10.057682
+2026-01-14 13:33:43,1,1 10000 283 -1 1 0  ,./perfexp--cfa-mandHead--stack-insfirst-allhead,1,232844476,0.997456,4.283786
+2026-01-14 13:33:44,1,1 10 289637 -1 1 0  ,./perfexp--cfa-likeLq--stack-insfirst-allhead,1,16509309,1.005273,60.891283
Index: doc/theses/mike_brooks_MMath/plots/ListCommon.py
===================================================================
--- doc/theses/mike_brooks_MMath/plots/ListCommon.py	(revision fb7c9168020b02d618a22359fcb8d3dac8bc710a)
+++ doc/theses/mike_brooks_MMath/plots/ListCommon.py	(revision 9d3dc40802c6c907e049db489ed4c138c3298158)
@@ -14,9 +14,11 @@
         timings = pd.read_csv(
             process.stdout,
-            names=['RunMoment', 'RunIdx', 'Args', 'Program', 'expt_ops_completed', 'expt_elapsed_sec', 'mean_op_dur_ns'],
+            names=['RunMoment', 'RunIdx', 'Args', 'Program', 'Width',
+                   'expt_ops_completed', 'expt_elapsed_sec', 'mean_op_dur_ns'],
             dtype={'RunMoment':       str,
                 'RunIdx':             np.int64,
                 'Args':               str,
                 'Program':            str,
+                'Width':              np.int64,
                 'expt_ops_completed': np.int64,
                 'expt_elapsed_sec':   np.float64,
